Autor Thema: Elf .o mit g++ einlinken  (Gelesen 14025 mal)

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« am: 14. May 2004, 18:29 »
So ich hab folgendes Problem, dass ich möglichst schnell lösen muss. Wie übergebe ich dem g++ die Info, dass er eine bestimmte elf .o mitlinken soll???? Hab nähmlich einige Funktionen in Asm, nur ich weiß jetzt nicht, wie ich die einfach in eine C++-Programm bekomme.

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 14. May 2004, 23:45 »
Also wenn du keine bestimmten Linker-Optionen brauchst einfach die *.o-Datei mit als argument übergeben:
g++ blabla.cpp lalala.o -o prog

Oder meinst du was anderes?

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. May 2004, 07:55 »
Zitat
chr15 postete
So ich hab folgendes Problem, dass ich möglichst schnell lösen muss. Wie übergebe ich dem g++ die Info, dass er eine bestimmte elf .o mitlinken soll???? Hab nähmlich einige Funktionen in Asm, nur ich weiß jetzt nicht, wie ich die einfach in eine C++-Programm bekomme.
Kann man von dem ELF.o darauf schließen, dass Du ELF umgesetzt hast?
Wenn ja, machst Du den Code OpenSource und stellst ihn irgendwo hin?

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #3 am: 15. May 2004, 09:32 »
Werde ich in nen anderen Thread für Phier noch ganz veröffentlichen:
Ind C++ hab ich einen Prototypen:
int assembler_funktion( char * );

Und in Assembler heiß das dann (NASM):
global assembler_funktion

assembler_funktion:
....


Was muss ich daran ändern?
Das mit den einfach als Argument für g++ übergeben habe ich  auch schon gemacht, funktioniert aber nicht, da er den C++ prototyen nicht wiederfindet.

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 15. May 2004, 23:13 »
hallo

In C++ gibt es functionname-encoding, um die mehrdeutigkeiten beim function´-overloading aufzulösen - deshalb muss die Funktion in nasm anders heißen.

1. Lösung: Du deklarierst die Funktion in C++ als:

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. May 2004, 23:19 »
extern "C++" assembler_funktion(...)
Im Assembler muss man dann nur einen Unterstrich vor die Funktion schreiben

2. Lösung

Übersetzt die Datei mit g++ -S dateiname und seh im Assemblat nach, wie die Funktion heißen muss, damit der Linker diese findet

mfg

PS: bin auf den Absenden-Butto gekommen - editieren hat nicht funktioniert

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #6 am: 16. May 2004, 15:34 »
Die 2. Lösung ist wirklich gut! Ein großes Lob an dich! Die erste Lösung hat das Problem, dass g++ bei Parametern und Rückgabewerten immer etwas dranhäng: Z.B. int hallo(char *) -> _Z17halloPc

Danke für die Hilfe!

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 16. May 2004, 22:41 »
hallo

FEHLER:

Es müsste bei Lösung 1 auch
extern "C" assembler_function
heißen.

mfg

 

Einloggen