ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

LD_PRELOADで共有ライブラリを差し換える

BINARY HACKS p225

やっぱり写経。

taka@ubuntu:~$ more gethostname.c
#include 
#include 

int gethostname(char *name, size_t len)
{
        char *p = getenv("FAKE_HOSTNAME");
        if(p == NULL) {
                p = "localhost";
        }
        strncpy(name, p, len - 1);
        name[len - 1] = '\0';
        return 0;
}
taka@ubuntu:~$ cc -shared -fPIC -o gethostname.so gethostname.c
taka@ubuntu:~$ LD_PRELOAD=./gethostname.so hostname
localhost
taka@ubuntu:~$ FAKE_HOSTNAME=sai.fsij.org LD_PRELOAD=./gethostname.so hostname
sai.fsij.org
taka@ubuntu:~$

libcに含まれるgethostnameではなく、gethostname.soに作ったgethostnameが呼ばれてます。
なんかうまく動かない共有ライブラリとかあるときに、とりあえずスタブに置き換えちゃったりとかするのに使えるテクニックかも。