Get rid of the .note interpretation of rustc dylib metadata.

This commit is contained in:
Eduard Burtescu 2016-08-14 11:16:28 +03:00
parent 02aec40dc9
commit 1bb1444516
2 changed files with 28 additions and 26 deletions

View File

@ -867,34 +867,29 @@ fn get_metadata_section_imp(target: &Target, flavor: CrateFlavor, filename: &Pat
}
pub fn meta_section_name(target: &Target) -> &'static str {
// Historical note:
//
// When using link.exe it was seen that the section name `.note.rustc`
// was getting shortened to `.note.ru`, and according to the PE and COFF
// specification:
//
// > Executable images do not use a string table and do not support
// > section names longer than 8 characters
//
// https://msdn.microsoft.com/en-us/library/windows/hardware/gg463119.aspx
//
// As a result, we choose a slightly shorter name! As to why
// `.note.rustc` works on MinGW, that's another good question...
if target.options.is_like_osx {
"__DATA,__note.rustc"
} else if target.options.is_like_msvc {
// When using link.exe it was seen that the section name `.note.rustc`
// was getting shortened to `.note.ru`, and according to the PE and COFF
// specification:
//
// > Executable images do not use a string table and do not support
// > section names longer than 8 characters
//
// https://msdn.microsoft.com/en-us/library/windows/hardware/gg463119.aspx
//
// As a result, we choose a slightly shorter name! As to why
// `.note.rustc` works on MinGW, that's another good question...
".rustc"
"__DATA,.rustc"
} else {
".note.rustc"
".rustc"
}
}
pub fn read_meta_section_name(target: &Target) -> &'static str {
if target.options.is_like_osx {
"__note.rustc"
} else if target.options.is_like_msvc {
".rustc"
} else {
".note.rustc"
}
pub fn read_meta_section_name(_target: &Target) -> &'static str {
".rustc"
}
// A diagnostic function for dumping crate metadata to an output stream

View File

@ -2250,10 +2250,17 @@ fn write_metadata(cx: &SharedCrateContext,
};
unsafe {
llvm::LLVMSetInitializer(llglobal, llconst);
let name =
let section_name =
cx.tcx().sess.cstore.metadata_section_name(&cx.sess().target.target);
let name = CString::new(name).unwrap();
llvm::LLVMSetSection(llglobal, name.as_ptr())
let name = CString::new(section_name).unwrap();
llvm::LLVMSetSection(llglobal, name.as_ptr());
// Also generate a .section directive to force no
// flags, at least for ELF outputs, so that the
// metadata doesn't get loaded into memory.
let directive = format!(".section {}", section_name);
let directive = CString::new(directive).unwrap();
llvm::LLVMSetModuleInlineAsm(cx.metadata_llmod(), directive.as_ptr())
}
return metadata;
}