瀏覽代碼

Make "./a.out" entry the first in rmap list

This fixes a regression in gdb where sometimes it decides to ignore the
first entry in the list.
oddcoder 5 年之前
父節點
當前提交
850dfd971b
共有 2 個文件被更改,包括 15 次插入2 次删除
  1. 14 1
      src/ld_so/debug.rs
  2. 1 1
      src/ld_so/linker.rs

+ 14 - 1
src/ld_so/debug.rs

@@ -52,6 +52,16 @@ impl RTLDDebug {
         }
         return;
     }
+    pub fn insert_first(&mut self, l_addr: usize, name: &str, l_ld: usize) {
+        if self.r_map.is_null() {
+            self.r_map = LinkMap::new_with_args(l_addr, name, l_ld);
+        } else {
+            let tmp = self.r_map;
+            self.r_map = LinkMap::new_with_args(l_addr, name, l_ld);
+            unsafe { (*self.r_map).link(&mut *tmp) };
+        }
+        return;
+    }
 }
 
 #[repr(C)]
@@ -80,7 +90,10 @@ impl LinkMap {
         });
         Box::into_raw(map)
     }
-
+    fn link(&mut self, map: &mut LinkMap) {
+        map.l_prev = self as *mut LinkMap;
+        self.l_next = map as *mut LinkMap;
+    }
     fn new_with_args(l_addr: usize, name: &str, l_ld: usize) -> *mut Self {
         let map = LinkMap::new();
         unsafe {

+ 1 - 1
src/ld_so/linker.rs

@@ -429,7 +429,7 @@ impl Linker {
                         size,
                         sys_mman::PROT_READ | sys_mman::PROT_WRITE,
                     );
-                    _r_debug.insert(addr as usize, &elf_name, addr + l_ld as usize);
+                    _r_debug.insert_first(addr as usize, &elf_name, addr + l_ld as usize);
                     slice::from_raw_parts_mut(addr as *mut u8, size)
                 } else {
                     let size = bounds.1;