2016-01-26 254 views
0

我剛剛建立了一個共享庫,但是當我使用納米命令查找依賴輸出如下納米輸出不正確

$ nm -a libgio-2.0.so.0.2701.0 | grep ZLIB 
    U [email protected]@ZLIB_1.2.2 
    U [email protected]@ZLIB_1.2.2 

我不知道均值的@@ZLIB_1.2.2,實際上建築libgio的命令是

gcc -o libgio-2.0.so.0.2701.0 libfoo.so libbar.so libz.so.1.2.8 

其中libz.so.1.2.8從我自己的源建成並投入libgio-2.0.so.0.2701.0的同一目錄下。這不是同一版本系統的libz進行(/usr/lib/libz.so)

所以,我的問題是,爲什麼@@zlibnm輸出1.2.2,不1.2.8? nm輸出的@@ZLIB_1.2.2的平均值是多少?

感謝

回答

0

nm是顯示版本的符號和版本是沒有錯的。

所以,我的問題是爲什麼@@ zlib的nm輸出是1.2.2,而不是1.2.8?

因爲這是您鏈接到的庫中符號的版本。符號的版本不必與庫的版本相同。

以及在nm輸出中@@ ZLIB_1.2.2的含義是什麼?

這意味着deflateSetHeader符號當前定義版本1.2.2

它仍然是1.2.8版本相同,因爲zlib庫的那些版本相互兼容加入。版本1.2.8提供了與版本1.2.2相同的符號,並且它們是兼容的。新庫也可能會提供一些額外的符號,它們的版本號爲ZLIB_1.2.2,但是您的庫不使用它們,因此您在nm輸出中看不到任何對它們的引用。

基本上一切正常,沒有什麼可擔心的。您的程序需要版本1.2.2中的符號以及您提供這些符號的庫。

+1

您可能會澄清,開發人員在構建庫時選擇'ZLIB',並且它不一定是庫的*名稱*。 –

+0

感謝喬納森和托馬斯的詳細評論。所以@@版本不是實際的鏈接庫的版本,而是符號的版本。在我的情況下,該程序仍然鏈接zib 1.2.8,而不是1.2.2,這是正確的嗎? –

+0

該程序將鏈接到任何鏈接它(以及運行時加載程序在運行時發現的內容)。使用'nm'不能告訴你程序鏈接到哪個庫,它只能顯示你缺少的符號。 'deflateSetHeader @@ ZLIB_1.2.2'只是一個符號的名字(裝飾着一些額外的信息,使它不同於'deflateSetHeader @@ ZLIB_0.1.1')。要查看程序鏈接的庫,請使用'ldd'而不是'nm'。 –