Compilation avec -static-libgcc -statique-libstdc++ encore les résultats dans la dynamique de la dépendance de la libc.donc
Je suis en train de faire un exécutable qui est aussi portable que possible. Après la suppression d'un peu de dépendances, je suis tombé sur les éléments suivants lors de l'exécution du binaire sur un autre système:
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)
Je préfère mon binaire de ne pas obliger l'utilisateur à mettre à niveau leur version de libc, donc je voudrais supprimer cette dépendance.
L'éditeur de liens indicateurs de produit ci-dessus binaire déjà inclus -static-libgcc -static-libstdc++
. Comment se fait le binaire nécessite encore sur le partage des de la libc..6?
J'ai essayé d'ajouter le -static
drapeau, cependant lorsque j'essaie d'exécuter que binaire le résultat est très étrange:
$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory
Que faire?
EDIT:
$ file foob
foob: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ exited with 1 +++
Intéressant, si je ldd
la version sans -static
, il a deux moins entrées que la version avec -static
, à savoir:
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)
Comme l'a suggéré, exécutez
file foob
. Assurez-vous que c'est un 64-bit exécutable.J'ai juste compilé une simplish programme avec le -statique drapeau: "gcc-o ts --std=c99 --essai statique.c". Fonctionne très bien.
exécuter
strace -f ./foob
afin que nous puissions voir ce que le "No such file or directory".Je n'ai jamais eu un problème avec
-static
sur plusieurs systèmes linux. J'ai peut-être eu à installer des bibliothèques statiques, mais qu'il a été.OriginalL'auteur Claudiu | 2014-10-10
Vous devez vous connecter pour publier un commentaire.
GNU libc n'est pas conçu pour être lié statiquement. Les fonctions importantes, par exemple
gethostbyname
eticonv
, ne fonctionnera pas correctement ou ne pas fonctionner du tout dans un binaire statique. Sans doute encore pire, sous certaines conditions, un binaire statique sera tentative dynamique d'ouvrir et d'utiliser leslibc.so.6
, même si le point de l'ensemble d'une liaison statique est pour éviter de telles dépendances.Vous devez compiler votre programme contre uClibc ou musl libc à la place.
(Cela a été vrai pendant au moins 15 ans.)
Cela dépend de quelles fonctions de la bibliothèque C sont utilisés par la bibliothèque partagée en question. Je ne peux pas vous donner plus spécifiques à répondre sans en savoir beaucoup plus sur ce que votre bibliothèque partagée, ce qu'il a besoin de la bibliothèque C, et pourquoi vous voulez le faire, plutôt, quelque chose d'étrange dans la première place.
J'ai juste essayé la commande suivante dont le message d'avertissement confirmé que: gcc-4.8 --statique ... netcat.c avertissement: l'Utilisation de 'gethostbyaddr" en lien statique des applications nécessite au runtime des bibliothèques partagées à partir de la version de la glibc utilisées pour les liens
OriginalL'auteur zwol
D'abord être conscient que la liaison statique de la libc ne pourrait pas améliorer la portabilité de votre programme, comme la libc peut dépendre d'autres parties de votre système, par exemple la version du noyau.
Si vous voulez essayez de compléter la liaison statique en utilisant simplement -statique doit le truc. À condition qu'il existe des versions statiques de toutes les bibliothèques utilisées installé.
Vous pouvez vérifier si votre programme n'a lié les bibliothèques statiques à l'aide de:
EDIT:
D'une autre manière qui fournit de l'information utile pour le débogage de ce problème serait d'ajouter l'option --verbose pour votre linker drapeaux.
-static
Bien que la dernière erreur est vraiment étrange. -statique fait exactement ce qu'il veut faire. Et -static-libgcc -statique-libstdc++ peuvent être laissés de côté, mais cela ne devrait pas changer quoi que ce soit.
La liaison statique est bien connu pour ne pas être complètement réalisable sur un moderne typique de bureau linux.
Seulement si vous utilisez la glibc!
Sûr, mais qu'est ce que l'affiche est à l'aide. Et ce else auriez-vous une utilisation sur un poste de travail moderne linux?
OriginalL'auteur crash