我已经阅读了GCC -fPIC option主题

因此,我创建了我的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英特尔
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命令的参数地址将与位置无关。因此,两个objdumps应该不同。我怎么理解错了?

最佳答案

默认情况下,较新的-fPIC版本中gcc是打开的。即使没有以下选项,代码也与位置无关:

eb 07                   jmp    1c <_Z3fooi+0x1c>

这是与位置无关的,查看2字节操作码,即使为了清楚起见,反汇编也会打印符号及其偏移量。

请注意,无论选择哪种选项,编译器很可能会为这种短跳转生成与位置无关的代码。

因此,此标志现在不是很有用。但是您可以使用-fno-PIC开关禁用PIC。

07-24 14:02