2012-12-25 44 views
7

मैं एक ARM Cortex एम 3 (मेपल मिनी) के लिए Gentoo में सी ++ crosscompiling हूँ, लेकिन लगता है का आकार कम स्मृति संसाधनों के साथ एक छत मारा है, जब योगिनी फ़ाइल.rodata

/usr/libexec/gcc/arm-none-eabi/ld: build/maple_mini.elf section `.rodata' will not fit in region `rom' 
/usr/libexec/gcc/arm-none-eabi/ld: region `rom' overflowed by 1508 bytes 

जोड़ने यह पोस्ट elf-file के लिंक को पूरा करने में सक्षम होने के लिए .rodata की सामग्री के आकार को कम करने के तरीके के बारे में एक प्रश्न है।

मैंने शामिल कोड को तोड़ दिया है, और निम्नलिखित प्रासंगिक विकल्पों के साथ संकलित कर रहा हूं।

CXXFLAGS = -fno-rtti -fno-exceptions -Os -fdata-sections -ffunction-sections -Wl,-gc-sections ... 
LDFLAGS = -Wl,-gc-sections -fno-exceptions -fno-rtti ... 

फिर भी, नक्शे-फ़ाइल में .rodata (जिसके साथ मैं काफी अपरिचित हूँ) शामिल हैं क्या कार्यक्रम में कक्षाओं से प्रत्येक के लिए प्रकार की जानकारी किसी तरह का हो रहा है। कुछ नक्शा फाइल अंश

0x000000000801d6c0  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d6c0 _ZTVN5syrup6SensorILi6EEE 
.rodata._ZTVN5syrup11SuperSensorILi6EEE 0x000000000801d6e8  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d6e8    _ZTVN5syrup11SuperSensorILi6EEE 
.rodata._ZTVN5syrup7MPU6050E 0x000000000801d710  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d710    _ZTVN5syrup7MPU6050E 
.rodata._ZTVN5syrup6SensorILi1EEE 
    0x000000000801d738     0x28 .../libsyrup.a(MS5611.o) 
    0x000000000801d738    _ZTVN5syrup6SensorILi1EEE 
.rodata._ZTVN5syrup11SuperSensorILi1EEE 
      0x000000000801d760   0x28 .../libsyrup.a(MS5611.o) 
      0x000000000801d760    _ZTVN5syrup11SuperSensorILi1EEE 
... 
      0x000000000801ee24   0x6f3 .../libstdc++.a(cp-demangle.o) 
             0x730 (size before relaxing) 
*fill*   0x000000000801f517  0x1 
.rodata  0x000000000801f518  0x14 .../libgcc.a(unwind-arm.o) 
.rodata  0x000000000801f52c  0x23c .../libc.a(lib_a-strerror.o) 
.rodata.str1.4 0x000000000801f768 0x635 .../libc.a(lib_a-strerror.o) 
             0x63c (size before relaxing) 

तो, lib_a-strerror.o और CP-demangle.o (ध्यान दें। MPU6050 एक SuperSensor <> जो एक सेंसर < है>, एक C++ भावना है) ऐसा लगता है कि अधिकतर जगह क्या होती है, हालांकि मुझे लगता है कि ये काफी महत्वपूर्ण हैं।

तो, मेरा सवाल यह है कि, कोडोडा अनुभाग को कम करने (या कोड को पुन: स्थापित करने) के लिए और क्या कदम उठाए जा सकते हैं, और वहां वास्तव में क्या संग्रहीत किया जाता है? किसी भी सुझाव का स्वागत है! मैं संकलन और लिंकिंग के गहरे कामकाज के लिए बिल्कुल नया हूं, लेकिन सीख रहा हूं।

+0

ये सी और सी ++ रनटाइम पुस्तकालयों से जुड़े त्रुटि संदेश स्ट्रिंग हैं। वे उपयोगकर्ता को बताते हैं कि आपका प्रोग्राम क्रैश क्यों हुआ। उनसे छुटकारा पाने के लिए रनटाइम पुस्तकालयों को फिर से लिखना होगा, बिल्कुल व्यावहारिक नहीं, लेकिन यह किया गया है। –

उत्तर

7

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

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

+1

धन्यवाद, आगे की सफाई में मैंने एक भयानक गड़बड़ी का पता लगाया, जिसमें मानक लाइब्रेरी के कुछ हिस्सों को शामिल करने की एक प्रमुख जड़ लगती थी जो स्वयं को अव्यवस्थित करती थी।यहां प्रमुख बिंदु stdlib (नए और हटाए गए ऑपरेटरों सहित) पर निर्भरता को कम से कम कम करने के लिए प्रतीत होता है। – templar

6

अंतर्निहित मुद्दा यह नहीं है कि .rodata अनुभाग बहुत बड़ा है, जरूरी है - आप सामान्य रूप से रोम स्पेस से बाहर हो रहे हैं। (लिंकर बस, जबकि यह उस अनुभाग में लिंक कर रहा है सीमा तक पहुंच गए होने के लिए होता है।)

कार्यों ऐसे perror, strerror, और कंपनी के रूप में strerror.o पर निर्भरता छोड़ने पहुंचना चाहिए करने के लिए किसी भी कॉल को निकाला जा रहा है, जो आप किलोबाइट सहेजना चाहिए और आधा आप खत्म हो गए हैं। अन्य, आसान तरीके हो सकते हैं कि आप वही बचत कर सकें, हालांकि - यह सब आपके आवेदन पर निर्भर करता है।