ELF文件中节的虚拟和物理地址

14

objdump如何计算elf节的物理地址(LMA)? 我所知道的是,elf节头仅包含节的虚拟地址(VMA)[1]。

通常,VMA和LMA相同。 但对于已初始化数据节(.data),VMA是变量在RAM中的位置,而LMA是初始值定位在ROM中的位置。 Crt0负责将初始值复制到RAM中,在调用main()之前。例如:

$ objdump -h my.elf
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0003c3d0  00080000  00080000  00010000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  5 .data         000008d0  40000000  000d08d4  00060000  2**3
                  CONTENTS, ALLOC, LOAD, DATA

-Tom

[1] http://www.ouah.org/RevEng/x430.htm


我对这个主题一无所知,但似乎LMA是由链接脚本(使用AT)提供的。 - ysdx
3个回答

10

关于LMA的相关信息请查看: http://www-zeuthen.desy.de/dv/documentation/unixguide/infohtml/binutils/docs/ld/Basic-Script-Concepts.html#Basic-Script-Concepts

重点如下:

每个可加载或可分配的输出段都有两个地址。第一个是VMA,即虚拟内存地址。这是当输出文件运行时该段将具有的地址。第二个是LMA或加载内存地址。这是该段将被加载的地址。在大多数情况下,这两个地址将是相同的。当数据段加载到ROM中,然后在程序启动时复制到RAM中时(这种技术经常用于在基于ROM的系统中初始化全局变量),两个地址可能会不同。在这种情况下,ROM地址将是LMA,RAM地址将是VMA。


2
文件关闭是什么? - electro
@electro file off 表示节的文件偏移量。在上面的例子中,.text 节从文件中的 0x10000h 开始。 - rosshjb

5
节头包含一个地址。
在我看来,节头中的地址就是虚拟内存地址(VMA)。
程序头包含VMA到LMA的映射关系。
例如,以下是我的elf文件使用“objdump -x”命令显示的一部分内容:
Program Header:
<a few lines removed>
    LOAD off    0x00000240 vaddr 0x00000048 paddr 0x0000018c align 2**0
         filesz 0x00000000 memsz 0x00000004 flags rw-

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
<a few lines removed>
  3 .bss          00000004  00000048  0000018c  00000240  2**1
                  ALLOC

所以,.bss的VMA为0x48。如果您查看程序头,一个条目具有“vaddr”为0x48和paddr为0x18c的LMA。


我认为你的猜测是正确的。这里有一个相关的问题:https://dev59.com/8Zvga4cB1Zd3GeqP1GFa 作者说:意识到“VMA”和“LMA”是GNU实用程序术语而不是ELF规范有助于理解...一些环境将p_paddr用作加载地址(因此是“LMA”),而不是物理地址。 - Gu.

1

物理地址是ELF文件段的属性。 ELF文件节没有这样的属性。不过,可以将节映射到相应段的内存。

物理地址的含义取决于体系结构,并且可能因不同的操作系统和硬件平台而异。

来自link

p_paddr - 对于需要物理寻址的系统,此成员保留用于段的物理地址。因为System V忽略应用程序的物理寻址,所以对于可执行文件和共享对象,此成员具有未指定的内容。

看起来你的Crt0对位于ELF文件中的物理地址的含义做出了一些假设。这种假设在特定系统上可能是正确的,但在另一个系统上则不能保证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接