Tidak ada cara universal, tetapi Anda dapat membuat tebakan yang berpendidikan dengan mencari hal-hal yang hanya dilakukan oleh satu kompiler.
GCC adalah yang termudah; itu menulis .comment
bagian yang berisi string versi GCC (string yang sama yang Anda dapatkan jika Anda menjalankan gcc --version
). Saya tidak tahu apakah ada cara untuk menampilkannya readelf
, tetapi dengan objdump
itu:
objdump -s --section .comment /path/binary
Saya baru sadar saya mengabaikan sisa pertanyaan Anda. Bendera umumnya tidak disimpan di mana pun; mereka akan berada di bagian komentar yang paling mungkin, tetapi saya belum pernah melihat itu dilakukan. Ada tempat di header COFF untuk cap waktu, tapi tidak ada yang setara di ELF, jadi saya tidak berpikir waktu kompilasi juga tersedia
objdump
? Apakah ini memberikan informasi lebih lanjut? Tersedia di berbagai platform? Format keluaran lebih bersih?Anda dapat mencoba menggunakan
strings
perintah. Ini akan membuat banyak output teks; dengan memeriksa Anda mungkin menebak kompiler.pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Di sini saya tahu itu dikompilasi
gcc
tetapi Anda selalu dapat mengarahkanstrings
output ke file dan memeriksanya.Ada satu utilitas yang sangat bagus
peid
untuk Windows tetapi saya tidak dapat menemukan alternatif untuk itu di Linux.sumber
Ada dua metode. Keduanya akan memberikan hasil yang sama
Menggunakan perintah readelf,
readelf -S binary
akan menampilkan 40 bagian header dalam biner. Catat nomor seri.comment
tajuk bagian. Dalam sistem saya, ini menunjukkan 27 (mungkin berbeda untuk kasus Anda)readelf -x 30 path/to/binary
-> yang akan menampilkan dump Hex bagian '.comment'. Di dump itu, Anda bisa melihat kompiler yang digunakan untuk membangun biner.sumber
baik diri sendiri atau objdump keduanya bisa melakukan ini.
File ELF yang dikompilasi oleh gcc akan menambahkan .note.ABI-tag dan .note.gnu.build-id dua bagian. keduanya dapat ditampilkan oleh
opsi "s" berarti menampilkan konten lengkap, "j" untuk menunjukkan nama bagian. Gaya ini mendapatkan konten hex bagian itu.
akan menampilkan konten ELFFILE yang dapat dibaca manusia sekali. opsi "n" berarti CATATAN.
Pilih satu sesuai keinginan Anda.
Omong-omong, gunakan keberatan, Anda dapat menambahkan bagian Anda sendiri di file elf.
sumber
readelf -n
bekerja untuk saya - contoh output: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
Anda juga dapat menggunakan skrip pintar ini yang menghitung jumlah berbagai instruksi CPU yang digunakan oleh biner. Ini didasarkan pada parsing keluaran objdump. Berhati-hatilah karena bisa memakan waktu yang cukup lama jika Anda menggunakannya pada biner besar.
sumber
Mungkin layak dicoba, tergantung pada program mana. Beberapa program akan membuat ini dikompilasi sebagai informasi dan dapat diakses oleh semacam panggilan versi (-V, --version, -Version, dll). Anda dapat menemukan subset dari item-item yang Anda cari (termasuk set nol). Inilah contoh yang sangat bermanfaat, Perl 5:
sumber
Jika Anda membuka biner ELF dalam 7-zip, itu akan mencantumkan berbagai bagian di dalamnya. Dari sana, Anda dapat menggunakan opsi Lihat konteks-menu di katakanlah, bagian ".comment", untuk melihat komentar kompiler (mis. "GCC: (GNU) 4.9 20150123 (prerelease) Android clang versi 3.8.256229 (berdasarkan pada LLVM 3.8.256229) ").
Hati-hati bahwa bagian ".comment", jika ada, tampaknya dimulai dengan karakter nol, jadi pastikan untuk memilih aplikasi penampil untuk digunakan dalam 7-zip yang tidak menjadi bingung dengan ini (mis. Mencoba menafsirkan data sebagai Unicode). Bagian lain yang mungkin ada dan menarik adalah ".note. *".
sumber