c क्यों हाथ-कोई-एबीआई-आकार रिपोर्ट करता है। डेटा अनुभाग 0 होने के बावजूद मैं आरम्भिक RAM का उपयोग कर रहा हूं?




linker embedded (2)

जब मैं अपने टूलकेन (यगार्टो और कोसोसरीज़) आकार उपयोगिता का उपयोग करता हूं, तो मैं परिणामों से थोड़ा उलझन में हूँ यह रिपोर्ट कर रहा है कि मैं डेटा अनुभाग में 0 बाइट्स का उपयोग कर रहा हूं। निचे देखो

$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf
   text    data     bss     dec     hex filename
  79364       0   34288  113652   1bbf4 rest-server-example.crazy-horse.elf

मुझे पता है कि मेरा कोड 0 के अलावा अन्य मानों के लिए स्थिर रैम वेरिएबल्स का प्रयोग कर रहा है और आरंभ कर रहा है

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

उदाहरण:

   text    data     bss     dec     hex filename
   1648       0      20    1668     684 obj_crazy-horse/uip-nd6.o
    200      12    2652    2864     b30 obj_crazy-horse/uip-packetqueue.o
     12       0       0      12       c obj_crazy-horse/uip-split.o
   1816      24      48    1888     760 obj_crazy-horse/usb-core.o
    284       0       0     284     11c obj_crazy-horse/usb-interrupt.o
   2064      20     188    2272     8e0 obj_crazy-horse/xmac.o

क्यों डीएफटी फाइल के लिए एल्फ फाइल रिपोर्ट 0 होगा जब ऑब्जेक्ट फाइलें गैर-शून्य मान रिपोर्ट कर रही होंगी?

FYI मैं एक AT91SAM7x256 माइक्रो के लिए एम्बेडेड सॉफ़्टवेयर पर काम कर रहा हूं

संपादित करें:

सीएफएलएजी और एलडीएफएएलजीएस को जोड़ना

CFLAGS  += -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map

# 2 को संपादित करें: ऑब्जेक्ट डंप से हम स्पष्ट रूप से देख सकते हैं कि .डेटा अनुभाग में डेटा को निर्दिष्ट किया गया है लेकिन आकार की उपयोगिता किसी कारण के लिए ओजडम्प लिंक नहीं उठा रही है

मैं जो देख रहा हूं वह मेरी रैम का सटीक उपयोग करना है I यह पता लगाने की कोशिश नहीं कर रहा है कि मेरा एक चर ऑप्टिमाइज़ किया गया था या नहीं।

3 संपादित करें: अधिक जानकारी यह दिखाती है कि आकार उपयोगिता .data अनुभाग में कुछ दिखाई देती है

$ arm-none-eabi-size.exe -A -t -x  rest-server-example.crazy-horse.elf
rest-server-example.crazy-horse.elf  :
section              size       addr
.vectrom             0x34   0x100000
.text             0x10fc8   0x100038
.rodata            0x149c   0x111000
.ARM.extab           0x30   0x11249c
.ARM.exidx           0xe0   0x1124cc
.data              0x1028   0x200000
.bss               0x7bec   0x201028
.stack              0xa08   0x20f5f8
.ARM.attributes      0x32        0x0
.comment             0x11        0x0
.debug_aranges      0xc68        0x0
.debug_info       0x2b87e        0x0
.debug_abbrev      0x960b        0x0
.debug_line        0x9bcb        0x0
.debug_frame       0x4918        0x0
.debug_str         0x831d        0x0
.debug_loc        0x13fad        0x0
.debug_ranges       0x620        0x0
Total             0x7c4c5

मेरी व्याख्या होगी कि लिंकर स्क्रिप्ट एक एकल लोड करने योग्य अनुभाग बनाता है, जिसमें डेटा अनुभाग के आरंभिक मान और स्टार्टअप कोड का एक टुकड़ा शामिल होता है जो डेटा को अप्रयुक्त डेटा अनुभाग में प्रतिलिपि बनाता है।

यह आवश्यक है यदि आप एक एकल इमेज फाइल करना चाहते हैं जो केवल-पढ़ने वाली मेमोरी से चला सकती है, क्योंकि सामने में कोई एल्फ़ लोडर नहीं है, जो आपके लिए यह प्रतिलिपि करेगा।

आम तौर पर, यह केवल खंड में सेगमेंट मैपिंग (अर्थात आउटपुट अनुभागों को लिंकर स्क्रिप्ट में > अनुभाग प्लेसमेंट कमांड का उपयोग करके व्यवस्थित किया जाता है) के बजाय इनपुट अनुभाग को दो बार मैप करने के लिए किया जाता है, लेकिन यह निश्चित रूप से संभवतः भी संभव है

उपयोग संख्या काफी सटीक हैं: पाठ का आकार आवश्यक फ्लैश स्पेस की मात्रा है, बीएसएसएस का आकार आवश्यक राम की मात्रा है आरंभिक डेटा को दो बार गिना जाता है, एक बार फ़्लैश में प्रारंभिक डेटा के लिए, और एक बार राम में संशोधित डेटा के लिए।


आपके .डेटा अनुभाग में कोड एट्रिब्यूट सेट है, और यह "बांह-कोई नहीं-एबी-आकार" को भ्रमित करता है डेटा आकार के बजाए कुल पाठ आकार में .डेटा अनुभाग का आकार गलत रूप से जोड़ा गया है।

मेरा अनुमान है कि आपके पास कुछ कोड है जो फ्लैश में संग्रहीत है, लेकिन रन समय पर राम को प्रतिलिपि किया गया है जैसे कि एक तेज़ इंटरप्ट हैंडलर या फ्लैश रिप्रोग्रामिंग जिसे रैम से चलना चाहिए। यह डेटा सेगमेंट के लिए कोड विशेषता सेट करेगा, और "आकार" का मानना ​​है कि सभी। डेटा टेक्स्ट है