警告:ELF段之外的可加载部分“my_section”

问题描述 投票:1回答:1

我使用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链接,我们没有这个问题,因为初始化的数据是以不同的方式完成的。

有任何想法吗?

arm gdb armv7 armclang
1个回答
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快乐调试!! ;-)

© www.soinside.com 2019 - 2024. All rights reserved.