linux - 抑制共享库的编译时链接

标签 linux linker shared-libraries ld

我正在集成一个 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 将能够在运行时找到它。我怎样才能做到这一点?如果 libDrm.so 在运行时可用,我看不出 LD 在编译时需要 libDrm.so 的原因,所以我希望 LD 足够灵活以允许这样做。

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

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

最佳答案

I'm looking for something quick and dirty.

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

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

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

I'm currently considering linking a version of libDrm.so which is compiled from stubs only to get the build to complete successfully.

这是正确的做法。

Anyone know of an esoteric linker option that I can use with LD to just tell LD to defer all linking operations related to libDrm.so until runtime?

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

关于linux - 抑制共享库的编译时链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585492/

相关文章:

java - 没有 mod_rewrite 的 Apache URL 重写

linux - 标签而不是美元符号 ssh shell

linker - CATiledLayer 无法处理我的 iOS5 项目

c++ - 静态链接 SSL 与 Poco

linux - 查找其中出现 2 个给定单词的文件

c++ - 未解析的外部符号静态变量(标题中定义的方法使用的变量)

python - 需要从 Python 将指针传递给 C 共享库函数

c++ - 通过 cMake 使用具有自定义文件扩展名的共享库

来自 Jars 的 AndroidManifest

c++ - 如何使用本地操作系统环境使用 gettetxt() 初始化静态 char*?