19b7f854a2
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>
134 lines
4.9 KiB
Plaintext
134 lines
4.9 KiB
Plaintext
#
|
|
# This file is used as a basis for the following compilers:
|
|
#
|
|
# - The GNU C++ compiler (g++)
|
|
# - LLVM
|
|
# - Clang
|
|
#
|
|
# Platform-specific options shared by these compilers are put into:
|
|
#
|
|
# - gcc-base-mac.conf
|
|
# - gcc-base-unix.conf
|
|
#
|
|
# These base files are then combined with configurations for each compiler:
|
|
#
|
|
# - g++-base.conf
|
|
# - g++-macx.conf
|
|
# - g++-unix.conf
|
|
# - llvm.conf
|
|
# - clang.conf
|
|
#
|
|
# The combination happens in the top level mkspec, by including a platform-
|
|
# specific version of the base-file, for example gcc-base-mac.conf, and then
|
|
# a (possibly platform-specific) version of the actual compiler configuration,
|
|
# for example g++-macx.conf.
|
|
#
|
|
# If you are making changes to any of these files, please consider the
|
|
# possible effect it may have due to these include-rules, and whether it
|
|
# might make more sense to share the rule or make it more specific.
|
|
#
|
|
# To verify that your change has the desired effect on the final configuration
|
|
# you can use the manual test in tests/manual/mkspecs.
|
|
#
|
|
|
|
QMAKE_CFLAGS_OPTIMIZE = -O2
|
|
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
|
|
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Og
|
|
QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os
|
|
|
|
!equals(QMAKE_HOST.os, Windows): QMAKE_CFLAGS += -pipe
|
|
QMAKE_CFLAGS_DEPS += -M
|
|
QMAKE_CFLAGS_WARN_ON += -Wall -Wextra
|
|
QMAKE_CFLAGS_WARN_OFF += -w
|
|
QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE
|
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g
|
|
QMAKE_CFLAGS_DEBUG += -g
|
|
QMAKE_CFLAGS_SHLIB += $$QMAKE_CFLAGS_PIC
|
|
QMAKE_CFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_PIC
|
|
QMAKE_CFLAGS_APP +=
|
|
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
|
|
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
|
|
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
|
|
QMAKE_CFLAGS_SPLIT_SECTIONS += -ffunction-sections -fdata-sections
|
|
QMAKE_CFLAGS_LTCG = -flto -fno-fat-lto-objects
|
|
QMAKE_CFLAGS_LTCG_FATOBJECTS = -ffat-lto-objects
|
|
QMAKE_CFLAGS_DISABLE_LTCG = -fno-lto
|
|
QMAKE_CFLAGS_SHSTK = -mshstk
|
|
|
|
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS
|
|
QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS
|
|
QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON
|
|
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF
|
|
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
|
|
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
|
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
|
|
QMAKE_CXXFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB
|
|
QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
|
|
QMAKE_CXXFLAGS_APP += $$QMAKE_CFLAGS_APP
|
|
QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC
|
|
QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
|
|
QMAKE_CXXFLAGS_EXCEPTIONS_OFF += $$QMAKE_CFLAGS_EXCEPTIONS_OFF
|
|
QMAKE_CXXFLAGS_RTTI_ON = -frtti
|
|
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
|
|
QMAKE_CXXFLAGS_SPLIT_SECTIONS += $$QMAKE_CFLAGS_SPLIT_SECTIONS
|
|
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
|
QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS
|
|
QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG
|
|
QMAKE_CXXFLAGS_SHSTK = $$QMAKE_CFLAGS_SHSTK
|
|
|
|
QMAKE_LFLAGS +=
|
|
QMAKE_LFLAGS_DEBUG +=
|
|
QMAKE_LFLAGS_APP +=
|
|
QMAKE_LFLAGS_RELEASE +=
|
|
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO +=
|
|
QMAKE_LFLAGS_EXCEPTIONS_OFF +=
|
|
QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -fuse-linker-plugin
|
|
|
|
QMAKE_CFLAGS_C99 = -std=c99
|
|
QMAKE_CFLAGS_C11 = -std=c11
|
|
QMAKE_CFLAGS_C17 = -std=c17
|
|
|
|
QMAKE_CFLAGS_SSE2 += -msse2
|
|
QMAKE_CFLAGS_SSE3 += -msse3
|
|
QMAKE_CFLAGS_SSSE3 += -mssse3
|
|
QMAKE_CFLAGS_SSE4_1 += -msse4.1
|
|
QMAKE_CFLAGS_SSE4_2 += -msse4.2
|
|
QMAKE_CFLAGS_F16C += -mf16c
|
|
QMAKE_CFLAGS_RDRND += -mrdrnd
|
|
QMAKE_CFLAGS_RDSEED += -mrdseed
|
|
QMAKE_CFLAGS_AVX += -mavx
|
|
QMAKE_CFLAGS_AVX2 += -mavx2
|
|
QMAKE_CFLAGS_AVX512F += -mavx512f
|
|
QMAKE_CFLAGS_AVX512ER += -mavx512er
|
|
QMAKE_CFLAGS_AVX512CD += -mavx512cd
|
|
QMAKE_CFLAGS_AVX512PF += -mavx512pf
|
|
QMAKE_CFLAGS_AVX512DQ += -mavx512dq
|
|
QMAKE_CFLAGS_AVX512BW += -mavx512bw
|
|
QMAKE_CFLAGS_AVX512VL += -mavx512vl
|
|
QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma
|
|
QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi
|
|
QMAKE_CFLAGS_AVX512VNNI += -mavx512vnni
|
|
QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma
|
|
QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi
|
|
QMAKE_CFLAGS_AVX512VBMI2 += -mavx512vbmi2
|
|
QMAKE_CFLAGS_AVX512BITALG += -mavx512bitalg
|
|
QMAKE_CFLAGS_AVX512POPCNTDQ += -mavx512vpopcntd
|
|
QMAKE_CFLAGS_AESNI += -maes
|
|
QMAKE_CFLAGS_SHANI += -msha
|
|
QMAKE_CFLAGS_VAES += -mvaes
|
|
QMAKE_CFLAGS_NEON += -mfpu=neon
|
|
QMAKE_CFLAGS_MIPS_DSP += -mdsp
|
|
QMAKE_CFLAGS_MIPS_DSPR2 += -mdspr2
|
|
|
|
# -march=haswell is supported as of GCC 4.9 and Clang 3.6
|
|
QMAKE_CFLAGS_ARCH_HASWELL = -march=core-avx2
|
|
|
|
# Wrapper tools that understand .o/.a files with GIMPLE instead of machine code
|
|
QMAKE_AR_LTCG = gcc-ar cqs
|
|
QMAKE_NM_LTCG = gcc-nm -P
|
|
QMAKE_RANLIB_LTCG = true # No need to run since gcc-ar has "s"
|
|
|
|
QMAKE_LINK_OBJECT_SCRIPT = object_script
|
|
|
|
include(sanitize.conf)
|