[gull] changer LD_LIBRARY_PATH en cours d'execution

Vuko Brigljevic Vuko.Brigljevic at cern.ch
Wed Oct 22 17:58:02 CEST 2003


Bonjour,

En bref: peut-on modifier le path de recherche
de shared libraries utilise par dlopen en cours
d'execution d'un programme?

J'aimerais changer la variable LD_LIBRARY_PATH 
(definit ou chercher des shared libraries) en
cours d'execution, mais on dirait que ce n'est pas
possible:

Le petit programme suivant openlib.c (voir le code
a la fin) essaie de charger une shared library avec
dlopen. La librairie en question est dans lib/myfunc.so
(code myfunc.c egalement a la fin).

Le programme tourne parfaitement si on definit la
variable LD_LIBRARY_PATH avant de demarrer:

$ export LD_LIBRARY_PATH=lib/
$ ./open
lib path before seeting it: [lib/]
set lib path: [lib/]
10.000000

Par contre si cet environnement n'est pas defini,
la librairie n'est pas trouvee:

unset LD_LIBRARY_PATH
[vuko at trinity shared]$ ./open
lib path before seeting it: [(null)]
set lib path: [lib/]
libmyfunc.so: cannot open shared object file: No such file or directory

et ce malgre le fait que je definisse la variable 
d'environnement LD_LIBRARY_PATH en cours d'execution
avec setenv() avant d'appeler dlopen.

Y a-t-il donc un autre moyen de changer en cours d'execution
le path de recherche de dlopen??? Il est possible qu'il existe
une bonne raison pour laquelle ca ne devrait pas etre possible.
Dans ce cas peut-etre quelqu'un pourrait eclaire ma chandelle...

Merci pour toute aide!


Vuko


/* openlib.c  */
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
  void *handle;
  float (*fun)(float);
  char *error;


  printf ("lib path before seeting it: [%s]
\n",getenv("LD_LIBRARY_PATH"));
  setenv("LD_LIBRARY_PATH","lib/",1);
  printf ("set lib path: [%s] \n",getenv("LD_LIBRARY_PATH"));

  handle = dlopen ("libmyfunc.so", RTLD_LAZY);
  printf ("opened it \n");
  if (!handle) {
    fputs (dlerror(), stderr);
    exit(1);
  }
  
  fun = dlsym(handle, "calcFun1"); 
  if ((error = dlerror()) != NULL)  {
    fputs(error, stderr); 
    exit(1); 
  } 


  printf ("%f\n", (*fun)(2.0));
  dlclose(handle);
}




/*  myfunc.c   */

float calcFun1(float x) {

  return 2*x;

}


Pour compiler la librairie et le programme:

gcc -fPIC -g -c -Wall myfunc.c
gcc -shared -Wl,-soname,libmyfunc.so -o libmyfunc.so myfunc.o
mv myfunc.so lib/
gcc -o open open.c -ldl



More information about the gull mailing list