我有一个c ++共享库,它作为其正常行为fork()/ execs()的一部分,包含一些不稳定的遗留代码。除了这个库之外,这个可执行文件没有用,所以我想避免将它放在PATH目录中。我还希望能够在不同的位置安装多个副本,因此不希望硬编码路径。有没有相当于RPATH的东西允许exec()找到这个可执行文件?或者,是否可以从库本身查询共享库的rpath?
编辑:这篇文章暗示后者是可能的。如果有人知道问题的答案,我会保持公开。 Is there a way to inspect the current rpath on Linux?
答案 0 :(得分:1)
您始终可以使用getenv
来获取共享对象中的环境,但RPATH
是否真的要用于此目的?让共享对象在用户的主目录(或自定义环境变量)中有某种配置文件告诉它使用哪个位置运行外部二进制文件,这不是更好吗?
答案 1 :(得分:0)
我认为最好的方法是设置环境变量并使用execve()
来运行二进制文件。大概你可以设置PATH
然后execve()
一个shell,它将使用PATH来查找可执行文件的副本。等效的库是将LD_LIBRARY_PATH
和execve()
设置为将此库作为依赖项的二进制文件。
在任何一种情况下,您都不会更改外部环境,只会制作与execve()
一起使用的修改后的副本。