2012-12-05 15 views
6

ARM mikroişlemci platformu için Yagarto ve Eclipse kullanarak basit bir proje oluşturmaya çalışıyorum. Benim başlangıç ​​kodunda, bu (İnanıyorum ki oldukça standart ve ilgi çekmeyen) vardır:Neden __libc_init_array içinde _init için tanımlanmamış bir referansım var?

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 
: Ben __libc_init_array() çağrısı açýklama sürece, bağlayıcı gelen hata şu olsun

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) { ; } 
} 

Neden "tanımlanmamış başvuru" hatasını alıyorum? Neyi kaçırıyorum? Kaybettiğim bir bağlantı bayrağı var sanırım, ama hayatımın ne için olduğunu anlayamıyorum.

cevap

5

Uzman değilim ama:

Muhtemelen _init (normal çalışma zamanı giriş noktası) ctor ve dtor tabloları yürütür kod başvurur. Sen kullanmak

böylece standart başlangıç ​​önlemek -nostartfiles ve muhtemelen o bütün startcode --gc-bölümleri ile elimine edilir. Açık arama tekrar bir referans ekler.

--gc bölümlerini atlamak bunu çözmezse, giriş kodunu her zaman saklayan (gömülü) linker komut dosyanızda eksik bir keep() deyimi veya başlangıç ​​kodu (startup_ *) bu

+0

Yani, ince derler. Bu işlevin ne yapması gerektiğini merak ediyorum? – Mark

+0

_init genellikle bir ikili yüklendiyse, OS'nin atladığı ikili sistemdeki noktadır. Giriş noktası için varsayılan etiket az çok. Sorun nasıl çözülür, gömülü yükleyici sisteminizin nasıl kurulduğuna bağlıdır. Bana göre bu alet zinciri mükemmel bir şekilde taşınmadı. –

+0

Ben ... Bu Cortex-M4 (veya daha spesifik I + kopya internetten bunu yapıştırılan) Ben başlangıç ​​kodunu kendim yazdım, bir "gömülü yükleyici sistemi" yok ve ResetHandler çok ilkidir (ve sadece) yürütülen şey. – Mark

4

Oldish soru başvurmak ama benzer bir sorun karşılaştı ve Marco van de Voort belirtildiği gibi normal içerecek şekilde, -nostartfiles bağlayıcı seçeneği atlamalısınız __libc_init_array kullanmaya gidiyoruz çözüm oldu gerektiğini libc init işlevleri. Yinelenen cevap. İkinci olarak, libc vb. Kod tüketimini azalttığından, gcc-arm ile bağlantı kurarken (bence yargarto bir çatal veya gcc-armunun bir precompile olduğuna inanıyorum) --specs=nano.specs bayrağını dahil etmenizi öneririm. Benim başlangıç ​​koduna geçersiz _init (void) {} ​​eklerseniz

İlgili konular