2012-12-05 15 views
6

मैं एआरएम माइक्रोकंट्रोलर प्लेटफॉर्म के लिए यागार्टो और एक्लिप्स का उपयोग करके एक साधारण प्रोजेक्ट बनाने का प्रयास कर रहा हूं। मेरी स्टार्टअप कोड में, मैं इस (जो मेरा मानना ​​है कि काफी मानक और अरुचिकर है):मेरे पास __libc_init_array में _init के लिए एक अनिर्धारित संदर्भ क्यों है?

void Reset_Handler(void) 
{ 
    /* Initialize data and bss */ 
    __Init_Data(); 

    /* Call CTORS of static objects */ 
    __libc_init_array(); 

    /* Call the application's entry point.*/ 
    main(); 

    while(1) { ; } 
} 

जब तक मैं __libc_init_array() करने के लिए कॉल बाहर टिप्पणी, मैं लिंकर से त्रुटि निम्नलिखित हो:

arm-none-eabi-g++ -nostartfiles -mthumb -mcpu=cortex-m4 -TC:/Users/mark/workspace/stm32_cpp_test/STM32F40x_1024k_192k_flash.ld -gc-sections -Wl,-Map=test_rom.map,--cref,--no-warn-mismatch -o stm32_cpp_test "system\\syscalls.o" "system\\startup_stm32f4xx.o" "system\\mini_cpp.o" "system\\cmsis\\system_stm32f4xx.o" main.o 
d:/utils/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-init.o): In function `__libc_init_array': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\misc/../../../../../../../newlib-1.20.0/newlib/libc/misc/init.c:37: undefined reference to `_init' 
collect2.exe: error: ld returned 1 exit status 

मुझे यह "अपरिभाषित संदर्भ" त्रुटि क्यों मिल रही है? मैं क्या खो रहा हूँ? मुझे लगता है कि कुछ लिंकर ध्वज है जो मुझे याद आ रहा है, लेकिन मैं अपने जीवन के लिए क्या नहीं समझ सकता।

उत्तर

5

मैं कोई विशेषज्ञ हूँ, लेकिन:

शायद _init (सामान्य क्रम प्रवेश बिंदु) का संदर्भ कोड कि ctor और dtor टेबल निष्पादित करता है।

आप -स्टार्टर्टफाइल का उपयोग करते हैं तो मानक स्टार्टअप से बचें, और शायद पूरे स्टार्टकोड को --gc-section द्वारा समाप्त किया गया है। स्पष्ट कॉल फिर से एक संदर्भ जोड़ता है।

यदि छोड़े गए - जीसी-सेक्शन इसे हल नहीं करते हैं, तो यह आपके (एम्बेडेड) लिंकर स्क्रिप्ट में एक लापता रखने() कथन भी हो सकता है जो हर समय एंट्री कोड रखता है, या अपना स्टार्टअप कोड (startup_ *) यह

+0

तो, यदि मैं अपने स्टार्टअप कोड में शून्य _init (शून्य) {} जोड़ता हूं, तो यह ठीक से संकलित करता है। मुझे आश्चर्य है कि यह कार्य क्या करना है? – Mark

+0

_init बाइनरी में आमतौर पर बिंदु है जब ओएस कूदता है तो बाइनरी लोड हो जाती है। प्रविष्टि बिंदु के लिए एक डिफ़ॉल्ट लेबल अधिक या कम। समस्या को ठीक करने के तरीके पर निर्भर करता है कि आपके एम्बेडेड लोडर सिस्टम की स्थापना कैसे की जाती है। मेरे लिए ऐसा लगता है कि यह टूलचैन पूरी तरह से पोर्ट नहीं किया गया है। –

+0

मेरे पास "एम्बेडेड लोडर सिस्टम" नहीं है, मैंने स्टार्टअप कोड स्वयं लिखा है (या, विशेष रूप से मैं कॉपी करता हूं + इसे इंटरनेट से चिपकाता हूं) ... यह कॉर्टेक्स-एम 4 है, और रीसेट हैंडलर पहले (और केवल) चीज निष्पादित। – Mark

4

बूढ़ा सा सवाल का उल्लेख होना चाहिए, लेकिन मैं ने वही समस्या का सामना करना पड़ा और समाधान के रूप में मार्को वैन डे Voort संकेत दिया आप __libc_init_array उपयोग करने के लिए आप -nostartfiles लिंकर विकल्प छोड़ देना चाहिए, सामान्य शामिल करने के लिए जा रहे हैं किया गया था, libc init कार्यों। डुप्लिकेट जवाब।

दूसरा, मैं --specs=nano.specs ध्वज को जीसीसी-बांह से जोड़ते समय ध्वजांकित करता हूं (मुझे विश्वास है कि यर्गर्टो एक कांटा है या यहां तक ​​कि केवल जीसीसी-बांह का एक प्रीकंपाइल है), क्योंकि यह libc आदि कोड खपत को कम करता है।

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