从已编译的可执行文件中获取编译器选项?
- 2024-10-17 08:47:00
- admin 原创
- 170
问题描述:
有没有办法查看在 *nix 中创建可执行文件时使用了哪些编译器和标志?我编译了一个旧版本的代码,我想看看它是经过优化还是未经优化编译的。谷歌搜索没有太大帮助,但我不确定我使用的关键字是否正确。
解决方案 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 文档,它会将标志放入 dwarf 调试信息中。并且看起来从 gcc 4.8 开始它默认启用。
我发现 dwarfdump 程序对于提取这些 cflag 很有用。请注意,strings 程序看不到它们。看起来矮人信息是压缩的。
解决方案 4:
只要可执行文件是由 gcc 使用-g
选项编译的,那么以下命令就可以解决问题:
readelf --debug-dump=info /path/to/executable | grep "DW_AT_producer"
例如:
% cat test.c
int main() {
return 42;
}
% gcc -g test.c -o test
% readelf --debug-dump=info ./test | grep "DW_AT_producer"
<c> DW_AT_producer : (indirect string, offset: 0x2a): GNU C17 10.2.0 -mtune=generic -march=x86-64 -g
遗憾的是,clang 似乎没有以类似的方式记录选项,至少在版本 10 中是这样。
当然,strings
也会出现这种情况,但人们必须至少知道要寻找什么,因为用肉眼检查现实世界二进制文件中的所有字符串通常是不切实际的。例如,使用上面示例中的二进制文件:
% strings ./test | grep march
GNU C17 10.2.0 -mtune=generic -march=x86-64 -g -O3
解决方案 5:
这需要编译器支持。你没有提到你使用的是什么编译器,但既然你标记了你的问题,linux
我会假设你使用的是 gcc —— 它不会默认你询问的功能(但 -frecord-gcc-switches 是执行此操作的一个选项)。
如果您想检查二进制文件,该strings
命令将显示文件内看似可读的字符串的所有内容。
解决方案 6:
如果您仍使用过编译器(同一版本),并且只有一个标志不确定,则可以尝试再次编译代码,一次使用该标志,一次不使用该标志。然后,您可以比较可执行文件。您的旧版本应该与新版本之一相同或非常相似。
解决方案 7:
我非常怀疑这是否可能:
int main()
{
}
使用以下方式编译时:
gcc -O3 -ffast-math -g main.c -o main
在生成的对象中找不到任何参数:
strings main | grep -O3
(no output)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)