gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:45 32 4
gpt4 key购买 nike

我已阅读主题 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.cppteSTLib.o 的相应 objdumps 是相同的:

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 命令的参数地址与位置无关。所以这两个objdumps应该是不同的。我哪里理解错了?

最佳答案

-fPIC 在较新的 gcc 版本中默认打开。即使没有选项,代码也是位置独立的:

eb 07                   jmp    1c <_Z3fooi+0x1c>

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

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

所以这个flag现在用处不大。但是您可以使用 -fno-PIC 开关禁用 PIC。

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com