vmlinux ELF находит смещения для членов данной структуры
Вопрос
В ядре 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, и разница заключается в смещении.