python - 使用 RTLD_NOW 的 dlopen 导致崩溃

标签 python linux shared-libraries dlopen

情况:我使用 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/

相关文章:

python - 需要有关测试类结构的建议(Python、Selenium)

python - 正则表达式每隔三个字符插入一个空格,行尾除外

python - Thread._wait_for_tstate_lock() 永不返回

php - 是否可以下载具有读取权限的php文件?

c++ - 无法使用 execlp 从管道读取

c - 以跨平台方式导出共享库符号?

python - 字典大小和内存消耗之间的平衡

linux - 未读(unget)到 BSD 套接字?

linux - 识别哪个 Linux 系统库包含一个函数

c - 处理共享对象中的全局变量