Skip to content

Commit

Permalink
Mark ___asan_globals_registered as an exported symbol for LTO
Browse files Browse the repository at this point in the history
Fixes #113404
  • Loading branch information
anforowicz committed Aug 28, 2023
1 parent 66b15fc commit d9abc46
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 10 deletions.
11 changes: 1 addition & 10 deletions compiler/rustc_codegen_ssa/src/back/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,16 +214,7 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static
// Unsupported architecture.
_ => return None,
};
let binary_format = if sess.target.is_like_osx {
BinaryFormat::MachO
} else if sess.target.is_like_windows {
BinaryFormat::Coff
} else if sess.target.is_like_aix {
BinaryFormat::Xcoff
} else {
BinaryFormat::Elf
};

let binary_format = sess.target.binary_format();
let mut file = write::Object::new(binary_format, architecture, endianness);
if sess.target.is_like_osx {
if let Some(build_version) = macho_object_build_version_for_target(&sess.target) {
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_codegen_ssa/src/back/symbol_export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::base::allocator_kind_for_codegen;

use std::collections::hash_map::Entry::*;

use object::BinaryFormat;
use rustc_ast::expand::allocator::{ALLOCATOR_METHODS, NO_ALLOC_SHIM_IS_UNSTABLE};
use rustc_data_structures::fx::FxHashMap;
use rustc_hir::def::DefKind;
Expand Down Expand Up @@ -265,6 +266,15 @@ fn exported_symbols_provider_local(
externally_injected_weak_symbols.push("__msan_track_origins");
}
}
if tcx.sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
// Similar to profiling, preserve weak asan symbols during LTO.
match tcx.sess.target.binary_format() {
BinaryFormat::Elf | BinaryFormat::MachO => {
externally_injected_weak_symbols.push("___asan_globals_registered")
}
_ => (),
}
}
symbols.extend(externally_injected_weak_symbols.into_iter().map(|sym| {
let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, sym));
(
Expand Down
14 changes: 14 additions & 0 deletions compiler/rustc_target/src/spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ use crate::abi::{Endian, Integer, Size, TargetDataLayout, TargetDataLayoutErrors
use crate::json::{Json, ToJson};
use crate::spec::abi::{lookup as lookup_abi, Abi};
use crate::spec::crt_objects::{CrtObjects, LinkSelfContainedDefault};
use object::BinaryFormat;
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_fs_util::try_canonicalize;
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
Expand Down Expand Up @@ -2053,6 +2054,19 @@ fn add_link_args(link_args: &mut LinkArgs, flavor: LinkerFlavor, args: &[&'stati
}

impl TargetOptions {
/// Binary format (e.g. ELF) implied by the `TargetOptions`.
pub fn binary_format(&self) -> BinaryFormat {
if self.is_like_osx {
BinaryFormat::MachO
} else if self.is_like_windows {
BinaryFormat::Coff
} else if self.is_like_aix {
BinaryFormat::Xcoff
} else {
BinaryFormat::Elf
}
}

fn link_args(flavor: LinkerFlavor, args: &[&'static str]) -> LinkArgs {
let mut link_args = LinkArgs::new();
add_link_args(&mut link_args, flavor, args);
Expand Down
42 changes: 42 additions & 0 deletions tests/codegen/sanitizer/address-sanitizer-globals-tracking.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Verifies that AddressSanitizer symbols show up as expected in LLVM IR with -Zsanitizer.
//
// Notes about the `compile-flags` below:
//
// * The original issue only reproed with LTO - this is why this angle has
// extra test coverage via different `revisions`
// * To observe the failure/repro at LLVM-IR level we need to use `staticlib`
// which necessitates `-C prefer-dynamic=false` - without the latter flag,
// we would have run into "cannot prefer dynamic linking when performing LTO".
//
// The test is restricted to `only-linux`, because the sanitizer-related instrumentation
// is target specific. In particular, `___asan_globals_registered` is only used in the
// `InstrumentGlobalsELF` and `InstrumentGlobalsMachO` code paths.
//
// needs-sanitizer-address
// only-linux
//
// revisions:ASAN ASAN-LTO
//[ASAN] compile-flags: -Zsanitizer=address
//[ASAN-LTO] compile-flags: -Zsanitizer=address -C prefer-dynamic=false -C lto

#![crate_type="staticlib"]

// The test below mimics `CACHED_POW10` from `library/core/src/num/flt2dec/strategy/grisu.rs` which
// (because of incorrect handling of `___asan_globals_registered` during LTO) was incorrectly
// reported as an ODR violation in https://crbug.com/1459233#c1. Before this bug was fixed,
// `___asan_globals_registered` would show up as `internal global i64` rather than `common hidden
// global i64`. (The test expectations ignore the exact type because on `arm-android` the type
// is `i32` rather than `i64`.)
//
// See https://github.com/rust-lang/rust/issues/113404 for more discussion.
//
// CHECK: @___asan_globals_registered = common hidden global
// CHECK: @__start_asan_globals = extern_weak hidden global
// CHECK: @__stop_asan_globals = extern_weak hidden global
#[no_mangle]
pub static CACHED_POW10: [(u64, i16, i16); 4] = [
(0xe61acf033d1a45df, -1087, -308),
(0xab70fe17c79ac6ca, -1060, -300),
(0xff77b1fcbebcdc4f, -1034, -292),
(0xbe5691ef416bd60c, -1007, -284),
];

0 comments on commit d9abc46

Please sign in to comment.