¿Cuál es la primera columna de salida nm?

2 minutos de lectura

avatar de usuario
Hielo

Ese es mi código:

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

yo genero main.o y trato de entender nm producción. Después de que uso nm main.o --printfile-name -a obtengo esta salida:

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

Entendí la segunda y la tercera columna, pero realmente no sé qué hay en la primera columna, si es la dirección o el tamaño. sé algo sobre .bbs, .comment, .data y .text segmentos pero que es .eh_frame, .note.GNU-stack y .rodata?

avatar de usuario
Inútil

… Realmente no sé qué hay en la primera columna, si es la dirección o el tamaño.

Mi página de manual local (de 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.

es decir, la primera columna es el ‘valor’ del símbolo. Para entender lo que eso significa, es útil saber algo sobre ELF y el enlazador de tiempo de ejecución, pero en general será simplemente una compensación en la sección correspondiente.

Comprender algo sobre ELF también ayudará con los otros puntos: man elf nos dice que el .rodata La sección son datos de solo lectura (es decir: valores constantes codificados en el programa que nunca cambian. Los literales de cadena pueden ir aquí).

.eh_frame se utiliza para el manejo de excepciones y otros metadatos de marcos de pila de llamadas (una búsqueda de eh_frame tiene esta pregunta como primer hit).

¿Ha sido útil esta solución?