2023年5月3日 (水曜日)

17:44:29 # Life glibc の共有ライブラリローダーとhwcap。ld.so はELFバイナリをロードするときに共有ライブラリを複数の場所から検索する。 CPUの提供する機能によって特定の共有ライブラリに切り替える機能というのがあって、より特異なすべての機能を組み合わせた共有ライブラリがおいてあるディレクトリから先に検索して一般的な共有ライブラリを使うという段階でいく。 getauxvalでAT_HWCAPをみるとどういうパラメーターで確認しているのかわかる。 x86_64はどうもいまのところ2つのhwcapを見ていて、x86_64というのとavx512というのをみているっぽい。 あとTLS使っているか違うのかというのもみるらしく、/usr/lib/,/usr/lib/x86_64-linux-gnu, /lib/それぞれに対して以下のような組み合わせを試す。

柔軟なのはよいとしても欠点としては組み合わせ爆発が起きていてすくなくとも16のパスを検索する羽目になっているのと、TLSじゃないってどういうことよ、というのとx86_64なのにx86_64じゃないってなんじゃそりゃ、というのと x86_64/x86_64ってなに?と意味不明な点がいくつかある。 これを力技で解決する仕組みが/etc/ld.so.cacheで通常は事前にldconfigが作成したキャッシュを見てそれで解決しているようだ。 ただしChrome Remote DesktopなどをつかっているとLD_LIBRARY_PATHが設定されていて、その影響でld.so.cacheが使えず全部のパスを検索しているっぽい。 という残念なことを発見したのが今日。

18:30:57 # Life C++20のsplit_view. 歴史改変されているらしく、C++20発表当時のsplit_viewは現在はlazy_split_viewになっている。 しかし、困ったことにDebian bookwormに入ったg++ / clang++はlazy_split_view相当のものが入っている模様。 文字列のSplitが便利になった気がしたのに便利なのが使えないという。

Junichi Uekawa