The rustc compiler has certain pluggable operations, that is,
functionality that isn't hard-coded into the language, but is
implemented in libraries, with a special marker to tell the compiler
it exists. The marker is the attribute #[lang = "..."] and there are
various different values of ..., i.e. various different 'lang
items'.

For example, Box pointers require two lang items, one for allocation
and one for deallocation. A freestanding program that uses the Box
sugar for dynamic allocations via malloc and free:

Note the use of abort: the exchange_malloc lang item is assumed to
return a valid pointer, and so needs to do the check internally.

Other features provided by lang items include:

overloadable operators via traits: the traits corresponding to the
==, <, dereferencing (*) and + (etc.) operators are all
marked with lang items; those specific four are eq, ord,
deref, and add respectively.

stack unwinding and general failure; the eh_personality,
eh_unwind_resume, fail and fail_bounds_checks lang items.

the traits in std::marker used to indicate types of
various kinds; lang items send, sync and copy.

Lang items are loaded lazily by the compiler; e.g. if one never uses
Box then there is no need to define functions for exchange_malloc
and box_free. rustc will emit an error when an item is needed
but not found in the current crate or any that it depends on.

Most lang items are defined by libcore, but if you're trying to build
an executable without the standard library, you'll run into the need
for lang items. The rest of this page focuses on this use-case, even though
lang items are a bit broader than that.

To override the compiler-inserted main shim, one has to disable it
with #![no_main] and then create the appropriate symbol with the
correct ABI and the correct name, which requires overriding the
compiler's name mangling too:

In many cases, you may need to manually link to the compiler_builtins crate
when building a no_std binary. You may observe this via linker error messages
such as "undefined reference to `__rust_probestack'". Using this crate
also requires enabling the library feature compiler_builtins_lib. You can read
more about this here.

The compiler currently makes a few assumptions about symbols which are
available in the executable to call. Normally these functions are provided by
the standard library, but without it you must define your own. These symbols
are called "language items", and they each have an internal name, and then a
signature that an implementation must conform to.

The first of these functions, rust_eh_personality, is used by the failure
mechanisms of the compiler. This is often mapped to GCC's personality function
(see the libstd implementation for more information), but crates
which do not trigger a panic can be assured that this function is never
called. The language item's name is eh_personality.

The second function, rust_begin_panic, is also used by the failure mechanisms of the
compiler. When a panic happens, this controls the message that's displayed on
the screen. While the language item's name is panic_impl, the symbol name is
rust_begin_panic.

A third function, rust_eh_unwind_resume, is also needed if the custom_unwind_resume
flag is set in the options of the compilation target. It allows customizing the
process of resuming unwind at the end of the landing pads. The language item's name
is eh_unwind_resume.