Forum: Compiler & IDEs Problem: C-Program with Eclipse+CDT+GNUARM for ARM920t-target with Linux 2.6.22


von tiigeri (Gast)


Lesenswert?

Hallo zusammen,
ich hab hier eine kleine Box (ARM 920t) mit BusyBox (Linux 2.6.22) und 
Zugriff auf das Dateisystem. Würde gerne ein HelloWorld C-Programm auf 
Vista kompilieren, aufs target-System kopieren und ausführen.

Habe dazu installiert:
Eclipse for C/C++ (eclipse-cpp-galileo-SR1-win32.zip)
Eclipse CDT (cdt-master-6.0.1.zip)
GNUARM Plugin (org.eclipse.cdt.cross.arm.gnu_0.5.3.200904072239.jar)
GNUARM (bu-2.16.1_gcc-4.1.0-c-c++_nl-1.14.0_gi-6.4.exe)

Nun mache ich in Eclipse ein neues "C-Project", "ARM Cross Target 
Aplication" und füge ein main.c hinzu.
Unter Properties->Target Processor wähle ich "arm920t" aus und 
compiliere.

Leider bekomme ich beim linken dann:
...
Building target: App_gnuarm.elf
Invoking: ARM Windows GCC C Linker
arm-elf-gcc -nodefaultlibs -Wl,-Map,App_gnuarm.map -mcpu=arm920t -mthumb 
-g3 -gdwarf-2 -o"App_gnuarm.elf"  ./main.o
/cygdrive/c/gnuarm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/ 
thumb/crt0.o:  In function `__change_mode':
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:89: 
undefined reference to `memset'
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:95: 
undefined reference to `initialise_monitor_handles'
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:216: 
undefined reference to `atexit'
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:217: 
undefined reference to `__libc_init_array'
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:223: 
undefined reference to `exit'
/cygdrive/c/gnuarm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/ 
thumb/crt0.o:  In function `change_back':
../../../../../../../newlib-1.14.0/newlib/libc/sys/arm/crt0.S:238: 
undefined reference to `__libc_fini_array'
collect2: ld returned 1 exit status
make: *** [App_gnuarm.elf] Error 1


Habe das Gleiche bereits mit Winarm, cygwin und yagarto ausprobiert 
...kein Erfolg.

Leider bin ich ziemlich unerfahren in diesem Gebiet...Mache ich hier 
denn grundsätzlich das Richtige? Sind die Linker-Optionen denn richtig?
Kann leider kein Makefile schreiben und dachte, daß Eclipse mit der 
Toolchain eben gerade dafür da ist.

Hat hier jemand schon mal ein ähnliches Problem gehabt oder kennt jemand 
eine Anleitung oder Beispiel für ein simples ausführbares C-Programm für 
ein ARM-target mit Linux?

Vielen Dank...komme selber nicht mehr weiter.

von Klaus W. (mfgkw)


Lesenswert?

Wenn sich sinst keiner bemüßigt fühlt...

Ich habe nun keine Ahnung von deinem konkreten System, aber
die Fehlermeldungen kommen mir trotzdem bekannt vor.

Das Problem ist, daß du mit -nodefaultlibs explizit sagst, keine
Standard-Laufzeit-Bibliotheken haben zu wollen und dementsprechend
die Meldung bekommst, daß aus der Standard-C-Lib dann logischerweise
memset() etc. fehlen.

1. Lösungsmöglichkeit: im Makefile oder wo auch immer es definiert
ist -nodefaultlibs entfernen.
Kann klappen, muß aber nicht - vielleicht ist es ja mit Absicht da.

-oder-

2. Die fehlenden Bibliotheken dazu linken (bei den Linkeroptionen).
Das geht z.B. mit der Option -lc (für eine libc.a beispielsweise)
oder Angabe des Klarnamens (z.B. libc.a).

Die Standardfunktionen wie memset sind in der C-Lib zu finden, die
wie gesagt libc.a oder so ähnlich heißen wird.

Andere Namen, die vielleicht auch angemäkelt werden und dort
nicht drin sind, können dann evtl. weitere Bibliotheken nötig
machen. Um herauszufinden welche das sind, kann man ein
Kommando namens nm (im Original-GNU-System, ggf. bei einem
System zum Crosskompilieren auch irgendwas-nm.exe oder so ähnlich).
Damit kann man u.a. ausgeben lassen, welche Namen in einer Lib
definiert sind (als exportierte Symbole).

von tiigeri (Gast)


Lesenswert?

Vielen Dank, Klaus!
Das funktioniert...

Habe mal das Project.elf aufs target kopiert und ausgeführt -> Leider 
"Illegal instruction"

Noch ne Idee?
Muss das Target das ELF-Format irgendwie explizit unterstützen?


Dankeeeee

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.