виртуальные и физические адреса разделов в файлах elf - PullRequest
10 голосов
/ 02 июня 2011

Как objdump вычисляет физический адрес (LMA) эльфийских секций? Насколько я могу судить, заголовки разделов elf содержат только виртуальный адрес (VMA) разделов [1].

Обычно VMA и LMA одинаковы. Но для инициализированных секций данных (.data) VMA - это местоположение в ОЗУ переменных, а LMA - это место в ПЗУ, где находятся начальные значения. Crt0 отвечает за копирование начальных значений в RAM до вызова main (). Например:

$ 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

-Tom

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

Ответы [ 3 ]

6 голосов
/ 03 сентября 2011

Найти это о LMA: http://www -zeuthen.desy.de / DV / документация / unixguide / infohtml / Binutils / документы / LD / Basic-Script-Concepts.html # Basic-Script-Concepts

Важным является следующее:

Каждая загружаемая или выделяемая секция вывода имеет два адреса. Первый - это VMA или адрес виртуальной памяти. Это адрес, который будет иметь раздел при запуске выходного файла. Второй - это LMA или адрес загрузки памяти. Это адрес, по которому будет загружен раздел. В большинстве случаев оба адреса будут одинаковыми. Примером, когда они могут отличаться, является случай, когда раздел данных загружается в ПЗУ, а затем копируется в ОЗУ при запуске программы (этот метод часто используется для инициализации глобальных переменных в системе на основе ПЗУ). В этом случае адрес ПЗУ будет LMA, а адрес ОЗУ будет VMA

4 голосов
/ 26 сентября 2013

Заголовок раздела содержит один адрес. Это выглядит как адрес в заголовке раздела VMA. Заголовки программы содержат отображение VMA в LMA.

Например, вот фрагмент того, что "objdump -x" показывает для моего файла эльфа:

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.

1 голос
/ 10 июня 2011

Физический адрес является атрибутом сегмента файла ELF. В разделе ELF-файла такой атрибут отсутствует. Тем не менее, возможно отобразить разделы в памяти соответствующего сегмента.

Значение физического адреса зависит от архитектуры и может различаться для разных операционных систем и аппаратных платформ.

Из этой ссылки :

p_paddr - в системах, для которых физическая адресация актуальна, это участник зарезервирован для сегмента Физический адрес. Потому что система V игнорирует физическую адресацию для прикладные программы, этот участник имеет неопределенное содержимое для исполняемого файла файлы и общие объекты.

Похоже, ваш Crt0 делает некоторые предположения о значении физического адреса, расположенного в файле ELF. Это предположение может быть верным для конкретной системы, но не гарантируется для другой.

...