qt5base-lts/mkspecs/features/unix
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
..
bsymbolic_functions.prf take advantage of new safety regarding build config resolution 2013-02-18 15:52:39 +01:00
ccache.prf Add qmake feature and configure option to use ccache 2017-09-05 10:47:35 +00:00
hide_symbols.prf Distinguish between Objective-C and Objective-C++ sources 2015-10-09 15:15:17 +00:00
largefile.prf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
mno_extern_direct_access.prf Enable -mno-direct-extern-access and ELF protected visibility 2022-03-10 17:10:57 -08:00
opengl.prf Use qtConfig throughout in qtbase 2016-08-19 04:28:05 +00:00
separate_debug_info.prf macOS: Don't try to install lldb debug script unless the module provides one 2018-07-20 06:40:05 +00:00
thread.prf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
x11.prf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
x11inc.prf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
x11lib.prf Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
x11sm.prf Remove all references to X11 session management 2012-06-01 03:15:55 +02:00