@@ -402,12 +402,35 @@ machine. Each target has a default base CPU.
402
402
403
403
## target-feature
404
404
405
- Individual targets will support different features; this flag lets you control
406
- enabling or disabling a feature. Each feature should be prefixed with a ` + ` to
407
- enable it or ` - ` to disable it. Separate multiple features with commas.
405
+ This option controls either CPU instruction set extensions that can be used during code generation,
406
+ or static linking.
408
407
409
- To see the valid options and an example of use, run `rustc --print
410
- target-features`.
408
+ In both cases ` -C target-feature=+x ` enables feature ` x ` and ` -C target-feature=-x ` disables it.
409
+
410
+ Multiple features can be specified by separating them with commas - ` -C target-feature=+x,-y ` .
411
+
412
+ For each supported feature ` x ` ` target_feature = "x" ` becomes a ` cfg ` predicate usable early during
413
+ compilation.
414
+ Code configured with ` cfg(target_feature = "x") ` is kept if the feature ` x ` is enabled,
415
+ and removed otherwise.
416
+
417
+ If the enabled feature is not supported for the current target, the behavior is unspecified.
418
+ <!-- There are multiple bugs here
419
+ - Unknown CPU features go straight to LLVM and appear as LLVM warnings.
420
+ - At configure time `crt-static` predicate is set even if the target doesn't support `crt-static`.
421
+ - At link time `crt-static` is sometimes ignored
422
+ if the target doesn't support it and sometimes not.
423
+ -->
424
+
425
+ To see the valid features and an example of use, run ` rustc --print target-features ` .
426
+
427
+ #### CPU instruction set extensions
428
+
429
+ Target features for CPU instruction set extensions can enable or disable
430
+ architecture-dependent CPU features, like ` +neon ` or ` -sse ` .
431
+
432
+ Each target and [ ` target-cpu ` ] ( #target-cpu ) has a default set of enabled
433
+ features.
411
434
412
435
Using this flag is unsafe and might result in [ undefined runtime
413
436
behavior] ( ../targets/known-issues.md ) .
@@ -416,11 +439,53 @@ See also the [`target_feature`
416
439
attribute] ( ../../reference/attributes/codegen.md#the-target_feature-attribute )
417
440
for controlling features per-function.
418
441
419
- This also supports the feature ` +crt-static ` and ` -crt-static ` to control
420
- [ static C runtime linkage] ( ../../reference/linkage.html#static-and-dynamic-c-runtimes ) .
442
+ #### Static linking
421
443
422
- Each target and [ ` target-cpu ` ] ( #target-cpu ) has a default set of enabled
423
- features.
444
+ Target feature ` crt-static ` can be used to enable or disable static linking,
445
+ with the default depending on the current target.
446
+ ` -C target-feature=+crt-static ` is similar to ` -static ` in other compilers,
447
+ standard C library in particular is linked statically in this case.
448
+
449
+ The exact meaning of ` +crt-static ` depends heavily
450
+ on the current target and the produced crate type.
451
+
452
+ - ELF-based executables.
453
+ If the target supports statically linked executables,
454
+ then the linker will be instructed (` -static ` ) to produce one.
455
+ The executable will be self-contained,
456
+ will contain code from all the used libraries, including ` libc ` , inside it,
457
+ and will be able to run without a dynamic loader (no ` INTERP ` header).
458
+
459
+ If the target doesn't support both position-independent and statically linked executables,
460
+ then ` -C target-feature=+crt-static ` "wins" over ` -C relocation-model=pic ` ,
461
+ and the linker is instructed (` -static ` ) to produce a statically linked
462
+ but not position-independent executable.
463
+
464
+ - ELF-based shared libraries.
465
+ If the target supports statically linked shared libraries,
466
+ then the linker will be instructed (` -shared -static ` ) to produce one.
467
+ The shared library will contain code from all the used libraries, including ` libc ` , inside it.
468
+ This option is not widely supported or used.
469
+
470
+ - PE-based executables (Windows).
471
+ The produced executable will contain code from all the user-level libraries, including
472
+ [ C Run-Time Libraries (CRT)] ( https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features ) ,
473
+ but may still link dynamically to system libraries like ` kernel32.dll ` .
474
+
475
+ - PE-based shared libraries (Windows).
476
+ The produced shared library will contain code from all the user-level libraries, including
477
+ [ C Run-Time Libraries (CRT)] ( https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features ) ,
478
+ but may still link dynamically to system libraries like ` kernel32.dll ` .
479
+
480
+ * WARNING!* If some libraries (native or Rust crates) in the dependency tree exist only in the
481
+ dynamic variant they may be linked dynamically breaking the self-contained-ness property,
482
+ re-adding the ` INTERP ` header for ELF executables, and possibly working incorrectly due to mismatch
483
+ between dynamically linked libraries and injected startup objects specific to static linking.
484
+ A request to turn this case into an error is tracked in
485
+ [ issue #39998 ] ( https://github.com/rust-lang/rust/issues/39998 ) .
486
+
487
+ An alternative description of this feature can be found in the
488
+ [ reference] ( ../../reference/linkage.html#static-and-dynamic-c-runtimes ) .
424
489
425
490
## bitcode-in-rlib
426
491
0 commit comments