web-dev-qa-db-fra.com

-static option pour gcc?

Je me demande ce que fait l'option -static sur gcc. J'ai besoin de cette option lors de la compilation d'une certaine application, mais lorsque je le fais, j'obtiens l'erreur suivante:

gcc -static -O3 -o prog prog.c
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

Que faut-il installer?

Version GCC:

[user@localhost dir]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,Java,fortran,ada,go,lto --enable-plugin --enable-Java-awt=gtk --disable-dssi --with-Java-home=/usr/lib/jvm/Java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-Java-maintainer-mode --with-ecj-jar=/usr/share/Java/Eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-Arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) 
22
sj755

L'option -static Lie statiquement un programme, en d'autres termes, il ne nécessite pas de dépendance aux bibliothèques dynamiques au moment de l'exécution pour fonctionner.

Pour obtenir une liaison statique, les versions d'archive (.a) de vos bibliothèques doivent exister sur le système. donc /usr/lib/libc.a /usr/lib/crt1.o etc ...

Sur les systèmes Linux modernes (comme vous utilisez Red Hat): lorsqu'un binaire se lie 1), il place le code dans l'exécutable via des fichiers .o et .a, ou 2) met en référence des fichiers de bibliothèques dynamiques (.so) cela est résolu par /lib/ld-linux.so (ou /lib64/ld-linux=x86-64.so) qui est toujours à un endroit bien connu.

Pour votre système particulier, si un programme cherche spécifiquement à créer une version statique de lui-même, vous devez installer les versions statiques de vos outils de développement. Vous avez besoin, au minimum, d'un paquet glibc-static. Vous pouvez également avoir besoin de libstdc ++ - package statique.

57
Ahmed Masud

Le -static flag oblige l'éditeur de liens à accepter uniquement les bibliothèques statiques et non les bibliothèques partagées.

Si vous souhaitez utiliser -static, vous devez vous assurer que vous disposez d'une version statique de la bibliothèque C installée, ce qui peut être difficile à trouver (la plupart des systèmes n'ont plus de bibliothèque C statique). Ou vous devez annuler l'effet de -static. Cependant, dans l'exemple, cela irait à l'encontre de l'objectif de -static puisque la seule bibliothèque liée est (implicitement) la bibliothèque C.

11
Jonathan Leffler