繁体   English   中英

g ++ -fPIC不产生位置无关代码

[英]g++ -fPIC not producing position independent code

我已经阅读了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.cppg ++ -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进行编译时, jumpje命令的参数地址将与位置无关。 因此,两个objdumps应该不同。 我怎么理解错了?

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

eb 07                   jmp    1c <_Z3fooi+0x1c>

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

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

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

GCC编译器无法故意生成与位置相关的代码。 这种能力在任何情况下都没有任何实际意义。

GCC可以做的实际上是生成与位置无关的代码(使用-fPIC选项)或“任何”代码(不-fPIC选项)。 当您使用“无论如何”模式时,编译器仅忽略位置相关性问题,并将其有关代码生成的决策基于其他考虑。 这意味着即使您不请求-fPIC ,您也仍然可能纯粹是偶然地轻易得到位置无关的代码:因为碰巧的是,位置无关的代码由于其他原因效果最好(更紧凑,运行更快等)

如果要观察差异,则需要一个更具代表性的示例。 在您的示例中,所有跳跃都接近跳跃。 它们自然是通过相对(基于偏移)跳转指令来实现的。 在这种情况下,任何明智的编译器都会使用这种相对跳转。 这样做的副作用是,即使您没有显式请求它,您最终也会得到位置无关的代码。 在这种情况下,位置独立是“免费的”。

如果要观察差异,则需要一个示例,其中位置独立不会“免费”出现。 您需要在位置独立性和其他重要因素(例如效率和/或规模)之间进行明确权衡的事情。 如果您想出这样一个例子,您将看到-fPIC的不同之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM