Application Binary Interface (ABI)
This section documents features that affect the ABI of the compiled output of a crate.
See extern functions for information on specifying the ABI for exporting functions. See external blocks for information on specifying the ABI for linking external libraries.
The used
attribute
The used
attribute can only be applied to static
items. This attribute forces the
compiler to keep the variable in the output object file (.o, .rlib, etc. excluding final binaries)
even if the variable is not used, or referenced, by any other item in the crate.
However, the linker is still free to remove such an item.
Below is an example that shows under what conditions the compiler keeps a static
item in the
output object file.
$ rustc -O --emit=obj --crate-type=rlib foo.rs
$ nm -C foo.o
0000000000000000 R foo::BAZ
0000000000000000 r foo::FOO
0000000000000000 R foo::QUUX
0000000000000000 T foo::quux
The no_mangle
attribute
The no_mangle
attribute may be used on any item to disable standard
symbol name mangling. The symbol for the item will be the identifier of the
item’s name.
Additionally, the item will be publicly exported from the produced library or
object file, similar to the used
attribute.
This attribute is unsafe as an unmangled symbol may collide with another symbol with the same name (or with a well-known symbol), leading to undefined behavior.
The link_section
attribute
The link_section
attribute specifies the section of the object file that a
function or static’s content will be placed into. It uses the
MetaNameValueStr syntax to specify the section name.
This attribute is unsafe as it allows users to place data and code into sections of memory not expecting them, such as mutable data into read-only areas.
The export_name
attribute
The export_name
attribute specifies the name of the symbol that will be
exported on a function or static. It uses the MetaNameValueStr syntax
to specify the symbol name.
This attribute is unsafe as a symbol with a custom name may collide with another symbol with the same name (or with a well-known symbol), leading to undefined behavior.