export_executable_symbols - The Rust Unstable Book

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# `export-executable-symbols`

The tracking issue for this feature is: #84161.

The `-Zexport-executable-symbols` compiler flag makes `rustc` export symbols from executables. The resulting binary is runnable, but can also be used as a dynamic library. This is useful for interoperating with programs written in other languages, in particular languages with a runtime like Java or Lua.

For example on windows:

    #[no_mangle]
    fn my_function() -> usize {
        return 42;
    }

    fn main() {
        println!("Hello, world!");
    }

A standard `cargo build` will produce a `.exe` without an export directory. When the `export-executable-symbols` flag is added

    export RUSTFLAGS="-Zexport-executable-symbols"
    cargo build

the binary has an export directory with the functions:

    The Export Tables (interpreted .edata section contents)

    ...

    [Ordinal/Name Pointer] Table
        [   0] my_function
        [   1] main

(the output of `objdump -x` on the binary)

Please note that the `#[no_mangle]` attribute is required. Without it, the symbol is not exported.

The equivalent of this flag in C and C++ compilers is the `__declspec(dllexport)` annotation or the `-rdynamic` linker flag.