代码之家  ›  专栏  ›  技术社区  ›  fadedbee

如何编译一个既能使用libcrypto.so.0.9.8又能使用libcrypto.so.1.0.0的二进制文件?

  •  7
  • fadedbee  · 技术社区  · 11 年前

    我有一个自动工具C项目。

    如何编译一个既能使用libcrypto.so.0.9.8又能使用libcrypto.so.1.0.0的二进制文件?(即Ubuntu 9.10和12.04)

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

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

    3 回复  |  直到 11 年前
        1
  •  3
  •   doptimusprime    11 年前

    在我看来,您需要使用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);
    

    我认为这可能会解决你的目的。如果首选项是反向的,则在链接和通过程序加载时反转库。

        2
  •  2
  •   Jimbo    11 年前

    你能制作一个软链接,“指向”libcrypto.so.0.9.8或libcryto.so.1.0.0吗。 给它一个通用名称,然后使用它,那么链接“指向”的库的哪个版本都会被选中?在应用程序安装时,您将软链接设置为指向可用的库版本。如果lib足够向后兼容,你的软件可能会测试到1.0.0,也就是说,你不依赖1.0.0中的0.9.8中没有的东西。

        3
  •  2
  •   technosaurus    11 年前

    您可以重新生成ssl-0.9.8(不是1.x,因为它包含一些在旧版本上不起作用的东西),并更改makefile中执行最终共享库链接并嵌入SONAME的行

    使用从libssl.so.0.9.8更改为libssl.so.0的SONAME重新编译它

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

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

    推荐文章