可以将getauxval包装并与LD_PRELOAD一起使用吗?

时间:2018-01-04 18:46:50

标签: gcc linker ld ld-preload

我有一个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_getauxvalgetauxval,但我无法将其包裹起来?我该怎么做才能包装像LD_PRELOAD这样的函数?

1 个答案:

答案 0 :(得分:0)

我最终做的是存储一个函数指针

static unsigned long int (*real_getauxval)(unsigned long int __type) = NULL;

然后,使用dlsym动态检索符号

real_getauxval = dlsym(RTLD_NEXT, "getauxval");

然后我能够轻松地包裹getauxval