Domanda

Devo distribuire un binario che verrà eseguito su quante più distribuzioni Linux x86 possibili. Ciò significa che devo collegare staticamente alcune librerie, come glibc, perché l'utente potrebbe non avere la versione che uso. Altre librerie devono essere collegate dinamicamente, come fontconfig, perché si basa su un formato di file cache e posizioni codificate che possono differire su ciascun sistema.

Quali sono le opzioni della riga di comando per farlo? Se specifico -static, gcc rifiuterà di collegare dinamicamente qualsiasi libreria.

È stato utile?

Soluzione

Il collegamento statico a qualsiasi libreria di sistema, e in particolare a libc , sui moderni sistemi UNIX o Linux rende il binario significativamente meno portatile. Basta non farlo.

Usa invece la retrocompatibilità (i binari collegati su un vecchio sistema continuano a funzionare su tutti i nuovi) a tuo vantaggio, sia collegando il tuo binario su un vecchio sistema (io uso RedHat 6.2, e non ho visto un sistema Linux dove il mio binario non funzionerà negli ultimi 8 anni) o usando qualcosa come autopackage (che è stato eliminato dopo che questa risposta è stata scritta).

Per rispondere alla domanda originale:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

farà in modo che il linker utilizzi la versione di archivio di libfoo. [È importante avere esattamente il -Wl, -Bdynamic finale in modo da non forzare la libc statica.]

Altri suggerimenti

Va ??notato che, sotto Linux, è possibile collegare (in modo sicuro) staticamente una libreria solo se nessuna delle librerie dinamiche dipende da essa. Questo significa che se stai usando delle librerie dinamiche, puoi dimenticare di collegare staticamente libc. Basta usare una versione abbastanza vecchia per compilare il caso di libc; libc ha mantenuto una forte compatibilità all'indietro ABI nel corso degli anni.

Prova a passare i percorsi ai file della libreria a cui stai collegando sulla riga di comando del linker (siano essi librerie .a o .so) e drop -static. Questo dovrebbe fare il trucco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top