2011-06-02 135 views
6

objdump如何計算elf段的物理地址(LMA)?據我所知,精靈節頭只包含節[1]的虛擬地址(VMA)。elf文件中段的虛擬地址和物理地址

通常,VMA和LMA是相同的。但對於初始化數據段(.data),VMA是變量的RAM位置,LMA是初始值所在的ROM位置。在main()被調用之前,Crt0負責將初始值複製到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

+0

我不知道關於這個主題的anython,但它似乎LMA是由[鏈接器腳本](https://sourceware.org/binutils/docs-2.18/ld/Output-Section-LMA.html)給出的(使用'AT')。 – ysdx 2015-08-20 21:27:51

回答

0

物理地址是ELF文件段的屬性。 ELF文件部分沒有這樣的屬性。儘管將部分映射到相應的段的內存是可能的。

物理地址的含義取決於體系結構,可能因不同的操作系統和硬件平臺而異。

從這個link

p_paddr - 在系統這 物理尋址相關的,這 成員保留該事業部 物理地址。由於系統V 忽略了 應用程序的物理地址,因此該成員具有 未指定內容的可執行 文件和共享對象。

看起來你的Crt0對位於ELF文件中的物理地址的含義做了一些假設。這個假設對於特定的系統可能是正確的,但是在另一個系統中並不保證。

6

查找此有關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

+0

什麼是文件關閉? – electro 2017-06-05 08:24:21

4

部分標題包含一個地址。它看起來像在部分標題中的地址是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 

所以,擁有的.bss的0x48一個VMA。如果你查看程序頭文件,一個條目有一個0x48的「vaddr」和一個0x18c的paddr,這是LMA。

+0

我認爲你的猜測是正確的。這裏有一個相關的問題:作者說:https://stackoverflow.com/questions/39888381/elf-loading-when-vma-lma它有助於認識到「VMA」和「LMA」是GNU實用程序術語,而不是在ELF規範中....有些環境不使用p_paddr作爲物理地址,而是使用加載地址(因此稱爲「LMA」).... – 2018-02-09 14:52:43