2012-06-26 5 views
6
$ printf 'int main(){}' | gcc -static -x c - -o hello 
$ scp hello vi-server.org:./ 
hello        100% 565KB 565.2KB/s 00:00 
$ ssh -t vi-server.org "./hello; uname -r" 
FATAL: kernel too old 
sh: line 1: 15378 Segmentation fault  ./hello 
2.6.18-274.... # can't easily upgrade the kernel 
Connection to vi-server.org closed. 

Come creare un binario statico che funzionerà su sistemi precedenti? Mi aspetto che i binari statici funzionino anche su 2.4.Come costruire un binario statico per installazioni GNU/Linux con vecchio kernel?

risposta

8

È necessario configurare glibc per indirizzare la versione del kernel precedente. Per http://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html glibc accetta l'opzione di configurazione --enable-kernel=version dove version è nel formato 2.4.20 per scegliere come target versioni di kernel meno recenti.

È quindi possibile collegare il programma in modo statico con gcc -static -nodefaultlibs [...] /path/to/my/libc.a.

0

Grazie a quanto sopra ecatmur manifesto - è effettivamente funziona per riconfigurare/rebuild glibc con l'opzione di configurazione --enable-kernel = versione

vorrei aggiungere quanto segue - si può usare gcc -static -L/percorso/to/locale/lib (grande opzione L per la directory) e sembra funzionare altrettanto bene come il collegamento al file della libreria stesso. Quando ho collegato in quest'ultimo modo (a /path/to/local/lib/libc.a), ha creato un eseguibile inutilmente grande.

+2

Nota: spesso è disponibile un'opzione per rendere binario "semi-statico". Si collegherà a libc in modo dinamico, ma ad altre librerie in modo statico (puoi scegliere quali librerie includere in binario e a cui collegarti). Può essere fatto modificando manualmente il comando di collegamento. –