значение выходной сборки objdump -d

Я пытаюсь понять, что означают все элементы этого objdump -d.

например у меня есть:

08048b50 <phase_1>:
8048b50:    83 ec 1c                sub    $0x1c,%esp
 8048b53:   c7 44 24 04 68 a2 04    movl   $0x804a268,0x4(%esp)
 8048b5a:   08 
 8048b5b:   8b 44 24 20             mov    0x20(%esp),%eax
 8048b5f:   89 04 24                mov    %eax,(%esp)
 8048b62:   e8 63 04 00 00          call   8048fca <strings_not_equal>
 8048b67:   85 c0                   test   %eax,%eax
 8048b69:   74 05                   je     8048b70 <phase_1+0x20>
 8048b6b:   e8 f5 06 00 00          call   8049265 <explode_bomb>
 8048b70:   83 c4 1c                add    $0x1c,%esp
 8048b73:   c3                      ret    

в частности, я не уверен, что мне говорят 1-й и центральный столбцы


person Ted    schedule 13.02.2014    source источник


Ответы (2)


В первом столбце указаны адреса памяти, где будет находиться код во время выполнения.

Во втором столбце указана шестнадцатеричная версия исполняемой инструкции.

Третья (и четвертая) колонны представляют собой разобранную версию второй колонны. то есть код операции и операнды.

person imreal    schedule 13.02.2014
comment
хорошо, спасибо, можно ли получить строковое представление значений в регистрах? например, я выполняю свою программу до строки 8048b67: 85 c0 test %eax,%eax. Я хочу узнать строку, которую проверяет %eax. - person Ted; 13.02.2014
comment
Если вы используете gdb: info registers для просмотра всех или info registers [register name] для определенного. Какой отладчик вы используете? - person imreal; 13.02.2014
comment
хорошо, спасибо еще раз -- еще один вопрос -- что означают последние два столбца, когда я делаю информационные регистры? пример: eax 0x804c800 134531072 - person Ted; 13.02.2014
comment
Второй столбец представляет собой шестнадцатеричное представление сохраненного значения, а третий — десятичное представление того же числа. - person imreal; 13.02.2014
comment
есть ли способ получить строковое представление? (да, я использую gdb) - person Ted; 13.02.2014
comment
Я не очень хорошо помню, но после получения адреса используйте print /s [address] - person imreal; 13.02.2014
comment
Технически, первый столбец — это только адрес загрузки по умолчанию. Операционная система обычно может переместить его по другому адресу, сместив все, когда он фактически загружается. - person ughoavgfhw; 13.02.2014
comment
@ughoavgfhw Разве это не верно только для библиотек? - person imreal; 13.02.2014
comment
@Nick С ASLR это может произойти и с программами. - person ughoavgfhw; 13.02.2014
comment
Что касается второго столбца вывода objdump: что означает, что это ... шестнадцатеричная версия исполняемой инструкции? Например, в приведенном выше примере с инструкциями mov второй столбец начинается с 8b для первого и 89 для другого. Почему бы им обоим не быть одинаковыми? - person Andrew Falanga; 20.05.2016
comment
@AndrewFalanga Различные инструкции, см. pdos.csail.mit.edu/ 6.828/2006/readings/i386/MOV.htm - person imreal; 20.05.2016

первый: адрес, шестнадцатеричный. Разница между двумя соседними адресами — это количество машинных кодов.

второй : Машинный код, шестнадцатеричный.

третий: код на ассемблере, дизассемблированный из машинного кода.


выполнить 'objdump -no-leading-addr -S **.o', первый столбец будет скрыт.


objdump --version Версия Apple LLVM 11.0.0 (clang-1100.0.33.17)

person Sodino    schedule 20.05.2021
comment
Обратите внимание, что для большинства систем, отличных от MacOS, objdump будет версией GNU Binutils, где соответствующий параметр равен --no-addresses. (А еще есть вариант --no-show-raw-insn). В не-MacOS, если он вообще установлен, objdump LLVM часто устанавливается как llvm-objdump. - person Peter Cordes; 20.05.2021