如何在ARM架构Ubuntu 20.04系统下正确编译汇编程序解决ld报错
问题原因分析
- 你编写的是32位ARM(ARMv7/AArch32)架构的汇编代码,而当前使用的是64位ARM(AArch64/arm64)架构的Ubuntu系统,默认系统链接器
ld为arm64版本,无法识别32位目标文件,因此报file in wrong format错误 nasm是仅面向x86/x86_64架构的汇编器,完全不兼容ARM架构,因此无法处理你的ARM汇编代码
解决方法
提供两种可行方案,按需选择即可:
方案1:改写为arm64原生汇编(无额外依赖,推荐)
将hello.s内容替换为适配arm64架构的汇编代码:
.text .global _start _start: mov x0, #1 adrp x1, message add x1, x1, :lo12:message mov x2, #12 mov x8, #64 svc #0 mov x8, #93 svc #0 .data message: .asciz "hello world\n"
依次执行以下命令编译运行:
# 编译生成目标文件 as hello.s -o hello.o # 链接生成可执行文件 ld hello.o -o hello # 运行程序 ./hello
方案2:保留原有32位代码,安装32位兼容环境
如果需要继续使用原来的32位ARM汇编代码,可以安装armhf架构兼容组件:
- 开启armhf架构支持并安装依赖:
sudo dpkg --add-architecture armhf sudo apt update sudo apt install gcc-arm-linux-gnueabihf libc6:armhf
- 编译链接32位程序:
# 编译32位目标文件 arm-linux-gnueabihf-as hello.s -o hello.o # 使用32位链接器生成可执行文件 arm-linux-gnueabihf-ld hello.o -o hello # 运行程序 ./hello
内容的提问来源于stack exchange,提问作者Shrek1995
相关产品推荐
相关产品推荐

