私はトピックを読んでいますGCC -fPIC optiong ++ -fPICは位置独立コードを生成しません
私はtestlib.cppを作成しました。
int foo(int num)
{
int result;
if (num != 0)
{
result = 1;
}
else
{
result = 2;
}
return result;
}
Iは G ++ -c -o testlib.o testlib.cpp とTESTLIBの G ++ -fPIC -C -o testlib.o testlib.cpp 対応objdumpsほどコンパイル.oのは同じです:
objdumpの-d testlib.o -Mインテル
testlib.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z3fooi>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 ec 10 sub esp,0x10
6: 83 7d 08 00 cmp DWORD PTR [ebp+0x8],0x0
a: 74 09 je 15 <_Z3fooi+0x15>
c: c7 45 fc 01 00 00 00 mov DWORD PTR [ebp-0x4],0x1
13: eb 07 jmp 1c <_Z3fooi+0x1c>
15: c7 45 fc 02 00 00 00 mov DWORD PTR [ebp-0x4],0x2
1c: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
1f: c9 leave
20: c3 ret
そして、引数のアドレスは、-fPICでコンパイルするときに、とjeコマンドが位置に依存しないようにジャンプすることが期待されました。したがって、2つのobjダンプは異なるはずです。私は間違って何を理解するのですか?
x86ショート・ジャンプ(<±127バイト)は常に位置関係にあります - つまり、32ビット・モードでのジャンプは明示的な完全なアドレスを使用して書き込むことができますが、2ではなく5バイト、善意の精神でこのような指示を出すだろう。 –
@MatteoItalia、ご意見ありがとうございます!申し訳ありませんが、私はそれを投票しましたが、私のスマートフォンで私の投票を元に戻すので、SOがそれを禁じているので、もう一度アップフォートすることはできません。 :((( – JenyaKh
心配しないでください、それはいつも起こります=) –