Ho un'applicazione che si collega staticamente con la versione X di una libreria, libfoo, dal fornitore di terze parti, VENDOR1. Si collega anche con una libreria dinamica (condivisa), libbar, da un fornitore di terze parti diverso, VENDOR2, che collega staticamente la versione Y di libfoo da VENDOR1.Collegamento con più versioni di una libreria
contiene così libbar.so versione Y di libfoo.a e il mio eseguibile contiene la versione X di libfoo.a libbar utilizza solo libfoo internamente che non vi siano oggetti libfoo passati dalla mia app per libbar.
Non ci sono errori in fase di costruzione ma in fase di esecuzione l'app segifica errori. La ragione sembra essere che la versione X utilizza strutture che hanno una dimensione diversa nella loro versione Y e il linker di runtime sembra essere in fase di rimescolamento, che viene usato da quale.
Entrambi VENDOR1 & VENDOR2 sono closed source, quindi non posso ricostruirli.
C'è un modo per creare/collegare la mia app in modo tale che risolva sempre alla versione X e libbar si risolva sempre nella versione Y e le due non si mescolano mai?
Puoi rendere la tua app collegata dinamicamente a VENDOR1? –
Non è in alcun modo neutrale rispetto alla lingua. Questo è molto specifico per il compilatore linker e il SO come funzionano tutti insieme. Il modo più semplice è inviare via e-mail entrambi i distributori e vedere come risolvono questo problema. –
Il nostro modo di pensare corrente è, almeno su linux, usare dlopen() su libbar.so con il flag RTLD_DEEPBIND. Un'altra possibilità è quella di separare l'uso delle app di libfoo.a in una libreria condivisa, libbaz.so che avvolge l'uso di libfoo.a, quindi avere l'app dlopen libbaz.so e libbar.so con RTLD_LOCAL che pensiamo possa mantenere tutto i simboli duplicati interni. Questo potrebbe funzionare per Linux ma ne abbiamo bisogno, quindi lavora anche su Solaris, AIX e HPUX. – YerBlues