// ignore-tidy-linelength //! A basic smoke test to check for GNU Property Note to see that for `x86_64` targets when [`-Z //! cf-protection=branch`][intel-cet-tracking-issue] is requested, that the //! //! ```text //! NT_GNU_PROPERTY_TYPE_0 Properties: x86 feature: IBT //! ``` //! //! Intel Indirect Branch Tracking (IBT) property is emitted. This was generated in //! in order to address //! . //! //! Note that the precompiled std currently is not compiled with `-Z cf-protection=branch`! //! //! In particular, it is expected that: //! //! > IBT to only be enabled for the process if `.note.gnu.property` indicates that the executable //! > was compiled with IBT support and the linker to only tell that IBT is supported if all input //! > object files indicate that they support IBT, which in turn requires the standard library to be //! > compiled with IBT enabled. //! //! Note that Intel IBT (Indirect Branch Tracking) is not to be confused with Arm's BTI (Branch //! Target Identification). See below for link to Intel IBT docs. //! //! ## Related links //! //! - [Tracking Issue for Intel Control Enforcement Technology (CET)][intel-cet-tracking-issue] //! - Zulip question about this test: //! //! - Intel IBT docs: //! //! //! [intel-cet-tracking-issue]: https://github.com/rust-lang/rust/issues/93754 //@ needs-llvm-components: x86 // FIXME(#93754): increase the test coverage of this test. //@ only-x86_64-unknown-linux-gnu //@ ignore-cross-compile use run_make_support::{bare_rustc, llvm_readobj}; fn main() { // `main.rs` is `#![no_std]` to not pull in the currently not-compiled-with-IBT precompiled std. bare_rustc() .input("main.rs") .target("x86_64-unknown-linux-gnu") .arg("-Zcf-protection=branch") .arg("-Clink-args=-nostartfiles") .run(); llvm_readobj().arg("-nW").input("main").run().assert_stdout_contains(".note.gnu.property"); }