2015-03-02 4 views
2

Я начинаю систему Linux, и я изучаю формат файла ELF, читая эти документы (http://www.skyfree.org/linux/references/ELF_Format.pdf). Но когда я вижу связанный документ о переезде, есть странные вещи в расчете переезда. Я знаю в зависимости от типа перемещения, он применяет другой способ расчета. Но посмотри на это.Как я могу получить значение файла ELF?

Когда R-тип R_386_RELATIVE, в этом документе описывается способ вычисления «B + A». Однако Что означает «А»? и как я могу получить это значение «A» в файле ELF?

Прошу подарить мне ур милосердный ответ .......;

+0

С моей точки зрения, я думаю, что это относительно текущего IP-адреса, который является адресом ячейки памяти, где это значение будет сохранено, но у меня нет документов, чтобы это доказать. – rodrigo

ответ

2

Из документа вы упомянули:

R_386_RELATIVE

редактор ссылка создает этот тип перемещения для динамической компоновки. Его член смещения дает местоположение внутри общего объекта, который содержит значение, представляющее относительный адрес. Динамический компоновщик вычисляет соответствующий виртуальный адрес на , добавляявиртуальный адрес, по которому общий объект был загружен на относительный адрес. Записи перемещения для этого типа должны указывать 0 для индекса таблицы символов.

Это означает, что слагаемого, используемый для вычисления значения перемещаемого поля.

Б

Это означает, что базовый адрес, при котором общий объект был загружен в память во время выполнения. Как правило, общий объектный файл создается с базовым виртуальным адресом 0, но адрес выполнения будет другим.

ADDEND

Как было показано выше, только Elf32_Rela записей содержат явных слагаемый. Записи типа `Elf32_Rel хранить неявное дополнение в том месте, которое необходимо изменить. В зависимости от архитектуры процессора одна или другая форма может быть необходимой или более удобной. Следовательно, реализация для конкретной машины может использовать одну форму исключительно или любую форму в зависимости от контекста.

Базовый адрес

Для вычисления базового адреса, один определяет адрес памяти, связанный с наименьшим значением p_vaddr для сегмента PT_LOAD. Затем получается базовый адрес путем усечения адреса памяти до ближайшего кратного максимального размера страницы. В зависимости от типа загружаемого файла в память адрес памяти может быть или не соответствовать значениям p_vaddr.

Так она сводится к следующему:

  • является слагаемым и вычисляются из Elf32_Rel или Elf32_Rela структуры
  • В является базовым адрес и вычислили от p_vaddr. Определенный расчет зависит от архитектуры.

Вы можете наблюдать за перемещением части файла двоичной/библиотечной информации с помощью readelf -r.

Смежные вопросы