Подтвердить что ты не робот

Получить параметры компилятора из скомпилированного исполняемого файла?

Есть ли способ увидеть, какой компилятор и флаги были использованы для создания исполняемого файла в * nix? У меня есть старая версия скомпилированного кода, и я хотел бы посмотреть, была ли она скомпилирована с оптимизацией или без нее. Google не был слишком полезен, но я не уверен, что использую правильные ключевые слова.

4b9b3361

Ответ 1

gcc имеет для этого параметр -frecord-gcc-switches:

   -frecord-gcc-switches
       This switch causes the command line that was used to invoke the compiler to
       be recorded into the object file that is being created.  This switch is only
       implemented on some targets and the exact format of the recording is target
       and binary file format dependent, but it usually takes the form of a section
       containing ASCII text.

Затем исполняемые файлы ELF будут содержать .GCC.command.line раздел с этой информацией.

$ gcc -O2 -frecord-gcc-switches a.c
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line':
  [     0]  a.c
  [     4]  -mtune=generic
  [    13]  -march=x86-64
  [    21]  -O2
  [    25]  -frecord-gcc-switches

Конечно, он не будет работать для исполняемых файлов, скомпилированных без этой опции.


Для простого случая оптимизации вы можете попробовать использовать отладчик, если файл был скомпилирован с информацией об отладке. Если вы немного перейдете к нему, вы можете заметить, что некоторые переменные были "оптимизированы". Это говорит о том, что оптимизация имела место.

Ответ 2

Если вы скомпилируете флаг -frecord-gcc-switches, тогда параметры компилятора командной строки будут записаны в двоичном виде в разделе примечания. См. также документы.

Ответ 3

Другим вариантом является -grecord-gcc-swtiches (обратите внимание, а не -f, но -g). Согласно gcc docs он помещает флаги в информацию об отладке карликов. И похоже, что он включен по умолчанию с gcc 4.8.

Я нашел программу dwarfdump полезной для извлечения этих флагов. Обратите внимание: программа строк не видит их. Похоже, что информация о карлике сжимается.

Ответ 4

Это то, что потребует поддержки компилятора. Вы не упомянули, какой компилятор вы используете, но поскольку вы отметили свой вопрос linux, я предполагаю, что вы используете gcc - который не выполняет функцию, о которой вы просите (но -frecord-gcc-switch - это опция для выполнения этого).

Если вы хотите проверить свой двоичный файл, команда strings покажет вам все, что кажется читаемой символьной строкой в ​​файле.

Ответ 5

Я очень сомневаюсь, что это возможно:

int main()
{
}

При компиляции с помощью:

gcc -O3 -ffast-math -g main.c -o main

Ни один из параметров не найден в сгенерированном объекте:

strings main | grep -O3
(no output)

Ответ 6

Если вы все еще используете компилятор (ту же версию), который вы использовали, и это только один флаг, о котором вы не знаете, вы можете попытаться скомпилировать свой код снова, один раз и один раз без флага. Затем вы можете сравнить исполняемые файлы. Ваш старый должен быть идентичным или очень похожим на один из новых.