Commit Graph
173 Commits
Author SHA1 Message Date
Dean 8b9ae2fa8c Merge pull request #11626 from Mherberts/codex/fix-segment-prefixed-import-sites
fix(relinker): recognize ignored segment prefixes in import sites
2026-11-03 01:26:05 +13:00
Dean 718204e587 Merge pull request #11487 from roboterspinne/fix/relinker-linux-congruent-loads
fix(relinker): move a Linux PT_LOAD whose file offset is not page-congruent with its address
2026-11-02 23:28:40 +13:00
Dean da0f097c78 Merge pull request #11107 from AdnanKhan-ak47/feat/relinker-lower-bzhi-bextr
feat(relinker): lower BZHI and BEXTR under --to-rosetta
2026-11-02 23:26:58 +13:00
Dean 36564b6b4f Merge pull request #10970 from AdnanKhan-ak47/feat/relinker-lower-bls
feat(relinker): lower BLSI, BLSMSK and BLSR under --to-rosetta
2026-11-02 23:26:20 +13:00
Dean 2a9de0ea82 Merge pull request #10495 from wail-arch/fix/linux-guest-zero-address-exports
fix(relinker): bind guest function exports at address 0 on Linux
2026-11-02 23:22:55 +13:00
roboterspinne 94e4031147 fix(relinker): keep a moved Linux PT_LOAD's alignment on the header block
Moving a PT_LOAD to the end of the file sets its p_align to
min(p_align, 0x1000), since the copy honours only the page. When that
segment carried the largest p_align, the output's largest PT_LOAD
alignment, which Linux uses to align the ET_DYN load bias, fell with
it. SeparateSharedLoadPages now returns the largest power-of-two
p_align above the page that it lowered, and WriteLayout aligns the
header block PT_LOAD to at least that value, as it already does for
the largest kept p_align.
2026-11-01 09:37:04 +01:00
Kai Laue f2d7e367a7 fix(relinker): pin the __syscall6 syscall numbers instead of masking them
Review feedback: the three mount-family patterns now carry their exact numbers (21, 378, 22) like the mman patterns, so a stub with another number is not matched. The fixture check that changed only the masked bytes could not fail for the unmount fixture, whose number is also 22; it now rewrites the number field to 0, 1, 21, 22 and 378 and requires every other number to be rejected. Technical debt says the numbers are pinned.
2026-11-01 01:17:20 +01:00
Kai Laue 537c76fc9b fix(relinker): trap the inlined SDK __syscall6 stubs
Recognize the inlined __syscall6 wrappers of ps5-payload-dev SDK libc/mount.c (mount, nmount, unmount) under --trap-sdk-syscall-stubs, with the four-byte syscall number immediate masked so an SDK build that renumbers the call still matches. The three wrappers differ in argument preparation, so each sequence is matched separately.

Observed in ftpsrv v0.21.1 (0x709a, 0x70ec, 0x713c) and websrv v0.35 (0xae6a, 0xaebc, 0xaf0c). Related: issue #8624, open draft PR #8729 covers mount only.
2026-11-01 01:17:20 +01:00
PROGABBOMALA 6a82825008 fix(relinker): restrict lea roots to unwind reachability (#7547) 2026-10-31 22:35:11 +01:00
PROGABBOMALA b8fc47fd47 fix(relinker): recognize indirect lea roots and restore gap data skip (#7547) 2026-10-31 21:29:39 +01:00
PROGABBOMALA 0218b3529d fix(relinker): reject dynamic syscalls in indirect routines with unwind ranges (#7547) 2026-10-31 13:33:05 +01:00
PROGABBOMALA 695e2ec3d5 fix(relinker): resolve code and data boundaries in syscall scanner (#7547) 2026-10-31 02:14:04 +01:00
roboterspinne ffa036cbec Merge remote-tracking branch 'upstream/main' into fix/relinker-linux-congruent-loads
# Conflicts:
#	core/relinker/elfpatcher/tests/LinuxLoadPageTests.cpp
2026-10-30 16:23:11 +01:00
Adnan Khan 6ad23bffdd fix(relinker): restore an RSP destination in one load in the BZHI and BEXTR stub and list MULX as lowered 2026-10-30 12:55:03 +05:30
Adnan Khan 4ff00abf28 fix(relinker): restore an RSP destination in one load in the BLS stub and list MULX as lowered 2026-10-30 12:55:03 +05:30
Adnan Khan cf78130042 feat(relinker): lower BZHI and BEXTR under --to-rosetta 2026-10-30 12:55:03 +05:30
Adnan Khan 7f0b73575b fix(relinker): restore an RSP destination in one load in the shift stub, list MULX as lowered and drop the title note 2026-10-30 12:55:03 +05:30
Adnan Khan bc6710735a docs(relinker): record the shift lowering 2026-10-30 12:55:03 +05:30
Adnan Khan 96ccdc3bed test(relinker): relink BLSR, BLSMSK and BLSI through the CLI and record the BLS lowering caveats 2026-10-30 12:55:02 +05:30
Adnan Khan 42a65719cb docs(relinker): record the BLS lowering 2026-10-30 12:55:02 +05:30
Adrià 389563fdf7 Merge pull request #12591 from tablefrogpillow/fix/ptload-congruent-overlap
fix(relinker): accept byte-congruent PT_LOAD overlaps by trimming the earlier segment
2026-10-30 07:41:25 +01:00
Adrià 064c6bb320 Merge pull request #12430 from akkadbakkad89/fix/windows-kernel-family-fallback
fix(relinker): resolve kernel-family exports for libkernel-declared imports
2026-10-30 06:54:36 +01:00
Adrià 47e0293303 Merge pull request #12857 from slopgobblercobbler/fix/relinker-dynamic-hash-bounds
fix(relinker): validate SysV and GNU dynamic symbol hash table bounds
2026-10-30 06:35:58 +01:00
Adrià 8324dbb30a fix(relinker): test earlier bss over non-zero later file bytes and state the protection gap first in the debt entry 2026-10-29 23:24:44 +01:00
tablefrogpillowandClaude Opus 4.8 dbf358ef81 fix(relinker): refuse write-execute PT_LOAD overlaps and bound the congruence check
Addresses the #12591 review. Because the Windows image ORs page permissions,
refuse a congruent overlap when one segment is executable and the other
writable and the later segment does not start on a page boundary, which would
otherwise share a read-write-execute page; the rule is applied on both loaders
so their acceptance decision matches. Bound the congruence check to the
file-backed part of the overlap and compare spans rather than walking the
implicit zero bytes of a large bss overlap.

Expand test_executable_segments.py: byte-congruent tail and bss overlaps
accepted with their trimmed sizes and no output overlap; a write-execute
overlap refused at an unaligned boundary and accepted at an aligned one with
the Windows image carrying no write-execute section; differing bytes, an
overlap past the later end, a non-zero file byte over the later segment's bss,
and a shared start address refused; and a no-overlap control. Keep only the
PPSA ids in the relinker.md note.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-10-29 23:24:38 +01:00
tablefrogpillowandClaude Opus 4.8 d1904e7b66 fix(relinker): accept byte-congruent PT_LOAD overlaps by trimming the earlier segment
Some homebrew toolchains emit an eboot whose read-only PT_LOAD runs over the
GNU_RELRO start of the following read-write PT_LOAD, with byte-identical content
over the overlap. The relinker refused every such title with "Overlapping
PT_LOAD memory ranges" on both the Linux and Windows paths (Photo Splat VR
PPSA99770 #12183, FoxHollow PPSA99573, WWE 13 PPSA92013).

When an earlier PT_LOAD's tail overlaps a later one, the overlapping bytes are
identical, and the overlap does not extend past the later segment, trim the
earlier segment to end where the later one starts so the later segment owns the
shared range. On Linux the preserved PT_GNU_RELRO makes that range read-only
after relocation, matching the earlier read-only mapping; the Windows image
builder has no RELRO step, so the shared range stays writable (noted in
docs/dev/debt/relinker.md).

Overlaps whose bytes differ (the #10564 case), that extend past the later
segment, or that share a start address with it are still refused on every
target; the last case would otherwise trim the earlier segment to zero length.
test_executable_segments.py covers the accepted tail overlap and all three
refused cases.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-10-29 23:24:38 +01:00
Dean 420b6a064e Merge pull request #12621 from Ragbie/fix/windows-defer-needed-runtime-modules
fix(relinker): defer the runtime modules another deferred module needs on Windows
2026-10-30 08:49:48 +13:00
slopgobblercobbler 80e3bb6c35 fix(relinker): validate SysV and GNU dynamic symbol hash table bounds 2026-10-29 16:54:27 +01:00
Adrià b4acc8962b Merge pull request #12618 from FelixKunzJr/docs/rosetta-m2-pro-macos-27
docs(relinker): record Rosetta instruction support on an M2 Pro with macOS 27.0.1
2026-10-29 07:43:33 +01:00
akkadbakkad89andDevin f2b7333ae2 fix(relinker): make kernel-family fallback siblings optional on Windows
Family fallback entries appended for kernel-variant imports were marked
imported, so the startup stub hard-required every family member; a
partial libs/ without the unused sibling aborted with a load failure.
Track fallback positions separately so only the declared module and
canonical libkernel.prx stay required while siblings probe and skip.

Adds missing-sibling cases pinning expected providers (11 for the
declared variant, 22 for canonical libkernel.prx) and trims the debt
entry below the 1000-character limit.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-29 10:04:37 +05:30
akkadbakkad89 dcbc3c6523 docs(relinker): describe kernel-family import fallback in both directions 2026-10-29 10:04:31 +05:30
Evrim Cicek 74abb8ce1c fix(relinker): defer the runtime modules another deferred module needs on Windows 2026-10-29 02:09:01 +03:00
FelixKunzJr 78f3d63c2d docs(relinker): record Rosetta instruction support on an M2 Pro with macOS 27.0.1 2026-10-29 00:01:44 +01:00
Matheus Herberts 77a4c6f066 docs(relinker): record MULX testing under Rosetta 2026-10-28 07:53:33 -03:00
Matheus Herberts 46f658e8dd feat(relinker): lower MULX under --to-rosetta 2026-10-28 02:28:56 -03:00
Dean adbcdcdd58 Merge pull request #11463 from Mherberts/codex/feat-elf-relr-relocations
feat(relinker): support packed ELF64 relative relocations
2026-10-28 17:50:40 +13:00
Dean 77e44989b6 Merge pull request #11561 from javierUDP/docs/rosetta-m5-26-4-evidence
docs(relinker): record SHA, AVX-512 and XSAVE under Rosetta on an M5
2026-10-28 12:06:23 +13:00
Adrià 254240c747 Merge pull request #11045 from roboterspinne/fix/relinker-macos-fixups-writable
fix(relinker): reject macOS fixups outside writable segments
2026-10-27 18:29:51 +01:00
Matheus Herberts 458da3450e feat(relinker): support packed ELF64 relative relocations 2026-10-27 11:58:24 -03:00
Adrià 2635028370 Merge pull request #11061 from roboterspinne/fix/relinker-red-zone-body-pushes
fix(relinker): refuse red-zone leaves without a frame pointer that push or pop
2026-10-27 12:00:25 +01:00
roboterspinne 0326845257 docs(relinker): record measured dyld behaviour for macOS fixups
The debt entry on pointer fixups in executable segments claimed that
dyld refuses them, which no run had shown. It now states what was
measured on an M1 Pro running macOS 27.0.1 under Rosetta 2: dyld_info
reports both cases, the PF_R|PF_W|PF_X case loads and runs, and a
fixup into a PF_R|PF_X segment ends with SIGBUS in dyld. The
interpreter_in_code fixture keeps a read-only data PT_LOAD for the
Windows runs, so PE output still covers a RELATIVE into it.
2026-10-27 08:18:50 +01:00
roboterspinne e5297264e3 fix(relinker): reject macOS fixups outside writable segments
The macOS image writer emitted dyld rebase and bind opcodes for any
target inside a segment, so an R_X86_64_RELATIVE into an R-X PT_LOAD
became a rebase into a read-execute segment. dyld-1378 refuses fixups
in segments without write access (enforceFixupsInWritableSegments), so
Locate now throws when the target segment lacks VM_PROT_WRITE. Such
inputs now fail the macOS conversion instead of writing an output that
dyld would not load.
2026-10-27 08:18:50 +01:00
Adrià bf83eae375 Merge pull request #10947 from roboterspinne/fix/relinker-windows-tls-template-imports
fix(relinker): reject Windows executable imports bound into the TLS template
2026-10-27 07:59:13 +01:00
Dean a8bc4474c4 Merge pull request #11090 from roboterspinne/fix/relinker-windows-gs-trap-entry-roots
fix(relinker): refuse GS traps that overwrite a code entry point in Windows output
2026-10-27 18:32:02 +13:00
roboterspinne de3c2d9536 fix(relinker): refuse red-zone leaves without a frame pointer that push or pop
In a leaf without a frame pointer, --frame-red-zone lowers RSP after
the prologue and adds the shift to every RSP operand in the body,
assuming RSP does not move between the prologue and the exits. It
refused explicit RSP arithmetic but not opcode-encoded pushes and pops,
so after "push rax" in the body the read of the pushed slot at [rsp]
became [rsp+0x10], a red-zone slot, and "pushfq; and qword [rsp], -2;
popfq" changed that slot instead of the saved flags. Such a leaf now
keeps its red zone and is reported as "push or pop inside the body":
push and pop of a register, push imm, push r/m, pop r/m, pushf, popf
and push or pop of fs or gs outside the exits. The pops of an exit
still frame, and leaves with a frame pointer, whose RSP operands are
already refused, still frame when they push and pop.
2026-10-27 02:36:47 +01:00
Matheus Herberts 2121152767 fix(relinker): recognize ignored segment prefixes in import sites 2026-10-26 20:28:00 -03:00
Dean 5566e1e097 Merge pull request #10971 from roboterspinne/fix/relinker-linux-nonzero-import-addends
fix(relinker): reject nonzero GLOB_DAT and JUMP_SLOT addends in Linux output
2026-10-27 10:58:17 +13:00
Dean 1748d26517 Merge pull request #10871 from Chronyyx/feat/relinker-frame-short-exits
feat(relinker): frame red-zone leaves whose prologue or exit is shorter than a jump
2026-10-27 10:55:26 +13:00
Dean 357b586723 Merge pull request #11067 from slopgobblercobbler/fix/relinker-unwind-narrow-unsigned-overflow
fix(relinker): reject unsigned address overflow for narrow unwind encodings
2026-10-27 10:36:42 +13:00
javierUDP 5a9631df3b docs(relinker): record SHA, AVX-512 and XSAVE under Rosetta on an M5
The entry for the M5 running macOS 26.4 did not say what Rosetta does
with SHA or AVX-512, and the XSAVE entry was measured only on macOS
27.0.1. On that host sha1rnds4 and a 256-bit-wide vpaddd on zmm raise an
illegal instruction alongside RDSEED, CLWB, RDPID, ADCX and ADOX, while
XSAVE writes an XSTATE_BV of 0x7 and XGETBV returns the same x87, SSE
and AVX mask although CPUID leaf 1 still reports neither XSAVE nor
OSXSAVE.

The BMI1 and BMI2 results were compared with the Intel SDM definitions
over 200,000 random inputs each for PDEP, PEXT, BEXTR, BZHI, LZCNT and
TZCNT, so the entry can say they compute the documented result rather
than only that they avoid a fault.
2026-10-26 16:49:15 -03:00