2013-05-02 3 views
20

मेरा मतलब है कि जीसीसी ईएलएफ बाइनरी में कुछ स्रोत कोड संस्करण infor को अनुभाग या कुछ समान के रूप में सम्मिलित कर सकता है या नहीं। मैं अपनी स्रोत फ़ाइल को बदलना नहीं चाहता, लेकिन मेकफ़ाइल में gcc विकल्प के साथ कुछ जानकारी जोड़ें।क्या जीसीसी के पास ईएलएफ बाइनरी फ़ाइल में संस्करण जानकारी जोड़ने के लिए कोई विकल्प है?

उत्तर

6

आप अपनी संस्करण जानकारी को टेक्स्ट फ़ाइल में छोड़ सकते हैं, फिर उस टेक्स्ट फ़ाइल को उस ऑब्जेक्ट फ़ाइल में बदल दें जिसे आप स्थिर रूप से अपने निष्पादन योग्य में लिंक करते हैं।

पहला कदम सरल है लेकिन आपको कुछ कोड लिखना होगा: एक स्क्रिप्ट या कुछ अपनी प्रारूप जानकारी को किसी भी प्रारूप में लिखने के लिए जिसे आप एक सादे पाठ फ़ाइल के रूप में पसंद करते हैं। फिर objcopy का उपयोग करके संस्करण.txt से कहने के संस्करण को बनाने के लिए मेकफ़ाइल नियम लिखें। अब आपके पास एक ऑब्जेक्ट फ़ाइल होगी जिसमें परिभाषित दो उपयोगी प्रतीकों होंगे: पाठ संस्करण संस्करण की शुरुआत और अंत। उस निष्पादन योग्य वस्तु को उस निष्पादन योग्य में जोड़ें, और आप दो तरीकों से संस्करण तक पहुंच पाएंगे: बाइनरी पर strings चलाकर, या संस्करण स्ट्रिंग को मुद्रित करने के लिए एप्लिकेशन में कोड लिखकर (आपको शुरुआत घोषित करने की आवश्यकता होगी और कुछ शीर्षलेख फ़ाइल में चर के रूप में अंत प्रतीकों)।

+4

धन्यवाद। मुझे लगता है कि ओबजॉपी के साथ बेहतर तरीका है: objcopy --add-section versection = version_text मुख्य main_version। और "objdump -s -j versection main_version" के साथ, संस्करण को पुनर्प्राप्त किया जा सकता है। – Lane

+1

हाय जॉन, मुझे लगता है कि आप सक्रिय सदस्य हैं, भले ही यह उत्तर पुराना हो। क्या आप इसे किसी ऑब्जेक्ट में टेक्स्ट फ़ाइल को संकलित करने के बारे में कुछ बहुत ही बुनियादी/सरल उदाहरण के साथ अपडेट करना चाहते हैं? "संस्करण 1.1.1" या कुछ कहें। यह सही सवाल है जिसे मैं बनाने जा रहा था, और, ठीक है, यह एक (अधिक/कम) "डुप्लिकेट" होगा ... –

+1

@DrBeco: लिनक्स पर आप '--input binary' और' --output' प्रारूपों के साथ स्पष्ट रूप से निर्दिष्ट 'objcopy' का उपयोग कर सकते हैं। यहां पर एक पूर्ण ट्यूटोरियल है: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967। आप कुछ विकल्पों के साथ 'ld' का भी उपयोग कर सकते हैं, मुझे लगता है कि' -b' एक ही चीज़ के बारे में करना है, शायद आपके सटीक परिदृश्य के आधार पर भी आसान है। –

6

तुम सिर्फ एक बार अपने स्रोत फ़ाइल को बदलने से परहेज नहीं करते हैं, तो कुछ इस तरह जोड़ें:

const volatile static char version[] = VERSION; 

और संकलन के साथ:

gcc -c -DVERSION='"1.2.3"' 

volatile उच्च पर स्ट्रिंग हटाने से जीसीसी रहता है अनुकूलन स्तर।

लिखित रूप में, यदि आप -D विकल्प भूल जाते हैं, तो यह संकलित नहीं होगा, जो आपकी आवश्यकताओं के आधार पर अच्छा या बुरा हो सकता है।

-1
जीएनयू लिंकर ld साथ

आप उपयोग कर सकते हैं

--version-script=version-scriptfile 

पर कमांड लाइन विकल्प के बारे में और अधिक पढ़ें: Using LD, the GNU linker - Version Script

करते हैं: Using LD, the GNU linker - Options

पर संस्करण स्क्रिप्ट बनाने के बारे में और अधिक पढ़ें हालांकि मैं आपको चेतावनी देता हूं कि यह कमजोर दिल के लिए नहीं है!

+1

संस्करण स्क्रिप्ट्स केवल संकलक सेटिंग्स रिकॉर्डिंग की तुलना में विभिन्न उद्देश्यों के लिए लक्षित हैं। – o11c

4

यहां तक ​​कि अगर आप अपने स्रोत के लिए उपयोग अब और नहीं है, तो आप इस विकल्प के साथ वस्तु लिंक कर सकते हैं:

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog 

आप इसे hexdump -C prog | less साथ की जाँच करें और VERSION


लिए देख सकते हैं अपने makefile को यह जोड़ें और जब एक प्रोग्राम संकलित किया गया था हमेशा पता करना न भूलें:

BUILD = $(shell date +"%Y%m%d_%H%M%S") 
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0 
संबंधित मुद्दे