2016-04-02 14 views
1

Я пытаюсь изучить кое-что о языке ассемблера, изучая инструкции в некоторых общих объектах. Я обнаружил конструкцию, где call инструкция приводит к 1 байт после его начала, например (выход из hte):Как декодировать этот перемещенный вызов?

af6fc | e8fcffffff call af6fdh 

Очевидно, что адрес назначения должен быть заменен на соответствующую функцию (которую я знаю, в этом случае strcmp). Я нахожу это странным, потому что в других частях же общего объекта функция жеstrcmp называется использованием механизма .got/.plt избавляя от необходимости переписывать часть из .text. В последнем случае функцию назначения можно идентифицировать, изучив таблицу .rel.plt вместе с .dynsym. Но как я могу найти, где непосредственный адрес перенаправляется в первом? Я не мог найти адресатов af6fc или af6fd в любом из разделов, по крайней мере, не в тех, которые были доступны для доступа к hte.

ответ

1

Вы не сказали, на какой платформе вы находитесь. Похоже, это ix86.

В ix86 можно скомпилировать код не в -fPIC в общую библиотеку (это создает библиотеку с перераспределением текста, которая является субоптимальной).

Если вы сбрасываете динамические перемещения с помощью objdump -R foo.so, вы должны увидеть, что есть перемещение по адресу 0xaf6fd. Динамический компоновщик обновит 4 байта на 0xaf6fd, чтобы указать, где это происходит, после загрузки foo.so.

в других частях одного и того же общего объекта та же функция зЬгстр вызывается с использованием механизма .got/.plt

Эти вызовы происходят из объектов, которые были (должным образом) собран с -fPIC.