如何防止在独立环境中编译全局对象

时间:2012-04-12 16:41:38

标签: operating-system x86 g++ assembly

我在不同的编译单元中创建全局对象,这些编译单元是用自制的启动代码构建的:

.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),那么一切正常......

0 个答案:

没有答案