我已阅读主题 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 进行编译时,jump 和 je 命令的参数地址与位置无关。所以这两个 objdump 应该是不同的。我理解错了什么?
最佳答案
-fPIC
在较新的 gcc
版本中默认处于启用状态。即使没有选项,代码也是位置无关的:
eb 07 jmp 1c <_Z3fooi+0x1c>
这是与位置无关的,查看 2 字节操作码,即使反汇编为了清楚起见打印了符号及其偏移量。
请注意,无论选择什么,编译器很可能都会为这种短跳转生成与位置无关的代码。
所以这个标志现在不是很有用。但您可以使用 -fno-PIC
开关禁用 PIC。
关于c++ - g++ -fPIC 不生成位置无关代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311945/