过程:
1、利用arm-linux-gcc生成*.elf文件
2、arm-linux-objcopy -O binary <src.elf> <target.bin>
3.利用dd或者winhex将target.bin拷贝到指定地址。
4.结果无法运行。
查找原因:
发现生成bin文件在跳转到reset指令前面还有字符串信息,能看到GNU字样。这样直接拷贝到指定地址肯定不能正常运行,查找原因,发现*.elf文件头有.note.gnu.build-id文件信息,生成的bin文件保留了这个信息。所以真实的跳转地址还需要加这个头的数据长度,才真实跳转到bin文件运行部分。
我解决方式:
1、编译的时候加上 -Wl,--build-id=none
2、生成bin文件发现没有了note.gnu.build-id这部分信息
3、我的bin文件copy后再运行载体上直接运行,不需要加偏移地址。
工具使用:
readelf -S <target.elf>查看section
readelf -n <target.elf>查看note.gnu.build-id信息
readelf -l <target.elf>查看 segment