为什么同一个静态目标文件中存在重复的符号?这在实践中意味着什么?
运行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
...
答案 0 :(得分:0)
为什么同一个静态目标文件中存在重复的符号?
static
数据的情况并不少见(此类数据具有内部链接,即只能从给定目标文件中 ) 。将多个此类文件一起链接到共享库时,最终会生成此类数据的多个实例。这些数据项的名称并不重要 - 它们不会因内部链接而相互冲突,并且在不同的源文件中名称相同并不罕见。示例:
// main.c
extern int foo();
static buffer[10];
int main()
{
buffer[0] = 'a';
foo();
return buffer[0];
}
// foo.c
static buffer[5];
int foo() { buffer[0] = 'b'; return 0; }
当您将上述两个文件链接在一起时,您将拥有两个完全独立的buffer
变量,并且该程序的返回代码将为0x61
(ASCII为' a& #39;)和不 0x62
,尽管foo
将0x62
分配给buffer[0]
。