[lld] [llvm] [lld][llvm-objcopy] Enable Xbox subsystem for PE images. (PR #191779)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 13 02:29:35 PDT 2026
https://github.com/paleauraaaa updated https://github.com/llvm/llvm-project/pull/191779
>From e1870d3fb4950c30ea6e5cf7edd4c1915a0d7159 Mon Sep 17 00:00:00 2001
From: Ashlyn <sirfingerlingus at gmail.com>
Date: Mon, 13 Apr 2026 02:44:57 -0600
Subject: [PATCH] [lld][llvm-objcopy] Enable Xbox subsystem for PE images.
This patch enables selecting the Xbox subsystem (IMAGE_SUBSYSTEM_XBOX)
for PE images. Certain existing tools used in the Xbox homebrew scene
expect images to use the Xbox subsystem, so it's nice to be able to set
this within the LLVM toolchain instead of invoking yet another tool or
manually patching the binaries.
---
lld/COFF/DriverUtils.cpp | 1 +
lld/test/COFF/subsystem.test | 10 ++++++++++
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 1 +
3 files changed, 12 insertions(+)
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp
index 42c7f93381510..fa9bd0093a6c4 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -132,6 +132,7 @@ void LinkerDriver::parseSubsystem(StringRef arg, WindowsSubsystem *sys,
.Case("native", IMAGE_SUBSYSTEM_NATIVE)
.Case("posix", IMAGE_SUBSYSTEM_POSIX_CUI)
.Case("windows", IMAGE_SUBSYSTEM_WINDOWS_GUI)
+ .Case("xbox", IMAGE_SUBSYSTEM_XBOX)
.Default(IMAGE_SUBSYSTEM_UNKNOWN);
if (*sys == IMAGE_SUBSYSTEM_UNKNOWN && sysStrLower != "default")
Fatal(ctx) << "unknown subsystem: " << sysStr;
diff --git a/lld/test/COFF/subsystem.test b/lld/test/COFF/subsystem.test
index e9a6966a01da9..347a489709d67 100644
--- a/lld/test/COFF/subsystem.test
+++ b/lld/test/COFF/subsystem.test
@@ -48,3 +48,13 @@ CHECK5: MajorOperatingSystemVersion: 1
CHECK5: MinorOperatingSystemVersion: 2
CHECK5: MajorSubsystemVersion: 3
CHECK5: MinorSubsystemVersion: 4
+
+# RUN: lld-link /entry:main /out:%t.exe /subsystem:xbox,8.9 \
+# RUN: %p/Inputs/ret42.obj
+# RUN: llvm-readobj --file-headers %t.exe | FileCheck -check-prefix=CHECK6 %s
+
+CHECK6: MajorOperatingSystemVersion: 8
+CHECK6: MinorOperatingSystemVersion: 9
+CHECK6: MajorSubsystemVersion: 8
+CHECK6: MinorSubsystemVersion: 9
+CHECK6: Subsystem: IMAGE_SUBSYSTEM_XBOX
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 8aa843b6a5155..9481c0baa337a 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -821,6 +821,7 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> ArgsArr,
.Case("native", COFF::IMAGE_SUBSYSTEM_NATIVE)
.Case("posix", COFF::IMAGE_SUBSYSTEM_POSIX_CUI)
.Case("windows", COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI)
+ .Case("windows", COFF::IMAGE_SUBSYSTEM_XBOX)
.Default(COFF::IMAGE_SUBSYSTEM_UNKNOWN);
if (*COFFConfig.Subsystem == COFF::IMAGE_SUBSYSTEM_UNKNOWN)
return createStringError(errc::invalid_argument,
More information about the llvm-commits
mailing list