2009-12-23 5 views
14

Est-ce que quelqu'un connaît une manière spiffieuse d'utiliser des fichiers d'en-tête C en Python? Par exemple, j'ai un programme C qui comprend une variable globale:Comment analyser un fichier d'en-tête C?

typedef struct ImageInfo 
{ 
    uint8_t revisionMajor; 
    uint8_t revisionMinor; 
    uint16_t checksum;  

} ImageInfo; 

ImageInfo gImageInfo; /* Placed at a specific address by the linker */ 

Je voudrais être en mesure de prendre le binaire généré par le compilateur/éditeur de liens C et analyser cette structure (et modifier éventuellement il) avec un Python scénario.

+0

La structure n'existe probablement pas "dans le binaire" en tant que telle - elle ne "existe" réellement qu'après l'exécution du programme dans la RAM par le système d'exploitation. Alors qu'essayez-vous exactement de faire? –

+0

Oups J'ai oublié de mentionner que la variable globale est placée dans une mémoire en lecture seule (c'est-à-dire Flash ou ROM). Dans l'exemple ci-dessus gImageInfo serait placé au décalage 0x1000 dans le binaire et je veux être capable de lire la structure avec Python et obtenir les informations de révision pour vérifier la somme de contrôle. – waffleman

Répondre

12

Have a look at this C++ header parser written in Python. Vous pouvez également écrire votre propre analyseur en utilisant un de ces outils:

+1

Excellentes références: je ne connaissais pas beaucoup de ces modules. Je voudrais savoir à quel point ils sont comparés à pygccxml (qui a clairement une longueur d'avance puisqu'il est soutenu par GCC). L'écriture d'un analyseur C++ est notoirement difficile (même si la question portait sur l'analyse C). Ce serait bien d'utiliser quelque chose de plus léger que la pile complète basée sur GCCXML si possible. – jkp

8

Jetez un oeil à pygccxml. Je l'utilise pour construire des graphiques en mémoire de mon code source C/C++ que je peux utiliser comme base pour de nombreuses tâches de génération de code. PS: Quand j'ai commencé avec la génération de code basée sur Python, j'ai essayé d'écrire moi-même un analyseur: sauvez-vous la douleur et n'allez même pas là-bas! (On dirait que vous avez déjà compris ...) pygccxml est tout ce que vous voulez et plus :)

22

Cela a été mentionné hier sur le SO ; Je n'ai pas encore eu l'occasion de le vérifier plus à fond, mais je veux dire. Le pycparser, un "parseur C et un générateur AST écrit en Python".

https://github.com/eliben/pycparser

+0

Alors que l'histoire ostensiblement ancienne, cette réponse mérite au moins 2 votes plus haut - il offre la possibilité de faire exactement ce que demande le message original. – synthesizerpatel

+0

tel qu'utilisé à http://stackoverflow.com/a/13822683/181772 (avec un exemple de code) –

2

le même but que je suis envisage pyclibrary, il n'est pas un analyseur C complet mais il est destiné à l'analyse des fichiers d'en-tête C, il est donc beaucoup plus facile à utiliser que pycparser ou un gccxml- analyseur basé: bien que faiblement documenté, essayez simplement CParser.py testHeader.h et vous verrez comment cela fonctionne.

Cela dépend du pyparsing et, pour autant que je sache, c'est du pur python.