GNU/Linux >> Linux Esercitazione >  >> Linux

percorso della libreria quando viene caricato dinamicamente?

Il linker dinamico in realtà cerca in diversi posti per trovare ogni libreria dinamica. Questi includono (da man ld.so):

  • Percorsi forniti dalla variabile d'ambiente LD_LIBRARY_PATH
  • I percorsi inseriti nel binario caricano la libreria sotto il DT_RUNPATH ingresso
  • Il file cache /etc/ld.so.cache
  • /lib e /usr/lib

Se vuoi ottenere il percorso per una libreria condivisa specifica, ti consiglio dladdr funzione. Dalla pagina man:

La funzione dladdr() prende un puntatore a funzione e tenta di risolvere il nome e il file in cui si trova. Le informazioni sono memorizzate nel Dl_info struttura:

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;

Se non è stato trovato alcun simbolo corrispondente a addr, allora dli_sname edli_saddr sono impostati su NULL .

dladdr() restituisce 0 in caso di errore e diverso da zero in caso di successo.

Quindi gli dai solo un puntatore a funzione e ti darà il nome del file che lo fornisce e una serie di altre informazioni. Quindi, ad esempio, potresti fare in modo che un costruttore in una libreria chiami this su se stesso per scoprire il percorso completo della libreria:

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

Questa funzione funziona anche su OS X con la stessa semantica.


Linux
  1. caricamento dinamico della libreria statica?

  2. Ridurre dinamicamente la finestra in GTK+ quando il contenuto si restringe?

  3. Come aggiungere il file .so a java.library.path in Linux

  4. Cos'è un file .so.2?

  5. Cos'è un file .so?

Quando usare Nohup?

Linux:cosa succede quando esegui la sincronizzazione senza un percorso di destinazione??

Il classico Path.DirectorySeparatorChar ottiene risultati quando si passa da .NET Core su Windows a Linux

Come fare in modo che un ritardo di libreria condivisa venga caricato su Linux

Come puoi designare un percorso principale arbitrario quando aggiungi file a un tar?

comando linux trovato ma non trovato quando si usa sudo