Forráskód Böngészése

Make sure strong symbols are preferred by ld_so

Jeremy Soller 3 éve
szülő
commit
824184a66c
2 módosított fájl, 16 hozzáadás és 11 törlés
  1. 3 3
      src/ld_so/dso.rs
  2. 13 8
      src/ld_so/linker.rs

+ 3 - 3
src/ld_so/dso.rs

@@ -96,11 +96,11 @@ impl DSO {
         return Ok((dso, tcb_master));
     }
 
-    pub fn get_sym(&self, name: &str) -> Option<Symbol> {
+    pub fn get_sym(&self, name: &str) -> Option<(Symbol, bool)> {
         if let Some(value) = self.global_syms.get(name) {
-            Some(*value)
+            Some((*value, true))
         } else if let Some(value) = self.weak_syms.get(name) {
-            Some(*value)
+            Some((*value, false))
         } else {
             None
         }

+ 13 - 8
src/ld_so/linker.rs

@@ -97,7 +97,7 @@ impl Linker {
     pub fn get_sym(&self, lib_id: usize, name: &str) -> Option<*mut c_void> {
         match self.objects.get(&lib_id) {
             Some(obj) => {
-                return obj.get_sym(name).map(|s| {
+                return obj.get_sym(name).map(|(s, strong)| {
                     if s.sym_type != STT_TLS {
                         s.as_ptr()
                     } else {
@@ -337,14 +337,19 @@ impl Linker {
                         _ => 0,
                     };
                     for lookup_id in lookup_start..symbols_lookup_objects.len() {
-                        let obj = &symbols_lookup_objects[lookup_id];
-                        let s = obj.get_sym(name);
-                        if s.is_some() {
-                            trace!("symbol {} from {} found in {}", name, obj.name, obj.name);
-                            symbol = s;
-                            t = obj.tls_offset;
+                        let lookup_obj = &symbols_lookup_objects[lookup_id];
+                        if let Some((s, strong)) = lookup_obj.get_sym(name) {
+                            trace!(
+                                "symbol {} from {} found in {} ({})",
+                                name, obj.name, lookup_obj.name, if strong { "strong" } else { "weak" }
+                            );
+                            symbol = Some(s);
+                            t = lookup_obj.tls_offset;
                             found = true;
-                            break;
+                            // Stop looking if any strong symbol is found
+                            if strong {
+                                break;
+                            }
                         }
                     }
                     // TODO: below doesn't work because of missing __preinit_array_{start,end} and __init_array_{start,end} symbols in dynamic linked programs