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

时间:2011-06-02 18:02:59

标签: linker elf objdump

objdump如何计算精灵部分的物理地址(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

3 个答案:

答案 0 :(得分:6)

找到关于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

答案 1 :(得分:4)

节标题包含单个地址。它看起来像节标题中的地址是VMA。程序头包含VMA到LMA的映射。

例如,这是“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。

答案 2 :(得分:1)

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

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

从此link

  

p_paddr - 在哪些系统上   物理寻址是相关的,这个   会员是为该会员保留的   实际地址。因为System V   忽略物理寻址   应用程序,这个成员有   可执行文件的未指定内容   文件和共享对象。

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