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.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
我期望跳跃和 je 命令的参数的地址在使用-fpic时独立于位置。因此,这两个objdump应该有所不同。我理解错误?
-fPIC
默认情况下在较新的gcc
版本中打开。即使没有选项,该代码也独立于位置:
eb 07 jmp 1c <_Z3fooi+0x1c>
这是独立的位置,即使拆卸打印符号及其偏移以确保清晰。
请注意,编译器很可能会为这种短跳的任何选择而产生与位置无关的代码。
因此,这个标志现在不是很有用。但是您可以使用-fno-PIC
开关禁用PIC。
gcc编译器没有能力故意生成位置 - 依赖代码。这种能力将没有任何实际意义。
GCC可以做什么实际上是生成独立于位置的代码(使用-fPIC
选项),或" whting nather"代码(没有-fPIC
选项)。当您使用" Whthy"模式时,编译器会简单地忽略位置依赖性的问题,而在其他考虑因素上基于代码生成的决策。这意味着,即使您不要求-fPIC
,您仍然很容易"偶然"以与位置无关的代码最终出现:因为碰巧的是,与位置无关的代码出于其他原因(更紧凑,更快,运行速度更快等)
如果您想观察差异,则需要一个更具代表性的示例。在您的示例中,所有跳跃都接近跳跃。它们是通过相对(基于偏移的)跳跃指令自然实现的。在这种情况下,任何明智的编译器都将使用此类相对跳跃。副作用是,即使您没有明确要求它,您最终都会使用独立于位置的代码。在这种情况下,独立于职位的"免费"。
如果您想观察一个差异,则需要一个示例,而独立于位置则不会"免费"。您需要一些涉及独立和其他重要因素(例如效率和/或大小)之间的明确权衡的东西。如果您提出这样的示例,您将看到-fPIC
所产生的差异。
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 独立读取-修改-写入顺序
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 带有多个独立参数的C++For循环
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 我们如何准备小内存池,其中每个线程可以独立访问某些位置范围?
- 独立 exe:磁盘上保存配置文件和日志的位置
- 原子功能无锁可以更改两个独立的存储位置
- G -FPIC不产生位置独立代码