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}