问题标签 [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.

0 投票
1 回答
763 浏览

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 结尾。

现在我看到了几种方法:

  1. 有一些隐藏标志允许在链接期间覆盖 SONAME。这是首选路径

  2. 除了手动编译 libbfd 之外,我别无他法。我会尽可能地回避这一点。

  3. 手动 dlopen+dlsym 满足我的一切需求。

我阅读了针对符号链接的答案gcc 链接共享库,但它建议更改我无法做到的 SONAME。

有什么建议么?

谢谢。

编辑:似乎 Ubuntu 存储库中的几乎所有静态库都不是与位置无关的。猜不透为什么。由于无法覆盖 SONAME,它使事情变得更加复杂。

0 投票
2 回答
34685 浏览

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 交叉编译之后开始的。

任何建议将不胜感激!

//弥敦道

0 投票
1 回答
171 浏览

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() 之后打印出一个。

0 投票
1 回答
84 浏览

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)时使用可选库库?
  • 有没有办法确定在编译时使用了哪些标准库和本地库?

热切期待您的回复。

0 投票
2 回答
5501 浏览

linux - 使用 RPATH 构建 OpenSSL?

我有 Ubuntu 14.04。它带有 openssl 1.0.1f。我想安装另一个 openssl 版本(1.0.2),我想自己编译。

我配置如下:

安装后,当我检查二进制文件时ldd openssl,结果是:

看起来不错。但是当我检查 ldd 时libssl.so,结果是:

它仍然使用系统版本的 libcrypto。我尝试了不同的构建方式,但结果始终保持不变。

我的问题是如何以某种方式配置构建,它可以硬编码共享库的所有二进制和库依赖项,而无需使用LD_LIBRARY_PATH,或类似的东西。

0 投票
1 回答
2157 浏览

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 文件)?

0 投票
1 回答
38 浏览

c - 几个可执行文件共享的动态库的常用功能

我有一个问题我不知道如何解决。

我曾经编写过一个程序(Python 脚本),它返回一个动态库列表,其中包含所有使用它们的可执行文件。(我的脚本使用 ldd 实用程序)。

现在,我想做一个程序,它会返回动态库的函数列表以及所有使用它们的可执行文件。但我该怎么做?

(我认为主要问题是库是构建的,为此我需要源代码,对吧?)

谢谢 !!JC

0 投票
2 回答
810 浏览

linux - 使用 bash 脚本提取 ldd --version

我正在尝试通过提取ldd --version输出来验证 glibc 版本。这是来自 Ubuntu 机器的示例:

这是来自 CentOS 6.5 机器的另一个:

谢谢,

克里斯

0 投票
1 回答
1937 浏览

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”的部分。

0 投票
1 回答
1147 浏览

c++ - 对带有参数的二进制文件运行 ldd

我知道ldd只能将二进制文件作为其参数,我在这里要问的是如何使用二进制文件运行ldd,例如,mybin带有二进制文件的参数。例如,mybin --myparam ./configfile.conf.

如果我为我的二进制文件添加 conf 文件,链接器会有所不同,因为它会在运行时使用插件的共享对象文件加载一些插件,plugin1.so就像这样。我有一些未定义的参考问题,但我仍然不知道.so我丢失了哪个文件。

如果我运行ldd ./mybin,所有内容都已链接并且运行普通二进制文件就可以了。一旦我为我的二进制文件添加了 conf 文件,让它加载一些插件共享库,那么我的二进制文件将在加载这些库时报告错误(编码异常抛出,带有一些undefined reference错误消息)。

因此,如果有办法运行这样lddmybin --myparam ./a.file东西会很有帮助。