diff --git a/tests/run-make/macho-link-section/foo.rs b/tests/run-make/macho-link-section/foo.rs new file mode 100644 index 0000000000000..0ac2f9a9d1c0e --- /dev/null +++ b/tests/run-make/macho-link-section/foo.rs @@ -0,0 +1,14 @@ +#[unsafe(no_mangle)] +#[unsafe(link_section = "__TEXT,custom_code,regular,pure_instructions")] +static CODE: [u8; 10] = *b"0123456789"; + +#[unsafe(no_mangle)] +#[unsafe(link_section = "__DATA,all_attributes,regular,pure_instructions\ + +no_toc+strip_static_syms+no_dead_strip+live_support\ + +self_modifying_code+debug")] +static ALL_THE_ATTRIBUTES: u32 = 42; + +#[unsafe(no_mangle)] +#[unsafe(link_section = "__DATA,__mod_init_func,mod_init_funcs")] +static CONSTRUCTOR: extern "C" fn() = constructor; +extern "C" fn constructor() {} diff --git a/tests/run-make/macho-link-section/rmake.rs b/tests/run-make/macho-link-section/rmake.rs new file mode 100644 index 0000000000000..e59dc5f40f4f4 --- /dev/null +++ b/tests/run-make/macho-link-section/rmake.rs @@ -0,0 +1,47 @@ +//! Test that various Mach-O `#[link_section]` values are parsed and passed on correctly by codegen +//! backends. +//@ only-apple +use run_make_support::{llvm_objdump, rustc}; + +fn main() { + rustc().input("foo.rs").crate_type("lib").arg("--emit=obj").run(); + + let stdout = + llvm_objdump().arg("--macho").arg("--private-headers").input("foo.o").run().stdout_utf8(); + + let expected = [ + ("__TEXT", "custom_code", "S_REGULAR", "PURE_INSTRUCTIONS"), + ("__DATA", "__mod_init_func", "S_MOD_INIT_FUNC_POINTERS", "(none)"), + ( + "__DATA", + "all_attributes", + "S_REGULAR", + "PURE_INSTRUCTIONS NO_TOC STRIP_STATIC_SYMS \ + NO_DEAD_STRIP LIVE_SUPPORT SELF_MODIFYING_CODE DEBUG", + ), + ]; + + for (segment, section, section_type, section_attributes) in expected { + let mut found = false; + // Skip header. + for section_info in stdout.split("Section").skip(1) { + if section_info.contains(&format!("segname {segment}")) + && section_info.contains(&format!("sectname {section}")) + { + assert!( + section_info.contains(&format!("type {section_type}")), + "should have type {section_type:?}" + ); + assert!( + section_info.contains(&format!("attributes {section_attributes}\n")), + "should have attributes {section_attributes:?}" + ); + found = true; + } + } + + if !found { + panic!("could not find section {section} in binary"); + } + } +}