抑制共享库的编译时链接

时间:2014-03-23 00:25:10

标签: linux linker shared-libraries ld

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

例如,如果我创建依赖于DRM库libDrm.so的my_library.so,如果我只是使用" ld从构建中删除libDrm.so,则以下将失败:找不到-lDrm& #34;     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相关的链接操作推迟到运行时?

1 个答案:

答案 0 :(得分:2)

  

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

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

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

(要设置SONAME,请在关联-Wl,--soname=libDrm.so时使用libDrm-stub.so

  

我目前正在考虑链接从存根中编译的libDrm.so版本,以使构建成功完成。

这是正确的做法。

  

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

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