【问题标题】:virtual and physical addresses of sections in elf fileself 文件中各节的虚拟地址和物理地址
【发布时间】:2011-09-07 06:49:26
【问题描述】:

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         0003c3d0  00080000  00080000  00010000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  5 .data         000008d0  40000000  000d08d4  00060000  2**3
                  CONTENTS, ALLOC, LOAD, DATA

-汤姆

[1]http://www.ouah.org/RevEng/x430.htm

【问题讨论】:

  • 我对这个话题一无所知,但似乎 LMA 是由linker script 给出的(使用AT)。

标签: linker elf objdump


【解决方案1】:

节标题包含一个地址。在我看来,部分标题中的地址是 VMA。程序头包含 VMA 到 LMA 的映射。

例如,这里是“objdump -x”为我的 elf 文件显示的 sn-p:

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。

【讨论】:

  • 我认为你的猜测是正确的。这里有一个相关的问题:stackoverflow.com/questions/39888381/elf-loading-when-vma-lma 作者说:这有助于认识到“VMA”和“LMA”是 GNU 实用程序术语,不在 ELF 规范中......有些环境使用 p_paddr 不作为物理地址,但是加载地址(因此是“LMA”)......
【解决方案2】:

查找有关 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

【讨论】:

  • 什么是文件关闭?
【解决方案3】:

物理地址是ELF文件段的一个属性。 ELF 文件部分没有这样的属性。但是可以将部分映射到相应段的内存。

物理地址的含义取决于体系结构,并且可能因不同的操作系统和硬件平台而异。

来自link

p_paddr - 在系统上 物理寻址是相关的,这 成员保留给该段的 实际地址。因为系统 V 忽略物理寻址 应用程序,该成员有 可执行文件的未指定内容 文件和共享对象。

看起来您的 Crt0 对位于 ELF 文件中的物理地址的含义做了一些假设。这个假设对于特定系统可能是正确的,但不能保证在另一个系统上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2013-05-05
    • 1970-01-01
    • 2014-03-15
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多