我们将应用程序与所有必要的依赖项一起部署在一个目录中。我们的应用程序将 LD_LIBRARY_PATH 设置为此位置。一些库(例如 OpenSSL)也存在于系统位置。事实上,当我们从应用程序目录中删除这样的共享对象时,应用程序仍然会运行,并出现所有可能的灾难(例如错误的版本)。我宁愿发出警告,如果我从应用程序目录中删除共享对象,则无法找到该共享对象
是否可以重置动态加载器的搜索路径,使其仅在 LD_LIBRARY_PATH 中查找某些对象?
答案1
我认为您无法阻止在运行时在系统路径中搜索库,但根据 ld.so 手册页,如果您使用-z nodeflib
动态链接器链接二进制文件,则不会搜索系统库路径。我在 ld 的手册页中没有看到这一点,所以我不知道这是否真的受支持。
另一个想法:研究使用像 docker 这样的容器系统。这类似于轻量级虚拟机,您可以拥有自己的与主机分离的文件系统视图,并且可以将所需的库版本放入容器中。它也适用于共享库以外的东西,如 JVM/python 版本等。我自己用得不多,但我的理解是它非常适合这些类型的应用程序。