我有一个C文件里面有两个非常小的子程序,重新实现了getauxval,
unsigned long int __wrap_getauxval (unsigned long int __type) {
printf("foobar");
exit(5);
}
unsigned long int getauxval (unsigned long int __type) {
printf("foobar");
exit(5);
}
我用
编译了这个gcc -shared -fPIC -ldl -Wl,-wrap=getauxval hax.c -o hax.so
就像那样,我可以运行这个
LD_PRELOAD=/tmp/hax.so myExec
它会打印foobar
然后死掉,但如果我删除getauxval
并且只依赖于LD -wrap' d版本{{1我觉得它不起作用。我在这里错过了什么?为什么我可以重新实施__wrap_getauxval
和getauxval
,但我无法将其包裹起来?我该怎么做才能包装像LD_PRELOAD
这样的函数?
答案 0 :(得分:0)
我最终做的是存储一个函数指针
static unsigned long int (*real_getauxval)(unsigned long int __type) = NULL;
然后,使用dlsym
动态检索符号
real_getauxval = dlsym(RTLD_NEXT, "getauxval");
然后我能够轻松地包裹getauxval