2010-03-22 19 views
12

Quando eseguo una versione di build con gcc (ad esempio non specifica -g), mi sembra di finire con i simboli nel file binario e devo usare strip per rimuoverli. In effetti, posso ancora interrompere le funzioni e ottenere backtrace in gdb (anche se senza numeri di riga).Perché gcc aggiunge simboli a build non di debug?

Questo mi ha sorpreso - qualcuno può spiegare perché questo accade?

ad es.

#include <stdio.h> 

static void blah(void) 
{ 
    printf("hello world\n"); 
} 
int main(int argc, char *argv[]) 
{ 
    blah(); 
    return 0; 
} 

gcc -o foo foo.c

nm foo | grep blah:

08048374 t blah

risposta

10

C'è una grande differenza tra i simboli di debug e simboli linker. I simboli di debug mappano le ubicazioni dei codici, ecc., Per fornire nomi di file e numeri di riga e varie altre cose utili per aiutare debugger, profiler, ecc. I simboli di linker definiscono semplicemente gli indirizzi di vari punti di ingresso e altre posizioni importanti nel codice. Se si desidera rendere un eseguibile completamente anonimo, è necessario utilizzare strip, come si è visto.

6

È solo il comportamento predefinito per GCC. Un compromesso semi-utile tra avere informazioni di debug incluse e non avere nulla. Si potrebbe ovviamente sostenere che lo stripping dovrebbe essere il default, ma si tratta semplicemente di aggiungere -s o di usare il comando strip per controllarlo comunque.

Problemi correlati