在GNU链接器脚本中输入部分为空的`section`命令会产生什么影响?

问题描述 投票:3回答:1

在LD链接程序脚本中,SECTIONS部分中包含以下片段:

. = (__BUFFER_LOCATION_); 
BUFFER . : { } > EXTERNAL_MEM

其中__BUFFER_LOCATION_定义为某个地址,EXTERNAL_MEMMEMORY部分中定义。

C程序中,我有一个声明为:的全局缓冲区:

char outbuf[4096] __attribute__((section("BUFFER")));

可以看出,链接描述文件没有提及任何名为BUFFER的输入节,但是输出节的命名是这样的。

[编译程序时,我看到链接器将缓冲​​区放在了假定的地址(BUFFER_LOCATION)中,尽管在LDF中未定义输入部分。当我从源中删除attribute时,缓冲区将放置在完全不同的地址中。

因此,我假定默认情况下,“输入节描述”类型的output-section-command会将输出节的名称隐式添加到输入节列表中,除非在其他地方定义。但是,在阅读the manual时,我找不到这种行为的描述。

我错过了什么吗,还是“未记录的功能”?

c gcc gnu ld linker-scripts
1个回答
0
投票

是,输出节段将自动匹配具有相同名称的输入节段,除非不同的输出节段明确提及它们。

此文档记录在Orphan Sections(强调我的内容:]下)>

孤立的部分是输入文件中存在的部分,链接脚本没有明确地将其放置在输出文件中。

链接器仍会通过以下任一方式将这些部分复制到输出文件中查找或创建合适的输出部分以放置孤立的输入部分。

如果孤立输入节的名称与现有的输出部分,那么孤立的输入部分将是放在该输出节的末尾。

如果没有名称匹配的输出节,则新的输出部分将被创建...

© www.soinside.com 2019 - 2024. All rights reserved.