我很失望,因为我找不到有关内存分段的信息。我知道我应该将内存划分为 .text、.data、.bss、.stack 等基本部分,这些部分用于编译程序的目标文件。我知道还有更多其他部分,其中一些是 C 所必需的,而其他部分是 C++ 所必需的。我正在搜索有关链接描述文件中应包含哪些部分的信息?
问问题
1517 次
1 回答
2
这取决于您的特定编译器和目标体系结构将存在或可能存在哪些输出部分。在您的代码中,您可以使用任意名称定义输入部分。您的链接描述文件用于将文件中的符号或显式定义的输入部分中列出的符号绑定到输出部分。
找出存在哪些输出部分的最佳方法是编译和链接示例应用程序,然后检查生成的映射文件(如果映射文件不是自动生成的,您应该调整链接器选项)。地图文件不是供其他工具使用的,而是作为对程序中发生的内容、位置、部分以及原因的可读描述。注意:在该映射文件中,您还将找到一些不属于您的程序的部分名称,并且不会转换为您的程序执行或使用的物理位,而是对您的调试器的帮助。
当您没有将某些符号显式映射到输出节时,链接器通常只会在最后一个显式定义的节之后附加所有剩余的符号。
因此,您还可以定义某种“包罗万象”部分,它肯定会吸引所有尚未分配的符号,然后验证输出部分是否仍然为空。IE
在 SECTIONS 块的末尾,添加
SECTION
{
<snip>
.mustbeempty
{
*(.*) ;
}
ASSERT( SIZEOF( .mustbeempty ) = 0 ) ;
}
有关链接器脚本的更多信息可以在许多地方找到:
- 在stackoverflow上,之前有人问过这个问题:哪个手册页描述了ld链接器脚本语法?
- 完整的解释可以在这个 pdf 中找到:https ://web.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/Linker.pdf
- 红帽的页面格式很好:https ://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/index.html
- 我在 scoberlin 上经常使用此页面:http ://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html因为整个 ld 文件语法是一个完整的 html 页面,因此可以轻松搜索。
于 2013-10-16T08:35:53.797 回答