标签: assembly linker x86 x86-64
假设你有一个像这样的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指令的地址字段中留下了特殊代码?
答案 0 :(得分:3)
我想我想出来了(也许有人发表评论,如果这是对的,请告诉我。)
编译器在目标文件中发出“重定位条目”。这是一个表,列出了目标文件中指向需要更新的地址的偏移量。在上面的例子中,将有一个“callq foo”的重定位条目,它将指向callq中地址字段的第一个字节。
在链接期间,链接器遍历所有重定位条目并填写正确的地址。
我看了here和here来解决这个问题。