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