Blog
Unterstützung für GCC 12
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.