@@ -2070,6 +2070,38 @@ The currently implemented features of the compiler are:
20702070 closure as ` once ` is unlikely to be supported going forward. So
20712071 they are hidden behind this feature until they are to be removed.
20722072
2073+ * ` managed_boxes ` - Usage of ` @ ` pointers is gated due to many
2074+ planned changes to this feature. In the past, this has meant
2075+ "a GC pointer", but the current implementation uses
2076+ reference counting and will likely change drastically over
2077+ time. Additionally, the ` @ ` syntax will no longer be used to
2078+ create GC boxes.
2079+
2080+ * ` asm ` - The ` asm! ` macro provides a means for inline assembly. This is often
2081+ useful, but the exact syntax for this feature along with its semantics
2082+ are likely to change, so this macro usage must be opted into.
2083+
2084+ * ` non_ascii_idents ` - The compiler supports the use of non-ascii identifiers,
2085+ but the implementation is a little rough around the
2086+ edges, so this can be seen as an experimental feature for
2087+ now until the specification of identifiers is fully
2088+ fleshed out.
2089+
2090+ * ` thread_local ` - The usage of the ` #[thread_local] ` attribute is experimental
2091+ and should be seen as unstable. This attribute is used to
2092+ declare a ` static ` as being unique per-thread leveraging
2093+ LLVM's implementation which works in concert with the kernel
2094+ loader and dynamic linker. This is not necessarily available
2095+ on all platforms, and usage of it is discouraged (rust
2096+ focuses more on task-local data instead of thread-local
2097+ data).
2098+
2099+ * ` link_args ` - This attribute is used to specify custom flags to the linker,
2100+ but usage is strongly discouraged. The compiler's usage of the
2101+ system linker is not guaranteed to continue in the future, and
2102+ if the system linker is not used then specifying custom flags
2103+ doesn't have much meaning.
2104+
20732105If a feature is promoted to a language feature, then all existing programs will
20742106start to receive compilation warnings about #[ feature] directives which enabled
20752107the new feature (because the directive is no longer necessary). However, if
@@ -3611,6 +3643,111 @@ queues, as well as code to copy values between queues and their recipients and
36113643to serialize values for transmission over operating-system inter-process
36123644communication facilities.
36133645
3646+ ### Linkage
3647+
3648+ The Rust compiler supports various methods to link crates together both
3649+ statically and dynamically. This section will explore the various methods to
3650+ link Rust crates together, and more information about native libraries can be
3651+ found in the [ ffi tutorial] [ ffi ] .
3652+
3653+ In one session of compilation, the compiler can generate multiple artifacts
3654+ through the usage of command line flags and the ` crate_type ` attribute.
3655+
3656+ * ` --bin ` , ` #[crate_type = "bin"] ` - A runnable executable will be produced.
3657+ This requires that there is a ` main ` function in the crate which will be run
3658+ when the program begins executing. This will link in all Rust and native
3659+ dependencies, producing a distributable binary.
3660+
3661+ * ` --lib ` , ` #[crate_type = "lib"] ` - A Rust library will be produced. This is
3662+ an ambiguous concept as to what exactly is produced because a library can
3663+ manifest itself in several forms. The purpose of this generic ` lib ` option is
3664+ to generate the "compiler recommended" style of library. The output library
3665+ will always be usable by rustc, but the actual type of library may change
3666+ from time-to-time. The remaining output types are all different flavors of
3667+ libraries, and the ` lib ` type can be seen as an alias for one of them (but
3668+ the actual one is compiler-defined).
3669+
3670+ * ` --dylib ` , ` #[crate_type = "dylib"] ` - A dynamic Rust library will be
3671+ produced. This is different from the ` lib ` output type in that this forces
3672+ dynamic library generation. The resulting dynamic library can be used as a
3673+ dependency for other libraries and/or executables. This output type will
3674+ create ` *.so ` files on linux, ` *.dylib ` files on osx, and ` *.dll ` files on
3675+ windows.
3676+
3677+ * ` --staticlib ` , ` #[crate_type = "staticlib"] ` - A static system library will
3678+ be produced. This is different from other library outputs in that the Rust
3679+ compiler will never attempt to link to ` staticlib ` outputs. The purpose of
3680+ this output type is to create a static library containing all of the local
3681+ crate's code along with all upstream dependencies. The static library is
3682+ actually a ` *.a ` archive on linux and osx and a ` *.lib ` file on windows. This
3683+ format is recommended for use in situtations such as linking Rust code into an
3684+ existing non-Rust application because it will not have dynamic dependencies on
3685+ other Rust code.
3686+
3687+ * ` --rlib ` , ` #[crate_type = "rlib"] ` - A "Rust library" file will be produced.
3688+ This is used as an intermediate artifact and can be thought of as a "static
3689+ Rust library". These ` rlib ` files, unlike ` staticlib ` files, are interpreted
3690+ by the Rust compiler in future linkage. This essentially means that ` rustc `
3691+ will look for metadata in ` rlib ` files like it looks for metadata in dynamic
3692+ libraries. This form of output is used to produce statically linked
3693+ executables as well as ` staticlib ` outputs.
3694+
3695+ Note that these outputs are stackable in the sense that if multiple are
3696+ specified, then the compiler will produce each form of output at once without
3697+ having to recompile.
3698+
3699+ With all these different kinds of outputs, if crate A depends on crate B, then
3700+ the compiler could find B in various different forms throughout the system. The
3701+ only forms looked for by the compiler, however, are the ` rlib ` format and the
3702+ dynamic library format. With these two options for a dependent library, the
3703+ compiler must at some point make a choice between these two formats. With this
3704+ in mind, the compiler follows these rules when determining what format of
3705+ dependencies will be used:
3706+
3707+ 1 . If a dynamic library is being produced, then it is required for all upstream
3708+ Rust dependencies to also be dynamic. This is a limitation of the current
3709+ implementation of the linkage model. The reason behind this limitation is to
3710+ prevent multiple copies of the same upstream library from showing up, and in
3711+ the future it is planned to support a mixture of dynamic and static linking.
3712+
3713+ When producing a dynamic library, the compiler will generate an error if an
3714+ upstream dependency could not be found, and also if an upstream dependency
3715+ could only be found in an ` rlib ` format. Remember that ` staticlib ` formats
3716+ are always ignored by ` rustc ` for crate-linking purposes.
3717+
3718+ 2 . If a static library is being produced, all upstream dependecies are
3719+ required to be available in ` rlib ` formats. This requirement stems from the
3720+ same reasons that a dynamic library must have all dynamic dependencies.
3721+
3722+ Note that it is impossible to link in native dynamic dependencies to a static
3723+ library, and in this case warnings will be printed about all unlinked native
3724+ dynamic dependencies.
3725+
3726+ 3 . If an ` rlib ` file is being produced, then there are no restrictions on what
3727+ format the upstream dependencies are available in. It is simply required that
3728+ all upstream dependencies be available for reading metadata from.
3729+
3730+ The reason for this is that ` rlib ` files do not contain any of their upstream
3731+ dependencies. It wouldn't be very efficient for all ` rlib ` files to contain a
3732+ copy of ` libstd.rlib ` !
3733+
3734+ 4 . If an executable is being produced, then things get a little interesting. As
3735+ with the above limitations in dynamic and static libraries, it is required
3736+ for all upstream dependencies to be in the same format. The next question is
3737+ whether to prefer a dynamic or a static format. The compiler currently favors
3738+ static linking over dynamic linking, but this can be inverted with the `-Z
3739+ prefer-dynamic` flag to the compiler.
3740+
3741+ What this means is that first the compiler will attempt to find all upstream
3742+ dependencies as ` rlib ` files, and if successful, it will create a statically
3743+ linked executable. If an upstream dependency is missing as an ` rlib ` file,
3744+ then the compiler will force all dependencies to be dynamic and will generate
3745+ errors if dynamic versions could not be found.
3746+
3747+ In general, ` --bin ` or ` --lib ` should be sufficient for all compilation needs,
3748+ and the other options are just available if more fine-grained control is desired
3749+ over the output format of a Rust crate.
3750+
36143751### Logging system
36153752
36163753The runtime contains a system for directing [ logging
@@ -3762,3 +3899,5 @@ Additional specific influences can be seen from the following languages:
37623899* The typeclass system of Haskell.
37633900* The lexical identifier rule of Python.
37643901* The block syntax of Ruby.
3902+
3903+ [ ffi ] : tutorial-ffi.html
0 commit comments