2010-03-22 11 views
12

जब मैं जीसीसी के साथ रिलीज बिल्ड करता हूं (यानी मैं -g निर्दिष्ट नहीं करता), मैं अभी भी बाइनरी में प्रतीकों के साथ समाप्त होता प्रतीत होता हूं, और उन्हें हटाने के लिए strip का उपयोग करना पड़ता है। वास्तव में, मैं अभी भी कार्यों को तोड़ सकता हूं और जीडीबी में बैकट्रैक प्राप्त कर सकता हूं (हालांकि लाइन नंबरों के बावजूद)।जीसीसी गैर-डीबग निर्माण के लिए प्रतीक क्यों जोड़ता है?

यह मुझे आश्चर्यचकित करता है - क्या कोई यह समझा सकता है कि ऐसा क्यों होता है?

उदा

#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

उत्तर

10

वहाँ डिबग प्रतीकों और लिंकर प्रतीकों के बीच एक बड़ा अंतर है। डिबगर्स, प्रोफाइलर इत्यादि की सहायता के लिए स्रोत फ़ाइल नामों और रेखा संख्याओं और कई अन्य उपयोगी चीजों के लिए डीबग प्रतीक मानचित्र कोड स्थान इत्यादि। लिंकर प्रतीक केवल आपके कोड में विभिन्न प्रविष्टि बिंदुओं और अन्य महत्वपूर्ण स्थानों के पते को परिभाषित करते हैं। यदि आप निष्पादन योग्य पूरी तरह से अज्ञात बनाना चाहते हैं तो आपको strip का उपयोग करने की आवश्यकता है, जैसा आपने देखा है।

6

यह जीसीसी के लिए सिर्फ डिफ़ॉल्ट व्यवहार है। डीबग जानकारी रखने के बीच एक अर्द्ध उपयोगी समझौता शामिल था और कुछ भी नहीं था। एक निश्चित रूप से तर्क दे सकता है कि अलग करना डिफ़ॉल्ट होना चाहिए, लेकिन यह -s जोड़ने या किसी भी तरह से इसे नियंत्रित करने के लिए strip कमांड का उपयोग करने का मामला है।

संबंधित मुद्दे