c und asm fehler beim compilieren



  • ich habe folgendes Beispiel probiert:
    http://www.lowlevel.eu/wiki/Teil_2_-_Assembler_101#Beispiel

    Doch 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


Anmelden zum Antworten