Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 03.11.2009, 18:14 Titel: Routinen mit Alias aber ohne Export |
|
|
Wofür werden in manchen Programmen Subs oder Funktionen mit einem "Alias" aber nicht mit "Export" versehen?
Bisher weiss ich nur, dass Funktionen/Subs die man in einer DLL verfügbar machen will mit einem Alias UND Export versehen muss.
Nun tauchen aber des öfteren Subs/Funktionen auf, die NUR mit einem Alias deklariert sind... Kann man diese Routinen auch noch irgendwie nachträglich wieder einbinden? (mit dylibsymbol gehts schon mal nicht!) |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 04.11.2009, 18:05 Titel: |
|
|
Alias benennt die Funktion nur intern um. D.h. im Code benutzt du ein anderes Symbol für die Funktion, als der Assembler es letzendlich tut. Der Compiler ersetzt das im Regelfall. |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 04.11.2009, 23:12 Titel: Re: Routinen mit Alias aber ohne Export |
|
|
OneCypher hat Folgendes geschrieben: | Wofür werden in manchen Programmen Subs oder Funktionen mit einem "Alias" aber nicht mit "Export" versehen?
Bisher weiss ich nur, dass Funktionen/Subs die man in einer DLL verfügbar machen will mit einem Alias UND Export versehen muss.
Nun tauchen aber des öfteren Subs/Funktionen auf, die NUR mit einem Alias deklariert sind... Kann man diese Routinen auch noch irgendwie nachträglich wieder einbinden? (mit dylibsymbol gehts schon mal nicht!) |
Der Alias kommt in die Deklaration der Sub des User-Programms, damit der Linker hinterher weiss, welcher interne Sub-Name zu welcher externen DLL-Funktion gehört.
Das Export kommt in die Definition des Subs. Was das macht, weiss ich ehrlich gesagt nicht genau. Vermute mal, der Compiler mappt die Einsprungadresse irgendwohin, damit der Linker nachher was zum "Anfassen" hat.
Oma kann dir das wie immer erklären
VG!
Croco |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 05.11.2009, 00:43 Titel: |
|
|
Was Alias machen soll ist mir schon ziemlich klar, aber warum bei manchen deklarationen das "Export" am ende fehlt ist mir nicht klar. Nach meinen Erfahrungen können die Funktionen in einer DLL nicht vom hauptprogramm geladen werden wenn sie nicht mit "Export" deklariert sind.
kleines beispiel:
Code: |
sub testen alias "mooeep" export
print "hallo, es funktioniert!!"
end sub
Dim testroutine as sub
testroutine = dylibsymbol(0, "mooeep")
testroutine()
sleep
|
funktioniert wie es soll, aber:
Code: |
sub testen alias "mooeep"
print "hallo, es funktioniert!!"
end sub
Dim testroutine as sub
testroutine = dylibsymbol(0, "mooeep")
testroutine()
sleep
|
funktioniert nicht.. das programm stürzt ab weil ein nullpointer auftritt...
Aber dennoch kommt es vor, das manche routinen OHNE export deklariert werden.. aber ich hab keine ahnung was mit denen passiert..
Zuletzt bearbeitet von OneCypher am 05.11.2009, 12:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.11.2009, 11:50 Titel: |
|
|
Vielleicht bin ich blind, aber ich finde den Unterschied zwischen deinen beiden Quellcodeschnipseln nicht.
Werden die von dir erwähnten Nicht-EXPORT-markierten Funktionen dann auch mit DYLIBSYMBOL eingebunden? Vielleicht werden sie nur intern verwendet und sollen nach außen gar nicht sichtbar werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 05.11.2009, 12:21 Titel: |
|
|
@nemored: Sorry, die zwischenablage hat geklemmt XD .. habs korrigiert! .. der einzige unterschied ist ein einziges Wort: "Export" |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 06.11.2009, 11:22 Titel: |
|
|
Ich schätze mal, ohne EXPORT - Zusatz kein Eintrag eines Pointers in die Exporttabelle im PE - Header, also NULL.
Routinen ohne "Export" können natürlich intern (in der Exe oder Dll) genutzt werden.
Ein ALIAS "XYZ" ist nicht notwendig. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 06.11.2009, 18:49 Titel: |
|
|
Exakt so siehts aus, volta!
Das Schlüsselwort Export weist den Compiler an, die Funktion in der .def Datei unter der Gruppe Public aufzuführen - erst dadurch entsteht ein Eintrag in der Exporttabelle.
Der Alias legt lediglich fest, dass du im Programm ein anderes Symbol, anstelle des richtigen Namens der Funktion benutzt. Es tritt ein Nullpointer auf, weil DylibSymbol vom Windowseigenen PE-Loader (GetProcAddress) keinen Zeiger auf die Funktion bekommt - ergo null -, weil ja kein entsprechender Eintrag in der Exporttabelle existiert. Der wird von DylibSymbol einfach an dein Programm weitergegeben, was dann frohen Mutes ein jmp 0 ausführt - Epic Fail. |
|
Nach oben |
|
 |
|