GDB远程调试:影响远程目标的执行

时间:2014-10-20 15:01:31

标签: debugging gdb shared-libraries remote-debugging gdbserver

背景

我正在使用自定义工具链(基于Yocto和gcc 4.7和gdb 7.5)的ARM设备,并使用Eclipse CDT作为调试器前端进行远程gdb调试。最近我遇到的问题是,由于主机gdb连接到目标时出现的错误(由目标上的gdbserver报告),我无法在远程目标上调试特定的可执行文件:

error while loading shared libraries: unexpected PLT reloc type 0xf0

我终于可以找到目标和主机上动态链接库/lib/ld-2.16.so的二进制文件不匹配的问题,通过在gdb中调用set sysroot,我使用了本地存储的根目录与工具链一起生成的目标。

保持本地文件与远程文件同步,但我也可以省略设置sysroot以至少调试可执行文件本身。这引导我进入以下

问题

调试主机上错误的ld.so二进制文件的使用如何影响目标上gdbserver中应用程序的执行?我宁愿期望我在主机上得到错误的调试信息,因为可执行文件在目标上运行时没有问题(在gdbserver中)如果主机上根本没有ld.so。但是由于行为不同,当文件可用时,似乎主机会向目标提供一些反馈。

1 个答案:

答案 0 :(得分:1)

  

调试主机上错误的ld.so二进制文件的使用如何影响目标上gdbserver中应用程序的执行?

好问题。

一种可能的解释:为了正确地跟踪例如在目标上加载了共享库,GDB设置了许多内部断点(这些断点在maintenance info breakpoints输出中可见 - 它们具有负断点号)。

当你根本不提供本地文件时,GDB不知道在哪里设置这些断点,所以它没有(你不能在没有它们的情况下调试库初始化器)。

当您提供错误的本地文件时,GDB会在错误的位置设置断点...(通过覆盖GDB认为是指令的内容,但实际上是PLT重定位)。当加载器遇到这个被覆盖的重定位时,它会抱怨。