mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
0e0338744d
This commit updates how rustc compiler metadata is stored in rlibs. Previously metadata was stored as a raw file that has the same format as `--emit metadata`. After this commit, however, the metadata is encoded into a small object file which has one section which is the contents of the metadata. The motivation for this commit is to fix a common case where #83730 arises. The problem is that when rustc crates a `dylib` crate type it needs to include entire rlib files into the dylib, so it passes `--whole-archive` (or the equivalent) to the linker. The problem with this, though, is that the linker will attempt to read all files in the archive. If the metadata file were left as-is (today) then the linker would generate an error saying it can't read the file. The previous solution was to alter the rlib just before linking, creating a new archive in a temporary directory which has the metadata file removed. This problem from before this commit is now removed if the metadata file is stored in an object file that the linker can read. The only caveat we have to take care of is to ensure that the linker never actually includes the contents of the object file into the final output. We apply similar tricks as the `.llvmbc` bytecode sections to do this. This involved changing the metadata loading code a bit, namely updating some of the LLVM C APIs used to use non-deprecated ones and fiddling with the lifetimes a bit to get everything to work out. Otherwise though this isn't intended to be a functional change really, only that metadata is stored differently in archives now. This should end up fixing #83730 because by default dylibs will no longer have their rlib dependencies "altered" meaning that split-debuginfo will continue to have valid paths pointing at the original rlibs. (note that we still "alter" rlibs if LTO is enabled to remove Rust object files and we also "alter" for the #[link(cfg)] feature, but that's rarely used). Closes #83730
41 lines
1.2 KiB
TOML
41 lines
1.2 KiB
TOML
[package]
|
|
authors = ["The Rust Project Developers"]
|
|
name = "rustc_codegen_ssa"
|
|
version = "0.0.0"
|
|
edition = "2018"
|
|
|
|
[lib]
|
|
test = false
|
|
|
|
[dependencies]
|
|
bitflags = "1.2.1"
|
|
cc = "1.0.68"
|
|
itertools = "0.9"
|
|
tracing = "0.1"
|
|
libc = "0.2.50"
|
|
jobserver = "0.1.22"
|
|
tempfile = "3.2"
|
|
pathdiff = "0.2.0"
|
|
|
|
rustc_serialize = { path = "../rustc_serialize" }
|
|
rustc_ast = { path = "../rustc_ast" }
|
|
rustc_span = { path = "../rustc_span" }
|
|
rustc_middle = { path = "../rustc_middle" }
|
|
rustc_apfloat = { path = "../rustc_apfloat" }
|
|
rustc_attr = { path = "../rustc_attr" }
|
|
rustc_symbol_mangling = { path = "../rustc_symbol_mangling" }
|
|
rustc_data_structures = { path = "../rustc_data_structures" }
|
|
rustc_errors = { path = "../rustc_errors" }
|
|
rustc_fs_util = { path = "../rustc_fs_util" }
|
|
rustc_hir = { path = "../rustc_hir" }
|
|
rustc_incremental = { path = "../rustc_incremental" }
|
|
rustc_index = { path = "../rustc_index" }
|
|
rustc_macros = { path = "../rustc_macros" }
|
|
rustc_target = { path = "../rustc_target" }
|
|
rustc_session = { path = "../rustc_session" }
|
|
|
|
[dependencies.object]
|
|
version = "0.25.2"
|
|
default-features = false
|
|
features = ["read_core", "elf", "macho", "pe", "unaligned", "archive", "write"]
|