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