情况:我使用python ctypes模块加载一个c共享库,实际上ctypes模块使用dlopen和RTLD_NOW来加载共享库。当我使用共享库时,它在被称为非常奇怪的函数地址时崩溃。
核心堆栈如下:
(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帧中的核心地址完全相同。
我想知道为什么会发生这种情况,我该如何解决或修复它?
答案 0 :(得分:0)
0x7f39a9fd3848:0x1723f6 0x172406
这些未定位的 GOT
条目包含0x7f39a9ba63f0
(和0x7f39a9fd3848
),可能是libgshared.so
。
您可能遇到此GLIBC bug。