ctf_pwn/unix/
symbol.rs

1use crate::unix::error::ElfError;
2use elf::endian::AnyEndian;
3use elf::string_table::StringTable;
4use elf::ElfBytes;
5
6pub struct Symbol {
7    pub name: String,
8    pub shndx: u16,
9    pub value: u64,
10    pub size: u64,
11}
12
13impl Symbol {
14    fn parse(value: &elf::symbol::Symbol, string_table: &StringTable) -> Result<Self, ElfError> {
15        let name = match value.st_name {
16            0 => String::new(),
17            idx => string_table.get(idx as usize)?.to_string(),
18        };
19        Ok(Symbol {
20            name,
21            shndx: value.st_shndx,
22            value: value.st_value,
23            size: value.st_size,
24        })
25    }
26
27    fn parse_table<'a>(
28        table: &elf::symbol::SymbolTable<'a, AnyEndian>,
29        string_table: &StringTable,
30    ) -> Result<Vec<Self>, ElfError> {
31        table
32            .iter()
33            .map(|s| Self::parse(&s, string_table))
34            .collect()
35    }
36
37    pub(crate) fn parse_symbol_table(file: &ElfBytes<AnyEndian>) -> Result<Vec<Self>, ElfError> {
38        match file.symbol_table()? {
39            None => Ok(Vec::new()),
40            Some((table, string_table)) => Self::parse_table(&table, &string_table),
41        }
42    }
43
44    pub(crate) fn parse_dynamic_symbol_table(file: &ElfBytes<AnyEndian>) -> Result<Vec<Self>, ElfError> {
45        match file.dynamic_symbol_table()? {
46            None => Ok(Vec::new()),
47            Some((table, string_table)) => Self::parse_table(&table, &string_table),
48        }
49    }
50}