1

次の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

soname ではなく、libz の実際のバージョンを指しています。

次のコマンドでコンパイルし、依存関係を確認します。

$ 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.2.11 (実名) の代わりに libz.so.1 をどのように指しているのですか? リンカーがシンボリックリンクを使用していると想定していますが、そうではありません。

これに加えて、次のコマンドを実行すると:

$ objdump -p libz.so.1.2.11 | grep SONAME
SONAME               libz.so.1 

私の質問は、シンボリックリンクが提供するファイルのシンボリックリンク名または SONAME を使用していますか?

4

2 に答える 2