2017-02-20 92 views
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 
... 
+1

某些“重复”可能是一个定义(通常只有一个),另一个可能是对该单一定义的引用。你不知道,因为你从'nm'输出中删除了这些信息。 –

+0

尤其忘记过滤所有的外部引用('U')和周对象('w','W','v','V')。这些是交叉引用而不是重复的。 – dhke

+0

或者你正在玩的符号是'static'全局符号?所以即使有重复,他们也不会发生冲突,因为它们在一个翻译单元中是本地的。这些变量的*存储*必须放在某处,通常放在全局数据或bss段中。 –

回答

0

为什么有相同的静态目标文件中复制的符号?

  1. 你叫什么?“静态对象文件”,别人叫动态共享对象,或短的共享库。
  2. 大多数共享库都是从多个可重定位目标文件链接而来的。
  3. 这并非罕见有在这样的对象文件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” )和0x62,尽管foo0x62指定为buffer[0]