From 651c189659a082eaca2a945232c934dd822735c9 Mon Sep 17 00:00:00 2001 From: tzlil Date: Tue, 21 Mar 2023 17:00:25 +0200 Subject: add fenix to flake, change to nightly --- src/main.rs | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) (limited to 'src/main.rs') 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, strtab: *const u8, } @@ -30,11 +31,37 @@ impl Elf { .add((§ions[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); } -- cgit 1.4.1