Qual è l’equivalente del carico di ritardo nel sistema basato su Unix.
Ho un codice foo.cpp
, mentre foo.cpp
compilando con gcc lo foo.cpp
agli oggetti condivisi (ci sono in totale tre file .so). Ciascuno dei file .so per diverse opzioni.
./foo -v
bisogno di libversion.so
./foo -update
bisogno di libupdate.so
Ho bisogno del simbolo per quelle librerie che dovrebbero essere risolte solo in fase di esecuzione.
./foo -v
non dovrebbe rompersi anche se la libreria libupdate.so non è presente.
Funziona in Windows usando l’opzione di caricamento ritardato (nelle proprietà di dll). Qual è il suo equivalente nei sistemi unix.
-lazy
opzione -lazy
farà lo stesso in UNIX? In tal caso, dove includere questa opzione: in makefile o con linker ld?
Vedi il riferimento sul tuo sistema per dlopen (). È ansible aprire manualmente le librerie e risolvere i simboli esterni in fase di esecuzione anziché in fase di collegamento.
Ho tirato fuori un esempio:
int main(int argc, char **argv) { void *handle=NULL; double (*myfunc)(double); char *err=NULL; handle = dlopen ("/lib/libm.so.1", RTLD_LAZY); if (!handle) { err=dlerror(); perror(err); exit(1); } myfunc = dlsym(handle, "sin"); if ((err = dlerror()) != NULL) { perror(err); exit(1); } printf("sin of 1 is:%f\n", (*myfunc)(1.)); dlclose(handle); return 0; }
So che sono passati 8 anni ma ancora …
Il ritardo del caricamento non è supportato dalla scatola sui sistemi GNU, ma puoi imitarlo tu stesso creando un piccolo stub statico che fornisce tutti i simboli necessari e l’implementazione reale di dlopen
in prima chiamata (o anche all’avvio del programma). Tale sub può essere scritto a mano, generato da uno script specifico del progetto o tramite lo strumento Implib.so :
# Replace $ gcc -o foo foo.c -lversion # with $ implib-gen.py libversion.so $ gcc -o foo foo.c libversion.tramp.S libversion.init.c