//@ ignore-loongarch64 (handles dso_local differently) //@ ignore-powerpc64 (handles dso_local differently) //@ ignore-apple (handles dso_local differently) //@ revisions: DEFAULT PIE DIRECT INDIRECT //@ [DEFAULT] compile-flags: -C relocation-model=static //@ [PIE] compile-flags: -C relocation-model=pie //@ [DIRECT] compile-flags: -C relocation-model=pie -Z direct-access-external-data=yes //@ [INDIRECT] compile-flags: -C relocation-model=static -Z direct-access-external-data=no #![crate_type = "rlib"] #![feature(linkage)] unsafe extern "C" { // CHECK: @VAR = external // DEFAULT-SAME: dso_local // PIE-NOT: dso_local // DIRECT-SAME: dso_local // INDIRECT-NOT: dso_local // CHECK-SAME: global i32 safe static VAR: i32; // When "linkage" is used, we generate an indirection global. // Check dso_local is still applied to the actual global. // CHECK: @EXTERNAL = external // DEFAULT-SAME: dso_local // PIE-NOT: dso_local // DIRECT-SAME: dso_local // INDIRECT-NOT: dso_local // CHECK-SAME: global i8 #[linkage = "external"] safe static EXTERNAL: *const u32; // CHECK: @WEAK = extern_weak // DEFAULT-SAME: dso_local // PIE-NOT: dso_local // DIRECT-SAME: dso_local // INDIRECT-NOT: dso_local // CHECK-SAME: global i8 #[linkage = "extern_weak"] safe static WEAK: *const u32; } #[no_mangle] pub fn refer() { core::hint::black_box(VAR); core::hint::black_box(EXTERNAL); core::hint::black_box(WEAK); }