Replace patchelf crack with Freeloader LD_PRELOAD approach

- Multi-stage Dockerfile: discover patterns from PMS binary (capstone),
  compile .so with zig (musl), layer onto lscr.io/linuxserver/plex
- Uses LD_PRELOAD instead of patchelf (which corrupts Plex's musl loader)
- Auto-discovery: broad structural patterns with string-anchored fallback
  (//feature) and relationship-based fallback (BITSET_REF within BS_INIT)
- hook.cpp uses __has_include for generated patterns with hardcoded fallbacks
- Custom wrapper.sh (no traffic_logger preload)
- Vendored Freeloader source (github.com/authrequest/Freeloader, AGPL-3.0)
- Removed stale plexmediaserver_crack.so binary
- Supports Plex 1.43.3+ (verified against 1.43.2 and 1.43.3)
This commit is contained in:
benjamin committed 2026-08-19 22:33:42 +02:00
1 parent 4399a8288d
commit 72f4661bdc
72 files changed
+77927 -17

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-or-later
# Launcher for plexmediaserver that LD_PRELOADs the (musl-built) crack into the
# Plex Media Server process only. LD_PRELOAD must NOT be set via the unit's
# Environment= because ExecStart is run by /bin/sh (glibc) first, and a musl .so
# cannot load into a glibc process. Setting it here, after this shell is already
# running, means only the final `exec` of the (musl) Plex binary is preloaded.
#
# The three PLEX_MEDIA_SERVER_INFO_* exports mirror the stock unit's ExecStart.
export PLEX_MEDIA_SERVER_INFO_VENDOR="$(grep ^NAME= /etc/os-release | awk -F= '{print $2}' | tr -d '"')"
export PLEX_MEDIA_SERVER_INFO_MODEL="$(uname -m)"
export PLEX_MEDIA_SERVER_INFO_PLATFORM_VERSION="$(grep ^VERSION= /etc/os-release | awk -F= '{print $2}' | tr -d '"')"
export LD_PRELOAD="/usr/lib/plexmediaserver/lib/plexmediaserver_crack.so"
exec "/usr/lib/plexmediaserver/Plex Media Server"