VMA时加载ELF!= LMA

时间:2016-10-06 05:47:33

标签: linker arm elf firmware cortex-a8

我有一个问题。我正在使用ARM Cortex-A9和DS-5来创建裸机固件。我修改了我的链接器文件,故意将.data部分LMA放在文本和rodata部分旁边,因为它的默认运行时VMA位于1MB远,而.bin映像约为1MB,但包含90%的零。所以我故意制作LMA!= VM​​A来节省空间。我还在start.S中添加了一个代码,它将.data部分从lma重定位到vma。

但是,在DS-5中加载生成的elf文件时,它已将所有部分加载到其VMA中。结果,我的start.S代码应该重新定位数据,从垃圾内容的LMA复制到已经正确的VMA,不久之后这些垃圾导致了错误。

我在Cortex-M4中使用二进制不等的VMA和LMA,并使用gdb进行elf调试,并且没有问题,但它是微控制器。在我目前的arm处理器应用程序中,我将如何在elf中模拟正确地将数据从LMA复制到VMA的情况。最有可能在使用二进制格式独立启动时没有问题,但是现在我们仍然在进行精灵调试,所以我必须解决这个问题。

1 个答案:

答案 0 :(得分:2)

问题解决了...我想分享给我的解决方案:

有助于认识到“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启用前后的符号..