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 のアドレス フィールドの最初のバイトを指す「callq foo」の再配置エントリが 1 つあります。

リンク中、リンカはすべての再配置エントリを繰り返し処理し、正しいアドレスを入力します。

私はこれを理解するためにここここを見ました。

于 2012-12-22T15:59:49.210 に答える