Création d’une bibliothèque partagée à partir d’une bibliothèque statique à l’aide de la chaîne d’outils GNU (gcc / ld)

J’ai du mal à générer un object partagé à partir d’une bibliothèque statique. Bien que je sache qu’il existe d’autres alternatives, je suis maintenant dérangé (par opposition à coincé) par la raison pour laquelle cela ne fonctionne pas et comment le faire fonctionner.

Voici le code source très simple que j’utilise.

get_zero.c

#include "get_zero.h" int get_zero(void) { return 0; } 

get_zero.h

 int get_zero(void); 

principal c

 #include  #include  #include "get_zero.h" int main(void) { return get_zero(); } 

Le but est de créer deux applications fonctionnellement égales en utilisant libget_zero_static et libget_zero_shared.

Voici mes étapes de compilation / liaison:

 gcc -c -fPIC get_zero.c ar cr libget_zero_static.a get_zero.o gcc -shared -o libget_zero_shared.so -L. -Wl,--whole-archive -lget_zero_static -Wl,-no--whole-archive 

Et c’est l’erreur que j’ai:

 /usr/bin/ld: cannot find -lgcc_s /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): relocation R_X86_64_32 against `_dl_starting_up' can not be used when making a shared object; recomstack with -fPIC /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): could not read symbols: Bad value collect2: ld returned 1 exit status 

Ceci est sur un système Ubuntu 64 bits.

J’ai lu à propos de l’option d’archivage complet ici, et il semblait que ces questions auraient dû supprimer tous mes barrages routiers. Comment créer un fichier object partagé à partir d’une bibliothèque statique .

Il semble que vous ayez besoin de spécifier l’archive en tant qu’argument, pas en tant que bibliothèque. Donc, faites que libget_zero_static.a au lieu de -lget_zero_static . Au moins ça marche pour moi de cette façon:

 gcc -shared -o libget_zero_shared.so \ -Wl,--whole-archive \ libget_zero_static.a \ -Wl,--no-whole-archive 

Vous pouvez simplement essayer une autre manière: lier deux fois, une fois pour la librairie statique et l’autre pour la lib du partage. Cela devrait être plus facile et plus commun.