[SOLVED] [Visual Studio 2015 + MASM] Export von Funktionen aus OBJ in DLL
-
Ich habe in einem VS-2015-Projekt, welches eine DLL generiert, eine Assembler-Datei, die ich über MASM kompilieren lassen (direkte Integration in Visual Studio) und das Kompilat in besagte DLL einfügen will.
Die Symbole tauchen in der OBJ-Datei auf, aber nicht mehr später in der DLL (habe nach den Namen in den Binärdateien gesucht, und auch ein Disassembler findet sie nicht mehr). Ich vermute, dass der Linker den Code in der OBJ nur verwendet, um die Verweise innerhalb des restlichen DLL-Codes zu erfüllen, aber er exportiert sie nicht. Das ist aber nicht Sinn der Sache - die Symbole sollen für die DLL sowie für die Anwendungen, in die die DLL geladen wird, verfügbar sein.
Inline-Assembler geht nicht, weil es sich hier um x64-Targets handelt - dafür gibt MS keinen Support mehr. In den C-Headern für den restlichen Code der DLL habe ich die Symbole mit
__declspec(dllexport)
deklariert, aber anscheinend ist dem Linker das egal.Was muss ich wo unterschreiben, damit der Linker die Symbole in der OBJ ebenfalls exportiert?
-
So, das ist ja einfach phänomenal, was sich die Herren aus dem Hause Microsoft mal wieder ausgedacht haben.
Für's Archiv: Man muss dem Linker noch manuell eine Definitionsdatei (.DEF) zu fressen geben, damit er die Symbole auch tatsächlich exportiert. Weil der Compiler dem Linker anscheinend nur eine Liste der generierten Funktionen übergibt, und nicht eine Liste der Funktionen, die explizit als
__declspec(dllexport)
definiert sind. Die also später in der DLL landen sollen! Weil Visual Studio das anscheinend nicht kann, warum auch immer.LIBRARY bla.dll EXPORTS foo EXPORTS bar
Und die Datei setzt man dann in den Projekteinstellungen unter Linker->Eingabe->Moduldefinitionsdatei.
Und den hier auch noch: wenn man explizit keine Stack-Frame-Generierung haben will, muss man vor dem relevanten Code:
option prologue:none option epilogue:none
einfügen. Quelle.
Thread kann somit also geschlossen werden.