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.