0
爲什麼在同一個靜態對象文件中存在重複的符號?這在實踐中意味着什麼?單個靜態對象庫中的多個重複符號
運行後nm /lib64/libc.so.6 | cut -d' ' -f 3 | uniq -c | sort -rn
,它查看文件中的符號並打印符號出現的次數。我得到以下輸出。
59 lock
38 buffer
15 free_mem
15 __elf_set___libc_subfreeres_element_free_mem__
2 __strftime_internal
2 startp_initialized.9864
2 startp_initialized.11643
2 null
2 nbits.11331
更新
00000000003c1b98 b lock
00000000003c1bb0 b lock
...
00000000003c2690 b lock
00000000003c1710 b buffer
00000000003c1718 b buffer
...
00000000003c1720 b buffer
00000000003bc768 d __elf_set___libc_subfreeres_element_free_mem__
...
00000000003bc770 d __elf_set___libc_subfreeres_element_free_mem__
00000000003bc778 d __elf_set___libc_subfreeres_element_free_mem__
...
00000000001899de r null
0000000000191e70 r null
更新2(可能有用):
readelf -Ws /lib64/libc.so.6 | grep .*\ buffer$
Num: Value Size Type Bind Vis Ndx Name
1277: 00000000003c1710 8 OBJECT LOCAL DEFAULT 35 buffer
1289: 00000000003c1718 8 OBJECT LOCAL DEFAULT 35 buffer
1293: 00000000003c1720 8 OBJECT LOCAL DEFAULT 35 buffer
1298: 00000000003c1728 8 OBJECT LOCAL DEFAULT 35 buffer
1319: 00000000003c1730 8 OBJECT LOCAL DEFAULT 35 buffer
...
某些「重複」可能是一個定義(通常只有一個),另一個可能是對該單一定義的引用。你不知道,因爲你從'nm'輸出中刪除了這些信息。 –
尤其忘記過濾所有的外部引用('U')和周對象('w','W','v','V')。這些是交叉引用而不是重複的。 – dhke
或者你正在玩的符號是'static'全局符號?所以即使有重複,他們也不會發生衝突,因爲它們在一個翻譯單元中是本地的。這些變量的*存儲*必須放在某處,通常放在全局數據或bss段中。 –