1 /* D10V-specific support for 32-bit ELF 2 Copyright (C) 1996 Free Software Foundation, Inc. 3 Contributed by Martin Hunt (hunt@cygnus.com). 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20 21 #include "bfd.h" 22 #include "sysdep.h" 23 #include "libbfd.h" 24 #include "elf-bfd.h" 25 /* #include "elf/d10v.h" */ 26 27 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup 28 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); 29 static void d10v_info_to_howto_rel 30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); 31 32 33 /* Use REL instead of RELA to save space */ 34 #define USE_REL 35 36 enum reloc_type 37 { 38 R_D10V_NONE = 0, 39 R_D10V_10_PCREL_R, 40 R_D10V_10_PCREL_L, 41 R_D10V_16, 42 R_D10V_18, 43 R_D10V_18_PCREL, 44 R_D10V_32, 45 R_D10V_max 46 }; 47 48 static reloc_howto_type elf_d10v_howto_table[] = 49 { 50 /* This reloc does nothing. */ 51 HOWTO (R_D10V_NONE, /* type */ 52 0, /* rightshift */ 53 2, /* size (0 = byte, 1 = short, 2 = long) */ 54 32, /* bitsize */ 55 false, /* pc_relative */ 56 0, /* bitpos */ 57 complain_overflow_bitfield, /* complain_on_overflow */ 58 bfd_elf_generic_reloc, /* special_function */ 59 "R_D10V_NONE", /* name */ 60 false, /* partial_inplace */ 61 0, /* src_mask */ 62 0, /* dst_mask */ 63 false), /* pcrel_offset */ 64 65 /* An PC Relative 10-bit relocation, shifted by 2 */ 66 /* right container */ 67 HOWTO (R_D10V_10_PCREL_R, /* type */ 68 2, /* rightshift */ 69 2, /* size (0 = byte, 1 = short, 2 = long) */ 70 10, /* bitsize */ 71 true, /* pc_relative */ 72 0, /* bitpos */ 73 complain_overflow_bitfield, /* complain_on_overflow */ 74 bfd_elf_generic_reloc, /* special_function */ 75 "R_D10V_10_PCREL_R", /* name */ 76 false, /* partial_inplace */ 77 0xff, /* src_mask */ 78 0xff, /* dst_mask */ 79 true), /* pcrel_offset */ 80 81 /* An PC Relative 10-bit relocation, shifted by 2 */ 82 /* left container */ 83 HOWTO (R_D10V_10_PCREL_L, /* type */ 84 2, /* rightshift */ 85 2, /* size (0 = byte, 1 = short, 2 = long) */ 86 10, /* bitsize */ 87 true, /* pc_relative */ 88 15, /* bitpos */ 89 complain_overflow_bitfield, /* complain_on_overflow */ 90 bfd_elf_generic_reloc, /* special_function */ 91 "R_D10V_10_PCREL_L", /* name */ 92 false, /* partial_inplace */ 93 0x07f8000, /* src_mask */ 94 0x07f8000, /* dst_mask */ 95 true), /* pcrel_offset */ 96 97 /* A 16 bit absolute relocation */ 98 HOWTO (R_D10V_16, /* type */ 99 0, /* rightshift */ 100 1, /* size (0 = byte, 1 = short, 2 = long) */ 101 16, /* bitsize */ 102 false, /* pc_relative */ 103 0, /* bitpos */ 104 complain_overflow_dont, /* complain_on_overflow */ 105 bfd_elf_generic_reloc, /* special_function */ 106 "R_D10V_16", /* name */ 107 false, /* partial_inplace */ 108 0xffff, /* src_mask */ 109 0xffff, /* dst_mask */ 110 false), /* pcrel_offset */ 111 112 /* An 18 bit absolute relocation, right shifted 2 */ 113 HOWTO (R_D10V_18, /* type */ 114 2, /* rightshift */ 115 1, /* size (0 = byte, 1 = short, 2 = long) */ 116 18, /* bitsize */ 117 false, /* pc_relative */ 118 0, /* bitpos */ 119 complain_overflow_dont, /* complain_on_overflow */ 120 bfd_elf_generic_reloc, /* special_function */ 121 "R_D10V_18", /* name */ 122 false, /* partial_inplace */ 123 0xffff, /* src_mask */ 124 0xffff, /* dst_mask */ 125 false), /* pcrel_offset */ 126 127 /* A relative 18 bit relocation, right shifted by 2 */ 128 HOWTO (R_D10V_18_PCREL, /* type */ 129 2, /* rightshift */ 130 2, /* size (0 = byte, 1 = short, 2 = long) */ 131 18, /* bitsize */ 132 true, /* pc_relative */ 133 0, /* bitpos */ 134 complain_overflow_signed, /* complain_on_overflow */ 135 bfd_elf_generic_reloc, /* special_function */ 136 "R_D10V_18_PCREL", /* name */ 137 false, /* partial_inplace */ 138 0xffff, /* src_mask */ 139 0xffff, /* dst_mask */ 140 true), /* pcrel_offset */ 141 142 /* A 32 bit absolute relocation */ 143 HOWTO (R_D10V_32, /* type */ 144 0, /* rightshift */ 145 2, /* size (0 = byte, 1 = short, 2 = long) */ 146 32, /* bitsize */ 147 false, /* pc_relative */ 148 0, /* bitpos */ 149 complain_overflow_bitfield, /* complain_on_overflow */ 150 bfd_elf_generic_reloc, /* special_function */ 151 "R_D10V_32", /* name */ 152 false, /* partial_inplace */ 153 0xffffffff, /* src_mask */ 154 0xffffffff, /* dst_mask */ 155 false), /* pcrel_offset */ 156 157 }; 158 159 /* Map BFD reloc types to D10V ELF reloc types. */ 160 161 struct d10v_reloc_map 162 { 163 unsigned char bfd_reloc_val; 164 unsigned char elf_reloc_val; 165 }; 166 167 static const struct d10v_reloc_map d10v_reloc_map[] = 168 { 169 { BFD_RELOC_NONE, R_D10V_NONE, }, 170 { BFD_RELOC_D10V_10_PCREL_R, R_D10V_10_PCREL_R }, 171 { BFD_RELOC_D10V_10_PCREL_L, R_D10V_10_PCREL_L }, 172 { BFD_RELOC_16, R_D10V_16 }, 173 { BFD_RELOC_D10V_18, R_D10V_18 }, 174 { BFD_RELOC_D10V_18_PCREL, R_D10V_18_PCREL }, 175 { BFD_RELOC_32, R_D10V_32 }, 176 }; 177 178 static reloc_howto_type * 179 bfd_elf32_bfd_reloc_type_lookup (abfd, code) 180 bfd *abfd; 181 bfd_reloc_code_real_type code; 182 { 183 unsigned int i; 184 185 for (i = 0; 186 i < sizeof (d10v_reloc_map) / sizeof (struct d10v_reloc_map); 187 i++) 188 { 189 if (d10v_reloc_map[i].bfd_reloc_val == code) 190 return &elf_d10v_howto_table[d10v_reloc_map[i].elf_reloc_val]; 191 } 192 193 return NULL; 194 } 195 196 /* Set the howto pointer for an D10V ELF reloc. */ 197 198 static void 199 d10v_info_to_howto_rel (abfd, cache_ptr, dst) 200 bfd *abfd; 201 arelent *cache_ptr; 202 Elf32_Internal_Rel *dst; 203 { 204 unsigned int r_type; 205 206 r_type = ELF32_R_TYPE (dst->r_info); 207 BFD_ASSERT (r_type < (unsigned int) R_D10V_max); 208 cache_ptr->howto = &elf_d10v_howto_table[r_type]; 209 } 210 211 #define ELF_ARCH bfd_arch_d10v 212 #define ELF_MACHINE_CODE EM_CYGNUS_D10V 213 #define ELF_MAXPAGESIZE 0x1000 214 215 #define TARGET_BIG_SYM bfd_elf32_d10v_vec 216 #define TARGET_BIG_NAME "elf32-d10v" 217 218 #define elf_info_to_howto 0 219 #define elf_info_to_howto_rel d10v_info_to_howto_rel 220 #define elf_backend_object_p 0 221 #define elf_backend_final_write_processing 0 222 223 #include "elf32-target.h" 224