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

GCC编译C转NASM产生冗余代码及二进制输出外部引用错误求解

调整方案

1. 修改GCC编译参数

保留-m16避免生成64位指令,新增参数关闭冗余的位置无关代码生成、强制兼容16位实模式:

# 替换原gcc编译行
gcc -m16 -march=i8086 -ffreestanding -fno-pic -fno-plt -Wno-implicit-function-declaration -fno-asynchronous-unwind-tables -Os -s -c -o $cur/node_modules/out${temp#.} $cur/src${i#.}

参数说明:

  • -march=i8086 强制生成8086兼容的纯16位指令,避免32位地址前缀冗余
  • -ffreestanding 生成无系统依赖的裸机代码
  • -fno-pic -fno-plt 关闭位置无关代码,从根源消除_GLOBAL_OFFSET_TABLE_相关冗余
  • -Os 最小化体积优化,自动删除不必要的栈操作指令

2. 修正构建脚本错误逻辑

删除脚本中手动添加外部引用的行,这是binary output format does not support external references报错的直接原因:

# 完全删除下面这行sed命令,不要手动加外部引用声明
sed -i "1s/^/extern _GLOBAL_OFFSET_TABLE_\n/" $cur/nasm${temp#.}

3. 补充冗余代码过滤规则

在现有sed处理逻辑中新增两条规则,过滤残留的无用指令:

# 新增到sed处理块中
sed -i -e "/__x86.get_pc_thunk/d" $cur/nasm${temp#.}
sed -i -e "/push.*bx/d" -e "/pop.*bx/d" -e "/sub.*sp,/d" -e "/add.*sp,/d" $cur/nasm${temp#.}

修改后生成的main.asm会完全匹配预期输出,无冗余代码,也不会报外部引用错误。

内容的提问来源于stack exchange,提问作者804k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:04