【发布时间】:2012-08-07 15:23:41
【问题描述】:
1)。直接打印函数地址:
printf("strerror=%p, strerror_r=%p\n", strerror, strerror_r);
strerror=0x8049ec0, strerror_r=0x8049e20
2)。 dlsym 版本:
rtldDefault= dlopen(0, RTLD_NOW | RTLD_GLOBAL);
dlsym(rtldDefault, "strerror_r"); ==> strerror_r=0xb76544e0
但是
dlsym(rtldDefault, "strerror"); ==> strerror=0x8049ec0
3)。其他:
dlsym((void*)0, "strerror_r") ==> strerror_r=0xb76544e0
dlsym((void*)-1, "strerror_r") ==> strerror_r=0xb76544e0
如何使用dlsym() 获得strerror_r=0x8049e20?
我已经先打印了strerror_r的地址,然后调用dlsym()。
strerror_r=0xb76544e0 是错误的地址,我用这个地址调用 strerror_r 什么都不做。
【问题讨论】:
-
我想
strerror可能实际上在某处被调用,因此已经解决,而strerror_r尚未被调用,dlsym正在给你一个蹦床函数的地址。尝试同时调用它们(仅一次)并查看是否有任何变化。 -
很难说..也许把它喂给
readelf可以给出一些提示 -
您可以在调试器中查看地址。我猜其中一个只包含跳转到真正的功能。