Skip to content

Commit

Permalink
Auto merge of #121297 - michaelwoerister:set-pdb-alt-path, r=wesleywiser
Browse files Browse the repository at this point in the history
link.exe: Don't embed full path to PDB file in binary.

This PR makes `rustc` unconditionally pass `/PDBALTPATH:%_PDB%` to MSVC-style linkers, causing the linker to only embed the filename of the PDB in the binary instead of the full path. This will help implement the [trim-paths RFC](#111540) for `*-msvc` targets.

Passing `/PDBALTPATH:%_PDB%` to the linker is already done by many projects that need reproducible builds and [debugger's should still be able to find the PDB](https://learn.microsoft.com/cpp/build/reference/pdbpath) if it is in the same directory as the binary.

r? `@ghost`

Fixes #87825
  • Loading branch information
bors committed Mar 13, 2024
2 parents 9ce37dc + d3af77c commit 3f79023
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_codegen_ssa/src/back/linker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,15 @@ impl<'a> Linker for MsvcLinker<'a> {
// from the CodeView line tables in the object files.
self.cmd.arg("/DEBUG");

// Default to emitting only the file name of the PDB file into
// the binary instead of the full path. Emitting the full path
// may leak private information (such as user names).
// See https://github.com/rust-lang/rust/issues/87825.
//
// This default behavior can be overridden by explicitly passing
// `-Clink-arg=/PDBALTPATH:...` to rustc.
self.cmd.arg("/PDBALTPATH:%_PDB%");

// This will cause the Microsoft linker to embed .natvis info into the PDB file
let natvis_dir_path = self.sess.sysroot.join("lib\\rustlib\\etc");
if let Ok(natvis_dir) = fs::read_dir(&natvis_dir_path) {
Expand Down
20 changes: 20 additions & 0 deletions tests/run-make/pdb-alt-path/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
include ../tools.mk

# only-windows-msvc

all:
# Test that we don't have the full path to the PDB file in the binary
$(RUSTC) main.rs -g --crate-name my_crate_name --crate-type bin -Cforce-frame-pointers
$(CGREP) "my_crate_name.pdb" < $(TMPDIR)/my_crate_name.exe
$(CGREP) -v "\\my_crate_name.pdb" < $(TMPDIR)/my_crate_name.exe

# Test that backtraces still can find debuginfo by checking that they contain symbol names and
# source locations.
RUST_BACKTRACE="full" $(TMPDIR)/my_crate_name.exe &> $(TMPDIR)/backtrace.txt || exit 0
$(CGREP) "my_crate_name::main" < $(TMPDIR)/backtrace.txt
$(CGREP) "pdb-alt-path\\main.rs:2" < $(TMPDIR)/backtrace.txt

# Test that explicitly passed `-Clink-arg=/PDBALTPATH:...` is respected
$(RUSTC) main.rs -g --crate-name my_crate_name --crate-type bin -Clink-arg=/PDBALTPATH:abcdefg.pdb -Cforce-frame-pointers
$(CGREP) "abcdefg.pdb" < $(TMPDIR)/my_crate_name.exe
$(CGREP) -v "my_crate_name.pdb" < $(TMPDIR)/my_crate_name.exe
3 changes: 3 additions & 0 deletions tests/run-make/pdb-alt-path/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main() {
panic!("backtrace please");
}

0 comments on commit 3f79023

Please sign in to comment.