G -FPIC不产生位置独立代码

g++ -fPIC not producing position independent code

本文关键字:位置 独立 代码 -FPIC      更新时间:2023-10-16

我已经阅读了主题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的相应objdump是相同的:

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   

我期望跳跃 je 命令的参数的地址在使用-fpic时独立于位置。因此,这两个objdump应该有所不同。我理解错误?

-fPIC默认情况下在较新的gcc版本中打开。即使没有选项,该代码也独立于位置:

eb 07                   jmp    1c <_Z3fooi+0x1c>

这是独立的位置,即使拆卸打印符号及其偏移以确保清晰。

请注意,编译器很可能会为这种短跳的任何选择而产生与位置无关的代码。

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

gcc编译器没有能力故意生成位置 - 依赖代码。这种能力将没有任何实际意义。

GCC可以做什么实际上是生成独立于位置的代码(使用-fPIC选项),或" whting nather"代码(没有-fPIC选项)。当您使用" Whthy"模式时,编译器会简单地忽略位置依赖性的问题,而在其他考虑因素上基于代码生成的决策。这意味着,即使您不要求-fPIC,您仍然很容易"偶然"以与位置无关的代码最终出现:因为碰巧的是,与位置无关的代码出于其他原因(更紧凑,更快,运行速度更快等)

如果您想观察差异,则需要一个更具代表性的示例。在您的示例中,所有跳跃都接近跳跃。它们是通过相对(基于偏移的)跳跃指令自然实现的。在这种情况下,任何明智的编译器都将使用此类相对跳跃。副作用是,即使您没有明确要求它,您最终都会使用独立于位置的代码。在这种情况下,独立于职位的"免费"。

如果您想观察一个差异,则需要一个示例,而独立于位置则不会"免费"。您需要一些涉及独立和其他重要因素(例如效率和/或大小)之间的明确权衡的东西。如果您提出这样的示例,您将看到-fPIC所产生的差异。