我在这方面有一个问题。我使用 ARM Cortex-A9 和 DS-5 来创建裸机固件。我修改了链接器文件,有意将 .data 部分 LMA 与 text 和 rodata 部分相邻,因为其默认运行时 VMA 位于 1MB 之外,.bin 映像约为 1MB,但包含 90% 的零。所以我故意让 LMA != VMA 来节省空间。我还在 start.S 中添加了一段代码,将 .data 部分从 lma 重新定位到 vma。
然而,在 DS-5 中加载生成的 elf 文件时,它已经将所有部分加载到其 VMA 中。结果,我的 start.S 代码应该重新定位数据,从带有垃圾内容的 LMA 复制到已经正确的 VMA,不久之后这些垃圾就导致了故障。
我有过在 Cortex-M4 中使用二进制形式的不等 VMA 和 LMA 的经验,并使用 gdb 进行 elf 调试,那里没有问题,但它是微控制器。在我当前的 Arm 处理器应用程序中,我将如何在 elf 调试中模拟将数据从 LMA 正确复制到 VMA 的场景。使用二进制格式独立启动时很可能不会有问题,但现在我们仍在 elf 调试中,所以我必须解决这个问题。
问题解决了...我想分享给我的解决方案:
它有助于认识到“VMA”和“LMA”是 GNU 实用程序术语,而不是 ELF 规范中的术语。一旦你开始认真解释 ELF 可执行文件,你会发现有一个名为“p_paddr”的程序头字段和另一个名为“p_vaddr”的头字段 - 这使得搜索更容易!在 DS-5 中使用 p_paddr 所需的选项是:
ARM DS-5 调试器命令参考:1.3.138 set elf load-segments-at-p_paddr
默认情况下,DS-5 使用 p_vaddr,这是标准。 p_paddr 的使用是一种实现质量,并且在规范中的定义非常宽松。 ARM 编译器、链接器和 C 库不会生成此信息,因为重定位过程是在内部处理的(分散加载)。有些环境不使用 p_paddr 作为物理地址,而是使用加载地址(因此为“LMA”),有些环境使用它作为在启用 MMU 之前和之后解析符号的地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)