Как addr2line работает с виртуальными адресами для отладки в пространстве ядра? - PullRequest
0 голосов
/ 14 июля 2020

Я пробовал свои руки на addr2line, чтобы преобразовать значение регистра «p c» из ошибки ядра ( example ) в строку в коде ядра. Я считаю, что значение счетчика программы представляет собой виртуальный адрес.

Теперь этот пост в Stack Overflow говорит, что мы обычно предоставляем смещение для addr2line, а не виртуальный адрес. VA можно использовать только тогда, когда отключена рандомизация адресного пространства. Верно ли это и для ядра? Я считаю, что должен.

Этот встроенный Linux Конференц-разговор на слайде 14 также использует значение счетчика программы для перехода к строке кода, но я считаю, что это сработает только работают, когда рандомизация адресного пространства выключена. В противном случае, после инициализации виртуальной памяти, возможно, что ядро ​​будет перемещено случайным образом. В этом случае любой виртуальный адрес, выбранный из oops, не имеет смысла для addr2line. Это все теория. У меня сейчас 2 вопроса:

  1. Я правильно понял? Если нет, поправьте меня.
  2. Как отключить рандомизацию адресного пространства для ядра, чтобы можно было предсказать местоположение символа?

1 Ответ

1 голос
/ 14 июля 2020

Да, ваше понимание правильное.

У вас есть несколько вариантов:

  1. Полностью удалить поддержку KASLR, собрав ядро ​​с помощью CONFIG_RANDOMIZE_BASE=n Drasti c, не Рекомендую, если не для целей разработки.
  2. Загрузите ядро ​​с аргументом командной строки nokaslr. См. здесь для получения дополнительной информации.
  3. Вычислить вручную смещение адреса от начала сегмента ядра .text. Это не так просто, потребуется заранее знать базовый адрес или экстраполировать его из информации pani c. Определенно выполнимо с некоторыми grep + objdump +, возможно, еще некоторыми инструментами ELF, но довольно утомительно и требует много времени.

NB: конечно, пункты 1 и 2 требуют, чтобы ядро ​​было скомпилировано с отладкой символы для addr2line для выполнения своей работы.

См. также: this Linux kernel do c page .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...