dlsymをLD_PRELOADでフック

LD_PRELOADで関数をフックしたい場合の常套手段は以下のような感じだが
ここで使用するdlsym自体をフックする必要があったのでどうすればいいのか考えてみた。

void (*target_func)(void *p);
void libinit() __attribute__((constructor));
void libinit(){
    orig_func = dlsym(RTLD_NEXT, "target_func");
}
void target_func(void *p){
	...
	orig_func(p);
}

そのままtarget_func=>dlsymにして呼ぶと、ローカルのdlsymが呼ばれてしまうのでNG。
困ったときのlibc頼みでnmしながら眺めていたら__libc_dlsymという物があった。
試してみたところdlsymと同じような動きをしてくれる模様。
unwindといい本当に色々入ってるなlibc。


よってこんな感じのコードに。

static void* (*orig_dlsym)(void * handle, const char * name);
extern void* __libc_dlsym(void * handle, const char * name);
void libinit() __attribute__((constructor));
void libinit(){
    void * haldle = dlopen("libdl.so.2",RTLD_NOW);
    orig_dlsym = __libc_dlsym(haldle, "dlsym");
}
void* dlsym(void * handle, const char * name){
	...
	return orig_dlsym(handle,name);
}

行儀はよろしくないがとりあえず動く模様。