自作のスタートアップ コードで構築されたさまざまなコンパイル ユニットでグローバル オブジェクトを作成しています。
.startup:
mov ebx, start_ctors
jmp .ctor_loop
.call_ctor:
call [ebx]
add ebx, 4
.ctor_loop:
cmp ebx, end_ctors
jb .call_ctor
call main
独立した環境でアプリケーションを実行するには、そうする必要があります。ただし、i586-elf-g++
次のコマンドライン オプションで (4.6.0) を使用しています。
-march=i386 -masm=att -std=c++0x -ffreestanding -fno-builtin -nostdlib -nostartfiles -nodefaultlibs -fno-rtti -fno-exceptions -O1
私のリンカースクリプトは次のようになります。
OUTPUT_FORMAT(binary)
ENTRY(start)
SECTIONS
{
. = 0x8000;
.text ALIGN(0x1000) : { *(.text) }
.rodata ALIGN(0x1000) :
{
start_ctors = .;
*(.ctor*)
end_ctors = .;
start_dtors = .;
*(.dtor*)
end_dtors = .;
*(.rodata*)
}
.data ALIGN(0x1000) : { *(.data) }
.bss ALIGN(0x1000) : { *(.bss) }
}
g++
すべてのコンストラクターをコンストラクター リストに含めるわけではありません。(コマンドラインオプションを使用して)最適化を削除すると、すべて正常に-O0
動作します...