12

objdump 如何计算 elf 部分的物理地址 (LMA)?据我所知,elf 节标题仅包含节 [1] 的虚拟地址 (VMA)。

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

$ 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

-汤姆

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

4

3 回答 3

9

查找有关 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

于 2011-09-02T22:17:41.003 回答
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。

于 2013-09-26T12:44:15.143 回答
1

物理地址是 ELF 文件段的一个属性。ELF 文件部分没有这样的属性。虽然可以将部分映射到相应段的内存。

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

从这个链接

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

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

于 2011-06-10T00:02:50.643 回答