GNU/Linux >> Tutoriels Linux >  >> Linux

chemin de la bibliothèque lorsqu'il est chargé dynamiquement ?

L'éditeur de liens dynamique recherche en fait plusieurs endroits pour trouver chaque bibliothèque dynamique. Ceux-ci incluent (de man ld.so):

  • Chemins donnés par la variable d'environnement LD_LIBRARY_PATH
  • Les chemins intégrés au binaire chargent la bibliothèque sous le DT_RUNPATH entrée
  • Le fichier cache /etc/ld.so.cache
  • /lib et /usr/lib

Si vous souhaitez obtenir le chemin d'une bibliothèque partagée spécifique, je vous recommande le dladdr fonction. À partir de la page de manuel :

La fonction dladdr() prend un pointeur de fonction et essaie de résoudre le nom et le fichier où il se trouve. Les informations sont stockées dans le Dl_info structure :

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;

Si aucune adresse de correspondance de symbole n'a pu être trouvée, alors dli_sname etdli_saddr sont définis sur NULL .

dladdr() renvoie 0 en cas d'erreur et différent de zéro en cas de succès.

Donc, vous lui donnez simplement un pointeur de fonction, et il vous donnera le nom du fichier qui le fournit et un tas d'autres informations. Ainsi, par exemple, vous pouvez avoir un constructeur dans une bibliothèque qui appelle cela sur lui-même pour connaître le chemin complet de la bibliothèque :

#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);
}

Cette fonction fonctionne également sur OS X avec la même sémantique.


Linux
  1. chemin de la bibliothèque lorsqu'il est chargé dynamiquement ?

  2. chargement dynamique de la bibliothèque statique ?

  3. Réduire dynamiquement la fenêtre dans GTK+ lorsque le contenu rétrécit ?

  4. Comment ajouter un fichier .so au java.library.path sous Linux

  5. Un moyen d'éviter les barres obliques lors de l'exécution de scripts exécutables dans bash ?

Linux - Que se passe-t-il lorsque vous vous synchronisez sans chemin de destination ? ?

Classic Path.DirectorySeparatorChar gotchas lors du passage de .NET Core sous Windows à Linux

Comment faire un délai de bibliothèque partagée chargé sur Linux

Qu'est-ce qu'un fichier .so.2 ?

Qu'est-ce qu'un fichier .so ?

Comment supprimer le chemin complet lors d'une compression tar.gz ?