私はdlopen
とdlsym
を呼び出すプログラムの動作を調べようとしています。最後の目標は、dlsym
で取得した関数に呼び出しを記録する小さな関数を挿入することです。macOSでは、どのようにしてdlsymへの呼び出しを傍受できますか?
通常は、あなたがDYLD_INSERT_LIBRARIES
でラップしたいいくつかの機能foo
のために、あなたはこのような何か書く:
void (*real_foo)(void);
void init() __attribute__((constructor)) {
real_foo = dlsym(RTLD_NEXT, "foo");
}
void foo(void) {
puts("foo was called");
real_foo();
}
を問題は、あなたがdlsym
をラップしようとしているとき、あなたはこれで終わるということです。
void* (*real_dlsym)(void* handle, const char* symbol);
void init() __attribute__((constructor)) {
real_dlsym = dlsym(RTLD_NEXT, "dlsym");
}
void* dlsym(void* handle, const char* symbol) {
return real_dlsym(handle, symbol);
}
init
は役に立たないdlsym
の独自の実装を呼び出してしまいます。
別のものをエクスポートしているときに「本当の」dlsymを取得するにはどうすればよいですか?あるいは、dlsymへの呼び出しを傍受する良い方法がありますか?
dlsymは自分の「実装」と呼ばれるため使用できません。私はそれを他のものと呼ぶことはできません。そうでなければ、本当のdlsymを置き換えることはできません。 – zneak