问题标签 [ldd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 格式错误(找不到 ldd 二进制文件)!
我正在使用 CentOS5 并尝试安装需要ldd
.
我试过了:
前两个说它已经安装,后者显然只是重新安装而没有错误。
所以我的问题是我正在使用的脚本(AVS)仍然声称ldd
二进制文件丢失。
是否有应该安装它的默认目录?我有以下文件:
在 /usr/bin 和 /usr/local/bin
任何帮助是极大的赞赏。
gcc - ldd 上的 boost_system 重命名和符号链接问题
我有使用 boost_system 共享对象的示例应用程序。现在,由于某些情况,我必须支持 2 个不同的 boost_system 共享对象 - 一个使用 gcc 构建,另一个使用 sun 的 cc 在单个目录 - /home/mydir. 对应的文件是:-
它在生成文件中链接为。
因此,我将 libboost_system_1_41_0.so 重命名为 libboost_system_v1.so,并从 $BOOST_HOME_V1/stage/lib 中删除了软链接。现在,当我尝试构建应用程序时 - 我没有收到任何错误。但是 ldd 失败:-
BOOST_HOME_v1/stage/lib(=BOOST_LIB_v1) 看起来像:-
我无法理解 - 为什么 ldD 仍将 libboost_system.so.1.41.0 显示为依赖项而不是 libboost_system_v1.so。
我期待看到下面的 o/p不是得到的:-
有人可以解释一下是否有解决方案来实际重命名共享对象而不处理 boost 的默认符号链接?我检查了 src/build.jam - 看起来链接在这里完成了 - 但我认为只要我删除软链接,重命名共享对象并与 makefile 中重命名的共享对象链接 - 应该没有任何问题。
linux - Linux 上的共享库依赖路径是如何确定的?
当我ldd
针对一个共享库运行时,例如libphp5.so
我看到它依赖于libmysqlclient.so.16
:
这些依赖文件名和路径 ( /usr/lib/mysql/libmysqlclient.so.16
) 是否已包含在共享库二进制文件中?或者这条路径是由其他方式确定的,例如 via /etc/ld.so.conf.d/mysql-i386.conf
,其中顺便包含:
还有一件事让我很困惑:
我有一个从源代码编译的共享库。这依赖于libmysqlclient_r
. 编译器gcc
切换以生成此库,如下所示:
当我这样做时,ldd mylib.so
我看到:
但是在/usr/lib/mysql
目录中我看到:
libmysqlclient_r.so
是一个符号链接libmysqlclient_r.so.16.0.0
,那么为什么ldd
将依赖项显示为libmysqlclient_r.so.16
. 我在这里缺少一些魔法吗?
作为多年的 Windows 开发人员,我gcc
对 Linux 的开发有点陌生。
我的 Linux 发行版是 CentOS 6.0 x86-32bit。
linux - ldd 依赖项
我正在 Linux(Ubuntu 11)下编译 2 个共享库(“A”、“B”)
库“B”正在使用库“A”中的导出函数(与 -lA 静态链接)
但是当我在“B”上运行 ldd 时,我只有 *
我看不到我的“A”依赖!?
奇怪,我(几乎)很确定 ldd 用于显示所有静态依赖项!?
c++ - 通过运行应用程序以编程方式确定正在使用的共享库
是否有可能(如果是的话,如何)确定应用程序在运行时使用的应用程序的共享库?基本上,我可以以编程方式获取输出ldd
吗?首选的 C/C++ 解决方案不只是跳转到命令行上执行 ldd。
doAction()
考虑以下几点:我有一个从共享库调用的驱动程序应用程序libfoo
。我编译了一次应用程序,然后设置LD_LIBRARY_PATH
到一个适当的目录,其中包含定义libfoo
了doAction()
符号的 a 。这样,我可以doAction()
在不同libfoo
的 s 中有多个实现,但只能编译一次应用程序。
一个真实世界的例子是教授有一个学生的班级实施doAction()
。学生无需针对每个学生的实现编译测试工具,而是doAction()
提交一个共享库,教授可以简单地更改LD_LIBRARY_PATH
以评估每个学生。
我获取当前正在使用的库的目标是md5sum
在运行时对库执行 an 以确保调用正确的库。在人为设计的示例中,所有学生都将提交md5sum
他们的库,教授可以将正在运行的可执行文件 + 共享库(数据库查找,日志到文件,...)匹配给学生,以防止设置意外LD_LIBRARY_PATH
影响另一个学生的成绩(忘记切换LD_LIBRARY_PATH
到 David 的目录并再次使用 Bill 的目录运行libfoo
)。
gcc - 使用 ldd 进行 chroot
我在 sdb 上创建了非常小的 chroot 环境并将其安装在/mnt/sdb
. 我还创建了一个/mnt/sdb/bin/cc
指向/usr/bin/gcc
.
ldd /mnt/sdb/bin/cc
回来
所以我通过运行复制了必要的库:
浏览这篇文章,我想既然linux-gate.so.1
是内核的一部分,我不需要复制它。
但是,在我跑步chroot /mnt/sdb /bin/sh
之后尝试cc
我得到
为什么 ldd 不能告诉 cc 需要 libm.so.6?有没有一种简单的方法可以让 cc 在 chrooted 环境中工作而无需简单地复制所有库?我只是想暂时使用 cc 以便我可以用它构建 tcc,然后用 tcc 构建其他所有东西(我也尝试过简单地在外部构建 tcc 然后在 chroot 中使用它,但我担心这可能值得它自己的帖子)。
笔记:
我在 Virtualbox 中使用 Debian,目前在 chroot 环境中运行的唯一程序是单个(静态)busybox 二进制文件。
linux - 为什么我的 Linux 应用程序拉入了错误的 .so 库?
我正在构建一个使用 NetCDF C++ 库的应用程序,而 NetCDF 正在拉入 HDF-4 库。但是,它引入了错误的HDF-4 库。
这是我的应用程序的链接方式:
我将 LD_LIBRARY_PATH 设置得很短:
这是 ldd -v 输出的摘录:
到目前为止,LD_LIBRARY_PATH、rpath 和 ldd 中的所有内容都表明它指向我要引用的 HDF (/new_apps1/hdf4/lib/libmfhdf.so.0)。但是当我运行时,Valgrind 告诉我它正在 OLD HDF-4 库中死去(这可能是它出现段错误的原因),而不是我试图链接的 HDF-4 库:
动态拉入其他库时,我的应用程序还能在哪里获取路径信息?
macos - Mac上WRT编译源码,ldd是什么?
我在解决一个损坏的 PyV8 安装时遇到了问题,并注意到在线论坛上关于使用的讨论ldd
,这是我以前从未见过的命令/程序。
它是什么,我在哪里得到它?
这是我在其中发现的讨论:http ://groups.google.com/group/pyv8/browse_thread/thread/c14330fe431a69a7?pli=1
linux - 如何使用调试版的 libc
问题的简短版本:
如何让 gdb 使用调试符号libc
?
更长的版本:
我正在使用 gdb 调试一个程序,我想查看有关libc
. 但是,在调试过程中的某些时候,我会得到如下输出:
当我info sharedlibrary
在断点处运行 gdb 时,我看到:
当我跑步时,ldd
我看到:
我正在使用 Ubuntu 10.04,我认为libc
带有调试符号的版本在/usr/lib/debug/lib
. 我尝试将我的LD_LIBRARY_PATH
变量设置为在路径的前面,但这似乎没有什么不同。
我不完全清楚程序如何选择要加载的共享库,无论是在运行时设置还是在编译时设置(我有点假设运行时,但现在我不确定)。libc
因此,感谢有关如何让 gdb 使用调试版本的信息。
linux - 检查非默认加载程序的共享库
ldd
是检查给定可执行文件正在或将要使用的共享库的好方法。但是,它并不总是按预期工作。例如,请参阅以下 shell 片段,该片段演示了如何在 python 二进制文件中“失败”找到 libreadline“依赖项”
我尝试了许多其他发行版,但我是从 Tikanga 复制的
查看ldd
默认安装的内容python
(来自官方存储库)。
没有找到关于 readline 的信息。现在我从交互式使用中确实知道这个二进制文件确实具有实时功能,所以让我们不要尝试查看它的来源。
在后台启动交互式 python 会话(pid 21003)
答对了!这里是readline!
但是,此技术仅在库被有效加载时才有效,因此例如,/usr/lib64/libtcl8.4.so
直到 python 进程不运行类似from Tkinter import *
所以我有两个问题:
我认为问题
ldd
在于它假设使用标准加载器,而 python 很可能正在使用它自己的特殊加载器(这样您就不必每次安装新的非纯 python 模块时重新链接可执行文件python 但有一些 c/c++/fortran 代码)。它是否正确?显然,如果一个可执行文件使用它自己的加载器,那么“如何找到这个可执行文件可能加载的所有可能的库”这个问题没有明显的答案:这取决于加载器的作用。但是有没有办法找出 python 可以加载哪些库?
PS:与 1 相关。如果您遇到这个问题,您应该已经知道以下内容,但如果不知道,您应该:看看完全弄乱ldd
输出是多么简单(仅部分弄乱它有点难):