在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,我找不到这种行为的描述。
我是否遗漏了某些内容,还是“未记录的内容”?
答案 0 :(得分:1)
是的,除非不同的输出节明确提到了它们,否则输出节将自动匹配具有相同名称的输入节。
此内容记录在Orphan Sections(强调我的)下:
孤立的部分是输入文件中存在的部分,链接器脚本未明确将其放置在输出文件中。 链接器仍会通过以下任一方式将这些部分复制到输出文件中 查找或创建合适的输出部分以放置 孤立的输入部分。
如果孤立的输入节的名称与 现有的输出部分,那么孤立的输入部分将是 放置在该输出部分的末尾。
如果没有名称匹配的输出节,则新的输出 部分将被创建...