2010-02-24 56 views
3

結合工作共享庫編譯時使用g ++一段cpp的程序-O0我發現我的二進制文件不包含空字符串符號(basic_string的): _S_empty_rep_storage 當我做編譯相同的程序與-O2我注意到,上述符號二進制內確實包含如下(在倉使用納米):如何符號在Linux

00000000006029a0 V _ZNSs4_Rep20_S_empty_rep_storageE @@ GLIBCXX_3.4

我的應用程序使用幾個。所以(動態庫),當我的應用程序加載時,我注意到幾個這些.so文件綁定如下(我設置LD_DEBUG =所有跑我的程序):

28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4] 
28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /home/bbazso/workspace/mytestapplication [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4] 
28596: binding file /home/bbazso/workspace/mytestapplication [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]** 

但我也注意到我的。所以一個唯一的結合如下:

28087: binding file /home/bbazso/usr/local/lib/anotherdynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4] 

,但從來沒有如上所示爲mydynamiclib.so綁定二進制文件(mytestapplication)。

所以我想知道這實際上是什麼意思?這是否意味着anotherdynamiclib.so將對應用程序的其餘部分使用不同的符號作爲空字符串?我想我真正要問的是在上面的例子中,符號綁定是如何工作的?

謝謝!

回答

1

恐怕我不完全理解你的問題,但你可能會在Ulrich Drepper的論文How to write shared libraries中找到答案。這是我知道的關於在Linux中如何使用elf可執行文件的最好方法。

0

我很難解析你的問題。如果您包含一小段代碼,那麼您正在編譯它可能會有所幫助。

我注意到,上述符號二進制中確實包含如下 這取決於你的意思「載」。符號表中有該符號的條目,但是它是外部符號,而不是應用程序「導出」的符號。請注意名稱中的@@ GLIBCXX_3.4。符號的實際位置在GLIBCXX中(看起來它實際上解析爲libstdC++)。

從你的輸出,納米不會出現實際顯示ST_BIND信息(在El32_Sym/Elf64_Sym結構st_info字段的一部分)。這是確定鏈接器如何處理符號綁定的信息。你可以運行 readelf -s YOURBINNAME 它會顯示綁定。