1 /* BFD back-end for Hitachi Super-H COFF binaries.
2 Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4 Written by Steve Chamberlain, <sac@cygnus.com>.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #include "coff/internal.h"
31 /* Internal functions. */
32 static bfd_reloc_status_type sh_reloc
33 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
34 static long get_symbol_value PARAMS ((asymbol *));
35 static boolean sh_relax_section
36 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
37 static boolean sh_relax_delete_bytes
38 PARAMS ((bfd *, asection *, bfd_vma, int));
39 static boolean sh_relocate_section
40 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
41 struct internal_reloc *, struct internal_syment *, asection **));
42 static bfd_byte *sh_coff_get_relocated_section_contents
43 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
44 bfd_byte *, boolean, asymbol **));
46 /* Default section alignment to 2**2. */
47 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
49 /* Generate long file names. */
50 #define COFF_LONG_FILENAMES
52 /* The supported relocations. There are a lot of relocations defined
53 in coff/internal.h which we do not expect to ever see. */
54 static reloc_howto_type sh_coff_howtos[] =
59 { 3 }, /* R_SH_PCREL8 */
60 { 4 }, /* R_SH_PCREL16 */
61 { 5 }, /* R_SH_HIGH8 */
62 { 6 }, /* R_SH_IMM24 */
63 { 7 }, /* R_SH_LOW16 */
65 { 9 }, /* R_SH_PCDISP8BY4 */
67 HOWTO (R_SH_PCDISP8BY2, /* type */
69 1, /* size (0 = byte, 1 = short, 2 = long) */
71 true, /* pc_relative */
73 complain_overflow_signed, /* complain_on_overflow */
74 sh_reloc, /* special_function */
75 "r_pcdisp8by2", /* name */
76 true, /* partial_inplace */
79 true), /* pcrel_offset */
81 { 11 }, /* R_SH_PCDISP8 */
83 HOWTO (R_SH_PCDISP, /* type */
85 1, /* size (0 = byte, 1 = short, 2 = long) */
87 true, /* pc_relative */
89 complain_overflow_signed, /* complain_on_overflow */
90 sh_reloc, /* special_function */
91 "r_pcdisp12by2", /* name */
92 true, /* partial_inplace */
95 true), /* pcrel_offset */
99 HOWTO (R_SH_IMM32, /* type */
101 2, /* size (0 = byte, 1 = short, 2 = long) */
103 false, /* pc_relative */
105 complain_overflow_bitfield, /* complain_on_overflow */
106 sh_reloc, /* special_function */
107 "r_imm32", /* name */
108 true, /* partial_inplace */
109 0xffffffff, /* src_mask */
110 0xffffffff, /* dst_mask */
111 false), /* pcrel_offset */
114 { 16 }, /* R_SH_IMM8 */
115 { 17 }, /* R_SH_IMM8BY2 */
116 { 18 }, /* R_SH_IMM8BY4 */
117 { 19 }, /* R_SH_IMM4 */
118 { 20 }, /* R_SH_IMM4BY2 */
119 { 21 }, /* R_SH_IMM4BY4 */
121 HOWTO (R_SH_PCRELIMM8BY2, /* type */
123 1, /* size (0 = byte, 1 = short, 2 = long) */
125 true, /* pc_relative */
127 complain_overflow_unsigned, /* complain_on_overflow */
128 sh_reloc, /* special_function */
129 "r_pcrelimm8by2", /* name */
130 true, /* partial_inplace */
133 true), /* pcrel_offset */
135 HOWTO (R_SH_PCRELIMM8BY4, /* type */
137 1, /* size (0 = byte, 1 = short, 2 = long) */
139 true, /* pc_relative */
141 complain_overflow_unsigned, /* complain_on_overflow */
142 sh_reloc, /* special_function */
143 "r_pcrelimm8by4", /* name */
144 true, /* partial_inplace */
147 true), /* pcrel_offset */
149 HOWTO (R_SH_IMM16, /* type */
151 1, /* size (0 = byte, 1 = short, 2 = long) */
153 false, /* pc_relative */
155 complain_overflow_bitfield, /* complain_on_overflow */
156 sh_reloc, /* special_function */
157 "r_imm16", /* name */
158 true, /* partial_inplace */
159 0xffff, /* src_mask */
160 0xffff, /* dst_mask */
161 false), /* pcrel_offset */
163 HOWTO (R_SH_SWITCH16, /* type */
165 1, /* size (0 = byte, 1 = short, 2 = long) */
167 false, /* pc_relative */
169 complain_overflow_bitfield, /* complain_on_overflow */
170 sh_reloc, /* special_function */
171 "r_switch16", /* name */
172 true, /* partial_inplace */
173 0xffff, /* src_mask */
174 0xffff, /* dst_mask */
175 false), /* pcrel_offset */
177 HOWTO (R_SH_SWITCH32, /* type */
179 2, /* size (0 = byte, 1 = short, 2 = long) */
181 false, /* pc_relative */
183 complain_overflow_bitfield, /* complain_on_overflow */
184 sh_reloc, /* special_function */
185 "r_switch32", /* name */
186 true, /* partial_inplace */
187 0xffffffff, /* src_mask */
188 0xffffffff, /* dst_mask */
189 false), /* pcrel_offset */
191 HOWTO (R_SH_USES, /* type */
193 1, /* size (0 = byte, 1 = short, 2 = long) */
195 false, /* pc_relative */
197 complain_overflow_bitfield, /* complain_on_overflow */
198 sh_reloc, /* special_function */
200 true, /* partial_inplace */
201 0xffff, /* src_mask */
202 0xffff, /* dst_mask */
203 false), /* pcrel_offset */
205 HOWTO (R_SH_COUNT, /* type */
207 2, /* size (0 = byte, 1 = short, 2 = long) */
209 false, /* pc_relative */
211 complain_overflow_bitfield, /* complain_on_overflow */
212 sh_reloc, /* special_function */
213 "r_count", /* name */
214 true, /* partial_inplace */
215 0xffffffff, /* src_mask */
216 0xffffffff, /* dst_mask */
217 false), /* pcrel_offset */
219 HOWTO (R_SH_ALIGN, /* type */
221 2, /* size (0 = byte, 1 = short, 2 = long) */
223 false, /* pc_relative */
225 complain_overflow_bitfield, /* complain_on_overflow */
226 sh_reloc, /* special_function */
227 "r_align", /* name */
228 true, /* partial_inplace */
229 0xffffffff, /* src_mask */
230 0xffffffff, /* dst_mask */
231 false) /* pcrel_offset */
234 #define SH_COFF_HOWTO_COUNT (sizeof sh_coff_howtos / sizeof sh_coff_howtos[0])
236 /* Check for a bad magic number. */
237 #define BADMAG(x) SHBADMAG(x)
239 /* Customize coffcode.h (this is not currently used). */
242 /* FIXME: This should not be set here. */
243 #define __A_MAGIC_SET__
245 /* Swap the r_offset field in and out. */
246 #define SWAP_IN_RELOC_OFFSET bfd_h_get_32
247 #define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
249 /* Swap out extra information in the reloc structure. */
250 #define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \
253 dst->r_stuff[0] = 'S'; \
254 dst->r_stuff[1] = 'C'; \
258 /* Get the value of a symbol, when performing a relocation. */
261 get_symbol_value (symbol)
266 if (bfd_is_com_section (symbol->section))
269 relocation = (symbol->value +
270 symbol->section->output_section->vma +
271 symbol->section->output_offset);
276 /* This macro is used in coffcode.h to get the howto corresponding to
277 an internal reloc. */
279 #define RTYPE2HOWTO(relent, internal) \
281 ((internal)->r_type < SH_COFF_HOWTO_COUNT \
282 ? &sh_coff_howtos[(internal)->r_type] \
283 : (reloc_howto_type *) NULL))
285 /* This is the same as the macro in coffcode.h, except that it copies
286 r_offset into reloc_entry->addend for some relocs. */
287 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
289 coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
290 if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
291 coffsym = (obj_symbols (abfd) \
292 + (cache_ptr->sym_ptr_ptr - symbols)); \
294 coffsym = coff_symbol_from (abfd, ptr); \
295 if (coffsym != (coff_symbol_type *) NULL \
296 && coffsym->native->u.syment.n_scnum == 0) \
297 cache_ptr->addend = 0; \
298 else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
299 && ptr->section != (asection *) NULL) \
300 cache_ptr->addend = - (ptr->section->vma + ptr->value); \
302 cache_ptr->addend = 0; \
303 if ((reloc).r_type == R_SH_SWITCH16 \
304 || (reloc).r_type == R_SH_SWITCH32 \
305 || (reloc).r_type == R_SH_USES \
306 || (reloc).r_type == R_SH_COUNT \
307 || (reloc).r_type == R_SH_ALIGN) \
308 cache_ptr->addend = (reloc).r_offset; \
311 /* This is the howto function for the SH relocations. */
313 static bfd_reloc_status_type
314 sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
317 arelent *reloc_entry;
320 asection *input_section;
322 char **error_message;
326 unsigned short r_type;
327 bfd_vma addr = reloc_entry->address;
328 bfd_byte *hit_data = addr + (bfd_byte *) data;
330 r_type = reloc_entry->howto->type;
332 if (output_bfd != NULL)
334 /* Partial linking--do nothing. */
335 reloc_entry->address += input_section->output_offset;
339 /* Almost all relocs have to do with relaxing. If any work must be
340 done for them, it has been done in sh_relax_section. */
341 if (r_type != R_SH_IMM32
342 && (r_type != R_SH_PCDISP
343 || (symbol_in->flags & BSF_LOCAL) != 0))
346 if (symbol_in != NULL
347 && bfd_is_und_section (symbol_in->section))
348 return bfd_reloc_undefined;
350 sym_value = get_symbol_value (symbol_in);
355 insn = bfd_get_32 (abfd, hit_data);
356 insn += sym_value + reloc_entry->addend;
357 bfd_put_32 (abfd, insn, hit_data);
360 insn = bfd_get_16 (abfd, hit_data);
361 sym_value += reloc_entry->addend;
362 sym_value -= (input_section->output_section->vma
363 + input_section->output_offset
366 sym_value += (insn & 0xfff) << 1;
369 insn = (insn & 0xf000) | (sym_value & 0xfff);
370 bfd_put_16 (abfd, insn, hit_data);
371 if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
372 return bfd_reloc_overflow;
382 /* We can do relaxing. */
383 #define coff_bfd_relax_section sh_relax_section
385 /* We use the special COFF backend linker. */
386 #define coff_relocate_section sh_relocate_section
388 /* When relaxing, we need to use special code to get the relocated
390 #define coff_bfd_get_relocated_section_contents \
391 sh_coff_get_relocated_section_contents
393 #include "coffcode.h"
395 /* This function handles relaxing on the SH.
397 Function calls on the SH look like this:
406 The compiler and assembler will cooperate to create R_SH_USES
407 relocs on the jsr instructions. The r_offset field of the
408 R_SH_USES reloc is the PC relative offset to the instruction which
409 loads the register (the r_offset field is computed as though it
410 were a jump instruction, so the offset value is actually from four
411 bytes past the instruction). The linker can use this reloc to
412 determine just which function is being called, and thus decide
413 whether it is possible to replace the jsr with a bsr.
415 If multiple function calls are all based on a single register load
416 (i.e., the same function is called multiple times), the compiler
417 guarantees that each function call will have an R_SH_USES reloc.
418 Therefore, if the linker is able to convert each R_SH_USES reloc
419 which refers to that address, it can safely eliminate the register
422 When the assembler creates an R_SH_USES reloc, it examines it to
423 determine which address is being loaded (L1 in the above example).
424 It then counts the number of references to that address, and
425 creates an R_SH_COUNT reloc at that address. The r_offset field of
426 the R_SH_COUNT reloc will be the number of references. If the
427 linker is able to eliminate a register load, it can use the
428 R_SH_COUNT reloc to see whether it can also eliminate the function
432 sh_relax_section (abfd, sec, link_info, again)
435 struct bfd_link_info *link_info;
438 struct internal_reloc *internal_relocs;
439 struct internal_reloc *free_relocs = NULL;
440 struct internal_reloc *irel, *irelend;
441 bfd_byte *contents = NULL;
442 bfd_byte *free_contents = NULL;
446 if (link_info->relocateable
447 || (sec->flags & SEC_RELOC) == 0
448 || sec->reloc_count == 0)
451 /* If this is the first time we have been called for this section,
452 initialize the cooked size. */
453 if (sec->_cooked_size == 0)
454 sec->_cooked_size = sec->_raw_size;
456 internal_relocs = (_bfd_coff_read_internal_relocs
457 (abfd, sec, link_info->keep_memory,
458 (bfd_byte *) NULL, false,
459 (struct internal_reloc *) NULL));
460 if (internal_relocs == NULL)
462 if (! link_info->keep_memory)
463 free_relocs = internal_relocs;
465 irelend = internal_relocs + sec->reloc_count;
466 for (irel = internal_relocs; irel < irelend; irel++)
468 bfd_vma laddr, paddr, symval;
470 struct internal_reloc *irelfn, *irelscan, *irelcount;
471 struct internal_syment sym;
474 if (irel->r_type != R_SH_USES)
477 /* Get the section contents. */
478 if (contents == NULL)
480 if (coff_section_data (abfd, sec) != NULL
481 && coff_section_data (abfd, sec)->contents != NULL)
482 contents = coff_section_data (abfd, sec)->contents;
485 contents = (bfd_byte *) malloc (sec->_raw_size);
486 if (contents == NULL)
488 bfd_set_error (bfd_error_no_memory);
491 free_contents = contents;
493 if (! bfd_get_section_contents (abfd, sec, contents,
494 (file_ptr) 0, sec->_raw_size))
499 /* The r_offset field of the R_SH_USES reloc will point us to
500 the register load. The 4 is because the r_offset field is
501 computed as though it were a jump offset, which are based
502 from 4 bytes after the jump instruction. */
503 laddr = irel->r_vaddr - sec->vma + 4 + irel->r_offset;
504 if (laddr >= sec->_raw_size)
506 (*_bfd_error_handler) ("%s: 0x%lx: warning: bad R_SH_USES offset",
507 bfd_get_filename (abfd),
508 (unsigned long) irel->r_vaddr);
511 insn = bfd_get_16 (abfd, contents + laddr);
513 /* If the instruction is not mov.l NN,rN, we don't know what to
515 if ((insn & 0xf000) != 0xd000)
517 ((*_bfd_error_handler)
518 ("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x",
519 bfd_get_filename (abfd), (unsigned long) irel->r_vaddr, insn));
523 /* Get the address from which the register is being loaded. The
524 displacement in the mov.l instruction is quadrupled. It is a
525 displacement from four bytes after the movl instruction, but,
526 before adding in the PC address, two least significant bits
527 of the PC are cleared. We assume that the section is aligned
528 on a four byte boundary. */
531 paddr += (laddr + 4) &~ 3;
532 if (paddr >= sec->_raw_size)
534 ((*_bfd_error_handler)
535 ("%s: 0x%lx: warning: bad R_SH_USES load offset",
536 bfd_get_filename (abfd), (unsigned long) irel->r_vaddr));
540 /* Get the reloc for the address from which the register is
541 being loaded. This reloc will tell us which function is
542 actually being called. */
544 for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
545 if (irelfn->r_vaddr == paddr
546 && irelfn->r_type == R_SH_IMM32)
548 if (irelfn >= irelend)
550 ((*_bfd_error_handler)
551 ("%s: 0x%lx: warning: could not find expected reloc",
552 bfd_get_filename (abfd), (unsigned long) paddr));
556 /* Get the value of the symbol referred to by the reloc. */
557 if (! _bfd_coff_get_external_symbols (abfd))
559 bfd_coff_swap_sym_in (abfd,
560 ((bfd_byte *) obj_coff_external_syms (abfd)
562 * bfd_coff_symesz (abfd))),
564 if (sym.n_scnum != 0 && sym.n_scnum != sec->target_index)
566 ((*_bfd_error_handler)
567 ("%s: 0x%lx: warning: symbol in unexpected section",
568 bfd_get_filename (abfd), (unsigned long) paddr));
572 if (sym.n_sclass != C_EXT)
574 symval = (sym.n_value
576 + sec->output_section->vma
577 + sec->output_offset);
581 struct coff_link_hash_entry *h;
583 h = obj_coff_sym_hashes (abfd)[irelfn->r_symndx];
584 BFD_ASSERT (h != NULL);
585 if (h->root.type != bfd_link_hash_defined
586 && h->root.type != bfd_link_hash_defweak)
588 /* This appears to be a reference to an undefined
589 symbol. Just ignore it--it will be caught by the
590 regular reloc processing. */
594 symval = (h->root.u.def.value
595 + h->root.u.def.section->output_section->vma
596 + h->root.u.def.section->output_offset);
599 symval += bfd_get_32 (abfd, contents + paddr - sec->vma);
601 /* See if this function call can be shortened. */
605 + sec->output_section->vma
608 if (foff < -0x1000 || foff >= 0x1000)
610 /* After all that work, we can't shorten this function call. */
614 /* Shorten the function call. */
616 /* For simplicity of coding, we are going to modify the section
617 contents, the section relocs, and the BFD symbol table. We
618 must tell the rest of the code not to free up this
619 information. It would be possible to instead create a table
620 of changes which have to be made, as is done in coff-mips.c;
621 that would be more work, but would require less memory when
622 the linker is run. */
624 if (coff_section_data (abfd, sec) == NULL)
627 ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
628 if (sec->used_by_bfd == NULL)
632 coff_section_data (abfd, sec)->relocs = internal_relocs;
633 coff_section_data (abfd, sec)->keep_relocs = true;
636 coff_section_data (abfd, sec)->contents = contents;
637 coff_section_data (abfd, sec)->keep_contents = true;
638 free_contents = NULL;
640 obj_coff_keep_syms (abfd) = true;
642 /* Replace the jsr with a bsr. */
644 /* Change the R_SH_USES reloc into an R_SH_PCDISP reloc, and
645 replace the jsr with a bsr. */
646 irel->r_type = R_SH_PCDISP;
647 irel->r_symndx = irelfn->r_symndx;
648 if (sym.n_sclass != C_EXT)
650 /* If this needs to be changed because of future relaxing,
651 it will be handled here like other internal PCDISP
654 0xb000 | ((foff >> 1) & 0xfff),
655 contents + irel->r_vaddr - sec->vma);
659 /* We can't fully resolve this yet, because the external
660 symbol value may be changed by future relaxing. We let
661 the final link phase handle it. */
662 bfd_put_16 (abfd, 0xb000, contents + irel->r_vaddr - sec->vma);
665 /* See if there is another R_SH_USES reloc referring to the same
667 for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
668 if (irelscan->r_type == R_SH_USES
669 && laddr == irelscan->r_vaddr - sec->vma + 4 + irelscan->r_offset)
671 if (irelscan < irelend)
673 /* Some other function call depends upon this register load,
674 and we have not yet converted that function call.
675 Indeed, we may never be able to convert it. There is
676 nothing else we can do at this point. */
680 /* Look for a R_SH_COUNT reloc on the location where the
681 function address is stored. Do this before deleting any
682 bytes, to avoid confusion about the address. */
683 for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
684 if (irelcount->r_vaddr == paddr
685 && irelcount->r_type == R_SH_COUNT)
688 /* Delete the register load. */
689 if (! sh_relax_delete_bytes (abfd, sec, laddr, 2))
692 /* That will change things, so, just in case it permits some
693 other function call to come within range, we should relax
694 again. Note that this is not required, and it may be slow. */
697 /* Now check whether we got a COUNT reloc. */
698 if (irelcount >= irelend)
700 ((*_bfd_error_handler)
701 ("%s: 0x%lx: warning: could not find expected COUNT reloc",
702 bfd_get_filename (abfd), (unsigned long) paddr));
706 /* The number of uses is stored in the r_offset field. We've
708 if (irelcount->r_offset == 0)
710 ((*_bfd_error_handler) ("%s: 0x%lx: warning: bad count",
711 bfd_get_filename (abfd),
712 (unsigned long) paddr));
716 --irelcount->r_offset;
718 /* If there are no more uses, we can delete the address. Reload
719 the address from irelfn, in case it was changed by the
720 previous call to sh_relax_delete_bytes. */
721 if (irelcount->r_offset == 0)
723 if (! sh_relax_delete_bytes (abfd, sec,
724 irelfn->r_vaddr - sec->vma, 4))
728 /* We've done all we can with that function call. */
731 if (free_relocs != NULL)
737 if (free_contents != NULL)
739 if (! link_info->keep_memory)
740 free (free_contents);
743 /* Cache the section contents for coff_link_input_bfd. */
744 if (coff_section_data (abfd, sec) == NULL)
747 ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
748 if (sec->used_by_bfd == NULL)
750 coff_section_data (abfd, sec)->relocs = NULL;
752 coff_section_data (abfd, sec)->contents = contents;
759 if (free_relocs != NULL)
761 if (free_contents != NULL)
762 free (free_contents);
766 /* Delete some bytes from a section while relaxing. */
769 sh_relax_delete_bytes (abfd, sec, addr, count)
776 struct internal_reloc *irel, *irelend;
777 struct internal_reloc *irelalign;
779 bfd_byte *esym, *esymend;
780 bfd_size_type symesz;
781 struct coff_link_hash_entry **sym_hash;
784 contents = coff_section_data (abfd, sec)->contents;
786 /* The deletion must stop at the next ALIGN reloc for an aligment
787 power larger than the number of bytes we are deleting. */
790 toaddr = sec->_cooked_size;
792 irel = coff_section_data (abfd, sec)->relocs;
793 irelend = irel + sec->reloc_count;
794 for (; irel < irelend; irel++)
796 if (irel->r_type == R_SH_ALIGN
797 && irel->r_vaddr - sec->vma > addr
798 && count < (1 << irel->r_offset))
801 toaddr = irel->r_vaddr - sec->vma;
806 /* Actually delete the bytes. */
807 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
808 if (irelalign == NULL)
809 sec->_cooked_size -= count;
811 memset (contents + toaddr - count, 0, count);
813 /* Adjust all the relocs. */
814 for (irel = coff_section_data (abfd, sec)->relocs; irel < irelend; irel++)
816 bfd_vma nraddr, start, stop;
818 struct internal_syment sym;
819 int off, adjust, oinsn;
823 /* Get the new reloc address. */
824 nraddr = irel->r_vaddr - sec->vma;
825 if ((irel->r_vaddr - sec->vma > addr
826 && irel->r_vaddr - sec->vma < toaddr)
827 || (irel->r_type == R_SH_ALIGN
828 && irel->r_vaddr - sec->vma == toaddr))
831 /* See if this reloc was for the bytes we have deleted, in which
832 case we no longer care about it. */
833 if (irel->r_vaddr - sec->vma >= addr
834 && irel->r_vaddr - sec->vma < addr + count
835 && irel->r_type != R_SH_ALIGN)
836 irel->r_type = R_SH_UNUSED;
838 /* If this is a PC relative reloc, see if the range it covers
839 includes the bytes we have deleted. */
840 switch (irel->r_type)
845 case R_SH_PCDISP8BY2:
847 case R_SH_PCRELIMM8BY2:
848 case R_SH_PCRELIMM8BY4:
849 start = irel->r_vaddr - sec->vma;
850 insn = bfd_get_16 (abfd, contents + nraddr);
854 switch (irel->r_type)
861 /* If this reloc is against a symbol defined in this
862 section, and the symbol will not be adjusted below, we
863 must check the addend to see it will put the value in
864 range to be adjusted, and hence must be changed. */
865 bfd_coff_swap_sym_in (abfd,
866 ((bfd_byte *) obj_coff_external_syms (abfd)
868 * bfd_coff_symesz (abfd))),
870 if (sym.n_sclass != C_EXT
871 && sym.n_scnum == sec->target_index
872 && ((bfd_vma) sym.n_value <= addr
873 || (bfd_vma) sym.n_value >= toaddr))
877 val = bfd_get_32 (abfd, contents + nraddr);
879 if (val >= addr && val < toaddr)
880 bfd_put_32 (abfd, val - count, contents + nraddr);
885 case R_SH_PCDISP8BY2:
889 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
893 bfd_coff_swap_sym_in (abfd,
894 ((bfd_byte *) obj_coff_external_syms (abfd)
896 * bfd_coff_symesz (abfd))),
898 if (sym.n_sclass == C_EXT)
905 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
909 case R_SH_PCRELIMM8BY2:
911 stop = start + 4 + off * 2;
914 case R_SH_PCRELIMM8BY4:
916 stop = (start &~ (bfd_vma) 3) + 4 + off * 4;
921 /* These relocs types represent
923 The r_offset field holds the difference between the reloc
924 address and L1. That is the start of the reloc, and
925 adding in the contents gives us the top. We must adjust
926 both the r_offset field and the section contents. */
928 start = irel->r_vaddr - sec->vma;
929 stop = (bfd_vma) ((bfd_signed_vma) start - (long) irel->r_offset);
933 && (stop <= addr || stop >= toaddr))
934 irel->r_offset += count;
937 && (start <= addr || start >= toaddr))
938 irel->r_offset -= count;
942 if (irel->r_type == R_SH_SWITCH16)
943 voff = bfd_get_signed_16 (abfd, contents + nraddr);
945 voff = bfd_get_signed_32 (abfd, contents + nraddr);
946 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
951 start = irel->r_vaddr - sec->vma;
952 stop = (bfd_vma) ((bfd_signed_vma) start + (long) irel->r_offset);
958 && (stop <= addr || stop >= toaddr))
962 && (start <= addr || start >= toaddr))
971 switch (irel->r_type)
977 case R_SH_PCDISP8BY2:
978 case R_SH_PCRELIMM8BY2:
980 if ((oinsn & 0xff00) != (insn & 0xff00))
982 bfd_put_16 (abfd, insn, contents + nraddr);
987 if ((oinsn & 0xf000) != (insn & 0xf000))
989 bfd_put_16 (abfd, insn, contents + nraddr);
992 case R_SH_PCRELIMM8BY4:
993 BFD_ASSERT (adjust == count || count >= 4);
998 if ((irel->r_vaddr & 3) == 0)
1001 if ((oinsn & 0xff00) != (insn & 0xff00))
1003 bfd_put_16 (abfd, insn, contents + nraddr);
1008 if (voff < - 0x8000 || voff >= 0x8000)
1010 bfd_put_signed_16 (abfd, voff, contents + nraddr);
1015 bfd_put_signed_32 (abfd, voff, contents + nraddr);
1019 irel->r_offset += adjust;
1025 ((*_bfd_error_handler)
1026 ("%s: 0x%lx: fatal: reloc overflow while relaxing",
1027 bfd_get_filename (abfd), (unsigned long) irel->r_vaddr));
1028 bfd_set_error (bfd_error_bad_value);
1033 irel->r_vaddr = nraddr + sec->vma;
1036 /* Look through all the other sections. If there contain any IMM32
1037 relocs against internal symbols which we are not going to adjust
1038 below, we may need to adjust the addends. */
1039 for (o = abfd->sections; o != NULL; o = o->next)
1041 struct internal_reloc *internal_relocs;
1042 struct internal_reloc *irelscan, *irelscanend;
1043 bfd_byte *ocontents;
1046 || (o->flags & SEC_RELOC) == 0
1047 || o->reloc_count == 0)
1050 /* We always cache the relocs. Perhaps, if info->keep_memory is
1051 false, we should free them, if we are permitted to, when we
1052 leave sh_coff_relax_section. */
1053 internal_relocs = (_bfd_coff_read_internal_relocs
1054 (abfd, o, true, (bfd_byte *) NULL, false,
1055 (struct internal_reloc *) NULL));
1056 if (internal_relocs == NULL)
1060 irelscanend = internal_relocs + o->reloc_count;
1061 for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1063 struct internal_syment sym;
1065 if (irelscan->r_type != R_SH_IMM32)
1068 bfd_coff_swap_sym_in (abfd,
1069 ((bfd_byte *) obj_coff_external_syms (abfd)
1070 + (irelscan->r_symndx
1071 * bfd_coff_symesz (abfd))),
1073 if (sym.n_sclass != C_EXT
1074 && sym.n_scnum == sec->target_index
1075 && ((bfd_vma) sym.n_value <= addr
1076 || (bfd_vma) sym.n_value >= toaddr))
1080 if (ocontents == NULL)
1082 if (coff_section_data (abfd, o)->contents != NULL)
1083 ocontents = coff_section_data (abfd, o)->contents;
1086 /* We always cache the section contents.
1087 Perhaps, if info->keep_memory is false, we
1088 should free them, if we are permitted to,
1089 when we leave sh_coff_relax_section. */
1090 ocontents = (bfd_byte *) malloc (o->_raw_size);
1091 if (ocontents == NULL)
1093 bfd_set_error (bfd_error_no_memory);
1096 if (! bfd_get_section_contents (abfd, o, ocontents,
1100 coff_section_data (abfd, o)->contents = ocontents;
1104 val = bfd_get_32 (abfd, ocontents + irelscan->r_vaddr - o->vma);
1106 if (val >= addr && val < toaddr)
1107 bfd_put_32 (abfd, val - count,
1108 ocontents + irelscan->r_vaddr - o->vma);
1110 coff_section_data (abfd, o)->keep_contents = true;
1115 /* Adjusting the internal symbols will not work if something has
1116 already retrieved the generic symbols. It would be possible to
1117 make this work by adjusting the generic symbols at the same time.
1118 However, this case should not arise in normal usage. */
1119 if (obj_symbols (abfd) != NULL
1120 || obj_raw_syments (abfd) != NULL)
1122 ((*_bfd_error_handler)
1123 ("%s: fatal: generic symbols retrieved before relaxing",
1124 bfd_get_filename (abfd)));
1125 bfd_set_error (bfd_error_invalid_operation);
1129 /* Adjust all the symbols. */
1130 sym_hash = obj_coff_sym_hashes (abfd);
1131 symesz = bfd_coff_symesz (abfd);
1132 esym = (bfd_byte *) obj_coff_external_syms (abfd);
1133 esymend = esym + obj_raw_syment_count (abfd) * symesz;
1134 while (esym < esymend)
1136 struct internal_syment isym;
1138 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
1140 if (isym.n_scnum == sec->target_index
1141 && (bfd_vma) isym.n_value > addr
1142 && (bfd_vma) isym.n_value < toaddr)
1144 isym.n_value -= count;
1146 bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym);
1148 if (*sym_hash != NULL)
1150 BFD_ASSERT ((*sym_hash)->root.type == bfd_link_hash_defined
1151 || (*sym_hash)->root.type == bfd_link_hash_defweak);
1152 BFD_ASSERT ((*sym_hash)->root.u.def.value >= addr
1153 && (*sym_hash)->root.u.def.value < toaddr);
1154 (*sym_hash)->root.u.def.value -= count;
1158 esym += (isym.n_numaux + 1) * symesz;
1159 sym_hash += isym.n_numaux + 1;
1162 /* See if we can move the ALIGN reloc forward. We have adjusted
1163 r_vaddr for it already. */
1164 if (irelalign != NULL)
1168 alignaddr = BFD_ALIGN (irelalign->r_vaddr - sec->vma,
1169 1 << irelalign->r_offset);
1170 if (alignaddr != toaddr)
1172 /* Tail recursion. */
1173 return sh_relax_delete_bytes (abfd, sec,
1174 irelalign->r_vaddr - sec->vma,
1175 1 << irelalign->r_offset);
1182 /* This is a modification of _bfd_coff_generic_relocate_section, which
1183 will handle SH relaxing. */
1186 sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
1187 relocs, syms, sections)
1189 struct bfd_link_info *info;
1191 asection *input_section;
1193 struct internal_reloc *relocs;
1194 struct internal_syment *syms;
1195 asection **sections;
1197 struct internal_reloc *rel;
1198 struct internal_reloc *relend;
1201 relend = rel + input_section->reloc_count;
1202 for (; rel < relend; rel++)
1205 struct coff_link_hash_entry *h;
1206 struct internal_syment *sym;
1209 reloc_howto_type *howto;
1210 bfd_reloc_status_type rstat;
1212 /* Almost all relocs have to do with relaxing. If any work must
1213 be done for them, it has been done in sh_relax_section. */
1214 if (rel->r_type != R_SH_IMM32
1215 && rel->r_type != R_SH_PCDISP)
1218 symndx = rel->r_symndx;
1227 h = obj_coff_sym_hashes (input_bfd)[symndx];
1228 sym = syms + symndx;
1231 if (sym != NULL && sym->n_scnum != 0)
1232 addend = - sym->n_value;
1236 if (rel->r_type == R_SH_PCDISP)
1239 if (rel->r_type >= SH_COFF_HOWTO_COUNT)
1242 howto = &sh_coff_howtos[rel->r_type];
1246 bfd_set_error (bfd_error_bad_value);
1256 /* There is nothing to do for an internal PCDISP reloc. */
1257 if (rel->r_type == R_SH_PCDISP)
1262 sec = bfd_abs_section_ptr;
1267 sec = sections[symndx];
1268 val = (sec->output_section->vma
1269 + sec->output_offset
1276 if (h->root.type == bfd_link_hash_defined
1277 || h->root.type == bfd_link_hash_defweak)
1281 sec = h->root.u.def.section;
1282 val = (h->root.u.def.value
1283 + sec->output_section->vma
1284 + sec->output_offset);
1286 else if (! info->relocateable)
1288 if (! ((*info->callbacks->undefined_symbol)
1289 (info, h->root.root.string, input_bfd, input_section,
1290 rel->r_vaddr - input_section->vma)))
1295 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
1297 rel->r_vaddr - input_section->vma,
1306 case bfd_reloc_overflow:
1309 char buf[SYMNMLEN + 1];
1314 name = h->root.root.string;
1315 else if (sym->_n._n_n._n_zeroes == 0
1316 && sym->_n._n_n._n_offset != 0)
1317 name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
1320 strncpy (buf, sym->_n._n_name, SYMNMLEN);
1321 buf[SYMNMLEN] = '\0';
1325 if (! ((*info->callbacks->reloc_overflow)
1326 (info, name, howto->name, (bfd_vma) 0, input_bfd,
1327 input_section, rel->r_vaddr - input_section->vma)))
1336 /* This is a version of bfd_generic_get_relocated_section_contents
1337 which uses sh_relocate_section. */
1340 sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
1341 data, relocateable, symbols)
1343 struct bfd_link_info *link_info;
1344 struct bfd_link_order *link_order;
1346 boolean relocateable;
1349 asection *input_section = link_order->u.indirect.section;
1350 bfd *input_bfd = input_section->owner;
1351 asection **sections = NULL;
1352 struct internal_reloc *internal_relocs = NULL;
1353 struct internal_syment *internal_syms = NULL;
1355 /* We only need to handle the case of relaxing, or of having a
1356 particular set of section contents, specially. */
1358 || coff_section_data (input_bfd, input_section) == NULL
1359 || coff_section_data (input_bfd, input_section)->contents == NULL)
1360 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1365 memcpy (data, coff_section_data (input_bfd, input_section)->contents,
1366 input_section->_raw_size);
1368 if ((input_section->flags & SEC_RELOC) != 0
1369 && input_section->reloc_count > 0)
1371 bfd_size_type symesz = bfd_coff_symesz (input_bfd);
1372 bfd_byte *esym, *esymend;
1373 struct internal_syment *isymp;
1376 if (! _bfd_coff_get_external_symbols (input_bfd))
1379 internal_relocs = (_bfd_coff_read_internal_relocs
1380 (input_bfd, input_section, false, (bfd_byte *) NULL,
1381 false, (struct internal_reloc *) NULL));
1382 if (internal_relocs == NULL)
1385 internal_syms = ((struct internal_syment *)
1386 malloc (obj_raw_syment_count (input_bfd)
1387 * sizeof (struct internal_syment)));
1388 if (internal_syms == NULL)
1390 bfd_set_error (bfd_error_no_memory);
1394 sections = (asection **) malloc (obj_raw_syment_count (input_bfd)
1395 * sizeof (asection *));
1396 if (sections == NULL)
1398 bfd_set_error (bfd_error_no_memory);
1402 isymp = internal_syms;
1404 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
1405 esymend = esym + obj_raw_syment_count (input_bfd) * symesz;
1406 while (esym < esymend)
1408 bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
1410 if (isymp->n_scnum != 0)
1411 *secpp = coff_section_from_bfd_index (input_bfd, isymp->n_scnum);
1414 if (isymp->n_value == 0)
1415 *secpp = bfd_und_section_ptr;
1417 *secpp = bfd_com_section_ptr;
1420 esym += (isymp->n_numaux + 1) * symesz;
1421 secpp += isymp->n_numaux + 1;
1422 isymp += isymp->n_numaux + 1;
1425 if (! sh_relocate_section (output_bfd, link_info, input_bfd,
1426 input_section, data, internal_relocs,
1427 internal_syms, sections))
1432 free (internal_syms);
1433 internal_syms = NULL;
1434 free (internal_relocs);
1435 internal_relocs = NULL;
1441 if (internal_relocs != NULL)
1442 free (internal_relocs);
1443 if (internal_syms != NULL)
1444 free (internal_syms);
1445 if (sections != NULL)
1450 /* The target vectors. */
1452 const bfd_target shcoff_vec =
1454 "coff-sh", /* name */
1455 bfd_target_coff_flavour,
1456 true, /* data byte order is big */
1457 true, /* header byte order is big */
1459 (HAS_RELOC | EXEC_P | /* object flags */
1460 HAS_LINENO | HAS_DEBUG |
1461 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE),
1463 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
1464 '_', /* leading symbol underscore */
1465 '/', /* ar_pad_char */
1466 15, /* ar_max_namelen */
1467 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
1468 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
1469 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
1470 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
1471 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
1472 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
1474 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
1475 bfd_generic_archive_p, _bfd_dummy_target},
1476 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
1478 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
1479 _bfd_write_archive_contents, bfd_false},
1481 BFD_JUMP_TABLE_GENERIC (coff),
1482 BFD_JUMP_TABLE_COPY (coff),
1483 BFD_JUMP_TABLE_CORE (_bfd_nocore),
1484 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
1485 BFD_JUMP_TABLE_SYMBOLS (coff),
1486 BFD_JUMP_TABLE_RELOCS (coff),
1487 BFD_JUMP_TABLE_WRITE (coff),
1488 BFD_JUMP_TABLE_LINK (coff),
1489 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
1494 const bfd_target shlcoff_vec =
1496 "coff-shl", /* name */
1497 bfd_target_coff_flavour,
1498 false, /* data byte order is little */
1499 false, /* header byte order is little endian too*/
1501 (HAS_RELOC | EXEC_P | /* object flags */
1502 HAS_LINENO | HAS_DEBUG |
1503 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE),
1505 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
1506 '_', /* leading symbol underscore */
1507 '/', /* ar_pad_char */
1508 15, /* ar_max_namelen */
1509 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1510 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1511 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
1512 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1513 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1514 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
1516 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
1517 bfd_generic_archive_p, _bfd_dummy_target},
1518 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
1520 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
1521 _bfd_write_archive_contents, bfd_false},
1523 BFD_JUMP_TABLE_GENERIC (coff),
1524 BFD_JUMP_TABLE_COPY (coff),
1525 BFD_JUMP_TABLE_CORE (_bfd_nocore),
1526 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
1527 BFD_JUMP_TABLE_SYMBOLS (coff),
1528 BFD_JUMP_TABLE_RELOCS (coff),
1529 BFD_JUMP_TABLE_WRITE (coff),
1530 BFD_JUMP_TABLE_LINK (coff),
1531 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),