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

2024-04-06

我使用 Cortex-R4 的 Arm Compiler v6.9 构建了一个 axf (elf) 文件。但是,当我使用 Arm MCU Eclipse J-link GDB 插件将其加载到目标时,它无法加载我的段的初始化数据。如果我使用 Segger Ozone 和 J-Link 加载 axf,它会正确加载初始化数据。

如果我在 axf 文件上运行arm-none-eabi-gdb.exe,我的所有初始化段都会收到“警告:ELF 段之外的可加载部分“my_section””。

查看图像,初始化数据应在图像之后加载到 Region$$Table$$Base 中的表指定的地址。

如果我们与 gcc 链接,则不会出现此问题,因为初始化数据的处理方式不同。

有任何想法吗?


我今天遇到了同样的问题,并观察到了与您描述的相同的问题:

“查看图像,初始化数据应在图像之后加载到 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 将 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 进行愉快的调试!! ;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

警告:可加载部分“my_section”位于 ELF 段之外 的相关文章

  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 如何在 gdb 中附加进程

    我有一个简单的 C 程序 它分叉一个进程 然后运行一个可执行文件 我想将子进程附加到 gdb 我在控制台中运行主程序并打开另一个控制台来查找子进程的 pid 然后使用以下命令启动 gdb gdb attach 12271 where 122
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • 在 MacOS 上从源代码构建 gdb

    我正在尝试在 Apple M1 MacBook 上安装交叉编译的 gdb 我下载了 gdb 11 1 并执行了以下操作 tmp src gdb 11 1 configure enable targets all make sudo make
  • Google crashpad 上的一个交叉编译平台应用程序。 Ubuntu 中无法读取 dmp 文件

    我有一个小qt项目 https github com apalomer qt crashpad test我想跟踪一个分段错误 这是一个示例 分段错误是出于测试目的而手动添加的 在实际项目中我不知道留在那里的分段错误 我决定使用 google
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 如何从 gdb 命令提示符执行外部命令?

    我正在使用 gdb 调试程序 每当我错过断点或决定添加另一个观察点时 我必须终止该进程并重新运行它 为了将现有的 gdb 附加到它 我使用attach
  • 使用矢量化为 iPhone 编译 Eigen 库

    我正在努力为 iPhone 4 编译 Eigen 库 该库具有带有 armv7 指令集的 ARM 处理器 到目前为止 当我指定预处理器定义 EIGEN DONT VECTORIZE 时 一切正常 但由于一些性能问题 我想使用armv7优化的
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 如何在 gdb 中禁用“键入 继续,或 q 退出”?

    我想要自动化gdb 并且等待用户输入是不可取的 如何禁用消息 Type
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 观察点固定地址

    对于我当前的嵌入式应用程序 我尝试将 GDB 观察点放在固定的内存地址处 例如 我的应用程序更新以下地址 0x10793ad0 为了确定代码的哪一部分破坏了值 我尝试了 watch 0x10793ad0 即使 GDB 在此之后不会打印任何错
  • “劣质调试器”一词中的“劣质”是什么意思?

    我不太明白GDB手册中对inferior的解释 谷歌也没有提供任何更有帮助的信息 谁能简单地解释一下 低等 劣质 是一个通用术语 表示 您正在使用 gdb 来调试的东西 通常是在模拟器或通过串行线路连接的其他硬件上运行的进程或内核 当您使用
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • gdb 中的 是什么意思?

    gdb n 134 a b c 0xdeadbeef uint32 t length initval gdb n gdb p a 30

随机推荐