The NID patcher and check_conventions resolve
fstat_nid_disambig1_nid_postfix to fstat. import_audit hashed it as
fstat_nid_disambig1, so a throwing stub with the suffix was keyed under
the wrong NID, and nid_names reported fstat and pwrite as rename-ready
instead of already-implemented.
unwrap_self copied every segment that does not sit inside a PT_LOAD with
alignment 1. On real dumps that puts the comment and version segments
(p_align 0x10) right after the last load segment, at offsets that break
p_offset % p_align == p_vaddr % p_align. Those regions now use the
segment's own p_vaddr and p_align, the same as the load segments, which
is what the module docstring already promises. Load segment placement
and bytes do not change.
Library functions and shader instructions were drawn on one y-axis with
ambiguous labels and overlapping fills. Each now gets its own panel and
scale, with implemented (solid) against declared (dashed); shaders gain
their declared total from the ISA list. Date labels are horizontal and
every day has a hover tooltip.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
unwrap_self reads the vaddr-less segments that follow the recorded
comment segment back to back from right after its data, and refuses the
whole container when one of them runs past the end of the file. Some
dumps end right after the last recorded segment and do not store the
version segment at all. The sce_module/libc.prx of PPSA15552 is one:
its last record, the 0x58-byte comment at 0x13b590, ends at 0x13b5e8,
which is the file size, so the 0x1a-byte PT_SCE_VERSION has no bytes
and the tool failed with "segment 12 does not fit the file" although
every load, dynamic and comment segment is complete.
A trailing segment that would run past the end of the file is now
emitted without file bytes, the same way as the PT_NOTE the container
leaves out. The relinker does not read PT_SCE_VERSION
(GuestImageReader skips it). Containers that store the version segment
unwrap byte for byte as before.
hardware_oracle_compare started compare_results.py in a new Python
process for every case, 77 interpreter starts. That takes 5-16 s
on the macOS relinker runners against the test's 20 s timeout, and the
x86_64 job timed out at 20.14 s in run 39103831688 on a pull request
that does not touch the oracle tools.
Call compare_results.main() in the test process with sys.argv patched
and stdout and stderr captured, and keep the identical and differing
cases as real subprocesses so the exit status of the script entry point
stays covered. The test drops to under 1 s.
The Windows job rejected any skip other than an agc* test, a "no display"
reason or a missing 120 Hz mode, so a non-agc test that skipped because the
runner has no usable Vulkan device failed the job. This contradicted the
job's own expected-skip message ("no display or Vulkan device"), the Linux
job, which already accepts that reason, and the Windows runner, which carries
no Vulkan ICD (the workflow sets ANYPS5_REQUIRE_VULKAN only on Linux).
Accept the "no usable Vulkan device" reason in the Windows job as well, and
keep feature-level device limitations unexpected there as before.
Co-Authored-By: Claude Opus 4.8 <[email protected]>