C++ in Assembler und umgekehrt



  • Hallo,

    ich habe ein stückchen assembler code, der C++ Referenzen nutzen soll und in dem c++ code wird auch Assembler genutzt.

    Sowohl den Assembler Code als auch den C++ Code habe ich compilet via:

    nasm -f aout assembler.asm -o aseembler.o
    gxx -c cpp.cpp -o cpp.o

    Nun wollte ich beides zu einer Binär Datei linken, jedoch kann der Linker :

    ld -o all.bin assembler.o cpp.o -e 0x0

    die Referenzen nicht finden.

    Hat jedmand eine Idee?



  • Fehlt im c++-Code vielleicht so was wie "extern void meine_asm_func(void)" und im Asm-Code ".globl meine_asm_func" (in gas-Syntax)?



  • Nein, das habe ich



  • und was sagt nm:

    nm -a aseembler.o
    

    oder

    nm -a cpp.o
    


  • hm, was sollte denn da stehen?



  • Da sollten alle Symbole stehen, die in den Objektdateien enthalten sind, vielleicht stimmt da was nicht...



  • also bei Funktionen die exportiert werden, steht ein großes T davor, vor welchen die importiert werden sollen ein großes U ...



  • T steht für .text, glaube ich, das ist ok, U steht wahrscheinlich für undefiniert, aber da die Funktionen importiert werden sollen, ist das, denke ich auch ok.
    Und wenn die Namen der U-Funktionen in einer Objektdatei mit den Namen der T-Funktionen in der anderen Objektdatei übereinstimmen, dann wäre das ok und ich gebe auf...



  • hm, ich glaube ich weiß warum es nicht klappt,

    In der einen datei sind die funktionen mit unterstrich davor und in der anderen ohne. Also z.B.

    T funktion

    U _funktion

    edit: jetzt habe ich nur noch eine referenz die fehlt, das wird hoffentlich noch



  • mhm, ich bekomme jetzt folgenden fehler:

    undefined reference to '__gxx_personality_v0'



  • Vermutlich werden im c++-Code Funktionen aus irgendeiner Bibliothek verwendet...
    Also wenn ja, dann muss man die Bibliothek beim Linken angeben, z.B. so

    ld a.o b.o c.o -o mein_prog -lc -dynamic-linker /lib/benötigte_lib.so
    

    Statt -dynamic-linker kann man auch -static verwenden, dann sind die Funktionen statisch verlinkt.
    Vielleicht könnte es helfen, wenn du beim Kompilieren mit gcc noch den Schlüssel --verbose verwendest (damit macht gcc viele ausführliche Ausgaben), um zu sehen, welche Bibliotheken gcc verwendet, und diese später beim Linken angeben...


Anmelden zum Antworten