Linux Shared Objects Delay Load Linking



  • Hallo,

    unter Windows mit dem Microsoft Visual C++ Compiler gibt es für das Linken von DLLs eine Option die sich Delay Load Linking nennt. Dabei wird die DLL erst geladen, sobald die erste Funktion aus der DLL aufgerufen wird.

    Der Vorteil dieser Methode ist, das das Programm auch auf einer Platform läuft auf der die Bibliothek nicht vorhanden ist, solange keine Funktionen aus der DLL verwendet werden.

    Konkret handelt es sich bei den dynamischen Bibliotheken die ich verwende um Client Blibliotheken verschiedener Datenbanksysteme wie MySQL oder ORACLE. Nun wird erst zur Laufzeit durch die Konfiguration entschieden, was für ein Datenbankserver verwendet werden soll, sodass der Code der die Client Bibliotheken der verschiedenen Datenbankserver benutzt immer im Programm fest eingelinkt ist. Dieser Code ist aber im normalfall von den Funktionen der Client Bibliothek abhängig und es müssten dann alle Client Bibliotheken auch auf der Maschine installiert sein, nur damit das Programm hoch kommt. Nun könnte man natürlich auch mit dlopen die Bibliothek manuell öffnen, aber dann muss mann ja auch jedes Symbol manuell laden und an irgendwelche Funktionspointer binden, wass ja auch einen ziemlichen Meeraufwand bedeutet.

    Lange rede, kurzer sinn, gibt es unter Linux mit dem GCC unter Linux eine ähnliche Möglichkeit oder hat jemand vielleicht irgendwelche anderen Vorschläge?

    Vielen dank im voraus für das Lesen und sämtliche Hilfen.
    template



  • http://linux.die.net/man/3/dlopen
    Damit könntest du das zumindest manuell machen.



  • Vielen dank für die schnelle Antwort. Ja stimmt schon, ich könnte die Bibliothek manuell laden, aber dann habe ich ja das Problem das ich auch jedes Symbol manuell laden muss, und das sind bei der Oracle Library bestimmt schon um die 40. Dann muss ich die Dinger ja auch noch in irgendwelchen Funktionspointern abspeichern, usw. Wäre schon schöner, wenn es ne alternativ Möglichkeit gäbe.



  • obs sowas auch gibt weiß ich nicht, aber normalerweise linkt man die libs die nicht benötigt werden einfach nicht dazu.



  • Naja wenns generell "nicht benötigte" wären, dann wärs ja gut;) Aber das entscheidet sich halt leider erst zur Laufzeit. Ansonsten müsste ich für jedes unterstützte Datenbankinterface nen eigenen Release fahren, und das kann ja irgendwie auch nicht im Sinne des Erfinders sein...



  • Vielleicht kannst du da was mit weak Symbols tricksen.



  • wenn du die codeteile die Delay Load Linking brauchen auslagerst und als modul zum dynamisch laden bereitstellst die dann wiederum das laden was sie bracuhen sollt es gehn


Anmelden zum Antworten