vmlinux ELF finden Offsets für Mitglieder einer bestimmten Struktur
Frage
In dem Linux-Kernel, ich brauche die Versätze von Membervariablen einer Struktur zu finden, das verwendet wird. Zum Beispiel für die init_task die vom Typ task_struct ist, würde ich die Offsets seiner pid und Aufgaben mag.
Ich habe nur die vmlinux Geschenk für diese. Ich kann mit dem Open-Source-Kernel-Code beziehen, aber es kann aus dem Build unterscheidet ich habe.
Ist es möglich, die Offsets ohne die Quelle zu bekommen?
EDIT:. Die vmlinux für ARM sind, und ich kann nicht immer in der Lage sein, C-Code auf dem Zielgerät ausgeführt
Lösung
Die Größe und Layout-Strukturen in den Debug-Informationen der kompilierten Objektdateien vorhanden ist (wenn Sie mit -g
kompilieren und Sie strip
nicht).
pahole ( aka "Poke-a-Loch", verpackt als dev-util/dwarves
in Gentoo) liest ein DWARF Debug-Informationen des Objekts zur Ausgabe von Informationen über „Löcher“ in Bauwerken -., die ein guter Ausgangspunkt für Sie sein
Andere Tipps
6,47 offsetof
GCC Geräte sowohl für C und C ++ eine syntaktische Erweiterung des offsetof Makro zu implementieren.
primary:
"__builtin_offsetof" "(" typename "," offsetof_member_designator ")"
offsetof_member_designator:
identifier
| offsetof_member_designator "." identifier
| offsetof_member_designator "[" expr "]"
Diese Erweiterung ist ausreichend, so dass
#define offsetof(type, member) __builtin_offsetof (type, member)
ist eine geeignete Definition des offsetof Makro. In C ++ kann Typ abhängig sein. In jedem Fall wird das Mitglied eines einzigen Identifizierers bestehen kann, oder eine Folge von Element greift und Array-Referenzen.
Gefunden eine andere Lösung mit Arm-EABI-GDB -. Ich kann Drucken und init_task und Print & init_task.pid tun und die Differenz wird der Offset