GNU/Linux >> Znalost Linux >  >> Linux

cesta ke knihovně při dynamickém načítání?

Dynamický linker ve skutečnosti prohledává několik míst, aby našel každou dynamickou knihovnu. Patří mezi ně (z man ld.so):

  • Cesty dané proměnnou prostředí LD_LIBRARY_PATH
  • Cesty zapečené do binárního souboru načítají knihovnu pod DT_RUNPATH vstup
  • Soubor mezipaměti /etc/ld.so.cache
  • /lib a /usr/lib

Pokud chcete získat cestu pro konkrétní sdílenou knihovnu, doporučil bych dladdr funkce. Z manuálové stránky:

Funkce dladdr() vezme ukazatel funkce a pokusí se přeložit název a soubor, kde se nachází. Informace jsou uloženy v Dl_info struktura:

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;

Pokud nebyl nalezen žádný symbol odpovídající adr, pak dli_sname adli_saddr jsou nastaveny na NULL .

dladdr() vrátí 0 při chybě a nenulovou při úspěchu.

Takže mu stačí dát ukazatel funkce a dá vám název souboru, který jej dodává, a spoustu dalších informací. Takže například můžete mít konstruktor v knihovně, který si toto zavolá, aby zjistil úplnou cestu ke knihovně:

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

Tato funkce funguje také na OS X se stejnou sémantikou.


Linux
  1. Rychlý způsob, jak zahrnout cestu k adresáři při volání Mv?

  2. cesta ke knihovně při dynamickém načítání?

  3. dynamicky načítat statickou knihovnu?

  1. Zmenšit okno v GTK+ dynamicky, když se obsah zmenší?

  2. Jak přidat soubor .so do java.library.path v Linuxu

  3. Co je soubor .so.2?

  1. Co je soubor .so?

  2. Nějaký způsob, jak se vyhnout tečkovému lomítku při spouštění spustitelných skriptů v bash?

  3. Použití / při použití cd