Полагаю, модуль построен с включенной отладочной информацией.Если это так, вы можете использовать gdb или objdump, чтобы узнать, какому исходному файлу и строке принадлежит каждый адрес.Примерно так:
$ gdb "$(modinfo -n my_module)"
(gdb) list *(some_function+0x12c)
Gdb теперь сообщит имя исходного файла и строку в нем.
Вы можете сделать то же самое с objdump, но это немного большесложно.Сначала разберите модуль:
objdump -dSlr my_module.ko > my_module.disasm
При вызове с параметром -S
objdump будет включать строки источника в результирующий листинг, где это необходимо.
Теперь вы можете прокрутить список вниз до кода some_function
, найти инструкцию со смещением 0x12c от начала функции.Строка источника будет указана над ней.
РЕДАКТИРОВАТЬ:
После многих экспериментов я обнаружил, что хотя addr2line
действительно может использоваться для модулей ядра, eu-addr2line
(аналогичный инструмент от elfutils) кажется более надежным.То есть иногда addr2line
выводит неправильные строки исходного текста, но eu-add2line
делает все правильно.
Чтобы использовать eu-addr2line
, может потребоваться установить библиотеки libdw и libebl, если они еще не установлены вместе с elfutils.
Использование аналогично addr2line
:
eu-addr2line -f -e <path_to_the_module> -j <section_name> <offset_in_section>
Если отладочная информация для модуля ядра хранится в отдельном файле (это часто относится к ядрам, предоставляемым основными дистрибутивами Linux), путь к этому файлу следует использовать как <path_to_the_module>
.