Skip to content

Commit 79a42e3

Browse files
committed
linker: Create GNU_EH_FRAME header by default when producing ELFs
1 parent 394e1b4 commit 79a42e3

File tree

7 files changed

+19
-14
lines changed

7 files changed

+19
-14
lines changed

src/librustc_codegen_ssa/back/link.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1597,6 +1597,9 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
15971597
cmd.arg(format!("--dynamic-linker={}ld.so.1", prefix));
15981598
}
15991599

1600+
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
1601+
cmd.add_eh_frame_header();
1602+
16001603
// NO-OPT-OUT, OBJECT-FILES-NO
16011604
if crt_objects_fallback {
16021605
cmd.no_crt_objects();

src/librustc_codegen_ssa/back/linker.rs

+14
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ pub trait Linker {
129129
fn group_start(&mut self);
130130
fn group_end(&mut self);
131131
fn linker_plugin_lto(&mut self);
132+
fn add_eh_frame_header(&mut self) {}
132133
fn finalize(&mut self);
133134
}
134135

@@ -615,6 +616,19 @@ impl<'a> Linker for GccLinker<'a> {
615616
}
616617
}
617618
}
619+
620+
// Add the `GNU_EH_FRAME` program header which is required to locate unwinding information.
621+
// Some versions of `gcc` add it implicitly, some (e.g. `musl-gcc`) don't,
622+
// so we just always add it.
623+
fn add_eh_frame_header(&mut self) {
624+
// The condition here is "uses ELF" basically.
625+
if !self.sess.target.target.options.is_like_osx
626+
&& !self.sess.target.target.options.is_like_windows
627+
&& self.sess.target.target.target_os != "uefi"
628+
{
629+
self.linker_arg("--eh-frame-hdr");
630+
}
631+
}
618632
}
619633

620634
pub struct MsvcLinker<'a> {

src/librustc_target/spec/cloudabi_base.rs

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub fn opts() -> TargetOptions {
77
vec![
88
"-Wl,-Bstatic".to_string(),
99
"-Wl,--no-dynamic-linker".to_string(),
10-
"-Wl,--eh-frame-hdr".to_string(),
1110
"-Wl,--gc-sections".to_string(),
1211
],
1312
);

src/librustc_target/spec/fuchsia_base.rs

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ pub fn opts() -> TargetOptions {
66
LinkerFlavor::Lld(LldFlavor::Ld),
77
vec![
88
"--build-id".to_string(),
9-
"--eh-frame-hdr".to_string(),
109
"--hash-style=gnu".to_string(),
1110
"-z".to_string(),
1211
"max-page-size=4096".to_string(),

src/librustc_target/spec/linux_musl_base.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
use crate::spec::crt_objects::{self, CrtObjectsFallback};
2-
use crate::spec::{LinkerFlavor, TargetOptions};
2+
use crate::spec::TargetOptions;
33

44
pub fn opts() -> TargetOptions {
55
let mut base = super::linux_base::opts();
66

7-
// At least when this was tested, the linker would not add the
8-
// `GNU_EH_FRAME` program header to executables generated, which is required
9-
// when unwinding to locate the unwinding information. I'm not sure why this
10-
// argument is *not* necessary for normal builds, but it can't hurt!
11-
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,--eh-frame-hdr".to_string());
12-
137
base.pre_link_objects_fallback = crt_objects::pre_musl_fallback();
148
base.post_link_objects_fallback = crt_objects::post_musl_fallback();
159
base.crt_objects_fallback = Some(CrtObjectsFallback::Musl);

src/librustc_target/spec/mipsel_sony_psp.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ const LINKER_SCRIPT: &str = include_str!("./mipsel_sony_psp_linker_script.ld");
66

77
pub fn target() -> TargetResult {
88
let mut pre_link_args = LinkArgs::new();
9-
pre_link_args.insert(
10-
LinkerFlavor::Lld(LldFlavor::Ld),
11-
vec!["--eh-frame-hdr".to_string(), "--emit-relocs".to_string()],
12-
);
9+
pre_link_args.insert(LinkerFlavor::Lld(LldFlavor::Ld), vec!["--emit-relocs".to_string()]);
1310

1411
Ok(Target {
1512
llvm_target: "mipsel-sony-psp".to_string(),

src/librustc_target/spec/x86_64_fortanix_unknown_sgx.rs

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use super::{LinkerFlavor, LldFlavor, PanicStrategy, Target, TargetOptions};
55
pub fn target() -> Result<Target, String> {
66
const PRE_LINK_ARGS: &[&str] = &[
77
"--as-needed",
8-
"--eh-frame-hdr",
98
"-z",
109
"noexecstack",
1110
"-e",

0 commit comments

Comments
 (0)