2010-03-22 34 views
12

Gcc ile bir sürüm oluşturduğumda (yani, -g belirtmeme rağmen), hala ikili sembollerle bitiyor ve bunları kaldırmak için strip kullanmam gerekiyor. Aslında, yine de fonksiyonlarını kırabilir ve gdb'de (satır numaraları olmadan da olsa) geri dönüşler alabilirim.Neden gcc, hata ayıklamayan yapıya semboller ekliyor?

Bu beni şaşırttı - herkes bunun neden olduğunu açıklayabilir mi?

örn.

gcc -o foo foo.c

nm foo | grep blah

#include <stdio.h> 

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

08048374 t blah

cevap

10

ayıklama sembolleri ve bağlayıcı sembolleri arasında büyük bir fark var. Hata ayıklama sembolleri, kaynak dosya adlarını ve satır numaralarını ve hata ayıklayıcılara, profil oluşturuculara vb. Yardımcı olmak için çeşitli diğer yararlı şeyleri kodlamak için kod konumlarını vb. Eşleştirir. Bağlayıcı sembolleri, yalnızca kodunuzdaki çeşitli giriş noktalarının ve diğer önemli konumların adreslerini tanımlar. Bir yürütülebilir dosyayı tamamen anonim yapmak istiyorsanız, gördüğünüz gibi strip'u kullanmanız gerekir.

6

Yalnızca GCC'nin varsayılan davranışıdır. Hata ayıklama bilgisi içerme ve hiçbir şey yapmama arasında yarı yararlı bir uzlaşma. Tabii ki, sıyırma varsayılan olarak olmalıdır, ancak sadece -s eklemek veya strip komutunu kullanarak onu denetlemek için bir sorun olabilir.