0

我刚刚建立了一个共享库,但是当我使用 nm 命令查看依赖项时,输出如下

$ nm -a libgio-2.0.so.0.2701.0 | grep ZLIB
     U deflateSetHeader@@ZLIB_1.2.2
     U inflateGetHeader@@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

wherelibz.so.1.2.8是我自己从源码构建的,放到 libgio-2.0.so.0.2701.0 的同一个目录下。和系统的libz(/usr/lib/libz.so)不是同一个版本

所以,我的问题是为什么nm输出@@zlibis 1.2.2, not 1.2.8@@ZLIB_1.2.2nm输出的含义是什么?

谢谢

4

1 回答 1

0

nm正在显示版本符号并且版本没有错误。

所以,我的问题是为什么@@zlib 的 nm 输出是 1.2.2,而不是 1.2.8?

因为那是您链接到的库中符号的版本。符号的版本不必与库的版本相同。

@@ZLIB_1.2.2 在 nm 输出中的含义是什么?

这意味着deflateSetHeader符号的当前定义是在 1.2.2 版本中添加的

它在 1.2.8 版本中仍然是相同的,因为这些版本的 zlib 库是兼容的。版本 1.2.8 提供与版本 1.2.2 相同的符号并且它们是兼容的。新库还可能提供一些额外的符号,其版本为 ZLIB_1.2.2,但您的库不使用它们,因此您在nm输出中看不到对它们的任何引用。

基本上一切正常,没有什么可担心的。您的程序需要 1.2.2 版中的符号,并且您拥有的库提供了这些符号。

于 2016-01-26T17:42:55.353 回答