elf_traits.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// Copyright 2014 The Chromium Authors. All rights reserved. 2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// Use of this source code is governed by a BSD-style license that can be 3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// found in the LICENSE file. 4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef _ELF_TRAITS_H_ 6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define _ELF_TRAITS_H_ 7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// NOTE: <stdint.h> is required here before <elf.h>. This is a NDK header bug. 9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include <stdint.h> 10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include <elf.h> 11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// ELF is a traits structure used to provide convenient aliases for 13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// 32/64 bit Elf types, depending on the target CPU bitness. 14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#if __SIZEOF_POINTER__ == 4 15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollstruct ELF { 16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Ehdr Ehdr; 17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Phdr Phdr; 18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Word Word; 19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Sword Sword; 20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Addr Addr; 21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Dyn Dyn; 22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Sym Sym; 23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Rel Rel; 24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_Rela Rela; 25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf32_auxv_t auxv_t; 26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll enum { kElfClass = ELFCLASS32 }; 28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll enum { kElfBits = 32 }; 29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef ELF_R_TYPE 31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_R_TYPE ELF32_R_TYPE 32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef ELF_R_SYM 35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_R_SYM ELF32_R_SYM 36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}; 38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#elif __SIZEOF_POINTER__ == 8 39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollstruct ELF { 40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Ehdr Ehdr; 41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Phdr Phdr; 42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Word Word; 43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Sword Sword; 44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Addr Addr; 45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Dyn Dyn; 46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Sym Sym; 47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Rel Rel; 48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_Rela Rela; 49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll typedef Elf64_auxv_t auxv_t; 50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll enum { kElfClass = ELFCLASS64 }; 52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll enum { kElfBits = 64 }; 53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef ELF_R_TYPE 55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_R_TYPE ELF64_R_TYPE 56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef ELF_R_SYM 59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_R_SYM ELF64_R_SYM 60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}; 62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#else 63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#error "Unsupported target CPU bitness" 64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifdef __arm__ 67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_MACHINE EM_ARM 68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#elif defined(__i386__) 69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_MACHINE EM_386 70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#elif defined(__mips__) && !defined(__LP64__) // mips64el defines __mips__ too 71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_MACHINE EM_MIPS 72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#elif defined(__aarch64__) 73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define ELF_MACHINE EM_AARCH64 74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#else 75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#error "Unsupported target CPU architecture" 76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif 77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif // _ELF_TRAITS_H_ 79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll