【发布时间】:2012-05-22 00:31:09
【问题描述】:
我正在尝试hook glibc 的一些函数,例如fopen、fread 等。但是在hook 函数中,我必须使用与glibc 中相同的函数。像这样:
// this is my fopen
FILE *fopen(.....)
{
fopen(....);// this is glibc fopen
}
我找到了一种使用 dlsym 执行此操作的方法,但是通过这种方式,我必须将所有 glibc 函数调用替换为使用 dlsym 调用 glibc 函数的包装器。 我很好奇在没有编码包装函数的情况下是否还有另一种方法可以完成相同的工作。我曾经试过这个:
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,fopen.o会在libmyfopen.so中使用myfopen,libmyfopen.so会使用fopen在 glibc 中。但是在运行时,我遇到了段错误,gdb 显示有 fopen 和 myfopen 的递归调用。我有点困惑。谁能解释一下为什么?
【问题讨论】:
标签: linux gcc hook shared-libraries glibc