0

Unix/Linux ベースのシステムで動的にリンクしている場合、プログラムを実行するとどこでライブラリ ファイルを見つけようとしますか? また、これを変更するにはどうすればよいですか? GNU/G++ コンパイラを使用しています。

4

1 に答える 1

2

プログラムが実行されるシステムは、動的ライブラリを検索する場所を定義します。プログラム自体は、ライブラリに名前を付けるだけです (パスなし)。

Linux システムでは、検索するシステム全体のデフォルトがあり、環境変数LD_LIBRARY_PATHをコロンで区切られたライブラリへのパスのリストに設定することで、これをオーバーライドできます。

$ LD_LIBRARY_PATH=/path/to/my/libs/:/another/path/to/libs/of/mine/
$ export LD_LIBRARY_PATH
$ ./path/to/my/executable

またはそれより短い:

$ LD_LIBRARY_PATH=/path/to/my/libs/:/another/path/to/libs/of/mine/ ./path/to/my/executable

システムのデフォルトは、通常は(を指す) およびldconfigにあるファイルに基づいて構成されます。/etc/ld.so.conf/etc/ld.so.conf.d/etc/ld.so.cache

特定の実行可能ファイルが必要とする動的ライブラリは、次を使用して調べることができますldd

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fffc83ff000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fbe1306b000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbe12e63000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007fbe12c5a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe1289b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbe12697000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbe132ae000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbe12479000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007fbe12274000)

実行可能ファイルを開始するときの出力を使用してstrace、システムがライブラリを探す場所を確認することもできます。

$ strace ls 2>&1 | grep '^open.*\.so'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
于 2013-10-21T12:38:07.170 に答える