5

平台: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 也不起作用。

4

1 回答 1

0

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

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

于 2013-11-05T16:42:27.200 回答