平台:Ubuntu 12.04LTS x86_64
Python版本:2.7.3
我有一个由供应商提供给我的共享库,其中包括libcrypto.so.0.9.8和libssl.0.9.8,并有一条注释说明该库不适用于这些库的其他版本。
我们运行的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
Run Code Online (Sandbox Code Playgroud)
我尝试过的其他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
Run Code Online (Sandbox Code Playgroud)
我尝试在运行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)
Run Code Online (Sandbox Code Playgroud)
因此它似乎已链接到正确的库,但是运行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 …Run Code Online (Sandbox Code Playgroud)