1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef _ELF_TRAITS_H_ 6#define _ELF_TRAITS_H_ 7 8// NOTE: <stdint.h> is required here before <elf.h>. This is a NDK header bug. 9#include <stdint.h> 10#include <elf.h> 11 12// ELF is a traits structure used to provide convenient aliases for 13// 32/64 bit Elf types, depending on the target CPU bitness. 14#if __SIZEOF_POINTER__ == 4 15struct ELF { 16 typedef Elf32_Ehdr Ehdr; 17 typedef Elf32_Phdr Phdr; 18 typedef Elf32_Word Word; 19 typedef Elf32_Sword Sword; 20 // TODO(simonb): Elf32_Sxword missing from the NDK. 21 typedef int64_t Sxword; 22 typedef Elf32_Addr Addr; 23 typedef Elf32_Dyn Dyn; 24 typedef Elf32_Sym Sym; 25 typedef Elf32_Rel Rel; 26 typedef Elf32_Rela Rela; 27 typedef Elf32_auxv_t auxv_t; 28 29 enum { kElfClass = ELFCLASS32 }; 30 enum { kElfBits = 32 }; 31 32# ifndef ELF_R_TYPE 33# define ELF_R_TYPE ELF32_R_TYPE 34# endif 35 36# ifndef ELF_R_SYM 37# define ELF_R_SYM ELF32_R_SYM 38# endif 39 40# ifndef ELF_R_INFO 41# define ELF_R_INFO ELF32_R_INFO 42# endif 43}; 44#elif __SIZEOF_POINTER__ == 8 45struct ELF { 46 typedef Elf64_Ehdr Ehdr; 47 typedef Elf64_Phdr Phdr; 48 typedef Elf64_Word Word; 49 typedef Elf64_Sword Sword; 50 typedef Elf64_Sxword Sxword; 51 typedef Elf64_Addr Addr; 52 typedef Elf64_Dyn Dyn; 53 typedef Elf64_Sym Sym; 54 typedef Elf64_Rel Rel; 55 typedef Elf64_Rela Rela; 56 typedef Elf64_auxv_t auxv_t; 57 58 enum { kElfClass = ELFCLASS64 }; 59 enum { kElfBits = 64 }; 60 61# ifndef ELF_R_TYPE 62# define ELF_R_TYPE ELF64_R_TYPE 63# endif 64 65# ifndef ELF_R_SYM 66# define ELF_R_SYM ELF64_R_SYM 67# endif 68 69// TODO(simonb): ELF64_R_INFO missing from the NDK. 70# ifndef ELF64_R_INFO 71# define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) 72# endif 73 74# ifndef ELF_R_INFO 75# define ELF_R_INFO ELF64_R_INFO 76# endif 77}; 78#else 79#error "Unsupported target CPU bitness" 80#endif 81 82#ifdef __arm__ 83#define ELF_MACHINE EM_ARM 84#elif defined(__i386__) 85#define ELF_MACHINE EM_386 86#elif defined(__x86_64__) 87#define ELF_MACHINE EM_X86_64 88#elif defined(__mips__) && !defined(__LP64__) // mips64el defines __mips__ too 89#define ELF_MACHINE EM_MIPS 90#elif defined(__aarch64__) 91#define ELF_MACHINE EM_AARCH64 92#else 93#error "Unsupported target CPU architecture" 94#endif 95 96#endif // _ELF_TRAITS_H_ 97