1

这是一个更普遍的问题。我知道 Windows DLL 可以使用 dll 版本信息设置资源文件,但我想知道如何为 linux 共享对象做同样的事情。

我遇到的问题实际上是在终端上运行几乎任何东西时,我收到一条关于 libz.so.1 版本信息不可用的消息。这是由于我编译的应用程序具有自己的 libz 版本。该库实际上是 libz.so.1.2.3,并且 /lib 中存在相同的版本。这些文件实际上是库的相同版本,但其中一个(我编译的)说它缺少版本信息。

所以,这让我想知道如何在二进制文件中实际包含版本信息,而不仅仅是在文件名中。如果有像这样的解决方案,那将是理想的

./configure .... some_version_option=1.2.3

如果我使用库的工作版本:

ldd /usr/bin/git
linux-vdso.so.1 =>  (0x00007fffdfbff000)
libz.so.1 => /lib64/libz.so.1 (0x00007f3797fa7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c56000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003c55c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c55400000)

如果我使用我编译的版本:

ldd /usr/bin/git
/usr/bin/git: libz.so.1: no version information available (required by /usr/bin/git)
linux-vdso.so.1 =>  (0x00007fff872b1000)
libz.so.1 (0x00007f83c9270000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c56000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003c55c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c55400000)
4

1 回答 1

0

您需要将库的符号版本映射文件与-Wl,--version-script <file.map>. 地图文件应包含在库源中。

于 2013-07-27T02:53:40.933 回答