大师说,LD_LIBRARY_PATH是坏的 – 有什么select?

我读了一些关于使用LD_LIBRARY_PATH的问题的文章,甚至作为包装脚本的一部分:

http://linuxmafia.com/faq/Admin/ld-lib-path.html

http://blogs.oracle.com/ali/entry/avoiding_ld_library_path_the

在这种情况下,推荐的替代scheme是什么?

谢谢。

您可以尝试添加:

-Wl,-rpath,path/to/lib 

到链接器选项。 这将节省您对LD_LIBRARY_PATH环境变量的担心,您可以在编译时决定指向特定的库。

对于相对于二进制文件的路径,可以使用$ ORIGIN,例如

 -Wl,-rpath,'$ORIGIN/../lib' 

(当使用ld静态链接到共享库时,$ ORIGIN可能不工作,使用-Wl, – allow-shlib-undefined来解决这个问题)

答案在你引用的第一篇文章中。

在UNIX中,可以使用编译器的-L dir选项指定库的位置。 ….作为使用-L和-R选项的替代方法,可以在编译代码之前设置环境变量LD_RUN_PATH。

我一直设置LD_LIBRARY_PATH,我从来没有遇到过问题。

引用你的第一个链接:

什么时候应该设置LD_LIBRARY_PATH? 简短的答案是从来没有。 为什么? 有些用户似乎设置了这个环境变量,因为来自其他用户的不好的建议或者他们不知道如何修复的代码错误。

不是我称之为明确的问题陈述。 其实它让我想到我不喜欢它 。 [YouTube,但是SFW]。


第二个博客条目( http://blogs.oracle.com/ali/entry/avoiding_ld_library_path_the )在问题的本质上更加接近…看​​起来,简而言之,库版本冲突ThisProgram需要Foo1。 2,但是这个程序需要Foo1.3,所以你不能运行这两个程序(很容易)。 请注意,大多数这些问题都被一个简单的包装脚本所取代,该包装脚本为只执行shell而设置LD_LIBRARY_PATH,而这个shell几乎总是一个独立的交互式shell子进程。

还要注意的是,在这篇文章中很好地解释了这些替代方案。

我只是困惑,为什么你会发表一个问题,其中包含文章的链接显然回答你的问题…你有一个具体的问题,这些文章中没有涵盖(明确)?

我发现现有的答案实际上是直接回答问题的:

  1. 链接器(请参阅ld )在链接软件时使用LD_RUN_PATH 。 只有在命令行上没有-rpath ... (在gcc命令行上-Wl,rpath ... )时才会使用它。 在该变量中定义的路径被添加到ELF二进制文件的RPATH条目中。 (你可以看到使用objdump -x binary-filename RPATH,在大多数情况下,它不在那里!它出现在我的开发二进制文件中,但是一旦最终版本被安装, RPATH就会被移除。

  2. LD_LIBRARY_PATH在运行时使用,当您要指定动态链接程序(请参阅ldd )需要搜索库的目录时。 指定错误的路径可能会导致加载错误的库。 除了在二进制文件中定义的RPATH值之外,还使用这个值(如1中所示)

LD_RUN_PATH确实不会引起安全威胁,除非您是程序员,不知道如何使用它。 当我使用CMake来构建我的软件时, -rpath始终处于使用状态。 这样我就不必安装一切来运行我的软件。 ldd可以自动找到所有的.so文件。 (automake环境也应该这样做,但相比之下它并不是很好)。

LD_LIBRARY_PATH是一个运行时变量,因此您必须小心谨慎。 话虽如此,如果我们没有这个特殊的功能,很多共享的对象将是很难处理的。 无论是安全威胁,可能不是。 如果黑客占用了你的计算机, LD_LIBRARY_PATH无论如何都可以被黑客访问。 可能发生的情况是,你在这个变量中使用了错误的路径,你的二进制文件可能不会被加载,但是如果它加载的话,你最终可能会碰到一个崩溃的二进制文件,或者至少是一个不太正确的二进制文件。 一个问题是,随着时间的推移,你会得到新版本的库,你可能会忘记删除LD_LIBRARY_PATH ,这意味着你可能会使用一个不安全的库版本。

另外一种安全的可能性是,如果黑客安装了一个与二进制文件名称相同的伪造库,包含所有相同功能的库,但是这些函数中的一些功能被偷偷摸摸的代码取代。 他可以通过更改LD_LIBRARY_PATH变量来加载该库。 那么它最终会被黑客执行。 同样,如果黑客可以将这样一个库添加到您的系统中,那么他已经进入,可能不需要做任何事情(因为他已经完全控制了系统)。因为在现实中,如果黑客只能把图书馆​​放在自己的帐户里,他不会做任何事情(除非你的Unix盒子总体上不安全)。如果黑客可以替换你的/usr/lib/...库中的一个,他已经可以完全访问您的系统。 所以LD_LIBRARY_PATH是不需要的。