问题标签 [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.
gcc - 将 SO 链接到 libbfd
为了获得人类可读的回溯,我需要将我的 SO 与 libbfd 链接起来。
针对 libbfd.a 的静态链接失败,因为它不是用 -fPIC 编译的,所以据我所知,它只能参与可执行文件。
虽然链接 libbfd.so 也会带来一些麻烦。
我需要在 Ubuntu-14.04 和 Debian Wheezy 7.8 上进行编译,并且它们具有不相交的 binutils 版本集。特别是 Ubuntu 有 2.24,Debian 有 2.22 和 2.25。问题是,gcc 不想使用符号链接的名称 libbfd.so 来引用它,而是使用 SONAME。所以我在依赖项中以 libbfd-2.24-system.so 或 libbfd-2.25-system.so 结尾。
现在我看到了几种方法:
有一些隐藏标志允许在链接期间覆盖 SONAME。这是首选路径
除了手动编译 libbfd 之外,我别无他法。我会尽可能地回避这一点。
手动 dlopen+dlsym 满足我的一切需求。
我阅读了针对符号链接的答案gcc 链接共享库,但它建议更改我无法做到的 SONAME。
有什么建议么?
谢谢。
编辑:似乎 Ubuntu 存储库中的几乎所有静态库都不是与位置无关的。猜不透为什么。由于无法覆盖 SONAME,它使事情变得更加复杂。
linux - 未定义对符号“dlsym@@GLIBC_2.4”的引用
首先,请记住,我是 linux 新手。我在编译我的项目时遇到问题。我不断收到以下错误:
/usr/bin/ld: CMakeFiles/Robot.dir/source/ModuleHandler.cpp.o: 未定义引用符号'dlsym@@GLIBC_2.4' //lib/arm-linux-gnueabihf/libdl.so.2: 错误添加符号:命令行collect2中缺少DSO:ld返回1退出状态
首先正确的目录是:/usr/lib/arm-linux-gnueabihf/libdl.so
而不是://lib/arm-linux-gnueabihf/libdl.so
我试过更新我的 ldconfig.conf 文件,设置LD_LIBRARY_PATH
,使用ldd -r
无济于事。
CMAKE 用于创建 make 文件。
我以前编译没有问题。它是在我进行 apt-get 升级或尝试从 VS 交叉编译之后开始的。
任何建议将不胜感激!
//弥敦道
kernel - 信号量不会在 Ioctl 的上下文中唤醒
我有一个正在处理的设备驱动程序。它是这样工作的:
我这样做是因为我的硬件还没有准备好,所以我还没有可以与之交谈的设备。
问题:当我发送 ioctl cmd 0x01 让驱动程序进入睡眠状态时,我的用户应用程序会休眠/挂起,但是当我发送 ioctl cmd 0x02 时,它不会收到唤醒信号。我打印出信号量计数以查看发生了什么,并注意到对于每种情况,my_sem.count == 0 在调用 down()/up() 之前。
一般来说,我不明白的驱动程序是什么?对于我随用户应用程序发送的每个 ioctl cmd,我的 ioctl 处理程序似乎都有不同的 my_sem 副本。当我为 up() 发送几个连续的 cmd 时,我希望看到调用 up() 的每个 ioctl cmd 的计数增加,但它总是在 up() 之前打印出零,在 up() 之后打印出一个。
c - 获取库中使用的库列表
我正在尝试在我的机器上编译一个库“ A ”,并且我在标准路径以及本地/自定义路径中安装了A 的“C”和“D”可选依赖项,自定义路径( -O3)处的库是与标准路径( -O0)处的库相比更优化。
我通过使用 LDFLAGS(-L) 和 LIBS (-l)提供本地库的路径来编译库“A” 。并生成库(libA.so 或 libA.a)!
ldd 是一个工具,它可以判断哪些库与可执行文件链接。
- 是否有一个等效的工具可以判断哪些库链接到该库(即 ldd libscalapack.a )?
- 有没有办法确保在创建库 A(libA.so/libA.a)时使用可选库库?
- 有没有办法确定在编译时使用了哪些标准库和本地库?
热切期待您的回复。
linux - 使用 RPATH 构建 OpenSSL?
我有 Ubuntu 14.04。它带有 openssl 1.0.1f。我想安装另一个 openssl 版本(1.0.2),我想自己编译。
我配置如下:
安装后,当我检查二进制文件时ldd openssl
,结果是:
看起来不错。但是当我检查 ldd 时libssl.so
,结果是:
它仍然使用系统版本的 libcrypto。我尝试了不同的构建方式,但结果始终保持不变。
我的问题是如何以某种方式配置构建,它可以硬编码共享库的所有二进制和库依赖项,而无需使用LD_LIBRARY_PATH
,或类似的东西。
shared-libraries - Linux ELF 文件:如何获取属于导入函数的共享对象
给定一个动态链接的 ELF 二进制文件,例如/bin/less
.
在二进制文件中,有一个对共享库提供的函数的调用,例如strcpy()
如何找出strcp
函数是从哪个共享库/共享对象中获取的?换句话说,我想得到对 func_name/shared_obj_name.so。
迈克尔·斯莱德在回答这篇文章时写道:
ELF 文件没有指定哪些符号来自哪些库;它只是将共享库列表添加到 ELF 二进制文件中,并让链接器在库中查找符号。
然而,必须有一种方法来收集所需的信息(使用链接器)。在我的情况下,执行二进制文件和 ltrace 不是一个选项。到目前为止我尝试了什么:
我试过objdump -T /bin/less | grep strcpy
这给了我:
这既不是明确的,也没有给我.so
文件的名称。
运行ldd /bin/less
,返回:
让我认为“GLIBC_2.2.5”对应于libc.so.6
如何以编程方式找到(导入的)函数对应的共享对象(.so 文件)?
c - 几个可执行文件共享的动态库的常用功能
我有一个问题我不知道如何解决。
我曾经编写过一个程序(Python 脚本),它返回一个动态库列表,其中包含所有使用它们的可执行文件。(我的脚本使用 ldd 实用程序)。
现在,我想做一个程序,它会返回动态库的函数列表以及所有使用它们的可执行文件。但我该怎么做?
(我认为主要问题是库是构建的,为此我需要源代码,对吧?)
谢谢 !!JC
linux - 使用 bash 脚本提取 ldd --version
我正在尝试通过提取ldd --version
输出来验证 glibc 版本。这是来自 Ubuntu 机器的示例:
这是来自 CentOS 6.5 机器的另一个:
谢谢,
克里斯
linux - LLVM IR 中的哪个代码在“main()”之前运行?
有谁知道之前将执行哪个 LLVM IR 代码的一般规则main
?
使用 Clang++ 3.6 时,似乎全局类变量的构造函数通过目标文件的“.text.startup”部分中的函数调用。例如:
从这个例子中,我猜我应该寻找那些指定section ".text.startup"
.
我有两个理由怀疑我的理论是正确的:
我在我的 LLVM IR 文件中看不到任何其他内容(
.ll)
建议应该首先运行全局对象构造函数,如果我们假设 LLVM 没有嗅探 C++ 特定的函数名称,例如“__cxx_global_var_init”。所以这section ".text.startup"
是唯一明显的方法说代码应该在 before 之前运行main()
。但即使这是正确的,我们已经确定了导致函数在 before 之前运行的充分条件main()
,但还没有证明它是 LLVM IR 中导致函数在 before 之前运行的唯一方法main()
。在某些情况下, Gnu 链接器将使用该
.text
节中的第一条指令作为程序入口点。 这篇关于 Raspberry Pi 编程的文章描述了使.text.startup
内容成为程序部分中出现的第一个代码体.text
,作为使.text.startup
代码首先运行的一种方法。
不幸的是,我没有找到太多其他东西来支持我的理论:
当我 grep 字符串“.startup”的 LLVM 3.6 源代码时,我只能在 LLVM 代码的 CLang 特定部分中找到它。为了使我的理论正确,我希望在 LLVM 代码的其他部分也能找到该字符串;特别是 C++ 前端之外的部分。
这篇关于C++ 中数据初始化的文章似乎暗示“.text.startup”有一个特殊的作用,但它并没有直接说 Linux 程序加载器实际上是在寻找该名称的一部分。即使是这样,我也会惊讶地发现一个可能特定于 Linux 的部分名称在平台中立的 LLVM IR 中具有特殊含义。
Linux 3.13.0 源代码似乎不包含字符串“.startup”,这表明程序加载器没有嗅探名为“.text.startup”的部分。
c++ - 对带有参数的二进制文件运行 ldd
我知道ldd
只能将二进制文件作为其参数,我在这里要问的是如何使用二进制文件运行ldd
,例如,mybin
带有二进制文件的参数。例如,mybin --myparam ./configfile.conf
.
如果我为我的二进制文件添加 conf 文件,链接器会有所不同,因为它会在运行时使用插件的共享对象文件加载一些插件,plugin1.so
就像这样。我有一些未定义的参考问题,但我仍然不知道.so
我丢失了哪个文件。
如果我运行ldd ./mybin
,所有内容都已链接并且运行普通二进制文件就可以了。一旦我为我的二进制文件添加了 conf 文件,让它加载一些插件共享库,那么我的二进制文件将在加载这些库时报告错误(编码异常抛出,带有一些undefined reference
错误消息)。
因此,如果有办法运行这样ldd
的mybin --myparam ./a.file
东西会很有帮助。