Як отримати версію GCC, яка використовується для компіляції даного виконуваного файлу ELF?


74

Я хотів би отримати версію GCC, яка використовується для компіляції даного виконуваного файлу. Я спробував, readelfале інформації не отримав. Будь-які думки?

Відповіді:


82

Зазвичай він зберігається в розділі коментарів

повертає GCC: (GNU) XXX

не повертає вихідних даних

Не рідко видаляють розділ .comment (а також .note), щоб зменшити розмір через

Примітка: рядки busybox за замовчуванням визначають параметр -a, який необхідний для розділу .comment

Змінити: На відміну від відповіді Берендри Тусла, для роботи цього методу його не потрібно компілювати з будь-якими прапорцями налагодження.

Двійковий приклад:

Приклад об'єкта:

Зверніть увагу на відсутність прапорців -g (налагодження) та наявність прапора -s, який позбавляє непотрібних символів. Інформація про GCC все ще доступна, якщо розділ .comment не буде видалено. Якщо вам потрібно зберегти цю інформацію в цілості, можливо, вам доведеться перевірити ваш файл make (або відповідний сценарій збірки), щоб переконатися, що -fno-ident відсутній у ваших $ CFLAGS, а в команді $ STRIP відсутній -R .comment. -fno-ident заважає gcc генерувати ці символи в розділі коментарів.


1
Що ви маєте на увазі під словом "нормально"? Мій компілятор / версія не зберігає цю інформацію, коли компіляція виконується за допомогою параметрів за замовчуванням.
Конрад Рудольф

Я використовую GCC 4.6.2, скомпільований на OS X, але без жодних системних виправлень. Це ванільний GCC.
Конрад Рудольф

Нічого взагалі. Якщо я включаю буквальні рядки у вихідний код, вони правильно знайдені strings.
Конрад Рудольф

Вам потрібно буде вказати -aпараметр strings, оскільки утиліта .commentза замовчуванням не буде заглядати всередину розділу.
jkoshy

2
objdump -s --section .comment foo.o скидає розділ коментарів на екран
MarcH

20

На завершення сказаного іншими: він не зберігається у файлі об’єкта (або exe), якщо ви не скомпілюєте інформацію про налагодження ! (варіант -g). Якщо ви компілюєте інформацію про налагодження, ви можете повернути її за допомогою readelf:

Подивіться, як там написано GNU C 4.4.3 20100108 (prerelease).


9

Ще два способи (можливо, трохи простіші), про які я щойно читав тут: /unix/719/can-we-get-compiler-information-from-an-elf-binary

і


Розширюючи це трохи: -pопція не існує в моїй давній копії readelf(from binutils 2.14), тому мені довелося знайти індекс розділу .comment, а потім шістнадцятковим readelf --hex-dump=$(readelf -S <so_file> | grep .comment | awk '{ print $1 }' | tr -d '[]') <so_file>
дампам

2

Ця інформація не зберігається у складеному об'єкті (c).

Насправді для коду С вам зовсім не пощастило. Однак для коду С ++ ви можете знайти деяку інформацію з версій символів. Деякі функції з бібліотек середовища виконання C ++ є специфічними для версії та позначені як такі в об'єктних файлах. Спробуйте це:

Однак він не покаже вам використовувану версію GCC. Відображається версія символів під час виконання, що надається компілятору. Зазвичай час виконання - це відправлення компілятора, і його версія не менше, ніж показана з наведеною вище командою.


Добре, дякую вам, хлопці! Не можу зрозуміти, чому така важлива інформація не потрапляє до заголовка ELF. Моєю метою є насправді вбудоване ядро ​​Linux.
Ільєс Гута,

0

Ви можете використовувати утиліту elfinfo . Це також підтримує виявлення версій компілятора Go та FPC, на додаток до GCC.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.