[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:28:09 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-coff
@llvm/pr-subscribers-platform-windows
Author: Ashlyn (paleauraaaa)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/191779.diff
3 Files Affected:
- (modified) lld/COFF/DriverUtils.cpp (+1)
- (modified) lld/test/COFF/subsystem.test (+10)
- (modified) llvm/tools/llvm-objcopy/ObjcopyOptions.cpp (+1)
``````````diff
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,
``````````
</details>
https://github.com/llvm/llvm-project/pull/191779
More information about the llvm-commits
mailing list