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