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 von strcmp in der Headerdatei aus? Hat da der Ersteller evtl. vergessen extern "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.


Log in to reply