C
nm
如何為每種符號類型選擇要列印的字元?
我目前正在做一個
nm
類似的程序,以列印 ELF 文件的符號及其地址和類型。典型的輸出類似於:
$ nm ./my_exec 0000000000003d28 d _DYNAMIC 0000000000003f28 d _GLOBAL_OFFSET_TABLE_ 0000000000002000 R _IO_stdin_used w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable
第一列是符號地址,第二列是符號類型,第三列是符號名稱。
man 表示每個字元的含義,大寫是全域符號,小寫是局部符號等…
但我不明白它如何選擇使用哪個字元。
我正在使用該
Gelf
庫,但沒有看到可以確定角色的欄位。
nm
主要根據符號出現的部分選擇字元。ELF 在System V ABI中指定;第 4-22 頁及以下描述了符號表,其中包括兩個欄位,st_info
和st_shndx
,它們確定由 顯示的字元nm
。符號綁定 (
ELF32_ST_BIND(st_info)
) 確定符號是局部的(小寫的nm
)、全域的(大寫的)還是弱的 (v
,w
)。sh_shndx
指向包含符號的部分,許多nm
’s 字元反映了這一點,或者作為顯式部分(b
,d
…),或者作為具有特殊含義的值(例如u
forSHN_UNDEF
,未定義的符號)。因此,您不會找到與 顯示的字元直接對應的單個值
nm
,但以上內容應為您提供足夠的資訊來解釋 ABI 規範中描述的值。