2017-02-20 14 views
0

同じ静的オブジェクトファイルに重複シンボルがあるのはなぜですか?実際にはどういう意味ですか?1つの静的オブジェクトライブラリに複数の重複シンボルがある

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

「重複」の一部は定義(通常は1つだけ)であり、もう1つはその単一の定義への参照である可能性があります。 'nm'出力からその情報を切り捨てるので、あなたはそれを知りません。 –

+0

特に、外部参照( 'U')と週オブジェクト(' w'、 'W'、' v'、 'V')のすべての出現をフィルタリングするのを忘れました。それらは相互参照であり、重複ではありません。 – dhke

+0

あなたが見ているシンボルは '静的な'グローバルシンボルですか?したがって、重複があっても、単一の翻訳単位にローカルなので、衝突しません。これらの変数の* storage *は、通常はグローバルデータセグメントまたはbssセグメントのどこかに置く必要があります。 –

答えて

0

同じ静的オブジェクトファイル内のシンボルが重複しているのはなぜ?あなたは他の人が、動的共有オブジェクト、または略して共有ライブラリを呼び出す、「静的オブジェクトファイル」と呼んで何

  1. ほとんどの共有ライブラリは、複数の再配置可能オブジェクトファイルからリンクされています。
  2. そのようなオブジェクトファイルで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; } 

あなたは上記の2つのファイルをリンクすると、次の2つの完全に独立しbuffer変数があるでしょうし、プログラムの戻りコードは0x61(のためにASCIIになります「」 )、およびfooにもかかわらず0x62ではありません。0x62からbuffer[0]に割り当てられています。

関連する問題