Skip to content

feat: build native Linux x64 and ARM64 archives - #2

Open
pwnedbygary wants to merge 8 commits into
coye2:mainfrom
pwnedbygary:feat/native-linux-builds
Open

pwnedbygary wants to merge 8 commits into
coye2:mainfrom
pwnedbygary:feat/native-linux-builds

Conversation

@pwnedbygary

@pwnedbygary pwnedbygary commented Oct 27, 2026 •

Copy link
Copy Markdown

im a bot and i suck at RE

Gary Bagley added 8 commits October 26, 2026 22:29
Restore the released launcher and core-host sources, plus deterministic pinned acquisition and reconstruction for the core without vendoring the unchanged upstream tree.

Review: PASS (independent reviewers A and B: 98/100 each)\nSnapshot: a13fc197ccd8be7fcc228273051c771906ed9df54d770be9b1383720ab869c37\nChecks: source-baseline 15/15; actionlint; pinned HLE/Vulkan/OpenAL builds; launcher build; host publish inventory 107 libraries/135 assets; worker handshake; contracts 63/63; services 73 passed with one explicit Windows-only unavailable case.\nStaged diff check: all paths clean except preserved CRLF bytes in the byte-identical released NX-BUILD-SOURCES.json provenance manifest.
Add deterministic, self-contained Linux x64 and ARM64 packaging of the
reconstructed launcher and core host (`build/linux/`), with exact
manifests, an independent per-RID path and ELF-hash policy, complete
native/managed notices, FFmpeg corresponding source per RID, GPL timing
source, a CPU-only Xvfb launcher/worker probe, install-replacement and
default-data preservation checks, and a CI job that builds, verifies and
uploads both archives. Linux RID selection is architecture-aware;
Windows-only icon/manifest, translation, OCR and mutable avatar paths are
excluded from native Linux builds. Docs are native-first with Proton as a
fallback. Packages remain `unqualified`: no gameplay, audio, controller or
physical ARM64 claims.

Review: dual independent blind review, round 17, both PASS 100/100 on
snapshot manifest e0398d581fdb63b21378ab120097142642f13d662d184c3cba812fdbd876fb6a
(41 paths, base b26ba27).
Checks: 51 Linux and 15 source-baseline tool tests; actionlint; diff
check; 39/39 production mutations caught; round-10 archives (x64
839efa18..., ARM64 dc655a05...) pass verify.py and match all 231
regenerated distribution files byte for byte.
The packager copied LICENSE.txt and ThirdPartyNotices.txt from the root of
the dotnet install. On GitHub runners that root is shared by several SDKs, so
its bytes depend on install history, and fork CI run 40569461006 rejected
dotnet-THIRD-PARTY-NOTICES.txt. Both notices now come from each RID's
hash-pinned microsoft.netcore.app.runtime.<rid> 10.0.13 package, the runtime
the self-contained archives ship. The notice pin and the dependency-policy
pin change; the license bytes are unchanged.

Review: round 18, snapshot fec13fa7c3cb1f20ac7a142cab492ad64bb360ad55d329c8f0d59aefb73e9877
(41 paths), dual independent PASS (A 100/100, B 100/100), considers only.
Checks: 52 Linux and 15 source-baseline tool tests, actionlint, diff check.
Round-18 archives (Python-only reassembly, verifier PASS): x64 b376cb28...,
x64 classic zlib 02891233..., ARM64 2588a630....
The packager now refuses a dotnet that resolves any SDK other than the
exact version its global.json names (10.0.402 for the products, 9.0.100
for the restored core, whose upstream pin allows rolling forward). CI
installs both SDKs into a private $RUNNER_TEMP/dotnet instead of the
runner's shared root and lists them.

verified_package opens each .nupkg once without following symlinks or
blocking, refuses non-regular and oversized files with distinct
messages, and returns the bytes it hashed; notices are read from those
bytes and written only after every pinned package verifies.
add_distribution_files refuses a package cache without a RID. New tests
cover the wiring, FIFO, size bounds and SDK check call sites.

No packaged file changes; the round-18 archives remain the product.

Review: round 20 snapshot 374351a006cc136bc8890b914c2ee3850bc317ac21d797ecf8bffc1be8065995
(41 paths), Reviewer A PASS 100, Reviewer B PASS 100.
Checks: 62 Linux and 15 source-baseline tests, actionlint, git diff
--check, 14/14 mutations killed, 255 regenerated distribution files
byte-identical to the round-18 archives.
Close the round-20 review considerations without changing any packaged
file:

- verified_package closes its descriptor on every failure path and adds
  the system's reason to open failures; both size bounds are tested at
  the limit and one byte over.
- copy_native_notices refuses two notice sources with the same
  destination; native and runtime notices share one writer.
- require_pinned_sdk times out after two minutes and keeps dotnet's SDK
  list when it refuses.
- Tests: the FIFO timeout cannot be mistaken for an expected refusal, a
  re-read after hashing fails, each global.json refusal asserts its own
  message, write-order tests are split by notice kind.

Fork CI run 40576404272 (at 1dfd372) confirmed the SDK hypothesis: with
a private SDK folder holding only 9.0.100 and 10.0.402, all ten
restored-core DLLs and backend.json match the round-18 archives.

Review: round 21 snapshot e9ac5a62d36fe4d8ba7c8c73df65e76acc6c67134e56cd5745359564e41e381c
(41 paths); Reviewer A PASS 95, Reviewer B PASS 100.
Checks: 68 Linux and 15 source-baseline tests, actionlint, diff check;
23/23 mutations caught; 255 regenerated distribution files per archive
byte-identical to round 18.
…read test

Distribution writes (write_bytes, write_text, copy_file) now create files
exclusively, so a name clash between notice sources or with a published file
fails the build instead of silently replacing a file. The open-failure
message no longer blames symbolic links; an SDK query timeout is reported as
a ValueError naming the pin; a non-string SDK version is refused.

Tests: the package is swapped on disk between the read and the hash, so
hashing or returning a second read fails; no descriptor leaks on refusal;
FIFO cases share a 5-second alarm guard; expected error text comes from
errno; README line rewrapped. No packaged file changes: all 255 regenerated
distribution files match the round-18 archives.

Review: round-22 snapshot a408d4a3ff59f2198f63cdd5b967a4e5e2a18fafaa0a3c0d3f3af26b996e5f82
(41 paths). Reviewer A PASS 95.7 (one should-fix test gap, deferred to the
next round), Reviewer B PASS 100. Index matched all 41 reviewed hashes;
staged diff byte-identical to the reviewed delta.
Checks: 71 Linux and 15 source-baseline tests, actionlint, diff check,
30-mutation sweep (all caught).
…runnable SDK

require_pinned_sdk now reports a dotnet that cannot be executed as a
ValueError naming the pin, like its other refusals. Tests pin each
collision to the exact file (the launcher written by write_text), a
package notice clashing with the runtime notice, a read of exactly
MAX_PACKAGE_BYTES + 1 bytes, closure of every opened stream and of the
descriptor when fdopen fails (OSError and KeyboardInterrupt), and an
alarm helper that restores an outer timer. No packaged file changes.

Review round 23: snapshot
5adab98b977ee288d9c43e8a454c8a6e1fb325eba20c6001a0568c2328ef70a2
(41 paths). Reviewer A PASS 100, Reviewer B PASS 100, considers only.
Checks: 75 Linux and 15 source-baseline tests, actionlint, diff check,
37-mutation sweep all caught; 255 regenerated distribution files per
archive byte-identical to the round-18 archives.
…timer interval

Round 24 answers the round-23 review considerations without changing any
packaged file (build/linux/distribution.py is untouched; all 255 regenerated
distribution files per archive match the round-18 x64, classic-zlib x64 and
ARM64 archives byte for byte).

- require_pinned_sdk reports the exception text when an OSError carries no
  strerror.
- One collision test per notice writer (native notices, repository notice
  directory, tracked copies); the launcher is seeded with sentinel bytes.
- fails_instead_of_blocking keeps the outer timer's interval; tests pin the
  elapsed-time subtraction and the expired-timer floor.
- The SDK test pins the full pin path, the no-strerror case and propagation
  of non-OSError failures.
- One ObservedPackageStream helper replaces three stream proxies.
- HANDOFF credits each round-21 point to its reviewer; AUDIT gives the
  collision order correctly.

Review: round-24 snapshot 58dc98a40b6093a6d17c48952a307111cc9e5733f2c8ad3119f299525feeedac
(41 paths), Reviewer A PASS 100, Reviewer B PASS 100 (considers only).
Checks: 79 Linux and 15 source-baseline tests, actionlint, diff check,
46-mutation sweep all caught.
@coye2

coye2 commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

hi gary. just wanna say have fun with V1 because the launcher and core have now been compiled to native machine code (NativeAOT) the launcher and core host ship with no .NET code in the ZIP so there is no code to recover. on top of that anything else is obfuscated and stripped. trying to recover compiled source in order to redistribute it against my name isnt the move. and wont go on. forking the project and building off of whats there on your own is entirely different, which you are not. youre forking an impersonation in attempt to steer people the wrong way on google. GGs and good luck to you man.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants