我正在尝试为定制芯片编写 GDB 存根。由于目标是自定义的,因此它需要一个 GDB 存根/服务器来处理 GDB 的请求。我似乎能够处理 GDB 在最初连接时给出的所有请求。然而,一个问题是 GDB 尝试读取接近零的地址。由于该芯片上不可能存在接近零的地址,因此这就产生了一个问题。
那么,问题是 GDB 在最初连接到目标时尝试从内存中读取什么?依赖是ELF文件还是更简单的东西?
我希望了解 GDB 在初始连接时需要从内存中读取的内容将为我指明正确的方向(也许我在 ELF 文件中映射了错误的内容?)。
我尝试查看 elf 文件,但不确定它会告诉我什么。
在 GNU/Linux 系统上,当 GDB 连接到 GDB 服务器时,GDB 尝试读取内存有以下三个原因:
target remote
进行连接,则假定远程下级正在 GDB 连接点运行。 GDB 将读取 $pc
和 $sp
寄存器,然后从堆栈中查询信息以呈现初始停止(例如堆栈帧和参数值)。如果您的自定义目标是裸机设置,那么最可能的问题是您报告了虚假的
$pc
和/或 $sp
值,因此 GDB 尝试读取不应该读取的内存。
如果您不知道,您可以在 GDB 端
set debug remote on
让 GDB 报告其在远程目标方面正在执行的操作的详细信息,尽管这不会让您深入了解为什么做这些事情,但可能会有一点帮助。
另一个好的方法是只实现内存读取,并让远程给出答复,指示无法读取所请求的内存,然后 GDB 将(希望)给出一个有用的错误,指示读取失败时它试图执行的操作.