「コンピュータシステム:プログラマの視点」セクション7.7.1リロケーションエントリ:このセクションの簡単な内容は、リンカが別の場所オブジェクトファイル。リンク(GNU ld)リロケーションプロセスのR_386_PC32とR_X86_64_PC32の相違点
例ソースコードのコンパイルとobjdumpの:そしてGCC -Wall -c -o main.o main.cの、そしてobjdumpは-S -r main.o>明main.asmを
void swap();
int buf[2] = {1, 2};
int main()
{
swap();
return 0;
}
と、スワップのための再配置エントリが表示されます:ときLDリンクmain.oとswap.oだから
6: e8 fc ff ff ff call 7 <main+0x7> swap();
7: R_386_PC32 swap relocation entry
を、ldは決定するために、スワップの再配置エントリrを(タイプ= R_386_PC32を= 7オフセット)を使用しますリンクアドレス:
refaddr = ADDR(section .text) + r.offset
*refptr = (unsigned)(ADDR(r.symbol + *refptr - refptr)
とコール命令のオペランド(FCのFF FF FFは)-4完全に386命令セットのために合っています。
しかし、私がX86_64のLinuxでこれを繰り返したときに、私は、コールのコードがあるが見つかりました:
9: e8 00 00 00 00 callq e <main+0xe>
a: R_X86_64_PC32 swap relocation entry
386でコール(E8)のオペランドがある理由-4((FCその後、私の質問ですX86_64 main.oのオペランドは00 00 00 00ですか?違う命令セット(callかcallq)か、あるいはGNU ldが別のアルゴリズムを使って再配置するかどうかですか?