如何从编译出来的可执行文件获取编译选项
方法
readelf
命令
readelf --debug-dump=info /path/to/executable grep "DW_AT_producer"
strings
命令
strings /path/to/executable | grep march
- 其实可能还有很多方法...
关于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就对应这个filenameDW_AT_comp_dir
编译时的工作路径,在目录结构复杂的项目中,最终生成的可执行文件的这个值很可能不一样.
源动力
其实,掌握一个领域的技能的学习方法是有好坏之分的,学习方法不得当,终生入不了高手之行列。
程序员怎么去学习未知的技能呢?
-
入门阶段
快速过一遍入门书,然后跟着学习网站/视频教程课实践一遍 -
进阶阶段
读经典好书,打好基础。另外要注意,当今还是有一些教程网站的内容既有深度又有战略性概览。 -
高手阶段
这阶段不需要别人的方法 -
方法论
作为一个程序员,英语非常重要,中文搜索出来的结果很浪费时间去分辨,往往已经有了千篇一律,似是而非的定局,这时候英文搜索就优势明显。
比如还是本文的问题,如果你用下面的英文进行搜索是否得到答案的效率更高呢?
- find out compilation flag from executable
- get the compiler options from a executable
再者,程序员搜索问题当然应该去StackOverflow