私は現在、nm
住所と種類のELFファイルのシンボルを印刷する同様のプログラムを作業しています。
一般的な出力は次のとおりです。
$ nm ./my_exec
0000000000003d28 d _DYNAMIC
0000000000003f28 d _GLOBAL_OFFSET_TABLE_
0000000000002000 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
最初の列は記号アドレス、2 番目の列は記号の種類、3 番目の列は記号名です。
man は各文字の意味を表し、大文字はグローバル記号、小文字は地域記号などです。
しかし、私は理解できません。どのように使用する文字を選択します。
ライブラリを使用していますGelf
が、文字を確認できるフィールドは表示されません。
答え1
nm
文字は主に記号が現れる部分に基づいて選択される。 ELFは次に指定されます。システムV ABI;記号テーブルは4-22ページで説明されており、2つのフィールドで構成されていますst_info
。st_shndx
表示文字nm
。
シンボルバインディング(ELF32_ST_BIND(st_info)
)は、そのシンボルがローカルシンボル(の小文字)であるかnm
、グローバルシンボル(大文字)であるか、弱いシンボル(v
、、w
)であるかを決定します。sh_shndx
記号を含む部分を指し、多くのnm
s文字はそれを明示的な部分(b
、d
...)または特別な意味のある値()として反映します。例えば u
、未定義記号の場合SHN_UNDEF
)。
したがって、表示された文字に直接対応する単一の値を見つけることはできませんが、上記nm
はABI仕様で説明されているように値を解釈するのに十分な情報を提供する必要があります。