Ho una grande libreria condivisa, una raccolta di funzioni create da numerosi file .a
in libeverything.so
. Il codice per i file .a
è ovviamente compilato con -fPIC
. Ho anche libeverything.a
che contiene un'istruzione GROUP ( part1.a part2.a part3.a ... partN.a )
che include tutte le librerie statiche .a
.
Non voglio contribuire alla proliferazione .so
, quindi non ho part1.so
, part2.so
, part3.so
, ..., partN.so
come I ho part1.a
, part2.a
, part3.a
, ..., partN.a
.
Ora, supponiamo che molte applicazioni richiedano solo part1.a
e part2.a
. Per supportare le suddette applicazioni, voglio creare una versione "lite" della libreria condivisa, libsomethings.so
collegato da libsomethings.a
contenente GROUP ( part1.a part2.a )
.
Può una libreria condivisa "lite" contenente un sottoinsieme di una libreria condivisa più grande causare alcuni effetti negativi? Ovviamente, sono consapevole del fatto che lo spazio su disco e l'utilizzo della memoria sono leggermente meno efficienti, ma al giorno d'oggi non è un problema.
Sono principalmente preoccupato per i problemi di collegamento. Dì, ad esempio libfoo.so
che richiede libeverything.so
e libbar.so
che richiedono libsomethings.so
. Il collegamento di libfoo.so
e libbar.so
nella stessa applicazione può causare effetti negativi?
Ad esempio, considera cosa succede se part1.a
definisce una variabile globale. Sarà incluso due volte se sia libeverything.so
che libsomethings.so
sono collegati nella stessa applicazione tramite libfoo.so
e libbar.so
?
Questa versione "lite" di una libreria condivisa è una pessima idea dal punto di vista dell'ingegneria del software su ambienti Linux / POSIX?
Una soluzione sarebbe avere libpart1.so
, libpart2.so
, libpart3.so
, ... libpartN.so
ma ciò porterebbe esattamente al tipo di proliferazione .so
che sto cercando di evitare.
C'è un modo elegante per evitare la proliferazione di .so
e anche i cattivi effetti di collegamento?