2012-10-01 14 views
8

Qual è l'ordine di ricerca per la ricerca di simboli quando si risolvono le rilocazioni dinamiche?ELF Ordinamento ricerca simboli caricatore dinamico

Quando si risolvono i simboli per una libreria condivisa, il caricatore prima cerca nel "file eseguibile principale" (per consentire alle definizioni di sovrascrittura dell'eseguibile principale ...) o cosa?

risposta

9

Per la mia comprensione, ogni oggetto eseguibile ha il proprio "ambito di ricerca":

  • L'eseguibile principale è di solito il primo oggetto nel campo di applicazione di ricerca "globale". Ciò significa che i simboli definiti nell'eseguibile principale sovrascriveranno quelli nelle librerie condivise dipendenti. Gli oggetti condivisi aggiunti utilizzando la funzione LD_PRELOAD vengono aggiunti all'ambito di ricerca globale, subito dopo l'eseguibile principale.
  • Tuttavia, se l'oggetto condiviso che viene caricato utilizza il flag DF_SYMBOLIC, i riferimenti ai simboli che hanno origine all'interno di tale oggetto cercheranno le definizioni all'interno dell'oggetto prima della ricerca nell'ambito della ricerca globale.
  • Gli oggetti condivisi aperti utilizzando dlopen() possono avere le proprie dipendenze. Se il flag RTLD_GLOBAL non è stato impostato durante la chiamata a dlopen(), queste dipendenze vengono aggiunte all'ambito di ricerca per quell'oggetto, ma non influiscono sull'ambito della ricerca globale. Se il flag RTLD_GLOBAL è stato passato a dlopen(), l'oggetto condiviso (e le sue dipendenze) verrà aggiunto all'ambito di ricerca "globale", modificando il comportamento delle successive ricerche di simboli.

La guida di Ulrich Drepper "How to Write Shared Libraries" è una lettura consigliata su questo argomento.

+0

Per completezza: ci sono simboli dell'eseguibile principale che non verranno esportati nella tabella dei simboli dinamici a meno che non lo si compili con l'opzione rdynamic (o simile) – debuti

4

Quando si risolvono i simboli per una libreria condivisa, il caricatore prima cerca nel "file eseguibile principale" (per consentire alle definizioni di sovrascrittura dell'eseguibile principale ...) o cosa?

Sì, esattamente. Il caricatore dinamico ha un elenco collegato di oggetti ELF caricati (la testa dell'elenco è _r_dynamic.r_map) e ricerca linearmente le tabelle di simboli degli oggetti in tale elenco in modo lineare, finché non trova la definizione di simbolo che sta cercando.

Il capo dell'elenco punta sempre all'eseguibile principale. Se un determinato simbolo viene esportato dall'eseguibile principale, allora (quasi) sempre "vince" (sostituisce altre definizioni).

Tuttavia, notare che il flag di collegamento -Bsymbolic cambia leggermente l'immagine.