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