情况:我使用 python ctypes 模块加载一个 c 共享库,实际上 ctypes 模块使用带有 RTLD_NOW 的 dlopen 来加载共享库。当我使用共享库时,它在调用一个非常奇怪的函数地址时崩溃。
核心栈如下:
(gdb) bt
#0 **0x00000000001723f6** in ?? ()
#1 0x00007f39a9d1b506 in do_io ()
from /home/z/libgshared.so
#2 0x00007f39b84dddf5 in start_thread (arg=0x7f39a9101700)
at pthread_create.c:308
#3 0x00007f39b7b021ad in clone ()
at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
然后我更深入地发现奇怪的地址来自GOT,这意味着dlopen在某些函数中没有计算实际地址。
(gdb) disas 0x7f39a9ba63f0
Dump of assembler code for function zookeeper_process@plt:
0x00007f39a9ba63f0 <+0>: jmpq *0x42d452(%rip) # 0x7f39a9fd3848
0x00007f39a9ba63f6 <+6>: pushq $0xf06
0x00007f39a9ba63fb <+11>: jmpq 0x7f39a9b97380
End of assembler dump.
(gdb) x/2a 0x7f39a9fd3848
0x7f39a9fd3848: **0x1723f6** 0x172406
(gdb)
看到地址0x1723f6正是帧0中的核心地址。
我想知道为什么会发生这种情况,我该如何解决或修复它?
最佳答案
0x7f39a9fd3848: 0x1723f6 0x172406
这些是未重定位 GOT
条目在任何包含0x7f39a9ba63f0
(和0x7f39a9fd3848
)的库中,可能是 libgshared.so
.
您可能遇到了这个 GLIBC bug .
关于python - 使用 RTLD_NOW 的 dlopen 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106977/