相关疑难解决方法(0)

可执行文件在运行时在哪里查找共享对象?

我了解如何在链接/编译时定义包含共享对象。但是,我仍然想知道可执行文件*.so在执行时如何查找共享对象(库)。

例如,我的应用程序a.out调用lib.so库中定义的函数。编译后,我移动lib.so到我的$HOME.

我怎么知道a.out去那里找呢?

compiling path executable dynamic-linking

159
推荐指数
3
解决办法
18万
查看次数

LD_LIBRARY_PATH 的默认值是多少?

在我的情况下,似乎LD_LIBRARY_PATH设置为空字符串。但是所有标准系统工具仍然可以正常工作,所以我猜动态链接器会检查这种情况并LD_LIBRARY_PATH在这种情况下使用一些默认值。

这个默认值是多少?我想它至少包括/usr/lib但还有什么?有没有什么好的系统方法来确定动态链接器将搜索的标准位置?

这个问题与动态链接器将搜索的路径略有不同。 有一个默认值意味着它会使用LD_LIBRARY_PATH如果给定的值,或者如果没有给定,它将使用默认值 - 这意味着它不会使用如果LD_LIBRARY_PATH提供了默认值。

defaults libraries path ld

13
推荐指数
1
解决办法
4万
查看次数

如何确定可执行文件在何处搜索共享库?

我知道我有库,但可执行文件找不到它。如果我知道它在哪里搜索,我可以创建一个符号链接,它希望找到 lib。

$ ~/Apps/simutrans/simutrans
/home/dan/Apps/simutrans/simutrans: error while loading shared libraries: libbz2.so.1.0: cannot open shared object file: No such file or directory

$ locate libbz2
...
/lib/x86_64-linux-gnu/libbz2.so.1
/lib/x86_64-linux-gnu/libbz2.so.1.0
/lib/x86_64-linux-gnu/libbz2.so.1.0.4
/usr/lib/x86_64-linux-gnu/libbz2.a
/usr/lib/x86_64-linux-gnu/libbz2.so
...
Run Code Online (Sandbox Code Playgroud)

显然,可执行文件不是/etc/ld.so.conf*用来查找库的;如果是,那么它会找到lib:

$ cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf 
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

使用 来检查可执行文件readelf,如系统将哪里搜索动态库中所述?, 不显示RUNPATH在需要找到库时会显示的条目。

dynamic-linking

3
推荐指数
1
解决办法
1688
查看次数

标签 统计

dynamic-linking ×2

path ×2

compiling ×1

defaults ×1

executable ×1

ld ×1

libraries ×1