-
Linux Lecture de ELF
Bonjour,
Pour les librairies dynamiques (*.so) Comment avoir l'adresse absolue en memoire des symboles ? J'arrive a recuperer les noms mais pour l'adresse je ne sais pas comment faire.
Est-ce que c'est possible en lisant avec les structures fournies par Elf ?
Merci.
-
- Si c'est depuis la ligne de commande, tu peux essayer « nm -D NomDeTaBibliothèque » ;
- Si c'est un chargement au runtime avec dlopen(), if faut utiliser dlsym() ;
- Sinon, si c'est une bibliothèque partagée dynamiquement (une *.so ordinaire) mais liée à la compilation, comme dans la majorité des cas, il suffit d'utiliser le symbole en C préfixé par « & », voire même pas préfixé du tout s'il s'agit d'une fonction.
Si tu es dans le troisième cas mais que le nom du symbole n'est pas connu à l'avance, il faut se rabattre sur le deuxième cas.
-
Bonjour,
nan en fait je me suis mal exprime. Je souhaiterais effectuer un traceur de fonctions (a l'aide de ptrace).
Pour le moment ce que j'ai réussi a faire :
- je prend un binaire au format elf, je le map en mémoire
- Direction Section header puis .symtab et .dynsim .
J'y prend les symboles: uniquement les fonctions et celle qui ont leur adresse (Elfx_Sym.st_value) supérieure a zero.
- Direction header Program, Dynamic Section
- Je regarde ceux qui ont la valeur DT_NEEDED (qui sont des lib.so donc).
- Je refais le même cheminement avec les DT_NEEDED, le tout recursif.
Le problème est que lorsque je parse les libs.so, les adresses de symboles ne sont pas absolues mais relatives au fichier.
J'aimerais bien trouver les adresses absolues de ses symboles.
Donc j'avais pense que si je trouvais l'adresse d'où réside actuellement la librairie, il me suffirait d'additionner :
l'adresse absolu de la lib + l'adresse relative du symbole = adresse absolu du symbole en mémoire.
Mais bon je ne pense pas que cette méthode soit valide.
Comment dois-je faire ?
Une autre question , j'ai vu dans quelques sources sur internet que le binaire principal était charge a l'adresse 0x8048000. Est-ce valide pour 32 et 64 bits? Je n'ai trouve aucun define dans les /usr/include. Ou bien est-il définit dans le format elf?
Merci .
PS : désole pour les accents je suis sur un clavier qwerty.