【发布时间】: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