Hallo.
Ich habe mir gerade mal ein Makefile geschrieben, um das WINAVR Zeugs
zu testen. Ich bin in der Lage, das .o File zu erstellen, aber beim
erzeugen eines .elf aus dem .o kriege ich Linkerfehler, mit denen ich
beim besten Willen nix anfangen kann. In dem Sourcefile, welches ich
benutze, um das objektfile zu generieren, steht quasi noch nix. Es
werden lediglich die avr-includes eingebunden und eine mai-Funktion
deklariert, die nix macht, ausser 0 zurückzugeben.
Hier die Ausgaben von Make:
avr-gcc -W1,-Map=main.map,--cref -mmcu=at90s8535 main.o -o main.elf
main.o(.text+0x50): In function `__vector_10':
: multiple definition of `__bad_interrupt'
C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/crts8535.o(.text+
0x0):
first defined here
main.o(.text+0x0): In function `__vector_default':
: multiple definition of `__vectors'
C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/crts8535.o(.vecto
rs+0x0):
first defined here
make.exe: *** [main.elf] Error 1
> Process Exit Code: 2
Wie sieht die Ausgabe von »avr-nm main.o« denn aus? Wie ist Dein main.o genau entstanden (avr-gcc Kommandozeile)?
1.) Was ist avr-nm ???? 2.) Steht im Makefile (die ausgabe auf der konsole ist: avr-gcc -g main.c -o main.o main.c:7:2: warning: no newline at end of file avr-gcc -W1,-Map=main.map,--cref -mmcu=at90s8535 main.o -o main.elf
hi! das problem hab ich auch gehabt... du musst, wenn du die avr-libc kompilierst das file crts8535.c auch kompilieren (evtl. ins toplevelmakefile reinschreiben) und dann nochmal make && make install machen. dann sollte das problem gelöst sein. allerdings: ich weiss nicht wofür ich das crts8535.o file brauche. kann mir das jemand erklären? ich meine ich schreibe ein testprog in dem ich keine lib-funktionen aufrufe, dann wird das crts8535.o - file trozdem mitgelinkt. kann mir jemand erklären wieso? mfg bernd
Naja, ich benutze es unter linux, das heisst, die libs und includes sollten demnach richtig übersetzt sein (ich nutze das Winavr). Aber genau die Frage, die gerade gestellt wurde, ist das entscheidene... Was ist das für ein Objektfile und wann wird das gelinkt? Ich habe in meinem Makefile und in meinem Programm keine Stelle, wo ich sowas entsprechendes mache (oder mir des bewusst wäre). Vielleicht kann mir da jemand eine Antwort darauf geben. Ich gebe zu, dass ich noch viele Probleme habe. Ein Kollege hat mir den CodeVision gegeben, aber ich mag ihn nicht so sehr. Gruß Sebastian
Du benutzt WinAVR unter Linux? Das hat wohl noch keiner vor Dir getan. avr-nm ist ein Programm. Du lässt es laufen (so wie geschrieben) und postest die Ausgabe. Aber bitte nicht als GIF-Bildschirmfoto ;-), sondern als Text. Mindestens einen Fehler sehe ich sofort: der Compiler-Kommandozeile fehlt die Angabe von -mmcu=... . Allerdings sollte das allein eigentlich nicht den von dir beschriebenen Effekt haben.
Emmm.... Nein nicht unter Linix lol.... Ich nutze wohl Winavr unter Windows.... so jetzt die ausgabe: D:\mµ\src\proj1>avr-nm main.o 00000046 t .do_clear_bss_loop 00000048 t .do_clear_bss_start 00000032 t .do_copy_data_loop 00000038 t .do_copy_data_start 00000050 T __bad_interrupt 00800060 B __bss_end 00800060 B __bss_start 0000001a T __ctors_end 0000001a T __ctors_start 00800060 D __data_end 00000062 A __data_load_end 00000062 A __data_load_start 00800060 D __data_start 0000003e T __do_clear_bss 00000026 T __do_copy_data 0000001a T __dtors_end 0000001a T __dtors_start 00810000 ? __eeprom_end 00000000 W __heap_end 0000001a W __init 0000003e a _SP_H_ 0000003d a _SP_L_ 0000003f a _SREG_ 0000025f W __stack 00000060 t __stop_program 00000000 a _tmp_reg_ 00000050 W __vector_1 00000050 W __vector_10 00000050 W __vector_11 00000050 W __vector_12 00000050 W __vector_2 00000050 W __vector_3 00000050 W __vector_4 00000050 W __vector_5 00000050 W __vector_6 00000050 W __vector_7 00000050 W __vector_8 00000050 W __vector_9 00000000 W __vector_default 00000000 T __vectors 00000001 a _zero_reg_ 00800060 D _edata 00800060 ? _end 00000062 T _etext 00000060 T _exit 00000060 W exit 00000060 t Letext 00000052 T main Hmmm ich kann damit erstmal gar nix anfangen. Aber wenn du es sehen wolltest nehme ich an du kannst mir jetzt mehr sagen?!
avr-gcc -g main.c -o main.o main.c:7:2: warning: no newline at end of file avr-gcc -W1,-Map=main.map,--cref -mmcu=at90s8535 main.o -o main.elf Was haben denn die Kommata in der letzten Zeile verloren? Gehören die da hin?
keine Ahnung ich habe die Flags orginal aus dem Makefile was bei den Samples dabei war übernommen
Ja Rufus, die Kommata gehören dahin. Davon abgesehen, dass das -W1 wohl eher ein -Wl sein soll (nicht We-eins, sondern We-ell), irgendwie hat Sebastian hier wohl rundum danebengelangt. -Wl besagt, dass der Compilertreiber die nachfolgenden Optionen direkt hinter dem -Wl 1:1 an den Linker weiterreichen soll (daher auch W*l*, l wie Linker, es gibt auch noch ein -Wa für den Assembler). Die Kommata der Original- Option werden beim Weiterleiten in Leerzeichen umgewandelt, d.h. der Linker sieht (zusätzlich zu anderen Optionen, die der Compilertreiber erzeugt) ein »-Map=main.map --cref«. Jetzt fällt's mir aber wie Schuppen aus den Haaren (und ja, die name list ist eindeutig viel zu lang für ein relocatable main.o): Du compilierst Dein main.c nicht nur, sondern linkst es auch noch -- und nennst das Ergebnis dann main.o. Durch das bereits erfolgte Linken ist das aber halt kein relocatable object file mehr, sodass ein nochmaliger Linkversuch natürlich in die Hose gehen muss. Du solltest dein Makefile mal gründlich unter die Lupe nehmen (oder dir mit Mfile ein neues zimmern), irgendwas ist da irgendwie abhanden gekommen. Ein korrekter Aufruf zum Compilieren ohne Linken wäre etwa so: avr-gcc -g -mmcu=at90s8535 -Os -c main-c -o main.o (Das »-o main.o« ist dabei strenggenommen überflüssig, da dies der Default für die -c Option des GCC ist.)
Hallo, danke für den Tip! Wisst ihr, wo es eine genaue Beschreibung der Flags gibt? Mir ist nicht klar, was die alle bewirken. Ich habe es mit 'man' versucht, ohne erfolg, das hat der winavr wohl nicht richtig installiert. Gibt es im Netz da eine Referenz ? Gruß Sebastian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.