A library to compile USDT probes into a Rust library

Overview


sonde

crates.io documentation

sonde is a library to compile USDT probes into a Rust library, and to generate a friendly Rust idiomatic API around it.

Userland Statically Defined Tracing probes (USDT for short) is a technique inherited from DTrace (see OpenDtrace to learn more). It allows user to define statically tracing probes in their own application; while they are traditionally declared in the kernel.

USDT probes can be naturally consumed with DTrace, but also with eBPF (bcc, bpftrace…).

Lightweight probes by design

USDT probes for libraries and executables are defined in an ELF section in the corresponding application binary. A probe is translated into a nop instruction, and its metadata are stored in the ELF's .note.stapstd section. When registering a probe, USDT tool (like dtrace, bcc, bpftrace etc.) will read the ELF section, and instrument the instruction from nop to breakpoint, and after that, the attached tracing event is run. After deregistering the probe, USDT will restore the nop instruction from breakpoint.

The overhead of using USDT probes is almost zero when no tool is listening the probes, otherwise a tiny overhead can be noticed.

The workflow

Everything is automated. dtrace must be present on the system at compile-time though. Let's imagine the following sonde-test fictitious project:

/sonde-test
├── src
│  ├── main.rs
├── build.rs
├── Cargo.toml
├── provider.d

Start with the obvious thing: let's add the following lines to the Cargo.toml file:

[build-dependencies]
sonde = "0.1"

Now, let's see what is in the provider.d file. It's not a sonde specific vendor format, it's the canonical way to declare USDT probes (see Scripting)!

provider hello {
    probe world(); 
    probe you(char*, int);
};

It describes a probe provider, hello, with two probes:

  1. world,
  2. you with 2 arguments: char* and int.

Be careful, D types aren't the same as C types, even if they look like the same.

At this step, one needs to play with dtrace -s to compile the probes into systemtrap headers or an object file, but forget about that, sonde got you covered. Let's see what's in the build.rs script:

fn main() {
    sonde::Builder::new()
        .file("./provider.d")
        .compile();
}

That's all. That's the minimum one needs to write to make it work.

Ultimately, we want to fire this probe from our code. Let's see what's inside src/main.rs then:

// Include the friendly Rust idiomatic API automatically generated by
// `sonde`, inside a dedicated module, e.g. `tracing`.
mod tracing {
    include!(env!("SONDE_RUST_API_FILE"));
}

fn main() {
    tracing::hello::world();

    println!("Hello, World!");
}

What can we see here? The tracing module contains a hello module, corresponding to the hello provider. And this module contains a world function, corresponding to the world probe. Nice!

See what's contained by the file pointed by SONDE_RUST_API_FILE:
/// Bindings from Rust to the C FFI small library that calls the
/// probes.

use std::os::raw::*;

extern "C" {
    #[doc(hidden)]
    fn hello_probe_world();

    #[doc(hidden)]
    fn hello_probe_you(arg0: *mut c_char, arg1: c_int);
}

/// Probes for the `hello` provider.
pub mod r#hello {
    use std::os::raw::*;

    /// Call the `world` probe of the `hello` provider.
    pub fn r#world() {
        unsafe { super::hello_probe_world() };
    }

    /// Call the `you` probe of the `hello` provider.
    pub fn r#you(arg0: *mut c_char, arg1: c_int) {
        unsafe { super::hello_probe_you(arg0, arg1) };
    }
}

Let's see it in action:

$ cargo build --release
$ sudo dtrace -l -c ./target/release/sonde-test | rg sonde-test
123456 hello98765 sonde-test hello_probe_world world

Neat! Our sonde-test binary contains a world probe from the hello provider!

$ # Let's execute `sonde-test` as usual.
$ ./target/release/sonde-test
Hello, World!
$
$ # Now, let's execute it with `dtrace` (or any other tracing tool).
$ # Let's listen the `world` probe and prints `gotcha!` when it's executed.
$ sudo dtrace -n 'hello*:::world { printf("gotcha!\n"); }' -q -c ./target/release/sonde-test
Hello, World!
gotcha!

Eh, it works! Let's try with the you probe now:

fn main() {
    {
        let who = std::ffi::CString::new("Gordon").unwrap();
        tracing::hello::you(who.as_ptr() as *mut _, who.as_bytes().len() as _);
    }

    println!("Hello, World!");
}

Time to show off:

$ cargo build --release
$ sudo dtrace -n 'hello*:::you { printf("who=`%s`\n", stringof(copyin(arg0, arg1))); }' -q -c ./target/release/sonde-test
Hello, World!
who=`Gordon`

Successfully reading a string from Rust inside a USDT probe!

With sonde, you can add as many probes inside your Rust library or binary as you need by simply editing your canonical .d file.

Bonus: sonde generates documentation for your probes automatically. Run cargo doc --open to check.

Possible limitations

Types

DTrace has its own type system (close to C) (see Data Types and Sizes). sonde tries to map it to the Rust system as much as possible, but it's possible that some types could not match. The following types are supported:

Type Name in D Type Name in Rust
char std::os::raw::c_char
short std::os::raw::c_short
int std::os::raw::c_int
long std::os::raw::c_long
long long std::os::raw::c_longlong
int8_t i8
int16_t i16
int32_t i32
int64_t i64
intptr_t isize
uint8_t u8
uint16_t u16
uint32_t u32
uint64_t u64
uintptr_t usize
float std::os::raw::c_float
double std::os::raw::c_double
T* *mut T
T** *mut *mut T (and so on)

Parser

The .d files are parsed by sonde. For the moment, only the provider blocks are parsed, which declare the probes. All the pragma (#pragma) directives are ignored for the moment.

License

BSD-3-Clause, see LICENSE.md.

You might also like...
Creates a DLL that runs a payload once injected into a process.

Educational purposes only Don't use this project maliciously. Prerequisites Install rust Install windows toolchain Setup Run cargo run --bin builder -

Renders typst code blocks in Obsidian into images using Typst through the power of WASM!
Renders typst code blocks in Obsidian into images using Typst through the power of WASM!

Obsidian Typst Renders typst code blocks into images using Typst through the power of WASM! This is still very much in development, so suggestions/bug

A swc plugin that automatically converts React component libraries into "React Client Component"

A swc plugin that automatically converts React component libraries into "React Client Component". For example, you can automatically convert components from @mui into "React Client Component" without having to wrap a component that uses "use client".

The lambda-chaos-extension allows you to inject faults into Lambda functions without modifying the function code.
The lambda-chaos-extension allows you to inject faults into Lambda functions without modifying the function code.

Chaos Extension - Seamless, Universal & Lightning-Fast The lambda-chaos-extension allows you to inject faults into Lambda functions without modifying

A tool that transforms an IMVU badge canvas into a single cohesive image.

IMVU Badge Canvas Image Generator This tool fetches an IMVU user's badge canvas and creates a single unified image representation of it. Instead of ha

A Rust library for calculating sun positions

sun A rust port of the JS library suncalc. Install Add the following to your Cargo.toml [dependencies] sun = "0.2" Usage pub fn main() { let unixti

A cross-platform serial port library in Rust.

Introduction serialport-rs is a general-purpose cross-platform serial port library for Rust. It provides a blocking I/O interface and port enumeration

A high level diffing library for rust based on diffs
A high level diffing library for rust based on diffs

Similar: A Diffing Library Similar is a dependency free crate for Rust that implements different diffing algorithms and high level interfaces for it.

A reactive DOM library for Rust in WASM

maple A VDOM-less web library with fine-grained reactivity. Getting started The recommended build tool is Trunk. Start by adding maple-core to your Ca

Comments
  • Handle semaphore compilation / dtrace on linux

    Handle semaphore compilation / dtrace on linux

    I'm not sure exactly what the differences are between the system where this was tested and mine, I ran into the problem described in issue #1 . The build failed first because of an -arch dtrace argument not available on my system (comes from systemtap 4.5). This was made an optional argument (default off). Then it failed because of the semaphore file not being linked in. This was solved by adding an option to either compile without the semaphore object file (original behaviour, default), or to explicitly generate it (option).

    If this doesn't play well with other systems this library was tested on, I'm happy to put some cfg guards around the functionality.

    Fixes https://github.com/wasmerio/sonde-rs/issues/1

    opened by viraptor 7
  • example fails to compile on ubuntu / rustc 1.53.0

    example fails to compile on ubuntu / rustc 1.53.0

    Hi,

    I tried to run the example code and it fails to compile. I use the dtrace provided by systemtap-sdt-dev on Ubuntu and rust 1.53.0.

    The error is the following:

      = note: /usr/bin/ld: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/libsonde-ffi.a(sonde-ffiU70Emz.o): in function `hello_probe_you':
              /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:9: undefined reference to `HELLO_YOU'
              collect2: error: ld returned 1 exit status
    

    or in full:

    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_world’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:5:5: warning: implicit declaration of function ‘HELLO_WORLD’ [-Wimplicit-function-declaration]
    warning:     5 |     HELLO_WORLD();
    warning:       |     ^~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_you’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:9:5: warning: implicit declaration of function ‘HELLO_YOU’ [-Wimplicit-function-declaration]
    warning:     9 |     HELLO_YOU(arg0, arg1);
    warning:       |     ^~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_me’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:13:5: warning: implicit declaration of function ‘HELLO_ME’ [-Wimplicit-function-declaration]
    warning:    13 |     HELLO_ME();
    warning:       |     ^~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_you_me’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:17:5: warning: implicit declaration of function ‘HELLO_YOU_ME’ [-Wimplicit-function-declaration]
    warning:    17 |     HELLO_YOU_ME();
    warning:       |     ^~~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_le_monde’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:22:5: warning: implicit declaration of function ‘SALUT_LE_MONDE’ [-Wimplicit-function-declaration]
    warning:    22 |     SALUT_LE_MONDE();
    warning:       |     ^~~~~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_toi’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:26:5: warning: implicit declaration of function ‘SALUT_TOI’ [-Wimplicit-function-declaration]
    warning:    26 |     SALUT_TOI();
    warning:       |     ^~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_moi’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:30:5: warning: implicit declaration of function ‘SALUT_MOI’ [-Wimplicit-function-declaration]
    warning:    30 |     SALUT_MOI();
    warning:       |     ^~~~~~~~~
    error: linking with `cc` failed: exit status: 1
      |
      = note: "cc" "-m64" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-Wl,--as-needed" "-L" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.0.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.1.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.10.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.11.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.12.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.13.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.14.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.15.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.2.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.3.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.4.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.5.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.6.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.7.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.8.rcgu.o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.sonde_test.3x2z20gm-cgu.9.rcgu.o" "-o" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps/sonde_test-3dd6d5dc97a09a63.32b8j1duep7cebtu.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/deps" "-L" "/home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out" "-L" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "-Wl,--whole-archive" "-lsonde-ffi" "-Wl,--no-whole-archive" "-Wl,--start-group" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-b6b48477bfa8c673.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-f560ec02638f7ffe.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-9c8eadb7013c9e0b.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-8b0ec8dbdb85d0bf.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-ba5d5ee707c805d2.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-55166126dbdd5e46.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-c327b365eae3b2f3.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-416439b546a0d033.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-2581188d29552e15.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-da7b2635bfcce6ef.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-09200ed1945e7b2b.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-223ac369b29f5000.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-39562fe6600dd936.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-9b411bb7a19f81b3.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-64ea0581d80339f7.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-b2dbda88b377d685.rlib" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-2a8415a96ed1d7dc.rlib" "-Wl,--end-group" "/home/heinz/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-c4d9a5b072ee3191.rlib" "-Wl,-Bdynamic" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc"
      = note: /usr/bin/ld: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/libsonde-ffi.a(sonde-ffiU70Emz.o): in function `hello_probe_you':
              /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:9: undefined reference to `HELLO_YOU'
              collect2: error: ld returned 1 exit status
              
    
    error: aborting due to previous error
    
    The following warnings were emitted during compilation:
    
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_world’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:5:5: warning: implicit declaration of function ‘HELLO_WORLD’ [-Wimplicit-function-declaration]
    warning:     5 |     HELLO_WORLD();
    warning:       |     ^~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_you’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:9:5: warning: implicit declaration of function ‘HELLO_YOU’ [-Wimplicit-function-declaration]
    warning:     9 |     HELLO_YOU(arg0, arg1);
    warning:       |     ^~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_me’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:13:5: warning: implicit declaration of function ‘HELLO_ME’ [-Wimplicit-function-declaration]
    warning:    13 |     HELLO_ME();
    warning:       |     ^~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘hello_probe_you_me’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:17:5: warning: implicit declaration of function ‘HELLO_YOU_ME’ [-Wimplicit-function-declaration]
    warning:    17 |     HELLO_YOU_ME();
    warning:       |     ^~~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_le_monde’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:22:5: warning: implicit declaration of function ‘SALUT_LE_MONDE’ [-Wimplicit-function-declaration]
    warning:    22 |     SALUT_LE_MONDE();
    warning:       |     ^~~~~~~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_toi’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:26:5: warning: implicit declaration of function ‘SALUT_TOI’ [-Wimplicit-function-declaration]
    warning:    26 |     SALUT_TOI();
    warning:       |     ^~~~~~~~~
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c: In function ‘salut_probe_moi’:
    warning: /home/heinz/Projects/Other/sonde-rs/sonde-test/target/debug/build/sonde-test-29186d9285cdc020/out/sonde-ffiU70Emz.c:30:5: warning: implicit declaration of function ‘SALUT_MOI’ [-Wimplicit-function-declaration]
    warning:    30 |     SALUT_MOI();
    warning:       |     ^~~~~~~~~
    
    error: could not compile `sonde-test`
    
    opened by Licenser 5
Owner
Ivan Enderlin
PhD Computer Scientist • Current WebAssembly polyglot at @wasmerio • Ex @Automattic, @liip, @fruux, @mozilla
Ivan Enderlin
Lightweight compile-time UUID parser.

compiled-uuid Anywhere you're building Uuids from a string literal, you should use uuid. Motivation If you want to use a fixed Uuid throughout your pr

Quinn 10 Dec 8, 2022
Showcase for pathological compile times when using knuffel / chumsky / VERY LARGE types

netherquote Showcase for pathological compile times when using knuffel / chumsky / VERY LARGE types. How to reproduce The rust toolchain version is pi

Amos Wenger 7 Jan 1, 2023
A proc macro for creating compile-time checked CSS class sets, in the style of classNames

semester Semester is a declarative CSS conditional class name joiner, in the style of React's classnames. It's intended for use in web frameworks (lik

Nathan West 11 Oct 20, 2022
miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

Kat Marchán 1.2k Jan 1, 2023
📦 🚀 a smooth-talking smuggler of Rust HTTP functions into AWS lambda

lando ?? maintenance mode ahead ?? As of this announcement AWS not officialy supports Rust through this project. As mentioned below this projects goal

Doug Tangren 68 Dec 7, 2021
Translate C++/Rust type into C type with the same memory layout

clayout, translate C++/Rust type into C type with the same memory layout. Generally, clayout is used together with bpftrace. clayout is developed on d

盏一 11 Nov 17, 2022
A scrapper that abstracts the IQ Option API calls into a Rust package.

IQ Option API - In Rust An abstraction of IQ Options API calls in a Rust library. License Licensed under either of MIT license (LICENSE-MIT or https:/

Vinícius Roque 8 Jul 17, 2023
A little CLI written in rust to improve your dirty commits into conventional ones.

Simple commits A little CLI written in rust to improve your dirty commits into conventional ones. ?? Demo (coming soon) ✨ Features Fully conventional

romandev 5 Mar 16, 2024
An efficient method of heaplessly converting numbers into their string representations, storing the representation within a reusable byte array.

NumToA #![no_std] Compatible with Zero Heap Allocations The standard library provides a convenient method of converting numbers into strings, but thes

Michael Murphy 42 Sep 6, 2022
Rs.aws-login - A command line utility to simplify logging into AWS services.

aws-login A command line utility to simplify logging into AWS accounts and services. $ aws-login use ? Please select a profile to use: › ❯ dev-read

Kevin Herrera 11 Oct 30, 2022