1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::*;

#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum SHTYPE {
    NULL,
    PROGBITS,
    SYMTAB,
    STRTAB,
    RELA,
    HASH,
    DYNAMIC,
    NOTE,
    NOBITS,
    REL,
    SHLIB,
    DYNSYM,
    NUM,
    ANY(Elf64Word),
}

impl SHTYPE {
    pub fn to_bytes(&self) -> Elf64Word {
        match self {
            Self::NULL => 0,
            Self::PROGBITS => 1,
            Self::SYMTAB => 2,
            Self::STRTAB => 3,
            Self::RELA => 4,
            Self::HASH => 5,
            Self::DYNAMIC => 6,
            Self::NOTE => 7,
            Self::NOBITS => 8,
            Self::REL => 9,
            Self::SHLIB => 10,
            Self::DYNSYM => 11,
            Self::NUM => 12,
            Self::ANY(c) => *c,
        }
    }
}

impl From<Elf64Word> for SHTYPE {
    fn from(bytes: Elf64Word) -> Self {
        match bytes {
            0 => Self::NULL,
            1 => Self::PROGBITS,
            2 => Self::SYMTAB,
            3 => Self::STRTAB,
            4 => Self::RELA,
            5 => Self::HASH,
            6 => Self::DYNAMIC,
            7 => Self::NOTE,
            8 => Self::NOBITS,
            9 => Self::REL,
            10 => Self::SHLIB,
            11 => Self::DYNSYM,
            12 => Self::NUM,
            _ => Self::ANY(bytes),
        }
    }
}