2

假设你有一个这样的 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 指令的地址字段中留下特殊代码吗?

4

1 回答 1

3

我想我想通了(也许有人发表评论让我知道这是否正确)。

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

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

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

于 2012-12-22T15:59:49.210 回答