GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo saber que la biblioteca compartida dada está construida con símbolos de depuración o no?

Tenga en cuenta que not stripped no implica símbolos de depuración.

Código de biblioteca:

//myshared.c
#include <stdio.h>

void print_from_lib()
{
    printf("Printed from shared library\n");
}

Compilando con y sin banderas de depuración:

gcc -c -Wall -Werror -fpic myshared.c
gcc -shared -o libmyshared.so myshared.o
gcc -g -c -Wall -Werror -fpic myshared.c -o myshared-g.o
gcc -g -shared -o libmyshared-g.so myshared-g.o

Comprobando con file

$ file libmyshared.so
libmyshared.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1ad3b94d5c8a7392c2140a647254753221a152cd, not stripped
$ file libmyshared-g.so 
libmyshared-g.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0268eaf97e5a670d2f7e767a011be6f06a83090a, not stripped

Ambos afirman que no están despojados. Sin embargo, solo libmyshared-g.so muestra los símbolos:

$ objdump --syms libmyshared.so | grep debug
$ objdump --syms libmyshared-g.so | grep debug
0000000000000000 l    d  .debug_aranges 0000000000000000              .debug_aranges
0000000000000000 l    d  .debug_info    0000000000000000              .debug_info
0000000000000000 l    d  .debug_abbrev  0000000000000000              .debug_abbrev
0000000000000000 l    d  .debug_line    0000000000000000              .debug_line
0000000000000000 l    d  .debug_str 0000000000000000              .debug_str

Puede usar el comando de archivo para ver si un archivo es stripped . Básicamente, esto significa que los símbolos de depuración están ahí o no.

Aquí hay un archivo de mi sistema:

$ file libjsd.so
     libjsd.so: ELF 32-bit LSB shared object, \
     Intel 80386, version 1 (SYSV), dynamically linked, 
     stripped

Fíjate en el despojado.

Aquí hay algo que compilé:

$ file libprofile_rt.so
libprofile_rt.so: ELF 64-bit LSB shared object, x86-64, 
      version 1 (SYSV), dynamically linked, 
     BuildID[sha1]=0x..., not stripped

vea el 'no eliminado', que indica que tiene símbolos de depuración.

También es posible separar los símbolos de depuración del propio objeto compartido mediante objcopy. Esto extraería símbolos en otro archivo y luego necesitaría conocer el enlace para recuperarlos. Puede ver instrucciones para hacer esto con gdb usando build-ids. Esto es útil si desea entregar algo sin los símbolos pero luego poder depurarlo en un abrir y cerrar de ojos.


Linux
  1. Introducción a las bibliotecas compartidas de Linux (Cómo crear bibliotecas compartidas)

  2. Cómo rastrear -f el último archivo de registro con un patrón dado

  3. ¿Cómo veo la lista de funciones que exporta una biblioteca compartida de Linux?

  4. ¿Cuál es el significado de Advertencia:vincular la biblioteca compartida con la biblioteca estática no es portátil?

  5. ¿Cómo compartir la conexión a Internet?

Cómo construimos una aplicación de escritorio Linux con Electron

Cómo encontrar archivos con el comando fd en Linux

Cómo saber los grupos de un usuario de Linux

Cómo construí un laboratorio casero con el presupuesto

¿Cómo vincular la biblioteca de tiempo de ejecución de C con 'ld'?

¿Cómo puedo saber si la opción set -e está habilitada o no?