如何编译适用于libcrypto.so.0.9.8和libcryto.so.1.0.0的二进制文件?

时间:2013-04-18 16:23:17

标签: c openssl autotools libssl

我有一个autotools C项目。

如何编译适用于libcrypto.so.0.9.8和libcryto.so.1.0.0的二进制文件? (即Ubuntu 9.10和12.04)

根据我进行构建的操作系统的年龄,二进制文件需要一个版本或另一个版本。

有没有办法让它不在乎,或者libcryto版本之间的差异是不可克服的?

3 个答案:

答案 0 :(得分:3)

在我看来,你想使用libcrypto.so.0.9.8的一些功能和libcryto.so.1.0.0中的一些功能。如果1.0.0中需要大部分功能或者是首选,那么请链接libcrypto.so.1.0.0。

你可能需要libcrypto.so.0.9.8中的一些函数,或者你可能有其他充分的理由使用libcrypto.so.0.9.8。

在我看来,如果您从两个库链接,您将收到链接器错误(两个库中包含相同符号的重复符号)。

如果你需要使用0.9.8,那么使用dlopen动态加载它并获得你想用dlsym的函数回调。

这可以通过以下方式实现:

void * handle;
/*reqd_callback is the callback of required function.*/
reqd_callback cb;

handle = dlopen ("libcrypto.so.0.9.8", RTLD_LAZY);
cb     = (reqd_callback)dlsym(handle, "reqd_function");
//Call the cb
cb (parameters);

//Close the library.
dlclose(handle);

我认为这可能会解决您的目的。如果首选项是反向的,则在链接中反转库并在程序中加载。

答案 1 :(得分:2)

你能建立一个软链接,指向"指向"到libcrypto.so.0.9.8或libcryto.so.1.0.0。 给它一个通用名称,然后使用它,然后链接的任何版本的链接"指向"来,会被接走?在应用安装上,您将软链接设置为指向可用的库版本。如果lib足够向后兼容,你的软件可能会被测试到1.0.0,即你不依赖于1.0.0中没有0.9.8的东西,你的确定。

答案 2 :(得分:2)

你可以重建ssl-0.9.8(不是1.x,因为它包含一些不能在旧版本上运行的东西)并更改makefile中的行,它在那里进行最终的共享库链接和嵌入SONAME

重新编译它,将SONAME从libssl.so.0.9.8更改为libssl.so.0

它看起来像:-Wl,-soname,libssl.so.0.9.8 将其更改为:-Wl,-soname,libssl.so.0

现在当您针对此库进行编译时,针对它构建的二进制文件将查找libssl.so.0(在两个版本中都包含为符号链接)