Static lib mit CRT exports?!
-
Hi,
ich habe hier einen kleinen Source einer DLL, welche fertig gebaut nur von ntdll.dll abhängt.
Vermutlich war es Ziel des Erstellers, möglichst wenige Abhängigkeiten zu haben und/oder die Dateigröße klein zu halten.Etwas verstehe ich dabei nicht: Es wird eine ntdll32/64.lib mitgeliefert. Die definitions (ntdll.def) sehen so aus:
LIBRARY ntdll.dll EXPORTS memcmp memcpy memmove memset strcmp swprintf_s wcslen _alldiv _alldvrm _allmul _allrem _allshl _allshr _aulldiv _aulldvrm _aullrem _aullshr _wcsnicmp _wcsicmp
Das Projekt linkt aber auch zur original ntdll. Also die Linkeroptionen sehen so aus:
ntdll.lib;$(SolutionDir)\ntdll64.lib
Ich frage mich 1. was das bezwecken soll und 2. wie das funktioniert.
Wenn ich diese ntdll64.lib nicht linke, schlägt das kompilieren fehl, u.A. mit "unresolved external symbol strcmp".
Das verstehe ich auch nicht, sollte strcmp etc. nicht bereits in der original Windows ntdll.lib enthalten sein, welche ja auch mitgelinkt wird?(Sorry falls falsches Forum, tue mich damit schwer)
MfG
-
Es geht auch wirklich um C++-Sourcen (und nicht C)?
Wie sieht denn die Deklaration vonstrcmp
in der Headerdatei aus? Hat da der Ersteller evtl. vergessenextern "C"
zu benutzen (Stichwort: Name mangling - besonders unter x64 gibt es da Unterschiede)?Du kannst auch mal mit dem Dependency Walker die beiden DLLs anschauen (und deren Funktionsnamen etc. vergleichen).
Edit: Unter .def files C/C++ DLLs gibt es auch noch ein paar Infos.
-
Die DLL ist in C++ geschrieben.
Es ist kein Header mit Deklarationen von strcmp etc. dabei. Nur die lib.Ich habe diese Info gefunden: http://asawicki.info/news_1420_generating_lib_file_for_dll_library.html
Vermutlich hat also die System ntdll.lib für einige Funktionen keine Symbole. Mit diesem "Trick" wird eine .lib erstellt, welche diese beinhaltet.
Quasi eine Ergänzungs-lib für die System ntdll.dll. So jedenfalls verstehe ich das.Es wird übrigens noch _NO_CRT_STDIO_INLINE definiert, was auch immer das genau bedeutet bzw. bezwecken soll.