GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bibliothekspfad beim dynamischen Laden?

Der dynamische Linker durchsucht tatsächlich mehrere Orte, um jede dynamische Bibliothek zu finden. Dazu gehören (von man ld.so):

  • Pfade, die von der Umgebungsvariable LD_LIBRARY_PATH angegeben werden
  • In die Binärdatei gebackene Pfade laden die Bibliothek unter DT_RUNPATH Eintrag
  • Die Cache-Datei /etc/ld.so.cache
  • /lib und /usr/lib

Wenn Sie den Pfad für eine bestimmte gemeinsam genutzte Bibliothek erhalten möchten, würde ich den dladdr empfehlen Funktion. Aus der Manpage:

Die Funktion dladdr() nimmt einen Funktionszeiger und versucht, Name und Datei dort aufzulösen, wo sie sich befinden. Informationen werden in Dl_info gespeichert Struktur:

typedef struct {
    const char *dli_fname;  /* Pathname of shared object that
                               contains address */
    void       *dli_fbase;  /* Address at which shared object
                               is loaded */
    const char *dli_sname;  /* Name of nearest symbol with address
                               lower than addr */
    void       *dli_saddr;  /* Exact address of symbol named
                               in dli_sname */
} Dl_info;

Wenn keine zum Symbol passende Adresse gefunden werden konnte, dann dli_sname unddli_saddr sind auf NULL gesetzt .

dladdr() gibt im Fehlerfall 0 und im Erfolgsfall ungleich Null zurück.

Sie geben ihm also einfach einen Funktionszeiger, und er gibt Ihnen den Namen der Datei, die ihn liefert, und eine Reihe anderer Informationen. So könnte beispielsweise ein Konstruktor in einer Bibliothek dies selbst aufrufen, um den vollständigen Pfad der Bibliothek herauszufinden:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>

__attribute__((constructor))
void on_load(void) {
    Dl_info dl_info;
    dladdr((void *)on_load, &dl_info);
    fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}

Diese Funktion funktioniert auch unter OS X mit der gleichen Semantik.


Linux
  1. Linux – Was passiert, wenn Sie ohne Zielpfad synchronisieren?

  2. Bibliothekspfad beim dynamischen Laden?

  3. Statische Bibliothek dynamisch laden?

  4. Fenster in GTK+ dynamisch verkleinern, wenn Inhalt schrumpft?

  5. Was ist eine .so.2-Datei?

Klassische Path.DirectorySeparatorChar-Probleme beim Wechsel von .NET Core unter Windows zu Linux

So fügen Sie eine .so-Datei zum java.library.path in Linux hinzu

So verzögern Sie das Laden einer gemeinsam genutzten Bibliothek unter Linux

Wie entferne ich den vollständigen Pfad, wenn ich eine tar.gz-Komprimierung durchführe?

Wie können Sie beim Hinzufügen von Dateien zu einem tar einen beliebigen führenden Pfad festlegen?

Linux-Befehl gefunden, aber bei Verwendung von sudo nicht gefunden