1 1.1 skrll /* BFD back-end for Renesas H8/300 ELF binaries. 2 1.1.1.12 christos Copyright (C) 1993-2026 Free Software Foundation, Inc. 3 1.1 skrll 4 1.1 skrll This file is part of BFD, the Binary File Descriptor library. 5 1.1 skrll 6 1.1 skrll This program is free software; you can redistribute it and/or modify 7 1.1 skrll it under the terms of the GNU General Public License as published by 8 1.1 skrll the Free Software Foundation; either version 3 of the License, or 9 1.1 skrll (at your option) any later version. 10 1.1 skrll 11 1.1 skrll This program is distributed in the hope that it will be useful, 12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 skrll GNU General Public License for more details. 15 1.1 skrll 16 1.1 skrll You should have received a copy of the GNU General Public License 17 1.1 skrll along with this program; if not, write to the Free Software 18 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 1.1 skrll MA 02110-1301, USA. */ 20 1.1 skrll 21 1.1 skrll #include "sysdep.h" 22 1.1 skrll #include "bfd.h" 23 1.1 skrll #include "libbfd.h" 24 1.1 skrll #include "elf-bfd.h" 25 1.1 skrll #include "elf/h8.h" 26 1.1.1.8 christos #include "cpu-h8300.h" 27 1.1 skrll 28 1.1 skrll static reloc_howto_type *elf32_h8_reloc_type_lookup 29 1.1 skrll (bfd *abfd, bfd_reloc_code_real_type code); 30 1.1.1.9 christos static bool elf32_h8_info_to_howto 31 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *); 32 1.1.1.9 christos static bool elf32_h8_info_to_howto_rel 33 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *); 34 1.1 skrll static unsigned long elf32_h8_mach (flagword); 35 1.1.1.9 christos static bool elf32_h8_object_p (bfd *); 36 1.1.1.9 christos static bool elf32_h8_merge_private_bfd_data 37 1.1.1.6 christos (bfd *, struct bfd_link_info *); 38 1.1.1.9 christos static bool elf32_h8_relax_section 39 1.1.1.9 christos (bfd *, asection *, struct bfd_link_info *, bool *); 40 1.1.1.9 christos static bool elf32_h8_relax_delete_bytes 41 1.1 skrll (bfd *, asection *, bfd_vma, int); 42 1.1.1.9 christos static bool elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma); 43 1.1 skrll static bfd_byte *elf32_h8_get_relocated_section_contents 44 1.1 skrll (bfd *, struct bfd_link_info *, struct bfd_link_order *, 45 1.1.1.9 christos bfd_byte *, bool, asymbol **); 46 1.1 skrll static bfd_reloc_status_type elf32_h8_final_link_relocate 47 1.1 skrll (unsigned long, bfd *, bfd *, asection *, 48 1.1 skrll bfd_byte *, bfd_vma, bfd_vma, bfd_vma, 49 1.1 skrll struct bfd_link_info *, asection *, int); 50 1.1.1.9 christos static int elf32_h8_relocate_section 51 1.1 skrll (bfd *, struct bfd_link_info *, bfd *, asection *, 52 1.1 skrll bfd_byte *, Elf_Internal_Rela *, 53 1.1 skrll Elf_Internal_Sym *, asection **); 54 1.1 skrll static bfd_reloc_status_type special 55 1.1.1.3 christos (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 56 1.1 skrll 57 1.1 skrll /* This does not include any relocation information, but should be 58 1.1 skrll good enough for GDB or objdump to read the file. */ 59 1.1 skrll 60 1.1.1.3 christos static reloc_howto_type h8_elf_howto_table[] = 61 1.1.1.3 christos { 62 1.1 skrll #define R_H8_NONE_X 0 63 1.1 skrll HOWTO (R_H8_NONE, /* type */ 64 1.1 skrll 0, /* rightshift */ 65 1.1.1.9 christos 0, /* size */ 66 1.1 skrll 0, /* bitsize */ 67 1.1.1.9 christos false, /* pc_relative */ 68 1.1 skrll 0, /* bitpos */ 69 1.1 skrll complain_overflow_dont,/* complain_on_overflow */ 70 1.1 skrll special, /* special_function */ 71 1.1 skrll "R_H8_NONE", /* name */ 72 1.1.1.9 christos false, /* partial_inplace */ 73 1.1 skrll 0, /* src_mask */ 74 1.1 skrll 0, /* dst_mask */ 75 1.1.1.9 christos false), /* pcrel_offset */ 76 1.1 skrll #define R_H8_DIR32_X (R_H8_NONE_X + 1) 77 1.1 skrll HOWTO (R_H8_DIR32, /* type */ 78 1.1 skrll 0, /* rightshift */ 79 1.1.1.9 christos 4, /* size */ 80 1.1 skrll 32, /* bitsize */ 81 1.1.1.9 christos false, /* pc_relative */ 82 1.1 skrll 0, /* bitpos */ 83 1.1 skrll complain_overflow_dont,/* complain_on_overflow */ 84 1.1 skrll special, /* special_function */ 85 1.1 skrll "R_H8_DIR32", /* name */ 86 1.1.1.9 christos false, /* partial_inplace */ 87 1.1 skrll 0, /* src_mask */ 88 1.1 skrll 0xffffffff, /* dst_mask */ 89 1.1.1.9 christos false), /* pcrel_offset */ 90 1.1 skrll #define R_H8_DIR16_X (R_H8_DIR32_X + 1) 91 1.1 skrll HOWTO (R_H8_DIR16, /* type */ 92 1.1 skrll 0, /* rightshift */ 93 1.1.1.9 christos 2, /* size */ 94 1.1 skrll 16, /* bitsize */ 95 1.1.1.9 christos false, /* pc_relative */ 96 1.1 skrll 0, /* bitpos */ 97 1.1 skrll complain_overflow_dont,/* complain_on_overflow */ 98 1.1 skrll special, /* special_function */ 99 1.1 skrll "R_H8_DIR16", /* name */ 100 1.1.1.9 christos false, /* partial_inplace */ 101 1.1 skrll 0, /* src_mask */ 102 1.1 skrll 0x0000ffff, /* dst_mask */ 103 1.1.1.9 christos false), /* pcrel_offset */ 104 1.1 skrll #define R_H8_DIR8_X (R_H8_DIR16_X + 1) 105 1.1 skrll HOWTO (R_H8_DIR8, /* type */ 106 1.1 skrll 0, /* rightshift */ 107 1.1.1.9 christos 1, /* size */ 108 1.1 skrll 8, /* bitsize */ 109 1.1.1.9 christos false, /* pc_relative */ 110 1.1 skrll 0, /* bitpos */ 111 1.1 skrll complain_overflow_dont,/* complain_on_overflow */ 112 1.1 skrll special, /* special_function */ 113 1.1 skrll "R_H8_DIR8", /* name */ 114 1.1.1.9 christos false, /* partial_inplace */ 115 1.1 skrll 0, /* src_mask */ 116 1.1 skrll 0x000000ff, /* dst_mask */ 117 1.1.1.9 christos false), /* pcrel_offset */ 118 1.1 skrll #define R_H8_DIR16A8_X (R_H8_DIR8_X + 1) 119 1.1 skrll HOWTO (R_H8_DIR16A8, /* type */ 120 1.1 skrll 0, /* rightshift */ 121 1.1.1.9 christos 2, /* size */ 122 1.1 skrll 16, /* bitsize */ 123 1.1.1.9 christos false, /* pc_relative */ 124 1.1 skrll 0, /* bitpos */ 125 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 126 1.1 skrll special, /* special_function */ 127 1.1 skrll "R_H8_DIR16A8", /* name */ 128 1.1.1.9 christos false, /* partial_inplace */ 129 1.1 skrll 0, /* src_mask */ 130 1.1 skrll 0x0000ffff, /* dst_mask */ 131 1.1.1.9 christos false), /* pcrel_offset */ 132 1.1 skrll #define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1) 133 1.1 skrll HOWTO (R_H8_DIR16R8, /* type */ 134 1.1 skrll 0, /* rightshift */ 135 1.1.1.9 christos 2, /* size */ 136 1.1 skrll 16, /* bitsize */ 137 1.1.1.9 christos false, /* pc_relative */ 138 1.1 skrll 0, /* bitpos */ 139 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 140 1.1 skrll special, /* special_function */ 141 1.1 skrll "R_H8_DIR16R8", /* name */ 142 1.1.1.9 christos false, /* partial_inplace */ 143 1.1 skrll 0, /* src_mask */ 144 1.1 skrll 0x0000ffff, /* dst_mask */ 145 1.1.1.9 christos false), /* pcrel_offset */ 146 1.1 skrll #define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1) 147 1.1 skrll HOWTO (R_H8_DIR24A8, /* type */ 148 1.1 skrll 0, /* rightshift */ 149 1.1.1.9 christos 4, /* size */ 150 1.1 skrll 24, /* bitsize */ 151 1.1.1.9 christos false, /* pc_relative */ 152 1.1 skrll 0, /* bitpos */ 153 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 154 1.1 skrll special, /* special_function */ 155 1.1 skrll "R_H8_DIR24A8", /* name */ 156 1.1.1.9 christos true, /* partial_inplace */ 157 1.1 skrll 0xff000000, /* src_mask */ 158 1.1 skrll 0x00ffffff, /* dst_mask */ 159 1.1.1.9 christos false), /* pcrel_offset */ 160 1.1 skrll #define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1) 161 1.1 skrll HOWTO (R_H8_DIR24R8, /* type */ 162 1.1 skrll 0, /* rightshift */ 163 1.1.1.9 christos 4, /* size */ 164 1.1 skrll 24, /* bitsize */ 165 1.1.1.9 christos false, /* pc_relative */ 166 1.1 skrll 0, /* bitpos */ 167 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 168 1.1 skrll special, /* special_function */ 169 1.1 skrll "R_H8_DIR24R8", /* name */ 170 1.1.1.9 christos true, /* partial_inplace */ 171 1.1 skrll 0xff000000, /* src_mask */ 172 1.1 skrll 0x00ffffff, /* dst_mask */ 173 1.1.1.9 christos false), /* pcrel_offset */ 174 1.1 skrll #define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1) 175 1.1 skrll HOWTO (R_H8_DIR32A16, /* type */ 176 1.1 skrll 0, /* rightshift */ 177 1.1.1.9 christos 4, /* size */ 178 1.1 skrll 32, /* bitsize */ 179 1.1.1.9 christos false, /* pc_relative */ 180 1.1 skrll 0, /* bitpos */ 181 1.1 skrll complain_overflow_dont,/* complain_on_overflow */ 182 1.1 skrll special, /* special_function */ 183 1.1 skrll "R_H8_DIR32A16", /* name */ 184 1.1.1.9 christos false, /* partial_inplace */ 185 1.1 skrll 0, /* src_mask */ 186 1.1 skrll 0xffffffff, /* dst_mask */ 187 1.1.1.9 christos false), /* pcrel_offset */ 188 1.1.1.4 christos #define R_H8_DISP32A16_X (R_H8_DIR32A16_X + 1) 189 1.1.1.4 christos HOWTO (R_H8_DISP32A16, /* type */ 190 1.1.1.4 christos 0, /* rightshift */ 191 1.1.1.9 christos 4, /* size */ 192 1.1.1.4 christos 32, /* bitsize */ 193 1.1.1.9 christos false, /* pc_relative */ 194 1.1.1.4 christos 0, /* bitpos */ 195 1.1.1.4 christos complain_overflow_dont,/* complain_on_overflow */ 196 1.1.1.4 christos special, /* special_function */ 197 1.1.1.4 christos "R_H8_DISP32A16", /* name */ 198 1.1.1.9 christos false, /* partial_inplace */ 199 1.1.1.4 christos 0, /* src_mask */ 200 1.1.1.4 christos 0xffffffff, /* dst_mask */ 201 1.1.1.9 christos false), /* pcrel_offset */ 202 1.1.1.4 christos #define R_H8_PCREL16_X (R_H8_DISP32A16_X + 1) 203 1.1 skrll HOWTO (R_H8_PCREL16, /* type */ 204 1.1 skrll 0, /* rightshift */ 205 1.1.1.9 christos 2, /* size */ 206 1.1 skrll 16, /* bitsize */ 207 1.1.1.9 christos true, /* pc_relative */ 208 1.1 skrll 0, /* bitpos */ 209 1.1 skrll complain_overflow_signed,/* complain_on_overflow */ 210 1.1 skrll special, /* special_function */ 211 1.1 skrll "R_H8_PCREL16", /* name */ 212 1.1.1.9 christos false, /* partial_inplace */ 213 1.1 skrll 0xffff, /* src_mask */ 214 1.1 skrll 0xffff, /* dst_mask */ 215 1.1.1.9 christos true), /* pcrel_offset */ 216 1.1 skrll #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1) 217 1.1 skrll HOWTO (R_H8_PCREL8, /* type */ 218 1.1 skrll 0, /* rightshift */ 219 1.1.1.9 christos 1, /* size */ 220 1.1 skrll 8, /* bitsize */ 221 1.1.1.9 christos true, /* pc_relative */ 222 1.1 skrll 0, /* bitpos */ 223 1.1 skrll complain_overflow_signed,/* complain_on_overflow */ 224 1.1 skrll special, /* special_function */ 225 1.1 skrll "R_H8_PCREL8", /* name */ 226 1.1.1.9 christos false, /* partial_inplace */ 227 1.1 skrll 0xff, /* src_mask */ 228 1.1 skrll 0xff, /* dst_mask */ 229 1.1.1.9 christos true), /* pcrel_offset */ 230 1.1 skrll }; 231 1.1 skrll 232 1.1 skrll /* This structure is used to map BFD reloc codes to H8 ELF relocs. */ 233 1.1 skrll 234 1.1 skrll struct elf_reloc_map { 235 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val; 236 1.1 skrll unsigned char howto_index; 237 1.1 skrll }; 238 1.1 skrll 239 1.1 skrll /* An array mapping BFD reloc codes to H8 ELF relocs. */ 240 1.1 skrll 241 1.1 skrll static const struct elf_reloc_map h8_reloc_map[] = { 242 1.1 skrll { BFD_RELOC_NONE, R_H8_NONE_X }, 243 1.1 skrll { BFD_RELOC_32, R_H8_DIR32_X }, 244 1.1 skrll { BFD_RELOC_16, R_H8_DIR16_X }, 245 1.1 skrll { BFD_RELOC_8, R_H8_DIR8_X }, 246 1.1 skrll { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X }, 247 1.1 skrll { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X }, 248 1.1 skrll { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X }, 249 1.1 skrll { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X }, 250 1.1 skrll { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X }, 251 1.1.1.4 christos { BFD_RELOC_H8_DISP32A16, R_H8_DISP32A16_X }, 252 1.1 skrll { BFD_RELOC_16_PCREL, R_H8_PCREL16_X }, 253 1.1 skrll { BFD_RELOC_8_PCREL, R_H8_PCREL8_X }, 254 1.1 skrll }; 255 1.1 skrll 256 1.1 skrll 257 1.1 skrll static reloc_howto_type * 258 1.1 skrll elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 259 1.1 skrll bfd_reloc_code_real_type code) 260 1.1 skrll { 261 1.1 skrll unsigned int i; 262 1.1 skrll 263 1.1 skrll for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++) 264 1.1 skrll { 265 1.1 skrll if (h8_reloc_map[i].bfd_reloc_val == code) 266 1.1 skrll return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index]; 267 1.1 skrll } 268 1.1 skrll return NULL; 269 1.1 skrll } 270 1.1 skrll 271 1.1 skrll static reloc_howto_type * 272 1.1 skrll elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 273 1.1 skrll const char *r_name) 274 1.1 skrll { 275 1.1 skrll unsigned int i; 276 1.1 skrll 277 1.1 skrll for (i = 0; 278 1.1 skrll i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]); 279 1.1 skrll i++) 280 1.1 skrll if (h8_elf_howto_table[i].name != NULL 281 1.1 skrll && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0) 282 1.1 skrll return &h8_elf_howto_table[i]; 283 1.1 skrll 284 1.1 skrll return NULL; 285 1.1 skrll } 286 1.1 skrll 287 1.1.1.9 christos static bool 288 1.1 skrll elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, 289 1.1 skrll Elf_Internal_Rela *elf_reloc) 290 1.1 skrll { 291 1.1 skrll unsigned int r; 292 1.1 skrll unsigned int i; 293 1.1 skrll 294 1.1 skrll r = ELF32_R_TYPE (elf_reloc->r_info); 295 1.1 skrll for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++) 296 1.1 skrll if (h8_elf_howto_table[i].type == r) 297 1.1 skrll { 298 1.1 skrll bfd_reloc->howto = &h8_elf_howto_table[i]; 299 1.1.1.9 christos return true; 300 1.1 skrll } 301 1.1.1.7 christos /* xgettext:c-format */ 302 1.1.1.7 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r); 303 1.1.1.7 christos bfd_set_error (bfd_error_bad_value); 304 1.1.1.9 christos return false; 305 1.1 skrll } 306 1.1 skrll 307 1.1.1.9 christos static bool 308 1.1.1.7 christos elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, 309 1.1.1.7 christos arelent *bfd_reloc ATTRIBUTE_UNUSED, 310 1.1 skrll Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED) 311 1.1 skrll { 312 1.1.1.9 christos return false; 313 1.1 skrll } 314 1.1 skrll 315 1.1 skrll /* Special handling for H8/300 relocs. 316 1.1 skrll We only come here for pcrel stuff and return normally if not an -r link. 317 1.1 skrll When doing -r, we can't do any arithmetic for the pcrel stuff, because 318 1.1 skrll we support relaxing on the H8/300 series chips. */ 319 1.1 skrll static bfd_reloc_status_type 320 1.1 skrll special (bfd *abfd ATTRIBUTE_UNUSED, 321 1.1 skrll arelent *reloc_entry ATTRIBUTE_UNUSED, 322 1.1 skrll asymbol *symbol ATTRIBUTE_UNUSED, 323 1.1.1.3 christos void * data ATTRIBUTE_UNUSED, 324 1.1 skrll asection *input_section ATTRIBUTE_UNUSED, 325 1.1 skrll bfd *output_bfd, 326 1.1 skrll char **error_message ATTRIBUTE_UNUSED) 327 1.1 skrll { 328 1.1 skrll if (output_bfd == (bfd *) NULL) 329 1.1 skrll return bfd_reloc_continue; 330 1.1 skrll 331 1.1 skrll /* Adjust the reloc address to that in the output section. */ 332 1.1 skrll reloc_entry->address += input_section->output_offset; 333 1.1 skrll return bfd_reloc_ok; 334 1.1 skrll } 335 1.1 skrll 336 1.1 skrll /* Perform a relocation as part of a final link. */ 337 1.1 skrll static bfd_reloc_status_type 338 1.1 skrll elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd, 339 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED, 340 1.1 skrll asection *input_section ATTRIBUTE_UNUSED, 341 1.1 skrll bfd_byte *contents, bfd_vma offset, 342 1.1 skrll bfd_vma value, bfd_vma addend, 343 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED, 344 1.1 skrll asection *sym_sec ATTRIBUTE_UNUSED, 345 1.1 skrll int is_local ATTRIBUTE_UNUSED) 346 1.1 skrll { 347 1.1 skrll bfd_byte *hit_data = contents + offset; 348 1.1 skrll 349 1.1 skrll switch (r_type) 350 1.1 skrll { 351 1.1 skrll case R_H8_NONE: 352 1.1 skrll return bfd_reloc_ok; 353 1.1 skrll 354 1.1 skrll case R_H8_DIR32: 355 1.1 skrll case R_H8_DIR32A16: 356 1.1.1.4 christos case R_H8_DISP32A16: 357 1.1 skrll case R_H8_DIR24A8: 358 1.1 skrll value += addend; 359 1.1 skrll bfd_put_32 (input_bfd, value, hit_data); 360 1.1 skrll return bfd_reloc_ok; 361 1.1 skrll 362 1.1 skrll case R_H8_DIR16: 363 1.1 skrll case R_H8_DIR16A8: 364 1.1 skrll case R_H8_DIR16R8: 365 1.1 skrll value += addend; 366 1.1 skrll bfd_put_16 (input_bfd, value, hit_data); 367 1.1 skrll return bfd_reloc_ok; 368 1.1 skrll 369 1.1 skrll /* AKA R_RELBYTE */ 370 1.1 skrll case R_H8_DIR8: 371 1.1 skrll value += addend; 372 1.1 skrll 373 1.1 skrll bfd_put_8 (input_bfd, value, hit_data); 374 1.1 skrll return bfd_reloc_ok; 375 1.1 skrll 376 1.1 skrll case R_H8_DIR24R8: 377 1.1 skrll value += addend; 378 1.1 skrll 379 1.1 skrll /* HIT_DATA is the address for the first byte for the relocated 380 1.1 skrll value. Subtract 1 so that we can manipulate the data in 32-bit 381 1.1 skrll hunks. */ 382 1.1 skrll hit_data--; 383 1.1 skrll 384 1.1 skrll /* Clear out the top byte in value. */ 385 1.1 skrll value &= 0xffffff; 386 1.1 skrll 387 1.1 skrll /* Retrieve the type byte for value from the section contents. */ 388 1.1 skrll value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000); 389 1.1 skrll 390 1.1 skrll /* Now scribble it out in one 32-bit hunk. */ 391 1.1 skrll bfd_put_32 (input_bfd, value, hit_data); 392 1.1 skrll return bfd_reloc_ok; 393 1.1 skrll 394 1.1 skrll case R_H8_PCREL16: 395 1.1 skrll value -= (input_section->output_section->vma 396 1.1 skrll + input_section->output_offset); 397 1.1 skrll value -= offset; 398 1.1 skrll value += addend; 399 1.1 skrll 400 1.1 skrll /* The value is relative to the start of the instruction, 401 1.1 skrll not the relocation offset. Subtract 2 to account for 402 1.1 skrll this minor issue. */ 403 1.1 skrll value -= 2; 404 1.1 skrll 405 1.1 skrll bfd_put_16 (input_bfd, value, hit_data); 406 1.1 skrll return bfd_reloc_ok; 407 1.1 skrll 408 1.1 skrll case R_H8_PCREL8: 409 1.1 skrll value -= (input_section->output_section->vma 410 1.1 skrll + input_section->output_offset); 411 1.1 skrll value -= offset; 412 1.1 skrll value += addend; 413 1.1 skrll 414 1.1 skrll /* The value is relative to the start of the instruction, 415 1.1 skrll not the relocation offset. Subtract 1 to account for 416 1.1 skrll this minor issue. */ 417 1.1 skrll value -= 1; 418 1.1 skrll 419 1.1 skrll bfd_put_8 (input_bfd, value, hit_data); 420 1.1 skrll return bfd_reloc_ok; 421 1.1 skrll 422 1.1 skrll default: 423 1.1 skrll return bfd_reloc_notsupported; 424 1.1 skrll } 425 1.1 skrll } 426 1.1 skrll 427 1.1 skrll /* Relocate an H8 ELF section. */ 429 1.1 skrll static int 430 1.1 skrll elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info, 431 1.1 skrll bfd *input_bfd, asection *input_section, 432 1.1 skrll bfd_byte *contents, Elf_Internal_Rela *relocs, 433 1.1 skrll Elf_Internal_Sym *local_syms, 434 1.1 skrll asection **local_sections) 435 1.1 skrll { 436 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 437 1.1 skrll struct elf_link_hash_entry **sym_hashes; 438 1.1 skrll Elf_Internal_Rela *rel, *relend; 439 1.1 skrll 440 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 441 1.1 skrll sym_hashes = elf_sym_hashes (input_bfd); 442 1.1 skrll 443 1.1 skrll rel = relocs; 444 1.1 skrll relend = relocs + input_section->reloc_count; 445 1.1 skrll for (; rel < relend; rel++) 446 1.1 skrll { 447 1.1 skrll unsigned int r_type; 448 1.1 skrll unsigned long r_symndx; 449 1.1 skrll Elf_Internal_Sym *sym; 450 1.1 skrll asection *sec; 451 1.1 skrll struct elf_link_hash_entry *h; 452 1.1 skrll bfd_vma relocation; 453 1.1 skrll bfd_reloc_status_type r; 454 1.1 skrll arelent bfd_reloc; 455 1.1 skrll reloc_howto_type *howto; 456 1.1.1.7 christos 457 1.1.1.7 christos if (! elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel)) 458 1.1 skrll continue; 459 1.1 skrll howto = bfd_reloc.howto; 460 1.1 skrll 461 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info); 462 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info); 463 1.1 skrll h = NULL; 464 1.1 skrll sym = NULL; 465 1.1 skrll sec = NULL; 466 1.1 skrll if (r_symndx < symtab_hdr->sh_info) 467 1.1 skrll { 468 1.1 skrll sym = local_syms + r_symndx; 469 1.1 skrll sec = local_sections[r_symndx]; 470 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 471 1.1 skrll } 472 1.1 skrll else 473 1.1.1.9 christos { 474 1.1 skrll bool unresolved_reloc, warned, ignored; 475 1.1 skrll 476 1.1 skrll RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 477 1.1 skrll r_symndx, symtab_hdr, sym_hashes, 478 1.1.1.4 christos h, sec, relocation, 479 1.1 skrll unresolved_reloc, warned, ignored); 480 1.1 skrll } 481 1.1.1.3 christos 482 1.1.1.2 christos if (sec != NULL && discarded_section (sec)) 483 1.1.1.12 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 484 1.1.1.12 christos rel, 1, relend, R_H8_NONE, 485 1.1 skrll howto, 0, contents); 486 1.1.1.4 christos 487 1.1 skrll if (bfd_link_relocatable (info)) 488 1.1 skrll continue; 489 1.1 skrll 490 1.1 skrll r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd, 491 1.1 skrll input_section, 492 1.1 skrll contents, rel->r_offset, 493 1.1 skrll relocation, rel->r_addend, 494 1.1 skrll info, sec, h == NULL); 495 1.1 skrll 496 1.1 skrll if (r != bfd_reloc_ok) 497 1.1 skrll { 498 1.1 skrll const char *name; 499 1.1 skrll const char *msg = (const char *) 0; 500 1.1 skrll 501 1.1 skrll if (h != NULL) 502 1.1 skrll name = h->root.root.string; 503 1.1 skrll else 504 1.1 skrll { 505 1.1 skrll name = (bfd_elf_string_from_elf_section 506 1.1 skrll (input_bfd, symtab_hdr->sh_link, sym->st_name)); 507 1.1.1.8 christos if (name == NULL || *name == '\0') 508 1.1 skrll name = bfd_section_name (sec); 509 1.1 skrll } 510 1.1 skrll 511 1.1 skrll switch (r) 512 1.1 skrll { 513 1.1.1.5 christos case bfd_reloc_overflow: 514 1.1.1.5 christos (*info->callbacks->reloc_overflow) 515 1.1.1.5 christos (info, (h ? &h->root : NULL), name, howto->name, 516 1.1 skrll (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 517 1.1 skrll break; 518 1.1 skrll 519 1.1.1.5 christos case bfd_reloc_undefined: 520 1.1.1.9 christos (*info->callbacks->undefined_symbol) 521 1.1 skrll (info, name, input_bfd, input_section, rel->r_offset, true); 522 1.1 skrll break; 523 1.1 skrll 524 1.1 skrll case bfd_reloc_outofrange: 525 1.1 skrll msg = _("internal error: out of range error"); 526 1.1 skrll goto common_error; 527 1.1 skrll 528 1.1 skrll case bfd_reloc_notsupported: 529 1.1 skrll msg = _("internal error: unsupported relocation error"); 530 1.1 skrll goto common_error; 531 1.1 skrll 532 1.1 skrll case bfd_reloc_dangerous: 533 1.1 skrll msg = _("internal error: dangerous error"); 534 1.1 skrll goto common_error; 535 1.1 skrll 536 1.1 skrll default: 537 1.1 skrll msg = _("internal error: unknown error"); 538 1.1 skrll /* fall through */ 539 1.1 skrll 540 1.1.1.5 christos common_error: 541 1.1.1.5 christos (*info->callbacks->warning) (info, msg, name, input_bfd, 542 1.1 skrll input_section, rel->r_offset); 543 1.1 skrll break; 544 1.1 skrll } 545 1.1 skrll } 546 1.1 skrll } 547 1.1.1.9 christos 548 1.1 skrll return true; 549 1.1 skrll } 550 1.1 skrll 551 1.1 skrll /* Object files encode the specific H8 model they were compiled 552 1.1 skrll for in the ELF flags field. 553 1.1 skrll 554 1.1 skrll Examine that field and return the proper BFD machine type for 555 1.1 skrll the object file. */ 556 1.1 skrll static unsigned long 557 1.1 skrll elf32_h8_mach (flagword flags) 558 1.1 skrll { 559 1.1 skrll switch (flags & EF_H8_MACH) 560 1.1 skrll { 561 1.1 skrll case E_H8_MACH_H8300: 562 1.1 skrll default: 563 1.1 skrll return bfd_mach_h8300; 564 1.1 skrll 565 1.1 skrll case E_H8_MACH_H8300H: 566 1.1 skrll return bfd_mach_h8300h; 567 1.1 skrll 568 1.1 skrll case E_H8_MACH_H8300S: 569 1.1 skrll return bfd_mach_h8300s; 570 1.1 skrll 571 1.1 skrll case E_H8_MACH_H8300HN: 572 1.1 skrll return bfd_mach_h8300hn; 573 1.1 skrll 574 1.1 skrll case E_H8_MACH_H8300SN: 575 1.1 skrll return bfd_mach_h8300sn; 576 1.1 skrll 577 1.1 skrll case E_H8_MACH_H8300SX: 578 1.1 skrll return bfd_mach_h8300sx; 579 1.1 skrll 580 1.1 skrll case E_H8_MACH_H8300SXN: 581 1.1 skrll return bfd_mach_h8300sxn; 582 1.1 skrll } 583 1.1 skrll } 584 1.1 skrll 585 1.1 skrll /* The final processing done just before writing out a H8 ELF object 586 1.1 skrll file. We use this opportunity to encode the BFD machine type 587 1.1 skrll into the flags field in the object file. */ 588 1.1.1.9 christos 589 1.1.1.8 christos static bool 590 1.1 skrll elf32_h8_final_write_processing (bfd *abfd) 591 1.1 skrll { 592 1.1 skrll unsigned long val; 593 1.1 skrll 594 1.1 skrll switch (bfd_get_mach (abfd)) 595 1.1 skrll { 596 1.1 skrll default: 597 1.1 skrll case bfd_mach_h8300: 598 1.1 skrll val = E_H8_MACH_H8300; 599 1.1 skrll break; 600 1.1 skrll 601 1.1 skrll case bfd_mach_h8300h: 602 1.1 skrll val = E_H8_MACH_H8300H; 603 1.1 skrll break; 604 1.1 skrll 605 1.1 skrll case bfd_mach_h8300s: 606 1.1 skrll val = E_H8_MACH_H8300S; 607 1.1 skrll break; 608 1.1 skrll 609 1.1 skrll case bfd_mach_h8300hn: 610 1.1 skrll val = E_H8_MACH_H8300HN; 611 1.1 skrll break; 612 1.1 skrll 613 1.1 skrll case bfd_mach_h8300sn: 614 1.1 skrll val = E_H8_MACH_H8300SN; 615 1.1 skrll break; 616 1.1 skrll 617 1.1 skrll case bfd_mach_h8300sx: 618 1.1 skrll val = E_H8_MACH_H8300SX; 619 1.1 skrll break; 620 1.1 skrll 621 1.1 skrll case bfd_mach_h8300sxn: 622 1.1 skrll val = E_H8_MACH_H8300SXN; 623 1.1 skrll break; 624 1.1 skrll } 625 1.1 skrll 626 1.1 skrll elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH); 627 1.1.1.8 christos elf_elfheader (abfd)->e_flags |= val; 628 1.1 skrll return _bfd_elf_final_write_processing (abfd); 629 1.1 skrll } 630 1.1 skrll 631 1.1 skrll /* Return nonzero if ABFD represents a valid H8 ELF object file; also 632 1.1 skrll record the encoded machine type found in the ELF flags. */ 633 1.1.1.9 christos 634 1.1 skrll static bool 635 1.1 skrll elf32_h8_object_p (bfd *abfd) 636 1.1 skrll { 637 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_h8300, 638 1.1.1.9 christos elf32_h8_mach (elf_elfheader (abfd)->e_flags)); 639 1.1 skrll return true; 640 1.1 skrll } 641 1.1 skrll 642 1.1 skrll /* Merge backend specific data from an object file to the output 643 1.1 skrll object file when linking. The only data we need to copy at this 644 1.1 skrll time is the architecture/machine information. */ 645 1.1.1.9 christos 646 1.1.1.6 christos static bool 647 1.1 skrll elf32_h8_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 648 1.1.1.6 christos { 649 1.1.1.6 christos bfd *obfd = info->output_bfd; 650 1.1.1.12 christos 651 1.1.1.9 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 652 1.1 skrll return true; 653 1.1 skrll 654 1.1 skrll if (bfd_get_arch (obfd) == bfd_get_arch (ibfd) 655 1.1 skrll && bfd_get_mach (obfd) < bfd_get_mach (ibfd)) 656 1.1 skrll { 657 1.1 skrll if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), 658 1.1.1.9 christos bfd_get_mach (ibfd))) 659 1.1 skrll return false; 660 1.1 skrll } 661 1.1.1.9 christos 662 1.1 skrll return true; 663 1.1 skrll } 664 1.1 skrll 665 1.1 skrll /* This function handles relaxing for the H8.. 666 1.1 skrll 667 1.1 skrll There are a few relaxing opportunities available on the H8: 668 1.1.1.6 christos 669 1.1 skrll jmp/jsr:24 -> bra/bsr:8 2 bytes 670 1.1 skrll The jmp may be completely eliminated if the previous insn is a 671 1.1 skrll conditional branch to the insn after the jump. In that case 672 1.1 skrll we invert the branch and delete the jump and save 4 bytes. 673 1.1.1.6 christos 674 1.1.1.6 christos bCC:16 -> bCC:8 2 bytes 675 1.1 skrll bsr:16 -> bsr:8 2 bytes 676 1.1.1.6 christos 677 1.1.1.6 christos bset:16 -> bset:8 2 bytes 678 1.1 skrll bset:24/32 -> bset:8 4 bytes 679 1.1 skrll (also applicable to other bit manipulation instructions) 680 1.1.1.6 christos 681 1.1.1.6 christos mov.b:16 -> mov.b:8 2 bytes 682 1.1 skrll mov.b:24/32 -> mov.b:8 4 bytes 683 1.1.1.6 christos 684 1.1 skrll bset:24/32 -> bset:16 2 bytes 685 1.1 skrll (also applicable to other bit manipulation instructions) 686 1.1.1.6 christos 687 1.1.1.4 christos mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes 688 1.1.1.6 christos 689 1.1 skrll mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx) 4 bytes. */ 690 1.1.1.9 christos 691 1.1 skrll static bool 692 1.1.1.9 christos elf32_h8_relax_section (bfd *abfd, asection *sec, 693 1.1 skrll struct bfd_link_info *link_info, bool *again) 694 1.1 skrll { 695 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 696 1.1 skrll Elf_Internal_Rela *internal_relocs; 697 1.1 skrll Elf_Internal_Rela *irel, *irelend; 698 1.1 skrll bfd_byte *contents = NULL; 699 1.1 skrll Elf_Internal_Sym *isymbuf = NULL; 700 1.1 skrll static asection *last_input_section = NULL; 701 1.1 skrll static Elf_Internal_Rela *last_reloc = NULL; 702 1.1 skrll 703 1.1.1.9 christos /* Assume nothing changes. */ 704 1.1 skrll *again = false; 705 1.1 skrll 706 1.1 skrll /* We don't have to do anything for a relocatable link, if 707 1.1 skrll this section does not have relocs, or if this is not a 708 1.1.1.4 christos code section. */ 709 1.1 skrll if (bfd_link_relocatable (link_info) 710 1.1.1.10 christos || sec->reloc_count == 0 711 1.1.1.10 christos || (sec->flags & SEC_RELOC) == 0 712 1.1 skrll || (sec->flags & SEC_HAS_CONTENTS) == 0 713 1.1.1.9 christos || (sec->flags & SEC_CODE) == 0) 714 1.1 skrll return true; 715 1.1 skrll 716 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 717 1.1 skrll 718 1.1 skrll /* Get a copy of the native relocations. */ 719 1.1.1.3 christos internal_relocs = (_bfd_elf_link_read_relocs 720 1.1 skrll (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, 721 1.1 skrll link_info->keep_memory)); 722 1.1 skrll if (internal_relocs == NULL) 723 1.1 skrll goto error_return; 724 1.1 skrll 725 1.1 skrll if (sec != last_input_section) 726 1.1 skrll last_reloc = NULL; 727 1.1 skrll 728 1.1 skrll last_input_section = sec; 729 1.1 skrll 730 1.1 skrll /* Walk through the relocs looking for relaxing opportunities. */ 731 1.1 skrll irelend = internal_relocs + sec->reloc_count; 732 1.1 skrll for (irel = internal_relocs; irel < irelend; irel++) 733 1.1 skrll { 734 1.1 skrll bfd_vma symval; 735 1.1.1.2 christos 736 1.1.1.2 christos { 737 1.1.1.2 christos arelent bfd_reloc; 738 1.1.1.7 christos 739 1.1.1.7 christos if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, irel)) 740 1.1.1.2 christos continue; 741 1.1 skrll } 742 1.1 skrll /* Keep track of the previous reloc so that we can delete 743 1.1 skrll some long jumps created by the compiler. */ 744 1.1 skrll if (irel != internal_relocs) 745 1.1 skrll last_reloc = irel - 1; 746 1.1.1.4 christos 747 1.1.1.4 christos switch(ELF32_R_TYPE (irel->r_info)) 748 1.1.1.4 christos { 749 1.1.1.4 christos case R_H8_DIR24R8: 750 1.1.1.4 christos case R_H8_PCREL16: 751 1.1.1.4 christos case R_H8_DIR16A8: 752 1.1.1.4 christos case R_H8_DIR24A8: 753 1.1.1.4 christos case R_H8_DIR32A16: 754 1.1.1.4 christos case R_H8_DISP32A16: 755 1.1.1.4 christos break; 756 1.1.1.4 christos default: 757 1.1.1.4 christos continue; 758 1.1 skrll } 759 1.1 skrll 760 1.1 skrll /* Get the section contents if we haven't done so already. */ 761 1.1 skrll if (contents == NULL) 762 1.1 skrll { 763 1.1 skrll /* Get cached copy if it exists. */ 764 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != NULL) 765 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents; 766 1.1 skrll else 767 1.1 skrll { 768 1.1 skrll /* Go get them off disk. */ 769 1.1 skrll if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 770 1.1 skrll goto error_return; 771 1.1 skrll } 772 1.1 skrll } 773 1.1 skrll 774 1.1 skrll /* Read this BFD's local symbols if we haven't done so already. */ 775 1.1 skrll if (isymbuf == NULL && symtab_hdr->sh_info != 0) 776 1.1 skrll { 777 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 778 1.1 skrll if (isymbuf == NULL) 779 1.1 skrll isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 780 1.1 skrll symtab_hdr->sh_info, 0, 781 1.1 skrll NULL, NULL, NULL); 782 1.1 skrll if (isymbuf == NULL) 783 1.1 skrll goto error_return; 784 1.1 skrll } 785 1.1 skrll 786 1.1 skrll /* Get the value of the symbol referred to by the reloc. */ 787 1.1 skrll if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 788 1.1 skrll { 789 1.1 skrll /* A local symbol. */ 790 1.1 skrll Elf_Internal_Sym *isym; 791 1.1 skrll asection *sym_sec; 792 1.1 skrll 793 1.1 skrll isym = isymbuf + ELF32_R_SYM (irel->r_info); 794 1.1 skrll sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 795 1.1 skrll symval = isym->st_value; 796 1.1 skrll /* If the reloc is absolute, it will not have 797 1.1 skrll a symbol or section associated with it. */ 798 1.1 skrll if (sym_sec) 799 1.1 skrll symval += sym_sec->output_section->vma 800 1.1 skrll + sym_sec->output_offset; 801 1.1 skrll } 802 1.1 skrll else 803 1.1 skrll { 804 1.1 skrll unsigned long indx; 805 1.1 skrll struct elf_link_hash_entry *h; 806 1.1 skrll 807 1.1 skrll /* An external symbol. */ 808 1.1 skrll indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; 809 1.1 skrll h = elf_sym_hashes (abfd)[indx]; 810 1.1 skrll BFD_ASSERT (h != NULL); 811 1.1 skrll if (h->root.type != bfd_link_hash_defined 812 1.1 skrll && h->root.type != bfd_link_hash_defweak) 813 1.1 skrll { 814 1.1.1.6 christos /* This appears to be a reference to an undefined 815 1.1.1.6 christos symbol. Just ignore it--it will be caught by the 816 1.1 skrll regular reloc processing. */ 817 1.1 skrll continue; 818 1.1 skrll } 819 1.1 skrll 820 1.1 skrll symval = (h->root.u.def.value 821 1.1 skrll + h->root.u.def.section->output_section->vma 822 1.1 skrll + h->root.u.def.section->output_offset); 823 1.1 skrll } 824 1.1 skrll 825 1.1 skrll /* For simplicity of coding, we are going to modify the section 826 1.1 skrll contents, the section relocs, and the BFD symbol table. We 827 1.1 skrll must tell the rest of the code not to free up this 828 1.1 skrll information. It would be possible to instead create a table 829 1.1 skrll of changes which have to be made, as is done in coff-mips.c; 830 1.1 skrll that would be more work, but would require less memory when 831 1.1 skrll the linker is run. */ 832 1.1 skrll switch (ELF32_R_TYPE (irel->r_info)) 833 1.1.1.4 christos { 834 1.1.1.4 christos /* Try to turn a 24-bit absolute branch/call into an 8-bit 835 1.1 skrll pc-relative branch/call. */ 836 1.1 skrll case R_H8_DIR24R8: 837 1.1 skrll { 838 1.1 skrll bfd_vma value = symval + irel->r_addend; 839 1.1 skrll bfd_vma dot, gap; 840 1.1 skrll 841 1.1 skrll /* Get the address of this instruction. */ 842 1.1 skrll dot = (sec->output_section->vma 843 1.1 skrll + sec->output_offset + irel->r_offset - 1); 844 1.1 skrll 845 1.1 skrll /* Compute the distance from this insn to the branch target. */ 846 1.1 skrll gap = value - dot; 847 1.1 skrll 848 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can 849 1.1 skrll relax this jump. +130 is valid since the target will move 850 1.1 skrll two bytes closer if we do relax this branch. */ 851 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130) 852 1.1 skrll { 853 1.1 skrll unsigned char code; 854 1.1 skrll 855 1.1 skrll /* Note that we've changed the relocs, section contents, 856 1.1 skrll etc. */ 857 1.1 skrll elf_section_data (sec)->relocs = internal_relocs; 858 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 859 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 860 1.1 skrll 861 1.1 skrll /* Get the instruction code being relaxed. */ 862 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 863 1.1 skrll 864 1.1 skrll /* If the previous instruction conditionally jumped around 865 1.1 skrll this instruction, we may be able to reverse the condition 866 1.1 skrll and redirect the previous instruction to the target of 867 1.1 skrll this instruction. 868 1.1 skrll 869 1.1 skrll Such sequences are used by the compiler to deal with 870 1.1 skrll long conditional branches. 871 1.1 skrll 872 1.1 skrll Only perform this optimisation for jumps (code 0x5a) not 873 1.1 skrll subroutine calls, as otherwise it could transform: 874 1.1.1.4 christos 875 1.1.1.4 christos mov.w r0,r0 876 1.1.1.4 christos beq .L1 877 1.1.1.4 christos jsr @_bar 878 1.1.1.4 christos .L1: rts 879 1.1 skrll _bar: rts 880 1.1.1.4 christos into: 881 1.1.1.4 christos mov.w r0,r0 882 1.1.1.4 christos bne _bar 883 1.1.1.4 christos rts 884 1.1 skrll _bar: rts 885 1.1 skrll 886 1.1.1.4 christos which changes the call (jsr) into a branch (bne). */ 887 1.1 skrll if (code == 0x5a /* jmp24. */ 888 1.1 skrll && (int) gap <= 130 889 1.1 skrll && (int) gap >= -128 890 1.1 skrll && last_reloc 891 1.1 skrll && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8 892 1.1 skrll && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info) 893 1.1 skrll { 894 1.1 skrll bfd_vma last_value; 895 1.1 skrll asection *last_sym_sec; 896 1.1 skrll Elf_Internal_Sym *last_sym; 897 1.1 skrll 898 1.1 skrll /* We will need to examine the symbol used by the 899 1.1 skrll previous relocation. */ 900 1.1 skrll 901 1.1 skrll last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info); 902 1.1 skrll last_sym_sec 903 1.1 skrll = bfd_section_from_elf_index (abfd, last_sym->st_shndx); 904 1.1 skrll last_value = (last_sym->st_value 905 1.1 skrll + last_sym_sec->output_section->vma 906 1.1 skrll + last_sym_sec->output_offset); 907 1.1 skrll 908 1.1 skrll /* Verify that the previous relocation was for a 909 1.1 skrll branch around this instruction and that no symbol 910 1.1 skrll exists at the current location. */ 911 1.1 skrll if (last_value == dot + 4 912 1.1 skrll && last_reloc->r_offset + 2 == irel->r_offset 913 1.1 skrll && ! elf32_h8_symbol_address_p (abfd, sec, dot)) 914 1.1 skrll { 915 1.1 skrll /* We can eliminate this jump. Twiddle the 916 1.1 skrll previous relocation as necessary. */ 917 1.1 skrll irel->r_info 918 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 919 1.1 skrll ELF32_R_TYPE (R_H8_NONE)); 920 1.1 skrll 921 1.1 skrll last_reloc->r_info 922 1.1 skrll = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 923 1.1 skrll ELF32_R_TYPE (R_H8_PCREL8)); 924 1.1 skrll last_reloc->r_addend = irel->r_addend; 925 1.1 skrll 926 1.1 skrll code = bfd_get_8 (abfd, 927 1.1 skrll contents + last_reloc->r_offset - 1); 928 1.1 skrll code ^= 1; 929 1.1 skrll bfd_put_8 (abfd, 930 1.1.1.4 christos code, 931 1.1 skrll contents + last_reloc->r_offset - 1); 932 1.1 skrll 933 1.1 skrll /* Delete four bytes of data. */ 934 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 935 1.1 skrll irel->r_offset - 1, 936 1.1 skrll 4)) 937 1.1 skrll goto error_return; 938 1.1.1.9 christos 939 1.1 skrll *again = true; 940 1.1 skrll break; 941 1.1 skrll } 942 1.1 skrll } 943 1.1 skrll 944 1.1.1.4 christos if (code == 0x5e) 945 1.1.1.4 christos /* This is jsr24 */ 946 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1); /* bsr8. */ 947 1.1.1.4 christos else if (code == 0x5a) 948 1.1.1.4 christos /* This is jmp24 */ 949 1.1 skrll bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1); /* bra8. */ 950 1.1 skrll else 951 1.1 skrll abort (); 952 1.1 skrll 953 1.1 skrll /* Fix the relocation's type. */ 954 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 955 1.1 skrll R_H8_PCREL8); 956 1.1 skrll 957 1.1 skrll /* Delete two bytes of data. */ 958 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 959 1.1 skrll irel->r_offset + 1, 2)) 960 1.1 skrll goto error_return; 961 1.1 skrll 962 1.1 skrll /* That will change things, so, we should relax again. 963 1.1.1.9 christos Note that this is not required, and it may be slow. */ 964 1.1 skrll *again = true; 965 1.1 skrll } 966 1.1 skrll break; 967 1.1 skrll } 968 1.1.1.4 christos 969 1.1.1.4 christos /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative 970 1.1 skrll branch. */ 971 1.1 skrll case R_H8_PCREL16: 972 1.1 skrll { 973 1.1 skrll bfd_vma value = symval + irel->r_addend; 974 1.1 skrll bfd_vma dot; 975 1.1 skrll bfd_vma gap; 976 1.1 skrll 977 1.1 skrll /* Get the address of this instruction. */ 978 1.1 skrll dot = (sec->output_section->vma 979 1.1 skrll + sec->output_offset 980 1.1 skrll + irel->r_offset - 2); 981 1.1 skrll 982 1.1 skrll gap = value - dot; 983 1.1 skrll 984 1.1 skrll /* If the distance is within -126..+130 inclusive, then we can 985 1.1 skrll relax this jump. +130 is valid since the target will move 986 1.1 skrll two bytes closer if we do relax this branch. */ 987 1.1 skrll if ((int) gap >= -126 && (int) gap <= 130) 988 1.1 skrll { 989 1.1 skrll unsigned char code; 990 1.1 skrll 991 1.1 skrll /* Note that we've changed the relocs, section contents, 992 1.1 skrll etc. */ 993 1.1 skrll elf_section_data (sec)->relocs = internal_relocs; 994 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 995 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 996 1.1 skrll 997 1.1 skrll /* Get the opcode. */ 998 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2); 999 1.1 skrll 1000 1.1 skrll if (code == 0x58) 1001 1.1 skrll { 1002 1.1 skrll /* bCC:16 -> bCC:8 */ 1003 1.1 skrll /* Get the second byte of the original insn, which 1004 1.1 skrll contains the condition code. */ 1005 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 1006 1.1.1.4 christos 1007 1.1 skrll /* Compute the first byte of the relaxed 1008 1.1 skrll instruction. The original sequence 0x58 0xX0 1009 1.1 skrll is relaxed to 0x4X, where X represents the 1010 1.1 skrll condition code. */ 1011 1.1 skrll code &= 0xf0; 1012 1.1 skrll code >>= 4; 1013 1.1.1.4 christos code |= 0x40; 1014 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 2); /* bCC:8. */ 1015 1.1.1.4 christos } 1016 1.1 skrll else if (code == 0x5c) /* bsr16. */ 1017 1.1.1.4 christos /* This is bsr. */ 1018 1.1 skrll bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2); /* bsr8. */ 1019 1.1.1.2 christos else 1020 1.1.1.2 christos /* Might be MOVSD. */ 1021 1.1 skrll break; 1022 1.1 skrll 1023 1.1 skrll /* Fix the relocation's type. */ 1024 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1025 1.1 skrll R_H8_PCREL8); 1026 1.1 skrll irel->r_offset--; 1027 1.1 skrll 1028 1.1 skrll /* Delete two bytes of data. */ 1029 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 1030 1.1 skrll irel->r_offset + 1, 2)) 1031 1.1 skrll goto error_return; 1032 1.1 skrll 1033 1.1 skrll /* That will change things, so, we should relax again. 1034 1.1.1.9 christos Note that this is not required, and it may be slow. */ 1035 1.1 skrll *again = true; 1036 1.1 skrll } 1037 1.1 skrll break; 1038 1.1 skrll } 1039 1.1.1.4 christos 1040 1.1.1.4 christos /* This is a 16-bit absolute address in one of the following 1041 1.1 skrll instructions: 1042 1.1 skrll 1043 1.1 skrll "band", "bclr", "biand", "bild", "bior", "bist", "bixor", 1044 1.1 skrll "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and 1045 1.1 skrll "mov.b" 1046 1.1.1.4 christos 1047 1.1.1.4 christos We may relax this into an 8-bit absolute address if it's in 1048 1.1 skrll the right range. */ 1049 1.1 skrll case R_H8_DIR16A8: 1050 1.1 skrll { 1051 1.1 skrll bfd_vma value; 1052 1.1 skrll 1053 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend); 1054 1.1 skrll if (value >= 0xffffff00u) 1055 1.1 skrll { 1056 1.1 skrll unsigned char code; 1057 1.1 skrll unsigned char temp_code; 1058 1.1 skrll 1059 1.1 skrll /* Note that we've changed the relocs, section contents, 1060 1.1 skrll etc. */ 1061 1.1 skrll elf_section_data (sec)->relocs = internal_relocs; 1062 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 1063 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 1064 1.1 skrll 1065 1.1 skrll /* Get the opcode. */ 1066 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2); 1067 1.1 skrll 1068 1.1 skrll /* All instructions with R_H8_DIR16A8 start with 1069 1.1 skrll 0x6a. */ 1070 1.1 skrll if (code != 0x6a) 1071 1.1 skrll abort (); 1072 1.1 skrll 1073 1.1 skrll temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 1074 1.1 skrll /* If this is a mov.b instruction, clear the lower 1075 1.1 skrll nibble, which contains the source/destination 1076 1.1 skrll register number. */ 1077 1.1 skrll if ((temp_code & 0x10) != 0x10) 1078 1.1 skrll temp_code &= 0xf0; 1079 1.1 skrll 1080 1.1 skrll switch (temp_code) 1081 1.1 skrll { 1082 1.1 skrll case 0x00: 1083 1.1 skrll /* This is mov.b @aa:16,Rd. */ 1084 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x20, 1085 1.1 skrll contents + irel->r_offset - 2); 1086 1.1 skrll break; 1087 1.1 skrll case 0x80: 1088 1.1 skrll /* This is mov.b Rs,@aa:16. */ 1089 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x30, 1090 1.1 skrll contents + irel->r_offset - 2); 1091 1.1 skrll break; 1092 1.1 skrll case 0x18: 1093 1.1 skrll /* This is a bit-maniputation instruction that 1094 1.1 skrll stores one bit into memory, one of "bclr", 1095 1.1 skrll "bist", "bnot", "bset", and "bst". */ 1096 1.1 skrll bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2); 1097 1.1 skrll break; 1098 1.1 skrll case 0x10: 1099 1.1 skrll /* This is a bit-maniputation instruction that 1100 1.1 skrll loads one bit from memory, one of "band", 1101 1.1 skrll "biand", "bild", "bior", "bixor", "bld", "bor", 1102 1.1 skrll "btst", and "bxor". */ 1103 1.1 skrll bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2); 1104 1.1 skrll break; 1105 1.1 skrll default: 1106 1.1 skrll abort (); 1107 1.1 skrll } 1108 1.1 skrll 1109 1.1 skrll /* Fix the relocation's type. */ 1110 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1111 1.1 skrll R_H8_DIR8); 1112 1.1 skrll 1113 1.1 skrll /* Move the relocation. */ 1114 1.1 skrll irel->r_offset--; 1115 1.1 skrll 1116 1.1 skrll /* Delete two bytes of data. */ 1117 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 1118 1.1 skrll irel->r_offset + 1, 2)) 1119 1.1 skrll goto error_return; 1120 1.1 skrll 1121 1.1 skrll /* That will change things, so, we should relax again. 1122 1.1.1.9 christos Note that this is not required, and it may be slow. */ 1123 1.1 skrll *again = true; 1124 1.1 skrll } 1125 1.1 skrll break; 1126 1.1 skrll } 1127 1.1.1.4 christos 1128 1.1.1.4 christos /* This is a 24-bit absolute address in one of the following 1129 1.1 skrll instructions: 1130 1.1 skrll 1131 1.1 skrll "band", "bclr", "biand", "bild", "bior", "bist", "bixor", 1132 1.1 skrll "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and 1133 1.1 skrll "mov.b" 1134 1.1.1.4 christos 1135 1.1.1.4 christos We may relax this into an 8-bit absolute address if it's in 1136 1.1 skrll the right range. */ 1137 1.1 skrll case R_H8_DIR24A8: 1138 1.1 skrll { 1139 1.1 skrll bfd_vma value; 1140 1.1 skrll 1141 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend); 1142 1.1 skrll if (value >= 0xffffff00u) 1143 1.1 skrll { 1144 1.1 skrll unsigned char code; 1145 1.1 skrll unsigned char temp_code; 1146 1.1 skrll 1147 1.1 skrll /* Note that we've changed the relocs, section contents, 1148 1.1 skrll etc. */ 1149 1.1 skrll elf_section_data (sec)->relocs = internal_relocs; 1150 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 1151 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 1152 1.1 skrll 1153 1.1 skrll /* Get the opcode. */ 1154 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 2); 1155 1.1 skrll 1156 1.1 skrll /* All instructions with R_H8_DIR24A8 start with 1157 1.1 skrll 0x6a. */ 1158 1.1 skrll if (code != 0x6a) 1159 1.1 skrll abort (); 1160 1.1 skrll 1161 1.1 skrll temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 1162 1.1 skrll 1163 1.1 skrll /* If this is a mov.b instruction, clear the lower 1164 1.1 skrll nibble, which contains the source/destination 1165 1.1 skrll register number. */ 1166 1.1 skrll if ((temp_code & 0x30) != 0x30) 1167 1.1 skrll temp_code &= 0xf0; 1168 1.1 skrll 1169 1.1 skrll switch (temp_code) 1170 1.1 skrll { 1171 1.1 skrll case 0x20: 1172 1.1 skrll /* This is mov.b @aa:24/32,Rd. */ 1173 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x20, 1174 1.1 skrll contents + irel->r_offset - 2); 1175 1.1 skrll break; 1176 1.1 skrll case 0xa0: 1177 1.1 skrll /* This is mov.b Rs,@aa:24/32. */ 1178 1.1 skrll bfd_put_8 (abfd, (code & 0xf) | 0x30, 1179 1.1 skrll contents + irel->r_offset - 2); 1180 1.1 skrll break; 1181 1.1 skrll case 0x38: 1182 1.1 skrll /* This is a bit-maniputation instruction that 1183 1.1 skrll stores one bit into memory, one of "bclr", 1184 1.1 skrll "bist", "bnot", "bset", and "bst". */ 1185 1.1 skrll bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2); 1186 1.1 skrll break; 1187 1.1 skrll case 0x30: 1188 1.1 skrll /* This is a bit-maniputation instruction that 1189 1.1 skrll loads one bit from memory, one of "band", 1190 1.1 skrll "biand", "bild", "bior", "bixor", "bld", "bor", 1191 1.1 skrll "btst", and "bxor". */ 1192 1.1 skrll bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2); 1193 1.1 skrll break; 1194 1.1 skrll default: 1195 1.1 skrll abort(); 1196 1.1 skrll } 1197 1.1 skrll 1198 1.1 skrll /* Fix the relocation's type. */ 1199 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1200 1.1 skrll R_H8_DIR8); 1201 1.1 skrll irel->r_offset--; 1202 1.1.1.4 christos 1203 1.1 skrll /* Delete four bytes of data. */ 1204 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 1205 1.1 skrll irel->r_offset + 1, 4)) 1206 1.1 skrll goto error_return; 1207 1.1 skrll 1208 1.1 skrll /* That will change things, so, we should relax again. 1209 1.1.1.9 christos Note that this is not required, and it may be slow. */ 1210 1.1 skrll *again = true; 1211 1.1 skrll break; 1212 1.1 skrll } 1213 1.1 skrll } 1214 1.1 skrll 1215 1.1 skrll /* Fall through. */ 1216 1.1 skrll 1217 1.1 skrll /* This is a 24-/32-bit absolute address in one of the 1218 1.1 skrll following instructions: 1219 1.1.1.4 christos 1220 1.1.1.4 christos "band", "bclr", "biand", "bild", "bior", "bist", 1221 1.1.1.4 christos "bixor", "bld", "bnot", "bor", "bset", "bst", "btst", 1222 1.1 skrll "bxor", "ldc.w", "stc.w" and "mov.[bwl]" 1223 1.1 skrll 1224 1.1 skrll We may relax this into an 16-bit absolute address if it's 1225 1.1 skrll in the right range. */ 1226 1.1 skrll case R_H8_DIR32A16: 1227 1.1 skrll { 1228 1.1 skrll bfd_vma value; 1229 1.1 skrll 1230 1.1 skrll value = bfd_h8300_pad_address (abfd, symval + irel->r_addend); 1231 1.1 skrll if (value <= 0x7fff || value >= 0xffff8000u) 1232 1.1 skrll { 1233 1.1.1.2 christos unsigned char code; 1234 1.1.1.2 christos unsigned char op0, op1, op2, op3; 1235 1.1 skrll unsigned char *op_ptr; 1236 1.1 skrll 1237 1.1 skrll /* Note that we've changed the relocs, section contents, 1238 1.1 skrll etc. */ 1239 1.1 skrll elf_section_data (sec)->relocs = internal_relocs; 1240 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 1241 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 1242 1.1.1.2 christos 1243 1.1.1.2 christos if (irel->r_offset >= 4) 1244 1.1.1.4 christos { 1245 1.1.1.2 christos /* Check for 4-byte MOVA relaxation (SH-specific). */ 1246 1.1.1.2 christos int second_reloc = 0; 1247 1.1.1.2 christos 1248 1.1.1.2 christos op_ptr = contents + irel->r_offset - 4; 1249 1.1.1.2 christos 1250 1.1.1.2 christos if (last_reloc) 1251 1.1.1.2 christos { 1252 1.1.1.2 christos arelent bfd_reloc; 1253 1.1.1.2 christos reloc_howto_type *h; 1254 1.1.1.2 christos bfd_vma last_reloc_size; 1255 1.1.1.7 christos 1256 1.1.1.7 christos if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc)) 1257 1.1.1.2 christos break; 1258 1.1.1.2 christos h = bfd_reloc.howto; 1259 1.1.1.2 christos last_reloc_size = 1 << h->size; 1260 1.1.1.2 christos if (last_reloc->r_offset + last_reloc_size 1261 1.1.1.2 christos == irel->r_offset) 1262 1.1.1.2 christos { 1263 1.1.1.2 christos op_ptr -= last_reloc_size; 1264 1.1.1.2 christos second_reloc = 1; 1265 1.1.1.2 christos } 1266 1.1.1.4 christos } 1267 1.1.1.4 christos 1268 1.1.1.2 christos if (irel + 1 < irelend) 1269 1.1.1.2 christos { 1270 1.1.1.2 christos Elf_Internal_Rela *next_reloc = irel + 1; 1271 1.1.1.2 christos arelent bfd_reloc; 1272 1.1.1.2 christos reloc_howto_type *h; 1273 1.1.1.2 christos bfd_vma next_reloc_size; 1274 1.1.1.7 christos 1275 1.1.1.7 christos if (! elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc)) 1276 1.1.1.2 christos break; 1277 1.1.1.2 christos h = bfd_reloc.howto; 1278 1.1.1.2 christos next_reloc_size = 1 << h->size; 1279 1.1.1.2 christos if (next_reloc->r_offset + next_reloc_size 1280 1.1.1.2 christos == irel->r_offset) 1281 1.1.1.2 christos { 1282 1.1.1.2 christos op_ptr -= next_reloc_size; 1283 1.1.1.2 christos second_reloc = 1; 1284 1.1.1.2 christos } 1285 1.1.1.2 christos } 1286 1.1.1.2 christos 1287 1.1.1.2 christos op0 = bfd_get_8 (abfd, op_ptr + 0); 1288 1.1.1.2 christos op1 = bfd_get_8 (abfd, op_ptr + 1); 1289 1.1.1.2 christos op2 = bfd_get_8 (abfd, op_ptr + 2); 1290 1.1.1.2 christos op3 = bfd_get_8 (abfd, op_ptr + 3); 1291 1.1.1.2 christos 1292 1.1.1.2 christos if (op0 == 0x01 1293 1.1.1.2 christos && (op1 & 0xdf) == 0x5f 1294 1.1.1.2 christos && (op2 & 0x40) == 0x40 1295 1.1.1.2 christos && (op3 & 0x80) == 0x80) 1296 1.1.1.2 christos { 1297 1.1.1.2 christos if ((op2 & 0x08) == 0) 1298 1.1.1.2 christos second_reloc = 1; 1299 1.1.1.2 christos 1300 1.1.1.2 christos if (second_reloc) 1301 1.1.1.2 christos { 1302 1.1.1.2 christos op3 &= ~0x08; 1303 1.1.1.2 christos bfd_put_8 (abfd, op3, op_ptr + 3); 1304 1.1.1.2 christos } 1305 1.1.1.2 christos else 1306 1.1.1.2 christos { 1307 1.1.1.2 christos op2 &= ~0x08; 1308 1.1.1.2 christos bfd_put_8 (abfd, op2, op_ptr + 2); 1309 1.1.1.2 christos } 1310 1.1.1.2 christos goto r_h8_dir32a16_common; 1311 1.1.1.2 christos } 1312 1.1.1.2 christos } 1313 1.1.1.4 christos 1314 1.1.1.2 christos /* Now check for short version of MOVA. (SH-specific) */ 1315 1.1.1.2 christos op_ptr = contents + irel->r_offset - 2; 1316 1.1.1.2 christos op0 = bfd_get_8 (abfd, op_ptr + 0); 1317 1.1.1.2 christos op1 = bfd_get_8 (abfd, op_ptr + 1); 1318 1.1.1.2 christos 1319 1.1.1.2 christos if (op0 == 0x7a 1320 1.1.1.2 christos && (op1 & 0x88) == 0x80) 1321 1.1.1.2 christos { 1322 1.1.1.2 christos op1 |= 0x08; 1323 1.1.1.2 christos bfd_put_8 (abfd, op1, op_ptr + 1); 1324 1.1.1.2 christos goto r_h8_dir32a16_common; 1325 1.1.1.2 christos } 1326 1.1 skrll 1327 1.1 skrll /* Get the opcode. */ 1328 1.1 skrll code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 1329 1.1 skrll 1330 1.1 skrll /* Fix the opcode. For all the instructions that 1331 1.1 skrll belong to this relaxation, we simply need to turn 1332 1.1 skrll off bit 0x20 in the previous byte. */ 1333 1.1 skrll code &= ~0x20; 1334 1.1 skrll 1335 1.1 skrll bfd_put_8 (abfd, code, contents + irel->r_offset - 1); 1336 1.1.1.2 christos 1337 1.1 skrll r_h8_dir32a16_common: 1338 1.1 skrll /* Fix the relocation's type. */ 1339 1.1 skrll irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1340 1.1 skrll R_H8_DIR16); 1341 1.1 skrll 1342 1.1 skrll /* Delete two bytes of data. */ 1343 1.1 skrll if (!elf32_h8_relax_delete_bytes (abfd, sec, 1344 1.1 skrll irel->r_offset + 1, 2)) 1345 1.1 skrll goto error_return; 1346 1.1 skrll 1347 1.1 skrll /* That will change things, so, we should relax again. 1348 1.1.1.9 christos Note that this is not required, and it may be slow. */ 1349 1.1 skrll *again = true; 1350 1.1.1.4 christos } 1351 1.1.1.4 christos break; /* case R_H8_DIR32A16 */ 1352 1.1.1.4 christos } 1353 1.1.1.4 christos 1354 1.1.1.4 christos case R_H8_DISP32A16: 1355 1.1.1.4 christos /* mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx) 4 bytes 1356 1.1.1.4 christos It is assured that instruction uses at least 4 bytes opcode before 1357 1.1.1.4 christos reloc entry addressing mode "register indirect with displacement" 1358 1.1.1.4 christos relaxing options (all saving 4 bytes): 1359 1.1.1.4 christos 0x78 0sss0000 0x6A 0010dddd disp:32 mov.b @(d:32,ERs),Rd -> 1360 1.1.1.4 christos 0x6E 0sssdddd disp:16 mov.b @(d:16,ERs),Rd 1361 1.1.1.4 christos 0x78 0sss0000 0x6B 0010dddd disp:32 mov.w @(d:32,ERs),Rd -> 1362 1.1.1.4 christos 0x6F 0sssdddd disp:16 mov.w @(d:16,ERs),Rd 1363 1.1.1.4 christos 0x01 0x00 0x78 0sss0000 0x6B 00100ddd disp:32 mov.l @(d:32,ERs),ERd -> 1364 1.1.1.4 christos 0x01 0x00 0x6F 0sss0ddd disp:16 mov.l @(d:16,ERs),ERd 1365 1.1.1.4 christos 1366 1.1.1.4 christos 0x78 0ddd0000 0x6A 1010ssss disp:32 mov.b Rs,@(d:32,ERd) -> 1367 1.1.1.4 christos 0x6E 1dddssss disp:16 mov.b Rs,@(d:16,ERd) 1368 1.1.1.4 christos 0x78 0ddd0000 0x6B 1010ssss disp:32 mov.w Rs,@(d:32,ERd) -> 1369 1.1.1.4 christos 0x6F 1dddssss disp:16 mov.w Rs,@(d:16,ERd) 1370 1.1.1.4 christos 0x01 0x00 0x78 xddd0000 0x6B 10100sss disp:32 mov.l ERs,@(d:32,ERd) -> 1371 1.1.1.4 christos 0x01 0x00 0x6F 1ddd0sss disp:16 mov.l ERs,@(d:16,ERd) 1372 1.1.1.4 christos mov.l prefix 0x01 0x00 can be left as is and mov.l handled same 1373 1.1.1.4 christos as mov.w/ */ 1374 1.1.1.4 christos { 1375 1.1.1.4 christos bfd_vma value; 1376 1.1.1.4 christos 1377 1.1.1.4 christos value = bfd_h8300_pad_address (abfd, symval + irel->r_addend); 1378 1.1.1.4 christos if (value <= 0x7fff || value >= 0xffff8000u) 1379 1.1.1.4 christos { 1380 1.1.1.4 christos unsigned char op0, op1, op2, op3, op0n, op1n; 1381 1.1.1.4 christos int relax = 0; 1382 1.1.1.4 christos 1383 1.1.1.4 christos /* Note that we've changed the relocs, section contents, 1384 1.1.1.4 christos etc. */ 1385 1.1.1.4 christos elf_section_data (sec)->relocs = internal_relocs; 1386 1.1.1.4 christos elf_section_data (sec)->this_hdr.contents = contents; 1387 1.1.1.4 christos symtab_hdr->contents = (unsigned char *) isymbuf; 1388 1.1.1.4 christos 1389 1.1.1.4 christos if (irel->r_offset >= 4) 1390 1.1.1.4 christos { 1391 1.1.1.4 christos op0 = bfd_get_8 (abfd, contents + irel->r_offset - 4); 1392 1.1.1.4 christos op1 = bfd_get_8 (abfd, contents + irel->r_offset - 3); 1393 1.1.1.4 christos op2 = bfd_get_8 (abfd, contents + irel->r_offset - 2); 1394 1.1.1.4 christos op3 = bfd_get_8 (abfd, contents + irel->r_offset - 1); 1395 1.1.1.4 christos 1396 1.1.1.4 christos if (op0 == 0x78) 1397 1.1.1.4 christos { 1398 1.1.1.4 christos switch(op2) 1399 1.1.1.4 christos { 1400 1.1.1.4 christos case 0x6A: 1401 1.1.1.4 christos if ((op1 & 0x8F) == 0x00 && (op3 & 0x70) == 0x20) 1402 1.1.1.4 christos { 1403 1.1.1.4 christos /* mov.b. */ 1404 1.1.1.4 christos op0n = 0x6E; 1405 1.1.1.4 christos relax = 1; 1406 1.1.1.4 christos } 1407 1.1.1.4 christos break; 1408 1.1.1.4 christos case 0x6B: 1409 1.1.1.4 christos if ((op1 & 0x0F) == 0x00 && (op3 & 0x70) == 0x20) 1410 1.1.1.4 christos { 1411 1.1.1.4 christos /* mov.w/l. */ 1412 1.1.1.4 christos op0n = 0x6F; 1413 1.1.1.4 christos relax = 1; 1414 1.1.1.4 christos } 1415 1.1.1.4 christos break; 1416 1.1.1.4 christos default: 1417 1.1.1.4 christos break; 1418 1.1.1.4 christos } 1419 1.1.1.4 christos } 1420 1.1.1.4 christos } 1421 1.1.1.4 christos 1422 1.1.1.4 christos if (relax) 1423 1.1.1.4 christos { 1424 1.1.1.4 christos op1n = (op3 & 0x8F) | (op1 & 0x70); 1425 1.1.1.4 christos bfd_put_8 (abfd, op0n, contents + irel->r_offset - 4); 1426 1.1.1.4 christos bfd_put_8 (abfd, op1n, contents + irel->r_offset - 3); 1427 1.1.1.4 christos 1428 1.1.1.4 christos /* Fix the relocation's type. */ 1429 1.1.1.4 christos irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_H8_DIR16); 1430 1.1.1.4 christos irel->r_offset -= 2; 1431 1.1.1.4 christos 1432 1.1.1.4 christos /* Delete four bytes of data. */ 1433 1.1.1.4 christos if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset + 2, 4)) 1434 1.1.1.4 christos goto error_return; 1435 1.1.1.4 christos 1436 1.1.1.4 christos /* That will change things, so, we should relax again. 1437 1.1.1.9 christos Note that this is not required, and it may be slow. */ 1438 1.1.1.4 christos *again = true; 1439 1.1.1.4 christos } 1440 1.1 skrll } 1441 1.1.1.4 christos } 1442 1.1 skrll break; 1443 1.1 skrll 1444 1.1 skrll default: 1445 1.1 skrll break; 1446 1.1 skrll } 1447 1.1 skrll } 1448 1.1 skrll 1449 1.1 skrll if (isymbuf != NULL 1450 1.1 skrll && symtab_hdr->contents != (unsigned char *) isymbuf) 1451 1.1 skrll { 1452 1.1 skrll if (! link_info->keep_memory) 1453 1.1 skrll free (isymbuf); 1454 1.1 skrll else 1455 1.1 skrll symtab_hdr->contents = (unsigned char *) isymbuf; 1456 1.1 skrll } 1457 1.1 skrll 1458 1.1 skrll if (contents != NULL 1459 1.1 skrll && elf_section_data (sec)->this_hdr.contents != contents) 1460 1.1 skrll { 1461 1.1 skrll if (! link_info->keep_memory) 1462 1.1 skrll free (contents); 1463 1.1 skrll else 1464 1.1 skrll { 1465 1.1 skrll /* Cache the section contents for elf_link_input_bfd. */ 1466 1.1 skrll elf_section_data (sec)->this_hdr.contents = contents; 1467 1.1 skrll } 1468 1.1 skrll } 1469 1.1.1.9 christos 1470 1.1 skrll if (elf_section_data (sec)->relocs != internal_relocs) 1471 1.1 skrll free (internal_relocs); 1472 1.1.1.9 christos 1473 1.1 skrll return true; 1474 1.1 skrll 1475 1.1.1.9 christos error_return: 1476 1.1 skrll if (symtab_hdr->contents != (unsigned char *) isymbuf) 1477 1.1.1.9 christos free (isymbuf); 1478 1.1 skrll if (elf_section_data (sec)->this_hdr.contents != contents) 1479 1.1.1.9 christos free (contents); 1480 1.1 skrll if (elf_section_data (sec)->relocs != internal_relocs) 1481 1.1.1.9 christos free (internal_relocs); 1482 1.1 skrll return false; 1483 1.1 skrll } 1484 1.1 skrll 1485 1.1 skrll /* Delete some bytes from a section while relaxing. */ 1486 1.1.1.9 christos 1487 1.1 skrll static bool 1488 1.1 skrll elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count) 1489 1.1 skrll { 1490 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 1491 1.1 skrll unsigned int sec_shndx; 1492 1.1 skrll bfd_byte *contents; 1493 1.1 skrll Elf_Internal_Rela *irel, *irelend; 1494 1.1 skrll Elf_Internal_Sym *isym; 1495 1.1 skrll Elf_Internal_Sym *isymend; 1496 1.1 skrll bfd_vma toaddr; 1497 1.1 skrll struct elf_link_hash_entry **sym_hashes; 1498 1.1 skrll struct elf_link_hash_entry **end_hashes; 1499 1.1 skrll unsigned int symcount; 1500 1.1 skrll 1501 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1502 1.1 skrll 1503 1.1 skrll contents = elf_section_data (sec)->this_hdr.contents; 1504 1.1 skrll 1505 1.1 skrll toaddr = sec->size; 1506 1.1 skrll 1507 1.1 skrll irel = elf_section_data (sec)->relocs; 1508 1.1 skrll irelend = irel + sec->reloc_count; 1509 1.1 skrll 1510 1.1 skrll /* Actually delete the bytes. */ 1511 1.1 skrll memmove (contents + addr, contents + addr + count, 1512 1.1 skrll (size_t) (toaddr - addr - count)); 1513 1.1 skrll sec->size -= count; 1514 1.1 skrll 1515 1.1 skrll /* Adjust all the relocs. */ 1516 1.1 skrll for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) 1517 1.1 skrll { 1518 1.1 skrll /* Get the new reloc address. */ 1519 1.1.1.4 christos if ((irel->r_offset > addr 1520 1.1 skrll && irel->r_offset <= toaddr)) 1521 1.1 skrll irel->r_offset -= count; 1522 1.1 skrll } 1523 1.1 skrll 1524 1.1 skrll /* Adjust the local symbols defined in this section. */ 1525 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1526 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1527 1.1 skrll isymend = isym + symtab_hdr->sh_info; 1528 1.1 skrll for (; isym < isymend; isym++) 1529 1.1 skrll { 1530 1.1 skrll if (isym->st_shndx == sec_shndx 1531 1.1.1.4 christos && isym->st_value > addr 1532 1.1 skrll && isym->st_value <= toaddr) 1533 1.1 skrll isym->st_value -= count; 1534 1.1 skrll } 1535 1.1 skrll 1536 1.1 skrll /* Now adjust the global symbols defined in this section. */ 1537 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1538 1.1 skrll - symtab_hdr->sh_info); 1539 1.1 skrll sym_hashes = elf_sym_hashes (abfd); 1540 1.1 skrll end_hashes = sym_hashes + symcount; 1541 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++) 1542 1.1 skrll { 1543 1.1.1.4 christos struct elf_link_hash_entry *sym_hash = *sym_hashes; 1544 1.1 skrll 1545 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined 1546 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak) 1547 1.1 skrll && sym_hash->root.u.def.section == sec 1548 1.1.1.4 christos && sym_hash->root.u.def.value > addr 1549 1.1.1.4 christos && sym_hash->root.u.def.value <= toaddr) 1550 1.1 skrll sym_hash->root.u.def.value -= count; 1551 1.1 skrll } 1552 1.1.1.9 christos 1553 1.1 skrll return true; 1554 1.1 skrll } 1555 1.1 skrll 1556 1.1 skrll /* Return TRUE if a symbol exists at the given address, else return 1557 1.1.1.9 christos FALSE. */ 1558 1.1 skrll static bool 1559 1.1 skrll elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr) 1560 1.1 skrll { 1561 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 1562 1.1 skrll unsigned int sec_shndx; 1563 1.1 skrll Elf_Internal_Sym *isym; 1564 1.1 skrll Elf_Internal_Sym *isymend; 1565 1.1 skrll struct elf_link_hash_entry **sym_hashes; 1566 1.1 skrll struct elf_link_hash_entry **end_hashes; 1567 1.1 skrll unsigned int symcount; 1568 1.1 skrll 1569 1.1 skrll sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1570 1.1 skrll 1571 1.1 skrll /* Examine all the symbols. */ 1572 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1573 1.1 skrll isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1574 1.1 skrll isymend = isym + symtab_hdr->sh_info; 1575 1.1 skrll for (; isym < isymend; isym++) 1576 1.1 skrll { 1577 1.1 skrll if (isym->st_shndx == sec_shndx 1578 1.1.1.9 christos && isym->st_value == addr) 1579 1.1 skrll return true; 1580 1.1 skrll } 1581 1.1 skrll 1582 1.1 skrll symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1583 1.1 skrll - symtab_hdr->sh_info); 1584 1.1 skrll sym_hashes = elf_sym_hashes (abfd); 1585 1.1 skrll end_hashes = sym_hashes + symcount; 1586 1.1 skrll for (; sym_hashes < end_hashes; sym_hashes++) 1587 1.1 skrll { 1588 1.1 skrll struct elf_link_hash_entry *sym_hash = *sym_hashes; 1589 1.1 skrll if ((sym_hash->root.type == bfd_link_hash_defined 1590 1.1 skrll || sym_hash->root.type == bfd_link_hash_defweak) 1591 1.1 skrll && sym_hash->root.u.def.section == sec 1592 1.1.1.9 christos && sym_hash->root.u.def.value == addr) 1593 1.1 skrll return true; 1594 1.1 skrll } 1595 1.1.1.9 christos 1596 1.1 skrll return false; 1597 1.1 skrll } 1598 1.1 skrll 1599 1.1 skrll /* This is a version of bfd_generic_get_relocated_section_contents 1600 1.1 skrll which uses elf32_h8_relocate_section. */ 1601 1.1 skrll 1602 1.1 skrll static bfd_byte * 1603 1.1 skrll elf32_h8_get_relocated_section_contents (bfd *output_bfd, 1604 1.1 skrll struct bfd_link_info *link_info, 1605 1.1 skrll struct bfd_link_order *link_order, 1606 1.1.1.9 christos bfd_byte *data, 1607 1.1 skrll bool relocatable, 1608 1.1 skrll asymbol **symbols) 1609 1.1 skrll { 1610 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 1611 1.1 skrll asection *input_section = link_order->u.indirect.section; 1612 1.1 skrll bfd *input_bfd = input_section->owner; 1613 1.1 skrll asection **sections = NULL; 1614 1.1 skrll Elf_Internal_Rela *internal_relocs = NULL; 1615 1.1 skrll Elf_Internal_Sym *isymbuf = NULL; 1616 1.1 skrll 1617 1.1 skrll /* We only need to handle the case of relaxing, or of having a 1618 1.1 skrll particular set of section contents, specially. */ 1619 1.1 skrll if (relocatable 1620 1.1 skrll || elf_section_data (input_section)->this_hdr.contents == NULL) 1621 1.1 skrll return bfd_generic_get_relocated_section_contents (output_bfd, link_info, 1622 1.1 skrll link_order, data, 1623 1.1 skrll relocatable, 1624 1.1 skrll symbols); 1625 1.1 skrll 1626 1.1 skrll symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1627 1.1.1.10 christos 1628 1.1.1.10 christos bfd_byte *orig_data = data; 1629 1.1.1.10 christos if (data == NULL) 1630 1.1.1.10 christos { 1631 1.1.1.10 christos data = bfd_malloc (input_section->size); 1632 1.1.1.10 christos if (data == NULL) 1633 1.1.1.10 christos return NULL; 1634 1.1 skrll } 1635 1.1 skrll memcpy (data, elf_section_data (input_section)->this_hdr.contents, 1636 1.1 skrll (size_t) input_section->size); 1637 1.1 skrll 1638 1.1 skrll if ((input_section->flags & SEC_RELOC) != 0 1639 1.1 skrll && input_section->reloc_count > 0) 1640 1.1 skrll { 1641 1.1 skrll asection **secpp; 1642 1.1 skrll Elf_Internal_Sym *isym, *isymend; 1643 1.1 skrll bfd_size_type amt; 1644 1.1 skrll 1645 1.1.1.3 christos internal_relocs = (_bfd_elf_link_read_relocs 1646 1.1.1.9 christos (input_bfd, input_section, NULL, 1647 1.1 skrll (Elf_Internal_Rela *) NULL, false)); 1648 1.1 skrll if (internal_relocs == NULL) 1649 1.1 skrll goto error_return; 1650 1.1 skrll 1651 1.1 skrll if (symtab_hdr->sh_info != 0) 1652 1.1 skrll { 1653 1.1 skrll isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 1654 1.1 skrll if (isymbuf == NULL) 1655 1.1 skrll isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, 1656 1.1 skrll symtab_hdr->sh_info, 0, 1657 1.1 skrll NULL, NULL, NULL); 1658 1.1 skrll if (isymbuf == NULL) 1659 1.1 skrll goto error_return; 1660 1.1 skrll } 1661 1.1 skrll 1662 1.1 skrll amt = symtab_hdr->sh_info; 1663 1.1 skrll amt *= sizeof (asection *); 1664 1.1 skrll sections = (asection **) bfd_malloc (amt); 1665 1.1 skrll if (sections == NULL && amt != 0) 1666 1.1 skrll goto error_return; 1667 1.1 skrll 1668 1.1 skrll isymend = isymbuf + symtab_hdr->sh_info; 1669 1.1 skrll for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp) 1670 1.1 skrll { 1671 1.1 skrll asection *isec; 1672 1.1 skrll 1673 1.1 skrll if (isym->st_shndx == SHN_UNDEF) 1674 1.1 skrll isec = bfd_und_section_ptr; 1675 1.1 skrll else if (isym->st_shndx == SHN_ABS) 1676 1.1 skrll isec = bfd_abs_section_ptr; 1677 1.1 skrll else if (isym->st_shndx == SHN_COMMON) 1678 1.1 skrll isec = bfd_com_section_ptr; 1679 1.1 skrll else 1680 1.1 skrll isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx); 1681 1.1 skrll 1682 1.1 skrll *secpp = isec; 1683 1.1 skrll } 1684 1.1 skrll 1685 1.1 skrll if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd, 1686 1.1 skrll input_section, data, internal_relocs, 1687 1.1 skrll isymbuf, sections)) 1688 1.1 skrll goto error_return; 1689 1.1.1.9 christos 1690 1.1.1.9 christos free (sections); 1691 1.1 skrll if (symtab_hdr->contents != (unsigned char *) isymbuf) 1692 1.1 skrll free (isymbuf); 1693 1.1 skrll if (elf_section_data (input_section)->relocs != internal_relocs) 1694 1.1 skrll free (internal_relocs); 1695 1.1 skrll } 1696 1.1 skrll 1697 1.1 skrll return data; 1698 1.1 skrll 1699 1.1.1.9 christos error_return: 1700 1.1.1.9 christos free (sections); 1701 1.1 skrll if (symtab_hdr->contents != (unsigned char *) isymbuf) 1702 1.1.1.9 christos free (isymbuf); 1703 1.1 skrll if (elf_section_data (input_section)->relocs != internal_relocs) 1704 1.1.1.10 christos free (internal_relocs); 1705 1.1.1.10 christos if (orig_data == NULL) 1706 1.1 skrll free (data); 1707 1.1 skrll return NULL; 1708 1.1 skrll } 1709 1.1 skrll 1710 1.1.1.4 christos 1711 1.1 skrll #define TARGET_BIG_SYM h8300_elf32_vec 1712 1.1 skrll #define TARGET_BIG_NAME "elf32-h8300" 1713 1.1 skrll #define ELF_ARCH bfd_arch_h8300 1714 1.1 skrll #define ELF_MACHINE_CODE EM_H8_300 1715 1.1 skrll #define ELF_MAXPAGESIZE 0x1 1716 1.1 skrll #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup 1717 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup 1718 1.1 skrll #define elf_info_to_howto elf32_h8_info_to_howto 1719 1.1 skrll #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel 1720 1.1 skrll 1721 1.1 skrll /* So we can set/examine bits in e_flags to get the specific 1722 1.1 skrll H8 architecture in use. */ 1723 1.1 skrll #define elf_backend_final_write_processing \ 1724 1.1 skrll elf32_h8_final_write_processing 1725 1.1 skrll #define elf_backend_object_p \ 1726 1.1 skrll elf32_h8_object_p 1727 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \ 1728 1.1 skrll elf32_h8_merge_private_bfd_data 1729 1.1 skrll 1730 1.1 skrll /* ??? when elf_backend_relocate_section is not defined, elf32-target.h 1731 1.1 skrll defaults to using _bfd_generic_link_hash_table_create, but 1732 1.1 skrll bfd_elf_size_dynamic_sections uses 1733 1.1 skrll dynobj = elf_hash_table (info)->dynobj; 1734 1.1 skrll and thus requires an elf hash table. */ 1735 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create 1736 1.1 skrll 1737 1.1 skrll /* Use an H8 specific linker, not the ELF generic linker. */ 1738 1.1 skrll #define elf_backend_relocate_section elf32_h8_relocate_section 1739 1.1 skrll #define elf_backend_rela_normal 1 1740 1.1 skrll #define elf_backend_can_gc_sections 1 1741 1.1 skrll 1742 1.1 skrll /* And relaxing stuff. */ 1743 1.1 skrll #define bfd_elf32_bfd_relax_section elf32_h8_relax_section 1744 1.1.1.6 christos #define bfd_elf32_bfd_get_relocated_section_contents \ 1745 1.1 skrll elf32_h8_get_relocated_section_contents 1746 1.1.1.2 christos 1747 1.1 skrll #define elf_symbol_leading_char '_' 1748 1.1 skrll 1749 1.1.1.4 christos #include "elf32-target.h" 1750 1.1.1.4 christos 1751 1.1.1.4 christos #undef TARGET_BIG_SYM 1752 1.1.1.4 christos #define TARGET_BIG_SYM h8300_elf32_linux_vec 1753 1.1.1.4 christos #undef TARGET_BIG_NAME 1754 1.1.1.4 christos #define TARGET_BIG_NAME "elf32-h8300-linux" 1755 1.1.1.4 christos #undef elf_symbol_leading_char 1756 1.1.1.4 christos #define elf32_bed elf32_h8300_linux_bed 1757 1.1.1.4 christos 1758 #include "elf32-target.h" 1759