我有以下C程序:
#include <stdio.h>
#include <zlib.h>
int main()
{
z_stream strm;
int integer = 0;
scanf("heloworld %d", &integer);
printf("ok\n");
if (integer == 10)
{
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
deflateInit(&strm, 0);
}
return 0;
}
这是使用zlib的基本helloworld程序。
如果搜索libz库,则可以在/usr/lib/x86_64-linux-gnu/libz.so下找到它:
$ ls -lah libz.so
lrwxrwxrwx 1 root root 40 May 20 14:55 libz.so -> /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
并且它指向的是libz的真实版本,而不是soname。
我用以下命令编译它并检查依赖项:
$ gcc a.c -lz
$ ldd a.out
linux-vdso.so.1 (0x00007ffec44b6000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6674055000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6673e63000)
/lib64/ld-linux-x86-64.so.2 (0x00007f667408c000)
由于libz.so.1的符号链接指向那里,所以它如何指向libz.so.1而不是libz.so.1.2.11(真实名称)?我假设链接器正在使用符号链接,但事实并非如此。
此外,如果我执行以下命令:
$ objdump -p libz.so.1.2.11 | grep SONAME
SONAME libz.so.1
我的问题是,它是使用符号链接名称还是符号链接提供的文件中的SONAME?
如果链接器将libz.so.1.2.11放入可执行文件中,则在更新库时它将中断。而是将ldconfig已知的主要版本放入可执行文件中,而该主要版本又是指向当前已安装版本的链接。
我发现在/ lib / x86_64-linux-gnu下有两个libz.so的符号链接,它们是: