编译共享对象时包括版本号

时间:2013-07-27 02:23:39

标签: c linux gcc

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

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

因此,这让我想知道如何在二进制文件中实际包含版本信息,而不仅仅是文件名。如果有像

这样的解决方案,那将是理想的选择
./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)

1 个答案:

答案 0 :(得分:0)

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