我已经阅读了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。