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
相关产品推荐
相关产品推荐

