【发布时间】:2012-03-23 11:11:15
【问题描述】:
我正在尝试使用 GDB 在解压缩 Linux 内核 zImage 之前对其进行调试。内核在 ARM 目标上运行,我有一个 JTAG 调试器与一个 GDB 服务器存根连接到它。目标必须加载引导加载程序。引导加载程序从闪存读取内核映像并将其放入 RAM 中的0x20008000,然后分支到该位置。
我已经启动 GDB 并连接到远程目标,然后我像这样使用 GDB 的add-symbol-file 命令:
add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
当我为该地址设置断点时,它确实会在正确的位置进行陷阱 - 就在它分支到内核时。但是,GDB 显示来自arch/arm/boot/compressed/head.S 的错误行。落后4行。我该如何解决这个问题?
我还尝试将-s section addr 选项添加到add-symbol-file 和-s .start 0x20008000;这会导致完全相同的问题。
【问题讨论】:
-
首先确保你有一个兼容的 gcc 和 gdb,最好来自相同的工具链版本。另外,要知道 Linux 内核是用 -O2 编译的,所以有些行会得到优化。你确定那里没有任何 .align 关键字吗?
-
解压器代码都是PC相关的。它甚至可以将自己从一个区域复制到另一个区域。引导加载程序可能会将其放在解压目标所在的位置;所以它必须自己移动。我怀疑您是否会在使用带有固定符号的 JTAG 时玩得开心。我不知道您是否可以通过 GDB 以某种方式重新定位。
-
似乎可以很好地使用 Lauterbach T32 调试解压
标签: linux-kernel gdb embedded arm