web-dev-qa-db-fra.com

Lien statique de la fonction de bibliothèque partagée dans gcc

Comment lier une fonction de bibliothèque partagée de manière statique dans gcc?

124
suresh

Faire référence à:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Vous avez besoin d'une version statique de la bibliothèque pour créer un lien.

Une bibliothèque partagée est en réalité un exécutable dans un format spécial avec des points d’entrée spécifiés (et quelques problèmes d’adressage persistants inclus). Il ne dispose pas de toutes les informations nécessaires pour établir un lien statique.

Vous ne pouvez pas lier statiquement une bibliothèque partagée (ni dynamiquement statique)

Indicateur-statique forcera l'éditeur de liens à utiliser la bibliothèque statique (.a) au lieu de partagé (.so) Mais. Les bibliothèques statiques ne sont pas toujours installées par défaut. Donc, si vous avez besoin d'un lien statique, vous devez installer des bibliothèques statiques.

Une autre approche possible consiste à utiliser un statifiant ou Ermine . Les deux outils prennent en entrée un fichier exécutable lié dynamiquement et en sortie créent un fichier exécutable autonome avec toutes les bibliothèques partagées incorporées.

98
Sam Liao

Si vous voulez créer un lien, par exemple, libapplejuice de manière statique, mais pas, par exemple, liborangejuice, vous pouvez créer un lien comme ceci:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Il y a une mise en garde: si liborangejuice utilise libapplejuice, alors libapplejuice sera également lié dynamiquement.

Vous devrez lier liborangejuice de manière statique avec libapplejuice pour obtenir libapplejuice statique.

Et n'oubliez pas de garder -Wl,-Bdynamic sinon vous lierez tout ce qui est statique, y compris libc (ce qui n’est pas une bonne chose à faire).

73
Eugene Bujak

Si vous avez le fichier .a de votre bibliothèque partagée (.so), vous pouvez simplement l'inclure avec son chemin complet, comme s'il s'agissait d'un fichier objet, comme ceci:

Ceci génère main.o en compilant simplement:

gcc -c main.c

Ceci lie ce fichier objet à la bibliothèque statique correspondante et crée le fichier exécutable (nommé "main"):

gcc main.o mylibrary.a -o main

Ou en une seule commande:

gcc main.c mylibrary.a -o main

Ce pourrait également être un chemin absolu ou relatif:

gcc main.c /usr/local/mylibs/mylibrary.a -o main
18
NeoEGM

Oui, je sais que c'est une question vieille de 8 ans, mais on m'a dit qu'il était possible d'établir un lien statique avec une bibliothèque à objets partagés et que c'était littéralement le coup le plus populaire lorsque j'ai cherché plus d'informations à ce sujet.

Pour démontrer réellement que lier statiquement une bibliothèque d'objets partagés n'est pas possible avec ld (le lieur de gcc] - par opposition à un groupe de personnes insistant sur le fait que ce n'est pas possible - utilisez la commande suivante gcc commande:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Bien sûr, vous devrez compiler objectname.o de sourcename.c, et vous devriez probablement créer également votre propre bibliothèque d'objets partagés. Si vous le faites, utilisez -Wl,--library-path,. afin que ld puisse trouver votre bibliothèque dans le répertoire local.)

L'erreur réelle que vous recevez est la suivante:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

J'espère que ça t'as aidé.

7
Ian Moote

Un peu tard mais ... j'ai trouvé un lien que j'avais sauvegardé il y a quelques années et j'ai pensé qu'il pourrait vous être utile:

CDE: Créer automatiquement des applications Linux portables

http://www.pgbovine.net/cde.html

  • Il suffit de télécharger le programme
  • Exécutez le binaire en passant en argument le nom du binaire que vous voulez rendre portable, par exemple: nmap

    ./cde_2011-08-15_64bit nmap

Le programme lira toutes les bibliothèques liées à nmap et ses dépendances et les enregistrera toutes dans un dossier appelé cde-package/ (dans le même répertoire). répertoire que vous êtes).

  • Enfin, vous pouvez compresser le dossier et déployer le fichier binaire portable dans n’importe quel système.

N'oubliez pas que pour lancer le programme portable, vous devez exécuter le fichier binaire situé dans cde-package/nmap.cde

Meilleures salutations

7
Francis

En gcc, ceci n'est pas supporté. En fait, ceci n'est pas supporté par les compilateurs/lieurs existants dont je suis au courant.

0
nothrow