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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top