2010-03-22 3 views
12

Lorsque je crée une version avec gcc (c'est-à-dire que je ne spécifie pas -g), il me semble toujours que les symboles se trouvent dans le binaire et que je dois utiliser strip pour les supprimer. En fait, je peux encore décomposer des fonctions et obtenir des backtraces dans gdb (mais sans les numéros de ligne).Pourquoi gcc ajoute-t-il des symboles à une construction non-debug?

Cela m'a surpris - quelqu'un peut-il expliquer pourquoi cela se produit?

par exemple.

#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

Répondre

10

Il y a une grande différence entre les symboles de débogage et des symboles de l'éditeur de liens. Les symboles de débogage mappent les emplacements de code, etc. pour trouver les noms de fichiers, les numéros de ligne et d'autres choses utiles pour les débogueurs, les profileurs, etc. Les symboles de lieur définissent simplement les adresses des différents points d'entrée. Si vous voulez rendre un exécutable complètement anonyme, alors vous devez utiliser strip, comme vous l'avez vu.

6

C'est juste le comportement par défaut pour GCC. Un compromis semi-utile entre avoir des informations de débogage inclus et ne rien avoir du tout. On pourrait bien sûr argumenter que l'effacement devrait être la valeur par défaut, mais il suffit d'ajouter -s ou d'utiliser la commande strip pour le contrôler de toute façon.

Questions connexes