summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authortzlil <tzlils@protonmail.com>2023-03-21 17:00:25 +0200
committertzlil <tzlils@protonmail.com>2023-03-21 17:00:25 +0200
commit651c189659a082eaca2a945232c934dd822735c9 (patch)
tree1a71481eb8d6c36a947b7e9bf42053c3d9931e3f /src/main.rs
parent6a4885f8e0ac840fff26ee99fd6bd8bfa2edaae9 (diff)
add fenix to flake, change to nightly
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs
index b517cd8..c900d2a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,7 @@
 // #![allow(incomplete_features)]
 // #![feature(unsized_locals)]
 mod structs;
-use crate::structs::{ElfHeader, ElfSectionHeader};
+use crate::structs::{ElfHeader, ElfSectionHeader, ElfSectionType, ElfSymbol};
 use std::io::Read;
 
 #[repr(C)]
@@ -9,6 +9,7 @@ use std::io::Read;
 struct Elf {
     header: &'static ElfHeader,
     sections: &'static [ElfSectionHeader],
+    // symbols: &'static Vec<ElfSymbol>,
     strtab: *const u8,
 }
 
@@ -30,11 +31,37 @@ impl Elf {
                 .add((&sections[header.shstrndx as usize]).offset as usize)
         };
 
-        // for sec in sections {
-        //     println!("{:?}", unsafe { std::ffi::CStr::from_ptr(
-        //         strtab.add(sec.name as usize) as *const i8
-        //     )});
+        let symtab = sections
+            .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 {
+            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!(sym);
+        //     let name = unsafe {
+        //         std::ffi::CStr::from_ptr(symstrtab.add(sym.name as usize) as *const i8)
+        //             .to_str()
+        //             .unwrap_or("")
+        //     };
+        //     dbg!(name);
         // }
+
         Elf {
             header,
             sections,
@@ -65,8 +92,12 @@ impl std::fmt::Display for Elf {
         }
 
         formatter.write_str("Key to Flags:\n")?;
-        formatter.write_str("  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n")?;
-        formatter.write_str("  L (link order), O (extra OS processing required), G (group), T (TLS),\n")?;
+        formatter.write_str(
+            "  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n",
+        )?;
+        formatter.write_str(
+            "  L (link order), O (extra OS processing required), G (group), T (TLS),\n",
+        )?;
         formatter.write_str("  C (compressed), x (unknown), o (OS specific), E (exclude),\n")?;
         formatter.write_str("  D (mbind), l (large), p (processor specific)\n")?;
         Ok(())
@@ -84,5 +115,7 @@ fn main() {
         buffer
     };
     let elf = Elf::new(&buffer[..]);
-    println!("{}", elf);
+    // println!("{}", elf);
+
+    // dbg!(symtab);
 }