Skip to content

Commit bc6f725

Browse files
committed
Don't let .debug_gdb_scripts become loadable into memory.
1 parent 12e76e2 commit bc6f725

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

src/librustc_trans/base.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -785,17 +785,19 @@ fn write_metadata<'a, 'gcx>(tcx: TyCtxt<'a, 'gcx, 'gcx>,
785785
tcx.sess.cstore.metadata_section_name(&tcx.sess.target.target);
786786
let name = CString::new(section_name).unwrap();
787787
llvm::LLVMSetSection(llglobal, name.as_ptr());
788-
789-
// Also generate a .section directive to force no
790-
// flags, at least for ELF outputs, so that the
791-
// metadata doesn't get loaded into memory.
792-
let directive = format!(".section {}", section_name);
793-
let directive = CString::new(directive).unwrap();
794-
llvm::LLVMSetModuleInlineAsm(metadata_llmod, directive.as_ptr())
788+
make_section_non_loadable(metadata_llmod, section_name);
795789
}
796790
return (metadata_llcx, metadata_llmod, metadata);
797791
}
798792

793+
/// Generate a .section directive to force no flags (e.g. for ELF outputs)
794+
/// so that the contents of that section don't get loaded into memory.
795+
pub unsafe fn make_section_non_loadable(llmod: ModuleRef, section: &str) {
796+
let directive = format!(".section {}", section);
797+
let directive = CString::new(directive).unwrap();
798+
llvm::LLVMSetModuleInlineAsm(llmod, directive.as_ptr())
799+
}
800+
799801
/// Find any symbols that are defined in one compilation unit, but not declared
800802
/// in any other compilation unit. Give these symbols internal linkage.
801803
fn internalize_symbols<'a, 'tcx>(sess: &Session,

src/librustc_trans/debuginfo/gdb.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use llvm;
1414

1515
use common::{C_bytes, CrateContext, C_i32};
16+
use base;
1617
use builder::Builder;
1718
use declare;
1819
use type_::Type;
@@ -51,7 +52,9 @@ pub fn get_or_insert_gdb_debug_scripts_section_global(ccx: &CrateContext)
5152
};
5253

5354
if section_var == ptr::null_mut() {
54-
let section_name = b".debug_gdb_scripts\0";
55+
let c_section_name = ".debug_gdb_scripts\0";
56+
let section_name = &c_section_name[..c_section_name.len()-1];
57+
5558
let section_contents = b"\x01gdb_load_rust_pretty_printers.py\0";
5659

5760
unsafe {
@@ -62,7 +65,8 @@ pub fn get_or_insert_gdb_debug_scripts_section_global(ccx: &CrateContext)
6265
llvm_type).unwrap_or_else(||{
6366
bug!("symbol `{}` is already defined", section_var_name)
6467
});
65-
llvm::LLVMSetSection(section_var, section_name.as_ptr() as *const _);
68+
llvm::LLVMSetSection(section_var, c_section_name.as_ptr() as *const _);
69+
base::make_section_non_loadable(ccx.llmod(), section_name);
6670
llvm::LLVMSetInitializer(section_var, C_bytes(ccx, section_contents));
6771
llvm::LLVMSetGlobalConstant(section_var, llvm::True);
6872
llvm::LLVMSetUnnamedAddr(section_var, llvm::True);

0 commit comments

Comments
 (0)