Я пытаюсь отладить ядро Android Linux (это мой первый раз).по этой причине я скомпилировал его, используя следующие флаги
CONFIG_KALLSYMS
CONFIG_KALLSYMS_ALL
, к сожалению, я попытался скомпилировать ядро без KASLR, но оно не загрузилось (ни с отключением CONFIG_RANDOMIZE_BASE, ни с параметром nokaslr, настроенным в CONFIG_CMDLINE).по этой причине я решил отладить его с активированным KASLR.
После компиляции ядра я подключился к устройству с помощью adb и (после входа в систему как root) запустил следующую команду, чтобы получить базовый адресМодуль vmlinux
echo 1 > /proc/sys/kernel/kptr_restrict
cat /proc/kallsyms
как только была обнаружена функция starup_64, я добавил файл символов в сеанс GDB, используя следующую команду: add-symbol-file PATH_SYMBOL BASE_ADDRESS И это работает как чудо!
проблема теперь в том, что я не могу отладить функцию, потому что, хотя точка останова правильно срабатывает, когда я пытаюсь перейти к следующей инструкции, происходит много IRQ (или прерывание по таймеру), и неожиданноотладчик перейти к другой функции.
например:
Thread 2 hit Breakpoint 2, binder_ioctl (filp=0xffff8ba8a804e700, cmd=3224396289, arg=4097219240) at drivers/android/binder.c:4777
4777 {
(gdb) n
read_hpet (cs=<optimized out>) at arch/x86/kernel/hpet.c:814
814 new.value = hpet_readl(HPET_COUNTER);
(gdb) bt
#0 read_hpet (cs=<optimized out>) at arch/x86/kernel/hpet.c:814
#1 0xffffffffab09ea79 in tk_clock_read (tkr=<optimized out>) at kernel/time/timekeeping.c:142
#2 timekeeping_get_delta (tkr=<optimized out>) at kernel/time/timekeeping.c:236
#3 timekeeping_get_ns (tkr=<optimized out>) at kernel/time/timekeeping.c:342
#4 ktime_get_update_offsets_now (cwsseq=0x46 <irq_stack_union+70>, offs_real=0xffff8ba8bfd1ba68, offs_boot=0x1d8234f500000000, offs_tai=0x1 <irq_stack_union+1>) at kernel/time/timekeeping.c:2231
#5 0xffffffffab09c4b8 in hrtimer_update_base (base=<optimized out>) at kernel/time/hrtimer.c:521
#6 hrtimer_interrupt (dev=<optimized out>) at kernel/time/hrtimer.c:1345
#7 0xffffffffab802444 in local_apic_timer_interrupt () at arch/x86/kernel/apic/apic.c:1037
#8 smp_apic_timer_interrupt (regs=<optimized out>) at arch/x86/kernel/apic/apic.c:1062
#9 0xffffffffab8019ed in apic_timer_interrupt () at arch/x86/entry/entry_64.S:787
#10 0xffff9de100e73e18 in ?? ()
#11 0x0000000000000000 in ?? ()
или
Thread 2 hit Breakpoint 2, binder_ioctl (filp=0xffff8ba89aaed000, cmd=3224396289, arg=4044769960) at drivers/android/binder.c:4777
4777 {
(gdb) n
goldfish_pipe_interrupt (irq=<optimized out>, dev_id=0xffff8ba8aeeb1c18) at drivers/platform/goldfish/goldfish_pipe_v2.c:677
677 if (count == 0) {
(gdb) bt
#0 goldfish_pipe_interrupt (irq=<optimized out>, dev_id=0xffff8ba8aeeb1c18) at drivers/platform/goldfish/goldfish_pipe_v2.c:677
#1 0xffffffffab08a0bd in __handle_irq_event_percpu (desc=0xffff8ba8aefb5600, flags=0xffff8ba8bfd03f64) at kernel/irq/handle.c:147
#2 0xffffffffab08a1df in handle_irq_event_percpu (desc=0xffff8ba8aefb5600) at kernel/irq/handle.c:187
#3 0xffffffffab08a24c in handle_irq_event (desc=0xffff8ba8aefb5600) at kernel/irq/handle.c:204
#4 0xffffffffab08d5ad in handle_edge_irq (desc=0xffff8ba8aefb5600) at kernel/irq/chip.c:770
#5 0xffffffffab015d8e in generic_handle_irq_desc (desc=<optimized out>) at ./include/linux/irqdesc.h:158
#6 handle_irq (desc=<optimized out>, regs=<optimized out>) at arch/x86/kernel/irq_64.c:78
#7 0xffffffffab801e29 in do_IRQ (regs=0xffff9de100fb3e18) at arch/x86/kernel/irq.c:230
#8 0xffffffffab80093d in common_interrupt () at arch/x86/entry/entry_64.S:571
#9 0xffff9de100fb3e18 in ?? ()
#10 0x0000000000000000 in ?? ()
Я читал о lx-скриптах, которые помогают отлаживать ядро, но я не смогне используйте его против ядра с активированным KASLR.
Я собираю ядро 4.14.72 и использую эмулятор, извлеченный из репозиториев AOSP (но я полагаю, что проблема связана с отсутствующими параметрами конфигурации во время компиляции ядра или каким-либо параметром gdb).