simple_elf 0.1.1

simple parser for amd64 elf files
Documentation
#![allow(non_camel_case_types)]

use nom::number;
use nom::IResult;

#[derive(Debug, Clone, Copy)]
#[repr(u64)]
pub enum DynamicTag {
    DT_NULL = 0,
    DT_NEEDED = 1,
    DT_PLTRELSZ = 2,
    DT_PLTGOT = 3,
    DT_HASH = 4,
    DT_STRTAB = 5,
    DT_SYMTAB = 6,
    DT_RELA = 7,
    DT_RELASZ = 8,
    DT_RELAENT = 9,
    DT_STRSZ = 10,
    DT_SYMENT = 11,
    DT_INIT = 12,
    DT_FINI = 13,
    DT_SONAME = 14,
    DT_RPATH = 15,
    DT_SYMBOLIC = 16,
    DT_REL = 17,
    DT_RELSZ = 18,
    DT_RELENT = 19,
    DT_PLTREL = 20,
    DT_DEBUG = 21,
    DT_TEXTREL = 22,
    DT_JMPREL = 23,
    DT_BIND_NOW = 24,
    DT_INIT_ARRAY = 25,
    DT_FINI_ARRAY = 26,
    DT_INIT_ARRAYSZ = 27,
    DT_FINI_ARRAYSZ = 28,
    DT_RUN_PATH = 0x1d,
    DT_GNU_HASH = 0x6ffffef5,
    DT_Flags1 = 0x6ffffffb,
    DT_RELA_COUNT = 0x6ffffff9,
    DT_X86_64_PLT = 0x70000000,
    DT_X86_64_PLTSZ = 0x70000001,
    DT_X86_64_PLTENT = 0x70000003,
    UNSPECIFIED(u64),
}

impl Into<u64> for DynamicTag {
    fn into(self) -> u64 {
        match self {
            Self::DT_NULL => 0,
            Self::DT_NEEDED => 1,
            Self::DT_PLTRELSZ => 2,
            Self::DT_PLTGOT => 3,
            Self::DT_HASH => 4,
            Self::DT_STRTAB => 5,
            Self::DT_SYMTAB => 6,
            Self::DT_RELA => 7,
            Self::DT_RELASZ => 8,
            Self::DT_RELAENT => 9,
            Self::DT_STRSZ => 10,
            Self::DT_SYMENT => 11,
            Self::DT_INIT => 12,
            Self::DT_FINI => 13,
            Self::DT_SONAME => 14,
            Self::DT_RPATH => 15,
            Self::DT_SYMBOLIC => 16,
            Self::DT_REL => 17,
            Self::DT_RELSZ => 18,
            Self::DT_RELENT => 19,
            Self::DT_PLTREL => 20,
            Self::DT_DEBUG => 21,
            Self::DT_TEXTREL => 22,
            Self::DT_JMPREL => 23,
            Self::DT_BIND_NOW => 24,
            Self::DT_INIT_ARRAY => 25,
            Self::DT_FINI_ARRAY => 26,
            Self::DT_INIT_ARRAYSZ => 27,
            Self::DT_FINI_ARRAYSZ => 28,
            Self::DT_RUN_PATH => 0x1d,
            Self::DT_GNU_HASH => 0x6ffffef5,
            Self::DT_Flags1 => 0x6ffffffb,
            Self::DT_RELA_COUNT => 0x6ffffff9,
            Self::DT_X86_64_PLT => 0x70000000,
            Self::DT_X86_64_PLTSZ => 0x70000001,
            Self::DT_X86_64_PLTENT => 0x70000003,
            Self::UNSPECIFIED(v) => v,
        }
    }
}

impl From<u64> for DynamicTag {
    fn from(value: u64) -> Self {
        match value {
            0 => Self::DT_NULL,
            1 => Self::DT_NEEDED,
            2 => Self::DT_PLTRELSZ,
            3 => Self::DT_PLTGOT,
            4 => Self::DT_HASH,
            5 => Self::DT_STRTAB,
            6 => Self::DT_SYMTAB,
            7 => Self::DT_RELA,
            8 => Self::DT_RELASZ,
            9 => Self::DT_RELAENT,
            10 => Self::DT_STRSZ,
            11 => Self::DT_SYMENT,
            12 => Self::DT_INIT,
            13 => Self::DT_FINI,
            14 => Self::DT_SONAME,
            15 => Self::DT_RPATH,
            16 => Self::DT_SYMBOLIC,
            17 => Self::DT_REL,
            18 => Self::DT_RELSZ,
            19 => Self::DT_RELENT,
            20 => Self::DT_PLTREL,
            21 => Self::DT_DEBUG,
            22 => Self::DT_TEXTREL,
            23 => Self::DT_JMPREL,
            24 => Self::DT_BIND_NOW,
            25 => Self::DT_INIT_ARRAY,
            26 => Self::DT_FINI_ARRAY,
            27 => Self::DT_INIT_ARRAYSZ,
            28 => Self::DT_FINI_ARRAYSZ,
            0x1d => Self::DT_RUN_PATH,
            0x6ffffef5 => Self::DT_GNU_HASH,
            0x6ffffffb => Self::DT_Flags1,
            0x6ffffff9 => Self::DT_RELA_COUNT,
            0x70000000 => Self::DT_X86_64_PLT,
            0x70000001 => Self::DT_X86_64_PLTSZ,
            0x70000003 => Self::DT_X86_64_PLTENT,
            _ => Self::UNSPECIFIED(value),
        }
    }
}

pub struct Elf64_Dyn {
    pub d_tag: DynamicTag,
    pub val_ptr: u64,
}

impl Elf64_Dyn {
    pub fn parse(raw: &[u8]) -> IResult<&[u8], Self> {
        let (remaining, d_tag) = number::complete::le_u64(raw)?;
        let (remaining, val_ptr) = number::complete::le_u64(remaining)?;
        Ok((
            remaining,
            Self {
                d_tag: d_tag.into(),
                val_ptr,
            },
        ))
    }
}