Есть ли ссылка на исходный файл в бинарнике? Я попытался запустить строки в двоичном файле и не смог найти ссылку на указанный исходный файл...
Вопрос
Как objdump может отображать исходный код с опцией -S?
- Хороший вопрос, плохие ответы (на сегодняшний день). Также см. Как с помощью GCC встроить исходные строки в выходные данные сборки? jww 02.09.2017
Ответы
Ответ 1 · рейтинг 31 · caf
objdump использует отладочную информацию DWARF, скомпилированную в двоичный файл, который ссылается на имя исходного файла. Если двоичный файл не скомпилирован с информацией об отладке или objdump не удается найти исходный файл, то вы не получаете исходный код на выходе - только сборку.
Вы не видите имя исходного файла, когда используете strings в двоичном файле, потому что DWARF использует сжатие.
Ответ 2 · рейтинг 11 · vkrnt
Информация о карлике в двоичном файле хранит сопоставление между инструкциями (фактически указателем инструкции или IP) и исходным файлом и номером строки. Исходный файл указывается с использованием полного пути, поэтому его можно найти, даже если двоичный файл перемещается. Чтобы увидеть эту информацию, вы можете использовать objdump --dwarf=decodedline <binary> (бинарный файл, конечно, должен быть скомпилирован с -g).
Как только вы скажете objdump -S <binary>, он использует эту информацию о дварфах, чтобы предоставить вам исходный код вместе с дизассемблированием.
Ответ 3 · рейтинг 3 · JerseyGood
Насколько я понимаю, для objdump отображения исходного кода из двоичного кода существует предварительное условие: отладочная информация DWARF должна быть скомпилирована в двоичный файл. (от gcc -g sourcefile или gcc -gdwarf-2 sourcefile) И, обработав эту информацию DWARF, objdump может получить исходный код, как ответили @vlcekmi3 и @vkrnt
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- Открытие fstream с файлом с именем файла Unicode под Windows с использованием компилятора, отличного от MSVC
- Ada95 имеет 3 файла .ali, .adb и .o - могу ли я скомпилировать
- Gcc: предупреждение: большое целое неявно усекается до беззнакового типа
- Неявное объявление getopt в Solaris?
- Производительность dnsjit++
- Процесс компиляции для языка программирования C