Domanda

Voglio dlopen() ogni libreria condivisa in una directory specifica.Per fare ciò,
qual è il modo più pulito per recuperare il percorso di ricerca della libreria di Linux.Oppure esiste un modo più rapido per trovare una directory specifica in quel percorso?
posix sarebbe meglio.

È stato utile?

Soluzione

POSIX non supporta un meccanismo per individuare le directory nel percorso di ricerca della libreria condivisa (non impone LD_LIBRARY_PATH, ad esempio), quindi qualsiasi soluzione è intrinsecamente in qualche modo specifica della piattaforma.

Linux presenta alcuni problemi perché i valori da utilizzare potrebbero essere basati sul contenuto di /etc/ld.so.conf così come qualsiasi valore di runtime in LD_LIBRARY_PATH variabile d'ambiente;altri sistemi presentano problemi comparabili.Le posizioni predefinite variano anche in base al sistema, con /lib E /usr/lib essendo normale per le macchine Linux a 32 bit ma /lib64 E /usr/lib64 utilizzato su almeno alcune macchine a 64 bit.Tuttavia, altre piattaforme utilizzano altre posizioni per il software a 64 bit.Ad esempio, Solaris utilizza /lib/sparcv9 E /usr/lib/sparcv9, per esempio (anche se i documenti menzionano /lib/64 E /usr/lib/64, sono collegamenti simbolici a sparcv9 directory).Solaris ha anche variabili d'ambiente LD_LIBRARY_PATH_64 E LD_LIBRARY_PATH_32.HP-UX e AIX utilizzano tradizionalmente variabili diverse da LD_LIBRARY_PATH -- SHLIB_PATH E LIBPATH, IIRC - anche se credo che AIX ora utilizzi LD_LIBRARY_PATH pure.E, su Solaris, lo strumento per configurare le librerie condivise è "crle" (configura l'ambiente di collegamento runtime) e l'analogo di /etc/ld.so.conf è uno dei due /var/ld/ld.config O /var/ld/64/ld.config.Inoltre, ovviamente, le estensioni delle librerie condivise variano (.so, .sl, .dylib, .bundle, eccetera).

Quindi, la tua soluzione sarà specifica della piattaforma.Dovrai decidere le posizioni predefinite, le variabili di ambiente da leggere, il file di configurazione da leggere e l'estensione del file pertinente.Detto questo, si tratta principalmente di uno SMOP - Simple Matter Of Programming:

  • Per ogni directory denominata da una qualsiasi delle fonti:
    • Aprire la sottodirectory pertinente (opendir())
      • Leggere il nome di ciascun file (readdir()) a sua volta
      • Utilizzo dlopen() sul percorso dei file rilevanti.
      • Fai qualsiasi analisi sia rilevante per te.
      • Utilizzo dlclose()
    • Utilizzo closedir()

Vedi anche le note nel commento qui sotto... l'argomento completo è modestamente irto di variazioni da piattaforma a piattaforma.

Altri suggerimenti

Non sono sicuro che sia possibile farlo e di essere portatile. Dal momento che questa domanda è su Linux, la portabilità non può essere di fondamentale importanza. Poi non capisco il vincolo POSIX. Potrebbe chiarire?

Probabilmente dovrete a uno implementare la funzionalità di ricerca dettagliato in man 8 ld.so, che include la scansione /etc/ld.so.conf oltre a LD_LIBRARY_PATH, o fare /lib/ld.so fare ciò che si vuole per voi e per analizzare l'output. Una riga di comando non proprio carina per questo potrebbe essere:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

Si può quindi file di enumerare con POSIX chiama opendir(3) e readdir(3).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top