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

标签 c++ g++ dynamic-linking fpic

我已阅读主题 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 对应的 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   

我希望在使用 -fPIC 进行编译时,jumpje 命令的参数地址与位置无关。所以这两个 objdump 应该是不同的。我理解错了什么?

最佳答案

-fPIC 在较新的 gcc 版本中默认处于启用状态。即使没有选项,代码也是位置无关的:

eb 07                   jmp    1c <_Z3fooi+0x1c>

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

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

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

关于c++ - g++ -fPIC 不生成位置无关代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311945/

相关文章:

linux - 静态链接的二进制文件如何比动态链接的二进制文件小?

c++ - 安装 R 库 : undefined symbol

c++ - 使用非默认可构造类型填充 std::array(无可变参数模板)

c++ - C++中基类构造函数是如何调用的

使用另一个 glibc 构建

c++ - 排序 vector 时运算符重载的编译错误

c++ - 为什么将参数传递给 g++ 的顺序很重要

c++ - 在程序中捕获 C++0x 标志

c++ - USER32.dll 中缺少入口点会阻止程序启动,C++,VS2015

c++ - extern "C"用法(标记的放置)