Comment lier une fonction de bibliothèque partagée de manière statique dans gcc?
Faire référence à:
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.
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).
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
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é.
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
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).
N'oubliez pas que pour lancer le programme portable, vous devez exécuter le fichier binaire situé dans cde-package/nmap.cde
Meilleures salutations
En gcc, ceci n'est pas supporté. En fait, ceci n'est pas supporté par les compilateurs/lieurs existants dont je suis au courant.