1)。直接打印功能地址:dlsym()返回符号的奇怪地址
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
我怎样才能使用strerror_r=0x8049e20
dlsym()
?
我已经打印出strerror_r的地址,然后调用dlsym()。
strerror_r = 0xb76544e0是错误的地址,我用这个地址调用strerror_r只是什么都不做。
我想可能'strerror'实际上是在某处调用的,因此已经解决了,而'strerror_r'没有被调用,'dlsym'给了你一个蹦床函数的地址。尝试调用它们(只是一次),看看是否有任何变化。 – Useless 2012-08-10 10:31:28
很难说..也许喂它到'readelf'可以给一些提示 – 2012-08-10 10:46:21
你可以看看调试器中的地址。我猜想其中一个除了跳转到真正的功能外没有其他任何东西。 – 2012-08-10 10:51:21