LD_PRELOAD

MovableTypeのデータベースをBerkeley DBからSQLiteに変更しようとして、変換スクリプトを実行すると、 ELFのローダが、 /libexec/ld-elf.so.1: /usr/local/lib/libsqlite3.so.8: Undefined symbol “pthread_create” というエラーを吐いて先に進めない。 実行プログラムの形式にELFを採用しているOSではLD_PRELOADという環境変数を設定しておくと、 指定したライブラリを他のライブラリより先にロードしておくことができるらしい。 これを使って任意の関数を上書きしたりできるそう。 >setenv LD_PRELOAD /usr/lib/libpthread.so.2 >./mt-db2sql.cgi とすると問題なく実行できた。 MovableTypeで使うデータベースをSQLiteに設定してブラウザからアクセスしてみると、 Internal Server Errorが。 エラーログをみると例のエラー、当然か。 CGI実行時にApacheから環境変数を設定できればいいんだろうなと思って調べてみると、 mod_envというのがあるらしい。Apacheを入れたときにデフォルトでロードするようになっていた。 httpd.confに SetEnv LD_PRELOAD /usr/lib/libpthread.so.2 のようにSetEnvディレクトリを書く。 ブラウザからアクセスすると問題なく動いた。 ■LD_PRELOADを使って任意の関数呼び出しにフックしてみる ■CGIの裏側見せます