IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lister les symboles d'un fichier Elf.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jazz_
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 290
    Par défaut Lister les symboles d'un fichier Elf.
    Bonjour, je cherche a lister les symbole d'un fichier Elf, pour le moment je parcours le tableau de Elf32_shdr en affichant le string corespondant a leur index (sh_name) dans la strtab.
    Mais je crois que ce n'est pas ce que je souhaite.
    je souhaite retrouver les element que nm listerais.

    Exemple:
    ma sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i = 0;
      while (i < shnum) // shnum = la valeur e_shnum de la structure Header su fichier Elf
        {
          printf("%02dname: %s ", i, &strtab[shdr[i].sh_name]); // strtab = le strtab du fichier elf , shdr , le tableau de shdr.
          printf("\n");
          ++i;
        }
    00name:
    01name: .interp
    02name: .note.ABI-tag
    03name: .note.gnu.build-id
    04name: .gnu.hash
    05name: .dynsym
    06name: .dynstr
    07name: .gnu.version
    08name: .gnu.version_r
    09name: .rel.dyn
    10name: .rel.plt
    11name: .init
    12name: .plt
    13name: .text
    14name: .fini
    15name: .rodata
    16name: .eh_frame_hdr
    17name: .eh_frame
    18name: .ctors
    19name: .dtors
    20name: .jcr
    21name: .dynamic
    22name: .got
    23name: .got.plt
    24name: .data
    25name: .bss
    26name: .comment
    27name: .shstrtab
    28name: .symtab
    29name: .strtab


    et nm,

    0804a14c d _DYNAMIC
    0804a218 d _GLOBAL_OFFSET_TABLE_
    08048c0c R _IO_stdin_used
    w _Jv_RegisterClasses
    0804a13c d __CTOR_END__
    0804a138 d __CTOR_LIST__
    0804a144 D __DTOR_END__
    0804a140 d __DTOR_LIST__
    08049134 r __FRAME_END__
    0804a148 d __JCR_END__
    0804a148 d __JCR_LIST__
    0804a254 A __bss_start
    0804a250 D __data_start
    08048bc0 t __do_global_ctors_aux
    080484c0 t __do_global_dtors_aux
    08048c10 R __dso_handle
    w __gmon_start__
    08048b7a T __i686.get_pc_thunk.bx
    0804a138 d __init_array_end
    0804a138 d __init_array_start
    08048b10 T __libc_csu_fini
    08048b20 T __libc_csu_init
    U __libc_start_main@@GLIBC_2.0
    08048b80 T __stat
    U __xstat@@GLIBC_2.0
    0804a254 A _edata
    0804a25c A _end
    08048bec T _fini
    08048c08 R _fp_hw
    08048394 T _init
    08048490 T _start
    U close@@GLIBC_2.0
    0804a254 b completed.5959
    0804a250 W data_start
    0804a258 b dtor_idx.5961
    08048a9c T erreur
    U exit@@GLIBC_2.0
    08048520 t frame_dummy
    08048a5e T howto
    08048544 T main
    U mmap@@GLIBC_2.0
    U munmap@@GLIBC_2.0
    U open@@GLIBC_2.0
    U printf@@GLIBC_2.0
    U puts@@GLIBC_2.0
    08048b80 W stat
    U strncmp@@GLIBC_2.0


    donc, il n'y a aucune occurance entre les deux sorties, du coup je ne comprend ce que je liste, et que dois-je faire pour lister ce que je souhaite ?

    PS : je ne m'interesse pas (encore) au adresse et au caractere donné par nm, juste les noms de symboles.

  2. #2
    Membre éclairé Avatar de Jazz_
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 290
    Par défaut
    Bon j'ai changé mon code, et maintenet , je parcours bien mes symboles, mais quand j´essaie d´afficher leur nom, ca ne fonctionne pas vraiment bien,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (i < (section_sym->sh_size / sizeof(Elf32_Sym))) // section_sym = Elf32_Shdr* son nom pointe dans la string table a la chaine de caractere .symtab
            {
              printf("Symbole : %s\n",&tabstr[tab_sym[i].st_name]); // tabstr = char* (la string table), tab_sym = Elf32_Sym* cést le debut du tableau d´Elf32_Sym.
              ++i;
            }
    et j´obtient un affichage assez nul.

    :
    Symbole : .ABI-tag
    Symbole : e.gnu.build-id
    Symbole : sh
    Symbole : str
    Symbole : on
    Symbole : .symtab
    Symbole : ion_r
    Symbole : n
    Symbole : it
    Symbole : ni
    Symbole : dr
    Symbole : frame
    Symbole : cr
    Symbole : .got.plt
    Symbole :
    Symbole :
    Symbole :
    Symbole :
    Symbole :
    Symbole :4
    Symbole :
    Symbole :
    Symbole : 
    Symbole :
    Symbole :
    Symbole :
    Symbole :
    Symbole : o
    Symbole :
    Symbole :
    Symbole :
    Symbole :
    Symbole : 
    Symbole : \
    Symbole :
    Symbole :
    Symbole : �
    Symbole :
    Symbole : k
    Symbole :
    Symbole : 
    Symbole :

    Cela dis il y a autant de ligne que nm, ce que je návais pas avant, donc je pense que maintenant je parcours bien mes symboles.

  3. #3
    Invité de passage
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Par défaut my_nm
    Salut,

    J'ai eu le meme soucis que toi. Ca vient du fait que tu charge pas la bonne string table.
    Cherche du cote du sh_linked dans ton header de sym table.
    Good Luck.

    PS : tu serais pas a Epitech a tout hasard ???

  4. #4
    Membre éclairé Avatar de Jazz_
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 290
    Par défaut
    J'ai trouvé, effectivement ca vien du fait que la strtab nés pas la strtab des symboles.

    Merci beaucoup !

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Salut!

    moi par contre j'ai bien recuperer le header de la table des symboles, en accedant a l'in sh_link .
    J'affiche tous les symboles que nm affiche, mais dans le meme ordre, et j'affiche des symboles en plus. voici les sorties:
    (ngonta_e@host-cis-r01p16 1131)./my_nm
    00000000
    08048134
    08048148
    08048168
    0804818c
    080481ac
    0804824c
    080482b4
    080482c8
    080482e8
    080482f0
    08048330
    08048360
    080483f0
    080486cc
    080486e8
    08048718
    0804873c
    080497b8
    080497c0
    080497c8
    080497cc
    08049894
    08049898
    080498c4
    080498c8
    00000000
    00000000 crtstuff.c
    080497b8 __CTOR_LIST__
    080497c0 __DTOR_LIST__
    080497c8 __JCR_LIST__
    08048420 __do_global_dtors_aux
    080498c8 completed.5959
    080498cc dtor_idx.5961
    08048480 frame_dummy
    00000000 crtstuff.c
    080497bc __CTOR_END__
    080487b4 __FRAME_END__
    080497c8 __JCR_END__
    080486a0 __do_global_ctors_aux
    00000000 test.c
    08049898 _GLOBAL_OFFSET_TABLE_
    080497b8 __init_array_end
    080497b8 __init_array_start
    080497cc _DYNAMIC
    080498c4 data_start
    00000000 open@@GLIBC_2.0
    00000000 mmap@@GLIBC_2.0
    08048630 __libc_csu_fini
    080483f0 _start
    00000000 __gmon_start__
    00000000 _Jv_RegisterClasses
    080486e8 _fp_hw
    080486cc _fini
    00000000 __libc_start_main@@GLIBC_2.0
    080486ec _IO_stdin_used
    080498c4 __data_start
    080486f0 __dso_handle
    080497c4 __DTOR_END__
    08048640 __libc_csu_init
    00000000 printf@@GLIBC_2.0
    00000000 close@@GLIBC_2.0
    080498c8 __bss_start00000000 __gmon_start__
    00000000 _Jv_RegisterClasses
    080486e8 _fp_hw
    080486cc _fini
    00000000 __libc_start_main@@GLIBC_2.0
    080486ec _IO_stdin_used
    080498c4 __data_start
    080486f0 __dso_handle
    080497c4 __DTOR_END__
    08048640 __libc_csu_init
    00000000 printf@@GLIBC_2.0
    00000000 close@@GLIBC_2.0
    080498c8 __bss_start
    080484a4 file_size
    080498d0 _end
    00000000 puts@@GLIBC_2.0
    080484c7 print_sh_name
    00000000 lseek@@GLIBC_2.0
    080498c8 _edata
    0804869a __i686.get_pc_thunk.bx
    08048527 main
    08048330 _init

    et le nm du systeme:
    (ngonta_e@host-cis-r01p16 1132)nm
    080497cc d _DYNAMIC
    08049898 d _GLOBAL_OFFSET_TABLE_
    080486ec R _IO_stdin_used
    w _Jv_RegisterClasses
    080497bc d __CTOR_END__
    080497b8 d __CTOR_LIST__
    080497c4 D __DTOR_END__
    080497c0 d __DTOR_LIST__
    080487b4 r __FRAME_END__
    080497c8 d __JCR_END__
    080497c8 d __JCR_LIST__
    080498c8 A __bss_start
    080498c4 D __data_start
    080486a0 t __do_global_ctors_aux
    08048420 t __do_global_dtors_aux
    080486f0 R __dso_handle
    w __gmon_start__
    0804869a T __i686.get_pc_thunk.bx
    080497b8 d __init_array_end
    080497b8 d __init_array_start
    08048630 T __libc_csu_fini
    08048640 T __libc_csu_init
    U __libc_start_main@@GLIBC_2.0
    080498c8 A _edata
    080498d0 A _end
    080486cc T _fini
    080486e8 R _fp_hw
    08048330 T _init
    080483f0 T _start
    U close@@GLIBC_2.0
    080498c8 b completed.5959
    080498c4 W data_start
    080498cc b dtor_idx.5961
    080484a4 T file_size
    08048480 t frame_dummy
    U lseek@@GLIBC_2.0
    08048527 T main
    U mmap@@GLIBC_2.0
    U open@@GLIBC_2.0
    080484c7 T print_sh_name
    U printf@@GLIBC_2.0
    U puts@@GLIBC_2.0

    Je ne gere pas encore l'affiche du type de symbole comme nm le fait, mais j'aimerais compredre pourquoi j'affiche des lignes sans symbole, des .c (comme le ligne test.c ou ctrstuff.c). bref pour vous qui avez reussir a reproduire le comportement exacte du nm, dois-je faire des check supplementaire sur le symbole avant d'afficher son nom? quel est l'astuce pour l'aafichage?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les fonctions d'un fichier source
    Par Davidbrcz dans le forum C++
    Réponses: 24
    Dernier message: 17/09/2008, 17h51
  2. lister les différences entre 2 fichiers XML
    Par st20085 dans le forum Général Python
    Réponses: 1
    Dernier message: 14/12/2007, 11h48
  3. lister les infos d'un fichier
    Par titomiss dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2007, 13h45
  4. lister les fonctions d'un fichier
    Par NicoO_O dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2007, 10h51
  5. |VB6] Comment Lister les liens vers des fichiers d'une page web
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 18/01/2005, 18h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo