Comment partager une bibliothèque entre deux programmes en c

Je souhaite utiliser les mêmes fonctions de bibliothèque (bibliothèque OpenSSL) dans deux programmes différents en C pour le calcul. Comment puis-je m’assurer que les deux programmes utilisent une bibliothèque commune, cela signifie qu’une seule copie de la bibliothèque est chargée dans la mémoire principale partagée et que les deux programmes accèdent à la bibliothèque à partir de cet emplacement de mémoire pour le calcul?

Par exemple, lorsque le premier programme accède à la bibliothèque pour le calcul, il est chargé dans la mémoire cache de la mémoire principale et lorsque le second programme souhaite y accéder plus tard, il accède aux données de la mémoire cache (déjà chargées par le premier programme), et non de la mémoire principale. .

J’utilise GCC sous Linux. Toute explication ou pointeur sera très apprécié.

Le code est partagé par le système d’exploitation, non seulement par les bibliothèques partagées, mais également par les exécutables du même binary – vous n’avez rien à faire pour disposer de cette fonctionnalité. Cela fait partie de la gestion de la mémoire du système.

Les données ne seront pas partagées entre les deux processus. Vous auriez besoin de threads dans un processus pour partager des données. Mais à moins que vous ne le vouliez, assurez-vous que les deux programmes utilisent exactement le même fichier de bibliothèque partagée (fichier .so). Normalement, vous n’aurez pas à y penser. cela peut n’être important que si deux programmes utilisent des versions différentes d’une bibliothèque (ils ne seraient pas partagés bien sûr)

Examinez le résultat de ldd /path/to/binary pour voir quelles bibliothèques partagées sont utilisées par un binary.

Lire le document de Drepper Comment écrire des bibliothèques partagées et un guide de bibliothèque de programmes

Pour en créer un, comstackz votre code en tant que code indépendant de la position , par exemple

  gcc -c -fPIC -O -Wall src1.c -o src1.pic.o gcc -c -fPIC -O -Wall src2.c -o src2.pic.o 

puis reliez-le à un object partagé

  gcc -shared src1.pic.o src2.pic.o -lsome -o libfoo.so 

vous pouvez relier une bibliothèque partagée -lsome à une autre libfoo.so

En interne, l’éditeur de liens dynamic ld-linux.so (8) utilise mmap (2) (et effectuera des déplacements au moment du lien dynamic) et c’est l’ inode qui compte. Le kernel utilisera le cache du système de fichiers pour éviter de lire deux fois une bibliothèque partagée utilisée par différents processus. Voir aussi linuxatemyram.com

Utilisez par exemple ldd (1) , pmap (1) et proc (5) . Voir aussi dlopen (3) . Essayer

 cat /proc/self/maps 

comprendre l’ espace d’adressage de la mémoire virtuelle utilisée par le processus exécutant cette commande cat ; Une bibliothèque partagée ELF ne partage pas tout le matériel entre les processus, seulement certains segments, y compris le segment de texte …