c und asm fehler beim compilieren
-
ich habe folgendes Beispiel probiert:
http://www.lowlevel.eu/wiki/Teil_2_-_Assembler_101#BeispielDoch leider geht das nicht.
Ich habe keine Ahnung wieso, denn diese Seite sieht recht gut aus und von dem her gehe ich davon aus, dass dort kein Quatsch steht.
Beim compilieren kommt immer dieser Fehler:gcc -m32 -o factorial main.c fact.S main.c:10:2: warning: no newline at end of file fact.S:34:8: warning: no newline at end of file C:\Users\meinusername\AppData\Local\Temp/cc6nk0ce.o:main.c:(.text+0x38): undefined re ference to `_factorial' collect2: ld returned 1 exit status
-
Man könnte die Dateien einzeln bauen, z.B. so:
as fact.S -o fact.o gcc -c main.c -o main.o
dann kann man mit dem Programm
nm
(name mangling) die Objektdateien untersuchen:nm fact.o nm main.o
- bekommst eine Liste von Symbolen zu sehen, einmal Symbole, die in fact.o drin stehen und einmal die Symbole, die in der main.o stehen und
extern
deklariert sind.
Dann muss man wahrscheinlich in der Assembler-Datei die Bezeichner der Funktion anpassen, damit es passt:.section .text .global _factorial _factorial: ...
Viel Glück
-
danke ich werds probieren
-
ok ich hab das jetzt mal ausprobiert. Ich komme da aber noch immer nicht weiter.
Ich hahe also als erstes einzeln erstellt:
gcc -c main.c -o main.o main.c:10:2: warning: no newline at end of file as fact.S -o fact.o fact.S: Assembler messages: fact.S:0: Warning: end of file not at end of a line; newline inserted
Hat ja auch funktioniert ohne Fehler.
dann mit nm angeschaut:nm fact.o 00000000 b .bss 00000000 d .data 00000000 t .text 00000000 T factorial 00000021 t out 00000011 t recurse nm main.o 00000000 b .bss 00000000 d .data 00000000 r .rdata 00000000 t .text U ___main U __alloca U _factorial 00000000 T _main U _printf
Also habe ich in der fact.S die factorial auf _factorial umbenannt:
.section .text .global _factorial _factorial: push %ebp mov %esp, %ebp ...
und erneut erstellt und mit nm angeschaut:
as fact.S -o fact.o fact.S: Assembler messages: fact.S:0: Warning: end of file not at end of a line; newline inserted nm fact.o 00000000 b .bss 00000000 d .data 00000000 t .text 00000000 T _factorial U factorial 00000021 t out 00000011 t recurse
Und jetzt meine Fragen:
1. Wieso ist da nur ein factorial mit _ versehen?
2. wie erstelle linke ich jetzt das ganze. Bei mir hat das nicht geklappt:ld -o main main.o fact.o main.o:main.c:(.text+0x21): undefined reference to `__alloca' main.o:main.c:(.text+0x26): undefined reference to `___main' main.o:main.c:(.text+0x4f): undefined reference to `_printf' fact.o:fake:(.text+0x14): undefined reference to `factorial'
3. Ich habe dann in der asm einfach 2*_ gemacht und dann war anstatt einer oder gar keiner wieder 2 _ dort.
-
verzweifel006 schrieb:
1. Wieso ist da nur ein factorial mit _ versehen?
U steht für "undefined", das bedeutet, du hast nicht alle
factorial
in_factorial
umbenannt, z.B. vergessen, die Datei vor dem Neubauen zu speichern.verzweifel006 schrieb:
2. wie erstelle linke ich jetzt das ganze
So müsste es gehen:
as fact.S -o fact.o gcc -c main.c -o main.o gcc main.o fact.o -o main
verzweifel006 schrieb:
3. Ich habe dann in der asm einfach 2*_ gemacht und dann war anstatt einer oder gar keiner wieder 2 _ dort.
Verstehe die Frage nicht
-
ok danke hat geklappt