Salut Bernard,
après avoir lu pas mal de documentation et recompilé maintes fois la libgiac, je n'ai toujours pas de réponse !
Je te fais un résumé :
1) je pensais vraiment qu'il fallait une option de compilation spéciale sur mon AMD64 pour que libgiac soit ouvrable par dlopen(). D'après la doc libtoll (
http://www.gnu.org/software/libtool/man ... ed-modules):
If symbols from your executable are needed to satisfy unresolved references in a library you want to dlopen you will have to use the flag -export-dynamic. You should use -export-dynamic while linking the executable that calls dlopen:
burger$ libtool --mode=link gcc -export-dynamic -o helldl main.o
burger$
mais ça ne marche pas mieux. J'ai essayé aussi de faire l'édition des liens directement avec ld + diverses options mais pas mieux.
2) j'ai essayé de voir si c'était mieux en 32bits et j'obtiens le même problème : ma compilation de libgiac ne passe pas dans OOo !
3) j'ai alors essayé de compiler ma librairie en faisant l'édition des liens à partir de libgiac.a en me disant que je n'aurais pas symbole non résolus mias j'obtiens une erreur :
/usr/bin/ld: libgiac.a(ti89.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
libgiac.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
J'ai alors tenté la même manip en 32 bits et ça passe, j'obtiens bien ma librairie CmathOOoCAS.uno.so qui fait 25Mo au lieu de 255Ko mais toujours refusé par dlopen()
4) j'ai essayé sur mon eeepc ubuntu 10.04. J'ai compilé libgiac et mis dans OOo : ça passe ! Je commençais à croire que c'est moi qui portait la poisse !
5) Les 2 Linux sur lesquels ça ne passe pas sont en fait la même machine : un AMD64 (le 32 bits est en virtualbox). Je ne soupçonne plus vraiment un pb libtool puisque tes compils ne tiennent pas compte de cela je suppose mais j'ai vraiement l'impression que c'est ma compil avec l'amd64 qui fait planter. En cherchant sur google, je suis tombé là :
http://www.gentoo.org/proj/en/base/amd6 ... #doc_chap7 sur :
Case 3: Lack of `-fPIC' flag in the software to be built
This is the most common case. It is a real bug in the build system and should be fixed in the ebuild, preferably with a patch that is sent upstream. Assuming the error message looks like this:
Code Listing 6.1: A sample error message
.libs/assert.o: relocation R_X86_64_32 against `a local symbol' can not be used
when making a shared object; recompile with -fPIC .libs/assert.o: could not
read symbols: Bad value
c'est le genre d'erreur que j'obtiens en essayant de compiler à partir de libgiac statique.
J'ai regardé si tout était compilé avec -fPIC et ça l'est , aussi bien dans libgiac que dans ma librairie.
D'ailleurs, j'ai vu que le makefile fourni pour OOo inclu -fPIC pour la version 64 bits alors qu'il n'y est pas
en 32 bits. Cette option semble bien indispensable sur amd64.
Avec quel processeur compiles-tu en 64 bits ?
6) je viens de recompiler avec ./configure --disable-ntl mais à part une plus grosse libgiac, ça ne passe toujours pas dans OOo.
Pour conclure, je ne pense pas que mon problème soit lié au degré de statisticité de libgiac (toutes les dépendances sont satisfaites à chaque fois) mais plutôt à la façon de faire l'édition des liens sur mon amd64. Et dlopen() vérifie tout à l'ouverture visiblement. Peut-être même que la libgiac que je compile fonctionne avec xcas jusqu'au moment ou je ferai appel à une fonction dont le symbole ne sera pas résolu dans ma libgiac....
Au passage, j'ai vu que le symbole non résolu à l'ouverture avec dlopen() (fonction prime_list()) pourrait appartenir à la libpari...
Voilà, je ne sais plus trop quoi tester maintenant, même s'il n'y a pas péril en la demeure.... c'est juste que j'aimerais savoir ce qui se passe. L'important c'est que tes libgiac à toi ne posent aucun problème....
Si tu as une idée, je suis preneur.
A+