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