Gcc ELF文件中的VirtualAddress、LoadAddress和PhysicalAddress?

Gcc ELF文件中的VirtualAddress、LoadAddress和PhysicalAddress?,gcc,elf,readelf,Gcc,Elf,Readelf,根据劳工处手册: 地址或>区域代表VMA,即输出部分的虚拟内存地址 AT或AT>lma_区域代表lma,即输出部分的加载存储器地址 我决定用readelf-e近距离查看以转储helloworld elf文件的节头和程序头。结果如下: 我的问题是: 为什么垃圾箱里没有LMA?如何在ELF文件中表示LMA? 红色矩形中的Addr列是什么意思?VMA? 绿色矩形中的physadr是什么意思? 加1 到目前为止,似乎最重要的是LMA 为什么垃圾箱里没有LMA?LMA是如何表示的 在ELF文件中 首先,e

根据劳工处手册:

地址或>区域代表VMA,即输出部分的虚拟内存地址

AT或AT>lma_区域代表lma,即输出部分的加载存储器地址

我决定用readelf-e近距离查看以转储helloworld elf文件的节头和程序头。结果如下:

我的问题是:

为什么垃圾箱里没有LMA?如何在ELF文件中表示LMA? 红色矩形中的Addr列是什么意思?VMA? 绿色矩形中的physadr是什么意思? 加1 到目前为止,似乎最重要的是LMA

为什么垃圾箱里没有LMA?LMA是如何表示的 在ELF文件中

首先,elf文件中没有LMA头,实际上很简单,elf文件中的多个部分映射到段中,如果映射到段中的段具有加载标志,例如PROFBITS是可加载的段类型,它们映射到的段也是加载类型的段INTERP,例如load也是可加载段,这意味着elf文件中该段内的每个段都将加载到内存中。哪里简单地说,它们是给定的VMA,因此elf文件中没有LMA,LMA由VMA表示,给定应该加载的节是指定的类型/标志

红色矩形中的addr列是什么意思

这与你之前的问题有直接关系,是的!它确实意味着VMA,为了正确解释这一点,我们需要了解ELF格式是为支持某些内存保护/内存分段的体系结构设计的。 您可能希望为某些分区授予特殊权限,而不是为每个分区提供自己的内存保护,而是将多个分区映射到一个分区中,并为唯一的分区提供自己的内存保护

这就需要将节映射到段中,OS加载器如何知道如何将每个节映射到段中,从而为其提供适当的内存保护?通过它的地址。 每个部分还被赋予一个地址,通过这些地址/偏移量/大小,它们被映射到一个段中,该段总体上被分配到内存中,并被赋予一些适用于所有部分的内存保护规则

操作系统知道如何映射这些数据的唯一方法是通过地址。所以,如果该部分是可加载类型,那么它的ADDR表示VMA 至少对于使用虚拟内存且不滥用elf文件的现代系统来说是这样

Physadr是什么意思

据我所知,Physadr仅与旧式体系结构相关,其中物理寻址与用户空间程序相关,本节应包含该段所处的实际物理地址,但在大多数现代系统中,这一点被忽略

我建议你读一下

就我个人而言,在学习这个的时候,它帮助了我很多,给了我很多关于ELF文件的知识 希望我帮了你一些忙

可能重复的
 section [address] [(type)] :
   [AT(lma)]
   [ALIGN(section_align) | ALIGN_WITH_INPUT]
   [SUBALIGN(subsection_align)]
   [constraint]
   {
     output-section-command
     output-section-command
     ...
   } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp] [,]