@@ -715,52 +715,35 @@ bool load_modules_only() {
715715 for (size_t i = 0 ; i < ms.modules_count ; i++) {
716716 char *lib_path = ms.modules [i];
717717
718- void *handle = dlopen (lib_path, RTLD_NOW);
719- if (!handle) {
720- LOGE (" Failed to load module [%s]: %s" , lib_path, dlerror ());
718+ if (!csoloader_load (&zygisk_modules[zygisk_module_length].lib , lib_path)) {
719+ LOGE (" Failed to load module [%s]" , lib_path);
721720
722721 continue ;
723722 }
724723
725- void *entry = dlsym (handle , " zygisk_module_entry" );
724+ void *entry = csoloader_get_symbol (&zygisk_modules[zygisk_module_length]. lib , " zygisk_module_entry" );
726725 if (!entry) {
727- LOGE (" Failed to find entry point in module [%s]: %s " , lib_path, dlerror () );
726+ LOGE (" Failed to find entry point in module [%s]" , lib_path);
728727
729- dlclose (handle );
728+ csoloader_unload (&zygisk_modules[zygisk_module_length]. lib );
730729
731730 continue ;
732731 }
733732
734733 zygisk_modules[zygisk_module_length].api .register_module = rezygisk_module_register;
735734 zygisk_modules[zygisk_module_length].api .impl = (void *)zygisk_module_length;
736735
737- zygisk_modules[zygisk_module_length].handle = handle;
738736 zygisk_modules[zygisk_module_length].zygisk_module_entry = (void (*)(void *, void *))entry;
739737
740- zygisk_modules[zygisk_module_length].base = solist_get_base (entry);
741- zygisk_modules[zygisk_module_length].size = solist_get_size (entry);
742-
743- zygisk_modules[zygisk_module_length].deconstructors = solist_get_deconstructors (entry);
744-
745- LOGD (" Loaded module [%s]. Entry: %p, Base: %p, Size: %zu, Deconstructors: fini_func=%p, fini_array=%p (size: %zu)" ,
738+ LOGD (" Loaded module [%s]. Entry: %p" ,
746739 lib_path,
747- entry,
748- zygisk_modules[zygisk_module_length].base ,
749- zygisk_modules[zygisk_module_length].size ,
750- zygisk_modules[zygisk_module_length].deconstructors .fini_func ,
751- zygisk_modules[zygisk_module_length].deconstructors .fini_array ,
752- zygisk_modules[zygisk_module_length].deconstructors .fini_array_size );
740+ entry);
753741
754742 zygisk_modules[zygisk_module_length].unload = false ;
755743
756- /* INFO: Early removal to avoid gaps in solist */
757- solist_drop_so_path (entry, false );
758-
759744 zygisk_module_length++;
760745 }
761746
762- solist_reset_counters (zygisk_module_length, zygisk_module_length);
763-
764747 free_modules (&ms);
765748
766749 return true ;
@@ -786,25 +769,10 @@ void ZygiskContext::run_modules_post() {
786769 if (flags[APP_SPECIALIZE]) rezygisk_module_call_post_app_specialize (m, args.app );
787770 else if (flags[SERVER_FORK_AND_SPECIALIZE]) rezygisk_module_call_post_server_specialize (m, args.server );
788771
789- /* INFO: If module is unloaded by dlclose, there's no need to
790- hide it from soinfo manually. */
791772 if (!m->unload ) continue ;
792773
793- /* INFO: Deconstructors are called in the inverted order, and following fini array then fini
794- function order. It must not change. */
795- for (size_t j = m->deconstructors .fini_array_size ; j > 0 ; j--) {
796- void (*destructor)(void ) = m->deconstructors .fini_array [j - 1 ];
797- if (destructor) {
798- LOGD (" Calling destructor %p for module %p" , (void *)destructor, (void *)m->zygisk_module_entry );
799-
800- destructor ();
801- }
802- }
803-
804- if (m->deconstructors .fini_func ) m->deconstructors .fini_func ();
805-
806- if (munmap (m->base , m->size ) == -1 ) {
807- PLOGE (" Failed to unmap module library at %p with size %zu" , m->base , m->size );
774+ if (csoloader_unload (&m->lib ) == false ) {
775+ LOGE (" Failed to unload module library" );
808776
809777 continue ;
810778 }
0 commit comments