在GNU链接描述文件中带有空输入节列表的`section`命令有什么影响?

时间:2013-06-11 22:26:03

标签: c gcc gnu ld linker-scripts

在LD链接器脚本中,我在SECTIONS部分中有以下片段:

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

其中__BUFFER_LOCATION_定义为某个地址,EXTERNAL_MEM部分定义了MEMORY

C程序中,我将全局缓冲区声明为:

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

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

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

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

我是否遗漏了某些内容,还是“未记录的内容”?

1 个答案:

答案 0 :(得分:1)

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

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

  

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

     

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

     

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