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

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

概述大师说,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是什么?

ld-linux.so以什么顺序search共享库?

如何重命名共享库以避免同名冲突?

链接器错误:当我没有定义它的时候,已经在我的项目中定义了

请解释这个链接错误:在.rodata节中引用

:我是否需要在项目的makefile中添加库中使用的所有库,在我的项目中使用?

谢谢。

未定义的引用'pthread_create' – 链接器命令选项顺序(库之前/之后的对象文件?)

chroot如何影响dynamic链接?

链接到Boost正则Expression式库时程序启动时崩溃

我如何解决这些libcurl链接错误?

gcc默认将静态或dynamic库链接到程序?

您可以尝试添加:

-Wl,-rpath,path/to/lib

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

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

-Wl,'$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子进程。

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

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

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

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

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是不需要的。

总结

以上是内存溢出为你收集整理的大师说,LD_LIBRARY_PATH是坏的 – 有什么select?全部内容,希望文章能够帮你解决大师说,LD_LIBRARY_PATH是坏的 – 有什么select?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1290443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存