Bonjour,

Je cherche à comparer plusieurs implémentations d'une même fonction int keypair(unsigned char *, unsigned char *).
L'idée est donc pour chaque implémentation de la compiler dans une bibliothèque, puis de faire un programme qui
- charge une bibliothèque;
- chronomètre l'éxécution de la fonction
- ferme la bibliothèque;
- charge une nouvelle bibliothèque.

Pour commencer, j'essaie de créer une première bibliothèque contenant la première implémentation de la fonction keypair.

J'effectue les actions suivantes avec un bash dans le répertoire contenant la première implémentation étudiée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
gcc -fPIC -c *.c
gcc -shared -Wl,-soname,kem.so.1 -o kem.so.1.0 *.o
ln -s kem.so.1.0 kem.so.1
ln -s kem.so.1 kem.so
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
(j'ai trouvé l'inspiration ici http://www.linux-france.org/article/memo/node113.html)

Je cherche ensuite à intégrer à la volée une bibliothèque dans un programme.

Le code pour charger la bibliothèque :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
int main()
{
        int (*keypair) (unsigned char *, unsigned char *);
        void * dlobj;
        unsigned char pk[PUBLICKEYBYTES], sk[SECRETKEYBYTES];
 
        void * dlobj = dlopen("le path/kem.so.1.0", RTLD_LAZY);
        keypair = dlsym(dlobj,"keypair");
        keypair(pk, sk);
 
        return 0;
}
Je compile le programme ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
gcc -ldl -o test test.c
J'ai alors l'erreur suivante :
./test: symbol lookup error: PATH/kem.so.1.0: undefined symbol: EVP_CIPHER_CTX_new

Mon problème, c'est que EVP_CIPHER_CTX_new est une fonction d'openssl appelée par keypair.
Comme j'ai déjà un #include <openssl/evp.h> dans les fichiers .c compilés lors de la création de kem.so, cette erreur me surprend un peu.

Elle me montre que les #include n'ont pas été respectés lors de la création de ma bibliothèque.
Je suppose donc que l'erreur est dans le code bash au début, mais je n'arrive pas à la trouver. L'autre possibilité est que l'erreur vienne de la fonction keypair, mais la probabilité est moindre.

Une petite précision, comme il s'agit d'une bibliothèque, il n'y a pas de main parmi les fonctions compilées.