summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
authortzlil <tzlils@protonmail.com>2023-03-21 15:44:11 +0200
committertzlil <tzlils@protonmail.com>2023-03-21 15:44:11 +0200
commit5d8493cf7e2d725fbd2aeca1644f56ebdafd4cf9 (patch)
treed4e8118514a117c55c5997d21128cf249d88d724 /src/main.rs
parentc8a66c643afe2d0a2da55eac537b13a466c242c2 (diff)
finished section headers printing
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs
index 9be3a25..b517cd8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,13 +9,14 @@ use std::io::Read;
 struct Elf {
     header: &'static ElfHeader,
     sections: &'static [ElfSectionHeader],
+    strtab: *const u8,
 }
 
 impl Elf {
     pub fn new(bytes: &[u8]) -> Elf {
         let header = unsafe { &*(bytes.as_ptr() as *const ElfHeader) };
         assert_eq!(&header.ident.magic, b"\x7fELF");
-        
+
         let sections = unsafe {
             std::slice::from_raw_parts(
                 bytes.as_ptr().add(header.shoff as usize) as *const ElfSectionHeader,
@@ -23,23 +24,22 @@ impl Elf {
             )
         };
 
-        let strtab = &sections[header.shstrndx as usize];
-        let strtab_section = unsafe { bytes.as_ptr().add(strtab.offset as usize) };
+        let strtab = unsafe {
+            bytes
+                .as_ptr()
+                .add((&sections[header.shstrndx as usize]).offset as usize)
+        };
 
-        // let names = unsafe {
-        //     std::slice::from_raw_parts(
-        //         strtab_section as *const u8,
-        //         strtab.size as usize,
-        //     )
-        // };
-        // dbg!(std::str::from_utf8(&names).unwrap());
-        for sec in sections {
-            println!("{:?}", unsafe { std::ffi::CStr::from_ptr(
-                strtab_section.add(sec.name as usize) as *const i8
-            )});
+        // for sec in sections {
+        //     println!("{:?}", unsafe { std::ffi::CStr::from_ptr(
+        //         strtab.add(sec.name as usize) as *const i8
+        //     )});
+        // }
+        Elf {
+            header,
+            sections,
+            strtab,
         }
-        // dbg!(sections[5].r#type as u32);
-        Elf { header, sections }
     }
 }
 
@@ -47,7 +47,29 @@ impl Elf {
 impl std::fmt::Display for Elf {
     fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
         formatter.write_str("ELF Header:\n")?;
-        formatter.write_fmt(format_args!("{}", self.header))
+        formatter.write_fmt(format_args!("{}\n", self.header))?;
+
+        formatter.write_str("Section Headers:\n")?;
+        formatter
+            .write_str("  [Nr] Name              Type             Address           Offset\n")?;
+        formatter
+            .write_str("       Size              EntSize          Flags  Link  Info  Align\n")?;
+
+        for (i, section) in self.sections.iter().enumerate() {
+            let name = unsafe {
+                std::ffi::CStr::from_ptr(self.strtab.add(section.name as usize) as *const i8)
+                    .to_str()
+                    .expect("Bad section name")
+            };
+            formatter.write_fmt(format_args!("  [{: >2}] {: <17.17} {}\n", i, name, section))?;
+        }
+
+        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("  C (compressed), x (unknown), o (OS specific), E (exclude),\n")?;
+        formatter.write_str("  D (mbind), l (large), p (processor specific)\n")?;
+        Ok(())
     }
 }
 
@@ -62,5 +84,5 @@ fn main() {
         buffer
     };
     let elf = Elf::new(&buffer[..]);
-    // println!("{}", elf);
+    println!("{}", elf);
 }