動的か共有か

開発:そういえば、昔よく使っていた ldd というコマンドを思い出しました。動的ライブラリの依存性を検査するツールです。ldd プログラム名、のように使います。

開発:で vdso って記憶に無いので、なんだろうと思って man vdso すると、「The "vDSO" (virtual dynamic shared object) is a small shared library that the kernel automatically maps into the address space of all user-space applications.」でした。つまり、全てのプログラムはこれを共通のオブジェクトとして含む、というものです。

開発:その利用方法の一例として挙げられてたのが、くしくも gettimeofday(2) でした。gettimeofday() は現在時刻を知るために非常に多用されるため重い、なのでその値をユーザプロセスのメモリ空間上にマップしてしまって、メモリの読み出しで済ませてしまおうという話です。

開発:たとえば AWSのUbuntu 18.04 パッケージではこんなふうになっています。

開発:AzureのUbuntu18.04でも同じような様子。

開発:一方、Amazon Linux では、strip されていてシンボルテーブルを見ることはできません。strip されているということは、動的リンクの対象となるシンボルはそこには無いというように思われますが、バイナリをダンプしてみると __vdso_gettimeofday というのがあります。

開発:なんにしても、これはなにかに使えそうです。

開発:それで、やりたいことは、標準ライブラリの中の gettimeofdaysだけを入れ替えることです。それで、libc.so に自前の gettimeofdaysを追加してやったらどうかなと、思うと、no version information available が出たので… 調べると、昔ながらの nm じゃなく、readelf というコマンドがあることがわかりました。これで、Amazon Linux の vdsoのシンボルテーブルが読めました。

開発:nm は動的リンク用のテーブルを見ないのだろうかとおもったら、-D というオプションがあって、これで見ることができました。