我使用Arm Compiler v6.9为Cortex-R4构建了一个axf(elf)文件。但是当我使用Arm MCU Eclipse J-link GDB插件将其加载到目标时,它无法加载我的段的初始化数据。如果我使用Segger Ozone和J-Link加载axf,它会正确加载init数据。
如果我在axf文件上运行arm-none-eabi-gdb.exe,我会得到"警告:可加载部分" my_section"在ELF细分之外"对于我所有初始化的细分。
查看图像时,初始化数据应在图像之后加载到Region $$ Table $$ Base中的表所指定的地址。
如果我们使用gcc链接,我们就不会遇到此问题,因为初始化数据的执行方式不同。
有什么想法吗?
答案 0 :(得分:2)
我今天遇到了同样的问题,并观察到您描述的相同问题:
“查看图像,应在图像之后将初始化数据加载到Region $$ Table $$ Base中表所指定的地址。”
看来,尽管很相似,但armlink生成的ELF文件与GCC生成的ELF有点不同。 无论如何,我已经找到了解决方法。
检查我的main.elf时,我注意到armlinker将初始化数据存储到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处加载了ER_RW,但实际上,我需要在ER_RO节之后(即在addr = 0x20001358处)加载
解决方法是:
1-使用fromelf将所有节转储到二进制文件main.bin中。 Fromelf将在ER_RO之后追加ER_RW,因为应该是这样:
fromelf.exe --bin -o main.bin main.elf
2-使用objcopy将main_bin中的数据替换ER_RO节的内容。 请注意,由于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
现在可以通过arm-none-eabi-gdb.exe加载新的main.gdb.elf文件
外观如下:
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调试愉快!! ;-)