2010-03-08 19 views
7

Supponiamo che tu abbia 2 librerie condivise, lib1.so e lib2.so, che hanno entrambi libcommon.a linkato staticamente in esse. Il compilatore si lamenterebbe di un riferimento ambiguo ai simboli se si collegasse dinamicamente sia a lib1.so sia a lib2.so? O il compilatore dovrebbe essere abbastanza intelligente da sapere che i simboli libcommon sono condivisi tra lib1 e lib2 e consentono di collegarsi dinamicamente a entrambi?Collegamento a più librerie condivise che sono tutte collegate a una libreria statica comune

risposta

2

La libreria statica verrebbe utilizzata per risolvere internamente i collegamenti ma il collegamento esterno non verrebbe propagato all'interfaccia della libreria condivisa, quindi non ci sarebbero conflitti. Ogni libreria condivisa includerebbe la propria copia del codice della libreria statica.

+4

Almeno in GNU/Linux, se creo una libreria condivisa (.so) che si collega a una libreria statica (.a), posso accedere a tutti i simboli estratti dalla libreria statica da un eseguibile che collega solo alla libreria condivisa (.so), quindi sono abbastanza sicuro che i simboli della libreria statica _are_ si siano propagati all'interfaccia della libreria condivisa. Forse le cose funzionano diversamente su altri sistemi, ma la maggior parte dei sistemi su cui ho lavorato è il caso con le opzioni predefinite del linker. –

+0

@ Jay Walker: Per quello che vale, ho preferito la tua risposta. Indipendentemente dai meccanismi, la verità fondamentale è che non si verificheranno conflitti. – Clifford

3

Non ci sarà alcun conflitto perché quando si collega alle librerie condivise, il linker utilizzerà la definizione dalla prima libreria condivisa che fornisce il simbolo e non guarderà oltre le altre librerie condivise. I simboli inclusi da .a verranno esportati in entrambe le librerie condivise ma non entreranno in conflitto.

+0

Questo non è vero. Ci sono simboli esportati deboli e forti. Se c'è disambiglianza tra forte c'è un errore. – Trismegistos

0

Supponiamo che le due librerie condivise siano collegate con le diverse librerie statiche. Ma le librerie statiche contengono entrambe una funzione con lo stesso nome. Ci sarebbe conflitto.

Sono sicuro che perché ho un'applicazione tcl/tk, carica due librerie tcl (.so). Entrambe le librerie sono collegate staticamente con la libreria openssl. ma con una versione diversa. Si è verificato un errore di segmentazione durante l'esecuzione dell'applicazione tcl. Lo rintraccio nel openssl. C'è una implementazione della funzione modificata nella nuova versione.

Problemi correlati