diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2015-06-02 11:10:22 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2015-09-13 18:54:17 +0000 |
commit | 72ba0079c3967bdfa26acdce78ce6cb98b30c27b (patch) | |
tree | 82640d9ff8a9d733276041a2ddd57483ef0d23b6 /mkspecs | |
parent | 181c8d80d19f975ccf943fa79107f1e839e33e68 (diff) |
Add a linker version script to Qt libraries
This linker script is only enabled for systems with GCC or GCC-like
compilers, though technically it should work on the BSDs too (will
enable after testing). For regular modules, this declares one ELF
version "Qt_5" and places all QtCore symbols inside, then it declares
unused ELF versions "Qt_5.x" for each older minor release. For modules
declared "internal_module", all symbols are placed in version
Qt_5_PRIVATE_API.
The big advantage of an ELF version is that, when we do Qt 6, both
versions of QtCore could be loaded in memory without conflicts and all
symbols would be resolved to the correct library. No module can talk to
both at the same time, but this avoids mistakes of loading them
indirectly by plugins.
The extra Qt_5.x versions will be used in the next commit.
Change-Id: I049a653beeb5454c9539ffff13e3fe6f050fdf31
Reviewed-by: Lisandro Damián Nicanor Pérez Meyer <perezmeyer@gmail.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'mkspecs')
-rw-r--r-- | mkspecs/common/gcc-base-unix.conf | 1 | ||||
-rw-r--r-- | mkspecs/common/qcc-base-qnx.conf | 1 | ||||
-rw-r--r-- | mkspecs/features/qt_module.prf | 22 | ||||
-rw-r--r-- | mkspecs/linux-icc/qmake.conf | 1 | ||||
-rw-r--r-- | mkspecs/unsupported/linux-host-g++/qmake.conf | 1 |
5 files changed, 26 insertions, 0 deletions
diff --git a/mkspecs/common/gcc-base-unix.conf b/mkspecs/common/gcc-base-unix.conf index f82c8a8430..0178bda75a 100644 --- a/mkspecs/common/gcc-base-unix.conf +++ b/mkspecs/common/gcc-base-unix.conf @@ -22,3 +22,4 @@ QMAKE_LFLAGS_USE_GOLD = -fuse-ld=gold # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, +QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script, diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf index f7da151a41..dbbf346ea2 100644 --- a/mkspecs/common/qcc-base-qnx.conf +++ b/mkspecs/common/qcc-base-qnx.conf @@ -19,6 +19,7 @@ QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link, # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, +QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script, # Generic options for all BlackBerry/QNX qcc mkspecs QMAKE_CFLAGS_THREAD = -D_REENTRANT diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index c89b6d2793..5206691a17 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -185,6 +185,28 @@ equals(QT_ARCH, i386):contains(QT_CPU_FEATURES.$$QT_ARCH, sse2):compiler_support QMAKE_CXXFLAGS += -mfpmath=sse } +unix:!isEmpty(QMAKE_LFLAGS_VERSION_SCRIPT):!no_linker_version_script:!static { + verscript = $$OUT_PWD/$${TARGET}.version + QMAKE_LFLAGS += $${QMAKE_LFLAGS_VERSION_SCRIPT}$$verscript + + internal_module { + verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };" + } else { + current = Qt_$$QT_MAJOR_VERSION + verscript_content = "$$current { *; };" + for(i, 0..$$section(VERSION, ., 1, 1)) { + previous = $$current + current = Qt_$${QT_MAJOR_VERSION}.$$i + verscript_content += "$$current {} $$previous;" + } + } + write_file($$verscript, verscript_content)|error("Aborting.") + unset(current) + unset(previous) + unset(verscript) + unset(verscript_content) +} + android: CONFIG += qt_android_deps #install directives diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf index 38f1fe41a7..b302cc7737 100644 --- a/mkspecs/linux-icc/qmake.conf +++ b/mkspecs/linux-icc/qmake.conf @@ -104,6 +104,7 @@ QMAKE_CXXFLAGS_PRECOMPILE = -c -pch-create ${QMAKE_PCH_OUTPUT} -include ${QMAKE_ # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, +QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script, # Symbol visibility control QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden diff --git a/mkspecs/unsupported/linux-host-g++/qmake.conf b/mkspecs/unsupported/linux-host-g++/qmake.conf index 1523126eaa..546ff21349 100644 --- a/mkspecs/unsupported/linux-host-g++/qmake.conf +++ b/mkspecs/unsupported/linux-host-g++/qmake.conf @@ -71,6 +71,7 @@ QMAKE_PCH_OUTPUT_EXT = .gch # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list, +QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script, # # qmake configuration for common linux |