GNU/Linux >> Linux Esercitazione >  >> Linux

Come sapere che la libreria condivisa data è costruita con simboli di debug o no?

Nota che not stripped non implica simboli di debug.

Codice libreria:

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

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

Compilazione con e senza flag di debug:

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

Controllo 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

Entrambi affermano di non essere spogliati. Tuttavia solo libmyshared-g.so mostra i simboli:

$ 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

Puoi usare il comando file per vedere se un file è stripped . Fondamentalmente, questo significa che i simboli di debug sono presenti o meno.

Ecco un file dal mio sistema:

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

Nota lo spogliato.

Ecco qualcosa che ho compilato:

$ 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

vedi 'not stripped', che indica che ha simboli di debug.

È anche possibile separare i simboli di debug dall'oggetto condiviso stesso utilizzando objcopy. Ciò estrarrebbe i simboli in un altro file e quindi avresti bisogno di conoscere il collegamento per recuperarli. Puoi vedere le istruzioni per farlo con gdb usando build-id. Questo è utile se vuoi consegnare qualcosa senza i simboli ma poi essere in grado di eseguire il debug in un attimo da un dump.


Linux
  1. Come controllare i permessi con il comando trova

  2. Come funziona il comando oc debug in OpenShift

  3. Introduzione alle librerie condivise Linux (come creare librerie condivise)

  4. In che modo uno script bash può conoscere la directory in cui è installato quando viene fornito con . operatore?

  5. Come eseguire il tail -f dell'ultimo file di registro con un dato modello

Come trovare file con il comando fd in Linux

Come conoscere i gruppi di un utente Linux

Come ho costruito un Homelab sul budget

Come collegare la libreria di runtime C con 'ld'?

Come posso sapere se l'opzione set -e è abilitata o meno?

Come condividere la connessione Internet?