Question -statique 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 quand 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) 

14
2018-01-01 06:40


origine


Réponses:


Vous devriez généralement éviter de lier statiquement votre application (et vous devriez nous expliquer pourquoi vous ne voulez pas de liens dynamiques habituels). Je suggère au moins de lier dynamiquement les bibliothèques système (libc notamment) - si vous voulez absolument, vous pouvez lier statiquement des bibliothèques moins courantes -. Pourquoi voulez-vous lier statiquement votre application? C'est généralement une erreur (car vous ne bénéficiez pas des mises à jour des bibliothèques dynamiques du système). En particulier commutateur de service de nom installations de libc veut des bibliothèques dynamiques.

Votre système doit avoir installé le package fournissant la bibliothèque statique libc. Sur Debian, c’est la libc-dev paquet mais je ne sais pas ce que c'est sur RedHat.

Pour savoir quoi gcc fait, passe le -v drapeau comme

  gcc -v -static -O3 -o prog prog.c

Mais vous ne devriez pas relier statiquement vos programmes. Sur mes distributions Debian, il y a plus de 700 programmes dans /usr/bin et un seul est lié statiquement.

Je me demande ce que le -static  option sur gcc fait.

En ce qui concerne la -static option de GCC fait, lisez la suite Invoquer GCC. C'est un option de liaison lequel:

-static

Sur les systèmes prenant en charge la liaison dynamique, cette option remplace -pie et empêche la liaison avec les bibliothèques partagées. Sur d'autres systèmes, cette   l'option n'a aucun effet.

le -pie  drapeau signifie:

-pie

Produire un exécutable indépendant lié de manière dynamique sur les cibles qui le supportent. Pour des résultats prévisibles, vous devez également spécifier le même ensemble d'options utilisées pour la compilation (-fpie, -fPIE ou modèle sous-options) lorsque vous spécifiez cette option de liaison.

le /usr/bin/ld: cannot find -lc le message est surprenant et pourrait révéler d'autres problèmes (système mal installé ou corrompu, ou manquant libc.a).


-24
2018-01-01 06:59



le -static option lie statiquement un programme, en d'autres termes, il ne nécessite pas de dépendance sur les bibliothèques dynamiques lors de l'exécution pour pouvoir s'exécuter.

Pour obtenir un lien statique, il faut que les versions d'archive (.a) de vos bibliothèques existent sur le système. donc /usr/lib/libc.a /usr/lib/crt1.o etc ...

Sur les systèmes Linux modernes (comme vous utilisez un chapeau rouge): quand un lien binaire ensemble, il 1) soit met le code dans l'exécutable via des fichiers .o et .a, ou 2) met en références aux bibliothèques dynamiques (.so) fichiers qui 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 package glibc-static. Vous pouvez également avoir besoin de libstdc ++ - package statique.


38
2018-01-01 07:02



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

Si vous voulez utiliser -static, vous devez vous assurer que vous avez 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.


6
2018-01-01 06:59