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