でプログラムを実行することにより、実行時malloc
に呼び出しをインターセプトするライブラリを作成しています。free
LD_PRELOAD=mylib myexe
と への呼び出しはインターセプトで問題malloc
ありません。free
私の問題は、 mylib に別の関数があり、 が使用されているときにインターセプトしたいのですが、およびLD_PRELOAD
の呼び出しのように「機能しない」理由がわかりません。malloc
free
mylib.c で:
void* malloc(size_t s)
{
return doMyMalloc();
}
void free(void* p)
{
doMyFree(p);
}
void otherThing(size_t)
{
doThing();
}
myexe.cpp で:
#include <malloc.h>
extern "C" void otherThing(size_t); // Compile with -Wl,--unresolved-symbols=ignore-all
int main(int argc, char* argv[])
{
void* x = malloc(1000); // Successfully intercepted.
free(x); // Successfully intercepted.
otherThing(1); // Segfault.
}
私がそれを機能させることができた1つの方法は、次のことです。
typedef void (*FUNC)(size_t);
FUNC otherThing = NULL;
int main(int argc, char* argv[])
{
otherThing = (FUNC)dlsym(RTLD_NEXT, "otherThing");
otherThing(1); // Successfully calls mylib's otherThing().
}
しかし、私はこのすべてのコードを書きたくありません。malloc
と のためにそれをする必要はありませんfree
。LD_PRELOAD
接頭辞がなくてもプログラムがクラッシュしても問題ありません。