ライブラリの探索パスを知る方法
昨日の結論に基づいて、
実行コマンドかライブラリかの自動判定はパスの情報を使うことにした。
そのため共有ライブラリの解決に使われるパスを取得する必要がでた。
ld.conf.soのparseを書く…
ldconfigにdirectory一覧を取得するオプションとかあるかと思ったがなんかなさそう?
仕方なく書いているけれどld.conf.soのmanもないし仕様はどこかにあるのだろうか(わかってない)
qemu-user-staticを実行するときのld.confまわりの挙動
そのままシステムパスのものが仕様される
つまりchrootなどをせずに使う場合は殆ど実は機能していない。
挙動確認してみる
#include <iostream> int main() { std::cout << "hello" << std::endl; }
$ ldconfig -p | grep libstdc++ libstdc++.so.6 (libc6,x32) => /libx32/libstdc++.so.6 libstdc++.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6 (libc6) => /lib/i386-linux-gnu/libstdc++.so.6 libstdc++.so.6 (libc6) => /lib32/libstdc++.so.6
nativeの場合、ls.so.cacheにヒットしている様子が見て取れる。
$ g++ -o main ./main.cpp $ strace ./main |& grep -e libstdc++ -e ld.so access("/etc/ld.so.preload", R_OK) = -1 ENOENT (そのようなファイルやディレクトリはありません) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
クロスコンパイルの場合もhostの/etc/ld.so.cacheを見に行っている。
ldconfigは実質機能していないような状態。
faccessat(AT_FDCWD, "/etc/ld.so.preload", R_OK) = -1 ENOENT (そのようなファイルやディレクトリはありません) access("/usr/aarch64-linux-gnu/etc/ld.so.cache", F_OK) = -1 ENOENT (そのようなファイルやディレクトリはありません) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 access("/usr/aarch64-linux-gnu/lib/aarch64-linux-gnu/tls/aarch64/atomics/libstdc++.so.6", F_OK) = -1 ENOENT (そのようなファイルやデ ィレクトリはありません) <省略 40行> openat(AT_FDCWD, "/lib/aarch64/atomics/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルやディレクトリはありませ ん) access("/usr/aarch64-linux-gnu/lib/aarch64/libstdc++.so.6", F_OK) = -1 ENOENT (そのようなファイルやディレクトリはありません) openat(AT_FDCWD, "/lib/aarch64/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルやディレクトリはありません) access("/usr/aarch64-linux-gnu/lib/atomics/libstdc++.so.6", F_OK) = -1 ENOENT (そのようなファイルやディレクトリはありません) openat(AT_FDCWD, "/lib/atomics/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルやディレクトリはありません) access("/usr/aarch64-linux-gnu/lib/libstdc++.so.6", F_OK) = 0 openat(AT_FDCWD, "/usr/aarch64-linux-gnu/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
ここらへん各architectureごとにrootを持ったほうがいい理由の1つになっていると認識。