toolchain .bin .hex assembler

Gast #7328906
Lesenswert?

Hallo guten Tag,

weiß jemand wie die AVR Toolchain genau funktioniert?

1.) mit avr-gcc eine *.bin-Datei erstellen.

avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c

2.) ein ihex datei erstellen

avr-objcopy -j .text -j .data -O ihex main.bin main.hex

  • FRAGE1: Warum nicht gleich eine *.hex Datei erstellen? Kann avr-gcc nicht avr-objcopy aufrufen?

https://blog.podkalicki.com/how-to-compile-and-burn-the-code-to-avr-chip-on-linuxmacosxwindows/

*.bin hat doch weniger Informationen (Nur Daten) als *.hex wie arbeitet avr-objcopy, dass es das passende Informationen erstellt?

Außerdem: Oft wird ja so eine Toolkette angegeben:

1
*c->Compiler -> *.s -> Assembler -> *.o->linker->*.bin
1
"The -S option tells gcc to stop after translating a source file into assembly language, before the
2
assembler is invoked. The output file is called <filename>.s"
3

4
"The GNU linker is a powerful application, but in many cases there is no need to invoke ld directly-- gcc
5
invokes it automatically unless you use the -c (compile only) option"
  • FRAGE2: Kann der Gnu C Compiler eigentlich auch direkt Objektfiles erstellen? Oder wird dafür immer ein extra Assembler benötigt?

Vielen Dank

Gast #7328978
Lesenswert?

bauchbursche schrieb:

-o main.bin

Wenn ich eine *.bin Datei sehe, erwarte ich, dass das ein 1:1 Abbild des Programmspeichers im Binärformat ist. Die Datei die du mit "avr-gcc -o main.bin" erstellst ist aber eine ELF Datei. Die von dir gewählte Dateiendung ist irreführend. Das ELF Format ist das Linux Pendant zu *.exe.

Für Programmfragmente benutzt normalerweise das Suffix *.o. Für das finale komplette Programm nutzt man üblicherweise die Endung *.elf. Beide haben das ELF Dateiformat.

Warum nicht gleich eine *.hex Datei erstellen?

Weil die HEX Datei ein Abbild des Programmspeichers ist. Zum Debuggen brauchst du mehr Daten, zum Beispiel die Information, wo welche Funktionen und Variablen im Speicher liegen. Diese Infos sind in der ELF Datei enthalten (falls mit Parameter -g erzeugt).

Kann avr-gcc nicht avr-objcopy aufrufen?

Keine Ahnung. Die ganze GNU Toolchain ist ja eigentlich dafür gedacht, von einem Build Tool (wie make) aufgerufen zu werden. Da tut es nicht weh, ein Kommando mehr zu konfigurieren. Abgesehen davon können die meisten Bedienprogramme für Programmieradapter direkt mit der ELF Datei als Input arbeiten. Damit ist die Erstellung der *.hex Datei optional.

Kann der Gnu C Compiler eigentlich auch direkt Objektfiles erstellen?

Das tut er. Der gcc erzeugt Objekt Files. Die Datei die du main.bin genannt hasst, müsste eigentlich main.o heissen, denn das ist ein Objektfile.

Oft wird ja so eine Toolkette angegeben: *c->Compiler -> *.s -> Assembler -> .o->linker->.bin

Manchmal hilft ein Blick in den Assembler Quelltext, um unerwartetes Verhalten nachzuvollziehen oder um Performance-Engpässe zu untersuchen. Man kann das Assembler-Listing auch nachträglich aus dem ELF File heraus generieren.

avr-objdump -h -S main.elf

Angehängte Dateien:
#7329175
Lesenswert?

bauchbursche schrieb:

weiß jemand wie die AVR Toolchain genau funktioniert?

Ja. Dieses Forum ist allerdings nicht der Ort dafür und ein Post (und die Antworten darauf) sind nicht angemessen für die Darstellung der teils komplexen Zusammenhänge.

1.) mit avr-gcc eine *.bin-Datei erstellen.

avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c

Nein. Da passiert nicht das, was du denkst. In Wirklichkeit wird

  1. die Datei main.c durch den C-Präprozessor gejagt
  2. das Ergebnis an avr-gcc verfüttert, der daraus ASM Code erzeugt
  3. der ASM Code wird von avr-as zum Objektcode übersetzt
  4. der Objektcode wird mit Startup-Code und Libraries zu einer (im Prinzip) ausführbaren ELF Datei gelinkt

In epischer Breite nachzulesen unter den diversen Fundstellen von

https://www.google.com/search?q=gcc+stages+of+compilation

Daß du die Ausgabedatei main.bin nennst, ändert nichts daran, daß es in Wirklichkeit eine ELF [1] Datei ist.

[1] https://de.wikipedia.org/wiki/Executable_and_Linking_Format

2.) ein ihex datei erstellen

avr-objcopy -j .text -j .data -O ihex main.bin main.hex

objcopy ist das Schweizer Armeemesser der Binutils. Es extrahiert die Sektionen .text (ausführbarer Maschinencode) und .data (Daten) aus der ELF Datei.

  • FRAGE1: Warum nicht gleich eine *.hex Datei erstellen? Kann avr-gcc nicht avr-objcopy aufrufen?

Warum sollte der Compiler das? Die Frage die du dir vielmehr stellen solltest, ist warum du überhaupt eine HEX Datei brauchst. Die meisten Programmiertools verstehen ELF durchaus.

Andererseits verwenden 99% der Programmierer irgendein Buildtool. Das klassische wäre make. Da ist es vollkommen egal, ob man ein oder 10 Kommandos ausführen muß.

  • FRAGE2: Kann der Gnu C Compiler eigentlich auch direkt Objektfiles erstellen? Oder wird dafür immer ein extra Assembler benötigt?

Den gcc gibt es für eine Menge Architekturen. Es ist denkbar, daß das Backend für einige direkt Maschinencode erzeugt. Für AVR aber nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren