如何将C代码编译为ELF 32-bit LSB ARM version 1 (GNU/Linux)可执行文件
解决ARM GCC编译ELF OSABI为GNU/Linux的问题
要将编译生成的ELF文件的OSABI从SysV改为GNU/Linux,你可以通过给GCC传递链接器参数直接实现:
- 修改编译命令,添加
-Wl,--osabi=linux选项,完整命令如下:arm-linux-gnueabi-gcc -march=armv7-a -mthumb -mabi=aapcs-linux -Wl,--osabi=linux -o output_file input_file.c
原理说明
ELF文件的OS/ABI字段由链接器决定,默认情况下arm-linux-gnueabi-gcc会使用SysV(对应OSABI值0)。-Wl,--osabi=linux是GCC向链接器ld传递参数的写法,明确要求链接器将OSABI字段设置为GNU/Linux(对应OSABI值3)。
验证方法
编译完成后,用readelf工具检查结果:
arm-linux-gnueabi-readelf -h output_file
查看输出中的OS/ABI字段,应该显示为UNIX - GNU,对应你需要的ELF, 32-bit LSB executable, ARM, version 1 (GNU/Linux)格式。
备选方案(编译后修改)
如果无法重新编译,也可以用objcopy工具添加ABI-tag段来修改:
arm-linux-gnueabi-objcopy --set-section-flags .note.ABI-tag=alloc,load --add-section .note.ABI-tag=/usr/lib/arm-linux-gnueabi/gnu/libc.so output_file
注意:这个方法需要你的交叉编译环境中存在对应的libc.so文件,且不如编译时直接指定参数可靠。
内容的提问来源于stack exchange,提问作者Mhigs
相关产品推荐
相关产品推荐

