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
小智 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
节标题包含一个地址。在我看来,节标题中的地址是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。