Ritardo-Carico equivalente nei sistemi basati su unix

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