Как интерпретировать objdump разборки выходных столбцов? - PullRequest
0 голосов
/ 28 марта 2020

Я написал простую программу на c, которая вызывает функцию while_l oop с аргументами 4,3,2. Эта функция, по сути, просто некоторое время l oop, я не думаю, что она действительно имеет отношение к моему вопросу, поскольку это скорее общий вопрос c. Мне сказали запустить objdump -d, так я и сделал.

enter image description here

У меня есть несколько вопросов, поэтому вот оно:

  1. Я понимаю, что в крайнем левом столбце есть адреса и они увеличиваются в зависимости от количества байтов впереди. Что я не очень хорошо понимаю, так это второй столбец. Это инструкция выполняется, но в шестнадцатеричном? Означает ли это, что pu sh% ebp эквивалентно 55? Я не очень хорошо понимаю
  2. Поскольку это IA-32 и он имеет младший порядок байтов, я знаю, что младший байт хранится по младшему адресу. Однако я не понимаю, соответствует ли порядок, в котором представлены эти байты, их месту в памяти. Посмотрите на строку 3: «8b 55 10» означает ли это, что самый низкий адрес содержит 8b, и я прочитаю его наоборот, или это означает, что 10 находится на самом низком адресе, а я прочитаю его наоборот?
  3. Являются ли эти адреса слева абсолютными адресами памяти или относительными?

1 Ответ

5 голосов
/ 28 марта 2020

В этом случае ваши адреса являются абсолютными, потому что у вас есть исполняемый файл , зависящий от позиции (не P IE). В метаданных ELF есть поле (устанавливаемое компоновщиком), в котором указывается, какой виртуальный адрес отображать исполняемый файл. Вы можете использовать readelf -a, чтобы увидеть это и многое другое.

В исполняемом файле P IE шестнадцатеричные адреса будут относиться к «базе изображений», что обычно означает относительно начала файла. (Аналогично .o, где адреса отсчитываются от 0 в начале раздела .text). Вы можете использовать --adjust-vma=offset для установки базового адреса для печати этих адресов.

Да, столбец 2 представляет собой шестнадцатеричный код машинного кода в виде отдельных байтов в порядке памяти . Objdump не интерпретирует их как слова с прямым порядком байтов или что-то в этом роде, просто пару шестнадцатеричных цифр на байт в порядке увеличения адреса.


x86 машинный код в основном байт-поток . Инструкции состоят из

[prefixes] opcode [modrm [SIB] displacement0/8/32] [immediate8/32]

Код операции представляет собой либо один байт, либо последовательность байтов, указанную в порядке следования памяти в документации Intel / AMD, например, 0F AF /r для imul reg, reg/mem

Некоторые инструкции имеют 16-битные немедленные значения, но обычно это 1 или 4 байта, если они вообще присутствуют.

Порядковый номер имеет значение только для многобайтовых смещений в режимах адресации или для нескольких -байт немедленно.

например, mov $0x12345678, %eax в foo.s, собирается с gcc -c foo.s в .o, который разбирается как:

  0:   b8 78 56 34 12          mov    $0x12345678,%eax

См. также дополнительные ссылки на документы и руководства по x86 в x86-теге SO x wiki , включая руководства Intel по PDF

...