链接描述文件:.bss 部分的分配

lod*_*odo 5 c++ ld linker-scripts

我有一个像这样的链接器脚本:

OUTPUT_FORMAT(binary)
SECTIONS
{
    . = 0xFFFF800000000000 ;
    .startup_text : { processor.o(.text) }
    .text : { *(EXCLUDE_FILE (processor.o) .text) }
    .data : { *(.data) }
    .rodata : { *(.rodata) }
    linker_first_free_page = ALIGN(4096);
}
Run Code Online (Sandbox Code Playgroud)

一段代码加载此脚本生成的可执行文件,打印以下信息:

size of executable (pages)    3
first free page               0xffff800000003000
Run Code Online (Sandbox Code Playgroud)

可执行文件本身打印:

&(linker_first_free_page)     0xffff800000003000
Run Code Online (Sandbox Code Playgroud)

所以到目前为止一切正常。现在我的可执行文件需要一个.bss部分。请注意,我没有能够加载 elf 文件的加载器,所以我需要一个可以读取和使用的平面二进制文件,其中包含所有部分。

第一次尝试

OUTPUT_FORMAT(binary)
SECTIONS
{
    . = 0xFFFF800000000000 ;
    .startup_text : { processor.o(.text) }
    .text : { *(EXCLUDE_FILE (processor.o) .text) }
    .data : { *(.data) }
    .rodata : { *(.rodata) }
    .bss : { *(.bss) }
    linker_first_free_page = ALIGN(4096);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,只需添加一个.bss部分。这是输出:

size of executable (pages)    3
first free page               0xffff800000003000
&(linker_first_free_page)     0xffff800000004000
Run Code Online (Sandbox Code Playgroud)

也就是说,链接器变量已正确更新,但该部分未分配(我想这对于一个.bss部分来说很正常)。

第二次尝试

OUTPUT_FORMAT(binary)
SECTIONS
{
    . = 0xFFFF800000000000 ;
    .startup_text : { processor.o(.text) }
    .text : { *(EXCLUDE_FILE (processor.o) .text) }
    .data : { *(.data) *(.bss) }
    .rodata : { *(.rodata) }
    linker_first_free_page = ALIGN(4096);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,将.bsssection 放在.data一个里面。这是输出:

size of executable (pages)    4
first free page               0xffff800000004000
&(linker_first_free_page)     0xffff800000003000
Run Code Online (Sandbox Code Playgroud)

也就是说,.bss分配了,但链接器变量没有更新(我不明白为什么......)

简短的问题

因此,鉴于上述所有内容,我如何将该.bss部分嵌入到平面二进制文件中,以便它可以像“标准”文件一样加载到内存中并直接使用,而无需特定的加载器?

mre*_*dia 0

Michael Petch 的评论给了我答案:

OUTPUT_FORMAT(binary)
SECTIONS
{
    . = 0xFFFF800000000000 ;
    .startup_text : { processor.o(.text) }
    .text : { *(EXCLUDE_FILE (processor.o) .text) }
    .data : { *(.data) }
    .rodata : { *(.rodata) }
    .bss : { *(.bss) }
    .fake : { . = . + SIZEOF(.bss); }
    linker_first_free_page = ALIGN(4096);
}
Run Code Online (Sandbox Code Playgroud)