【问题标题】:How does object file linking of extern symbols work?外部符号的目标文件链接如何工作?
【发布时间】:2012-12-22 15:45:58
【问题描述】:

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

【问题讨论】:

    标签: assembly linker x86 x86-64


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的。例如,您可以使用objdump -drreadelf 查看重定位条目。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多