GNU/Linux >> Tutoriels Linux >  >> Linux

Comment savoir que la bibliothèque partagée donnée est construite avec des symboles de débogage ou non ?

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.


Linux
  1. Introduction aux bibliothèques partagées Linux (comment créer des bibliothèques partagées)

  2. Comment initialiser une bibliothèque partagée sous Linux

  3. Comment suivre -f le dernier fichier journal avec un modèle donné

  4. Comment afficher la liste des fonctions qu'une bibliothèque partagée Linux exporte ?

  5. Comment déboguer le noyau Linux avec GDB et QEMU ?

Comment auditer les autorisations avec la commande find

Fonctionnement de la commande oc debug dans OpenShift

Comment rechercher des fichiers avec la commande fd sous Linux

Comment connaître les groupes d'un utilisateur Linux

Comment j'ai construit un Homelab sur le budget

Comment partager la connexion internet ?