gprofツールを使用してELFバイナリが構築されたかどうかを検出しますか?

gprofツールを使用してELFバイナリが構築されたかどうかを検出しますか?

与えられたプログラムが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]"出力から "mcount"をgrepingする一般的なアイデアは正しいと思います。

答え3

答えにさらにコンテンツを追加する:

  1. 機器を確認するには、mcount / gmonに対してgrepを実行してください。

    $  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. gmon.outフラグを使用してコンパイル/リンクしても、バイナリでgprofを実行するとファイルが生成されないことがわかりました -pg。その理由は - 申請書を終了しようとしても完全に終了しないからです。gprofプログラムが正常に終了した場合にのみ出力が生成されます。スタックオーバーフローリンク

関連情報