提问者:小点点

为什么默认情况下动态链接器可以搜索当前目录?


我正在尝试使用ubuntu-20(ld-linux.so.2)
中的动态链接器的一些实践,但有一个奇怪的地方是,当前目录会自动包含在搜索列表中

我找不到如何执行此操作的任何说明
,因为手册页指定了搜索顺序,但没有关于当前目录的任何内容
(https://man7.org/linux/man-pages/man8/ld.so.8.html)

请您分享一下能做到这一点的原因?

测试的代码如下

$ cat foo.cpp 

#include <iostream>

void whoami() {
  std::cout << "I'm foo" << std::endl;
}

$ cat main.cpp 
#include <iostream>

void whoami();

int main()
{
  whoami();
  return 0;
}

$ g++ -o libfoo.so -shared -fpic foo.cpp
$ g++ main.cpp -Wl,-Bdynamic libfoo.so
$ ./a.out 
I'm foo

我添加了一些更多信息
如果取消设置LD_LIBRARY_PATH,可执行文件将无法按预期运行
但我仍然感到困惑,因为LD_LIBRARY_PATH没有如下所示的当前工作目录

$ pwd
/home/mk/work/test/ex2/build
$ echo $LD_LIBRARY_PATH
/home/mk/local/lib:

并且LD_RUN_PATH也是清除的

$ echo $LD_RUN_PATH


共1个答案

匿名用户

在进行一些测试后,
我发现,如果在LD_LIBRARY_PATH字符串中添加冒号(:),
当前工作目录将自动包含在搜索列表中

原因可以在下面几页中找到

在Linux上解析$path时,我们必须考虑哪些特殊情况?
当nounset时,如何在shell中智能追加LD_LIBRARY_PATH