2012-08-27 1 views
5

Se utilizzo dlopen sullo stesso lib/file due volte nella stessa esecuzione dell'applicazione, produrrà lo stesso handle in entrambi i casi? C'è qualche garanzia per questo (un breve esperimento ha dimostrato che lo fa almeno sulla mia scatola)?Dlopen restituirà lo stesso handle per due chiamate con lo stesso file?

Attualmente sto giocando con un piccolo sistema di plugin (per curiosità) e se ci fosse qualche tipo di garanzia per questo comportamento osservato potrei usare questo indirizzo come chiave per un plugin per prevenire i carichi duplicati.

risposta

8

Sì. La pagina man dlopen(3) linux dice:

If the same library is loaded again with dlopen(), the same file 
    handle is returned. The dl library maintains reference counts for 
    library handles, so a dynamic library is not deallocated until 
    dlclose() has been called on it as many times as dlopen() 
    has succeeded on it. 

BTW, su sistemi Linux, è possibile dlopen molto (molte decine di migliaia) di librerie condivise, come il mio esempio manydl.c dimostra. La principale limitazione è lo spazio degli indirizzi. Quindi, praticamente, non è necessario preoccuparsi del roba dlclose -ing.

(a meno che le librerie tuo dlopen-ed condivisi hanno costruttore o distruttore funzioni strane o consumo di risorse)

Aggiunto dicembre 2017:

Si noti che ciò che è rilevante è passata la stringa di percorso esatto a dlopen. Pertanto, se si utilizza "./foo.so" e "././foo.so" (o "../foosymlink.so" dove foosymlink.so è un collegamento simbolico a foo.so) gli handle di dlopen-ed sono diversi e in alcuni casi potrebbe verificarsi un comportamento strano delle due istanze di tale libreria condivisa.

+1

.. e ho appena letto questa pagina man, perché non ho letto anche questo paragrafo? Hmpf .. beh, grazie comunque per aver risposto alla mia stupida domanda :) – mageta