为什么在 Buildroot 中使用 Linaro 外部工具链时找不到 gdbserver?

Why is gdbserver not found when using the Linaro external toolchain in Buildroot?

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

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

如果我使用选项 "Build cross gdb for the host" 并为主机选择 gdb 调试器版本 7.11.x 以及 [=14] 中的 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"选项(虽然post有点旧)

我注意到 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 在我的例子中有效 "out of the box" ?
  2. 如果我不使用 Linaro gdb 那么我应该使用 gdb 版本吗 8.0.x(因为Linaro版本是基于GDB的8.0)?

感谢您的帮助。

# gdbserver
-sh: gdbserver: not found

depsite the following :

# which gdbserver
/usr/bin/gdbserver

最有可能:

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

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

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.

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