【发布时间】:2013-09-18 13:18:49
【问题描述】:
我在阅读this on SO 时实际上开始想知道链接器如何特别解析目标文件中的符号地址以及如何在链接器输出的可执行文件中组织它。
- 链接器和编译器以及程序本身在运行时如何处理变量和函数引用?可执行文件中是否会产生开销(也可能会被操纵)?
如果这会缩短答案,请随时使用技术词汇(我可以查找)来回答...
我询问的目的是为了更好地了解可执行文件的外观(我已经知道它不仅包含机器代码和数据。)
【问题讨论】:
-
我认为这组问题不适合可以正确回答的问题。如果您真的感兴趣,您应该研究链接器的工作原理,但基本思想很简单:编译器留下对符号的引用,链接器找到符号并用地址替换引用。现在,从高级别视图获取正确的详细信息将花费太长时间。
-
我不介意使用技术词汇,如果这样会缩短答案(因为那样我就会知道要搜索什么)。但是我已经发布了这个问题,我会暂时保留它,并按照你说的做。
-
@DavidRodríguez-dribeas 如果你已经知道一个很好的资源来解释链接器的工作原理(书籍/互联网),你介意告诉我吗?
-
当编译器解析你的代码时,它有一些关于它看到的变量和函数的信息(名称、类型、...)。对于某些变量/函数,在编译阶段之后不再需要此信息;对于其他人(因为它没有在当前翻译单元中定义,或者因为它对其他翻译单元可见),此信息被发送到目标文件中的一个部分:符号表。
-
未定义变量/函数的值作为虚拟值 (0/-1) 发出,或者在代码中内联或间接在特殊表中(在 ELF 中 GOT,这是一个函数指针表在运行时填充)用于共享库中的函数,并且重定位条目(包含未解析引用的偏移量、重定位类型和符号)在特殊重定位表中发出。同一目标文件中的重定位也有无符号重定位,以便能够在不同地址加载代码。
标签: c++ c compiler-construction linker