- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ldd 中遇到了以下奇怪的情况
$ sudo ldd ./monit
not a dynamic executable
$ readelf -d monit
Dynamic section at offset 0x25ea90 contains 27 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libpam.so.0]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libcrypt.so.1]
0x0000000000000001 (NEEDED) Shared library: [libresolv.so.2]
0x0000000000000001 (NEEDED) Shared library: [libnsl.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
...
$ file ./monit
./monit: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.0, with debug_info, not stripped
$ uname -r -i -m
4.15.0-43-generic x86_64 x86_64
$ file $(which ls)
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9567f9a28e66f4d7ec4baf31cfbf68d0410f0ae6, stripped
其他二进制文件和库是针对更新的内核/系统编译的,并且 ldd 成功报告了共享库,我想知道不同环境之间是否存在任何不兼容性,尽管这些二进制文件是在相同的体系结构上构建的..另一个愚蠢的问题是,如果某些共享库像 libpam 一样升级,那么在不插入旧库的情况下,二进制文件可能无法运行,api 是否可能会发生如此大的变化?如果新版本向后兼容,那么创建一个新的动态链接 (ln) 到旧名称还不够吗?
--最新--真是个白痴。我忘了我已经拒绝了该主机上分区的执行权限:(ldd 命令按预期工作
最佳答案
if there are any incompatibilities between different environment despite of the fact that the binaries are built on the same architecture
程序所依赖的“环境”是一个大词,是许多小东西放在一起的一个大词。它是一种体系结构(即CPU支持的指令集)或类似的体系结构(主板结构、CPU到内存结构等)或类似的操作系统细节(例如带有GNU扩展的POSIX兼容系统或带有dos的DOS系统) .h 库)。环境也是库版本,因为它们的 api 可以更改,并且也像环境变量(好吧,如果环境中存在这样的变量)。
知道“如果不同环境之间存在任何不兼容性”,您必须手动检查两个版本之间的所有更改。人们使用版本控制作为通知某些事情发生变化的可靠但糟糕的方式。然后,您必须查看文档,以人类可读的方式查看发生了什么变化。然后你必须查看源代码,看看到底发生了什么变化。
if some of the shared libraries would be upgraded like libpam, there would be chances that the binaries won't run without interposing the old libraries, is it likely that the api will be change so much?
首先请注意,大多数 UNIX 程序都遵循 GNU 许可证,该许可证规定:
THERE IS NO WARRANTY FOR THE PROGRAM
没有人会保证它在任何情况下都能工作。也就是说,可能是这样。可能不会。世界上有很多不同的库,它们是由不同的人编写的,而且它们都经常更改 api,所以它可能不起作用。它可能会起作用。这取决于。
为了确保 api 不会发生太大变化,聪明人写信给 standards 。和standards 。和standards 。和标准......
另一边是人们,即开发人员,他们免费完成所有这些艰苦的工作。他们需要更改 api,以便引入新的优秀功能或修复错误。所以他们稍微改变了 api。这可能会破坏依赖于该 api 的旧程序。
if the new releases was backward compatible, wouldn't be enough making a new dynamic link (ln) to the old name?
我这样做的次数比我愿意承认的要多(主要是用旧的 libpng 运行 eagle),而且大多数情况下它都是有效的。试试吧,(通常,在正常的unix下,以用户身份运行,具有良好的权限)最糟糕的情况可能是你的程序会出现段错误(好吧,在sudo下可能发生的最糟糕的情况是对你的硬件造成永久性损坏并删除您的所有数据)。
大多数(不是全部)GNU/Linux 系统使用 glibc 作为 C 标准库的实现。这应该是最稳定的 api,因为所有 C 程序都依赖它。还有它changes too而且它并不总是向后兼容。
关于c - 旧二进制文件上的 ldd 怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041607/
当路径不存在时运行 ldd 命令时,我得到的是“找不到文件”而不是路径。bash-3.2$ ldd curl libcurl.so.4 =>/usr/local/lib/libcurl.so.4 li
假设我有一个 A.so 文件,它的依赖项是从 ldd 中找到的 #ldd A [...] libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007faaf972
我在可执行文件上运行 truss 命令并得到以下输出: stat64("/net/xyzmachine/vol/tools/solx64/studio11/SUNWspro/lib/rw7/librt
我在使用库时遇到问题,尽管它的版本正确,但找不到它。 ldd /lib/libQt5Core.so linux-gate.so.1 (0xb77ac000) libpt
我正在尝试创建一个共享库 libddv3djava.so 我像这样编译 libddv3djava.so 的源代码: ~/Programming/intellijprojects/ddv3dbindin
我知道 ldd 只能将二进制作为其参数我在这里问的是如何使用二进制运行 ldd,比如 mybin,带有二进制参数。例如,mybin --myparam ./configfile.conf。 如果我为我
我不清楚为什么 ldd 在找不到依赖项时多次向我显示同一个共享库。在一个使用 boost 的小可执行文件中,输出是: libboost_chrono.so.1.49.0 => not found li
我在 Open MPI 创建的可执行文件上运行了 ldd 命令。它显示了对 libpthread.so 的引用使用 LD_PRELOAD 变量,我创建了自己的 pthread_create 实现,但从
假设我们有一个名为 utils.so 的共享库。它可能包含 undefined symbol 。还假设 ldd 报告该库依赖于其他一些库: $ ldd utils.so library1.so
我正在 Linux (Ubuntu 11) 下编译 2 个共享库(“A”、“B”) 库“B”正在使用库“A”的导出函数(与 -lA 静态链接) 但是当我在“B”上运行 ldd 时,我只有* linux
我正在尝试编译项目。它编译成功。我的make命令退出,状态代码为 0并且没有显示错误。 但是,该项目无法运行,当我运行 ldd -d 时它显示我有两个库未找到。 >ldd -d output_fil
为什么给ldd可执行文件名时没有出现动态加载的库?这是真的吗?因为我给的时候找不到。这可能是因为动态加载和动态链接。 请帮我解决这个问题,如果您需要任何进一步的详细信息,请告诉我。 输出如下。 ldd
如果问题很基础,请直截了当。 ldd 命令显示可执行文件上的依赖库是我所知道的。在可执行文件中,这些信息保存在哪里? 最佳答案 这存储在 ELF 的 .dynamic 部分中可执行。参见 ELF-64
我有一个二进制文件,其中 ldd 显示出意外的依赖关系和 libicuuc(来自“icu”)。 #ldd A [...] libxml2.so.2 => /usr/lib64/libxml2.so.2
我有一个使用一堆 .so 文件的二进制文件。 bash-3.00$ file foo foo: ELF 32-bit LSB executable, Intel 80386, version 1 (S
ldd如何知道这取决于 libc.so.6 ,不是 libc.so.5或 libc.so.7 ? libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
Version information: ./VideoEncoderFilter.so: libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/l
我试图为 Linux 部署 Qt/QML 应用程序。发生了一些奇怪的事情,目标系统提示 libQt5Widget.so.5 中 undefined symbol ,而我已经复制了 ldd -r 结果中
如何从可执行文件的 ldd 输出中复制所有共享对象? 我正在寻找这样的东西,但这是用于 find 的,我需要 ldd: find -name "*python3.7*" -exec cp "{}" /
由于使用 Gentoo,更新程序后经常会链接到旧版本的库。通常,revdep-rebuild 有助于解决这个问题,但这次它是对 python 库的依赖,而 python-updater 不会选择它。
我是一名优秀的程序员,十分优秀!