C

nm 如何為每種符號類型選擇要列印的字元?

  • March 10, 2022

我目前正在做一個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_infost_shndx,它們確定由 顯示的字元nm

符號綁定 ( ELF32_ST_BIND(st_info)) 確定符號是局部的(小寫的nm)、全域的(大寫的)還是弱的 ( v, w)。sh_shndx指向包含符號的部分,許多nm’s 字元反映了這一點,或者作為顯式部分(bd…),或者作為具有特殊含義的值(例如 ufor SHN_UNDEF,未定義的符號)。

因此,您不會找到與 顯示的字元直接對應的單個值nm,但以上內容應為您提供足夠的資訊來解釋 ABI 規範中描述的值。

引用自:https://unix.stackexchange.com/questions/693926