从已编译的可执行文件中获取编译器选项?

2024-10-17 08:47:00
admin
原创
170
摘要:问题描述:有没有办法查看在 *nix 中创建可执行文件时使用了哪些编译器和标志?我编译了一个旧版本的代码,我想看看它是经过优化还是未经优化编译的。谷歌搜索没有太大帮助,但我不确定我使用的关键字是否正确。解决方案 1:gcc 有一个-frecord-gcc-switches选项: -frecord-gcc-...

问题描述:

有没有办法查看在 *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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1124  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   79  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   70  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   82  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   74  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用