2

自作のスタートアップ コードで構築されたさまざまなコンパイル ユニットでグローバル オブジェクトを作成しています。

.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動作します...

4

0 に答える 0