我对这个有问题。我使用 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 进行精灵调试,那里没有问题,但它是微控制器。在我当前的 arm 处理器应用程序中,我将如何在 elf 中模拟调试将数据从其 LMA 正确复制到 VMA 的场景。很可能在使用二进制格式独立启动时不会有问题,但现在我们仍在 elf 调试中,所以我必须解决这个问题。