2013-11-22 4 views
5

Ho alcune librerie compilate, ad esempio la libreria condivisa (ad es. * .so) su x86 Linux e voglio determinare rapidamente se sono state compilate con simboli di debug (cioè con l'opzione -g/debug build) o meno.Come sapere che la libreria condivisa fornita è compilata con symbos di debug o no?

Come controllare?

+0

nome file nome file -x | grep 'debug' – starrify

+0

possibile duplicato di [Come verificare se il programma è stato compilato con i simboli di debug?] (http://stackoverflow.com/questions/3284112/how-to-check-if-program-was-compiled-with- debug-symbols) –

risposta

9

È possibile utilizzare il comando file per verificare se un file è stripped. Fondamentalmente, questo significa che i simboli di debug ci sono o no.

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 

Avviso il spogliato.

Ecco cosa 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 

vedere il 'non spogliato', che indica che ha simboli di debug.

È anche possibile separare i simboli di debug dall'oggetto condiviso stesso utilizzando objcopy. Questo estrarrebbe i simboli in un altro file e quindi avresti bisogno di sapere il link per riaverli. È possibile visualizzare le istruzioni per doing this with gdb utilizzando ID build. Questo è utile se vuoi consegnare qualcosa senza i simboli, ma poi riesci a eseguirne il debug in un pizzico da una discarica.

+0

Riesco a vedere libQt5Gui.so.5.5.1 che contiene i simboli di debug in diversi file libQt5Gui.so.5.5.1.debug ma il comando file mostra non spogliato per libQt5Gui.so.5.5.1 – Mohit

5

Nota che not stripped non implica simboli di debug.

Code Library:

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

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

Compilare 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 

Verifica 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 sostengono che non sono 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