Linker 当VMA!=喉罩

Linker 当VMA!=喉罩,linker,arm,elf,firmware,cortex-a8,Linker,Arm,Elf,Firmware,Cortex A8,这件事我有个问题。我正在使用ARM Cortex-A9和DS-5创建裸机固件。我修改了我的链接器文件,故意将.data部分LMA放在文本和rodata部分的旁边,因为它的默认运行时VMA位于1MB之外,而.bin图像大约1MB,但包含90%的零。所以我故意做了LMA!=VMA可以节省空间。我还在start.S中添加了一个代码,将.data节从其lma重新定位到vma 但是,在DS-5中加载生成的elf文件时,它已经将所有节加载到它们的VMA中。因此,我的start.S代码应该重新定位数据,从包含

这件事我有个问题。我正在使用ARM Cortex-A9和DS-5创建裸机固件。我修改了我的链接器文件,故意将.data部分LMA放在文本和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前后将其用作解析符号的地址。

我不知道DS-5,但请检查加载ELF文件时是否可以重新定位脚本上的节。至少在T32.ARM DS-5上是可能的。我们使用IDE开发运行在ARM上的固件。它是在Eclipse上构建的。它直接从SDRAM加载elf文件并允许我们进行调试。我查看了DS5()中的调试器命令,似乎如果您可以在load命令上应用偏移量,请查看第1.3.85页。DS5还支持类似T32的命令语法(CMM),但似乎只是部分,不过您可以检查“data.load.elf FileName.AXF reloc.text at 0xaddress”(数据加载文件名:AXF reloc.text地址:0xaddress),希望对您有所帮助。谢谢。这真的帮助了我。