Lass dir mal eine .map file generieren und schaue dort ob die Funktion
_sbrk() wirklich vorhanden ist. evtl. Kannst du ja mal dann die .map
file posten
Hallo Martin,
den Link auf Deine Seite habe ich (natürlich :-) schon in anderen
Threads gefunden und - nach bestem Wissen und Gewissen - genutzt. Die
newlib_stubs.c entspricht ja Deiner syscalls.c - soweit ich das sehen
kann. Das Verständnis Deines Makefile erfordert allerdings etwas
solidere Erfahrung, als ich sie derzeit mitbringe. Deshalb bin ich mir
auch nicht sicher, ob ich beim "Übertragen" der Linker Optionen etwas
wichtiges übersehen habe.
Ich bin schon am Grübeln, ob ich die Nutzung der newlib mit den Stubs
gleich ganz sein lasse und statt malloc/free aus der Lib eine eigene
"primitiv"-Allokation aufmache. Denn im Grunde will ich ja nur in der
Lage sein, Speicher zur Laufzeit zu allokieren, um aus
Konfigurationsdaten Objekte zu erzeugen, die dann aber ständig erhalten
bleiben. Eine Freigabe per free() muß noch nicht einmal unterstützt
werden. Ich frage mich nur, ob ich damit (für meine Kenntnisse) ein zu
großes großes Fass aufmache.., habe aber dennoch schon mal
http://developers.stf12.net/cpp-demo/gcc-linker-script-and-stm32-a-tutorial
angelesen.
Ich mache mich jetzt mal an den Vorschlag, die .map Datei zu erzeugen.
Grüße
schnack
C. D. schrieb:> Demnach war die alte Signatur wohl doch passend, hm.> Grüße
Das erklärt aber immer noch nicht, warum dein linker die von dir zur
Verfügung gestellte _sbrk ingnoriert.
Was passiert, wenn du statt des g++ den gcc zum zum linken aufrufst?
Oliver
Hi,
inzwischen habe ich das Problem dadurch "umgangen", daß ich nun
tatsächlich einen ersten Wurf gebaut habe, um new() minimal zu
implementieren.
Dazu habe ich einen kleinen Teil aus der core_cm3.c und dem Code für
_sbrk() verwendet (siehe Anhang: mini_cpp.cpp).
Das Linken damit klappt. Ein Code wie:
1
intmain(void)
2
{
3
int*g1=newint;
4
*g1=34;
5
6
int*g2=newint;
7
*g2=898;
8
[..]
läßt sich damit korrekt compilieren und ausführen (im Debugger geprüft).
Weitere Tests müssen natürlich folgen.
Irritierend:
1. In Eclipse Galileo läßt sich mit dem Debugger arm-none-eabi-gdb.exe
(Version 4.5.1) mit dem JLink EDU nicht arbeiten (Fehlermeldungen), nach
dem Übergang auf die CodeSourcery Version 4.4.1 klappte das durchaus
(bei absolut gleichem Setup des HW Debugging).
2. Wenn ich den arm-none-eabi-g++/gcc zum Linken einsetze (Version
4.4.1) , klappt das Linken, wie beschrieben. Ein Linken mit
arm-none-eabi-ld klappt auf spektakuäre Weise nicht : Der Linker
erzeugt keine elf-Datei, liefert auch keinen Fehler- er macht einfach
nichts.. (??). Es sieht dann so aus - der Fehler wird erst im zweiten
Befehl offenbar:
C. D. schrieb:> Ein Linken mit> arm-none-eabi-ld klappt auf spektakuäre Weise nicht
Es ist auch unüblich, den Linker direkt aufzurufen. Der soll eigentlich
über den GCC aufgerufen werden. Die Optionen unterscheiden sich auch.
Wenn du direkt den gcc mit ld tauscht ohne die Optionen anzupassen, dann
geht das schief.
> Es ist auch unüblich, den Linker direkt aufzurufen
Ok.
> Wenn du direkt den gcc mit ld tauscht ohne die Optionen anzupassen, dann> geht das schief.
Nun ja. Ich kann ja schlecht das Gegenteil behaupten. Allerdings
verstehe ich nicht, wieso der Linker still und leise abschmiert. Das ist
doch kein Problem der Optionen..?
Grüße
schnack