3

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

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

where__BUFFER_LOCATION_被定义到某个地址并EXTERNAL_MEMMEMORYsection 中定义。

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

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

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

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

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

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

4

1 回答 1

1

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

这记录在孤儿部分(重点是我的)下:

孤立部分是输入文件中存在的部分,链接描述文件未明确放置到输出文件中。链接器仍将通过查找或创建合适的输出节来放置孤立的输入节,将这些节复制到输出文件中。

如果孤立输入节的名称与现有输出节的名称完全匹配,则孤立输入节将放置在该输出节的末尾。

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

于 2019-10-29T05:05:32.273 回答