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
- 汤姆
答案 0 :(得分:6)
重要的是:
每个可加载或可分配的输出部分都有两个地址。第一个是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文件中的物理地址的含义做了一些假设。对于特定系统,这种假设可能是正确的,但在另一个系统上却没有保证。