diff options
| author | Antoni Boucher <bouanto@zoho.com> | 2025-01-08 21:26:26 -0500 |
|---|---|---|
| committer | Antoni Boucher <bouanto@zoho.com> | 2025-01-11 10:41:31 -0500 |
| commit | 59afbe091324294b40528db7e6bbd55d1a47b447 (patch) | |
| tree | 84ac9f845f7d3b5b6296310d12c600f931ad8e1b | |
| parent | 8bc4863951fb685902bc55e2667802bdd7a6ceb9 (diff) | |
| download | rust-59afbe091324294b40528db7e6bbd55d1a47b447.tar.gz rust-59afbe091324294b40528db7e6bbd55d1a47b447.zip | |
Fix for the relocation bug
| -rw-r--r-- | build_system/src/build.rs | 16 | ||||
| -rw-r--r-- | build_system/src/test.rs | 19 | ||||
| -rw-r--r-- | src/base.rs | 23 | ||||
| -rw-r--r-- | src/consts.rs | 16 | ||||
| -rw-r--r-- | src/declare.rs | 4 | ||||
| -rw-r--r-- | src/lib.rs | 1 | ||||
| -rw-r--r-- | src/mono_item.rs | 3 |
7 files changed, 65 insertions, 17 deletions
diff --git a/build_system/src/build.rs b/build_system/src/build.rs index e93e8570e6a..b62bd44c6ac 100644 --- a/build_system/src/build.rs +++ b/build_system/src/build.rs @@ -158,18 +158,28 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu let mut env = env.clone(); /*rustflags.push_str(" -C link-arg=-Wl,--verbose"); - rustflags.push_str(" -C link-arg=-Wl,--warn-ifunc-textrel"); + rustflags.push_str(" -C link-arg=-Wl,--warn-shared-textrel"); // Mold and Gold. + //rustflags.push_str(" -C link-arg=-Wl,--warn-textrel"); // Mold rustflags.push_str(" -C link-arg=-Wl,--warn-unresolved-symbols"); rustflags.push_str(" -C link-arg=-Wl,--fatal-warnings"); + rustflags.push_str(" -C link-arg=-Wl,--print-gc-sections");*/ + //rustflags.push_str(" -C link-arg=-Wl,--no-apply-dynamic-relocs"); // Mold + /*rustflags.push_str(" -C link-arg=-Wl,--warn-ifunc-textrel"); rustflags.push_str(" -C link-arg=-Wl,--warn-backrefs"); rustflags.push_str(" -C link-arg=-Wl,-znotext"); //rustflags.push_str(" -C link-arg=-Wl,--emit-relocs"); //rustflags.push_str(" -C link-arg=-Wl,--trace-symbol=memchr::arch::x86_64::memchr::memchr_raw::FN"); //rustflags.push_str(" -C link-arg=-Wl,--trace-symbol=_ZN6memchr4arch6x86_646memchr10memchr_raw2FN17haaf621f7b8ca567eE"); //rustflags.push_str(" -C link-arg=-Wl,--print-map"); - //rustflags.push_str(" -C link-arg=-Wl,"); + //rustflags.push_str(" -C link-arg=-Wl,");*/ + //rustflags.push_str(" -Clinker=/usr/bin/ld.gold"); + // TODO: try with verbose, warnings and logs. + //rustflags.push_str(" -Clinker=/usr/bin/clang"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/mold"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/ld.bfd"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/ld.gold"); + env.insert("RUSTC_LOG".to_string(), "rustc_codegen_ssa::back::link=info".to_string()); env.insert("RUSTFLAGS".to_string(), rustflags); - env.insert("RUSTC_LOG".to_string(), "rustc_codegen_ssa::back::link=info".to_string());*/ run_command_with_output_and_env(&args, Some(&start_dir), Some(&env))?; // Copy files to sysroot diff --git a/build_system/src/test.rs b/build_system/src/test.rs index 2886062043b..6a70fe8d2b8 100644 --- a/build_system/src/test.rs +++ b/build_system/src/test.rs @@ -697,14 +697,23 @@ fn test_libcore(env: &Env, args: &TestArg) -> Result<(), String> { let rustflags = env.entry("RUSTFLAGS".to_string()) .or_default(); - rustflags.push_str(" -C link-arg=-Wl,--verbose"); - rustflags.push_str(" -C link-arg=-Wl,--warn-ifunc-textrel"); - rustflags.push_str(" -C link-arg=-Wl,--warn-unresolved-symbols"); - rustflags.push_str(" -C link-arg=-Wl,--fatal-warnings"); + //rustflags.push_str(" -C link-arg=-Wl,--verbose"); + //rustflags.push_str(" -C link-arg=-Wl,--fatal-warnings"); + //rustflags.push_str(" -C link-arg=-Wl,--warn-unresolved-symbols"); + //rustflags.push_str(" -C link-arg=-Wl,--warn-shared-textrel"); // Mold and Gold. + //rustflags.push_str(" -C link-arg=-Wl,--warn-textrel"); // Mold + //rustflags.push_str(" -C link-arg=-Wl,--print-gc-sections"); + //rustflags.push_str(" -C link-arg=-Wl,--no-apply-dynamic-relocs"); // Mold + /*rustflags.push_str(" -C link-arg=-Wl,--warn-ifunc-textrel"); rustflags.push_str(" -C link-arg=-Wl,--warn-backrefs"); rustflags.push_str(" -C link-arg=-Wl,-znotext"); rustflags.push_str(" -C link-arg=-Wl,--emit-relocs"); - rustflags.push_str(" -C link-arg=-Wl,--trace-symbol=memchr::arch::x86_64::memchr::memchr_raw::FN"); + rustflags.push_str(" -C link-arg=-Wl,--trace-symbol=memchr::arch::x86_64::memchr::memchr_raw::FN");*/ + //rustflags.push_str(" -Clinker=/usr/bin/ld.gol"); + //rustflags.push_str(" -Clinker=/usr/bin/clang"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/mold"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/ld.bfd"); + //rustflags.push_str(" -Clink-arg=--ld-path=/usr/bin/ld.gold"); // FIXME FIXME: seems like RUSTFLAGS is not set here. //rustflags.push_str(" -C link-arg=-Wl,--trace-symbol=_ZN6memchr4arch6x86_646memchr10memchr_raw2FN17haaf621f7b8ca567eE"); //rustflags.push_str(" -C link-arg=-Wl,--print-map"); diff --git a/src/base.rs b/src/base.rs index c92dbc98195..d457928ce08 100644 --- a/src/base.rs +++ b/src/base.rs @@ -43,8 +43,8 @@ pub fn symbol_visibility_to_gcc(visibility: SymbolVisibility) -> gccjit::Visibil pub fn global_linkage_to_gcc(linkage: Linkage) -> GlobalKind { match linkage { - Linkage::External => GlobalKind::Imported, - Linkage::AvailableExternally => GlobalKind::Imported, + Linkage::External => GlobalKind::Exported, + Linkage::AvailableExternally => GlobalKind::Exported, Linkage::LinkOnceAny => unimplemented!(), Linkage::LinkOnceODR => unimplemented!(), Linkage::WeakAny => unimplemented!(), @@ -151,8 +151,23 @@ pub fn compile_codegen_unit( }); } - if tcx.sess.relocation_model() == rustc_target::spec::RelocModel::Static { - context.add_command_line_option("-fno-pie"); + match tcx.sess.relocation_model() { + rustc_target::spec::RelocModel::Static => { + //println!("*** Static"); + context.add_command_line_option("-fno-pie"); + context.add_driver_option("-fno-pie"); + }, + rustc_target::spec::RelocModel::Pic => { + //println!("*** Pic"); + context.add_command_line_option("-fPIC"); + context.add_driver_option("-fPIC"); + }, + rustc_target::spec::RelocModel::Pie => { + //println!("*** Pie"); + context.add_command_line_option("-fPIE"); + context.add_driver_option("-fPIE"); + }, + model => eprintln!("Unsupported relocation model: {:?}", model), } let target_cpu = gcc_util::target_cpu(tcx.sess); diff --git a/src/consts.rs b/src/consts.rs index 32b43e72b11..7cba39bcea1 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -97,8 +97,10 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> { // def_id). let var_name = format!("{:?}", global); if var_name.contains("FN") && var_name.contains("memchr") { - println!("Var name: {:?}", var_name); + //println!("Var name: {:?}", var_name); + println!("INITIALIZE: {:?} = {:?}", var_name, value); + /* let ptr_type = value.get_type().make_pointer(); // TODO: remove \x01 @@ -108,8 +110,9 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> { imp_name.push_str(&var_name); // FIXME: if I understand correctly the code in cg_llvm, the kind should be Imported. - /*let imp_global = self.context.new_global(None, GlobalKind::Exported, ptr_type, &imp_name); - imp_global.global_set_initializer_rvalue(global.get_address(None));*/ + let imp_global = self.context.new_global(None, GlobalKind::Exported, ptr_type, &imp_name); + imp_global.global_set_initializer_rvalue(global.get_address(None)); + */ /* /*let context = gccjit::Context::default(); @@ -122,7 +125,6 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> { let my_name = format!("MY_NAME${}", var_name); //let global = self.context.new_global(None, GlobalKind::Exported, fn_ptr_type, my_name); //global.add_attribute(VarAttribute::Used); - println!("{:?} = {:?}", var_name, value); let my_func_name = format!("MY_FUNC${}", var_name); let func = self.context.new_function(None, FunctionType::Exported, void_type, &[], &my_func_name, false); @@ -166,6 +168,7 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> { //let value = self.context.new_bitcast(None, value, fn_ptr_type); // Also WORKS let value = self.context.new_bitcast(None, value, val_llty);*/ global.global_set_initializer_rvalue(value); + println!("=== AFTER INITIALIZE"); } else { global.global_set_initializer_rvalue(value); @@ -326,10 +329,13 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { } let is_tls = fn_attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL); + if sym.contains("memchr") && sym.contains("FN") { + println!("** DECLARE"); + } let global = self.declare_global( sym, gcc_type, - GlobalKind::Exported, + GlobalKind::Imported, is_tls, fn_attrs.link_section, ); diff --git a/src/declare.rs b/src/declare.rs index 442488b7fd6..ac82ed4b3b8 100644 --- a/src/declare.rs +++ b/src/declare.rs @@ -29,6 +29,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { } global } else { + // HERE: ExternalLinkage. self.declare_global(name, ty, GlobalKind::Exported, is_tls, link_section) } } @@ -69,6 +70,9 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { is_tls: bool, link_section: Option<Symbol>, ) -> LValue<'gcc> { + if name.contains("memchr") && name.contains("FN") { + println!("{}: {:?}: {:?}", self.codegen_unit.name(), name, global_kind); + } let global = self.context.new_global(None, global_kind, ty, name); if is_tls { global.set_tls_model(self.tls_model); diff --git a/src/lib.rs b/src/lib.rs index cc57ac5fb71..a71ec9ba6a4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -269,6 +269,7 @@ impl CodegenBackend for GccCodegenBackend { fn new_context<'gcc, 'tcx>(tcx: TyCtxt<'tcx>) -> Context<'gcc> { let context = Context::default(); + //context.add_driver_option("-pie"); if tcx.sess.target.arch == "x86" || tcx.sess.target.arch == "x86_64" { context.add_command_line_option("-masm=intel"); } diff --git a/src/mono_item.rs b/src/mono_item.rs index 239902df7f0..90d4386a760 100644 --- a/src/mono_item.rs +++ b/src/mono_item.rs @@ -32,6 +32,9 @@ impl<'gcc, 'tcx> PreDefineCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> { let gcc_type = self.layout_of(ty).gcc_type(self); let is_tls = attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL); + if symbol_name.contains("memchr") && symbol_name.contains("FN") { + println!("** DECLARE static"); + } let global = self.define_global(symbol_name, gcc_type, is_tls, attrs.link_section); #[cfg(feature = "master")] global.add_attribute(VarAttribute::Visibility(base::visibility_to_gcc(visibility))); |
