2010-07-23 5 views
7

लिनक्स पर, क्या ईएलएफ बाइनरी में संस्करण जानकारी एम्बेड करने का कोई तरीका है? मैं इस जानकारी को संकलित समय पर एम्बेड करना चाहता हूं ताकि इसे बाद में एक स्क्रिप्ट का उपयोग करके निकाला जा सके। एक हैशिश तरीका कुछ ऐसा लगाएगा जिसे strings कमांड का उपयोग करके निकाला जा सके। क्या विंडोज़ डीएलएल के लिए विजुअल स्टूडियो प्लांट वर्जन जानकारी (डीएलएल गुणों में नोट संस्करण टैब) के समान कैसे एक पारंपरिक तरीका है?लिनक्स: साझा पुस्तकालय और बाइनरी में संस्करण जानकारी कैसे एम्बेड करें?

+0

[फ़ाइल संस्करण जानकारी] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2296101/file-version-Information) –

उत्तर

9

सीवी या उपवर्तन का उपयोग करते हुए ऐसा करने का एक तरीका है विशेष स्रोत स्ट्रिंग विशेष रूप से आपकी स्रोत फ़ाइल में स्वरूपित है। फिर सीवीएस या एसवीएन को प्री-प्रतिबद्ध हुक जोड़ें जो परिवर्तन के दौरान फ़ाइल के नए संस्करण के साथ उस विशेष चर को अद्यतन करता है। फिर, जब बाइनरी बनाया जाता है, तो आप उस जानकारी को निकालने के लिए पहचान का उपयोग कर सकते हैं। उदाहरण के लिए:

अपने cpp फाइल करने के लिए कुछ इस तरह करें:

static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $"; 

और चल अध्यक्ष कार्यक्रम पर (जो आप आरसीएस स्थापित करके प्राप्त कर सकते हैं) एक आईडी स्ट्रिंग है कि फ़ाइलों के बारे में जानकारी दिखाना चाहिए उनमे।

ident program 
program: 
    $Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $ 

नोट के रूप में लोगों को टिप्पणी में उल्लेख किया है कि इस तकनीक पुरातन है। स्रोत नियंत्रण प्रणाली स्वचालित रूप से बदल जाती है, आपका स्रोत कोड बदसूरत है और तथ्य यह है कि स्रोत नियंत्रण में सुधार हुआ है जब सीवीएस एकमात्र विकल्प था जिसका मतलब है कि आप एक ही लक्ष्य को प्राप्त करने के लिए एक बेहतर तरीका ढूंढ सकते हैं।

+0

+1: मैं पहले कभी भी पहचान में नहीं आया, सबसे उपयोगी। –

+2

'पहचान' एक बार बहुत उपयोगी था, लेकिन वितरित संस्करण नियंत्रण प्रणाली की दुनिया में '$ आईडी $' तारों को एम्बेड करना मूर्खतापूर्ण हो गया है। यह diffs और विलय उलझन में है। – cdunn2001

1

इंटेल फोर्ट्रान और सी ++ कंपाइलर निश्चित रूप से ऐसा कर सकते हैं, -sox विकल्प का उपयोग करें। तो, हाँ एक रास्ता है। मुझे बाइनरी में ऐसी जानकारी एम्बेड करने के लिए किसी भी व्यापक सम्मेलन की जानकारी नहीं है और मैं आमतौर पर एम्बेडेड जानकारी पढ़ने के लिए हेक्सल-मोड में Emacs का उपयोग करता हूं, जो काफी हैकिश है।

'-sox' निष्पादन योग्य बनाने के लिए उपयोग किए गए कंपाइलर विकल्पों को भी एम्बेड करता है, जो बहुत उपयोगी है।

1

यदि आप program_version नामक एक चर घोषित करते हैं या इसी तरह आप यह पता लगा सकते हैं कि वेरिएबल किस पते पर संग्रहीत है और फिर इसके मूल्य को निकालने के लिए आगे बढ़ें। जैसे कि program_version पता 0000000000600a24 में रहता है और आकार 4. की है तो बस फाइल में उस पते पर मूल्य पढ़

objdump -t --demangle /tmp/libtest.so | grep program_version 
0000000000600a24 g  O .data 0000000000000004    program_version 

मुझसे कहता है।

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

3

, @sashang जवाब विस्तार करने के लिए "$ क्रमांक: $" मुद्दों @ cdunn2001, ...

ने उल्लेख आप केवल है कि एक फ़ाइल "version_info.h" अपनी परियोजना के लिए जोड़ सकते हैं:

#define VERSION_MAJOR "1" 
#define VERSION_MINOR "0" 
#define VERSION_PATCH "0" 
#define VERSION_BUILD "0" 

और अपने main.c फ़ाइल में रेखा है:

static char version[] = VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH "." VERSION_BUILD; 
static char timestamp[] = __DATE__ " " __TIME__; 

(या आप अपने कार्यक्रम में इन मूल्यों का उपयोग करना चाहते हालांकि)

0,123,

फिर एक प्री-बिल्ड चरण सेट करें जो version_info.h फ़ाइल को पढ़ता है, संख्याओं को उचित रूप से बाध्य करता है, और इसे फिर से लिखता है।एक दैनिक निर्माण केवल VERSION_BUILD संख्या को टक्कर देगा, जबकि एक और गंभीर रिलीज अन्य नंबरों पर टक्कर लगी होगी।

यदि आपकी मेकफ़ाइल आपकी ऑब्जेक्ट की पूर्व शर्त सूची पर सूचीबद्ध करती है, तो बिल्ड को इसकी आवश्यकता के अनुसार पुन: संकलित कर दिया जाएगा।

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