如何消除汇编代码中的call __x86.get_pc_thunk.ax指令?
如何消除汇编代码中的
call __x86.get_pc_thunk.ax指令? 你在64位Ubuntu系统上编译这段简单的C程序时:
void add(); int main() { add(); return 0; }
使用命令gcc -S -m32 -fno-asynchronous-unwind-tables -o simple.S simple.c,结果汇编代码里出现了call __x86.get_pc_thunk.ax,但你期望得到不包含这个指令的汇编代码对吧?
这个问题其实是因为gcc在32位模式下默认会生成位置无关代码(PIC),而__x86.get_pc_thunk.ax是PIC模式下用来获取程序计数器(PC)值的辅助指令。要消除它,只需要关闭PIC生成即可,有两种常用方法:
方法1:添加-fno-pic编译选项
直接在编译命令中加入-fno-pic(或者大写的-fno-PIC,效果一致),强制gcc不生成位置无关代码。修改后的完整命令:
gcc -S -m32 -fno-asynchronous-unwind-tables -fno-pic -o simple.S simple.c
方法2:使用-static编译选项
如果你的程序打算静态链接,也可以用-static选项,这个选项会让gcc默认关闭PIC代码生成,同时后续链接时使用静态库。命令如下:
gcc -S -m32 -fno-asynchronous-unwind-tables -static -o simple.S simple.c
用以上两种方法编译后,生成的汇编代码就会和你期望的一致,不会再出现call __x86.get_pc_thunk.ax指令了。
内容的提问来源于stack exchange,提问作者user9585531
相关产品推荐
相关产品推荐

