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

tom*_*ins 11 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
Run Code Online (Sandbox Code Playgroud)

-Tom

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

小智 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

  • 什么是文件关闭? (2认同)

And*_*dge 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
Run Code Online (Sandbox Code Playgroud)

因此,.bss的VMA为0x48。如果查看程序标题,则一个条目的“ vaddr”为0x48,paddr为0x18c,即LMA。


Ser*_*e C 1

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

\n\n

物理地址的含义取决于体系结构,并且在不同的操作系统和硬件平台之间可能有所不同。

\n\n

从这个链接

\n\n
\n

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

\n
\n\n

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

\n