衝撃のわからなさ

わかってません

2024/01/16日報

ライブラリの探索パスを知る方法

昨日の結論に基づいて、 実行コマンドかライブラリかの自動判定はパスの情報を使うことにした。
そのため共有ライブラリの解決に使われるパスを取得する必要がでた。

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つになっていると認識。