11e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell/* elfparse.h
21e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
31e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * Use of this source code is governed by a BSD-style license that can be
41e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * found in the LICENSE file.
51e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell *
61e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * Elf parsing.
71e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell */
81e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
91e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#ifndef _ELFPARSE_H_
101e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#define _ELFPARSE_H_
111e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
121e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <stdio.h>
131e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <stdlib.h>
141e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <elf.h>
151e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <unistd.h>
161e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <stdint.h>
171e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <endian.h>
181e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#include <string.h>
191e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
201e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell/*
211e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * These structs come from elf.h
221e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * The version in elf.h do not pack these structs so
231e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * portability could be an issue.
241e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * The compiler could mess with aligmment depending on arch
251e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * so I'm redefining them here and packing them to 1-byte alignment.
261e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell */
27d99a40d2176032b783716007ff49ebdcbdfcb4faJorge Lucangeli Obes#if !defined(EI_NIDENT)
281e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#define EI_NIDENT (16)
29d99a40d2176032b783716007ff49ebdcbdfcb4faJorge Lucangeli Obes#endif
301e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#pragma pack(push)
311e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#pragma pack(1)
321e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbelltypedef struct
331e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell{
341e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
351e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_type;             /* Object file type */
361e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_machine;          /* Architecture */
371e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word    e_version;          /* Object file version */
381e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Addr    e_entry;            /* Entry point virtual address */
391e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Off     e_phoff;            /* Program header table file offset */
401e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Off     e_shoff;            /* Section header table file offset */
411e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word    e_flags;            /* Processor-specific flags */
421e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_ehsize;           /* ELF header size in bytes */
431e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_phentsize;        /* Program header table entry size */
441e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_phnum;            /* Program header table entry count */
451e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_shentsize;        /* Section header table entry size */
461e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_shnum;            /* Section header table entry count */
471e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Half    e_shstrndx;         /* Section header string table index */
481e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell} Minijail_Elf32_Ehdr;
491e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
501e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbelltypedef struct
511e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell{
521e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
531e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_type;             /* Object file type */
541e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_machine;          /* Architecture */
551e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Word    e_version;          /* Object file version */
561e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Addr    e_entry;            /* Entry point virtual address */
571e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Off     e_phoff;            /* Program header table file offset */
581e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Off     e_shoff;            /* Section header table file offset */
591e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Word    e_flags;            /* Processor-specific flags */
601e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_ehsize;           /* ELF header size in bytes */
611e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_phentsize;        /* Program header table entry size */
621e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_phnum;            /* Program header table entry count */
631e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_shentsize;        /* Section header table entry size */
641e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_shnum;            /* Section header table entry count */
651e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Half    e_shstrndx;         /* Section header string table index */
661e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell} Minijail_Elf64_Ehdr;
671e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
681e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbelltypedef struct
691e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell{
701e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word      p_type;           /* Segment type */
711e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Off       p_offset;         /* Segment file offset */
721e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Addr      p_vaddr;          /* Segment virtual address */
731e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Addr      p_paddr;          /* Segment physical address */
741e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word      p_filesz;         /* Segment size in file */
751e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word      p_memsz;          /* Segment size in memory */
761e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word      p_flags;          /* Segment flags */
771e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf32_Word      p_align;          /* Segment alignment */
781e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell} Minijail_Elf32_Phdr;
791e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
801e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbelltypedef struct
811e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell{
821e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Word      p_type;           /* Segment type */
831e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Word      p_flags;          /* Segment flags */
841e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Off       p_offset;         /* Segment file offset */
851e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Addr      p_vaddr;          /* Segment virtual address */
861e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Addr      p_paddr;          /* Segment physical address */
871e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Xword     p_filesz;         /* Segment size in file */
881e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Xword     p_memsz;          /* Segment size in memory */
891e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell	Elf64_Xword     p_align;          /* Segment alignment */
901e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell} Minijail_Elf64_Phdr;
911e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#pragma pack(pop)
921e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell/* End of definitions from elf.h */
931e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
942a44befd24a86b3c59085abefe6e57358a96eddcJorge Lucangeli Obesenum ElfTypeEnum { ELFERROR=0, ELFSTATIC=1, ELFDYNAMIC=2 };
952a44befd24a86b3c59085abefe6e57358a96eddcJorge Lucangeli Obestypedef enum ElfTypeEnum ElfType;
961e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
971e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell/*
982a44befd24a86b3c59085abefe6e57358a96eddcJorge Lucangeli Obes * This is the initial amount of the ELF file we try and read.
991e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell * It is the same value that the kernel uses (BINPRM_BUF_SIZE).
1001e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell */
1011e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell#define HEADERSIZE  128
1021e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
1031e4fc6aa398673096ed202fccee8be977f9e3c2bLee CampbellElfType get_elf_linkage(const char *path);
1041e4fc6aa398673096ed202fccee8be977f9e3c2bLee Campbell
1052a44befd24a86b3c59085abefe6e57358a96eddcJorge Lucangeli Obes#endif /* _ELFPARSE_H_ */
106