Otherwise with -Zsymbol-mangling-version=v0 and no -Cmetadata, symbols from the same crate compiled with different versions of rustc are named the same. This makes it possible to replace a rust dylib compiled with one version of rustc with one compiled by another version of rustc even if the ABI doesn't match.
The crate disambiguator is calculated at
|
pub(crate) fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguator { |
|
use std::hash::Hasher; |
|
|
|
// The crate_disambiguator is a 128 bit hash. The disambiguator is fed |
|
// into various other hashes quite a bit (symbol hashes, incr. comp. hashes, |
|
// debuginfo type IDs, etc), so we don't want it to be too wide. 128 bits |
|
// should still be safe enough to avoid collisions in practice. |
|
let mut hasher = StableHasher::new(); |
|
|
|
let mut metadata = session.opts.cg.metadata.clone(); |
|
// We don't want the crate_disambiguator to dependent on the order |
|
// -C metadata arguments, so sort them: |
|
metadata.sort(); |
|
// Every distinct -C metadata value is only incorporated once: |
|
metadata.dedup(); |
|
|
|
hasher.write(b"metadata"); |
|
for s in &metadata { |
|
// Also incorporate the length of a metadata string, so that we generate |
|
// different values for `-Cmetadata=ab -Cmetadata=c` and |
|
// `-Cmetadata=a -Cmetadata=bc` |
|
hasher.write_usize(s.len()); |
|
hasher.write(s.as_bytes()); |
|
} |
|
|
|
// Also incorporate crate type, so that we don't get symbol conflicts when |
|
// linking against a library of the same name, if this is an executable. |
|
let is_exe = session.crate_types().contains(&CrateType::Executable); |
|
hasher.write(if is_exe { b"exe" } else { b"lib" }); |
|
|
|
CrateDisambiguator::from(hasher.finish::<Fingerprint>()) |
|
} |
This should include something like
option_env!("CFG_VERSION").unwrap_or("unknown version") in the hash. This matches what the version info included in the rustc metadata header.
Otherwise with
-Zsymbol-mangling-version=v0and no-Cmetadata, symbols from the same crate compiled with different versions of rustc are named the same. This makes it possible to replace a rust dylib compiled with one version of rustc with one compiled by another version of rustc even if the ABI doesn't match.The crate disambiguator is calculated at
rust/compiler/rustc_interface/src/util.rs
Lines 500 to 531 in 354cc75
option_env!("CFG_VERSION").unwrap_or("unknown version")in the hash. This matches what the version info included in the rustc metadata header.