Question

Dans le noyau Linux, je dois rechercher les décalages des variables membres d'une structure utilisée. Par exemple, pour init_task qui est du type task_struct, je voudrais les décalages de son pid et de ses tâches.

Je ne dispose que de vmlinux pour cela. Je peux faire référence au code du noyau open source, mais il peut différer de la version que j'ai.

Est-il possible d'obtenir les compensations sans la source?

EDIT: vmlinux est destiné à ARM et il est possible que je ne puisse pas toujours exécuter le code C sur le périphérique cible.

Était-ce utile?

La solution

La taille et la disposition des structures sont présentes dans les informations de débogage des fichiers objet compilés (si vous compilez avec -g et que strip ne le fait pas).

pahole ( aka "poke-a-hole", emballé sous la forme dev-util / dwarves dans Gentoo) lit les informations de débogage DWARF d'un objet afin de générer des informations sur les "trous". dans les structures - cela peut être un bon point de départ pour vous.

Autres conseils

6.47 décalage de

GCC implémente pour C et C ++ une extension syntaxique pour implémenter la macro offsetof.

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

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

Cette extension est suffisante pour que

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

est une définition appropriée du décalage de la macro. En C ++, le type peut être dépendant. Dans les deux cas, le membre peut être constitué d’un identifiant unique ou d’une séquence d’accès au membre et de références à un tableau.

Nous avons trouvé une autre solution avec arm-eabi-gdb. Je peux imprimer et lancer init_task et imprimer dans & init_task.pid. La différence est le décalage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top