nm命令的输出中'@@'符号的含义是什么?

问题描述:

我正在查看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。我将通读论文。 –

@允许指定符号的版本。当存在符号的多个定义时,它们会有不同的版本。要指示默认版本,请使用@@。如果未指定明确的版本,则选择默认版本。

更多细节可在binutils VERSION documentation(搜索“@@”)中找到。