0

如果您对此有答案或有更多信息,我将不胜感激。我正在听从这里的建议,通过发布这个问题然后提供我已经找到的答案来提供一些不请自来的帮助。

我有一个裸机 ARM 板,我正在为它构建一个跨工具链,来自 GNU binutils、gcc 和 gdb 的源代码,以及 SourceWare 的 Newlib。我让这四个工作并将 DoNothing.c 交叉构建到 ELF 文件中 - 但我无法用它来反汇编它:

 $ arm-none-eabi-objdump -S DoNothing.elf

错误是:

 $ arm-none-eabi-objdump: error while loading shared libraries: libdebuginfod.so.1: cannot open shared object file: No such file or directory

我会跟进解决方案。

4

1 回答 1

0

错误是正确的 - 我的系统没有安装 libdebuginfod.so.1 - 但我有另一个跨 binutils,从二进制文件安装到不同的目标,它的 objdump -S 在同一主机上工作正常。为什么一个 objdump 构建会抱怨缺少该共享库,而显然并非所有 objdump 构建都需要它?

首先,我尝试重建交叉 binutils,将 --without-debuginfod 指定为配置选项。没有变化,这似乎很奇怪:当然,这应该构建不仅不使用 debuginfod 并且不以任何方式依赖它的工具。(如果有人可以回答这个问题,或者指出我误解了什么,它可能会对人们有所帮助。)

接下来我认为 debuginfod 是不可避免的(至少对于我从源代码构建的交叉工具),所以我会安装它以消除错误。它是 elfutils 软件包的一个组件,但安装适用于我的 Ubuntu 20.04 系统的最新 elfutils 并没有带来 libdebuginfod.so.1。

我为 Arch Linux 找到了后来的一个,它的包内容表明它会 - 但它的包格式与 Ubuntu 不匹配,安装它会涉及很多工作。相反,我选择从Arch Linux 源代码包构建它。但是,在其上运行 ./configure 会出现一些非常相似的错误:

 configure: checking libdebuginfod dependencies, --disable-libdebuginfod or --enable-libdebuginfo=dummy to skip
 ...
 configure: error: dependencies not found, use --disable-libdebuginfod to disable or --enable-libdebuginfod=dummy to build a (bootstrap) dummy library.

这些建议的任何组合都不会允许配置 elfutils-0.182 运行完成。

问题当然是我自己缺乏理解。解决方案来自Linux From Scratch项目:有效的方法是使用两个建议的选项进行配置,如下所示:

$ ./configure --prefix=/usr                \
              --disable-debuginfod         \
              --enable-libdebuginfod=dummy \
              --libdir=/lib

这给出了一个干净的配置;make 第一次工作,就像 make check 然后 sudo make install 一样,它当然根据需要安装了 libdebuginfod.so.1。然后我有一个 arm-none-eabi-objdump 可以反汇编交叉编译的 ELF 文件而不会抱怨。

于 2021-01-21T03:13:03.553 回答