開発:で 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.」でした。つまり、全てのプログラムはこれを共通のオブジェクトとして含む、というものです。
開発:一方、Amazon Linux では、strip されていてシンボルテーブルを見ることはできません。strip されているということは、動的リンクの対象となるシンボルはそこには無いというように思われますが、バイナリをダンプしてみると __vdso_gettimeofday というのがあります。
開発:なんにしても、これはなにかに使えそうです。
開発:それで、やりたいことは、標準ライブラリの中の gettimeofdaysだけを入れ替えることです。それで、libc.so に自前の gettimeofdaysを追加してやったらどうかなと、思うと、no version information available が出たので… 調べると、昔ながらの nm じゃなく、readelf というコマンドがあることがわかりました。これで、Amazon Linux の vdsoのシンボルテーブルが読めました。
開発:それで、一昨日ロボット追跡をやった時に、10進整数表記の時刻を date +format コマンド的にやりたいと思ったんですが、やり方がわからなかったので単に strftime() を呼ぶプログラムを作りました。こういうのは、自分で作れば数分なのに、探すと数十分かかった上に、無かった。という話になる。どこでも同じようにやりたいことを、郷に従うと良くないという話です。
開発:で、もし date コマンドをそのまま使って、time() とか gettimeofday() を差し替えればよいのではないかと思ったわけです。例えば定数値を返すgettimeofday()を定義して date コマンドに食わせる。現時刻以外のフォーマット出力ができる。その手を使って、システムの実際の時間とは違う時間でアプリを動かしたら面白いとか、けっこう用途が広いかもしれないと。
linux% file libgasket.so libgasket.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f9e2d127a6bdaf34193c0d313673785694aac575, not stripped
基盤:shared library ができましたね。
開発:でこれをリンクして実行してみる。
linux% cc main.c libgasket.so linux% a.out a.out: error while loading shared libraries: libgasket.so: cannot open shared object file: No such file or directory
o Using the environment variable LD_LIBRARY_PATH, unless the executable is being run in secure-execution mode (see below), in which case this variable is ignored.
社長:まあでも、原理的にはこれで良いでしょう。
基盤:date コマンドにこれを食わせられないですかね。
開発:strace date ... まあ libc.so しか使ってないですね。cp -p libgasket.so libc.so.6。strace date ...