dlopen与RTLD_NOW导致崩溃

时间:2016-05-09 02:25:04

标签: python linux shared-libraries dlopen

情况:我使用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帧中的核心地址完全相同。

我想知道为什么会发生这种情况,我该如何解决或修复它?

1 个答案:

答案 0 :(得分:0)

  

0x7f39a9fd3848:0x1723f6 0x172406

这些未定位的 GOT条目包含0x7f39a9ba63f0(和0x7f39a9fd3848),可能是libgshared.so

您可能遇到此GLIBC bug