我对这个有意见。我使用ARM Cortex-A9和DS-5来创建裸机固件。我修改了链接器文件,有意将.data部分LMA放在文本和rodata部分附近,因为它的默认运行时VMA位于1MB之外,.bin图像约为1MB,但包含90%的零。所以我特意做了LMA!=VMA以节省空间。我还在start中添加了一个代码。S,将.data部分从其lma重新定位到vma。
然而,在DS-5中加载生成的elf文件时,它已经将所有部分加载到了它们的VMA中。结果,我开始了。应该重新定位数据的S代码,从带有垃圾内容的LMA复制到已经正确的VMA,然后这些垃圾很快导致故障。
我在Cortex-M4中有过二进制不相等的VMA和LMA的经验,并使用gdb进行elf调试,没有任何问题,但它是微控制器。在我当前的arm处理器应用程序中,我将如何模拟自己调试将数据从LMA正确复制到VMA的场景。当使用二进制格式独立启动时,很可能不会有问题,但现在我们仍在进行elf调试,所以我必须解决这个问题。
问题已解决。。。我想分享给我的解决方案:
这有助于认识到"VMA"one_answers"LMA"是GNU实用程序术语,而不是ELF规范中的术语。一旦你开始从解释ELF可执行文件的角度来看它,你会发现有一个名为"p_paddr"的程序头字段和另一个称为"p_vaddr"的字段,这使得搜索更容易!DS-5中使用p_paddr所需的选项是:
ARM DS-5调试器命令参考:1.3.138设置elf加载段-at-p_padder
默认情况下,DS-5使用p_vaddr,这是标准配置。p_paddr的使用是一种实现质量,在规范中定义得非常松散。ARM编译器、链接器和C库不会生成这些信息,因为重新定位过程是在内部处理的(分散加载(。有些环境不是将p_paddr用作物理地址,而是将其用作加载地址(因此为"LMA"(,有些环境则将其用作启用MMU前后解析符号的地址。。