summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp6
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h2
-rw-r--r--src/corelib/plugin/qlibrary_unix.cpp5
3 files changed, 13 insertions, 0 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 21e4c294c91..31abed73cf9 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -359,6 +359,11 @@ inline void QFactoryLoader::Private::updateSinglePath(const QString &path)
loadedLibraries.resize(libraries.size());
}
+void QFactoryLoader::setLoadHints(QLibrary::LoadHints loadHints)
+{
+ d->loadHints = loadHints;
+}
+
void QFactoryLoader::update()
{
#ifdef QT_SHARED
@@ -549,6 +554,7 @@ inline QObject *QFactoryLoader::instanceHelper_locked(int index) const
if (size_t(index) < d->libraries.size()) {
QLibraryPrivate *library = d->libraries[index].get();
d->loadedLibraries[index] = true;
+ library->setLoadHints(d->loadHints);
return library->pluginInstance();
}
// we know d->libraries.size() <= index <= numeric_limits<decltype(index)>::max() → no overflow
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index c14e5795a8f..d7482b36198 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -48,6 +48,7 @@ public:
#if QT_CONFIG(library)
~QFactoryLoader();
+ void setLoadHints(QLibrary::LoadHints hints);
void update();
static void refreshAll();
@@ -79,6 +80,7 @@ private:
QString suffix;
QString extraSearchPath;
Qt::CaseSensitivity cs;
+ QLibrary::LoadHints loadHints;
void updateSinglePath(const QString &pluginDir);
#endif
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
index e629e2b1f12..f03eba3bffa 100644
--- a/src/corelib/plugin/qlibrary_unix.cpp
+++ b/src/corelib/plugin/qlibrary_unix.cpp
@@ -14,6 +14,11 @@
#ifdef Q_OS_DARWIN
# include <private/qcore_mac_p.h>
+
+// Apple's dyld *does* support RTLD_NODELETE and the library remains loaded in
+// memory after the dlclose() call, but their Objective C crashes when running
+// code from unloaded-but-still-loaded plugins.
+# undef RTLD_NODELETE
#endif
#ifdef Q_OS_ANDROID