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