1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Arm specific symbolic name handling.
2939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata   Copyright (C) 2002-2009, 2014, 2015 Red Hat, Inc.
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of either
7b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard     * the GNU Lesser General Public License as published by the Free
9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       Software Foundation; either version 3 of the License, or (at
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       your option) any later version
11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   or
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard     * the GNU General Public License as published by the Free
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       Software Foundation; either version 2 of the License, or (at
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard       your option) any later version
17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   or both in parallel, as here.
19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
21361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   WITHOUT ANY WARRANTY; without even the implied warranty of
22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   General Public License for more details.
24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
25de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received copies of the GNU General Public License and
26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the GNU Lesser General Public License along with this program.  If
27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   not, see <http://www.gnu.org/licenses/>.  */
28b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifdef HAVE_CONFIG_H
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h>
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <elf.h>
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stddef.h>
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
36cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath#define BACKEND		arm_
37cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath#include "libebl_CPU.h"
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
39eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
40eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrathconst char *
41eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGratharm_segment_type_name (int segment, char *buf __attribute__ ((unused)),
42eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		       size_t len __attribute__ ((unused)))
43eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath{
44eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  switch (segment)
45eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    {
46eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case PT_ARM_EXIDX:
47eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      return "ARM_EXIDX";
48eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    }
49eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  return NULL;
50eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath}
51eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
52eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath/* Return symbolic representation of section type.  */
53eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrathconst char *
54eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGratharm_section_type_name (int type,
55eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		       char *buf __attribute__ ((unused)),
56eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		       size_t len __attribute__ ((unused)))
57eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath{
58eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  switch (type)
59eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    {
60eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case SHT_ARM_EXIDX:
61eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      return "ARM_EXIDX";
62eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case SHT_ARM_PREEMPTMAP:
63eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      return "ARM_PREEMPTMAP";
64eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case SHT_ARM_ATTRIBUTES:
65eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      return "ARM_ATTRIBUTES";
66eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    }
67eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
68eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  return NULL;
69eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath}
70eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
71eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath/* Check whether machine flags are valid.  */
72eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrathbool
73eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGratharm_machine_flag_check (GElf_Word flags)
74eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath{
75eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  switch (flags & EF_ARM_EABIMASK)
76eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    {
77eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_UNKNOWN:
78eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_VER1:
79eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_VER2:
80eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_VER3:
81eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_VER4:
82eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    case EF_ARM_EABI_VER5:
83eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      break;
84eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    default:
85eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath      return false;
86eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath    }
87eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
88eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath  return ((flags &~ (EF_ARM_EABIMASK
89eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_RELEXEC
90eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_HASENTRY
91eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_INTERWORK
92eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_APCS_26
93eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_APCS_FLOAT
94eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_PIC
95eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_ALIGN8
96eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_NEW_ABI
97eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_OLD_ABI
98eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_SOFT_FLOAT
99eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_VFP_FLOAT
100eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_MAVERICK_FLOAT
101eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_SYMSARESORTED
102eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_DYNSYMSUSESEGIDX
103eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_MAPSYMSFIRST
104eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_EABIMASK
105eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_BE8
106eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath		     | EF_ARM_LE8)) == 0);
107eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath}
108eb9ba470ff1f65a85f47cd6c325acf836abd2af8Roland McGrath
109cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath/* Check for the simple reloc types.  */
110cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrathElf_Type
111cd60ea83050d9fb48c3204005f475df460f433b6Roland McGratharm_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
113cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath  switch (type)
114cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    {
115cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    case R_ARM_ABS32:
116cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath      return ELF_T_WORD;
117cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    case R_ARM_ABS16:
118cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath      return ELF_T_HALF;
119cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    case R_ARM_ABS8:
120cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath      return ELF_T_BYTE;
121cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    default:
122cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath      return ELF_T_NUM;
123cd60ea83050d9fb48c3204005f475df460f433b6Roland McGrath    }
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
125028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaard
126028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaard/* The SHT_ARM_EXIDX section type is a valid target for relocation.  */
127028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaardbool
128028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaardarm_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)), Elf64_Word sh_type)
129028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaard{
130028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaard  return sh_type == SHT_ARM_EXIDX;
131028d0ab0cc1cb5f96ee48feef966b7d8d56c6a8eMark Wielaard}
132939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata
133939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machataconst char *
134939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machataarm_symbol_type_name (int type,
135939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata		      char *buf __attribute__ ((unused)),
136939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata		      size_t len __attribute__ ((unused)))
137939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata{
138939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata  switch (type)
139939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata    {
140939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata    case STT_ARM_TFUNC:
141939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata      return "ARM_TFUNC";
142939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata    }
143939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata  return NULL;
144939e4807ccd5f7f8f8826eb2914b895e4458c1a4Petr Machata}
145