Как objdump может отображать исходный код с опцией -S?

Есть ли ссылка на исходный файл в бинарнике? Я попытался запустить строки в двоичном файле и не смог найти ссылку на указанный исходный файл...


person anon    schedule 24.03.2010    source источник
comment
Хороший вопрос, плохие ответы (на сегодняшний день). Также см. Как с помощью GCC встроить исходные строки в выходные данные сборки?   -  person jww    schedule 02.09.2017


Ответы (3)


objdump использует отладочную информацию DWARF, скомпилированную в двоичный файл, который ссылается на имя исходного файла. Если двоичный файл не скомпилирован с информацией об отладке или objdump не удается найти исходный файл, то вы не получаете исходный код на выходе — только сборку.

Вы не видите имя исходного файла, когда используете strings в двоичном файле, потому что DWARF использует сжатие.

person caf    schedule 24.03.2010
comment
Вы говорите, что мы должны скомпилировать с включенной отладкой карликов, а затем использовать objdump (с некоторыми неизвестными параметрами) для отображения исходного кода, чередующегося с дизассемблированием? Не могли бы вы предоставить фактические шаги с фактическими командами? - person jww; 02.09.2017
comment
@jww: параметр -g для gcc включает отладочную информацию, а параметр -S для objdump дизассемблирования с чередованием исходного кода. Но вопрос не в том, как это сделать; спрашивающий уже знал это, вместо этого они спрашивали, как это реализовано (как objdump находит источник для чередования). - person caf; 02.09.2017

Информация о карлике в двоичном файле хранит сопоставление между инструкциями (фактически указателем инструкции или IP) и исходным файлом и номером строки. Исходный файл указывается с использованием полного пути, поэтому его можно найти, даже если двоичный файл перемещается. Чтобы увидеть эту информацию, вы можете использовать objdump --dwarf=decodedline <binary> (бинарный файл, конечно, должен быть скомпилирован с -g).

Как только вы скажете objdump -S <binary>, он использует эту информацию о дварфах, чтобы предоставить вам исходный код вместе с дизассемблированием.

person vkrnt    schedule 03.12.2012
comment
Возможно, вам следует привести живой пример. Я не могу заставить objdump обеспечить дизассемблирование с чередованием номеров строк исходного кода. - person jww; 02.09.2017

Насколько я понимаю, для objdump отображения исходного кода из двоичного кода существует предварительное условие: отладочная информация DWARF должна быть скомпилирована в двоичный файл. (от gcc -g sourcefile или gcc -gdwarf-2 sourcefile) И, обработав эту информацию DWARF, objdump может получить исходный код, как ответили @vlcekmi3 и @vkrnt

person JerseyGood    schedule 19.10.2013
comment
Вы говорите, что мы должны скомпилировать с включенной отладкой карликов, а затем использовать objdump (с некоторыми неизвестными параметрами) для отображения исходного кода, чередующегося с дизассемблированием? Не могли бы вы предоставить фактические шаги с фактическими командами? - person jww; 02.09.2017