You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.1 KiB
105 lines
4.1 KiB
/* elfparse.h |
|
* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
|
* Use of this source code is governed by a BSD-style license that can be |
|
* found in the LICENSE file. |
|
* |
|
* Elf parsing. |
|
*/ |
|
|
|
#ifndef _ELFPARSE_H_ |
|
#define _ELFPARSE_H_ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <elf.h> |
|
#include <unistd.h> |
|
#include <stdint.h> |
|
#include <endian.h> |
|
#include <string.h> |
|
|
|
/* |
|
* These structs come from elf.h |
|
* The version in elf.h do not pack these structs so |
|
* portability could be an issue. |
|
* The compiler could mess with aligmment depending on arch |
|
* so I'm redefining them here and packing them to 1-byte alignment. |
|
*/ |
|
#if !defined(EI_NIDENT) |
|
#define EI_NIDENT (16) |
|
#endif |
|
#pragma pack(push) |
|
#pragma pack(1) |
|
typedef struct |
|
{ |
|
unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ |
|
Elf32_Half e_type; /* Object file type */ |
|
Elf32_Half e_machine; /* Architecture */ |
|
Elf32_Word e_version; /* Object file version */ |
|
Elf32_Addr e_entry; /* Entry point virtual address */ |
|
Elf32_Off e_phoff; /* Program header table file offset */ |
|
Elf32_Off e_shoff; /* Section header table file offset */ |
|
Elf32_Word e_flags; /* Processor-specific flags */ |
|
Elf32_Half e_ehsize; /* ELF header size in bytes */ |
|
Elf32_Half e_phentsize; /* Program header table entry size */ |
|
Elf32_Half e_phnum; /* Program header table entry count */ |
|
Elf32_Half e_shentsize; /* Section header table entry size */ |
|
Elf32_Half e_shnum; /* Section header table entry count */ |
|
Elf32_Half e_shstrndx; /* Section header string table index */ |
|
} Minijail_Elf32_Ehdr; |
|
|
|
typedef struct |
|
{ |
|
unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ |
|
Elf64_Half e_type; /* Object file type */ |
|
Elf64_Half e_machine; /* Architecture */ |
|
Elf64_Word e_version; /* Object file version */ |
|
Elf64_Addr e_entry; /* Entry point virtual address */ |
|
Elf64_Off e_phoff; /* Program header table file offset */ |
|
Elf64_Off e_shoff; /* Section header table file offset */ |
|
Elf64_Word e_flags; /* Processor-specific flags */ |
|
Elf64_Half e_ehsize; /* ELF header size in bytes */ |
|
Elf64_Half e_phentsize; /* Program header table entry size */ |
|
Elf64_Half e_phnum; /* Program header table entry count */ |
|
Elf64_Half e_shentsize; /* Section header table entry size */ |
|
Elf64_Half e_shnum; /* Section header table entry count */ |
|
Elf64_Half e_shstrndx; /* Section header string table index */ |
|
} Minijail_Elf64_Ehdr; |
|
|
|
typedef struct |
|
{ |
|
Elf32_Word p_type; /* Segment type */ |
|
Elf32_Off p_offset; /* Segment file offset */ |
|
Elf32_Addr p_vaddr; /* Segment virtual address */ |
|
Elf32_Addr p_paddr; /* Segment physical address */ |
|
Elf32_Word p_filesz; /* Segment size in file */ |
|
Elf32_Word p_memsz; /* Segment size in memory */ |
|
Elf32_Word p_flags; /* Segment flags */ |
|
Elf32_Word p_align; /* Segment alignment */ |
|
} Minijail_Elf32_Phdr; |
|
|
|
typedef struct |
|
{ |
|
Elf64_Word p_type; /* Segment type */ |
|
Elf64_Word p_flags; /* Segment flags */ |
|
Elf64_Off p_offset; /* Segment file offset */ |
|
Elf64_Addr p_vaddr; /* Segment virtual address */ |
|
Elf64_Addr p_paddr; /* Segment physical address */ |
|
Elf64_Xword p_filesz; /* Segment size in file */ |
|
Elf64_Xword p_memsz; /* Segment size in memory */ |
|
Elf64_Xword p_align; /* Segment alignment */ |
|
} Minijail_Elf64_Phdr; |
|
#pragma pack(pop) |
|
/* End of definitions from elf.h */ |
|
|
|
enum ElfTypeEnum { ELFERROR=0, ELFSTATIC=1, ELFDYNAMIC=2 }; |
|
typedef enum ElfTypeEnum ElfType; |
|
|
|
/* |
|
* This is the initial amount of the ELF file we try and read. |
|
* It is the same value that the kernel uses (BINPRM_BUF_SIZE). |
|
*/ |
|
#define HEADERSIZE 128 |
|
|
|
ElfType get_elf_linkage(const char *path); |
|
|
|
#endif /* _ELFPARSE_H_ */
|
|
|