我正在学习有关现在(自学)链接的知识,但在理解某些概念时遇到了一些麻烦。
在对源代码文件进行预处理,编译和汇编之后,您将获得具有ELF格式(WLOG)的可重定位目标文件。在此____。o文件中,有一个.text节,其中包含各个源代码的机器代码。
此机器代码是否对应于输入文件中代码的运行时地址?就像如果要在哪里运行机器代码(假设没有未解决的外部引用)那样,代码的运行时配置文件在这里与机器代码匹配吗?
如果这是真的,可以肯定地说代码中的符号引用指向其相应符号的运行时地址吗?
我需要知道这一点,以便更好地了解在此过程之后直接发生的链接过程。
答案 0 :(得分:1)
此机器代码是否对应于输入文件中代码的运行时地址?
否。
不能,因为单个.o
文件中的代码不不知道哪些 other 对象文件将链接到主可执行文件中。想象foo.o
说“我想在地址0x123000”,而bar.o
说“我想在地址0x123004”。他们显然不能都在同一地址。
“最终”运行时地址由链接器确定,该链接器收集所有不同的.o
文件,解析它们之间的引用,并在内存中布置最终的可执行文件。 (即使这不是一个完整的故事,因为共享库和与位置无关的可执行文件会使答案更加复杂。)