背景
我正在使用自定义工具链(基于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
。但是由于行为不同,当文件可用时,似乎主机会向目标提供一些反馈。
答案 0 :(得分:1)
调试主机上错误的ld.so二进制文件的使用如何影响目标上gdbserver中应用程序的执行?
好问题。
一种可能的解释:为了正确地跟踪例如在目标上加载了共享库,GDB设置了许多内部断点(这些断点在maintenance info breakpoints
输出中可见 - 它们具有负断点号)。
当你根本不提供本地文件时,GDB不知道在哪里设置这些断点,所以它没有(你不能在没有它们的情况下调试库初始化器)。
当您提供错误的本地文件时,GDB会在错误的位置设置断点...(通过覆盖GDB认为是指令的内容,但实际上是PLT重定位)。当加载器遇到这个被覆盖的重定位时,它会抱怨。