From: Tobias Brunner Date: Mon, 13 Jan 2025 16:09:15 +0000 (+0100) Subject: plugin-loader: Properly support compilation without dlopen()/dlsym() etc. X-Git-Tag: android-2.5.3~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d860c26e953330879b373184e032e7f5c6e5463f;p=thirdparty%2Fstrongswan.git plugin-loader: Properly support compilation without dlopen()/dlsym() etc. This only works if plugins are built monolithically and linked statically. Closes strongswan/strongswan#2615 --- diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c index 30b1aeed08..786b183328 100644 --- a/src/libstrongswan/plugins/plugin_loader.c +++ b/src/libstrongswan/plugins/plugin_loader.c @@ -191,10 +191,12 @@ struct plugin_entry_t { */ bool critical; +#ifdef HAVE_DLADDR /** * dlopen handle, if in separate lib */ void *handle; +#endif /** * List of features, as provided_feature_t @@ -208,10 +210,12 @@ struct plugin_entry_t { static void plugin_entry_destroy(plugin_entry_t *entry) { DESTROY_IF(entry->plugin); +#ifdef HAVE_DLADDR if (entry->handle) { dlclose(entry->handle); } +#endif entry->features->destroy(entry->features); free(entry); } @@ -369,11 +373,14 @@ static status_t create_plugin(private_plugin_loader_t *this, void *handle, { constructor = plugin_constructors->get(plugin_constructors, name); } +#elif defined(HAVE_DLADDR) if (!constructor) -#endif { constructor = dlsym(handle, create); } +#else + #error Neither dynamic linking nor static plugin constructors are supported! +#endif if (!constructor) { return NOT_FOUND; @@ -412,8 +419,12 @@ static plugin_entry_t *load_plugin(private_plugin_loader_t *this, char *name, { char create[128]; plugin_entry_t *entry; - void *handle; + void *handle = NULL; + +#ifdef HAVE_DLADDR int flag = RTLD_LAZY; + handle = RTLD_DEFAULT; +#endif if (snprintf(create, sizeof(create), "%s_plugin_create", name) >= sizeof(create)) @@ -421,7 +432,7 @@ static plugin_entry_t *load_plugin(private_plugin_loader_t *this, char *name, return NULL; } translate(create, "-", "_"); - switch (create_plugin(this, RTLD_DEFAULT, name, create, FALSE, critical, + switch (create_plugin(this, handle, name, create, FALSE, critical, &entry)) { case SUCCESS: @@ -447,6 +458,7 @@ static plugin_entry_t *load_plugin(private_plugin_loader_t *this, char *name, return NULL; } } +#ifdef HAVE_DLADDR if (lib->settings->get_bool(lib->settings, "%s.dlopen_use_rtld_now", FALSE, lib->ns)) { @@ -480,6 +492,9 @@ static plugin_entry_t *load_plugin(private_plugin_loader_t *this, char *name, entry->handle = handle; this->plugins->insert_last(this->plugins, entry); return entry; +#else + return NULL; +#endif } CALLBACK(feature_filter, bool, @@ -1347,10 +1362,12 @@ METHOD(plugin_loader_t, unload, void, unload_features(this); while (this->plugins->remove_last(this->plugins, (void**)&entry) == SUCCESS) { +#ifdef HAVE_DLADDR if (lib->leak_detective) { /* keep handle to report leaks properly */ entry->handle = NULL; } +#endif unregister_features(this, entry); plugin_entry_destroy(entry); } @@ -1474,9 +1491,12 @@ plugin_loader_t *plugin_loader_create() .features = hashlist_create( (hashtable_hash_t)registered_feature_hash, (hashtable_equals_t)registered_feature_equals, 64), - .get_features = dlsym(RTLD_DEFAULT, "plugin_loader_feature_filter"), ); +#ifdef HAVE_DLADDR + this->get_features = dlsym(RTLD_DEFAULT, "plugin_loader_feature_filter"); +#endif + if (!this->get_features) { this->get_features = get_features_default;