ELF文件中的VirtualAddress,LoadAddress和PhysicalAddress?

时间:2016-07-11 07:52:55

标签: gcc elf readelf

根据Output Section Description上的ld手册:

readelf -e

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

AT() AT> lma_region 代表LMA,即加载内存地址输出部分。

我决定与public StreamedContent getDrawing() throws Exception { DocumentFile documentFile = (DocumentFile) getViewScope("documentFile"); if (documentFile != null) { byte[] content = documentFileService.download(documentFile.getId()); InputStream stream = new ByteArrayInputStream(content); FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); externalContext.setResponseContentLength(content.length); StreamedContent content2 = new DefaultStreamedContent(stream, URLEncoder.encode(documentFile.getFilename(), "UTF-8")); facesContext.responseComplete(); return content2; } return null; } 近距离查看以转储 部分标题 程序标题

section headers

program headers

我的问题是:

  • 为什么转储标头中没有LMA? LMA如何在ELF文件中表示?
  • 红色矩形中的Addr列是什么意思? VMA?
  • 绿色矩形中的PhysAddr是什么意思?

ADD 1

到目前为止,似乎PhysAddr是LMA。

1 个答案:

答案 0 :(得分:4)

  

为什么转储标头中没有LMA? LMA是如何代表的   在ELF文件中

首先,elf文件中没有LMA头,它实际上很安静,ELF文件中的多个部分被映射成段,如果映射到段的段有一个LOAD标志,例如(PROFBITS)是一个可加载的部分类型,它们映射到的段也是一个加载类型段(INTERP和LOAD),例如也是可加载的段,这意味着该elf文件中该段内的每个部分都将加载到内存中。哪里?简单地说它们是给定的VMA,所以在elf文件中没有LMA,LMA由VMA表示,因为应该加载该部分是指定的类型/标志。

  

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

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

这导致需要将段映射到段中,OS加载器如何知道如何将每个段映射到段中并由此为其提供适当的内存保护?通过它的地址。 每个部分也都有一个地址,通过那些地址/偏移/大小,它们被映射到一个整体将分配到内存中的段,并给出一些适用于所有部分的内存保护规则。

操作系统可以知道如何映射这些的唯一方法是通过地址所以如果该部分属于可加载类型,则它的ADDR意味着VMA (至少对于使用虚拟内存并且不滥用elf文件的现代系统而言)

  

PhysAddr是什么意思?

据我所知,PhysAddr仅与旧式架构有关,其中物理寻址与用户空间程序相关,此部分应该包含该段所在的实际物理地址,但在大多数现代系统中,这是简单地忽略......

我建议你阅读http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf

亲自回到学习这一天的那一天,它帮助了我很多,并且给了我很多关于ELF文件的知识 希望我能帮助你一些方法! :)