使用ARMCompiler的fromelf转换Hex为Bin时生成异常文件的问题
解答:fromelf生成多文件问题分析与修复
1. 重命名text为my_target.bin是否正确?
这并不靠谱,大概率会导致程序运行异常。那个text文件只是fromelf提取出的ELF里的.text代码段,但你的程序很可能还有.data(初始化数据段)、.rodata(只读数据)甚至自定义段(比如你看到的mk_exceptiontable相关文件)。如果只拿.text段的内容,程序运行时需要的初始化数据、异常表等都会缺失,必然会出问题。只有当你的程序所有代码和数据都挤在.text段里时,这种做法才勉强能用,但几乎没有嵌入式程序会这么写。
2. 为什么会生成text、mk_exceptiontable这些文件?
问题出在你用的fromelf参数上!你写的--bin选项,在ARM Compiler 6的fromelf工具里,作用是把ELF文件里的每个可加载段单独提取成一个二进制文件,每个文件的名字对应段的名称(比如.text段生成text文件,mk_exceptiontable是你程序里定义的自定义段,所以生成对应的文件)。这完全不是你想要的“合并所有段生成单一bin文件”的效果。
3. 正确的做法:生成单一合并bin文件
ARM Compiler 6的fromelf提供了--bincombined选项,专门用来把所有可加载段合并成一个单一的二进制文件。修正后的命令应该是这样:
/opt/ARMCompiler6.6.1/bin/fromelf --bincombined --output path/to/generated/bin/file/my_target.bin path/to/target/my_target.elf
4. 修正后的CMake自定义命令
把你的ADD_CUSTOM_COMMAND改成下面这样,还可以用CMake的目标变量来避免硬编码路径,更灵活:
ADD_CUSTOM_COMMAND( TARGET my_target POST_BUILD COMMAND /opt/ARMCompiler6.6.1/bin/fromelf --bincombined --output path/to/generated/bin/file/my_target.bin $<TARGET_FILE:my_target> COMMENT "Converting ELF to combined binary file" )
这里的$<TARGET_FILE:my_target>会自动替换成my_target目标生成的ELF文件的完整路径,不用你手动写path/to/target/my_target.elf。
内容的提问来源于stack exchange,提问作者Kennedy
相关产品推荐
相关产品推荐

