2012-02-16 3 views
5

Здесь у меня есть исполняемый файл, не зная его среды сборки, с предположением использования gcc/g ++. Есть ли способ узнать флаг оптимизации, используемый во время компиляции (например, O0, O2, ...)?Определить флаг оптимизации компиляции из исполняемого файла

Все средства приветствуются, неважно, анализируя двоичный или некоторый отладочный тест через gdb (если мы предположим, что флаг -g доступен во время компиляции).

+0

Этот вопрос может помочь: http://stackoverflow.com/questions/189350/detect-gcc-compile-time-flags-of-a-binary – Nick

+3

Меня очень интересует причина такого запроса. Примечательно, что вы должны знать, что оптимизация может быть включена и выключена на индивидуальной основе, а уровни «O» - это просто группы для удобства. –

+1

В частности, см. [Этот информативный ответ] (http://stackoverflow.com/a/340828/15416) на этот вопрос. Это убедительное доказательство того, что вы не можете сделать это надежно. – MSalters

ответ

-4

Возможно, вы не хотите этого делать.

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

Если нет - зачем вы хотите его написать?

+3

Не отвечает Q, в лучшем случае комментарий. –

+0

Я думаю, что он имеет в виду, что у него есть исполняемый файл, который он хочет исследовать. – MByD

+1

Нет, это не отвечает на вопрос. Но подумайте об этом: оптимизация не должна _ изменять поведение программы, не так ли? Похоже, он хочет сделать именно это ... – jakob

2

Если вам повезет, командная строка присутствует в самом исполняемом файле, в зависимости от используемой операционной системы и формата файла. Если это эльф-файл, попытайтесь сбросить содержимое с помощью objdump из GNU binutils

0

Я действительно не знаю, если это может помочь, но проверка O0 довольно легко в разборке (objdump -d), так как генерируемый код не имеет никакой оптимизации и добавляет несколько инструкций для упрощения отладки.

Как правило, на x86 пролог функции включает в себя сохранение указателя стека (например, для backtrace). Так что, если вы обнаружите, например, основной функцией, вы должны увидеть что-то вроде:

... главное: ... толчок% РСП ... мов% РСП, РСП%

И должен видеть этот «шаблон» почти в каждом начале функций. Для других целей (я не знаю, какова ваша целевая платформа) вы должны увидеть более или менее похожие последовательности сборки в прологах или перед вызовом функции.

Для других уровней оптимизации все намного сложнее.

Извините за оставшиеся неопределенные и не отвечающие на весь вопрос ... Просто надеясь, что это поможет.

Смежные вопросы