2016-04-20 4 views
5

Quello è il mio codice:Come leggere l'output nm?

int const const_global_init = 2; 
    int const const_global; 
    int global_init = 4; 
    int global; 

    static int static_global_init = 3; 
    static int static_global; 

    static int static_function(){ 
     return 2; 
    } 
    double function_with_param(int a){ 
     static int static_local_init = 3; 
     static int static_local; 

     return 2.2; 
    } 


    int main(){ 
} 

ho generare main.o e cerco di intesa nm uscita. Dopo io uso nm main.o --printfile-name -a ottengo questo output:

main.o:0000000000000000 b .bss 
main.o:0000000000000000 n .comment 
main.o:0000000000000004 C const_global 
main.o:0000000000000000 R const_global_init 
main.o:0000000000000000 d .data 
main.o:0000000000000000 r .eh_frame 
main.o:000000000000000b T function_with_param 
main.o:0000000000000004 C global 
main.o:0000000000000000 D global_init 
main.o:0000000000000027 T main 
main.o:0000000000000000 a main.c 
main.o:0000000000000000 n .note.GNU-stack 
main.o:0000000000000000 r .rodata 
main.o:0000000000000000 t static_function 
main.o:0000000000000000 b static_global 
main.o:0000000000000004 d static_global_init 
main.o:0000000000000004 b static_local.1733 
main.o:0000000000000008 d static_local_init.1732 
main.o:0000000000000000 t .text 

ho capito 2 ° e 3 ° colonna, ma, io veramente non so che cosa è nella prima colonna, se è l'indirizzo o dimensioni? So qualcosa su .bbs, .comment, .data e .text segmenti ma che cos'è .eh_frame, .note.GNU-stack e .rodata?

risposta

3

... non so davvero cosa c'è nella prima colonna, se è l'indirizzo o la dimensione?

La mia pagina di manuale locale (da man nm) dice

DESCRIPTION 
     GNU nm lists the symbols from object files objfile.... If no object files are listed as arguments, nm assumes the file a.out. 

     For each symbol, nm shows: 

     · The symbol value, in the radix selected by options (see below), or hexadecimal by default. 

che è, la prima colonna è il 'valore' del simbolo. Per capire che cosa significa, è utile sapere qualcosa su ELF e sul linker di runtime, ma in generale sarà semplicemente un offset nella sezione pertinente.

Capire qualcosa su ELF aiuterà anche con gli altri punti: man elf ci dice che la sezione .rodata è dati di sola lettura (vale a dire:. Valori costanti insita nel programma che non cambiano mai letterali stringa potrebbe andare qui).

.eh_frame viene utilizzato per la gestione delle eccezioni e altri metadati chiamata stack-frame (una ricerca per eh_frame ha this question come il primo colpo).

Problemi correlati