mikrocontroller.net

Forum: Compiler & IDEs gcc für ARM übersetzen, wie?


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag zusammen,

ich habe am Wochenende versucht, den gcc für ARM zu übersetzen. Nach 
einigen Problemen mit gmp und mpfr lief dann make wenigstens so weit 
durch, dass ein ausführbarer gcc dabei herauskam. Schon mal ein Anfang.

ein einfaches

int main (void)
{
   return (0);
}

konnte ich damit nicht komplett übersetzen und linken, aber immerhin 
lies sich der gcc eine Assemblerdatei entlocken. Die sah von den 
Befehlen her auch ganz brauchbar aus, d.h. es waren wirklich 
ARM-Befehle.

OK, ich muss nun nochmal nachschauen, wo make scheitert. Dann habe ich 
Probleme beim Linken, da der Linker ein crt0 erwartet. Evtl. wird der 
falsche Linker, nämlich der meines Linux-Systems und nicht der aus den 
ebenfalls selbst übersetzten binutils verwendet?

Lange Rede, kurzer Sinn: es wird wohl noch eine Fleißaufgabe werden, aus 
dem jetzigen Erfolg zu einem installierbaren RPM zu kommen. Gibt's 
irgendwelche brauchbaren Dokus, wie man da möglichst schnell zum Ziel 
kommt? Die üblichen Verdächtigen bringen mich nicht wirklich weiter.

Vor allem: wie läuft das bei so einer Aktion mit der Laufzeitbibliothek? 
Mein Compiler findet nicht mal stdlib.h, und auch ich finde die im 
kompletten arm-gcc-Unterverzeichnis nicht.

Wie gesagt, ich habe nur make ausgeführt, noch kein make install, da ich 
nicht händisch das Zeug wieder aus meinem System rauslöschen möchte. 
Muss erst die Installationspfade setzen. Oder gleich ein RPM draus bauen 
(lassen).

Wie ihr seht, eine Fragen sind noch offen.

Bin für jeden Tipp (außer: fertigen arm-gcc installieren) dankbar.

Danke!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> Lange Rede, kurzer Sinn: es wird wohl noch eine Fleißaufgabe werden, aus
> dem jetzigen Erfolg zu einem installierbaren RPM zu kommen. Gibt's
> irgendwelche brauchbaren Dokus, wie man da möglichst schnell zum Ziel
> kommt? Die üblichen Verdächtigen bringen mich nicht wirklich weiter.

Wie wär's mit Google? Anleitungen dazu lassen sich haufenweise finden, 
z.B.:
http://embdev.net/articles/ARM_GCC_toolchain_for_L...
http://embdev.net/topic/129986#new

> Vor allem: wie läuft das bei so einer Aktion mit der Laufzeitbibliothek?
> Mein Compiler findet nicht mal stdlib.h, und auch ich finde die im
> kompletten arm-gcc-Unterverzeichnis nicht.

Du brauchst die Newlib, siehe oben.

> Wie gesagt, ich habe nur make ausgeführt, noch kein make install, da ich
> nicht händisch das Zeug wieder aus meinem System rauslöschen möchte.
> Muss erst die Installationspfade setzen.

Mach das doch mal, im Build-Verzeichnis rumzubasteln macht die ganze 
Sache nur zusätzlich kompliziert.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:

> Wie gesagt, ich habe nur make ausgeführt, noch kein make install, da ich
> nicht händisch das Zeug wieder aus meinem System rauslöschen möchte.
> Muss erst die Installationspfade setzen. Oder gleich ein RPM draus bauen
> (lassen).

Schau mal in die Hilfe zu deinem configure, da gibt es ein --Prifix und 
du kann installieren wohin du willst. Auch nach /dev/nul ;-)

configure --help

oder

http://gcc.gnu.org/viewcvs/trunk/gcc/doc/install.t...

Johann

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

zuerst einmal vielen Dank für Eure Antworten!

Ich habe jetzt die Toolchain mal sauber übersetzt, scheint alles zu 
funktionieren. Nun habe ich allerdings ein kleines Problem mit der 
Programmgröße: das kleinstmögliche Programm
void main (void) { return; }
wird ca. 75kByte groß. Da wird alles möglich dazugelinkt, wahrscheinlich 
aus dem Startupcode heraus. Und wieso gibt's da ctors und dtors. Das 
klingt irgendwie nach C++-Zeug. Ich habe allerdings nur mit "c" 
übersetzt.

Wie bekomme ich den Ballast weg? Ja ja, ich geh' mal googeln, aber 
vielleicht weiß hier ja trotzdem jemand Bescheid. Dann muss ich mich 
noch kurz um die floating point Geschichte kümmern. Brauche ne Soft-FP 
(na ja, eigentlich brauche ich gar keine FP-Arithmetik, da ich nur 
ganzzahlig arbeite, aber wenn schon...)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

gleich das nächste Problem:

arm-elf-gcc  -mthumb -mcpu=cortex-m3 test.c

liefert haufenweise Fehlermeldungen der Art:

arm-elf/bin/ld: ERROR: install/lib/gcc/arm-elf/4.4.1/thumb/crtn.o uses 
hardware FP, whereas a.out uses software FP

ich würde das so interpretieren, dass newlib mit Hardware-FP übersetzt 
wurde,
und gcc das Programm mit soft FP übersetzt. Google liefert ein paar 
Infos, die aber allesamt nicht zum Erfolg führen.

ach ja, arm-elf-gcc test.c funktioniert ohne Probleme.

Ich hoffe, ich habe da als Target nichts falches angegeben (möchte einen 
Cortex M3 verwenden, habe als target arm-elf gewählt. Passt das?)

Kann jemand helfen? Danke.

Autor: Oliver B. (irq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

kannst du mal deine Configure-Optionen hier posten? Würde mich 
interessieren, wie du das mit gmp und mpfr hingekriegt hast, bei mir hat 
das auch nicht funktioniert, als ich mit mingw32 für Windows übersetzen 
wollte. Unter Cygwin (sowie auch bei mir unter Ubuntu) hat es mit 
folgendem Tutorial funktioniert:

http://wiki.ubuntuusers.de/GNU_ARM-Toolchain

Folgende Versionen habe ich verwendet:
# GCC 4.4.1
# Binutils 2.19
# Newlib 1.17
# GDB 6.8
# Insight 6.8-1

Die Patcherei kannst du weglassen, wichtig ist nur, dass du beim GCC das 
Thumb-Zeugs aktivierst (in der t-arm-elf die paar Zeilen 
einkommentieren).

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Behr schrieb:

> interessieren, wie du das mit gmp und mpfr hingekriegt hast, bei mir hat
> das auch nicht funktioniert, als ich mit mingw32 für Windows übersetzen
> wollte.

Am einfachsten geht das, indem man MPFR und GMP ins Toplevel 
GCC-Direktory linkt (ln -s) bzw kopiert als mpfr bzw. gmp. Dann werden 
beim generieren diese Pakete mit den richtigen Optionen miterzeugt. Mit 
--with-gmp ist das schon was unangenehmer...

Johann

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

"Würde mich interessieren, wie du das mit gmp und mpfr hingekriegt 
hast,"

Wie Johann bereits beschrieben hat: das Verzeichnis mit den ausgepackten 
gmp- und mpfr-Quellen in den gcc-Ordner kopieren. Die Verzeichnisse 
entsprechend "gmp" und "mpfr" nennen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

also, ich habe jetzt newlib und gcc nochmal mit der Option 
--with-float=soft übersetzt. Das Testprogramm lässt sich nun linken. 
Allerdings habe ich noch immer das Größenproblem:

arm-elf-size sagt:

   text    data     bss     dec     hex filename
  11620    2408     264   14292    37d4 a.out

also 14KB für ein leeres Programm. Mir ist schon klar, dass ein 
Startupcode notwendig ist. Aber 14KB sind nicht gerade wenig.

Ach ja, weitere Frage hierzu: Ich muss doch sicher irgendwie 
prozessorspezifische Parameter vor dem Übersetzen einstellen, damit der 
Startcode auch das richtige macht. Ich denke so an RAM-Größe, Stackende, 
etc. pp.

Vor allem habe ich bei luminary keinen entsprechenden Satz von Headern 
und/oder Bibliotheken gefunden, nur eine ganze Umgebung mit schlappen 
130MB. Werde nochmal auf der extrem übersichtlichen Website suchen.

In a.out sind irgendwelche Uhrzeitfunktionen und vieles andere mehr 
drin. Gibt es eine Möglichkeit, für einfache Programme diesen Overhead 
zu reduzieren? Google ist da leider nicht sehr gesprächig.

Irgendwie habe ich das Gefühl, ich sollte mich mal nach einem guten 
Tutorial umsehen... ;-)

Danke für Eure Mithilfe.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> Hallo zusammen,
>
> also, ich habe jetzt newlib und gcc nochmal mit der Option
> --with-float=soft übersetzt. Das Testprogramm lässt sich nun linken.
> Allerdings habe ich noch immer das Größenproblem:
>
> arm-elf-size sagt:
>
>    text    data     bss     dec     hex filename
>   11620    2408     264   14292    37d4 a.out
>
> also 14KB für ein leeres Programm. Mir ist schon klar, dass ein
> Startupcode notwendig ist. Aber 14KB sind nicht gerade wenig.

Falls wie oben einfach mit einem aufruf von gcc compiliert und zu einem 
a.out gelinkt wurde, wird mit dem Standard-Startup gelinkt. Normerleise 
lässt man gcc erstmal mit -c aus dem Quellcode Objectcode erzeugen, 
stellt eigenen Quellcode für Startup bereit compiliert diesen auch und 
linkt dann beides mit -nostartfiles, damit die Standard-crt0 aussen vor 
bleibt.

> Ach ja, weitere Frage hierzu: Ich muss doch sicher irgendwie
> prozessorspezifische Parameter vor dem Übersetzen einstellen, damit der
> Startcode auch das richtige macht. Ich denke so an RAM-Größe, Stackende,
> etc. pp.

Größen und Adressen von Speicherbereichen werden im Linker-Script (oder 
zur not mit Kommandozeilenoptionen zum Linker) festegelegt.

> Vor allem habe ich bei luminary keinen entsprechenden Satz von Headern
> und/oder Bibliotheken gefunden, nur eine ganze Umgebung mit schlappen
> 130MB. Werde nochmal auf der extrem übersichtlichen Website suchen.

So unübersichtlich nun auch nicht. Die "130MB" sind wahrscheinlich die 
"DriverLib". Das ist keine "Umgebung" sondern eine etwas ausgeuferte 
Sammlung von Beispielcode für alle möglichen TI/LMI-Boards nebst 
Treiber-Codes. Darin sind auch einige makefiles, linkerscript und 
startup-code für die GNU cross-toolchain, an denen man sich orientieren 
kann.

> In a.out sind irgendwelche Uhrzeitfunktionen und vieles andere mehr
> drin. Gibt es eine Möglichkeit, für einfache Programme diesen Overhead
> zu reduzieren? Google ist da leider nicht sehr gesprächig.

Newlib-Quellcode liegt ja schon auf der Platte, man kann dort den 
Quellcode der crt0 ansehen.

> Irgendwie habe ich das Gefühl, ich sollte mich mal nach einem guten
> Tutorial umsehen... ;-)

Das "Gefühl" habe ich auch.


Nur als Hinweis auf die erf. Schritte die Ausgabe für die Übersetztung 
eines meiner sehr alten Beispiele - genauer einer Portierung von 
LMI-Code, als LMI selbst GNU-Tools noch nicht unterstützt hat. 
Anwendungscode in hello.c, osram.c, uvision.c, startup-code in 
startup_gcc.c, Linker-script ist lmi3s811.ld. Angelinkt wir auch noch 
object-code aus einer "echten" Library libluminary.a (-lluminary), die 
aus dem Quellcode der LMI DriverLib erzeugt wurde.
D:\users\mthomas\develop\arm\lm3s811_evalboard\ev-lm3s811\hello>make all
--
-------- begin (mode: ROM_RUN) --------
arm-eabi-gcc (devkitARM release 23b) 4.3.0
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: hello.c
arm-eabi-gcc -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -gdwarf-2 -DROM_RU
N -Dgcc -D__WinARM__ -D__WINARMSUBMDL_lm3s811__  -Os -ffunction-sections -fdata-
sections -Wall -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-t
ype -Wshadow -Wunused -Wa,-adhlns=hello.lst   -Wcast-qual -MD -MP -MF .dep/hello
.o.d -Wnested-externs  -std=gnu99 -Wmissing-prototypes  -Wstrict-prototypes -Wmi
ssing-declarations hello.c -o hello.o

Compiling C: startup_gcc.c
arm-eabi-gcc -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -gdwarf-2 -DROM_RU
N -Dgcc -D__WinARM__ -D__WINARMSUBMDL_lm3s811__  -Os -ffunction-sections -fdata-
sections -Wall -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-t
ype -Wshadow -Wunused -Wa,-adhlns=startup_gcc.lst   -Wcast-qual -MD -MP -MF .dep
/startup_gcc.o.d -Wnested-externs  -std=gnu99 -Wmissing-prototypes  -Wstrict-pro
totypes -Wmissing-declarations startup_gcc.c -o startup_gcc.o

Compiling C: ../osram96x16.c
arm-eabi-gcc -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -gdwarf-2 -DROM_RU
N -Dgcc -D__WinARM__ -D__WINARMSUBMDL_lm3s811__  -Os -ffunction-sections -fdata-
sections -Wall -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-t
ype -Wshadow -Wunused -Wa,-adhlns=../osram96x16.lst   -Wcast-qual -MD -MP -MF .d
ep/osram96x16.o.d -Wnested-externs  -std=gnu99 -Wmissing-prototypes  -Wstrict-pr
ototypes -Wmissing-declarations ../osram96x16.c -o ../osram96x16.o

Compiling C: ../../utils/uvision.c
arm-eabi-gcc -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -gdwarf-2 -DROM_RU
N -Dgcc -D__WinARM__ -D__WINARMSUBMDL_lm3s811__  -Os -ffunction-sections -fdata-
sections -Wall -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-t
ype -Wshadow -Wunused -Wa,-adhlns=../../utils/uvision.lst   -Wcast-qual -MD -MP
-MF .dep/uvision.o.d -Wnested-externs  -std=gnu99 -Wmissing-prototypes  -Wstrict
-prototypes -Wmissing-declarations ../../utils/uvision.c -o ../../utils/uvision.
o

Linking: main.elf
arm-eabi-gcc -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -gdwarf-2 -DROM_RUN -
Dgcc -D__WinARM__ -D__WINARMSUBMDL_lm3s811__  -Os -ffunction-sections -fdata-sec
tions -Wall -Wimplicit  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type
 -Wshadow -Wunused -Wa,-adhlns=hello.lst   -Wcast-qual -MD -MP -MF .dep/main.elf
.d    hello.o startup_gcc.o ../osram96x16.o ../../utils/uvision.o     --output m
ain.elf -nostartfiles -Wl,-Map=main.map,--cref,--gc-sections -lc  -lm -lc -lgcc
  -L../../ -lluminary -T../lm3s811-ROM.ld

Creating load file for Flash: main.bin
arm-eabi-objcopy -O binary main.elf main.bin

Creating Extended Listing: main.lss
arm-eabi-objdump -h -S -D main.elf > main.lss

Creating Symbol Table: main.sym
arm-eabi-nm -n main.elf > main.sym

Size after:
main.elf  :
section            size        addr
.text              2400           0
.bss                  4   536870912
.stackarea          260   536870916
.comment            284           0
.debug_aranges     1184           0
.debug_pubnames    2675           0
.debug_info        7188           0
.debug_abbrev      2169           0
.debug_line        3330           0
.debug_frame       2424           0
.debug_str         2939           0
.debug_loc         4372           0
.debug_ranges      1208           0
.ARM.attributes      49           0
Total             30486



Errors: none
-------- end --------


D:\users\mthomas\develop\arm\lm3s811_evalboard\ev-lm3s811\hello>

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.