我在不同的编译单元中创建全局对象,这些对象是在自制的启动代码中构建的:
.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
),那么一切正常......