如何从编译出来的可执行文件获取编译选项

方法

  1. readelf命令
readelf --debug-dump=info /path/to/executable grep "DW_AT_producer"

  1. strings命令
strings /path/to/executable  | grep march

  1. 其实可能还有很多方法...

关于readelf命令的一点补充

readelf命令刚刚用到的参数

-w[liaprmfFsoR] or 
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。 

ELF文件一般由多个节(section)组成,其中调试信息被包含在某几个节中,这些节的名字一般是以.debug开头,如.debug_info.debug_line.debug_frame等。
readelf -S /path/to/elf_file 命令可以显示节头信息(如果有的话)

上述图中一共包含了17个节,其中7个是调试信息的节。

那么,如何查看各个调试信息节包含的内容呢? 答案是使用readelf -w* /path/to/elf_file命令, *是调试节名的第一个字母,如-wi就是查看.debug_info节的内容,-wl就是查看.debug_line节的内容。对于一个调试文件,.debug_info.debug_line节是必须有的,其他的不一定。
.debug_info基本包含了一个源文件内部的大部分信息,如函数、参数、变量、类型等等,.debug_line包含了所有地址和源文件行的对应信息。其中,.debug_info节中有以下几个字段内容包含了基本的调试信息。

  • DW_AT_producer编译信息,记录了编译器版本,处理器流水线类型,以及架构.
  • DW_AT_language则记录了编译时的文本对应语言.
  • DW_AT_name则记录了编译时的文件名.gcc filename -o a.out,name就对应这个filename
  • DW_AT_comp_dir编译时的工作路径,在目录结构复杂的项目中,最终生成的可执行文件的这个值很可能不一样.

源动力

其实,掌握一个领域的技能的学习方法是有好坏之分的,学习方法不得当,终生入不了高手之行列。

程序员怎么去学习未知的技能呢?

  1. 入门阶段
    快速过一遍入门书,然后跟着学习网站/视频教程课实践一遍

  2. 进阶阶段
    读经典好书,打好基础。另外要注意,当今还是有一些教程网站的内容既有深度又有战略性概览。

  3. 高手阶段
    这阶段不需要别人的方法

  4. 方法论
    作为一个程序员,英语非常重要,中文搜索出来的结果很浪费时间去分辨,往往已经有了千篇一律,似是而非的定局,这时候英文搜索就优势明显。
    比如还是本文的问题,如果你用下面的英文进行搜索是否得到答案的效率更高呢?

  • find out compilation flag from executable
  • get the compiler options from a executable

再者,程序员搜索问题当然应该去StackOverflow

posted @ 2022-05-30 11:35  时间的风景  阅读(871)  评论(0编辑  收藏  举报