【问题标题】:Why current directory can be searched by the dynamic linker by default?为什么动态链接器默认可以搜索到当前目录?
【发布时间】:2021-03-18 00:38:14
【问题描述】:

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

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

如果我unset LD_LIBRARY_PATH
,即使可执行文件无法按预期运行 但是我仍然很困惑,因为LD_LIBRARY_PATH 没有当前工作目录
LD_RUN_PATH 也没有任何内容

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

能否请您分享一下为什么可以这样做?
测试代码如下

$ 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

【问题讨论】:

  • 显示echo $LD_LIBRARY_PATH的输出
  • @BasileStarynkevitch 谢谢你的回答,这就是问题所在。但实际上我仍然感到困惑,因为 LD_LIBRARY_PATH 没有当前工作目录。但是如果我将其取消设置为unset LD_LIBRARY_PATH,动态链接器将找不到动态库并且无法按预期运行可执行文件。你知道原因吗?
  • 不可以,但是你可以研究GNU libc的源代码,你可以改进它,因为它是free software。您也可以考虑改用musl-libc
  • 感谢您的评论,如果有机会我会试一试。不幸的是,我现在不考虑 musl-libc。我只是希望有人也可以重现这个问题。如果那时我会考虑在他们的 bugzilla 上提出一个错误。但我想在这样做之前先检查清楚。
  • 你也可以学习GCC和你的crt0的源代码。见linuxfromscratch.org

标签: c++ linux linker dynamic-linking


【解决方案1】:

做了一些测试后,
我发现LD_LIBRARY_PATH 的工作方式与PATH 相同
这意味着当前工作目录会自动包含在其中
如果我将冒号(:)添加为两个相邻的冒号,或者作为初始或尾随冒号

参考如下

What corner cases must we consider when parsing $PATH on Linux?
how to smart append LD_LIBRARY_PATH in shell when nounset

【讨论】:

  • 请注意,在当前工作目录中搜索共享库是非常糟糕的主意 (TM)。您应该永远在实践中这样做。
  • @EmployedRussian 感谢您的评论,如果您能与我分享这是一种不好的做法的原因,那一定很感激
  • @huykmyog:显而易见的网络安全原因会立即浮现在脑海中......您当前的目录(例如,当它是 /tmp/$HOME/Downloads ....)可能包含错误的 libc.so跨度>
  • @EmployedRussian:查看refpersys.org 一两分钟
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2016-08-20
  • 2022-01-14
相关资源
最近更新 更多