about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAntoni Boucher <bouanto@zoho.com>2025-01-08 21:26:26 -0500
committerAntoni Boucher <bouanto@zoho.com>2025-01-11 10:41:31 -0500
commit59afbe091324294b40528db7e6bbd55d1a47b447 (patch)
tree84ac9f845f7d3b5b6296310d12c600f931ad8e1b
parent8bc4863951fb685902bc55e2667802bdd7a6ceb9 (diff)
downloadrust-59afbe091324294b40528db7e6bbd55d1a47b447.tar.gz
rust-59afbe091324294b40528db7e6bbd55d1a47b447.zip
Fix for the relocation bug
-rw-r--r--build_system/src/build.rs16
-rw-r--r--build_system/src/test.rs19
-rw-r--r--src/base.rs23
-rw-r--r--src/consts.rs16
-rw-r--r--src/declare.rs4
-rw-r--r--src/lib.rs1
-rw-r--r--src/mono_item.rs3
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)));