2017-02-20 90 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]