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