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が呼ばれてます。
なんかうまく動かない共有ライブラリとかあるときに、とりあえずスタブに置き換えちゃったりとかするのに使えるテクニックかも。