From 850dfd971b54d1864331478e56b202d691fa83b2 Mon Sep 17 00:00:00 2001 From: oddcoder Date: Sun, 3 May 2020 12:35:01 +0200 Subject: [PATCH] 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. --- src/ld_so/debug.rs | 15 ++++++++++++++- src/ld_so/linker.rs | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/ld_so/debug.rs b/src/ld_so/debug.rs index 8780cc1f26..d6838e08a7 100644 --- a/src/ld_so/debug.rs +++ b/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 { diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index 8fc7bc876b..1b47d5c38e 100644 --- a/src/ld_so/linker.rs +++ b/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;