Я пытаюсь использовать GDB для отладки ядра Linux zImage перед его распаковкой. Ядро работает с целью ARM, и у меня есть отладчик JTAG, подключенный к нему с заглушкой сервера GDB. Цель должна загрузить загрузчик. Загрузочный загрузчик считывает изображение ядра с флэш-памяти и помещает его в ОЗУ по адресу 0x20008000
, затем переходит в это место.Этап декомпрессии ядра Debug Linux
Я начал GDB и подключен к удаленной цели, то я использую add-symbol-file
команду GDB как так:
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, поэтому некоторые строки оптимизируются. Вы уверены, что там где-то нет. –
Код декомпрессора является относительным. Он может даже копировать себя из одного региона в другой. Загрузочный загрузчик может поместить его туда, где находится декомпрессированная цель; поэтому он должен двигаться сам. Я сомневаюсь, что у вас будут хорошие времена с использованием JTAG с фиксированными символами. Я не знаю, можете ли вы * переместить * с GDB каким-то образом. –