单个静态对象库中的多个重复符号

时间:2017-02-20 06:59:33

标签: c gdb static-libraries nm

为什么同一个静态目标文件中存在重复的符号?这在实践中意味着什么?

运行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 个答案:

答案 0 :(得分:0)

  

为什么同一个静态目标文件中存在重复的符号?

  1. 您所谓的"静态目标文件",其他人称为动态共享对象,或简称共享库。
  2. 大多数共享库都是从多个可重定位目标文件链接的。
  3. 在此类目标文件中包含static数据的情况并不少见(此类数据具有内部链接,即只能从给定目标文件中 ) 。将多个此类文件一起链接到共享库时,最终会生成此类数据的多个实例。这些数据项的名称并不重要 - 它们不会因内部链接而相互冲突,并且在不同的源文件中名称相同并不罕见。
  4. 示例:

    // 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,尽管foo0x62分配给buffer[0]