2011-12-03 5 views
1

「コンピュータシステム:プログラマの視点」セクション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が別のアルゴリズムを使って再配置するかどうかですか?

答えて

0

値は問題ではありません。上書きされます。 g再配置プロセス。どうやら、i386の場合、コンパイラはデフォルトで再配置エントリ自体を指すのに対し、x86-64の場合は次の命令を指しています。それはとにかくダミー値です。

関連する問題