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.