Chargement dynamic de bibliothèques partagées Linux?

Je souhaite créer une bibliothèque partagée pouvant être chargée de deux manières différentes dans les cibles:

  1. LD_PRELOAD
  2. Chargement dynamic via dlsym

Ma bibliothèque partagée ressemble à ceci:

 #include "stdio.h" void __atsortingbute__ ((constructor)) my_load(void); void my_load(void) { printf("asdf"); } void someFunc(void) { printf("someFunc called"); } 

Je le comstack comme ça:

 all: gcc -fPIC -g -c -Wall MyLib.c gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc 

Je ne souhaite pas l’installer avec ldconfig , etc. Le processus cible ressemble à ceci:

 #include  #include  void func1() { printf("%d\n", 1); } void func2() { printf("%d\n", 2); } void func3() { printf("%d\n", 3); } int main() { void* lib_handle = dlopen("/home/mike/Desktop/TargetProcess/MyLib.so.1.0.1", RTLD_NOW|RTLD_GLOBAL); if(lib_handle == NULL) { printf("Failed loading lib\n"); } else { printf("Loaded lib successfully\n"); void (*some_func)() = dlsym(lib_handle, "someFunc"); printf("%p\n", some_func); dlclose(lib_handle); } func1(); func2(); func3(); return 0; } 

La cible est compilée en tant que telle:

 all: gcc TestProg.c -ldl -o TestProg 

Mes questions sont:

  1. Avec le chargement dynamic avec dlopen comme ci-dessus, pourquoi my_load ne semble-t- my_load pas être appelé?
  2. Avec la même méthode, pourquoi dlsym retourne-t- dlsym toujours nil même si dlopen renvoie non-null? De même, nm ne répertorie pas my_load ou someFunc comme symboles du .so.
  3. Est-il possible d’utiliser LD_PRELOAD pour charger la bibliothèque? J’ai essayé de copier le .so dans le même répertoire que la cible, puis LD_PRELOAD="./MyLib.so.1.0.1" ./TestProg mais à nouveau, my_load ne semble pas être appelé.

Vos fichiers d’object n’étaient pas liés à votre bibliothèque:

 gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc 

Changez-le pour inclure votre fichier d’object MyLib.o:

 gcc MyLib.o -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc 

UPDATE: vous avez juste essayé votre commande localement (sans MyLib.c ou MyLib.o):

 $ gcc -shared -W1,-soname,MyLib.so.1 -o MyLib.so.1.0.1 -lc && echo ok ok $ nm MyLib.so.1.0.1 xxxxxxxx a _DYNAMIC xxxxxxxx a _GLOBAL_OFFSET_TABLE_ w _Jv_RegisterClasses xxxxxxxx A __bss_start w __cxa_finalize@@xxxxxxxxxxx xxxxxxxx d __dso_handle w __gmon_start__ xxxxxxxx t __i686.get_pc_thunk.bx xxxxxxxx A _edata xxxxxxxx A _end xxxxxxxx T _fini xxxxxxxx T _init 

C’est une bibliothèque dynamic vide .