2013-07-29 4 views
0

J'ai un fichier C avec certaines structures. Actuellement, je peux accéder aux structures en utilisant un symbole public pub.Accès au fichier objet GNU

char sym_001[] = { 1,2,3,4,5 }; 
char sym_002[] = { 3,4,5 }; 
char sym_003[] = { 0,8,15 }; 
struct _info { int n; char*a } info[] = { 
    { 5, &sym_001 }, 
    { 3, &sym_002 }, 
    { 3, &sym_003 } 
}; 
typedef struct pat { int a,b; struct _info*i; struct _pat*p } pat; 
pat pat1 = { 3, 4, &info[2], 0 }; 
pat pat2 = { 3, 4, &info[0], &pat1 }; 
// 
struct { int property; pat*p } pub = { 1, &pat2 }; 

J'ai besoin de sérialiser en un flux et de désérialiser le flux dans un format de mémoire. Un problème concerne les adresses qui doivent être remplacées en quelque sorte par un décalage dans le flux et restaurées avec la nouvelle adresse sur la cible. Mais ce n'est pas le vrai défi.

Bien que la sérialisation ne devrait pas être un problème, je veux accéder à la sortie du compilateur elle-même. Je préférerais éviter de lier mon sérialiseur avec le fichier objet car il y a beaucoup de tels fichiers de données à traiter. Existe-t-il un moyen pratique d'accéder aux binaires GNU?

J'ai essayé d'utiliser objcopy:

objcopy -I elf32-littlearm -O binary DS-Digital8.o foo.bin 

Mais cela donne zéro pour tous les endroits où j'expected une adresse (qui a besoin de relocalisation).

+0

Vous aurez toujours un problème avec * adresses * et binutils. Vous pouvez essayer un * offset *. Par exemple, dans la structure 'info', utilisez' ((int) (& info - & sym_001)) 'et rendez les choses statiques. Ou utilisez quelque chose comme * tampons de protocole *. La sérialisation a beaucoup de * mises en garde * et elles ont été réfléchies par d'autres. Endianess, représentation compacte, alignements, etc. –

+0

@artlessnoise Oui, il y a quelques problèmes de sérialisation. Ceux-ci doivent être résolus avec les données de relocalisation dans le fichier objet. Mais la question est de savoir comment accéder aux fichiers objets pour lire les sections .rodata et .reloc. – harper

+0

Avez-vous envisagé de travailler au niveau C, peut-être en personnalisant le compilateur GCC qui le gère (par exemple avec [MELT] (http://gcc-melt.org/) ...)? –

Répondre

0

Le commentaire de bruit sans art donne le bon indice. La bibliothèque libelf dispose d'un support complet pour accéder au fichier objet.