2016-09-15 201 views
2

我正在查看Linux中共享庫的'nm'命令的輸出。我看到這nm命令的輸出中'@@'符號的含義是什麼?

U [email protected]@GLIBC_2.0 

這是否意味着stderr是硬鏈接glibc2.0?我問這個問題的原因是,我們有一組庫(比如a1.so,a2.so,...),這些庫是針對我們導出的庫的不同版本之一構建的(比如說ex.so.1, ex.so.2)。導出的庫都會導出一個函數,比如foo。當加載a * .so庫時,它們以某種方式神奇地將相應的函數修補到它們所針對的庫中。我看到下面的不同庫的nm輸出。

nm a1.so | grep foo 
U [email protected]@ex.1 

nm a2.so | grep foo 
U [email protected]@ex.2 

'@@'在這裏扮演什麼角色?我找不到有關'@@'的任何文檔。任何參考將有所幫助。

+0

這是符號版本。像glibc這樣的庫可能包含同一個符號的多個版本。 –

+0

Ulrich Drepper撰寫的[this]第3部分(https://www.akkadia.org/drepper/dsohowto.pdf)論文更詳細地介紹。 –

+0

謝謝@n.m。和Brett Hale。我將通讀論文。 –

回答

2

@允許指定符號的版本。當存在符號的多個定義時,它們會有不同的版本。要指示默認版本,請使用@@。如果未指定明確的版本,則選擇默認版本。

更多細節可在binutils VERSION documentation(搜索「@@」)中找到。

相關問題