Forum: Compiler & IDEs Fehler beim Linken mit Yagarto und LPC2148


von Geri (Gast)


Lesenswert?

Hallo zusammen

Ich habe mir YAGARTO installiert (arm-none-eabi.as, etc.) und wollte ein 
bestehendes Programm für einen LPC2148-Controller compilieren und 
linken. Bisher habe ich mit WINARM compiliert. Files mit der Endung .o 
und .d werden erzeugt, beim Linken erhalte ich aber folgende Fehler:
1
linking...
2
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2\libgcc.a(unwind-arm.o): In function `get_eit_entry':
3
C:\msys\1.0\home\yagarto\gcc-build\arm-none-eabi\libgcc/../../../gcc-4.6.2/libgcc/../gcc/config/arm/unwind-arm.c:614: undefined reference to `__exidx_start'
4
C:\msys\1.0\home\yagarto\gcc-build\arm-none-eabi\libgcc/../../../gcc-4.6.2/libgcc/../gcc/config/arm/unwind-arm.c:614: undefined reference to `__exidx_end'
5
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-abort.o): In function `abort':
6
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/../../../../../newlib-1.19.0/newlib/libc/stdlib/abort.c:63: undefined reference to `_exit'
7
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_kill_r':
8
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:61: undefined reference to `_kill'
9
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_getpid_r':
10
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:96: undefined reference to `_getpid'
11
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
12
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/sbrkr.c:60: undefined reference to `_sbrk'
13
collect2: ld returned 1 exit status


Da sich das Startup-File und das Linker-File nicht geändert haben, frage 
ich mich was ich mich, was ich machen muss, damit das Linken 
funktioniert.

Habt ihr vielleicht eine Idee?

Beste Grüsse

Geri

von Stefan ++ (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

die ersten zwei Zeilen (mit `__exidx_start' und `__exidx_end') 
verschwinden mit dem passenden Linker-Script (siehe Anhang)

die letzte Zeile (mit '_sbrk_r') verschwindet wenn du zusätzlich die 
Source "syscalls.c" mit auf nimmst. (wird gebraucht bei z.B. printf(...) 
etc.)

Die anderen Fehler hatte ich selber auch noch nicht, vielleicht kann 
hier wer anderer helfen?

Verwendest Du auch Eclipse ???

von Klaus W. (mfgkw)


Lesenswert?

hm, du scheinst also für ein System ohne Betriebssystem zu kompilieren?
Dann machen Sachen wie getpid() oder kill() kaum Sinn; da musst du ggf. 
dein Programm ändern.

von Stefan ++ (Gast)


Lesenswert?

Hallo,

hatte noch vergessen zu sagen, dass du beide Files auf deine Bedürfnisse 
anpassen musst!

im Linker-Skript die Stack-Grössen
und im syscalls.c die Ausgabe-Routine (dort steht momentan 
USB_VCOM_putchar) !!!

von Geri (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Stefan und Klaus

Vielen Dank für eure Hilfe!


@Stefan:
Ich habe dieses Beispiel mit einer Batchdatei compiliert. Sonst habe ich 
den den Editor von Keil und Eclipse verwendet. Mit deinem Linker-File 
haben sich die Fehler schon "gelichtet! Kann es vielleicht sein, dass in 
meinem Startup-File noch Definitionen fehlen oder anderweitig definiert 
sind? Für mich liest sich das Ganze etwas kryptisch..


[CODE]
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-n 
one-eabi/bin/ld.exe:  warning: cannot find entry symbol _start; 
defaulting to 0000012c
.\\obj_yagarto\\crt.o: In function `Reset_Handler':
C:\privat\YagEx1/crt.s:107: undefined reference to `_stack_end'
C:\privat\YagEx1/crt.s:107: undefined reference to `_data'
C:\privat\YagEx1/crt.s:107: undefined reference to `_bss_start'
C:\privat\YagEx1/crt.s:107: undefined reference to `_bss_end'
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-n 
one-eabi/lib\libc.a(lib_a-abort.o):  In function `abort':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/. 
./../../../../newlib-1.19.0/newlib/libc/stdlib/abort.c:63:  undefined 
reference to `_exit'
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-n 
one-eabi/lib\libc.a(lib_a-signalr.o):  In function `_kill_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:61:  undefined 
reference to `_kill'
c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-n 
one-eabi/lib\libc.a(lib_a-signalr.o):  In function `_getpid_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:96:  undefined 
reference to `_getpid'
[CODE]

USB_VCOM_putchar liest sich gut. Ich verwende einen Uart als 
Schnittstelle.

@Klaus:
Ich habe ein ganz einfaches Beispiel geschrieben, bei dem eine LED ein- 
und ausgeschaltet werden soll. Dieses Beispiel würde ich gerne auf dem 
LPC ohne Betriebssystem laufen lassen.

Beste Grüsse und vielen Dank nochmals

Geri

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Geri schrieb:
>
1
> c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/bin/ld.exe:
2
> warning: cannot find entry symbol _start; defaulting to 0000012c
3
>
Im Linkerscript ist eine Label _start angegeben, das im Startup-Code 
nicht existiert.

>
1
> .\\obj_yagarto\\crt.o: In function `Reset_Handler':
2
> C:\privat\YagEx1/crt.s:107: undefined reference to `_stack_end'
3
> C:\privat\YagEx1/crt.s:107: undefined reference to `_data'
4
> C:\privat\YagEx1/crt.s:107: undefined reference to `_bss_start'
5
> C:\privat\YagEx1/crt.s:107: undefined reference to `_bss_end'
6
>
Die im Startup-Code verwendeten Symbole passen nicht zu denen im 
Linkerscript (z.B. startup: _bss_start, Linkerscript: _bss_start_)

Für den Anfang nicht Startup-Code und Linkerscript aus verschiedenen 
Quellen mischen - das spart "Stress".

>
1
> c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-abort.o):
2
> In function `abort':
3
> C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/../../../../../newlib-1.19.0/newlib/libc/stdlib/abort.c:63:
4
> undefined reference to `_exit'
5
> c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o):
6
> In function `_kill_r':
7
> C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:61:
8
> undefined reference to `_kill'
9
> c:/programs/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o):
10
> In function `_getpid_r':
11
> C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:96:
12
> undefined reference to `_getpid'
13
>
Wird mit Option "-nostartfiles" gelinkt? Standard abort-Funktion wird, 
wenn richtig erinnert, von Standard Startup-Code der newlib genutzt 
verursacht ihrerseits einige Abhängigkeiten. Normalerweise kann man mit 
eigenem Startup-Code darauf verzichten oder gegebenfalls eine eigene 
Funktion implementieren.

von Geri (Gast)


Lesenswert?

Hallo Martin

Danke für deine Hilfe!
Das Ganze kommt wohl, wenn man keine Ahnung hat was im Hintergrund 
abläuft und dann anfängt zu probieren. Eigentlich wollte ich lediglich 
den Compiler, der mit WINARM mitkommt aktualisieren.

Mit "nostartfiles" habe ich compiliert.

Falls jemand von euch ein kleines Beispiel hat, welches sich mit dem 
aktuellen Yagarto compilieren lässt, dann wäre ich sehr dankbar.

Beste Grüsse und vielen Dank nochmals

Geri

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.