diff options
author | Arvid Ephraim Picciani <arvid.picciani@nokia.com> | 2010-09-01 09:30:20 (GMT) |
---|---|---|
committer | Arvid Ephraim Picciani <arvid.picciani@nokia.com> | 2010-09-01 11:16:23 (GMT) |
commit | b80e006058d3b73db8a583981e471c334f0e6b93 (patch) | |
tree | c10c0ce37394f9f99da88c33285ecf62599b9922 /src/corelib/plugin/qlibrary.cpp | |
parent | f6e8ff07243b693dfc45bdeb4882e4f52f90930a (diff) | |
download | Qt-b80e006058d3b73db8a583981e471c334f0e6b93.zip Qt-b80e006058d3b73db8a583981e471c334f0e6b93.tar.gz Qt-b80e006058d3b73db8a583981e471c334f0e6b93.tar.bz2 |
Optimize plugin loading on ELF platforms
This is equal to 3c2a43f91e0225bde8d6e6d6076dfe2cddbc2f8e
except the alignment checks have been relaxed.
Reviewed-by: janarve
Diffstat (limited to 'src/corelib/plugin/qlibrary.cpp')
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 1ca9d70..8f82cc4 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -38,7 +38,6 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - #include "qplatformdefs.h" #include "qlibrary.h" @@ -61,6 +60,7 @@ #include <qdebug.h> #include <qvector.h> #include <qdir.h> +#include "qelfparser_p.h" QT_BEGIN_NAMESPACE @@ -365,11 +365,31 @@ static bool qt_unix_query(const QString &library, uint *version, bool *debug, QB fdlen = data.size(); } - // verify that the pattern is present in the plugin + /* + ELF binaries on GNU, have .qplugin sections. + */ + long pos = 0; const char pattern[] = "pattern=QT_PLUGIN_VERIFICATION_DATA"; const ulong plen = qstrlen(pattern); - long pos = qt_find_pattern(filedata, fdlen, pattern, plen); - +#if defined (Q_OF_ELF) && defined(Q_CC_GNU) + int r = QElfParser().parse(filedata, fdlen, library, lib, &pos, &fdlen); + if (r == QElfParser::NoQtSection) { + if (pos > 0) { + // find inside .rodata + long rel = qt_find_pattern(filedata + pos, fdlen, pattern, plen); + if (rel < 0) { + pos = -1; + } else { + pos += rel; + } + } else { + pos = qt_find_pattern(filedata, fdlen, pattern, plen); + } + } else if (r != QElfParser::Ok) + return false; +#else + pos = qt_find_pattern(filedata, fdlen, pattern, plen); +#endif // defined(Q_OF_ELF) && defined(Q_CC_GNU) bool ret = false; if (pos >= 0) ret = qt_parse_pattern(filedata + pos, version, debug, key); |