Linker elf文件中节的虚拟和物理地址
objdump如何计算elf段的物理地址(LMA)?据我所知,elf节头仅包含节[1]的虚拟地址(VMA) 通常,VMA和LMA是相同的。但对于初始化数据段(.data),VMA是变量的RAM位置,LMA是初始值所在的ROM位置。Crt0负责在调用main()之前将初始值复制到RAM中。例如:Linker elf文件中节的虚拟和物理地址,linker,elf,objdump,Linker,Elf,Objdump,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
$ 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] 物理地址是ELF文件段的一个属性。ELF文件节不具有此属性。不过,也可以将节映射到相应段的内存中 物理地址的含义取决于体系结构,在不同的操作系统和硬件平台之间可能有所不同 由此: p_paddr-在系统上 物理寻址是相关的,这 成员是为段的 物理地址。因为系统V 忽略的物理寻址 应用程序,此成员具有 可执行文件的未指定内容 文件和共享对象 看起来您的Crt0对ELF文件中物理地址的含义做了一些假设。这一假设可能适用于特定系统,但不适用于其他系统。找到LMA的相关信息: 重要的是:
每个可加载或可分配的输出部分都有两个地址。第一个是VMA或虚拟内存地址。这是运行输出文件时节将具有的地址。第二个是LMA,或加载内存地址。这是将加载节的地址。在大多数情况下,这两个地址是相同的。它们可能不同的一个例子是,将数据段加载到ROM中,然后在程序启动时复制到RAM中(这种技术通常用于在基于ROM的系统中初始化全局变量)。在这种情况下,ROM地址将是LMA,RAM地址将是VMA。节头包含一个地址。在我看来,部分标题中的地址是VMA。程序头包含VMA到LMA的映射 例如,下面是“objdump-x”为我的elf文件显示的内容的一个片段:
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
程序头:
加载0x00000240 vaddr 0x00000048 paddr 0x0000018c校准2**0
filesz 0x00000000 memsz 0x00000004标志rw-
部分:
Idx名称大小VMA LMA文件关闭Algn
3.bss 00000004000000480000018C 000002402**1
阿洛克
因此,.bss的VMA为0x48。如果您查看程序标题,其中一个条目的“vaddr”为0x48,paddr为0x18c,这就是LMA。关于这个主题,我不知道任何内容,但似乎LMA是由(使用
AT
)给出的。什么是文件关闭?我想您的猜测是正确的。这里有一个相关的问题:作者说:这有助于认识到“VMA”和“LMA”是GNU实用术语,而不是ELF规范中的术语。。。。有些环境使用p_paddr不是物理地址,而是加载地址(因此称为“LMA”)。。。。