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