2010-07-07 9 views
5

मैं दृश्य-स्टूडियो (2005) प्रोजेक्ट के रूप में संकलित करने के लिए gnu टूल-चेन के एलडी के साथ जुड़े सी-प्रोग्राम को परिवर्तित करने के लिए संघर्ष कर रहा हूं। कार्यक्रम विभिन्न खंडों में। डेटा-प्रतीकों को रखता है और प्रारंभिक चरण के दौरान यह सेगमेंट के बीच डेटा कॉपी करता है। के पॉइंटर्स सेगमेंट की शुरुआत और अंत एलडी लिंकर स्क्रिप्ट में परिभाषित किया गया है।विजुअल स्टूडियो-प्रोजेक्ट में उपयोगकर्ता द्वारा परिभाषित सेगमेंट की शुरुआत के संदर्भ में कैसे देखें?

मैं समझता हूँ कि अलग, उपयोगकर्ता परिभाषित खंडों में चर का पता लगाने के लिए कैसे, लेकिन मैं यह पता लगाने की कैसे इस तरह के _start_of_my_segment के रूप में लिंकर स्थिरांक परिभाषित या करने में सक्षम havent अगर वहाँ दृश्य में एक लिंकर स्क्रिप्ट को कुछ इसी तरह है स्टूडियो।

मेरा लक्ष्य इस कार्यक्रम के साथ, स्रोत-कोड है कि लिंकर से परिभाषित प्रतीकों को संदर्भित करता है के लिए कोई संशोधन को संकलित करने के prefferably सक्षम होने के लिए है, लेकिन दृश्य स्टूडियो परियोजना में डेटा के अपने खुद के कस्टम लेआउट से ।

नीचे कुछ उदाहरण सी-कोड दिखाता है कि मैं करते हैं और एक (छीन नीचे, संभवतः वाक्य रचना-गलत) मेक-स्क्रिप्ट जब जीसीसी/ld के साथ जोड़ने के लिए प्रयोग किया जाता के संस्करण करना चाहते हैं क्या है।

किसी भी संकेत की सराहना की जाएगी!

#pragma data_seg("MY_DATA_FOO") 
#pragma data_seg("MY_DATA_BAR") 
#pragma comment(linker, "/section:MY_DATA_BAR,R") 

__declspec(allocate("MY_DATA_FOO")) int foo1; 
__declspec(allocate("MY_DATA_FOO")) int foo2; 

__declspec(allocate("MY_DATA_BAR")) int bar1 = 1; 
__declspec(allocate("MY_DATA_BAR")) int bar2 = 2; 

#pragma data_seg() 
void test() { 
    foo1 = bar1; 
    foo2 = bar2; 

    // i would rather do this as 
    //extern unsigned int __start_of_MY_DATA_FOO; 
    //extern unsigned int __start_of_MY_DATA_BAR; 
    //extern unsigned int __size_of_MY_DATA_BAR; 
    //memcpy(__start_of_MY_DATA_FOO, _start_of_MY_DATA_BAR, _size_of_MY_DATA_BAR); 
} 

छद्म लिंक-स्क्रिप्ट (क्या दृश्य स्टूडियो के लिए बराबर होगा

MEMORY 
{ 
    foo: org=0x1000, len=0x100 
    bar: org=0x2000, len=0x100 
} 

SECTIONS 
{ 
    GROUP: 
    { 
     MY_DATA_FOO : {} 
     __start_of_MY_DATA_FOO = ADDR(MY_DATA_FOO); 
     __end_of_MY_DATA_FOO = .; 
     __size_of_MY_DATA_FOO = SIZEOF(MY_DATA_FOO); 
    } > foo 

    GROUP: 
    { 
     MY_DATA_BAR : {} 
     __start_of_MY_DATA_BAR = ADDR(MY_DATA_BAR); 
     __end_of_MY_DATA_BAR = .; 
     __size_of_MY_DATA_BAR = SIZEOF(MY_DATA_BAR); 
    } > bar 
} 
+0

के लिए

विलय क्षेत्रों से हटाया जा सकता यह वास्तव में कुछ है कि नहीं किया जाना चाहिए है। निश्चित रूप से एक ही कार्यक्रम लिखने के पोर्टेबल तरीके हैं। लगता है कि किसी ने सोचा था कि वे सी का उपयोग करने के बजाय निम्न स्तर के निर्माण श्रृंखला आंतरिक के साथ चतुर मूर्खतापूर्ण थे ... यह मानने के बाद लगभग एक कदम है कि आप अपने कॉलर में कॉल किए गए फ़ंक्शन से स्थानीय चर का उपयोग कर सकते हैं ... –

+0

@ R : इस पैटर्न का उपयोग करने के लिए दुर्लभ लेकिन कभी-कभी सभ्य कारण हैं। मैंने डीबग चेक जोड़ने के लिए इसका इस्तेमाल किया है। रिलीज में, मेरी वस्तुएं स्वतंत्र हैं और एक-दूसरे के बारे में नहीं जानती हैं। लेकिन डिबगिंग के लिए, वे करते हैं। "कानूनी सी/सी ++" तरीका यह ट्रैक करने के लिए एक केंद्रीय रजिस्टर है, केवल डीबगिंग के लिए बनाया गया है, वास्तव में इस दृष्टिकोण की तुलना में 200+ चीजों के लिए बहुत अधिक रखरखाव है (यह दृष्टिकोण स्वचालित है)। दूसरी तरफ, आयात योग्यता एक अलग लागत है जो यह लाती है। – VoidStar

उत्तर

0

अतिरिक्त सेगमेंट (वे स्मृति में वर्णानुक्रम रखा जाता है) बनाएँ:

#pragma data_seg("MY_DATA_FOO__a") 
#pragma data_seg("MY_DATA_FOO__z") 
#pragma data_seg("MY_DATA_FOO__m") 

__declspec(allocate("MY_DATA_FOO__a")) int fooFirst; 
__declspec(allocate("MY_DATA_FOO__z")) int fooLast; 
__declspec(allocate("MY_DATA_FOO__m")) int foo1; 
__declspec(allocate("MY_DATA_FOO__m")) int foo2; 

तब के बीच सब कुछ नकल & fooFirst और & fooLast

+0

सुझाव के लिए धन्यवाद। हालांकि, जब मैं इसे आज़माता हूं, तो fooFirst का पता fooLast से कम नहीं है, और foo1 और fooLast से अधिक है। इसके अलावा सेगमेंट को 0x1000 ब्लॉक तक संरेखित करने के लिए कुछ पैडिंग भी प्रतीत होती है। यह कुछ कंपाइलर- और लिंकर-सेटिंग्स द्वारा समायोज्य हो सकता है। आपने किन सेटिंग्स का उपयोग किया है इस पर कोई संकेत? – ara

+0

फिर से धन्यवाद! मुझे #pragma init_seg (यहां http://msdn.microsoft.com/en-us/library/7977wcck.aspx) के लिए दस्तावेज़ में सुझाव देने वाली चाल का एक उदाहरण मिला। यह कहता है "अनुभाग नाम 8 अक्षर या उससे कम होना चाहिए।$ से पहले एक ही नाम वाले अनुभाग एक खंड में विलय कर दिए गए हैं। ऑर्डर जो वे विलय किए जाते हैं, उन्हें $ के बाद वर्णों को सॉर्ट करके निर्धारित किया जाता है, और जब मैंने अनुभाग-नामों को "MY_DATA_FOO $ a" में बदल दिया, तो वे सही ढंग से सॉर्ट किए गए। हालांकि प्रत्येक अनुभाग-आकार अभी भी शून्य है लगभग 0x100 बाइट तक पैड किया गया है जो सेगमेंट के "उचित" अंत को जानना मुश्किल बनाता है। – ara

+0

यहां एटीएल स्रोतों का एक उदाहरण दिया गया है: #pragma सेक्शन ("एटीएल $ __ ए", पढ़ा, साझा किया गया) #pragma सेक्शन ("ATL $ __ Z", पढ़ने, साझा) #pragma खंड ("ATL $ __ मीटर", पढ़ा, साझा) प्रयास करें अनुभाग के बजाय data_seg। –

3

गद्दी उदाहरण

#pragma data_seg(".foo_begin") 
#pragma data_seg(".foo_data") 
#pragma data_seg(".foo_end") 

#pragma comment(linker, "/merge:.foo_begin=.foo") 
#pragma comment(linker, "/merge:.foo_data=.foo") 
#pragma comment(linker, "/merge:.foo_end=.foo") 

__declspec(allocate(".foo_begin")) int foo_begin_marker; 
__declspec(allocate(".foo_end")) int foo_end_marker; 

__declspec(allocate(".foo_data")) int foo_data; 
+1

धन्यवाद! हालांकि, मुझे अभी भी चर के बीच 0x100 बाइट पैडिंग मिलती है, (क्या आप नहीं?)। मर्ज-कमांड के बिना पैडिंग 0x1000 बाइट्स है और सेगमेंट गलत क्रम में समाप्त होते हैं, इसलिए मर्ज-कमांड का कुछ प्रभाव होता है और अन्य दृष्टिकोण (अनुभाग नामों में $ का उपयोग करके) के समान ही उपयोगी लगता है। – ara

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