【问题标题】:suppressing compile time linkage of shared libraries抑制共享库的编译时链接
【发布时间】:2014-03-23 00:25:10
【问题描述】:

出于安全原因,我正在集成一个 DRM 库,该库无法以明文形式保存在代码存储库中。 DRM 库仅在运行时在安全目标设备上时处于明文状态,因此它仅可用于在运行时进行链接。这给编译时链接带来了问题。

例如,如果我正在创建依赖于 DRM 库 libDrm.so 的 my_library.so,如果我只是使用“ld: cannot find -lDrm”从构建中删除 libDrm.so,则以下操作将失败 gcc -fPIC -shared -o my_library.so my_library.c -L。 -lDrm

我知道动态加载 libDrm.so 的符号是一种解决方案,但我不想在开发的这个阶段编写代码来进行动态加载。我正在寻找快速而肮脏的东西。我基本上想告诉 LD 忽略在编译时找不到 libDrm.so 的事实,因为 LD 将能够在运行时找到它。我怎样才能做到这一点?如果 LD 在运行时可用,我看不出它在编译时需要 libDrm.so 的原因,所以我希望 LD 足够灵活以允许这样做。

我目前正在考虑链接从存根编译的 libDrm.so 版本,只是为了让构建成功完成。在运行时,从实际实现创建的 libDrm.so 版本将被链接。

任何人都知道我可以与 LD 一起使用的深奥链接器选项,它只是告诉 LD 将所有与 libDrm.so 相关的链接操作推迟到运行时?

【问题讨论】:

    标签: linux linker shared-libraries ld


    【解决方案1】:

    我正在寻找快速而肮脏的东西。

    创建一个名为libDrm-stub.so存根 库,将SONAME 设置为libDrm.so

    在该库中,提供您调用的所有函数的无操作实现。将您的二进制文件与该存根库链接,但不要将其发送到设备上。

    (要设置SONAME,链接libDrm-stub.so时使用-Wl,--soname=libDrm.so

    我目前正在考虑链接 libDrm.so 的一个版本,该版本是从存根编译的,只是为了让构建成功完成。

    这是正确的方法。

    任何人都知道我可以与 LD 一起使用的深奥链接器选项,它只是告诉 LD 将所有与 libDrm.so 相关的链接操作推迟到运行时?

    您可以尝试使用-Wl,--unresolved-symbols=ignore-all,但这更容易出错,所以我建议不要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多