2009-12-31 2 views
0

J'essaie d'utiliser objcopy pour convertir un fichier xml en un fichier objet qui est ensuite lié et utilisé par une autre bibliothèque partagée sur RHEL5. Je convertir le fichier avec cette commande:Impossible d'accéder à la variable de taille dans le fichier créé par objcopy

objcopy --input format binaire --output-cible i386-pc-linux-gnu --binary architecture i386 baselines.xml baselines.0

Le fichier objet est créé et en utilisant readelf j'obtiens ce qui suit:

Symbole table '.symtab' contient 5 entrées: Num: Valeur Taille type Bind Vis Ndx Nom 0: 00000000 0 NoType DEFAULT LOCAL UND 1: 0 00000000 SECTION LOCALE PAR DEFAUT 1 2: 00000000 0 NOTYPE DEFAUT GLOBAL 1 _binary_baselines_xml_sta 3: 0000132b 0 NOTYPE GLOBAL DE FAULT 1 _binary_baselines_xml_end 4: 0000132b 0 NOTYPE GLOBAL DEFAULT ABS _binary_baselines_xml_siz

Donc, il semble que la taille soit là. J'ai jeté le fichier et vérifié que le xml est incorporé comme ascii au décalage 34 (spécifié par la valeur .data) et que c'est correct. Les données ont une taille de 0x132b octets, comme spécifié par la variable.

Puis dans le code, je déclare une variable de couple:

extern "C" 
{ 
    extern char _binary_baselines_xml_start; 
    extern char _binary_baselines_xml_size; 
} 
static const char* xml_start = &_binary_baselines_xml_start; 
const uint32_t xml_size = reinterpret_cast<uint32_t>(&_binary_baselines_xml_size); 

Lorsque je fais un pas dans cela, le pointeur xml est correct et je peux voir le texte XML dans le débogueur. Cependant, le symbole de taille indique la valeur 0x132b (ce que je veux) mais indique également que "l'adresse 0x132b est hors limites". Quand j'utilise la variable, c'est un très grand nombre aléatoire incorrect. J'ai essayé toutes sortes d'autres syntaxes pour déclarer la variable externe comme char *, char [], int, int *, etc. Le résultat est toujours le même. La valeur est là mais je n'arrive pas à y arriver. Un autre point d'intérêt est que ce code fonctionne correctement sur une machine Windows sans le soulignement préfixé sur les variables externes, mais tous les autres sont les mêmes.

Je n'arrive pas à trouver beaucoup en ligne sur l'utilisation d'objcopy de cette manière, donc toute aide est grandement appréciée.

Répondre

0

Je ne suis pas sûr de ce que votre problème réel est. Le symbole * _size est un symbole absolu pour indiquer la taille. Vous n'êtes pas censé être en mesure de référencer réellement l'emplacement (à moins d'un accident), c'est juste un moyen de dérober une valeur entière dans l'éditeur de liens sans réellement définir une variable de données. Ce que vous faites est correct dans la façon dont vous l'utilisez.

La meilleure façon de penser que ce serait si vous aviez le code suivant:

char* psize = reinterpret_cast<char*>(0x1234); 
int size = reinterpret_cast<int>(psize);

La seule différence est l'éditeur de liens Remplit la valeur 0x1234 pour vous par un symbole.

+0

J'ai besoin de la taille car les données XML binaires ne sont pas terminées par un caractère nul et je veux le copier dans un tampon que je peux utiliser. Le symbole n'est pas accessible, il n'est donc pas renseigné lors de l'exécution. Je l'ai eu pour travailler dans un programme de test simple avec un .so qui définit et renvoie les données et une principale qui utilise le .so pour obtenir les données. Cependant, soit main.cpp doit inclure le fichier .so cpp avec la déclaration extern, soit mettre extern dans l'en-tête .so et créer une fonction qui fait référence à la variable. – adevi003

Questions connexes