ELF vmlinux trova offset per i membri di una determinata struttura
Domanda
Nel kernel di Linux, ho bisogno di trovare gli offset delle variabili membro di una struttura che viene utilizzata. Ad esempio, per init_task che è di tipo task_struct, vorrei gli offset del suo pid e dei suoi compiti.
Ho solo il vmlinux presente per questo. Posso fare riferimento al codice del kernel open source, ma potrebbe differire dalla build che ho.
È possibile ottenere gli offset senza la fonte?
EDIT: vmlinux è per ARM e potrei non essere sempre in grado di eseguire il codice C sul dispositivo di destinazione.
Soluzione
La dimensione e il layout delle strutture sono presenti nelle informazioni di debug dei file degli oggetti compilati (se si compila con -g
e non strip
).
pahole ( aka "poke-a-hole", confezionato come dev-util / dwarves
in Gentoo) legge le informazioni di debug DWARF di un oggetto per generare informazioni su " fori " nelle strutture - potrebbe essere un buon punto di partenza per te.
Altri suggerimenti
6.47 Offsetof
GCC implementa per C e C ++ un'estensione sintattica per implementare la macro offsetof.
primary:
"__builtin_offsetof" "(" typename "," offsetof_member_designator ")"
offsetof_member_designator:
identifier
| offsetof_member_designator "." identifier
| offsetof_member_designator "[" expr "]"
Questa estensione è sufficiente tale che
#define offsetof(type, member) __builtin_offsetof (type, member)
è una definizione adatta della macro offsetof. In C ++, il tipo può dipendere. In entrambi i casi, il membro può essere costituito da un singolo identificatore o da una sequenza di accessi al membro e riferimenti di array.
Ho trovato un'altra soluzione con arm-eabi-gdb: posso fare print & amp; init_task e print & amp; init_task.pid e la differenza è l'offset.