2017-07-10 5 views
1

J'ai les fichiers d'en-tête d'une bibliothèque partagée mais pas la bibliothèque partagée ni son code source.Est-il possible de lier à une bibliothèque partagée sans accès à la bibliothèque elle-même?

Puis-je compiler encore un code à cette bibliothèque?

Sinon, quelle information la bibliothèque partagée contient ce qui est pas dans les en-têtes?

+0

Il est possible dans AIX: lors de la liaison, vous pouvez utiliser un _export-fichier_ au lieu de la bibliothèque réelle. Je ne sais pas si quelque chose comme ça est possible dans GNU/Linux –

Répondre

3

Puis-je compiler encore un code à cette bibliothèque?

Compile: oui. Lien: peut-être.

Vous pouvez créer une bibliothèque fictive à lier. Par exemple. si l'en-tête contient:

int library_func(void*); 

alors:

// dummy_lib.c 
int library_func(void *p) { return 0; } 

gcc -fPIC -shared -o libfoo.so dummy_lib.c 

# Now you can use libfoo.so to link your program. 

Il y a quelques années Gotcha:

  1. La vraie bibliothèque peut avoir SONAME autre chose que libfoo.so (par exemple libfoo.so.2). Il n'y a aucun moyen pour vous de savoir sans avoir accès au vrai .
  2. La bibliothèque réelle peut utiliser des symboles versionnés. Si vous liez votre programme à la bibliothèque fictive, il utilisera la version par défaut de tous les symboles référencés, ce qui est probablement correct maintenant, mais risque de se casser dans le futur (si/quand la vraie bibliothèque est mise à jour avec un nouveau incompatibilité implémentation des symboles que vous appelez).
+0

J'ai trouvé une solution plus simple mais moins robuste: Créer une bibliothèque vide en utilisant clang: 'echo" "| clang ++ -shared -fPIC -x C++ - -o libfoo.so' et dit 'clang/ld' d'ignorer les symboles non résolus lors de la liaison:' -Wl, - unresolved-symbols = ignorer-dans-objets-fichiers'. –

2

Oui. Vous pouvez déclarer des pointeurs sur leurs fonctions, puis appeler dlopen et dlsym, et c'est parti. Cependant, essayer de concocter en quelque sorte un exécutable ou une bibliothèque partagée qui agit comme si vous avez lié à la bibliothèque est risqué; Voir la réponse de l'employé russe pour plus de détails.

Vous aurez besoin de ces bibliothèques pour exécuter le code, bien sûr.

Toutefois, notez que tous les « libs partagées » ne sont que libs partagées. Dans certains cas, un fichier .a est utilisé au moment de la liaison pour fournir du code lié statiquement en plus du .so lors de l'exécution. Ce n'est pas commun.

+0

"L'éditeur de liens ne change rien en fonction du contenu des bibliothèques." - C'est très faux quand on considère les symboles versionnés. –

+0

Je ne pense pas que les symboles versionnés aient des effets curieux de cette forme quand vous allez utiliser dlopen et dlsym. Je vais clarifier. – bmargulies

+0

Les symboles dlsym et versionnés interagissent de manière encore plus confuse (peut-être brisée). https://sourceware.org/bugzilla/show_bug.cgi?id=14932 –