v0.7.0
xollvm — v0.7.0
Platforms
| Artifact | OS |
|---|---|
xollvm-linux-Release.tar.zst |
Linux x86_64 (ubuntu-24.04) |
xollvm-windows-Release.7z |
Windows x64 (MSVC 2022) |
Obfuscator-linux-x64.so |
Linux x86_64 — loadable -fpass-plugin |
Cross-compilation targets
Built with -DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;RISCV" — the following backends are included:
- X86 — x86 / x86_64
- AArch64 — ARM 64-bit (Apple Silicon, Linux ARM64)
- ARM — ARM 32-bit
- RISCV — RISC-V 32/64-bit
Highlights
New module-only obfuscation pass, fmerge, collapses several annotated functions into a
single super-function whose hidden selector parameter picks which original body runs. This
is not LLVM's MergeFunctions (identical-function folding for size) — fmerge deliberately
merges dissimilar functions to destroy call-graph boundaries, running before the function
pipeline so flattening / bcf / mba / vm all operate on the merged result. Opt-in,
annotation-driven, consistent with every other xollvm pass.
Added
fmergefunction-merging pass — per-function opt-in via
__attribute__((annotate("obf: fmerge(group=...)"))); functions sharing agroup=label
merge into one super-function, all direct call sites rewritten to the merged callee with
the appropriate selector.- Selector laundering (
launderSel=1) — call-site selectors are read from a mutable
per-group global (@__obf_fmsel_<label>) via a volatile load instead of an inline constant,
so constant-propagation / symbolic devirtualization can't recover which behavior a call
runs. Cross-group merged→merged calls already rewrite correctly.
Changed
docs/obf_annotations.hcheat-sheet extended withconstencandfmergeannotation
examples; corrected the sample path referenced fromREADME.md.
Tests
- New
fmergecase/gate pairs (utils/cases/fmerge.py,utils/gates/fmerge.py) plus
three template programs (basic,combo,thunk) exercising group merging and selector
rewriting.
Full diff: e3ced21…7457f2d (main) — 19 files, +1899 / −11.