我试图挂钩glibc的一些函数,如fopen,fread等。但是在hook函数中,我必须使用与glibc中相同的函数。就像这样:如何在linux中不使用dlsym挂钩
// this is my fopen
FILE *fopen(.....)
{
fopen(....);// this is glibc fopen
}
我发现做到这一点使用dlsym的一种方式,但这种方式我不得不更换所有的glibc的功能与包装内,其使用dlsym调用glibc的函数调用。 我很好奇,在没有对包装函数进行编码的情况下,另一种方式可以做同样的工作。我曾经tryed这一点:
fopen.c
....fopen(..)
{
myfopen(..);
}
myfopen.c
myfopen(..)
{
fopen(...);// glibc version
}
的main.c
int main()
{
fopen(...);
}
$ gcc -c *.c
$ gcc -shared -o libmyopen.so myopen.o
$ gcc -o test main.o fopen.o libmyopen.so
在我的理解,GCC将链接从左至右如命令行中指定的那样,main.o将在fopen.o中使用fopen.o,fopen.o将在libmyfopen.so中使用myfopen,libmyfopen.so将在glibc中使用fopen。但是在运行时,我得到了段错误,gdb显示有一个fopen和myfopen的recusive调用。我有点困惑。谁能解释为什么?
所以你的意思是libmyfopen.so将使用第一个加载的fopen,而不是libc中的那个。编译时符号fopen与libc中的符号没有联系?这与Windows DLL不同。 我想我需要学习一些关于精灵加载过程的东西。 感谢您的回复,非常感谢。 – D3Hunter