Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
假设你有一个这样的 C 文件:
extern void foo(void); int main(int argc, char** argv) { foo(); return 0; }
这会生成以下 x86-64 程序集:
extern _foo global _main: callq foo retq
当编译器为此编写目标文件时,它如何告诉链接器返回并填写“foo”的实际地址?它会在 callq 指令的地址字段中留下特殊代码吗?
我想我想通了(也许有人发表评论让我知道这是否正确)。
编译器在目标文件中发出“重定位条目”。这是一个表格,列出了目标文件中指向需要更新的地址的偏移量。在上面的示例中,“callq foo”将有一个重定位条目,它将指向 callq 中地址字段的第一个字节。
在链接期间,链接器会遍历所有重定位条目并填写正确的地址。
我看了这里和这里来解决这个问题。