la liaison statique seulement quelques bibliothèques
Comment puis-je lier statiquement à seulement quelques bibliothèques spécifiques à mon binaire lors de la liaison avec GCC?
gcc ... -static ...
essaie de lier statiquement tous les librairies, mais je n'ai pas la version statique de certains d'entre eux (par exemple: libX11).
- double possible de Utiliser à la fois statique et dynamique des bibliothèques liées à gcc
Vous devez vous connecter pour publier un commentaire.
gcc -lsome_dynamic_lib code.c some_static_lib.a
code.c
fichier garantit que les symboles seront ignorés, sauf si il arrive à être unemain()
fonction dans l'un des objet de la bibliothèque de fichiers.Vous pouvez également utiliser
ld
option-Bdynamic
Toutes les bibliothèques après (y compris le système de ceux liés par gcc automatiquement) seront liés de façon dynamique.
vous pouvez également utiliser:
-static-libgcc -static-libstdc++
drapeaux pour les bibliothèques gccgardez à l'esprit que si
libs1.so
etlibs1.a
deux existe, l'éditeur de liens picklibs1.so
si c'est avant-Wl,-Bstatic
ou après-Wl,-Bdynamic
. N'oubliez pas de passer-L/libs1-library-location/
avant d'appeler-ls1
.-static
quelque part dans la commande échoue (je suppose qu'il essaie de lier plus les choses de manière statique que seuls les bibliothèques que je veux).-Wl,-Bstatic
et-Wl,-Bdynamic
est important.À partir de la page de manuel de
ld
(cela ne fonctionne pas avec gcc), en se référant à la--static
option:Une solution est de placer votre dynamique des dépendances avant la
--static
option sur la ligne de commande.Une autre possibilité est de ne pas utiliser
--static
, mais au lieu de fournir le nom complet du fichier/chemin de la statique de fichier de l'objet (c'est à dire n'utilisant pas d'option-l) pour la liaison statique dans une bibliothèque spécifique. Exemple:Comme vous pouvez le voir dans l'exemple,
libX11
n'est pas dans la liste des bibliothèques liées de manière dynamique, car il était lié statiquement.Méfiez-vous: Un
.so
fichier est toujours liée de façon dynamique, même lorsqu'il est spécifié avec un nom de fichier ou de chemin.ldd a.out
?ldd
sorties des bibliothèques partagées nécessaires et libX11 n'apparaît pas sur cette liste.Le problème, comme je comprends, c'est comme suit. Vous disposez de plusieurs bibliothèques, statique, dynamique et certains à la fois statique et dynamique. gccs'comportement par défaut est de lien "plutôt dynamique". C'est, gcc des liens vers les bibliothèques dynamiques lorsque c'est possible, mais autrement revient à statiques des bibliothèques. Lorsque vous utilisez le -statique option pour gcc le comportement est à seulement un lien bibliothèques statiques et de sortie avec une erreur si aucune bibliothèque statique peut être trouvé, même si une bibliothèque dynamique.
Une autre option, que j'ai, à plusieurs reprises, a souhaité gcc eu, est ce que j'appelle -essentiellement statiques et est le contraire de -dynamique (valeur par défaut). -essentiellement statiques, si elle existait, préférez un lien à l'encontre des bibliothèques statiques, mais devrait revenir à des bibliothèques dynamiques.
Cette option n'existe pas, mais il peut être émulée avec l'algorithme suivant:
De la construction de la ligne de commande de liaison avec l'extérieur, y compris -statique.
Itérer sur les liens dynamiques options.
Accumuler de la bibliothèque des chemins, c'est à dire ceux des options de la forme -L<lib_dir> dans une variable <lib_path>
Pour chaque lien dynamique option, c'est à dire ceux de la forme -l<lib_name>, exécutez la commande gcc <lib_path> -imprimer-nom de fichier=lib<lib_name>.un et la capture de la sortie.
Si la commande imprime quelque chose d'autre que ce que vous avez passé, il sera le chemin d'accès complet à la bibliothèque statique. Remplacer la bibliothèque dynamique de l'option avec le chemin d'accès complet à la bibliothèque statique.
Rincer et répéter jusqu'à ce que vous avez traité l'ensemble de la ligne de commande de liaison. En option, le script peut également prendre une liste de noms de bibliothèque à exclure de la liaison statique.
Le script bash suivant semble faire l'affaire:
Par exemple:
sur mon système retourne:
ou avec une exclusion:
Je puis obtenir:
Il est également
-l:libstatic1.a
(moins l côlon) variante de l'option-l de gcc qui peut être utilisé pour faire un lien statique de la bibliothèque (Merci à https://stackoverflow.com/a/20728782). Est-il documenté? Pas dans la documentation officielle de gcc (qui n'est pas exact pour shared libs trop): https://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlLes binutils ld doc qu'il décrit. Le
-lname
option de recherche pourlibname.so
alors pourlibname.a
ajoutant lib préfixe et.so
(si activé pour le moment) ou.a
suffixe. Mais-l:name
option ne pourra rechercher exactement pour le nom spécifié:https://sourceware.org/binutils/docs/ld/Options.html
La variante
-l:namespec
est documentée depuis 2.18 version de binutils (2007): https://sourceware.org/binutils/docs-2.18/ld/Options.htmlCertains chargeurs (linkers) fournir des commutateurs pour le tournage de chargement dynamique sur et en dehors. Si GCC est en cours d'exécution sur un système (Solaris - et probablement d'autres), vous pouvez utiliser l'option correspondante.
Si vous connaissez des bibliothèques que vous souhaitez lier statiquement, vous pouvez simplement spécifier la bibliothèque statique fichier dans la ligne de liaison par chemin d'accès complet.
de lien dynamique et statique de la bibliothèque dans une ligne, vous devez mettre bibliothèques statiques après dynamique bibliothèques et les fichiers d'objet, comme ceci:
gcc -lssl main.o -lFooLib -o main
sinon, cela ne fonctionnera pas. il ne me prenez quand même le temps de le comprendre.