summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/qlibrary.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-09-25 11:01:57 -0700
committerThiago Macieira <thiago.macieira@intel.com>2021-10-11 18:59:52 -0700
commit8e5fcf02bdf3395071b3174777d059faf76a03c6 (patch)
tree09e468d006a4bbb0fbd89e5485043145b42cc0c8 /src/corelib/plugin/qlibrary.cpp
parentc89286b26abd7bad5918359e2f6fe7c5785dc94d (diff)
QPlugin: add qt_plugin_query_metadata_v2() to dynamic plugins
They return a pointer to the actual header, skipping the magic string. This is done in preparation for the header located in an ELF note, which won't have the magic. Change-Id: I3eb1bd30e0124f89a052fffd16a8229bec2ad588 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/plugin/qlibrary.cpp')
-rw-r--r--src/corelib/plugin/qlibrary.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index a8c6644bfd..e18a5080f5 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -682,18 +682,31 @@ static bool qt_get_metadata(QLibraryPrivate *priv, QString *errMsg)
return false;
};
- QFunctionPointer pfn = priv->resolve("qt_plugin_query_metadata");
- if (!pfn)
- return error(QLibrary::tr("entrypoint 'qt_plugin_query_metadata' not found"));
+ QPluginMetaData metaData;
+ QFunctionPointer pfn = priv->resolve("qt_plugin_query_metadata_v2");
+ if (pfn) {
+ metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)();
+#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
+ } else if ((pfn = priv->resolve("qt_plugin_query_metadata"))) {
+ metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)();
+ if (metaData.size < sizeof(QPluginMetaData::MagicHeader))
+ return error(QLibrary::tr("metadata too small"));
+
+ // adjust the meta data to point to the header
+ auto data = reinterpret_cast<const char *>(metaData.data);
+ data += sizeof(QPluginMetaData::MagicString);
+ metaData.data = data;
+ metaData.size -= sizeof(QPluginMetaData::MagicString);
+#endif
+ } else {
+ return error(QLibrary::tr("entrypoint to query the plugin meta data not found"));
+ }
- auto metaData = reinterpret_cast<QPluginMetaData (*)()>(pfn)();
- auto data = reinterpret_cast<const char *>(metaData.data);
- if (metaData.size < sizeof(QPluginMetaData::MagicHeader))
+ if (metaData.size < sizeof(QPluginMetaData::Header))
return error(QLibrary::tr("metadata too small"));
- data += sizeof(QPluginMetaData::MagicString);
- metaData.size -= sizeof(QPluginMetaData::MagicString);
- QJsonDocument doc = qJsonFromRawLibraryMetaData(data, metaData.size, errMsg);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(reinterpret_cast<const char *>(metaData.data),
+ metaData.size, errMsg);
if (doc.isNull())
return false; // error message already set