Wie liest man die nm-Ausgabe?

Lesezeit: 2 Minuten

Benutzer-Avatar
Eis

Das ist mein Code:

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(){
}

Ich erzeuge main.o und ich versuche zu verstehen nm Ausgang. Nachdem ich benutze nm main.o --printfile-name -a Ich bekomme diese Ausgabe:

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

Ich habe die 2. und 3. Spalte verstanden, aber ich weiß wirklich nicht, was in der ersten Spalte steht, ob es die Adresse oder die Größe ist? Ich weiß etwas über .bbs, .comment, .data und .text Segmente, aber was ist das? .eh_frame, .note.GNU-stack und .rodata?

Benutzer-Avatar
Nicht zu gebrauchen

… ich weiß wirklich nicht, was in der ersten Spalte steht, ob es die Adresse oder die Größe ist?

Meine lokale Manpage (von man nm) sagt

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.

Das heißt, die erste Spalte ist der „Wert“ des Symbols. Um zu verstehen, was das bedeutet, ist es hilfreich, etwas über ELF und den Laufzeitlinker zu wissen, aber im Allgemeinen wird es einfach ein Versatz in den relevanten Abschnitt sein.

Etwas über ELF zu verstehen hilft auch bei den anderen Punkten: man elf sagt uns, dass die .rodata -Abschnitt sind schreibgeschützte Daten (das heißt: konstante Werte, die im Programm fest codiert sind und sich nie ändern. Zeichenfolgenliterale können hier eingefügt werden).

.eh_frame wird für die Ausnahmebehandlung und andere Call-Stack-Frame-Metadaten verwendet (eine Suche nach eh_frame hat diese Frage als ersten Treffer).

1037550cookie-checkWie liest man die nm-Ausgabe?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy