【问题标题】:Why change in LD_LIBRARY_PATH at Runtime dosen't Reflect on the Executable once the Executable gets loaded为什么加载可执行文件后,在运行时更改 LD_LIBRARY_PATH 不会反映在可执行文件上
【发布时间】:2013-10-12 18:53:04
【问题描述】:

我正在尝试从我的 C++ 程序中更改 LD_LIBRARY_PATH。我可以使用getenv("LD_LIBRARY_PATH") 获取它的值并使用setenv() 设置它的值(我知道这是有效的,因为当我再次调用getenv("LD_LIBRARY_PATH") 时,我得到了更新的值),但是从程序内部对其没有任何影响:我仍然收到此错误消息:

Failed to Load the shared library file

如果我在加载可执行文件或启动应用程序之前设置值,它可以正常工作。

【问题讨论】:

  • 我会简单地编写一个 shell 包装器,在 exec 之前适当地设置 LD_LIBRARY_PATH-ing 二进制 ELF 可执行文件。这是常见的做法(大多数发行版都为firefox 这样做)
  • Basile感谢您的正确回复。正如你所说,我正在尝试编写一个 shell 包装器,但问题是我需要将脚本作为 . filename.sh (在终端中)然后只有导出路径有效。如果我尝试在系统启动时启动我的应用程序,我将无法达到同样的效果。
  • 不,只是chmod a+x filename.sh,将filename.sh 放在PATH 的某个目录中,您可以简单地以filename.sh 运行它
  • 我在系统启动时使用 application.sh 启动我的应用程序,它执行 filename.sh(设置路径的 shell 脚本)但它不起作用,路径未设置
  • 然后使用完整路径,例如$HOME/bin/filename.sh/usr/local/bin/filename.sh。查看内部 firefoxmozilla ;它通常是一个shell脚本......

标签: c++ linux setenv getenv


【解决方案1】:

不幸的是,在正在运行的程序中设置LD_LIBRARY_PATH 不会对其产生任何影响。原因是LD_LIBRARY_PATH 是由动态链接加载器 (ld.so) 处理的,它是启动程序的程序。您的程序本身不会处理LD_LIBRARY_PATH,因此更改它不会有任何效果。

【讨论】:

  • 更改LD_LIBRARY_PATH 无效,除非程序在dlopen 之后调用以加载插件。
  • 同意。 (原始进程的)任何子进程都将继承在该原始进程中所做的 LD_LIBRARY_PATH 更改。因此,在您的程序中设置 LD_LIBRARY_PATH,然后分叉并终止父级应该将您放在(我认为)您想要在加载路径方面的位置。
猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多