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段中。 –