[英]-fPIC ignored for target (all code is position independent), useless warning
[英]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.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应该不同。 我怎么理解错了?
在更高版本的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.