检测 ELF 二进制文件是否是使用 gprof 工具构建的?

检测 ELF 二进制文件是否是使用 gprof 工具构建的?

是否可以检查给定程序是否使用 GNU gprof 工具编译,即“-pg”标志传递给编译器和链接器,没有运行它来检查它是否会生成gmon.out文件?

答案1

您可以检查对函数的引用mcount(或者可能_mcount__mcount根据分析的实施)。此函数对于分析工作是必需的,对于未分析的二进制文件应该不存在。

就像是:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

以上内容适用于此处的快速测试。

答案2

上面答案中的正则表达式并不总是有效...但是我认为在“readelf -s [binary]”的输出中 grep 查找“mcount”的一般思想是正确的

答案3

在答案中添加更多内容:

  1. 要检查仪器,请 grep for mcount/gmon:

    $  readelf -s <binary> | egrep "gmon|mcount"    
    20: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    28: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@GLIBC_2.2.5 (2)    
    36: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS gmon-start.c    
    39: 00000000004011a0     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start    
    100: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    114: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@@GLIBC_2.2.5    
    
  2. 需要编译并带有-pg标志链接,否则gmon.out不会生成。堆栈溢出链接。

  3. 我发现运行 gprof 的二进制文件没有生成任何 gmon.out文件,尽管使用标志进行编译/链接-pg。原因是 - 我正在终止我的应用程序,这不是一个干净的退出。gprof仅当程序正常退出时才产生输出。堆栈溢出链接

相关内容