我正在尝试使用标志 -fno-pie 和不使用标志 -fno-pie 在 gcc 中编译虚拟函数。
void dummy_test_entrypoint() { }
当我在没有标志的情况下编译时。
gcc -m32 -ffreestanding -c test.c -o test.o
我得到以下反汇编代码。
00000000 <dummy_test_entrypoint>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: e8 fc ff ff ff call 4 <dummy_test_entrypoint+0x4>
8: 05 01 00 00 00 add eax,0x1
d: 90 nop
e: 5d pop ebp
f: c3 ret
当我用标志编译时。
00000000 <dummy_test_entrypoint>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 90 nop
4: 5d pop ebp
5: c3 ret
我的问题。
它是什么???
3: e8 fc ff ff ff call 4 <dummy_test_entrypoint+0x4>
8: 05 01 00 00 00 add eax,0x1
您反汇编了目标文件而没有--reloc
标志,因此输出具有误导性。随着--reloc
标志,你会看到这个:
3: e8 fc ff ff ff call 4 <dummy_test_entrypoint+0x4>
4: R_386_PC32 __x86.get_pc_thunk.ax
8: 05 01 00 00 00 add $0x1,%eax
9: R_386_GOTPC _GLOBAL_OFFSET_TABLE_
子程序如下所示:
00000000 <__x86.get_pc_thunk.ax>:
0: 8b 04 24 mov (%esp),%eax
3: c3 ret
该结构将 GOT 指针加载到%eax
,以防函数需要引用全局数据。该函数不包含这样的引用,但是因为您编译代码时没有优化,所以GCC没有删除死代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)