Универсального способа не существует, но вы можете сделать обоснованное предположение, ища вещи, которые выполняет только один компилятор.
GCC самый простой; он записывает .comment
раздел, содержащий строку версии GCC (ту же строку, которую вы получите, если вы запустите gcc --version
). Я не знаю, есть ли способ показать это readelf
, но с objdump
этим:
objdump -s --section .comment /path/binary
Я только что понял, что проигнорировал остальную часть вашего вопроса. Флаги вообще нигде не сохраняются; скорее всего, они будут в разделе комментариев, но я никогда не видел, чтобы это было сделано. В заголовке COFF есть место для метки времени, но в ELF нет эквивалента, поэтому я не думаю, что время компиляции также доступно
objdump
? Это дает больше информации? Доступно на разных платформах? Более чистый формат вывода?Вы можете попробовать использовать
strings
команду. Это создаст много текстового вывода; проверив его, вы можете угадать компилятор.pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Здесь я знаю, что он скомпилирован,
gcc
но вы всегда можете перенаправитьstrings
вывод в файл и проверить его.Есть одна очень хорошая утилита
peid
для Windows, но я не могу найти альтернативы для нее в Linux.источник
Есть два метода. Оба дадут одинаковый результат
Используя команду readelf, вы
readelf -S binary
увидите 40 заголовков разделов в двоичном файле . Обратите внимание на серийный номер.comment
заголовка раздела. В моей системе это показывалось как 27 (может отличаться для вашего случая)readelf -x 30 path/to/binary
-> который будет отображать шестнадцатеричный дамп раздела .comment. В этом дампе вы можете увидеть компилятор, используемый для сборки двоичного файла.источник
readelf или objdump оба могут сделать это.
ELF-файл, скомпилированный gcc, добавит .note.ABI-tag и .note.gnu.build-id в два раздела. оба могут отображаться
опция «s» означает отображение полного содержимого, «j» для указания названия раздела. Этот стиль получает шестнадцатеричное содержимое этих разделов.
покажет удобочитаемое содержание ELFFILE один раз. опция "n" означает ЗАМЕЧАНИЯ.
Выберите тот, который вам нравится.
Кстати, используйте objcopy, вы можете добавить свой собственный раздел в файл elf.
источник
readelf -n
работал для меня - пример вывода:Displaying notes found in: .note.gnu.build-id Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: b88bae04e9043b71b329bac0ce2a2e5314183272
Вы также можете использовать этот умный скрипт, который подсчитывает количество различных инструкций процессора, используемых двоичным файлом. Он основан на разборе вывода objdump. Помните, что это может занять довольно много времени, если вы используете его в большом двоичном файле.
источник
Может стоить удачного выстрела, в зависимости от того, какая программа. В некоторых программах это будет скомпилировано как информация и доступно с помощью какого-либо вызова версии (-V, --version, -Version и т. Д.). Вы можете найти любое подмножество из тех элементов, которые вы ищете (включая нулевое множество). Вот особенно плодотворный пример Perl 5:
источник
Если вы откроете бинарный файл ELF в 7-zip, в нем будут перечислены различные разделы. Оттуда вы можете использовать опцию View context-menu, например, в разделе «.comment», чтобы увидеть комментарии компилятора (например, «GCC: (GNU) 4.9 20150123 (предварительная версия) Android clang версия 3.8.256229 (на основе LLVM 3.8.256229) ").
Помните, что раздел «.comment», если он существует, кажется, начинается с нулевого символа, поэтому обязательно выберите приложение для просмотра для использования в 7-zip, которое не смущается этим (например, пытается интерпретировать данные как Unicode). Другие разделы, которые могут существовать и представлять интерес: ".note. *".
источник