Как GDB находит символ функции при возврате в MIPS Linux? - PullRequest
2 голосов
/ 27 июня 2009

Я пытаюсь реализовать функцию для отслеживания сбойного пользовательского пространства в ядре. Поскольку я работаю в Kernel, я не могу позволить себе роскошь каких-либо библиотек, а функция обратной трассировки не поддерживает архитектуру MIPS. Мне просто интересно, могу ли я подражать тому, что делает GDB. Версия ядра - 2.6.21.

Ответы [ 2 ]

1 голос
/ 27 июня 2009

Я думаю, что вы можете сослаться на реализацию oprofile .

Oprofile использует frame-pointer для получения информации обратной трассировки, поэтому он требует, чтобы приложения пользовательского пространства и связанные с ним библиотеки создавались с включенным frame-pointer. (Опция "- fno-omit-frame-pointer").

Другой способ состоит в том, что если пользовательские приложения содержат отладочную информацию, вам может потребоваться проверить информацию DWARF пользовательского приложения, информация о кадре вызова DWARF предоставляет отладчику достаточно информации о том, как вызывается функция, так что он может найти каждый из аргументов функции, найти текущий кадр вызова и найти кадр вызова для вызывающей информации.

Если вы хотите просто сканировать информацию обратной трассировки без поддержки «указателя кадра» или какой-либо отладочной информации, то вам нужно проверить инструкцию mips пользовательского приложения, пройтись по объектам дочернего контекста (SP, IP, RP), чтобы получить родительский контекст (SP, IP, RP) по спецификации mips ABI, это немного сложно и отнимает много времени, так как вам приходится разбирать много инструкций в памяти, но это работает неплохо. Например, для многих routie в начале статьи есть инструкция, подобная add sp, sp, -32, и вы будете знать, что p родительского элемента равен текущему sp плюс 32.

Второй и третий способ реализовать его самостоятельно, так как вы работаете в ядре.

1 голос
/ 27 июня 2009

Основной файл находится в формате ELF . Это стандарт, который доступен на многих веб-сайтах всего в одном гугле.

ОДНАКО, этот формат файла не является trival. Много причуд и битов. Любой разумный человек должен использовать стороннюю библиотеку. Если вы действительно хотите это сделать, начните с libelf и readelf. и желаю удачи.

...