2

トピックGCC -fPIC オプションを読みました

だから私は自分のtestlib.cppを作成しました。

int foo(int num)
{   
    int result;

    if (num != 0)
    {
        result = 1;
    }
    else
    {
        result = 2;
    }

    return result;
}

g++ -c -o testlib.o testlib.cpp として コンパイルし、 g ++ -fPIC -c -o testlib.o testlib.cpp としてコンパイルすると、testlib.o の対応する objdumps は同一です。

objdump -d testlib.o -M intel

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 を指定してコンパイルした場合、 jumpおよびjeコマンドの引数のアドレスは位置に依存しないと予想していました。したがって、2 つの objdump は異なるはずです。私は何を間違って理解していますか?

4

2 に答える 2

2

GCC コンパイラには、位置に依存するコードを意図的に生成する機能がありません。そのような機能は、実際にはまったく意味がありません。

GCC ができることは、実際には位置に依存しないコード (-fPICオプションあり) または「何でも」コード (-fPICオプションなし) のいずれかを生成することです。"whatever" モードを使用すると、コンパイラは単に位置依存の問題を無視し、他の考慮事項に基づいてコード生成に関する決定を下します。これは、 を要求していない場合でも-fPIC、純粋に「偶然に」位置に依存しないコードで簡単に終了する可能性があることを意味します: 位置に依存しないコードが他の理由 (よりコンパクトである、より高速に実行されるなど) で最適に機能することがたまたま発生したためです。 .)

違いを観察したい場合は、より代表的な例が必要です。あなたの例では、すべてのジャンプがジャンプの近くにあります。これらは、相対的な (オフセットベースの) ジャンプ命令によって自然に実装されます。賢明なコンパイラは、そのような状況でそのような相対ジャンプを使用します。その副作用は、明示的に要求していなくても、位置に依存しないコードになってしまうことです。この場合、位置の独立性は「無料で」提供されます。

違いを観察したい場合は、位置の独立性が「無料」ではない例が必要です。位置の独立性と、効率やサイズなどの他の重要な要素との間の明確なトレードオフを伴うものが必要です。そのような例を考え出すと、その違いがわかり-fPICます。

于 2016-12-24T09:44:21.683 に答える