从编译的可执行文件获取编译器选项?
有没有办法看到什么编译器和标志被用来创build一个可执行文件* nix? 我有我的代码的旧版本编译,我想看看它是否编译有或没有优化。 谷歌是不是太有用,但我不知道我使用正确的关键字。
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 ac $ readelf -p .GCC.command.line a.out String dump of section '.GCC.command.line': [ 0] ac [ 4] -mtune=generic [ 13] -march=x86-64 [ 21] -O2 [ 25] -frecord-gcc-switches
当然,如果没有这个选项,编译的可执行文件将不起作用。
对于简单的优化案例,如果使用debugging信息编译文件,则可以尝试使用debugging器。 如果你稍微介绍一下,你可能会注意到一些variables被“优化”了。 这表明优化发生了。
如果使用-frecord-gcc-switches
标志进行编译,则命令行编译器选项将写入注释部分的二进制文件中。 另见文件 。
另一个选项是-grecord-gcc-swtiches(注意,不是-f,而是-g)。 根据海湾合作委员会的文档,它会把标志放入矮人的debugging信息。 从gcc 4.8开始,它看起来是默认启用的。
我发现侏儒转储程序是有用的提取这些cflags。 请注意,string程序不会看到它们。 看起来矮人信息是压缩的。
这是需要编译器支持的东西。 你没有提到你正在使用什么编译器,但是因为你标记了你的问题linux
我会假设你使用的是gcc–它不会默认你提到的function(但是-frecord-gcc-switches是一个选项来执行这个)。
如果你想检查你的二进制文件,那么strings
命令将会显示文件中所有看起来是可读的string。
我非常怀疑这是可能的:
int main() { }
当编译时:
gcc -O3 -ffast-math -g main.c -o main
在生成的对象中找不到任何参数:
strings main | grep -O3 (no output)
如果你仍然使用了编译器(相同版本),并且只有一个标记你不确定,那么你可以尝试重新编译你的代码,一次一次,一次没有标记。 然后你可以比较可执行文件。 你的旧的应该和新的一样,或者非常相似。