qt5base-lts/mkspecs/common
Thiago Macieira 19b7f854a2 Enable -mno-direct-extern-access and ELF protected visibility
The -mno-direct-extern-access tells the compiler and linker that
references to symbols outside this ELF module mustn't be direct and must
instead always go through the GOT or PLT (the PLT can additionally be
disabled with -fno-plt). The ELF protected visibility tells the compiler
and linker that this symbol is present in the dynamic symbol table as an
export, but it cannot be interposed by another ELF module.

This option is required for user code to link properly to Qt, otherwise
they will get linker errors (assuming GNU binutils >= 2.39) or runtime
failures (glibc >= 2.35). Both versions of glibc and binutils are older
than GCC 12, so it's a safe assumption they are in use and downgrading
the toolchain or libc is not supported. Adding this option to the
compilation is assured for CMake and qmake-based projects.

For example, all accessess to QCoreApplication::self in QtCore, after
this change and with GCC 12 are relocation-free and direct:

000000000013ebf0 <QCoreApplicationPrivate::checkInstance(char const*)>:
  13ebf0:       cmpq   $0x0,0x4f73d0(%rip)        # 635fc8 <QCoreApplication::self>
  13ebf8:       setne  %al
  13ebfb:       je     a90fe <QCoreApplicationPrivate::checkInstance(char const*) [clone .cold]>
  13ec01:       ret

Meanwhile, accesses to the same variable in other modules are indirect
via the GOT:

   66650:       mov    0x876e1(%rip),%rax        # edd38 <QCoreApplication::self@Qt_6>
   66657:       cmpq   $0x0,(%rax)

This replaces the -Bsymbolic and -Bsymbolic-functions (broken)
functionality that Qt has been using or attempting to use since ~2006.

See https://gitlab.com/x86-psABIs/x86-64-ABI/-/issues/8#note_606975128

Change-Id: Iad4b0a3e5c06570b9f5f571b26ed564aa0811e47
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
2022-03-10 17:10:57 -08:00
..
aix Stop including net/if.h from qplatformdefs.h 2017-10-08 06:41:24 +00:00
android Remove checks for glibc < 2 from qplatformdefs.h files 2020-04-23 06:41:32 +02:00
bsd Stop including net/if.h from qplatformdefs.h 2017-10-08 06:41:24 +00:00
c89 Updated license headers 2016-01-15 12:25:24 +00:00
integrity Stop including net/if.h from qplatformdefs.h 2017-10-08 06:41:24 +00:00
mac Stop including net/if.h from qplatformdefs.h 2017-10-08 06:41:24 +00:00
nacl Updated license headers 2016-01-15 12:25:24 +00:00
posix Add QIODevice::NewOnly and QIODevice::ExistingOnly OpenMode flags 2018-01-17 04:32:47 +00:00
qnx Cleanup leftover QWS 2021-04-14 13:00:12 +09:00
rtems rtems: Fix missing some ernno defines 2019-07-01 02:04:19 +02:00
uikit Merge remote-tracking branch 'origin/5.8' into dev 2016-10-13 09:49:38 +02:00
clang-mac.conf Fix LTCG linker flags for macOS with separate debug info 2019-11-08 17:00:17 +01:00
clang.conf qmake: Stop using -isystem flag 2020-06-06 09:53:59 +00:00
g++-base.conf Fix cross-compilation to Linux 2019-11-04 08:28:20 +00:00
g++-macx.conf Remove the -load_all option from the linker enabling static builds 2015-01-07 09:57:07 +01:00
g++-unix.conf Fix '=' alignment and replace tabs in *.conf (whitespace only change) 2013-03-27 17:16:37 +01:00
g++-win32.conf Generalize the winmain/qtmain entry-point library 2020-10-17 12:13:00 +02:00
g++.conf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
gcc-base-mac.conf MinGW: reuse gcc-base.conf and g++-base.conf 2016-11-29 16:23:58 +00:00
gcc-base-unix.conf Add llvm linker detection to configure 2019-02-06 22:11:22 +00:00
gcc-base.conf Enable -mno-direct-extern-access and ELF protected visibility 2022-03-10 17:10:57 -08:00
ghs-base.conf INTEGRITY: Prevent deletion of virtual functions 2022-01-25 14:02:59 +02:00
ghs-integrity-armv7.conf Add -bigswitch on INTEGRITY 2017-04-03 08:08:46 +00:00
ghs-integrity-armv8.conf Add option to select build target for Integrity 2020-04-20 19:34:27 +03:00
ghs-integrity-x86.conf Add support for building for INTEGRITY using GHS toolchain. 2016-03-21 16:49:54 +00:00
icc-base-unix.conf Merge remote-tracking branch 'origin/5.15' into dev 2020-02-13 18:31:40 +01:00
ios.conf Add support for Apple tvOS 2016-05-17 16:11:23 +00:00
linux.conf Merge remote-tracking branch 'origin/5.9' into dev 2017-08-31 14:31:31 +02:00
llvm.conf Refer to Apple products by their actual names. 2013-07-10 17:32:48 +02:00
mac.conf Revert "configure: actually resolve libraries into full filepaths" 2019-09-13 10:47:38 +02:00
macx.conf macOS: Bump max supported SDK version to 12 2021-11-04 05:06:04 +01:00
msvc-based-version.conf qmake: Introduce the variable MSVC_TOOLSET_VER 2021-11-10 14:47:42 +01:00
msvc-desktop.conf MSVC: enable identical COMDAT folding for release builds 2020-11-12 03:51:04 +08:00
msvc-version.conf Update MSVC qmake mkspecs to make -std:c++20 available for VS2019 16.11+ 2022-02-11 22:05:20 +00:00
qcc-base-qnx-aarch64le.conf QNX7.1 updates 2020-11-20 15:28:31 +02:00
qcc-base-qnx-armle-v7.conf QNX7.1 updates 2020-11-20 15:28:31 +02:00
qcc-base-qnx-x86-64.conf QNX7.1 updates 2020-11-20 15:28:31 +02:00
qcc-base-qnx-x86.conf QNX7.1 updates 2020-11-20 15:28:31 +02:00
qcc-base-qnx.conf Use C++17 for qmake and force the build of everything with C++17 2020-02-08 09:49:07 +01:00
qcc-base.conf QNX7.1 updates 2020-11-20 15:28:31 +02:00
rtems-base.conf rtems: add mkspecs for new operation system RTEMS 2019-05-06 06:56:33 +00:00
sanitize.conf configure: Explicitly enable float-divide-by-zero with ubsan 2020-08-07 01:21:07 +02:00
shell-unix.conf centralize setup of shell-related variables in spec_post.prf 2015-03-06 19:08:40 +00:00
shell-win32.conf centralize setup of shell-related variables in spec_post.prf 2015-03-06 19:08:40 +00:00
solaris.conf Fix solaris build 2020-05-05 15:34:16 +02:00
tvos.conf qmake: enable bitcode also for iOS 2016-08-19 21:06:05 +00:00
uikit.conf Limit OpenGL deprecation silencing on Apple platform to Qt itself 2020-07-02 10:27:58 +02:00
unix.conf unify handling of library prefixes and extensions 2015-10-01 16:19:30 +00:00
watchos.conf qmake: enable bitcode also for iOS 2016-08-19 21:06:05 +00:00
windows-desktop.conf Enable users to specify WindowsTargetPlatform[Min]Version in VS projects 2018-11-16 10:55:16 +00:00
windows-vulkan.conf Resolve QMAKE_INCDIR_VULKAN on every qmake call 2019-05-05 13:15:37 +00:00