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.