Notez que not stripped
n'implique pas de symboles de débogage.
Code bibliothèque :
//myshared.c
#include <stdio.h>
void print_from_lib()
{
printf("Printed from shared library\n");
}
Compilation avec et sans indicateurs de débogage :
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
Vérification avec 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
Les deux prétendent qu'ils ne sont pas dépouillés. Cependant seulement libmyshared-g.so
affiche les symboles :
$ 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
Vous pouvez utiliser la commande file pour voir si un fichier est stripped
. En gros, cela signifie que les symboles de débogage sont là ou non.
Voici un fichier de mon système :
$ file libjsd.so
libjsd.so: ELF 32-bit LSB shared object, \
Intel 80386, version 1 (SYSV), dynamically linked,
stripped
Remarquez le dépouillé.
Voici quelque chose que j'ai 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
voir le 'non dépouillé', qui indique qu'il a des symboles de débogage.
Il est également possible de séparer les symboles de débogage de l'objet partagé lui-même en utilisant objcopy. Cela extrairait des symboles dans un autre fichier, puis vous auriez besoin de connaître le lien pour les récupérer. Vous pouvez voir les instructions pour faire cela avec gdb en utilisant build-ids. Ceci est utile si vous souhaitez livrer quelque chose sans les symboles, mais que vous pouvez ensuite le déboguer en un clin d'œil à partir d'un vidage.