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の裏側見せます

Leave a Reply

Your email address will not be published. Required fields are marked *

*