外部符号的目标文件链接如何工作?

时间:2012-12-22 15:45:58

标签: 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指令的地址字段中留下了特殊代码?

1 个答案:

答案 0 :(得分:3)

我想我想出来了(也许有人发表评论,如果这是对的,请告诉我。)

编译器在目标文件中发出“重定位条目”。这是一个表,列出了目标文件中指向需要更新的地址的偏移量。在上面的例子中,将有一个“callq foo”的重定位条目,它将指向callq中地址字段的第一个字节。

在链接期间,链接器遍历所有重定位条目并填写正确的地址。

我看了herehere来解决这个问题。