Python使用带有链接到非标准共享库的共享库的ctypes

时间:2013-06-28 17:35:39

标签: python ctypes ld

平台:Ubuntu 12.04LTS x86_64
Python版本:2.7.3

我有一个由供应商提供给我的共享库,它包含libcrypto.so.0.9.8和libssl.0.9.8,并附有说明它不能与这些库的其他版本一起使用的注释。 / p>

我们运行的Ubuntu版本(12.04LTS)使用libcrypto.so.1.0.0和libssl.so.1.0.0,我试图对这些版本进行编译,并确认它不起作用。

我继续编写我的C函数,并测试它针对给定的库进行编译,并且它可以工作,一切都很开心,我得到了我期望的结果,等等。这是它变得粘稠的地方。当我将函数导入python并尝试运行它时,似乎ld.so仍在尝试将其链接到libcrypto.so.1.0.0,而不是指定的库。

我已将所有库复制到/ etc /目录(重命名为post),以便在其他服务器上实现这些库时创建一致的位置。

我正在编译:

gcc -fPIC -shared vendor_lib_test.c -o libmylib.so -lvendor_ssl

我尝试的aditional gcc选项是:

-Wl,-rpath,/etc/directory,-rpath-link,/etc/directory  #together, and each individually
-Wl,-R,/etc/directory/libssl.so.0.9.8,-R,/etc/directory/libcrypto.so.0.9.8 #both with, and without the above

我尝试在运行10.04LTS的旧服务器上运行代码,该服务器使用这两个库中的0.9.8,并且它按预期工作,但它是我们拥有的最后一个10.04服务器,并且不会在生产中使用。

检查ldd产生(编辑以删除敏感信息):

linux-vdso.so.1 =>  (0x00007fff39fe9000)
libvendor_ssl.so => /etc/directory/liblpcapi_ssl.so (0x00007f3c7602b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3c75c64000)
libssl.so.0.9.8 => /etc/directory/libssl.so.0.9.8 (0x00007f3c75b1c000)
libcrypto.so.0.9.8 => /etc/directory/libcrypto.so.0.9.8 (0x00007f3c758ab000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3c76341000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3c756a7000)

所以它似乎链接到正确的库,但运行python脚本会产生分段错误,gdb给我们:

$ gdb python
(gdb) run ./ptest.py
Starting program: /usr/bin/python ./ptest.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff724dc68 in RSA_public_encrypt () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0

所以它仍然试图与1.0.0联系,我在这里碰到了我的头。

编辑:export LD_LIBRARY_PATH = / etc /目录也不起作用。

1 个答案:

答案 0 :(得分:0)

gcc有一个未记录的参数,允许您设置共享库的路径:“ - l:/usr/libname.so”。

如果你将完整的lib名称传递给gcc,也许ld会做你想要的,并且你将能够运行库的选择版本,例如: gcc(...) - 1:/etc/directory/libssl.0.9.8 -l:/etc/directory/libcrypto.so.0.9.8