187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov// Copyright 2014 The Chromium Authors. All rights reserved.
287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov// Use of this source code is governed by a BSD-style license that can be
387a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov// found in the LICENSE file.
487a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
587a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov// Target-specific ELF type traits.
687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov#ifndef TOOLS_RELOCATION_PACKER_SRC_ELF_TRAITS_H_
887a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov#define TOOLS_RELOCATION_PACKER_SRC_ELF_TRAITS_H_
987a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
1087a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov#include "elf.h"
1187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov#include "libelf.h"
1287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
1383b44a9e733a20695c7171c6272c0a0f4958e969Lazar Trsic#if !defined(DT_MIPS_RLD_MAP_REL)
1483b44a9e733a20695c7171c6272c0a0f4958e969Lazar Trsic#define DT_MIPS_RLD_MAP_REL 0x70000035
1518c935ceabb54a32aff42f99c6d20680ac333157Dmitriy Ivanov#endif
1618c935ceabb54a32aff42f99c6d20680ac333157Dmitriy Ivanov
1787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov// ELF is a traits structure used to provide convenient aliases for
18f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov// 32/64 bit Elf types and functions, depending on the target file.
1987a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
20f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanovstruct ELF32_traits {
2187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Addr Addr;
2287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Dyn Dyn;
2387a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Ehdr Ehdr;
2487a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Off Off;
2587a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Phdr Phdr;
2687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Rel Rel;
2787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Rela Rela;
2887a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Shdr Shdr;
2987a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Sword Sword;
3087a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Sxword Sxword;
3187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Sym Sym;
3287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Word Word;
3387a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf32_Xword Xword;
34f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  typedef Elf32_Half Half;
3587a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
3687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Ehdr* getehdr(Elf* elf) { return elf32_getehdr(elf); }
3787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Phdr* getphdr(Elf* elf) { return elf32_getphdr(elf); }
3887a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Shdr* getshdr(Elf_Scn* scn) { return elf32_getshdr(scn); }
39f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline Word elf_r_type(Word info) { return ELF32_R_TYPE(info); }
40f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline int elf_st_type(uint8_t info) { return ELF32_ST_TYPE(info); }
41f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline Word elf_r_sym(Word info) { return ELF32_R_SYM(info); }
4287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov};
4387a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
44f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanovstruct ELF64_traits {
4587a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Addr Addr;
4687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Dyn Dyn;
4787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Ehdr Ehdr;
4887a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Off Off;
4987a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Phdr Phdr;
5087a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Rel Rel;
5187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Rela Rela;
5287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Shdr Shdr;
5387a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Sword Sword;
5487a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Sxword Sxword;
5587a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Sym Sym;
5687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Word Word;
5787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  typedef Elf64_Xword Xword;
58f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  typedef Elf64_Half Half;
5987a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
6087a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Ehdr* getehdr(Elf* elf) { return elf64_getehdr(elf); }
6187a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Phdr* getphdr(Elf* elf) { return elf64_getphdr(elf); }
6287a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov  static inline Shdr* getshdr(Elf_Scn* scn) { return elf64_getshdr(scn); }
63f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline Xword elf_r_type(Xword info) { return ELF64_R_TYPE(info); }
64f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline int elf_st_type(uint8_t info) { return ELF64_ST_TYPE(info); }
65f8ff6b103bde3433d6f7dbf762fc7bf657d7de5fDmitriy Ivanov  static inline Word elf_r_sym(Xword info) { return ELF64_R_SYM(info); }
6687a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov};
6787a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov
6887a0617ebe7561bf28d3a19fbe192372598969b8Dmitriy Ivanov#endif  // TOOLS_RELOCATION_PACKER_SRC_ELF_TRAITS_H_
69