vmlinux ELF находит смещения для членов данной структуры

StackOverflow https://stackoverflow.com/questions/1415745

  •  06-07-2019
  •  | 
  •  

Вопрос

В ядре Linux мне нужно найти смещения переменных-членов используемой структуры. Например, для init_task, который имеет тип task_struct, я хотел бы смещения его pid и задач.

У меня есть только vmlinux для этого. Я могу сослаться на код ядра с открытым исходным кодом, но он может отличаться от имеющейся у меня сборки.

Можно ли получить смещения без источника?

РЕДАКТИРОВАТЬ: vmlinux для ARM, и я не всегда могу запустить код C на целевом устройстве.

Это было полезно?

Решение

Размер и расположение структур присутствует в информации отладки скомпилированных объектных файлов (если вы компилируете с помощью -g и не strip ).

pahole ( aka "poke-a-hole", упакованный как dev-util / dwarves в Gentoo) считывает отладочную информацию DWARF объекта для вывода информации о "дырах" в структурах - это может быть хорошей отправной точкой для вас.

Другие советы

6.47 Offsetof

GCC реализует для C и C ++ синтаксическое расширение для реализации макроса offsetof.

 primary:
         "__builtin_offsetof" "(" typename "," offsetof_member_designator ")"

 offsetof_member_designator:
           identifier
         | offsetof_member_designator "." identifier
         | offsetof_member_designator "[" expr "]"

Это расширение достаточно для того, чтобы

 #define offsetof(type, member)  __builtin_offsetof (type, member)

является подходящим определением смещения макроса. В C ++ тип может быть зависимым. В любом случае элемент может состоять из одного идентификатора или последовательности обращений к элементу и ссылок на массив.

Нашел другое решение с помощью arm-eabi-gdb - я могу сделать print & init_task и print & init_task.pid, и разница заключается в смещении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top