【问题标题】:Why is gdbserver not found when using the Linaro external toolchain in Buildroot?为什么在Buildroot中使用Linaro外部工具链时找不到gdbserver?
【发布时间】:2019-01-02 10:19:33
【问题描述】:

我将 Buildroot 2018.02 用于 IMX6 板和基于 GCC 2017.11 (GCC 7.2.1) 的 Linaro 外部工具链 2017.11

现在我正在目标上添加一些调试工具,例如 gdbserver。

如果我使用选项 "Build cross gdb for the host" 并在 "Target Packages > Debugging,.." 菜单中选择主机的 gdb 调试器版本 7.11.x 以及 gdbserver (BR2_PACKAGE_GDB_SERVER),一切正常。 Buildroot 中还有其他版本的 gdb,例如 7.12.x 和 8.0.x。

但是,对于外部工具链,推荐的方法是: https://github.com/mbats/eclipse-buildroot-bundle/wiki/Tutorial-:-How-to-debug-a-remote-application-%3F 表示只激活 Buildroot 中的 "Copy gdb server to the Target" 选项(虽然帖子有点旧)

我注意到BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM 描述说 Linaro gdb 基于 gdb 8.0,所以是我使用的更新版本 (7.11.x)。

但是当我这样做时,我在目标板上有以下消息:

# gdbserver
-sh: gdbserver: not found

尽管有以下几点:

# which gdbserver
/usr/bin/gdbserver

gdbserver 二进制文件在目标上。

如何在 Buildroot 中解决这个问题?

此外,我还有两个问题:

  1. 拥有 Linaro 工具链 gdb 真的很重要吗? 在我的情况下,“开箱即用”的 gdb 7.11.x?
  2. 如果我不使用 Linaro gdb,那么我应该使用 gdb 版本吗 8.0.x(因为 Linaro 版本是基于 GDB 的 8.0 的)?

感谢您的帮助。

【问题讨论】:

  • 它可能是一个损坏的符号链接,或者 gdbserver 是一个带有无效 shebang 行的 shellscript。 ls- l /usr/bin/gdbserverfile /usr/bin/gdbserver 可能有助于调试它。除此之外,您的外部工具链是否包含 gdbserver 二进制文件?
  • ls -l 输出为 -rwxr-xr-x 1 root root 822000 Dec 31 2018 /usr/bin/gdbserver 。这不是 shell 脚本或断开的链接。 Buildroot 使用的包是 gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz 可以在这里找到releases.linaro.org/components/toolchain/binaries/7.2-2017.11/…。它包含一个 gdbserver 二进制文件和一个跨 gdb。
  • 输入/usr/bin/gdbserver 会导致错误消息吗?
  • 是的,错误信息是一样的
  • 尝试file /usr/bin/gdbserver 或尝试ldd 或计算readelf 的选项 - 通过找到一个被裁定为不可执行的文件可能会混淆地触发该错误消息,例如它位于格式错误,声称用于错误的 ABI 或依赖于不同的动态链接器。

标签: debugging gdb embedded-linux buildroot gdbserver


【解决方案1】:

Linaro 2017.11 工具链中的 gdbserver 二进制文件已损坏:它请求 /usr/lib/ld.so.1 作为程序解释器(见下文),但该程序解释器不存在。

您可以尝试创建符号链接/usr/lib/ld.so.1 -> /lib/ld-linux-armhf.so.3(如果可行,请将其添加到文件系统覆盖中)。或者,您可以通过将其放在可执行文件之前显式指定程序解释器,即/lib/ld-linux-armhf.so.3 /usr/bin/gdbserver

“程序解释器”是 ELF 文件的一个参数,它指向一个程序,该程序用于将 ELF 文件加载到内存中并开始执行它。程序解释器的主要职责是查找和加载程序需要的动态库。因此,它通常被称为“动态库加载器”,或ld.so。它与工具链一起构建和安装 - 特别是标准 C 库 (glibc)。当一个程序被链接时,链接器也会设置程序解释器(它是从libc.so复制而来的)。显然 Linaro 做了一些非常特别的事情,最终导致 gdbserver 可执行文件中出现错误的程序解释器。

【讨论】:

  • /usr/lib/ld.so.1 -> /lib/ld-linux-armhf.so.3/lib/ld-linux-armhf.so.3 /usr/bin/gdbserver 最终会出现段错误,但我想你是对的:Linaro gdbserver 已损坏,所以恐怕我无法在 Buildroot 中解决此问题。但是,如果我使用 gdb 7.11 或 8.0 而不是 Linaro 真的重要吗?
  • “更喜欢使用工具链自带的gdb/gdbserver”这句话是一种古老的传说。我不知道该声明背后的原因是什么,以及它是否仍然有效。 Buildroot 构建的 gdb/gdbserver 7.11 或 8.0 应该可以正常工作。
  • "当一个程序被链接时,链接器也会设置程序解释器(它是从libc.so复制而来的)。" -- 括号部分不正确。没有它你的答案会更好。
【解决方案2】:

# gdbserver
-sh: gdbserver: not found

尽管有以下几点:

# which gdbserver
/usr/bin/gdbserver

最有可能:

  1. gdbserver 是动态链接的二进制文件,并且
  2. 此二进制文件链接到使用的 ELF 解释器在目标系统上不存在。

使用readelf -l /usr/bin/gdbserver | grep -i interpreter 找出这个gdbserver 需要什么运行时加载程序。验证目标上不存在该文件。将其复制到目标并享受。

【讨论】:

  • 感谢您指出这一点。确实该文件不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2015-11-23
  • 2017-07-02
  • 2019-01-28
相关资源
最近更新 更多