144 lines
4.0 KiB
Rust
144 lines
4.0 KiB
Rust
|
//Declaration des alias
|
||
|
|
||
|
/*
|
||
|
Def ELF :
|
||
|
|
||
|
The header file <elf.h> defines the format of ELF executable binary
|
||
|
files. Amongst these files are normal executable files, relocatable
|
||
|
object files, core files and shared libraries.
|
||
|
|
||
|
An executable file using the ELF file format consists of an ELF header,
|
||
|
followed by a program header table or a section header table, or both.
|
||
|
The ELF header is always at offset zero of the file. The program
|
||
|
header table and the section header table's offset in the file are
|
||
|
defined in the ELF header. The two tables describe the rest of the
|
||
|
particularities of the file
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Type for a 16-bit quantity. */
|
||
|
|
||
|
type Elf32_Half = u16;
|
||
|
|
||
|
type Elf64_Half = u16;
|
||
|
|
||
|
/* Types for signed and unsigned 32-bit quantities. */
|
||
|
|
||
|
type Elf32_Word = u32;
|
||
|
|
||
|
type Elf32_Sword = i32;
|
||
|
|
||
|
type Elf64_Word = u32;
|
||
|
|
||
|
type Elf64_Sword = i32;
|
||
|
|
||
|
/* Types for signed and unsigned 64-bit quantities. */
|
||
|
|
||
|
type Elf32_Xword = u64;
|
||
|
|
||
|
type Elf32_Sxword = i64;
|
||
|
|
||
|
type Elf64_Xword = u64;
|
||
|
|
||
|
type Elf64_Sxword = i64;
|
||
|
|
||
|
/* Type of addresses. */
|
||
|
|
||
|
type Elf32_Addr = u32;
|
||
|
|
||
|
type Elf64_Addr = u64;
|
||
|
|
||
|
/* Type of file offsets. */
|
||
|
|
||
|
type Elf32_Off = u32;
|
||
|
|
||
|
type Elf64_Off = u64;
|
||
|
|
||
|
//role de ce truc ?
|
||
|
const EI_NIDENT : u8 = 16;
|
||
|
|
||
|
//ELF file header 32 bits
|
||
|
struct Elf32Ehdr{
|
||
|
e_ident : [u8;EI_NIDENT],//16 octects décrivant comment le fichier doit etre parsé
|
||
|
//e_ident must starts with magice number : 0x 7f 45 4c 46
|
||
|
e_type : Elf32_Half,//type of the file
|
||
|
e_machine : Elf32_Half,//type architecture machine
|
||
|
e_version : Elf32_Word,//always 1
|
||
|
e_entry : Elf32_Addr,//entry point @ for executable
|
||
|
e_phoff : Elf32_Off,//Offset of the program header table
|
||
|
e_shoff : Elf32_Off,//Offset of the section header table
|
||
|
e_flags : Elf32_Word,//des flags ?
|
||
|
e_ehsize : Elf32_Half,//size of this (the header), redundant
|
||
|
e_phentsize : Elf32_Half,//size per program header
|
||
|
e_phnum : Elf32_Half,//number of program header
|
||
|
e_shentsize : Elf32_Half,//size per section header
|
||
|
e_shnum : Elf32_Half,//number of section header
|
||
|
e_shstrndx : Elf32_Half//section header string table index
|
||
|
}
|
||
|
|
||
|
|
||
|
//ELF file header 64 bits
|
||
|
//les champs ont le meme rôle que dans le header 32 bits
|
||
|
struct Elf64Ehdr{
|
||
|
e_ident : [u8;EI_NIDENT],
|
||
|
e_type : Elf64_Half,
|
||
|
e_machine : Elf64_Half,
|
||
|
e_version : Elf64_Word,
|
||
|
e_entry : Elf64_Addr,
|
||
|
e_phoff : Elf64_Off,
|
||
|
e_shoff : Elf64_Off,
|
||
|
e_flags : Elf64_Word,
|
||
|
e_ehsize : Elf64_Half,
|
||
|
e_phentsize : Elf64_Half,
|
||
|
e_phnum : Elf64_Half,
|
||
|
e_shentsize : Elf64_Half,
|
||
|
e_shnum : Elf64_Half,
|
||
|
e_shstrndx : Elf64_Half
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* e_ident offsets */
|
||
|
const EI_MAG0 : u32 = 0;
|
||
|
const EI_MAG1 : u32 = 1;
|
||
|
const EI_MAG2 : u32 = 2;
|
||
|
const EI_MAG3 : u32 = 3;
|
||
|
const EI_CLASS : u32 = 4;
|
||
|
const EI_DATA : u32 = 5;
|
||
|
const EI_VERSION : u32 = 6;
|
||
|
const EI_PAD : u32 = 7;
|
||
|
|
||
|
/* e_ident[EI_CLASS] */
|
||
|
const ELFCLASSNONE : u32 = 0;
|
||
|
const ELFCLASS32 : u32 = 1;
|
||
|
const ELFCLASS64 : u32 = 2;
|
||
|
|
||
|
/* e_ident[EI_DATA] */
|
||
|
const ELFDATANONE : u32 = 0;
|
||
|
const ELFDATA2LSB : u32 = 1;
|
||
|
const ELFDATA2MSB : u32 = 2;
|
||
|
|
||
|
/* e_type */
|
||
|
const ET_NONE : u32 = 0; /* No file type */
|
||
|
const ET_REL : u32 = 1; /* Relocatable file */
|
||
|
const ET_EXEC : u32 = 2; /* Executable file */
|
||
|
const ET_DYN : u32 = 3; /* Shared object file */
|
||
|
const ET_CORE : u32 = 4; /* Core file */
|
||
|
const ET_LOPROC : u32 = 0xff00; /* Processor-specific */
|
||
|
const ET_HIPROC : u32 = 0xffff; /* Processor-specific */
|
||
|
|
||
|
/* e_machine */
|
||
|
const EM_NONE : u32 = 0; /* No machine */
|
||
|
const EM_M32 : u32 = 1; /* AT&T WE 32100 */
|
||
|
const EM_SPARC : u32 = 2; /* SPARC */
|
||
|
const EM_386 : u32 = 3; /* Intel 80386 */
|
||
|
const EM_68K : u32 = 4; /* Motorola 68000 */
|
||
|
const EM_88K : u32 = 5; /* Motorola 88000 */
|
||
|
const EM_860 : u32 = 7; /* Intel 80860 */
|
||
|
const EM_MIPS : u32 = 8; /* MIPS R3000 */
|
||
|
const EM_RISC : u32 = 243; /* RISCV */
|
||
|
|
||
|
/* e_version */
|
||
|
const EV_NONE : u32 = 0; /* invalid version */
|
||
|
const EV_CURRENT : u32 = 1; /* current version */
|