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

时间:2019-01-02 10:19:33

标签: debugging gdb embedded-linux buildroot gdbserver

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

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

如果我使用选项"Build cross gdb for the host"并在BR2_PACKAGE_GDB_SERVER菜单中为主机选择gdb调试器版本7.11.x以及gdbserver("Target Packages > Debugging,.."),一切都很好。 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)?

谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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可执行文件中的程序解释器错误。

答案 1 :(得分:2)

  

# gdbserver
  -sh: gdbserver: not found

     

后视以下内容:

     

# which gdbserver
  /usr/bin/gdbserver

最有可能:

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

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