Archiv verlassen und diese Seite im Standarddesign anzeigen : Shared libraries Suchpfad unter Linux
KyroMaster
07-10-2005, 23:14
Ich habe ein bisschen im Netz nach dem Suchpfad des Linkers unter Linux gesucht und auch die üblichen LD_LIBRARY_PATH/LD_RUN_PATH Sachen gefunden. Als ich mir das Firefox-Verzeichniss angeschaut habe bin ich jedoch etwas stutzig geworden. Hier liegen einige Bibliotheken direkt im Verzeichniss des Programms. Wenn ich "ldd firefox" aufrufe, kommt dass diese Bibliotheken nicht gefunden werden, jedoch kommt beim Start von Firefox keine Fehlermeldung. Wie funktioniert das? Sucht der dynamische Linux-Linker auch im Verzeichniss der jeweiligen Prgrammdatei?
SeeksTheMoon
07-10-2005, 23:39
man kann den Parameter -rpath angeben, der den Suchpfad beim Linken vorgibt. Das funktioniert nicht unter allen Betriebssystemen, z.B. Windows.
Unter Windows werden die Libs aber automatisch gefunden wenn sie im gleichen Verzeichnis wie die App liegen (d.h. wenn sie im Pfad sind).
KyroMaster
08-10-2005, 00:37
Das mit dem rpath habe ich auch schon gelesen. Sind da relative pfade möglich, oder wie soll das beim Firefox sonst funktionieren (ist egal in welchem Verzeichniß der liegt)?
peschmae
08-10-2005, 06:13
Das Programm selber kann wenn es will auch Shared Libraries von *irgendwo* her laden. LD_LIBRARY_PATH und so spielt quasi nur wenn das Programm nicht explizit sagt wo die Datei denn liegt.
MfG Peschmä
SeeksTheMoon
08-10-2005, 12:32
ja, mit rpath kann man auch relative Pfade angeben, ich benutze das auch in einem Projekt so. Da wird alles in ein "out"-Verzeichnis kompiliert und die libs liegen in out/lib. Ich linke dann mit den ldflags -rpath=lib (kann man beim gcc mit "-Wl,-rpath=lib" als CFLAGS oder CXXFLAGS angeben) und kann das out-Verzeichnis dann an beliebige Stelle verschieben.
Der Nachteil dass meine Libs in einem anderen Verzeichnis sind, ist dass das unter diesem komischen Redmond-OS nicht ohne Pfaderweiterung klappt, da muss ich vielleicht demnächst alles ins gleiche Verzeichnis kompilieren und "-rpath=." angeben.
Ich hab auch in der binutils-ML nachgefragt, etwas äquivalentes wie rpath gibts unter Windows leider überhaupt nicht, vielleicht ist es dort möglich wenn man den MS Linker benutzt, der hat eine Option die sich so ähnlich anhört (aber alle Win Programme die ich kenne, die haben ihre Libs im gleichen Verzeichnis wie die exe-Dateien)
Wie peschmae schon sagt, gibt es auch noch die Möglichkeit mit C-Befehlen eine Bibliothek laden zu lassen.
Ich meine jetzt aber, dass das auch nur unter Unices geht, kann mich aber auch irren.
Leider benötigen manche Programme ihre Bibliotheken schon zur Startzeit, d.h. Ladeanweisungen im Code kommen dann zu spät weil das Programm gar nicht erst startet. Sowas wird also nur mit einer Art plugin-Architektur funktionieren, d.h. ich werde kein qt-Programm schreiben können das qt-Bibliotheken erst nach seinem Start lädt. (Vielleicht ist das möglich wenn ich dem Linker sage, dass Symbole erst nach dem Start aufgelöst werden sollen? Nur so ne Idee)
Es gibt im Netz ein interessantes Howto zu shared libraries:
http://people.redhat.com/drepper/dsohowto.pdf
Abschnitt 3.9 erklärt z.B. rpath etwas genauer.
anda_skoa
08-10-2005, 15:16
Wenn ich "ldd firefox" aufrufe, kommt dass diese Bibliotheken nicht gefunden werden, jedoch kommt beim Start von Firefox keine Fehlermeldung. Wie funktioniert das? Sucht der dynamische Linux-Linker auch im Verzeichniss der jeweiligen Prgrammdatei?
Es kann zB auch sein, daß das firefox Executable nur ein Script ist, das LD_LIBRARY_PATH setzt und dann das eigentlice Programm aufruft.
Also bei mir ist das zum Beispiel der Fall:
file firefox
sagt:
firefox: Bourne shell script text executable
Das eigentliche Programm heißt firefox-bin
Ciao,
_
locus vivendi
08-10-2005, 16:47
[...] d.h. ich werde kein qt-Programm schreiben können das qt-Bibliotheken erst nach seinem Start lädt. (Vielleicht ist das möglich wenn ich dem Linker sage, dass Symbole erst nach dem Start aufgelöst werden sollen? Nur so ne Idee)
So kompliziert ist gar nicht nötig. Zumindest hier mit GNU/Linux kann ich beim erzeugen eines DSO angeben, dass ich Qt dazulinken möchte. Wenn ich dann aus einem Programm heraus das DSO mit dlopen öffne, scheint alles "normal" zu funktionieren.
RapidMax
09-10-2005, 22:57
Mittels dlopen kann eine Bibliothek zur laufzeit geladen werden. Ich würde aber empfehlen, das libtool (libltdl) zu überlassen, da dieses sich um die Plattform-spezifischen Eigenheiten kümmert (z.B. bei Windows).
Gruss, Andy
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.