Bonjour à tous.
Je travaille sur un projet qui me demande de manipuler des pointeur (recoder objdump), et je rencontre un problème : additionner un int a pointeur pour se déplacer donne un résultat incohérent. Concrètement dans l'exemple je récupère un pointeur et un offset pour trouver l'emplacement d'une autre structure, mais le résultat de l'addition est incohérent.
le pointeur en question est une structure Elf32 et l'offset un e_offset, mais ça ne change rien, j'avais déjà eu ce problème sur un précédent projet et j'avais contourné le problème avec un hack pourris dont je ne me souviens plus, mais de toute façon la c'est beaucoup plus gros il me faut une vrai solution.
Les types sont ceux définis dans le header elf32, je code sous FreeBSD et compile avec gcc.
Un (le) morceau de code :
(l'offset est de type unsigned int)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Elf32_hdr *head; Elf32_Phdr *proghead; head = qqchose; proghead = head + (head->e_phoff); /* e_phoff est l'offset en question*/
Vu sous gdb:
$gdb p head;
0x804a008
$gdb p proghead
0x804aa98
$gdb p head->e_phoff
52 /*soit 0x34 en hexadecimale*/
Avec des printf("%p", ...) dans le code le résultat est le même.
J'ai essayé plusieurs cast, rien n'y fait, ça me rend fou et me fait perdre un temps fou aussi. J'ai déjà recherché sur internet mais je ne trouve aucun résultat pertinent.
Sinon petite déduction :
0x804aa98 - 0x804a008 = 0xA90, soit 0x34 (52) au carré.
Je pense qu'il y du décalage de bit, les valeurs ne doivent pas additionné comme il me semble que cela devrait-être, des bits doivent être interprétés comme des bits de signature ou je ne sais pas, bref un truc passe pas.
Merci beaucoup d'avance.
Partager