Forum: Compiler & IDEs komische Linkerfehler bei Testprogramm


von Sebastian Schabbach (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

Wie sieht die Ausgabe von »avr-nm main.o« denn aus?

Wie ist Dein main.o genau entstanden (avr-gcc Kommandozeile)?

von Sebastian Schabbach (Gast)


Lesenswert?

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

von Bauer Bernd (Gast)


Lesenswert?

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

von Sebastian Schabbach (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Sebastian Schabbach (Gast)


Lesenswert?

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?!

von Rufus T. Firefly (Gast)


Lesenswert?

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?

von Sebastian Schabbach (Gast)


Lesenswert?

keine Ahnung ich habe die Flags orginal aus dem Makefile was bei den
Samples dabei war übernommen

von Jörg Wunsch (Gast)


Lesenswert?

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.)

von Sebastian Schabbach (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.