RepoPilot

wild-linker/wild

A very fast linker for Linux

Healthy

Healthy across the board

HealthyDependency

Permissive license, no critical CVEs, actively maintained — safe to depend on.

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Last commit today
  • 14 active contributors
  • Distributed ownership (top contributor 37% of recent commits)
  • Apache-2.0 licensed
  • CI configured
  • Tests present

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/wild-linker/wild)](https://repopilot.app/r/wild-linker/wild)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/wild-linker/wild on X, Slack, or LinkedIn.

Ask AI about wild-linker/wild

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: wild-linker/wild

Generated by RepoPilot · 2026-06-24 · Source

🎯Verdict

GO — Healthy across the board

  • Last commit today
  • 14 active contributors
  • Distributed ownership (top contributor 37% of recent commits)
  • Apache-2.0 licensed
  • CI configured
  • Tests present

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

Wild is a drop-in replacement linker for Linux that prioritizes speed for iterative development cycles, written in Rust with ~2.4M LOC. It aims to eventually support incremental linking but already achieves significant performance gains over GNU ld and lld by optimizing the linking phase without requiring code changes. It integrates via --ld-path=wild or -fuse-ld=wild flags with clang/gcc and is compatible with both Rust and C/C++ projects. Monorepo structure: /wild is the main linker binary, /libwild is the core linking library, /linker-utils provides shared utilities, /linker-diff enables comparing output binaries, /linker-layout and /linker-trace are analysis tools, /benchmarks/runner measures performance. Heavy use of workspace dependencies (Cargo.toml) for consistent versions across all crates.

👥Who it's for

Systems engineers, Rust developers iterating on large projects (Bevy, Chrome, rust-analyzer benchmarked), and build system maintainers who need faster link times without modifying source code. Primary users are developers building on x86_64-unknown-linux-gnu, with expanding support for RISC-V, LoongArch64, and WebAssembly platforms.

🌱Maturity & risk

Production-ready and actively maintained at v0.8.0 (see Cargo.toml). The project has comprehensive CI/CD (.github/workflows/ with ci.yml, release.yml, external_tests.yml), extensive documentation (DESIGN.md, BENCHMARKING.md, CONTRIBUTING.md), and structured release process (RELEASING.md). Recent activity visible through multiple cargo configs for cross-compilation and active benchmark tracking suggests ongoing optimization focus.

Moderate risk: linkers are critical infrastructure and bugs can silently produce incorrect binaries. The monorepo spans 5 core crates (wild, libwild, linker-diff, linker-layout, linker-trace) with complex ELF/object file manipulation (gimli, object crates at v0.39.1), requiring careful testing. Single main repository with distributed maintainers; external_tests.yml suggests integration testing against real projects (Chromium, Bevy) mitigates this.

Active areas of work

Active development on cross-platform support (riscv, loongarch64, wasm32 configs in .cargo/), performance benchmarking (benchmarks/images/lemp9/ with SVG comparisons), and external project integration testing. The CHANGELOG.md and version bump to 0.8.0 indicate recent releases; promote.yml and release.yml workflows suggest automated release cadence.

🚀Get running

Clone the repo, build with Cargo: git clone https://github.com/wild-linker/wild.git && cd wild && cargo build --release -p wild. Install via cargo install --locked --bin wild --git https://github.com/wild-linker/wild.git wild-linker or download binaries from releases page. Verify installation with wild --version.

Daily commands: For development: cargo build --release -p wild. For testing: cargo test --workspace or cargo nextest run (see .config/nextest.toml). To use as linker with Rust: add to ~/.cargo/config.toml [target.x86_64-unknown-linux-gnu] with linker = "clang" and rustflags = ["-Clink-arg=--ld-path=$(which wild)"]. Verify with readelf -l ./binary | grep interpreter.

🗺️Map of the codebase

  • wild/Cargo.toml — Workspace root configuration defining all member crates and shared dependencies; essential for understanding the project structure and build process.
  • wild/src/main.rs — Entry point of the wild linker binary; implements the command-line interface and orchestrates the linking process.
  • libwild/src/lib.rs — Core library API for the linker; contains the public interface and main linking logic that all other components depend on.
  • DESIGN.md — Architecture and design rationale document; explains key decisions and data structures for understanding how the linker works.
  • linker-utils/src/lib.rs — Shared utilities and abstractions across the linker codebase; provides common parsing, ELF handling, and helper functions.
  • LINKER_SCRIPT_SUPPORT.md — Specification for linker script support; defines the scope and implementation details of script parsing and execution.
  • .github/workflows/ci.yml — Continuous integration pipeline definition; shows how the project is tested across architectures and configurations.

🧩Components & responsibilities

  • libwild (core library) (Rust, ELF binary format) — Orchestrates the end-to-end linking process including parsing inputs, symbol resolution, layout, relocation, and ELF emission
    • Failure mode: Invalid relocations, incorrect symbol binding, or malformed output binary if layout/relocation logic is incorrect
  • linker-utils (shared utilities) (Rust, ELF standard) — Provides low-level ELF parsing, symbol table management, architecture-specific relocation handling, and file I/O primitives
    • Failure mode: Parser corruption of ELF structures or incomplete relocation type support breaks linking for specific architectures
  • wild binary (CLI) (Rust, clap or similar arg parsing) — Parses command-line arguments, invokes libwild, and handles user-facing error reporting and logging
    • Failure mode: Incorrect argument interpretation or missing CLI flags prevents users from controlling linker behavior
  • Linker analysis tools (linker-diff, linker-layout, linker-trace) (Rust, libwild/linker-utils) — Diagnostic utilities for comparing linker outputs, visualizing binary layout, and tracing linking decisions
    • Failure mode: Inaccurate analysis misleads developers debugging linking issues

🔀Data flow

  • User/Compilerwild CLI — Object files, libraries, linker script, and command-line options
  • wild CLIlibwild Parser — Input file paths and linker script paths
  • libwild Parserlibwild Resolver — Parsed ELF objects, sections, and symbols
  • libwild Resolverlibwild Linker Engine — Global symbol table with resolved definitions

🛠️How to make changes

Add support for a new ELF architecture

  1. Define the new architecture enum variant and relocation types (linker-utils/src/lib.rs)
  2. Implement relocation handling and architecture-specific logic (libwild/src/lib.rs)
  3. Add CI test matrix entry in .github/workflows/ci.yml (.github/workflows/ci.yml)
  4. Create test binaries and benchmarks for the new architecture (benchmarks/ryzen-9955hx.toml)

Implement a new linker script directive

  1. Document the directive syntax and semantics in LINKER_SCRIPT_SUPPORT.md (LINKER_SCRIPT_SUPPORT.md)
  2. Add parser rules and AST nodes to the script parsing module (libwild/src/lib.rs)
  3. Implement the semantic evaluation and section layout logic (libwild/src/lib.rs)
  4. Add test cases validating the directive behavior (wild/tests)

Add a new analysis or debugging tool

  1. Create a new binary crate in the workspace (Cargo.toml)
  2. Import and use libwild and linker-utils for core functionality (linker-diff/src/main.rs)
  3. Implement CLI argument parsing and tool logic (linker-trace/src/main.rs)
  4. Add the tool binary name to Cargo.toml members (Cargo.toml)

🔧Why these technologies

  • Rust — Memory-safe systems language enabling high performance without garbage collection; ideal for a linker that must handle raw ELF binary manipulation
  • Cargo workspace (multi-crate) — Separates concerns into focused crates (libwild library, CLI, utilities, analysis tools) enabling code reuse and parallel development
  • ELF binary format parsing — Native Linux executable format; direct parsing avoids abstraction overhead for the performance-critical linking hot path

⚖️Trade-offs already made

  • Single-threaded linking (currently)

    • Why: Simpler correctness model and easier debugging; avoids synchronization overhead for initial version
    • Consequence: Incremental threading in future versions could further boost performance but adds complexity
  • In-memory ELF construction before writing

    • Why: Enables two-pass linking (layout computation then relocation application) and simplifies verification
    • Consequence: Higher memory usage compared to streaming linkers; trade-off acceptable for typical binary sizes
  • Linux-only scope

    • Why: Focuses engineering effort on one target OS with simpler ABI/relocation rules than macOS or Windows
    • Consequence: Not portable to other Unix variants or Windows; limits user base but maximizes performance for target platform

🚫Non-goals (don't propose these)

  • Cross-platform linker (explicit Linux-only target)
  • Real-time incremental linking (future goal, not yet implemented)
  • Full GNU linker script compatibility (selective subset supported)
  • Plugin/extension system for custom relocation types
  • Windows PE or macOS Mach-O format support
  • Debugger integration or debug symbol manipulation

🪤Traps & gotchas

  1. Linker is invoked by clang/gcc, not directly by rustc; path must be absolute or resolvable via $PATH (symlink ld.wild in standard location). 2) MSRV is Rust 1.94 (workspace.package.rust-version); older toolchains will fail silently. 3) ELF relocations and section layout are architecture-specific; changes to libwild/src/ must be tested on all platforms in .cargo/config.toml.cross-* (riscv, loongarch64, wasm32). 4) Jobserver integration (jobserver crate) means wild respects parallel link jobs set by make/cargo; misconfiguration can cause hangs. 5) No incremental linking yet (noted in README); full re-links always occur. 6) Debug info handling (gimli) is complex; DWARF corruption is silent unless linker-diff catches it.

🏗️Architecture

💡Concepts to learn

  • ELF (Executable and Linkable Format) — Wild consumes and produces ELF binaries; understanding sections, segments, symbols, and relocations is essential for debugging any linking issue
  • Relocations and Symbol Resolution — Core linker function; wild must resolve undefined symbols, apply relocations (R_X86_64_* types, etc.), and handle weak symbols—bugs here produce silently broken binaries
  • DWARF Debug Information — Wild preserves debug info (gimli crate) during linking; incorrect DWARF offsets will break debuggers without linker errors
  • Memory-Mapped I/O (memmap2) — Wild uses memmap2 for efficient bulk file reading/writing; understanding mmap trade-offs (page alignment, lazy faults) is key to performance tuning
  • Parallel Graph Coloring and Section Layout — Wild's speed comes from parallel section layout and concurrent processing; the rayon + crossbeam integration enables lock-free section arrangement
  • Hash-Based Content Addressing (blake3) — Wild uses blake3 checksums to detect changes and potentially enable incremental linking in future; understanding content hashing vs. timestamp-based invalidation is crucial
  • Cross-Architecture Compilation (RISC-V, LoongArch64, WebAssembly) — Wild targets multiple ISAs with architecture-specific relocation rules; modifying relocation logic requires testing against .cargo/config.toml.cross-* configurations
  • rui314/mold — Direct competitor; mold is a fast linker written in C++ that inspired wild's speed-focused design; understanding mold's approach helps contextualize wild's Rust-based optimizations
  • llvm/llvm-project — lld is the LLVM linker that wild benchmarks against; wild aims to be faster than lld on iterative builds
  • wild-linker/action — Official GitHub Action for using wild in CI pipelines; companion repo showing integration patterns
  • rust-lang/rust — Wild is used as an alternative linker for rustc builds via rustflags; tight integration with Rust's build pipeline
  • torvalds/linux — Wild targets Linux ELF binaries exclusively; Linux kernel's ELF ABI and syscalls are foundational to its operation

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive integration tests for linker script support

The repo has LINKER_SCRIPT_SUPPORT.md documentation but no visible dedicated test suite in the file structure. Given that linker scripts are critical for embedded systems and cross-platform builds (evidenced by .cargo/config.toml.cross-* files for loongarch64, riscv, wasm32), adding integration tests would catch regressions and validate script parsing/execution across architectures.

  • [ ] Create tests/linker_scripts/ directory with subdirectories for different architectures (arm, riscv, loongarch64, x86_64)
  • [ ] Add test cases covering: basic script parsing, memory region definitions, section placement, and symbol resolution as documented in LINKER_SCRIPT_SUPPORT.md
  • [ ] Integrate tests into .github/workflows/ci.yml and .config/nextest.toml configuration
  • [ ] Reference LINKER_SCRIPT_SUPPORT.md examples in test cases to ensure documentation accuracy

Expand external_tests.yml workflow to include WebAssembly and RISC-V targets

The .github/workflows/external_tests.yml exists but the file structure shows .cargo/config.toml.cross-wasm32p1 and .cargo/config.toml.cross-riscv, indicating these targets are supported but may not be tested in CI. This creates a blind spot for target-specific linker issues in non-x86 architectures that are increasingly important for IoT and embedded Rust.

  • [ ] Add build matrix entries to .github/workflows/external_tests.yml for wasm32-unknown-unknown and riscv64imac-unknown-none-elf targets
  • [ ] Reference the existing .cargo/config.toml.cross-wasm32p1 and .cargo/config.toml.cross-riscv configurations in the workflow
  • [ ] Test linking of real-world projects from benchmarks/ for these targets (or create minimal test binaries)
  • [ ] Document expected behavior differences in DESIGN.md or create TARGET_SUPPORT.md

Add memory profiling and regression detection to benchmarks workflow

The repo has extensive benchmark images in benchmarks/images/ (memory.svg and time.svg for multiple platforms: lemp9, raspberrypi, ryzen-9955hx) but no automated regression detection in CI. With dhat dependency already present in workspace, adding automated memory profiling would prevent performance regressions before release, especially critical for a linker where memory usage impacts embedded systems.

  • [ ] Create .github/workflows/benchmark-regression.yml that runs on PRs using the dhat crate (already in workspace.dependencies)
  • [ ] Integrate with benchmarks/runner to generate memory baseline comparisons between main and feature branches
  • [ ] Store baseline results and fail workflow if memory regression exceeds threshold (e.g., >10%)
  • [ ] Update BENCHMARKING.md with instructions for local regression testing and CI interpretation

🌿Good first issues

  • Add integration test in external_tests.yml for a new open-source project (e.g., ripgrep, tokio); requires running wild as linker and comparing binary size/correctness against mold
  • Expand BENCHMARKING.md with step-by-step reproduction instructions for the benchmarks/images/lemp9/ SVGs; clarify which libc versions / CPU flags were used to generate them
  • Write architecture-specific documentation in docs/ explaining ELF relocation handling for RISC-V and LoongArch64 (see .cargo/config.toml.cross-*); currently only x86_64 is well-documented

Top contributors

Click to expand

📝Recent commits

Click to expand
  • da8ef65 — fix: Make --whole-archive work with linker plugins (#1900) (davidlattimore)
  • 95259ad — ci: run tests on Mach-O (skip ELF tests), reorder CI jobs (#1895) (marxin)
  • e5f7852 — ci: fix cache step: /bin/tar: unrecognized option: posix (#1896) (marxin)
  • 0d3f7e4 — test: Test handling of empty aligned section (#1894) (davidlattimore)
  • 32cd4bc — chore: Add job to update homebrew tap on release (#1890) (davidlattimore)
  • 2942b46 — chore: Update repo owner references following move (#1893) (davidlattimore)
  • 424cbdd — perf: Fill padding bytes once instead of 3 times (#1889) (davidlattimore)
  • 7650fb0 — port(MachO): support symbol table (#1888) (marxin)
  • f559f56 — fix: only keep RELRO_PADDING section when relro is enabled (#1892) (TechnoPorg)
  • 4ed4a8b — chore: Use hashbrown HashSet instead of std (#1891) (lapla-cogito)

🔒Security observations

The Wild linker project demonstrates a generally secure posture with no critical or high-severity vulnerabilities identified. The codebase is a Rust-based system tool with proper dependency management via Cargo.lock. Primary concerns are configuration inconsistencies (incomplete dependency definitions, unusual version numbers) that appear to be documentation or configuration errors rather than security vulnerabilities. The project uses well-maintained dependencies and includes comprehensive CI/CD workflows. Recommendations focus on ensuring dependency scanning is implemented, correcting configuration inconsistencies, and documenting non-standard choices. No hardcoded secrets, injection vectors, or infrastructure misconfigurations were detected in the provided materials.

  • Low · Incomplete Dependency Version in Workspace Configuration — Cargo.toml - workspace.dependencies section, os_info entry. The workspace.dependencies section in Cargo.toml appears to have an incomplete entry for 'os_info' where the version specification is cut off mid-definition. This could indicate configuration issues or incomplete dependency management. Fix: Complete the version specification for the os_info dependency. Verify all workspace dependencies are properly defined and pinned to secure versions.
  • Low · Edition 2024 Not Yet Stable — Cargo.toml - workspace.package section. The Cargo.toml specifies edition = '2024', which is not yet a stable Rust edition. This could cause build issues or unexpected behavior depending on the Rust version used. Fix: Verify that the development environment supports edition 2024. Consider using a stable edition (2021) unless 2024 is intentionally required for specific features.
  • Low · Minimum Rust Version May Be Too Permissive — Cargo.toml - workspace.package section. The rust-version = '1.94' requirement is unusually high and suggests this might be a typo or misconfiguration, as Rust hasn't released version 1.94 yet. This could be 1.70 or similar, which if incorrect, may allow use with incompatible compiler versions. Fix: Verify and correct the rust-version specification. Ensure it reflects the actual minimum supported Rust version (MSRV) for the project.
  • Low · No SBOM or Dependency Lock Verification Process Visible — Repository structure - CI/CD workflows. While Cargo.lock exists, there is no visible evidence of dependency scanning, SBOM generation, or automated security vulnerability checks in the CI/CD configuration for dependencies. Fix: Implement automated dependency scanning using tools like cargo-audit or cargo-deny in CI/CD pipelines. Generate and maintain SBOMs for releases.
  • Low · Zlib-rs Feature Usage Without Verification — Cargo.toml - flate2 dependency. The flate2 dependency uses the 'zlib-rs' feature instead of the default zlib-ng or system zlib. While not inherently insecure, this choice should be intentional and documented. Fix: Document why zlib-rs was chosen over alternatives. Ensure this is a deliberate security/performance decision and monitor for security updates.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/wild-linker/wild shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live wild-linker/wild repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/wild-linker/wild.

What it runs against: a local clone of wild-linker/wild — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in wild-linker/wild | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>wild-linker/wild</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of wild-linker/wild. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/wild-linker/wild.git
#   cd wild
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of wild-linker/wild and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "wild-linker/wild(\\.git)?\\b" \\
  && ok "origin remote is wild-linker/wild" \\
  || miss "origin remote is not wild-linker/wild (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "wild/Cargo.toml" \\
  && ok "wild/Cargo.toml" \\
  || miss "missing critical file: wild/Cargo.toml"
test -f "wild/src/main.rs" \\
  && ok "wild/src/main.rs" \\
  || miss "missing critical file: wild/src/main.rs"
test -f "libwild/src/lib.rs" \\
  && ok "libwild/src/lib.rs" \\
  || miss "missing critical file: libwild/src/lib.rs"
test -f "DESIGN.md" \\
  && ok "DESIGN.md" \\
  || miss "missing critical file: DESIGN.md"
test -f "linker-utils/src/lib.rs" \\
  && ok "linker-utils/src/lib.rs" \\
  || miss "missing critical file: linker-utils/src/lib.rs"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/wild-linker/wild"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/wild-linker/wild"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>