#c #c #gcc
Вопрос:
Есть ли способ узнать, с какими флагами gcc был скомпилирован конкретный двоичный файл?
Ответ №1:
Быстрый просмотр документации GCC ничего не дает.
Ребята из Boost-одни из самых умных разработчиков C , и они прибегают к соглашениям об именах, потому что по-другому это, как правило, невозможно (исполняемый файл мог быть создан на любом количестве языков, любым количеством версий компилятора, в конце концов).
(Добавлено намного позже): Оказывается, GCC имеет эту функцию в 4.3, если ее попросят при компиляции кода:
Новый переключатель командной строки-frecord-gcc-переключатели … вызывает запись командной строки, которая использовалась для вызова компилятора, в создаваемый объектный файл. Точный формат этой записи зависит от целевого и двоичного формата файла, но обычно он принимает форму раздела заметок, содержащего текст ASCII.
Ответ №2:
Экспериментальное доказательство:
diciu$ gcc -O2 /tmp/tt.c -o /tmp/a.out.o2
diciu$ gcc -O3 /tmp/tt.c -o /tmp/a.out.o3
diciu$ diff /tmp/a.out.o3 /tmp/a.out.o2
diciu$
Я принимаю это как «нет», поскольку двоичные файлы идентичны.
Комментарии:
1. Однако это не работает, если у вас нет исходного кода
2. @xuhdev вы можете провести эксперимент с любым простым кодом, в котором O3 не предлагает никаких дополнительных оптимизаций.
Ответ №3:
Я тот, кто попросил Брайана опубликовать это изначально. Мой вопрос был связан с двоичным файлом samba. Я узнал, что вы можете запустить smb -b
, чтобы получить информацию о том, как он был построен.
Ответ №4:
Я так не думаю.
Вы можете увидеть, есть ли в нем отладочные символы, что означает, что использовался-g 😉 Но я не могу придумать, как вы могли бы узнать, какие каталоги использовались, например, для поиска заголовков include.
Возможно, лучший ответ возможен, если вы нацелены только на определенный флаг; например, если вы хотите знать только, был ли установлен флаг «…» при компиляции этого двоичного файла или нет. В таком случае, какой бы это был флаг?