Відповіді:
Не існує універсального способу, але ви можете зробити здогадку про здогадку, шукаючи речі, зроблені лише одним компілятором.
GCC - найпростіший; він пише .comment
розділ, що містить рядок версії GCC (той самий рядок, який ви отримуєте, якщо ви запускаєте gcc --version
). Я не знаю, чи є спосіб відобразити це readelf
, але з objdump
його допомогою:
objdump -s --section .comment /path/binary
Я щойно зрозумів, що проігнорував решту вашого питання. Прапори взагалі ніде не зберігаються; вони, швидше за все, опиняться в розділі коментарів, але я ніколи цього не бачив. У заголовку COFF є місце для часової позначки, але в ELF немає еквівалента, тому я не думаю, що час компіляції також доступний
Можна спробувати скористатися strings
командою. Це створить багато виводу тексту; перевіривши це, ви можете здогадатися про компілятор.
pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Тут я знаю, що він компілюється, gcc
але ви завжди можете перенаправляти strings
вихід у файл і перевіряти його.
Існує одна дуже хороша утиліта, яка називається peid
для Windows, але я не можу знайти альтернативу для неї в Linux.
Існує два методи. Обидва дадуть однаковий результат
objdump -s --section .comment path/to/binary
Використовуючи команду readelf, readelf -S binary
відобразиться 40 заголовків розділів у двійковій формі. Зверніть увагу на порядковий номер .comment
заголовка розділу. У моїй системі він показав як 27 (може бути різним у вашому випадку)
readelf -x 30 path/to/binary
->, що відобразить шестнадцятковий дамп розділу ".comment". На цьому дампі ви можете побачити компілятор, який використовується для побудови бінарного файлу.
readelf або objdump обидва можуть це зробити.
Файл ELF, складений gcc, додасть .note.ABI-тег та .note.gnu.build-id два розділи. обидва могли відображатись
objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu-build-id ELFFILE
опція "s" означає відображення повного вмісту, "j" для вказівки назви розділу. Цей стиль отримує шістнадцятковий вміст цього розділу.
readelf -n
один раз покаже вміст ELFFILE, прочитаний людиною. опція "n" означає ПРИМІТКИ.
Виберіть собі подібний.
До речі, використовуйте objcopy, ви можете додати свій власний розділ у файл ельфів.
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
Ви також можете використовувати цей розумний сценарій, який підраховує кількість різних інструкцій процесора, використовуваних двійковим файлом. Він заснований на синтаксичному аналізі обхідного виводу. Слідкуйте за тим, що закінчення може зайняти досить багато часу, якщо ви використовуєте його на великому бінарному файлі.
Можливо, варто пощастило зняти, залежно від програми. У деяких програмах це буде складено як інформація та доступне у вигляді виклику версії (-V, --version, -Version тощо). Ви можете знайти будь-яку підмножину тих елементів, які шукаєте (включаючи нульовий набір). Ось особливо плідний приклад, Perl 5:
$ perl -V
Summary of my perl5 (revision 5 version 26 subversion 2) configuration:
Platform:
osname=linux
osvers=4.15.15-1-arch
archname=x86_64-linux-thread-multi
uname='linux flo-64 4.15.15-1-arch #1 smp preempt sat mar 31 23:59:25 utc 2018 x86_64 gnulinux '
config_args='-des -Dusethreads -Duseshrplib -Doptimize=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -Dprefix=/usr -Dvendorprefix=/usr -Dprivlib=/usr/share/perl5/core_perl -Darchlib=/usr/lib/perl5/5.26/core_perl -Dsitelib=/usr/share/perl5/site_perl -Dsitearch=/usr/lib/perl5/5.26/site_perl -Dvendorlib=/usr/share/perl5/vendor_perl -Dvendorarch=/usr/lib/perl5/5.26/vendor_perl -Dscriptdir=/usr/bin/core_perl -Dsitescript=/usr/bin/site_perl -Dvendorscript=/usr/bin/vendor_perl -Dinc_version_list=none -Dman1ext=1perl -Dman3ext=3perl -Dcccdlflags='-fPIC' -Dlddlflags=-shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -Dldflags=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now'
hint=recommended
useposix=true
d_sigaction=define
useithreads=define
usemultiplicity=define
use64bitint=define
use64bitall=define
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
bincompat5005=undef
Compiler:
cc='cc'
ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
optimize='-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt'
cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='7.3.1 20180312'
gccosandvers=''
intsize=4
longsize=8
ptrsize=8
doublesize=8
byteorder=12345678
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=16
longdblkind=3
ivtype='long'
ivsize=8
nvtype='double'
nvsize=8
Off_t='off_t'
lseeksize=8
alignbytes=8
prototype=define
Linker and Libraries:
ld='cc'
ldflags ='-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.1/include-fixed /usr/lib /lib/../lib /usr/lib/../lib /lib /lib64 /usr/lib64
libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.26.so
so=so
useshrplib=true
libperl=libperl.so
gnulibc_version='2.26'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.26/core_perl/CORE'
cccdlflags='-fPIC'
lddlflags='-shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -L/usr/local/lib -fstack-protector-strong'
Characteristics of this binary (from libperl):
Compile-time options:
HAS_TIMES
MULTIPLICITY
PERLIO_LAYERS
PERL_COPY_ON_WRITE
PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP
PERL_OP_PARENT
PERL_PRESERVE_IVUV
USE_64_BIT_ALL
USE_64_BIT_INT
USE_ITHREADS
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_COLLATE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_PERLIO
USE_PERL_ATOF
USE_REENTRANT_API
Built under linux
Compiled at Apr 18 2018 22:21:20
%ENV:
PERL5LIB="/home/jhuber/perl5/lib/perl5"
PERL_LOCAL_LIB_ROOT="/home/jhuber/perl5"
PERL_MB_OPT="--install_base "/home/jhuber/perl5""
PERL_MM_OPT="INSTALL_BASE=/home/jhuber/perl5"
@INC:
/home/jhuber/perl5/lib/perl5/x86_64-linux-thread-multi
/home/jhuber/perl5/lib/perl5
/usr/lib/perl5/5.26/site_perl
/usr/share/perl5/site_perl
/usr/lib/perl5/5.26/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib/perl5/5.26/core_perl
/usr/share/perl5/core_perl
Якщо ви відкриєте двійковий код ELF у 7-zip, він перелічить різні розділи всередині. Звідти ви можете скористатися параметром контекстного меню Переглянути, скажімо, розділом ".comment", щоб побачити коментарі компілятора (наприклад, "GCC: (GNU) 4.9 20150123 (попередня версія) Android clang версія 3.8.256229 (на основі LLVM 3.8.256229) ").
Не забудьте, що розділ ".comment", якщо він існує, здається, починається з нульового символу, тому не забудьте вибрати програму для перегляду для використання в межах 7-zip, яка цим не заплутається (наприклад, намагається інтерпретувати дані як Unicode). Інші розділи, які можуть існувати та представляти інтерес, - це ".note. *".
objdump
? Це дає більше інформації? Доступні на різних платформах? Чистіший формат виводу?