2010-05-07 9 views
5

Ho un programma C++ che si collega in fase di runtime con, diciamo, mylib.so. quindi, lo stesso programma usa dlopen()/dlsym() per caricare una funzione da myplugin.so, libreria dinamica che a sua volta ha dipendenze da mylib.so.sono runtime che collegano globali di libreria condivisi tra plugin caricati con dlopen?

La mia domanda è: il programma AND la funzione nel plugin accedono agli stessi globals definiti in mydlib.so nella stessa area di memoria riservata al programma, o ad ognuno verranno assegnate copie diverse, non correlate nel proprio spazio di memoria ? se quest'ultimo è il comportamento predefinito, è possibile cambiarlo?

Grazie in anticipo =)!

risposta

1

Globali nel programma principale che fa il dlopen dovrebbero essere visibili al codice che viene caricato dinamicamente. Tuttavia, il miglior consiglio che ho visto fino ad oggi (specialmente se si desidera avere un codice persino vagamente portatile) è di avere solo chiamate di funzione passate attraverso la divisione del linker e di non esportare alcuna variabile in nessuna direzione. È anche meglio se c'è un'API per il codice caricato per registrare le parti interessanti della sua API con il caricatore (ad esempio, "Ecco come fornisco questo SPI per disegnare i foobar su un baz") poiché questo è un modo molto più sicuro di fare callbacks piuttosto che semplicemente mashing tutto insieme.

[MODIFICA]: l'altro motivo per farlo è se si sta simulando un collegamento debole su una piattaforma che non lo supporta. È molto simile all'altro che elenco, eccetto che è il programma principale che sta costruendo l'SPI fuori dall'API esportato dalla libreria dinamica anziché dallo .so esportandolo esplicitamente all'avvio. È il secondo migliore in assoluto, ma ti accontenti di quello che hai piuttosto che desiderare (beh, a meno che tu non sia disposto a fare il lavoro scrivendo una sorta di libreria di connessione).

+0

+1 per l'utilizzo di API/SPI pulito – neuro