You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除汇编代码中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:47:43