我已经建立了一个axf (精灵)文件使用Arm编译器v6.9为Cortex-R4。但是,当我使用Arm MCU Eclipse链接GDB插件将其加载到目标时,它无法加载我的段的初始化数据。如果我使用分段臭氧和J加载axf,它将正确地加载init数据。
如果我在axf文件上运行arm-none-eabi-gdb.exe文件,我会得到“警告: ELF段之外的可加载部分”,用于我所有初始化的段。
查看图像,初始化数据应该在图像之后加载到区域$表$$Base中的表指定的地址。
如果我们与gcc联系在一起,我们就不会遇到这个问题,因为初始化数据的处理方式不同。
有什么想法吗?
发布于 2019-04-21 00:02:13
我今天面临着同样的问题,也注意到了你所描述的同样的问题:
“查看图像,初始化数据应该在图像之后加载到区域$Base中的表指定的地址。”
看起来虽然非常相似,但由手臂链接生成的ELF文件与GCC生成的ELF文件似乎有一点不同。不管怎样,我找到了一个解决办法。
在检查我的main.elf时,我注意到臂链接器将初始化数据存储在ER_RW部分中:
arm-none-eabi-readelf.exe" -S main.elf
There are 16 section headers, starting at offset 0x122b0:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] ER_RO PROGBITS 20000000 000034 001358 00 AX 0 0 4
[ 2] ER_RW PROGBITS 20002000 00138c 0000cc 00 WA 0 0 4
[ 3] ER_ZI NOBITS 200020cc 001458 0004e8 00 WA 0 0 4
[ 4] .debug_abbrev PROGBITS 00000000 001458 0005c4 00 0 0 1
[ 5] .debug_frame PROGBITS 00000000 001a1c 000dc4 00 0 0 1
...我注意到这个问题的发生是因为GDB在addr=0x20002000上加载了addr=0x20002000,但实际上,我需要在ER_RO部分之后加载它(即在addr=0x20001358)。
解决办法是:
使用fromelf将所有部分转储到二进制文件main.bin中。Fromelf将在ER_RW后面添加ER_RO,就像它应该的那样:
fromelf.exe --bin -o main.bin main.elf2-使用objcopy将ER_RO部分的内容替换为来自main.bin的数据。请注意,我们现在可以删除ER_RW部分,因为它已经与ER_RO合并为main.bin:
arm-none-eabi-objcopy.exe main.elf --update-section ER_RO=main.bin --remove-section=ER_RW main.gdb.elf新的main.gdb.elf文件现在可以由arm-none-eabi-gdb.exe加载。
这就是它的样子:
arm-none-eabi-readelf.exe" -S main.gdb2.elf
There are 15 section headers, starting at offset 0x11c0c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] ER_RO PROGBITS 20000000 000054 001424 00 AX 0 0 4
[ 2] ER_ZI NOBITS 200020cc 000000 0004e8 00 WA 0 0 4
[ 3] .debug_abbrev PROGBITS 00000000 001478 0005c4 00 0 0 1
...使用GDB调试愉快!!;-)
https://stackoverflow.com/questions/49508277
复制相似问题