平台: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/directory(为 post 重命名),以便在其他服务器上实现时创建一个一致的位置来放置这些库。
我正在编译:
gcc -fPIC -shared vendor_lib_test.c -o libmylib.so -lvendor_ssl
我尝试过的其他 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/directory 也不起作用。