libdd-libunwind-sys 1.0.2

Rust bindings for using unwind library inside libdatadog
Documentation

libdatadog-libunwind

Rust bindings for libunwind, targeting Linux on x86_64 and aarch64.

libunwind is vendored directly in this repository under libdd-libunwind-sys/libunwind/. Vendoring is intentional: it eliminates the runtime dependency on an external source and protects against supply chain attacks.

Crates

Crate Description
libdd-libunwind-sys Low-level FFI bindings and build logic

Bindings

The FFI bindings in libdd-libunwind-sys/src/ are hand-written (not generated by bindgen). Each supported architecture has its own module:

  • libunwind_x86_64.rs — bindings for x86_64
  • libunwind_aarch64.rs — bindings for aarch64

The bindings expose a subset of the libunwind API: unw_init_local2, unw_step, unw_get_reg, unw_get_proc_name, and unw_backtrace2.

When adding or updating bindings, edit the appropriate architecture file directly.

Build

Prerequisites

The build script compiles libunwind from source and requires the following tools on the host:

Tool Purpose Install (Debian/Ubuntu)
make Drives the build apt install make
gcc or clang C/C++ compiler for libunwind apt install gcc

Install all at once:

apt install make gcc

Building

cargo build

Supported targets

Target Status
x86_64-unknown-linux-gnu Supported
aarch64-unknown-linux-gnu Supported

All other targets produce an empty crate (the build script and bindings are gated on target_os = "linux").

How to publish

  1. Bump the version in Cargo.toml and merge the change to main.

  2. Tag the release commit on main:

    git checkout main && git pull
    git tag v<version>          # e.g. git tag v1.1.0
    git push origin v<version>
    
  3. Wait for CI — the tag push triggers a pipeline that runs all four build+test configurations (CentOS and Alpine, x86_64 and aarch64).

  4. Trigger the publish job — once all test jobs are green, a manual publish_crate job appears in the pipeline. Click ▶ to publish to crates.io.

The publish job validates that the tag version matches Cargo.toml, that the tagged commit is on main, and does a --dry-run before the real publish. If the version is already on crates.io the job exits cleanly without error.