Blog

Unterstützung für GCC 12

Bernhard Heinloth

2022-06-09

Anfang Mai wurde GCC Version 12 veröffentlicht, nach dem Beginn des Übungsbetriebs – und der Herausgabe der Vorgabe.

StuBS(mI) kann zwar prinzipiell damit übersetzt werden, es werden jedoch bei der Übersetzung des ACPI-Teils Warnungen bzgl. Array Grenzen angezeigt. Und unter Umständen kann es passieren, das beim casten von volatile Variablen zusätzliche Instruktionen (welche Symbole aus der C++-ABI, die bei uns nicht-definierte sind) referenzieren.

Mit diesem Patch lässt sich unser Kernel auch problemlos mit GCC 12 übersetzen:

diff --git a/machine/acpi.cc b/machine/acpi.cc
index 02229e7..ef9faa6 100644
--- a/machine/acpi.cc
+++ b/machine/acpi.cc
@@ -48,7 +48,8 @@ bool init() {
         *   on the BIOS data area.
         * * The BIOS read-only memory space between 0E0000h and 0FFFFFh.
         */
-       const uintptr_t ebda = static_cast<uintptr_t>(*reinterpret_cast<uint32_t*>(0x40e));
+       volatile uintptr_t ebda_base_address = 0x40e;
+       const uintptr_t ebda = static_cast<uintptr_t>(*reinterpret_cast<uint32_t *>(ebda_base_address));
        const RSDP *rsdp = findRSDP(reinterpret_cast<void*>(ebda), 1024);
        if (rsdp == nullptr) {
                rsdp = findRSDP(reinterpret_cast<void*>(0xe0000), 0xfffff-0xe0000);
diff --git a/tools/build.mk b/tools/build.mk
index 21378ae..312196f 100644
--- a/tools/build.mk
+++ b/tools/build.mk
@@ -17,7 +17,7 @@ CXXFLAGS_DEFAULT = -std=c++14 -ffreestanding -fno-pic -nodefaultlibs -nostdlib -
 CXXFLAGS_OPT = -O3 -fomit-frame-pointer
 CXXFLAGS_WARNING = -Wall -Wextra -Werror -Wno-error=unused-parameter -Wno-non-virtual-dtor
 CXXFLAGS_CLANG = -no-pie -Wno-error=unused-private-field -Wno-implicit-exception-spec-mismatch -Wno-error=unused-const-variable -Wno-unused-command-line-argument -Wno-unused-const-variable -fno-strict-aliasing
-CXXFLAGS_GCC = -fno-tree-loop-distribute-patterns -no-pie -nostartfiles -Wstack-usage=1024 -Wno-error=stack-usage=
+CXXFLAGS_GCC = -fno-tree-loop-distribute-patterns -no-pie -nostartfiles -Wstack-usage=1024 -Wno-error=stack-usage= -fno-threadsafe-statics
 CXXFLAGS_NOFPU = -mno-mmx -mno-sse -mgeneral-regs-only
 CXXFLAGS = $(CXXFLAGS_ARCH) $(CXXFLAGS_DEFAULT) $(CXXFLAGS_OPT) $(CXXFLAGS_NOFPU) $(CXXFLAGS_WARNING)
 # Compiler specific flags

Außerdem wurden nun auch die Docker-Abbilder nachgezogen.

Übersetzer Versionen Dockerabbild
GCC 7 - 10 inf4/stubs:gcc-old-x64
GCC 9 - 12 inf4/stubs:gcc-x64
LLVM/Clang 7 - 10 inf4/stubs:clang-old-x64
LLVM/Clang 11 - 14 inf4/stubs:clang-x64

StuBS unterstützt (mit obigen Patch) alle diese Versionen, zum Übersetzen sollte die Makefilevariable CXX entsprechend angepasst werden. Um zum Beispiel testweise mit GCC 12 zu bauen, einfach

$ cd mpstubsmi-gruppe-00
$ make clean
$ docker run --rm -it -v $(pwd):/builds/stubs/ inf4/stubs:gcc-x64
root@123456789abc:/# cd /builds/stubs
root@123456789abc:/builds/stubs# make CXX=gcc-12

ausführen.

Zurück zur Übersicht