Обнаружение флагов GCC во время компиляции двоичного файла

#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.

Возможно, лучший ответ возможен, если вы нацелены только на определенный флаг; например, если вы хотите знать только, был ли установлен флаг «…» при компиляции этого двоичного файла или нет. В таком случае, какой бы это был флаг?