LD_LIBRARY_PATH副作用

时间:2012-06-05 15:06:58

标签: linux bash unix ld

我在改变LD_LIBRARY_PATH时会产生奇怪的副作用。

当我追加包含库的路径时,例如:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib

然后,一切都变得令人难以置信地缓慢。例如,一个简单的ls可以是10秒长。

ldd更改之前和之后

LD_LIBRARY_PATH输出完全相同,我尝试使用ls调试慢strace的执行:我得到的完全相同在两种情况下执行。在执行ls期间执行甚至不会卡住(因为strace在10秒滞后期间没有输出任何内容,然后突然完美地执行ls)。所以我认为它可能来自我的shell,但是这是相同的,在我的bash上运行strace并且在两种情况下执行ls都给出了相同的strace输出:shell执行{ {1}}并等待其执行结束(滞后lsstrace之前的最后strace输出)。所以我想在waitpid(...)的启动和它的执行之间发生了一些错误,就好像它是一个内核级问题。它的确就像在ls上使用sleep一样(0 cpu使用率)。

在延迟期间,我的CPU和网络活动完全正常......

请注意,新LD路径中的库不会与任何“标准库”冲突,因此在我的示例中它不会打扰ls

所以我对有关ls副作用或如何深入调试我的例子的更深入解释感兴趣。

2 个答案:

答案 0 :(得分:1)

这篇文章已经过时了,所以我不知道你是否已找到解决方案。无论如何,我不知道这是否有帮助,但在大多数现代GNU / Linux系统中,不推荐使用LD_LIBRARY_PATH 并且不鼓励使用。

因此我有几点建议:

  1. 如果要继续使用它,请先预先挂起,而不是将库路径附加到LD_LIBRARY_PATH。如果需要很长时间来扫描先前库目录中的路径,这应该会有所帮助。

  2. 使用LDCONFIG系统,这是现在使用LD目录的(新)正确方法。您只需在 /etc/ld.so.conf 文件中添加库的路径,或者更好,在/etc/ld.so.conf.d/中添加包含路径的文件到您的库(如果 /etc/ld.so.conf 中有include指令,则会获取它,默认情况下通常是这种情况)。然后运行sudo ldconfig以更新系统LD搜索路径。

  3. 我希望这有帮助。干杯

答案 1 :(得分:0)

我不确定您要添加的LD_LIBRARY_PATH或库中还有哪些内容或正在运行的程序,但您可能最好还是编写一个包装脚本来更改LD_LIBRARY_PATH仅用于该程序需要额外的库,以便像ls这样的系统功能不受影响。

#!/bin/bash
export LD_LIBRARY_PATH=/my_path/lib
program_name

创建文件和chmod +x wrapper_name