Move the ABI tag from minimum-linux.S to qlibraryinfo.cpp

We don't need the assembly file any more. According to a comment to
patchsets 2 in the Gerrit code review for commit
bb8a61866e, the section ended up as
SHT_PROGBITS instead of SHT_NOTE. I didn't know then that the section
type is not actually important, only whether it's present in the segment
pointed by a PT_NOTE is. That isn't recorded in the review.

Since we now depend on the linker properly placing the .note.* sections
for Qt plugins, we can rely on this working.

Change-Id: Icb2516126f674e7b8bb3fffd16ad659149e34a23
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Thiago Macieira 2021-10-12 14:25:14 -07:00
parent 7362b321e5
commit aa82d295c8
4 changed files with 44 additions and 111 deletions

View File

@ -573,23 +573,6 @@ qt_internal_extend_target(Core CONDITION LINUX AND QT_BUILD_SHARED_LIBS
global/minimum-linux_p.h
)
#### Keys ignored in scope 34:.:global:global/global.pri:precompile_header:
# NO_PCH_ASM = "global/minimum-linux.S"
# QMAKE_EXTRA_COMPILERS = "no_pch_assembler"
# no_pch_assembler.commands = "$$QMAKE_CC" "-c" "$(CFLAGS)" "$(INCPATH)" "${QMAKE_FILE_IN}" "-o" "${QMAKE_FILE_OUT}"
# no_pch_assembler.dependency_type = "TYPE_C"
# no_pch_assembler.input = "NO_PCH_ASM"
# no_pch_assembler.name = "compiling[no_pch]" "${QMAKE_FILE_IN}"
# no_pch_assembler.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
#### Keys ignored in scope 35:.:global:global/global.pri:silent:
# no_pch_assembler.commands = "@echo" "compiling[no_pch]" "${QMAKE_FILE_IN}" "&&"
qt_internal_extend_target(Core CONDITION LINUX AND NOT precompile_header AND QT_BUILD_SHARED_LIBS
SOURCES
global/minimum-linux.S
)
qt_internal_extend_target(Core CONDITION QT_FEATURE_slog2
LIBRARIES
Slog2::Slog2

View File

@ -1,81 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2017 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "minimum-linux_p.h"
/* Copied from #include <elf.h>:
*/
#define ELF_NOTE_GNU "GNU"
#define NT_GNU_ABI_TAG 1
#define ELF_NOTE_OS_LINUX 0
#ifdef __arm__
# define progbits %progbits
# define note %note
#else
# define progbits @progbits
# define note @note
#endif
/* Add information for the ELF dynamic linker what the minimum Linux version
* required for Qt is.
*
* The .note.ABI-tag note section is defined at
* https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/noteabitag.html
*/
.section ".note.GNU-stack", "", progbits
.section ".note.ABI-tag", "a", note
.balign 4 /* we have 32-bit data */
/* * For the format of the note section's contents, see Elf32_Nhdr / Elf64_Nhdr */
.long .Lnameend-.Lname /* n_namesz */
.long 16 /* n_descsz(16 bytes, normative) */
.long NT_GNU_ABI_TAG /* n_type */
.Lname:
.asciz ELF_NOTE_GNU
.Lnameend:
/* Operating systems: */
.long ELF_NOTE_OS_LINUX
.long MINLINUX_MAJOR
.long MINLINUX_MINOR
.long MINLINUX_PATCH

View File

@ -83,24 +83,25 @@ QT_BEGIN_NAMESPACE
// falls back to stat() for us.
// (Using QT_CONFIG(glibc) instead of __GLIBC__ because the macros aren't
// defined in assembler mode)
# define MINLINUX_MAJOR 4
# define MINLINUX_MINOR 11
# define MINLINUX_PATCH 0
# define QT_ELF_NOTE_OS_MAJOR 4
# define QT_ELF_NOTE_OS_MINOR 11
# define QT_ELF_NOTE_OS_PATCH 0
#elif QT_CONFIG(getentropy)
# define MINLINUX_MAJOR 3
# define MINLINUX_MINOR 17
# define MINLINUX_PATCH 0
# define QT_ELF_NOTE_OS_MAJOR 3
# define QT_ELF_NOTE_OS_MINOR 17
# define QT_ELF_NOTE_OS_PATCH 0
#elif QT_CONFIG(renameat2)
# define MINLINUX_MAJOR 3
# define MINLINUX_MINOR 16
# define MINLINUX_PATCH 0
# define QT_ELF_NOTE_OS_MAJOR 3
# define QT_ELF_NOTE_OS_MINOR 16
# define QT_ELF_NOTE_OS_PATCH 0
#else
# define MINLINUX_MAJOR 2
# define MINLINUX_MINOR 6
# define MINLINUX_PATCH 28
# define QT_ELF_NOTE_OS_MAJOR 2
# define QT_ELF_NOTE_OS_MINOR 6
# define QT_ELF_NOTE_OS_PATCH 28
#endif
#define MINIMUM_LINUX_VERSION QT_VERSION_CHECK(MINLINUX_MAJOR, MINLINUX_MINOR, MINLINUX_PATCH)
/* you must include <elf.h> */
#define QT_ELF_NOTE_OS_TYPE ELF_NOTE_OS_LINUX
QT_END_NAMESPACE

View File

@ -685,6 +685,7 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName)
QT_END_NAMESPACE
#if defined(Q_CC_GNU) && defined(ELF_INTERPRETER)
# include <elf.h>
# include <stdio.h>
# include <stdlib.h>
@ -694,6 +695,35 @@ QT_WARNING_DISABLE_GCC("-Wattributes")
QT_WARNING_DISABLE_CLANG("-Wattributes")
QT_WARNING_DISABLE_INTEL(2621)
# if defined(Q_OS_LINUX)
# include "minimum-linux_p.h"
# endif
# ifdef QT_ELF_NOTE_OS_TYPE
struct ElfNoteAbiTag
{
static_assert(sizeof(Elf32_Nhdr) == sizeof(Elf64_Nhdr),
"The size of an ELF note is wrong (should be 12 bytes)");
struct Payload {
Elf32_Word ostype = QT_ELF_NOTE_OS_TYPE;
Elf32_Word major = QT_ELF_NOTE_OS_MAJOR;
Elf32_Word minor = QT_ELF_NOTE_OS_MINOR;
# ifdef QT_ELF_NOTE_OS_PATCH
Elf32_Word patch = QT_ELF_NOTE_OS_PATCH;
# endif
};
Elf32_Nhdr header = {
.n_namesz = sizeof(name),
.n_descsz = sizeof(Payload),
.n_type = NT_GNU_ABI_TAG
};
char name[sizeof ELF_NOTE_GNU] = ELF_NOTE_GNU; // yes, include the null terminator
Payload payload = {};
};
__attribute__((section(".note.ABI-tag"), aligned(4), used))
extern constexpr ElfNoteAbiTag QT_MANGLE_NAMESPACE(qt_abi_tag) = {};
# endif
extern const char qt_core_interpreter[] __attribute__((section(".interp")))
= ELF_INTERPRETER;