Răsfoiți Sursa

For some perverse reason we were not registering destructors
for dlopen'd libraries. This fixes that.
-Erik

Eric Andersen 23 ani în urmă
părinte
comite
d0c48d4a7f
2 a modificat fișierele cu 8 adăugiri și 0 ștergeri
  1. 4 0
      ldso/libdl/dlib.c
  2. 4 0
      ldso/libdl/libdl.c

+ 4 - 0
ldso/libdl/dlib.c

@@ -225,6 +225,10 @@ void *_dlopen(const char *libname, int flag)
 			dl_elf_init = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);
 			(*dl_elf_init) ();
 		}
+		if (tpnt->dynamic_info[DT_FINI]) {
+			atexit((void (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]));
+		}
+
 	}
 
 #ifdef USE_CACHE

+ 4 - 0
ldso/libdl/libdl.c

@@ -225,6 +225,10 @@ void *_dlopen(const char *libname, int flag)
 			dl_elf_init = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);
 			(*dl_elf_init) ();
 		}
+		if (tpnt->dynamic_info[DT_FINI]) {
+			atexit((void (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]));
+		}
+
 	}
 
 #ifdef USE_CACHE