Memory-safe binary utilities in Rust
A product of Zainium Dynamics
GNU-binutils-compatible · Not a GNU project · GPLv3 · std + no_std
- Overview
- Features
- Tool map
- Status
- Quick start
- Build (unified std + no_std)
- Installation
- Usage by tool
- Multicall
- Kernel (
no_std) - Project layout
- Documentation index
- Compatibility policy
- Roadmap
- Development
- Licence & contact
OxideUtils is a modern, memory-safe suite of binary inspection and transform tools written in Rust, developed and owned by Zainium Dynamics.
It provides drop-in-oriented replacements for classic binutils-style programs (objdump, nm, readelf, size, ar, strings, strip, objcopy, addr2line) with:
- Safety — Rust ownership model; no C heap corruption class bugs in OxideUtils itself
- Familiar CLI — GNU-style flags where it matters for scripts and muscle memory
- Dual runtime — full
stdhost tools andno_std+alloccore for the Zainium kernel - Clear branding — every
--versionbanner says Zainium Dynamics, never “GNU”
| Vendor | Zainium Dynamics |
| Product | OxideUtils |
| Version | 0.1.0 |
| Licence | GNU GPLv3 only |
| Language | Rust 1.85+ / latest stable (edition 2024) |
| Contact | alizain@zainiumdynamics.tech |
| Web | zainiumdynamics.tech |
Legal / branding note
OxideUtils is not affiliated with, endorsed by, or part of the GNU Project or the Free Software Foundation.
GNU binutils may be used only as a behavioural reference for compatibility testing.
Copyright © 2026 Zainium Dynamics.
| Area | What you get |
|---|---|
| Object formats | ELF (primary), PE/COFF, Mach-O, Wasm, static ar archives |
| Disassembly | x86/x86_64 (iced-x86 gas) + AArch64 (bad64); other arches hex fallback |
| SFrame | Header + FDE/FRE walk (readelf/objdump --sframe) |
| Symbols | nm-style listing, filters, demangle (Rust + C++ on host) |
| ELF deep dive | Headers, sections, segments, dynamic, relocs, notes, build-id |
| DWARF | addr2line with functions, demangle, inlines, pretty print |
| Mutation | strip, objcopy (copy / strip / section filter / -O binary) |
| Kernel | Parse &[u8] without std — see docs/std-no-std.md |
| Unified build | make → host tools and no_std rlib in one command |
| Familiar name | OxideUtils binary | Role |
|---|---|---|
objdump |
oxide-objdump |
Headers, sections, symbols, hex, disassembly, archives |
nm |
oxide-nm |
Symbol table |
readelf |
oxide-readelf |
ELF structure dump |
size |
oxide-size |
Section size summary (Berkeley / SysV) |
ar |
oxide-ar |
Archive create / list / extract / ranlib |
strings |
oxide-strings |
Printable strings |
strip |
oxide-strip |
Remove symbols / debug sections |
objcopy |
oxide-objcopy |
Copy & transform objects |
addr2line |
oxide-addr2line |
Address → file:line / function |
as |
oxide-as |
x86_64 AT&T assembler (subset) → ET_REL ELF64 |
ld |
oxide-ld |
x86_64 ELF64 linker (subset) — static + dynamic (PLT/GOT) |
| multicall | oxideutils |
oxideutils <tool> … dispatcher |
Shared logic lives in oxideutils-core (library).
| Component | Status | Notes |
|---|---|---|
oxideutils-core |
Stable API (0.1) | std + no_std dual mode |
oxide-objdump |
Working | -h -f -t -s -d/-D, archives, iced-x86 disasm |
oxide-nm |
Working | -n -u -g -C -S (print-size, GNU) --size-sort -p -r … |
oxide-readelf |
Working | -h -S -l -s -d -r -n -V -u --got-contents --sframe -a |
oxide-size |
Working | Berkeley + SysV (-A) |
oxide-strings |
Working | -n, -t |
oxide-ar |
Working | t/p/x/r/q/d/s (rcs create + index) |
oxide-strip |
Working | ELF32/64 strip-all / debug / unneeded (verified) |
oxide-objcopy |
Working | strip, -j/-R, -O binary (atomic write) |
oxide-addr2line |
Working | DWARF; aligns with GNU on line info |
| Full GNU flag parity | In progress | See ROADMAP.md |
| AArch64 disasm | Working | bad64 (disasm-aarch64) |
| SFrame FRE walk | Working | v2/v3 default FDE |
oxide-as |
Minimal, verified | AT&T x86_64 + SSE/SSE2 float, SIB addressing, sym+N addends, .macro/.rept/.if, .equ/.set; errors (not silent NOP) on unknown instructions |
oxide-ld |
Minimal, verified | Static + dynamic (eager-bound PLT/GOT) linking, TLS (initial-exec), crt symbols (__init_array_start/…), -l/-L + archive/GROUP() resolution, real section headers/symtab; verified end-to-end against real glibc — see AUDIT-REPORT §8 for exact scope/gaps |
Measured, not claimed: docs/COMPATIBILITY.md —
34.3% of the real GNU binutils CLI flag surface across 9 tools is
covered today (ranges from 15.7% on objcopy to 69.2% on addr2line).
docs/BENCHMARKS.md — up to 13x faster and using
82% less memory on some operations (readelf -a, nm), reported
alongside a genuine weakness (objdump -d currently uses ~7.6x more
memory than GNU's). Both documents are reproducible from the commands
they show, not hand-picked numbers.
- Rust 1.85+ (MSRV) — recommend latest stable (
rustup update stable) - Cargo
- Optional: system
objdump/nmfor side-by-side comparison - Optional:
makefor unified build targets
This package often lives next to a binutils-2.42 source tree (reference only):
cd oxideutils# 1) Edit true/false switches
$EDITOR oxideutils.toml
# 2) Build
cargo build --release
# 3) Optional: see what was selected
cat target/oxideutils-build-plan.txt| TOML | Meaning |
|---|---|
[build] standalone = true |
One binary: oxideutils <tool> … |
[build] static = true |
Prefer static link (use musl target for fully static) |
[tools] objdump = false |
That tool bin is disabled until re-enabled |
Details: docs/building.md
./target/release/oxide-objdump -H
./target/release/oxide-objdump -h -f /bin/ls
./target/release/oxide-nm -n ./target/release/oxide-nm
./target/release/oxide-readelf -h /bin/ls
./target/release/oxideutils --helpExpected version style:
oxide-objdump (OxideUtils — Zainium Dynamics) 0.1.0
Copyright (C) 2026 Zainium Dynamics.
...
Project: https://zainiumdynamics.tech
cargo build --release # host tools (see oxideutils.toml)
cargo test --workspace
cargo clippy --workspace --all-targets| Artifact | Location |
|---|---|
| Tools | target/release/oxide-* and oxideutils |
| Build plan | target/oxideutils-build-plan.txt |
| Kernel rlib | target-nostd/… (only if you run the kernel cargo line) |
Kernel / no_std (optional, when [build] kernel = true):
cargo build -p oxideutils-core --release \
--no-default-features --features "alloc,disasm,kernel" \
--target-dir target-nostdDetails: docs/building.md · docs/std-no-std.md
# From source (host tools)
cargo install --path crates/oxide-objdump
# …or install each crate, or copy binaries from target/release/
# After: cargo build --release
cp target/release/oxide-* /usr/local/bin/ # adjust prefix as neededOptional symlinks for muscle memory (you choose names):
ln -s oxide-objdump ~/bin/objdump # only if you intentionally override PATHoxide-objdump -h -f FILE # section + file headers (GNU -h is sections; -H help)
oxide-objdump -t FILE # symbol table
oxide-objdump -s FILE # full section contents (hex)
oxide-objdump -d FILE # disassemble executable sections
oxide-objdump -D FILE # disassemble all sections
oxide-objdump -d --disassemble=main FILE
oxide-objdump -a FILE.a # archive headers (+ member dumps with other flags)| Common flags | Meaning |
|---|---|
-h |
Section headers |
-H / --help |
Help (GNU-style; not -h) |
-f |
File header |
-t / -T |
Symbols / dynamic symbols |
-s |
Full contents |
-d / -D |
Disassemble / all sections |
-j NAME |
Restrict to section |
-C |
Demangle |
-z |
Do not skip zero blocks |
--start-address / --stop-address |
Range |
oxide-nm FILE
oxide-nm -n FILE # numeric sort by address
oxide-nm -u FILE # undefined only
oxide-nm -g FILE # external only
oxide-nm -C FILE # demangle
oxide-nm -A FILE # print file nameoxide-readelf -h FILE # ELF header (-H is help)
oxide-readelf -S FILE # section headers
oxide-readelf -l FILE # program headers
oxide-readelf -s FILE # symbols
oxide-readelf -d FILE # dynamic
oxide-readelf -r FILE # relocations (named types + symbols)
oxide-readelf -n FILE # notes (build-id, …)
oxide-readelf -V FILE # symbol versioning (versym/verneed)
oxide-readelf --got-contents FILE # GOT dump (GNU 2.46)
oxide-readelf -u FILE # unwind (.eh_frame) summary
oxide-readelf --sframe FILE # SFrame header (if present)
oxide-readelf -a FILE # all of the above (except --sframe)oxide-size FILE
oxide-size -t FILE # with totals
oxide-size -A sysv FILE # SysV styleoxide-strings FILE
oxide-strings -n 8 FILE
oxide-strings -t x FILE # hex offsetsoxide-ar rcs libfoo.a a.o b.o # create + symbol index
oxide-ar t libfoo.a # list
oxide-ar p libfoo.a # print members to stdout
oxide-ar x libfoo.a # extract
oxide-ar d libfoo.a a.o # delete member
oxide-ar s libfoo.a # rebuild symbol indexoxide-strip -s FILE # strip all (default if no mode)
oxide-strip -g FILE # strip debug
oxide-strip --strip-unneeded FILE
oxide-strip -o OUT IN
oxide-strip -v FILEoxide-objcopy IN OUT
oxide-objcopy --strip-all IN OUT
oxide-objcopy -j .text -O binary IN OUT.bin
oxide-objcopy -R .comment IN OUToxide-addr2line -e BINARY -f -C -a 0x401234
oxide-addr2line -e BINARY -p -f -C 0x401234
oxide-addr2line -e BINARY -i -f 0x401234
# addresses from stdin if none given
echo 0x401234 | oxide-addr2line -e BINARY -f -CFull per-tool notes: docs/tools.md
oxideutils --help
oxideutils objdump -h /bin/ls
oxideutils nm -n ./a.outDispatches to oxide-* binaries on PATH (or same install prefix).
Zainium kernel builds are no_std. Depend on the core library only:
# kernel Cargo.toml
[dependencies]
oxideutils-core = {
path = "path/to/oxideutils/crates/oxideutils-core",
default-features = false,
features = ["alloc", "disasm", "kernel"],
}#![no_std]
extern crate alloc;
use oxideutils_core::format::object::OxideObject;
use oxideutils_core::format::elf::ElfFile;
fn inspect_module(name: &str, image: &[u8]) {
let obj = OxideObject::parse_bytes(name, image).expect("object");
let _sections = obj.section_views();
if let Ok(elf) = ElfFile::parse(name, image) {
let _ = elf.format_elf_header();
}
}| In kernel | On host |
|---|---|
Parse ELF/object from &[u8] |
Same + files |
| Symbols, archives (memory) | + CLI tools |
x86/x64 disasm (disasm) |
+ iced-x86 |
No std::fs / clap |
strip, objcopy, addr2line paths |
Guide: docs/kernel-integration.md
oxideutils/
├── README.md ← you are here
├── LICENSE ← GPLv3 only
├── ARCHITECTURE.md ← quick architecture overview
├── SECURITY.md ← security / vulnerability policy
├── Cargo.toml ← workspace
├── oxideutils.toml ← **only** config (build + tools + runtime)
├── build/oxide_build.rs ← build.rs shared logic (reads TOML)
├── scripts/build-all.sh ← optional wrapper → cargo build
├── .github/workflows/ ← CI + release-asset workflows
├── ROADMAP.md
├── CONTRIBUTING.md
├── docs/ ← full documentation set
│ ├── README.md ← docs index
│ ├── architecture.md
│ ├── building.md
│ ├── tools.md
│ ├── api-core.md
│ ├── std-no-std.md
│ ├── kernel-integration.md
│ ├── gnu-compatibility.md
│ ├── faq.md
│ └── man/ ← man page sources
├── crates/
│ ├── oxideutils-core/ ← shared library (std + no_std)
│ ├── oxide-objdump/
│ ├── oxide-nm/
│ ├── oxide-readelf/
│ ├── oxide-size/
│ ├── oxide-ar/
│ ├── oxide-strings/
│ ├── oxide-strip/
│ ├── oxide-objcopy/
│ └── oxide-addr2line/
├── bin/ ← reserved / multicall notes
└── tests/integration/
Architecture deep-dive: docs/architecture.md
| Document | Description |
|---|---|
| docs/README.md | Documentation hub |
| docs/architecture.md | Crates, layers, data flow |
| docs/building.md | Build via oxideutils.toml + cargo |
| docs/tools.md | Full CLI reference per tool |
| docs/api-core.md | oxideutils-core library API |
| docs/std-no-std.md | Dual-mode design |
| docs/kernel-integration.md | Using core in Zainium kernel |
| docs/gnu-compatibility.md | Compatibility policy vs GNU binutils 2.46.1 |
| docs/COMPATIBILITY.md | Measured CLI flag coverage % vs real GNU binutils (reproducible method) |
| docs/BENCHMARKS.md | Speed + memory benchmarks vs GNU binutils (wins and a documented weakness) |
| docs/AUDIT-REPORT-BINUTILS-2.46.1.md | Architecture audit + risk + roadmap |
| docs/faq.md | FAQ |
| docs/configuration.md | TOML config (true / false) |
| ROADMAP.md | 12-phase plan |
| CONTRIBUTING.md | How to contribute |
| docs/release-process.md | Tag + GitHub release checklist |
- Goal: behave like GNU binutils 2.46.1 for common flags and exit codes (
0/1/2). - Not a goal: byte-identical output in every corner case on day one.
- Branding: version strings always Zainium Dynamics / OxideUtils.
- Tree
packages/binutils-2.46.1(if present) is a reference source for tests, not linked code.
See docs/gnu-compatibility.md.
12 phases from foundation → 1.0 (disasm, full ar, packaging, fuzz, …).
Summary: ROADMAP.md.
Today (0.1.x): foundation, working tool suite, real disasm, strip/objcopy/addr2line, unified std/no_std build.
We use TOML only — not .configuration / ini. Values are mostly true / false.
# project / cwd
cp oxideutils.toml ./oxideutils.toml # already in tree — edit booleans
# or user global
mkdir -p ~/.config/oxideutils
cp oxideutils.toml ~/.config/oxideutils/config.toml
# show effective config
./target/debug/oxide-objdump --print-config[oxideutils]
gnu_compatible = true
json = false
demangle = false
[color]
enabled = true
auto = true
always = false
[disasm]
show_raw_insn = true
disassemble_zeroes = falseFull schema: docs/configuration.md · template: oxideutils.toml
cargo fmt
cargo clippy --workspace --all-targets
cargo test --workspace
cargo check --workspace- Licence of contributions: GPLv3 only (Zainium Dynamics product)
- Security issues: SECURITY.md
- Details: CONTRIBUTING.md
Copyright (C) 2026 Zainium Dynamics
Licence: GNU General Public License v3.0 only (see LICENSE)
Web: https://zainiumdynamics.tech
Email: alizain@zainiumdynamics.tech
OxideUtils and Zainium Dynamics are product/vendor names of Zainium Dynamics.
Built with Rust · Shipped under GPLv3 · Powered by Zainium Dynamics