summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs46
1 files changed, 24 insertions, 22 deletions
diff --git a/src/main.rs b/src/main.rs
index c900d2a..5e6a07c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,7 +9,7 @@ use std::io::Read;
 struct Elf {
     header: &'static ElfHeader,
     sections: &'static [ElfSectionHeader],
-    // symbols: &'static Vec<ElfSymbol>,
+    symbols: &'static [ElfSymbol],
     strtab: *const u8,
 }
 
@@ -35,36 +35,38 @@ impl Elf {
             .iter()
             .find(|&&sec| sec.r#type == ElfSectionType::SymTab)
             .expect("No symbol table!");
-        let symstrtab = unsafe { bytes.as_ptr().add(symtab.link as usize) };
-        let symbols: Vec<&str> = unsafe {
+        //dbg!(&sections[symtab.link as usize]);
+        let symstrtab = &sections[symtab.link as usize];
+        let symbols = unsafe {
             std::slice::from_raw_parts(
                 bytes.as_ptr().add(symtab.offset as usize) as *const ElfSymbol,
                 (symtab.size / symtab.entsize) as usize,
             )
-        }
-        .iter()
-        .filter(|sym| sym.shndx != 0)
-        .map(|sym| unsafe {
-            std::ffi::CStr::from_ptr(symstrtab.add(sym.name as usize) as *const i8)
-                .to_str()
-                .unwrap_or("")
-        })
-        .filter(|name| name.len() > 1)
-        .collect();
-        dbg!(symbols);
-        // for sym in symbols {
+        };
+
+        // dbg!(symbols.len());
+        // .iter()
+        // .filter(|sym| sym.shndx != 0)
+        // .filter_map(|sym| unsafe {
+            // std::ffi::CStr::from_ptr(std::ptr::addr_of!(symstrtab).add(sym.name as usize) as *const i8).to_str().ok()
+        // })
+        // .filter(|name| name.len() > 1)
+        // .collect();
+        // dbg!(symbols);
+        for sym in symbols {
         //     dbg!(sym);
-        //     let name = unsafe {
-        //         std::ffi::CStr::from_ptr(symstrtab.add(sym.name as usize) as *const i8)
-        //             .to_str()
-        //             .unwrap_or("")
-        //     };
-        //     dbg!(name);
-        // }
+            let name = unsafe {
+                std::ffi::CStr::from_ptr(bytes.as_ptr().add(symstrtab.offset as usize).add(sym.name as usize) as *const i8)
+                    .to_str()
+                    .unwrap_or("")
+            };
+            dbg!(name);
+        }
 
         Elf {
             header,
             sections,
+            symbols,
             strtab,
         }
     }