Home | History | Annotate | Line # | Download | only in bfd
elf32-sh.c revision 1.3
      1  1.1     skrll /* Renesas / SuperH SH specific support for 32-bit ELF
      2  1.1     skrll    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
      3  1.3  christos    2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
      4  1.1     skrll    Contributed by Ian Lance Taylor, Cygnus Support.
      5  1.1     skrll 
      6  1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      7  1.1     skrll 
      8  1.1     skrll    This program is free software; you can redistribute it and/or modify
      9  1.1     skrll    it under the terms of the GNU General Public License as published by
     10  1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     11  1.1     skrll    (at your option) any later version.
     12  1.1     skrll 
     13  1.1     skrll    This program is distributed in the hope that it will be useful,
     14  1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1     skrll    GNU General Public License for more details.
     17  1.1     skrll 
     18  1.1     skrll    You should have received a copy of the GNU General Public License
     19  1.1     skrll    along with this program; if not, write to the Free Software
     20  1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21  1.1     skrll    MA 02110-1301, USA.  */
     22  1.1     skrll 
     23  1.1     skrll #include "sysdep.h"
     24  1.1     skrll #include "bfd.h"
     25  1.1     skrll #include "bfdlink.h"
     26  1.1     skrll #include "libbfd.h"
     27  1.1     skrll #include "elf-bfd.h"
     28  1.1     skrll #include "elf-vxworks.h"
     29  1.1     skrll #include "elf/sh.h"
     30  1.3  christos #include "dwarf2.h"
     31  1.1     skrll #include "libiberty.h"
     32  1.1     skrll #include "../opcodes/sh-opc.h"
     33  1.1     skrll 
     34  1.1     skrll static bfd_reloc_status_type sh_elf_reloc
     35  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     36  1.1     skrll static bfd_reloc_status_type sh_elf_ignore_reloc
     37  1.1     skrll   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     38  1.1     skrll static bfd_boolean sh_elf_relax_delete_bytes
     39  1.1     skrll   (bfd *, asection *, bfd_vma, int);
     40  1.1     skrll static bfd_boolean sh_elf_align_loads
     41  1.1     skrll   (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *);
     42  1.1     skrll #ifndef SH64_ELF
     43  1.1     skrll static bfd_boolean sh_elf_swap_insns
     44  1.1     skrll   (bfd *, asection *, void *, bfd_byte *, bfd_vma);
     45  1.1     skrll #endif
     46  1.1     skrll static int sh_elf_optimized_tls_reloc
     47  1.1     skrll   (struct bfd_link_info *, int, int);
     48  1.1     skrll static bfd_vma dtpoff_base
     49  1.1     skrll   (struct bfd_link_info *);
     50  1.1     skrll static bfd_vma tpoff
     51  1.1     skrll   (struct bfd_link_info *, bfd_vma);
     52  1.1     skrll 
     53  1.1     skrll /* The name of the dynamic interpreter.  This is put in the .interp
     54  1.1     skrll    section.  */
     55  1.1     skrll 
     56  1.1     skrll #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
     57  1.1     skrll 
     58  1.3  christos /* FDPIC binaries have a default 128K stack.  */
     59  1.3  christos #define DEFAULT_STACK_SIZE 0x20000
     60  1.3  christos 
     61  1.1     skrll #define MINUS_ONE ((bfd_vma) 0 - 1)
     62  1.3  christos 
     63  1.3  christos /* Decide whether a reference to a symbol can be resolved locally or
     64  1.3  christos    not.  If the symbol is protected, we want the local address, but
     65  1.3  christos    its function descriptor must be assigned by the dynamic linker.  */
     66  1.3  christos #define SYMBOL_FUNCDESC_LOCAL(INFO, H) \
     67  1.3  christos   (SYMBOL_REFERENCES_LOCAL (INFO, H) \
     68  1.3  christos    || ! elf_hash_table (INFO)->dynamic_sections_created)
     69  1.1     skrll 
     70  1.1     skrll #define SH_PARTIAL32 TRUE
     72  1.1     skrll #define SH_SRC_MASK32 0xffffffff
     73  1.1     skrll #define SH_ELF_RELOC sh_elf_reloc
     74  1.1     skrll static reloc_howto_type sh_elf_howto_table[] =
     75  1.1     skrll {
     76  1.1     skrll #include "elf32-sh-relocs.h"
     77  1.1     skrll };
     78  1.1     skrll 
     79  1.1     skrll #define SH_PARTIAL32 FALSE
     80  1.1     skrll #define SH_SRC_MASK32 0
     81  1.1     skrll #define SH_ELF_RELOC bfd_elf_generic_reloc
     82  1.1     skrll static reloc_howto_type sh_vxworks_howto_table[] =
     83  1.1     skrll {
     84  1.1     skrll #include "elf32-sh-relocs.h"
     85  1.1     skrll };
     86  1.1     skrll 
     87  1.1     skrll /* Return true if OUTPUT_BFD is a VxWorks object.  */
     89  1.1     skrll 
     90  1.1     skrll static bfd_boolean
     91  1.1     skrll vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED)
     92  1.1     skrll {
     93  1.1     skrll #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
     94  1.1     skrll   extern const bfd_target bfd_elf32_shlvxworks_vec;
     95  1.1     skrll   extern const bfd_target bfd_elf32_shvxworks_vec;
     96  1.1     skrll 
     97  1.1     skrll   return (abfd->xvec == &bfd_elf32_shlvxworks_vec
     98  1.1     skrll 	  || abfd->xvec == &bfd_elf32_shvxworks_vec);
     99  1.1     skrll #else
    100  1.1     skrll   return FALSE;
    101  1.1     skrll #endif
    102  1.3  christos }
    103  1.3  christos 
    104  1.3  christos /* Return true if OUTPUT_BFD is an FDPIC object.  */
    105  1.3  christos 
    106  1.3  christos static bfd_boolean
    107  1.3  christos fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED)
    108  1.3  christos {
    109  1.3  christos #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
    110  1.3  christos   extern const bfd_target bfd_elf32_shfd_vec;
    111  1.3  christos   extern const bfd_target bfd_elf32_shbfd_vec;
    112  1.3  christos 
    113  1.3  christos   return (abfd->xvec == &bfd_elf32_shfd_vec
    114  1.3  christos 	  || abfd->xvec == &bfd_elf32_shbfd_vec);
    115  1.3  christos #else
    116  1.3  christos   return FALSE;
    117  1.3  christos #endif
    118  1.1     skrll }
    119  1.1     skrll 
    120  1.1     skrll /* Return the howto table for ABFD.  */
    121  1.1     skrll 
    122  1.1     skrll static reloc_howto_type *
    123  1.1     skrll get_howto_table (bfd *abfd)
    124  1.1     skrll {
    125  1.1     skrll   if (vxworks_object_p (abfd))
    126  1.1     skrll     return sh_vxworks_howto_table;
    127  1.1     skrll   return sh_elf_howto_table;
    128  1.1     skrll }
    129  1.1     skrll 
    130  1.1     skrll static bfd_reloc_status_type
    131  1.1     skrll sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED, bfd *input_bfd,
    132  1.1     skrll 		   asection *input_section, bfd_byte *contents,
    133  1.1     skrll 		   bfd_vma addr, asection *symbol_section,
    134  1.1     skrll 		   bfd_vma start, bfd_vma end)
    135  1.1     skrll {
    136  1.1     skrll   static bfd_vma last_addr;
    137  1.1     skrll   static asection *last_symbol_section;
    138  1.1     skrll   bfd_byte *start_ptr, *ptr, *last_ptr;
    139  1.1     skrll   int diff, cum_diff;
    140  1.1     skrll   bfd_signed_vma x;
    141  1.1     skrll   int insn;
    142  1.1     skrll 
    143  1.1     skrll   /* Sanity check the address.  */
    144  1.1     skrll   if (addr > bfd_get_section_limit (input_bfd, input_section))
    145  1.1     skrll     return bfd_reloc_outofrange;
    146  1.1     skrll 
    147  1.1     skrll   /* We require the start and end relocations to be processed consecutively -
    148  1.1     skrll      although we allow then to be processed forwards or backwards.  */
    149  1.1     skrll   if (! last_addr)
    150  1.1     skrll     {
    151  1.1     skrll       last_addr = addr;
    152  1.1     skrll       last_symbol_section = symbol_section;
    153  1.1     skrll       return bfd_reloc_ok;
    154  1.1     skrll     }
    155  1.1     skrll   if (last_addr != addr)
    156  1.1     skrll     abort ();
    157  1.1     skrll   last_addr = 0;
    158  1.1     skrll 
    159  1.1     skrll   if (! symbol_section || last_symbol_section != symbol_section || end < start)
    160  1.1     skrll     return bfd_reloc_outofrange;
    161  1.1     skrll 
    162  1.1     skrll   /* Get the symbol_section contents.  */
    163  1.1     skrll   if (symbol_section != input_section)
    164  1.1     skrll     {
    165  1.1     skrll       if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
    166  1.1     skrll 	contents = elf_section_data (symbol_section)->this_hdr.contents;
    167  1.1     skrll       else
    168  1.1     skrll 	{
    169  1.1     skrll 	  if (!bfd_malloc_and_get_section (input_bfd, symbol_section,
    170  1.1     skrll 					   &contents))
    171  1.1     skrll 	    {
    172  1.1     skrll 	      if (contents != NULL)
    173  1.1     skrll 		free (contents);
    174  1.1     skrll 	      return bfd_reloc_outofrange;
    175  1.1     skrll 	    }
    176  1.1     skrll 	}
    177  1.1     skrll     }
    178  1.1     skrll #define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
    179  1.1     skrll   start_ptr = contents + start;
    180  1.1     skrll   for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
    181  1.1     skrll     {
    182  1.1     skrll       for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
    183  1.1     skrll 	ptr -= 2;
    184  1.1     skrll       ptr += 2;
    185  1.1     skrll       diff = (last_ptr - ptr) >> 1;
    186  1.1     skrll       cum_diff += diff & 1;
    187  1.1     skrll       cum_diff += diff;
    188  1.1     skrll     }
    189  1.1     skrll   /* Calculate the start / end values to load into rs / re minus four -
    190  1.1     skrll      so that will cancel out the four we would otherwise have to add to
    191  1.1     skrll      addr to get the value to subtract in order to get relative addressing.  */
    192  1.1     skrll   if (cum_diff >= 0)
    193  1.1     skrll     {
    194  1.1     skrll       start -= 4;
    195  1.1     skrll       end = (ptr + cum_diff * 2) - contents;
    196  1.1     skrll     }
    197  1.1     skrll   else
    198  1.1     skrll     {
    199  1.1     skrll       bfd_vma start0 = start - 4;
    200  1.1     skrll 
    201  1.1     skrll       while (start0 && IS_PPI (contents + start0))
    202  1.1     skrll 	start0 -= 2;
    203  1.1     skrll       start0 = start - 2 - ((start - start0) & 2);
    204  1.1     skrll       start = start0 - cum_diff - 2;
    205  1.1     skrll       end = start0;
    206  1.1     skrll     }
    207  1.1     skrll 
    208  1.1     skrll   if (contents != NULL
    209  1.1     skrll       && elf_section_data (symbol_section)->this_hdr.contents != contents)
    210  1.1     skrll     free (contents);
    211  1.1     skrll 
    212  1.1     skrll   insn = bfd_get_16 (input_bfd, contents + addr);
    213  1.1     skrll 
    214  1.1     skrll   x = (insn & 0x200 ? end : start) - addr;
    215  1.1     skrll   if (input_section != symbol_section)
    216  1.1     skrll     x += ((symbol_section->output_section->vma + symbol_section->output_offset)
    217  1.1     skrll 	  - (input_section->output_section->vma
    218  1.1     skrll 	     + input_section->output_offset));
    219  1.1     skrll   x >>= 1;
    220  1.1     skrll   if (x < -128 || x > 127)
    221  1.1     skrll     return bfd_reloc_overflow;
    222  1.1     skrll 
    223  1.1     skrll   x = (insn & ~0xff) | (x & 0xff);
    224  1.1     skrll   bfd_put_16 (input_bfd, (bfd_vma) x, contents + addr);
    225  1.1     skrll 
    226  1.1     skrll   return bfd_reloc_ok;
    227  1.1     skrll }
    228  1.1     skrll 
    229  1.1     skrll /* This function is used for normal relocs.  This used to be like the COFF
    230  1.1     skrll    function, and is almost certainly incorrect for other ELF targets.  */
    231  1.1     skrll 
    232  1.1     skrll static bfd_reloc_status_type
    233  1.1     skrll sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in,
    234  1.1     skrll 	      void *data, asection *input_section, bfd *output_bfd,
    235  1.1     skrll 	      char **error_message ATTRIBUTE_UNUSED)
    236  1.1     skrll {
    237  1.1     skrll   unsigned long insn;
    238  1.1     skrll   bfd_vma sym_value;
    239  1.1     skrll   enum elf_sh_reloc_type r_type;
    240  1.1     skrll   bfd_vma addr = reloc_entry->address;
    241  1.1     skrll   bfd_byte *hit_data = addr + (bfd_byte *) data;
    242  1.1     skrll 
    243  1.1     skrll   r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
    244  1.1     skrll 
    245  1.1     skrll   if (output_bfd != NULL)
    246  1.1     skrll     {
    247  1.1     skrll       /* Partial linking--do nothing.  */
    248  1.1     skrll       reloc_entry->address += input_section->output_offset;
    249  1.1     skrll       return bfd_reloc_ok;
    250  1.1     skrll     }
    251  1.1     skrll 
    252  1.1     skrll   /* Almost all relocs have to do with relaxing.  If any work must be
    253  1.1     skrll      done for them, it has been done in sh_relax_section.  */
    254  1.1     skrll   if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
    255  1.1     skrll     return bfd_reloc_ok;
    256  1.1     skrll 
    257  1.1     skrll   if (symbol_in != NULL
    258  1.1     skrll       && bfd_is_und_section (symbol_in->section))
    259  1.1     skrll     return bfd_reloc_undefined;
    260  1.1     skrll 
    261  1.1     skrll   if (bfd_is_com_section (symbol_in->section))
    262  1.1     skrll     sym_value = 0;
    263  1.1     skrll   else
    264  1.1     skrll     sym_value = (symbol_in->value +
    265  1.1     skrll 		 symbol_in->section->output_section->vma +
    266  1.1     skrll 		 symbol_in->section->output_offset);
    267  1.1     skrll 
    268  1.1     skrll   switch (r_type)
    269  1.1     skrll     {
    270  1.1     skrll     case R_SH_DIR32:
    271  1.1     skrll       insn = bfd_get_32 (abfd, hit_data);
    272  1.1     skrll       insn += sym_value + reloc_entry->addend;
    273  1.1     skrll       bfd_put_32 (abfd, (bfd_vma) insn, hit_data);
    274  1.1     skrll       break;
    275  1.1     skrll     case R_SH_IND12W:
    276  1.1     skrll       insn = bfd_get_16 (abfd, hit_data);
    277  1.1     skrll       sym_value += reloc_entry->addend;
    278  1.1     skrll       sym_value -= (input_section->output_section->vma
    279  1.1     skrll 		    + input_section->output_offset
    280  1.1     skrll 		    + addr
    281  1.1     skrll 		    + 4);
    282  1.1     skrll       sym_value += (insn & 0xfff) << 1;
    283  1.1     skrll       if (insn & 0x800)
    284  1.1     skrll 	sym_value -= 0x1000;
    285  1.1     skrll       insn = (insn & 0xf000) | (sym_value & 0xfff);
    286  1.1     skrll       bfd_put_16 (abfd, (bfd_vma) insn, hit_data);
    287  1.1     skrll       if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
    288  1.1     skrll 	return bfd_reloc_overflow;
    289  1.1     skrll       break;
    290  1.1     skrll     default:
    291  1.1     skrll       abort ();
    292  1.1     skrll       break;
    293  1.1     skrll     }
    294  1.1     skrll 
    295  1.1     skrll   return bfd_reloc_ok;
    296  1.1     skrll }
    297  1.1     skrll 
    298  1.1     skrll /* This function is used for relocs which are only used for relaxing,
    299  1.1     skrll    which the linker should otherwise ignore.  */
    300  1.1     skrll 
    301  1.1     skrll static bfd_reloc_status_type
    302  1.1     skrll sh_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
    303  1.1     skrll 		     asymbol *symbol ATTRIBUTE_UNUSED,
    304  1.1     skrll 		     void *data ATTRIBUTE_UNUSED, asection *input_section,
    305  1.1     skrll 		     bfd *output_bfd,
    306  1.1     skrll 		     char **error_message ATTRIBUTE_UNUSED)
    307  1.1     skrll {
    308  1.1     skrll   if (output_bfd != NULL)
    309  1.1     skrll     reloc_entry->address += input_section->output_offset;
    310  1.1     skrll   return bfd_reloc_ok;
    311  1.1     skrll }
    312  1.1     skrll 
    313  1.1     skrll /* This structure is used to map BFD reloc codes to SH ELF relocs.  */
    314  1.1     skrll 
    315  1.1     skrll struct elf_reloc_map
    316  1.1     skrll {
    317  1.1     skrll   bfd_reloc_code_real_type bfd_reloc_val;
    318  1.1     skrll   unsigned char elf_reloc_val;
    319  1.1     skrll };
    320  1.1     skrll 
    321  1.1     skrll /* An array mapping BFD reloc codes to SH ELF relocs.  */
    322  1.1     skrll 
    323  1.1     skrll static const struct elf_reloc_map sh_reloc_map[] =
    324  1.1     skrll {
    325  1.1     skrll   { BFD_RELOC_NONE, R_SH_NONE },
    326  1.1     skrll   { BFD_RELOC_32, R_SH_DIR32 },
    327  1.1     skrll   { BFD_RELOC_16, R_SH_DIR16 },
    328  1.1     skrll   { BFD_RELOC_8, R_SH_DIR8 },
    329  1.1     skrll   { BFD_RELOC_CTOR, R_SH_DIR32 },
    330  1.1     skrll   { BFD_RELOC_32_PCREL, R_SH_REL32 },
    331  1.1     skrll   { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
    332  1.1     skrll   { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
    333  1.1     skrll   { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
    334  1.1     skrll   { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
    335  1.1     skrll   { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
    336  1.1     skrll   { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
    337  1.1     skrll   { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
    338  1.1     skrll   { BFD_RELOC_SH_USES, R_SH_USES },
    339  1.1     skrll   { BFD_RELOC_SH_COUNT, R_SH_COUNT },
    340  1.1     skrll   { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
    341  1.1     skrll   { BFD_RELOC_SH_CODE, R_SH_CODE },
    342  1.1     skrll   { BFD_RELOC_SH_DATA, R_SH_DATA },
    343  1.1     skrll   { BFD_RELOC_SH_LABEL, R_SH_LABEL },
    344  1.1     skrll   { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
    345  1.1     skrll   { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
    346  1.1     skrll   { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
    347  1.1     skrll   { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
    348  1.1     skrll   { BFD_RELOC_SH_TLS_GD_32, R_SH_TLS_GD_32 },
    349  1.1     skrll   { BFD_RELOC_SH_TLS_LD_32, R_SH_TLS_LD_32 },
    350  1.1     skrll   { BFD_RELOC_SH_TLS_LDO_32, R_SH_TLS_LDO_32 },
    351  1.1     skrll   { BFD_RELOC_SH_TLS_IE_32, R_SH_TLS_IE_32 },
    352  1.1     skrll   { BFD_RELOC_SH_TLS_LE_32, R_SH_TLS_LE_32 },
    353  1.1     skrll   { BFD_RELOC_SH_TLS_DTPMOD32, R_SH_TLS_DTPMOD32 },
    354  1.1     skrll   { BFD_RELOC_SH_TLS_DTPOFF32, R_SH_TLS_DTPOFF32 },
    355  1.1     skrll   { BFD_RELOC_SH_TLS_TPOFF32, R_SH_TLS_TPOFF32 },
    356  1.1     skrll   { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 },
    357  1.1     skrll   { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 },
    358  1.1     skrll   { BFD_RELOC_SH_COPY, R_SH_COPY },
    359  1.1     skrll   { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT },
    360  1.1     skrll   { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT },
    361  1.1     skrll   { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE },
    362  1.1     skrll   { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF },
    363  1.3  christos   { BFD_RELOC_SH_GOTPC, R_SH_GOTPC },
    364  1.3  christos   { BFD_RELOC_SH_GOTPLT32, R_SH_GOTPLT32 },
    365  1.3  christos   { BFD_RELOC_SH_GOT20, R_SH_GOT20 },
    366  1.3  christos   { BFD_RELOC_SH_GOTOFF20, R_SH_GOTOFF20 },
    367  1.3  christos   { BFD_RELOC_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC },
    368  1.3  christos   { BFD_RELOC_SH_GOTFUNCDESC20, R_SH_GOTFUNCDESC20 },
    369  1.3  christos   { BFD_RELOC_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC },
    370  1.1     skrll   { BFD_RELOC_SH_GOTOFFFUNCDESC20, R_SH_GOTOFFFUNCDESC20 },
    371  1.1     skrll   { BFD_RELOC_SH_FUNCDESC, R_SH_FUNCDESC },
    372  1.1     skrll #ifdef INCLUDE_SHMEDIA
    373  1.1     skrll   { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 },
    374  1.1     skrll   { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 },
    375  1.1     skrll   { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 },
    376  1.1     skrll   { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 },
    377  1.1     skrll   { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 },
    378  1.1     skrll   { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 },
    379  1.1     skrll   { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 },
    380  1.1     skrll   { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 },
    381  1.1     skrll   { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 },
    382  1.1     skrll   { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 },
    383  1.1     skrll   { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 },
    384  1.1     skrll   { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 },
    385  1.1     skrll   { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 },
    386  1.1     skrll   { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 },
    387  1.1     skrll   { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 },
    388  1.1     skrll   { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 },
    389  1.1     skrll   { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 },
    390  1.1     skrll   { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 },
    391  1.1     skrll   { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 },
    392  1.1     skrll   { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 },
    393  1.1     skrll   { BFD_RELOC_SH_COPY64, R_SH_COPY64 },
    394  1.1     skrll   { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 },
    395  1.1     skrll   { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 },
    396  1.1     skrll   { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 },
    397  1.1     skrll   { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 },
    398  1.1     skrll   { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 },
    399  1.1     skrll   { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 },
    400  1.1     skrll   { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 },
    401  1.1     skrll   { BFD_RELOC_SH_PT_16, R_SH_PT_16 },
    402  1.1     skrll   { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE },
    403  1.1     skrll   { BFD_RELOC_SH_IMMU5, R_SH_DIR5U },
    404  1.1     skrll   { BFD_RELOC_SH_IMMS6, R_SH_DIR6S },
    405  1.1     skrll   { BFD_RELOC_SH_IMMU6, R_SH_DIR6U },
    406  1.1     skrll   { BFD_RELOC_SH_IMMS10, R_SH_DIR10S },
    407  1.1     skrll   { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW },
    408  1.1     skrll   { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL },
    409  1.1     skrll   { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ },
    410  1.1     skrll   { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 },
    411  1.1     skrll   { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 },
    412  1.1     skrll   { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 },
    413  1.1     skrll   { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL },
    414  1.1     skrll   { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 },
    415  1.1     skrll   { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL },
    416  1.1     skrll   { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 },
    417  1.1     skrll   { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL },
    418  1.1     skrll   { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 },
    419  1.1     skrll   { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL },
    420  1.1     skrll   { BFD_RELOC_64, R_SH_64 },
    421  1.1     skrll   { BFD_RELOC_64_PCREL, R_SH_64_PCREL },
    422  1.1     skrll #endif /* not INCLUDE_SHMEDIA */
    423  1.1     skrll };
    424  1.1     skrll 
    425  1.1     skrll /* Given a BFD reloc code, return the howto structure for the
    426  1.1     skrll    corresponding SH ELF reloc.  */
    427  1.1     skrll 
    428  1.1     skrll static reloc_howto_type *
    429  1.1     skrll sh_elf_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
    430  1.1     skrll {
    431  1.1     skrll   unsigned int i;
    432  1.1     skrll 
    433  1.1     skrll   for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
    434  1.1     skrll     {
    435  1.1     skrll       if (sh_reloc_map[i].bfd_reloc_val == code)
    436  1.1     skrll 	return get_howto_table (abfd) + (int) sh_reloc_map[i].elf_reloc_val;
    437  1.1     skrll     }
    438  1.1     skrll 
    439  1.1     skrll   return NULL;
    440  1.1     skrll }
    441  1.1     skrll 
    442  1.1     skrll static reloc_howto_type *
    443  1.1     skrll sh_elf_reloc_name_lookup (bfd *abfd, const char *r_name)
    444  1.1     skrll {
    445  1.1     skrll   unsigned int i;
    446  1.1     skrll 
    447  1.1     skrll   if (vxworks_object_p (abfd))
    448  1.1     skrll     {
    449  1.1     skrll       for (i = 0;
    450  1.1     skrll 	   i < (sizeof (sh_vxworks_howto_table)
    451  1.1     skrll 		/ sizeof (sh_vxworks_howto_table[0]));
    452  1.1     skrll 	   i++)
    453  1.1     skrll 	if (sh_vxworks_howto_table[i].name != NULL
    454  1.1     skrll 	    && strcasecmp (sh_vxworks_howto_table[i].name, r_name) == 0)
    455  1.1     skrll 	  return &sh_vxworks_howto_table[i];
    456  1.1     skrll     }
    457  1.1     skrll   else
    458  1.1     skrll     {
    459  1.1     skrll       for (i = 0;
    460  1.1     skrll 	   i < (sizeof (sh_elf_howto_table)
    461  1.1     skrll 		/ sizeof (sh_elf_howto_table[0]));
    462  1.1     skrll 	   i++)
    463  1.1     skrll 	if (sh_elf_howto_table[i].name != NULL
    464  1.1     skrll 	    && strcasecmp (sh_elf_howto_table[i].name, r_name) == 0)
    465  1.1     skrll 	  return &sh_elf_howto_table[i];
    466  1.1     skrll     }
    467  1.1     skrll 
    468  1.1     skrll   return NULL;
    469  1.1     skrll }
    470  1.1     skrll 
    471  1.1     skrll /* Given an ELF reloc, fill in the howto field of a relent.  */
    472  1.1     skrll 
    473  1.1     skrll static void
    474  1.1     skrll sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
    475  1.1     skrll {
    476  1.1     skrll   unsigned int r;
    477  1.1     skrll 
    478  1.1     skrll   r = ELF32_R_TYPE (dst->r_info);
    479  1.1     skrll 
    480  1.1     skrll   BFD_ASSERT (r < (unsigned int) R_SH_max);
    481  1.1     skrll   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
    482  1.1     skrll   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
    483  1.1     skrll   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3);
    484  1.3  christos   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4);
    485  1.1     skrll   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5);
    486  1.1     skrll   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_6 || r > R_SH_LAST_INVALID_RELOC_6);
    487  1.1     skrll 
    488  1.1     skrll   cache_ptr->howto = get_howto_table (abfd) + r;
    489  1.1     skrll }
    490  1.1     skrll 
    491  1.1     skrll /* This function handles relaxing for SH ELF.  See the corresponding
    493  1.1     skrll    function in coff-sh.c for a description of what this does.  FIXME:
    494  1.1     skrll    There is a lot of duplication here between this code and the COFF
    495  1.1     skrll    specific code.  The format of relocs and symbols is wound deeply
    496  1.1     skrll    into this code, but it would still be better if the duplication
    497  1.1     skrll    could be eliminated somehow.  Note in particular that although both
    498  1.1     skrll    functions use symbols like R_SH_CODE, those symbols have different
    499  1.1     skrll    values; in coff-sh.c they come from include/coff/sh.h, whereas here
    500  1.1     skrll    they come from enum elf_sh_reloc_type in include/elf/sh.h.  */
    501  1.1     skrll 
    502  1.1     skrll static bfd_boolean
    503  1.1     skrll sh_elf_relax_section (bfd *abfd, asection *sec,
    504  1.1     skrll 		      struct bfd_link_info *link_info, bfd_boolean *again)
    505  1.1     skrll {
    506  1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
    507  1.1     skrll   Elf_Internal_Rela *internal_relocs;
    508  1.1     skrll   bfd_boolean have_code;
    509  1.1     skrll   Elf_Internal_Rela *irel, *irelend;
    510  1.1     skrll   bfd_byte *contents = NULL;
    511  1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
    512  1.1     skrll 
    513  1.1     skrll   *again = FALSE;
    514  1.1     skrll 
    515  1.1     skrll   if (link_info->relocatable
    516  1.1     skrll       || (sec->flags & SEC_RELOC) == 0
    517  1.1     skrll       || sec->reloc_count == 0)
    518  1.1     skrll     return TRUE;
    519  1.1     skrll 
    520  1.1     skrll #ifdef INCLUDE_SHMEDIA
    521  1.1     skrll   if (elf_section_data (sec)->this_hdr.sh_flags
    522  1.1     skrll       & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED))
    523  1.1     skrll     {
    524  1.1     skrll       return TRUE;
    525  1.1     skrll     }
    526  1.1     skrll #endif
    527  1.1     skrll 
    528  1.1     skrll   symtab_hdr = &elf_symtab_hdr (abfd);
    529  1.1     skrll 
    530  1.1     skrll   internal_relocs = (_bfd_elf_link_read_relocs
    531  1.1     skrll 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
    532  1.1     skrll 		      link_info->keep_memory));
    533  1.1     skrll   if (internal_relocs == NULL)
    534  1.1     skrll     goto error_return;
    535  1.1     skrll 
    536  1.1     skrll   have_code = FALSE;
    537  1.1     skrll 
    538  1.1     skrll   irelend = internal_relocs + sec->reloc_count;
    539  1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
    540  1.1     skrll     {
    541  1.1     skrll       bfd_vma laddr, paddr, symval;
    542  1.1     skrll       unsigned short insn;
    543  1.1     skrll       Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
    544  1.1     skrll       bfd_signed_vma foff;
    545  1.1     skrll 
    546  1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
    547  1.1     skrll 	have_code = TRUE;
    548  1.1     skrll 
    549  1.1     skrll       if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
    550  1.1     skrll 	continue;
    551  1.1     skrll 
    552  1.1     skrll       /* Get the section contents.  */
    553  1.1     skrll       if (contents == NULL)
    554  1.1     skrll 	{
    555  1.1     skrll 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
    556  1.1     skrll 	    contents = elf_section_data (sec)->this_hdr.contents;
    557  1.1     skrll 	  else
    558  1.1     skrll 	    {
    559  1.1     skrll 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
    560  1.1     skrll 		goto error_return;
    561  1.1     skrll 	    }
    562  1.1     skrll 	}
    563  1.1     skrll 
    564  1.1     skrll       /* The r_addend field of the R_SH_USES reloc will point us to
    565  1.1     skrll 	 the register load.  The 4 is because the r_addend field is
    566  1.1     skrll 	 computed as though it were a jump offset, which are based
    567  1.1     skrll 	 from 4 bytes after the jump instruction.  */
    568  1.1     skrll       laddr = irel->r_offset + 4 + irel->r_addend;
    569  1.1     skrll       if (laddr >= sec->size)
    570  1.1     skrll 	{
    571  1.1     skrll 	  (*_bfd_error_handler) (_("%B: 0x%lx: warning: bad R_SH_USES offset"),
    572  1.1     skrll 				 abfd,
    573  1.1     skrll 				 (unsigned long) irel->r_offset);
    574  1.1     skrll 	  continue;
    575  1.1     skrll 	}
    576  1.1     skrll       insn = bfd_get_16 (abfd, contents + laddr);
    577  1.1     skrll 
    578  1.1     skrll       /* If the instruction is not mov.l NN,rN, we don't know what to
    579  1.1     skrll 	 do.  */
    580  1.1     skrll       if ((insn & 0xf000) != 0xd000)
    581  1.1     skrll 	{
    582  1.1     skrll 	  ((*_bfd_error_handler)
    583  1.1     skrll 	   (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
    584  1.1     skrll 	    abfd, (unsigned long) irel->r_offset, insn));
    585  1.1     skrll 	  continue;
    586  1.1     skrll 	}
    587  1.1     skrll 
    588  1.1     skrll       /* Get the address from which the register is being loaded.  The
    589  1.1     skrll 	 displacement in the mov.l instruction is quadrupled.  It is a
    590  1.1     skrll 	 displacement from four bytes after the movl instruction, but,
    591  1.1     skrll 	 before adding in the PC address, two least significant bits
    592  1.1     skrll 	 of the PC are cleared.  We assume that the section is aligned
    593  1.1     skrll 	 on a four byte boundary.  */
    594  1.1     skrll       paddr = insn & 0xff;
    595  1.1     skrll       paddr *= 4;
    596  1.1     skrll       paddr += (laddr + 4) &~ (bfd_vma) 3;
    597  1.1     skrll       if (paddr >= sec->size)
    598  1.1     skrll 	{
    599  1.1     skrll 	  ((*_bfd_error_handler)
    600  1.1     skrll 	   (_("%B: 0x%lx: warning: bad R_SH_USES load offset"),
    601  1.1     skrll 	    abfd, (unsigned long) irel->r_offset));
    602  1.1     skrll 	  continue;
    603  1.1     skrll 	}
    604  1.1     skrll 
    605  1.1     skrll       /* Get the reloc for the address from which the register is
    606  1.1     skrll 	 being loaded.  This reloc will tell us which function is
    607  1.1     skrll 	 actually being called.  */
    608  1.1     skrll       for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
    609  1.1     skrll 	if (irelfn->r_offset == paddr
    610  1.1     skrll 	    && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
    611  1.1     skrll 	  break;
    612  1.1     skrll       if (irelfn >= irelend)
    613  1.1     skrll 	{
    614  1.1     skrll 	  ((*_bfd_error_handler)
    615  1.1     skrll 	   (_("%B: 0x%lx: warning: could not find expected reloc"),
    616  1.1     skrll 	    abfd, (unsigned long) paddr));
    617  1.1     skrll 	  continue;
    618  1.1     skrll 	}
    619  1.1     skrll 
    620  1.1     skrll       /* Read this BFD's symbols if we haven't done so already.  */
    621  1.1     skrll       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
    622  1.1     skrll 	{
    623  1.1     skrll 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
    624  1.1     skrll 	  if (isymbuf == NULL)
    625  1.1     skrll 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
    626  1.1     skrll 					    symtab_hdr->sh_info, 0,
    627  1.1     skrll 					    NULL, NULL, NULL);
    628  1.1     skrll 	  if (isymbuf == NULL)
    629  1.1     skrll 	    goto error_return;
    630  1.1     skrll 	}
    631  1.1     skrll 
    632  1.1     skrll       /* Get the value of the symbol referred to by the reloc.  */
    633  1.1     skrll       if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
    634  1.1     skrll 	{
    635  1.1     skrll 	  /* A local symbol.  */
    636  1.1     skrll 	  Elf_Internal_Sym *isym;
    637  1.1     skrll 
    638  1.1     skrll 	  isym = isymbuf + ELF32_R_SYM (irelfn->r_info);
    639  1.1     skrll 	  if (isym->st_shndx
    640  1.1     skrll 	      != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec))
    641  1.1     skrll 	    {
    642  1.1     skrll 	      ((*_bfd_error_handler)
    643  1.1     skrll 	       (_("%B: 0x%lx: warning: symbol in unexpected section"),
    644  1.1     skrll 		abfd, (unsigned long) paddr));
    645  1.1     skrll 	      continue;
    646  1.1     skrll 	    }
    647  1.1     skrll 
    648  1.1     skrll 	  symval = (isym->st_value
    649  1.1     skrll 		    + sec->output_section->vma
    650  1.1     skrll 		    + sec->output_offset);
    651  1.1     skrll 	}
    652  1.1     skrll       else
    653  1.1     skrll 	{
    654  1.1     skrll 	  unsigned long indx;
    655  1.1     skrll 	  struct elf_link_hash_entry *h;
    656  1.1     skrll 
    657  1.1     skrll 	  indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
    658  1.1     skrll 	  h = elf_sym_hashes (abfd)[indx];
    659  1.1     skrll 	  BFD_ASSERT (h != NULL);
    660  1.1     skrll 	  if (h->root.type != bfd_link_hash_defined
    661  1.1     skrll 	      && h->root.type != bfd_link_hash_defweak)
    662  1.1     skrll 	    {
    663  1.1     skrll 	      /* This appears to be a reference to an undefined
    664  1.1     skrll 		 symbol.  Just ignore it--it will be caught by the
    665  1.1     skrll 		 regular reloc processing.  */
    666  1.1     skrll 	      continue;
    667  1.1     skrll 	    }
    668  1.1     skrll 
    669  1.1     skrll 	  symval = (h->root.u.def.value
    670  1.1     skrll 		    + h->root.u.def.section->output_section->vma
    671  1.1     skrll 		    + h->root.u.def.section->output_offset);
    672  1.1     skrll 	}
    673  1.1     skrll 
    674  1.1     skrll       if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace)
    675  1.1     skrll 	symval += bfd_get_32 (abfd, contents + paddr);
    676  1.1     skrll       else
    677  1.1     skrll 	symval += irelfn->r_addend;
    678  1.1     skrll 
    679  1.1     skrll       /* See if this function call can be shortened.  */
    680  1.1     skrll       foff = (symval
    681  1.1     skrll 	      - (irel->r_offset
    682  1.1     skrll 		 + sec->output_section->vma
    683  1.1     skrll 		 + sec->output_offset
    684  1.1     skrll 		 + 4));
    685  1.1     skrll       /* A branch to an address beyond ours might be increased by an
    686  1.1     skrll 	 .align that doesn't move when bytes behind us are deleted.
    687  1.1     skrll 	 So, we add some slop in this calculation to allow for
    688  1.1     skrll 	 that.  */
    689  1.1     skrll       if (foff < -0x1000 || foff >= 0x1000 - 8)
    690  1.1     skrll 	{
    691  1.1     skrll 	  /* After all that work, we can't shorten this function call.  */
    692  1.1     skrll 	  continue;
    693  1.1     skrll 	}
    694  1.1     skrll 
    695  1.1     skrll       /* Shorten the function call.  */
    696  1.1     skrll 
    697  1.1     skrll       /* For simplicity of coding, we are going to modify the section
    698  1.1     skrll 	 contents, the section relocs, and the BFD symbol table.  We
    699  1.1     skrll 	 must tell the rest of the code not to free up this
    700  1.1     skrll 	 information.  It would be possible to instead create a table
    701  1.1     skrll 	 of changes which have to be made, as is done in coff-mips.c;
    702  1.1     skrll 	 that would be more work, but would require less memory when
    703  1.1     skrll 	 the linker is run.  */
    704  1.1     skrll 
    705  1.1     skrll       elf_section_data (sec)->relocs = internal_relocs;
    706  1.1     skrll       elf_section_data (sec)->this_hdr.contents = contents;
    707  1.1     skrll       symtab_hdr->contents = (unsigned char *) isymbuf;
    708  1.1     skrll 
    709  1.1     skrll       /* Replace the jsr with a bsr.  */
    710  1.1     skrll 
    711  1.1     skrll       /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
    712  1.1     skrll 	 replace the jsr with a bsr.  */
    713  1.1     skrll       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
    714  1.1     skrll       /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
    715  1.1     skrll 	 here, but that only checks if the symbol is an external symbol,
    716  1.1     skrll 	 not if the symbol is in a different section.  Besides, we need
    717  1.1     skrll 	 a consistent meaning for the relocation, so we just assume here that
    718  1.1     skrll 	 the value of the symbol is not available.  */
    719  1.1     skrll 
    720  1.1     skrll       /* We can't fully resolve this yet, because the external
    721  1.1     skrll 	 symbol value may be changed by future relaxing.  We let
    722  1.1     skrll 	 the final link phase handle it.  */
    723  1.1     skrll       bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
    724  1.1     skrll 
    725  1.1     skrll       irel->r_addend = -4;
    726  1.1     skrll 
    727  1.1     skrll       /* When we calculated the symbol "value" we had an offset in the
    728  1.1     skrll 	 DIR32's word in memory (we read and add it above).  However,
    729  1.1     skrll 	 the jsr we create does NOT have this offset encoded, so we
    730  1.1     skrll 	 have to add it to the addend to preserve it.  */
    731  1.1     skrll       irel->r_addend += bfd_get_32 (abfd, contents + paddr);
    732  1.1     skrll 
    733  1.1     skrll       /* See if there is another R_SH_USES reloc referring to the same
    734  1.1     skrll 	 register load.  */
    735  1.1     skrll       for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
    736  1.1     skrll 	if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
    737  1.1     skrll 	    && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
    738  1.1     skrll 	  break;
    739  1.1     skrll       if (irelscan < irelend)
    740  1.1     skrll 	{
    741  1.1     skrll 	  /* Some other function call depends upon this register load,
    742  1.1     skrll 	     and we have not yet converted that function call.
    743  1.1     skrll 	     Indeed, we may never be able to convert it.  There is
    744  1.1     skrll 	     nothing else we can do at this point.  */
    745  1.1     skrll 	  continue;
    746  1.1     skrll 	}
    747  1.1     skrll 
    748  1.1     skrll       /* Look for a R_SH_COUNT reloc on the location where the
    749  1.1     skrll 	 function address is stored.  Do this before deleting any
    750  1.1     skrll 	 bytes, to avoid confusion about the address.  */
    751  1.1     skrll       for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
    752  1.1     skrll 	if (irelcount->r_offset == paddr
    753  1.1     skrll 	    && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
    754  1.1     skrll 	  break;
    755  1.1     skrll 
    756  1.1     skrll       /* Delete the register load.  */
    757  1.1     skrll       if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
    758  1.1     skrll 	goto error_return;
    759  1.1     skrll 
    760  1.1     skrll       /* That will change things, so, just in case it permits some
    761  1.1     skrll 	 other function call to come within range, we should relax
    762  1.1     skrll 	 again.  Note that this is not required, and it may be slow.  */
    763  1.1     skrll       *again = TRUE;
    764  1.1     skrll 
    765  1.1     skrll       /* Now check whether we got a COUNT reloc.  */
    766  1.1     skrll       if (irelcount >= irelend)
    767  1.1     skrll 	{
    768  1.1     skrll 	  ((*_bfd_error_handler)
    769  1.1     skrll 	   (_("%B: 0x%lx: warning: could not find expected COUNT reloc"),
    770  1.1     skrll 	    abfd, (unsigned long) paddr));
    771  1.1     skrll 	  continue;
    772  1.1     skrll 	}
    773  1.1     skrll 
    774  1.1     skrll       /* The number of uses is stored in the r_addend field.  We've
    775  1.1     skrll 	 just deleted one.  */
    776  1.1     skrll       if (irelcount->r_addend == 0)
    777  1.1     skrll 	{
    778  1.1     skrll 	  ((*_bfd_error_handler) (_("%B: 0x%lx: warning: bad count"),
    779  1.1     skrll 				  abfd,
    780  1.1     skrll 				  (unsigned long) paddr));
    781  1.1     skrll 	  continue;
    782  1.1     skrll 	}
    783  1.1     skrll 
    784  1.1     skrll       --irelcount->r_addend;
    785  1.1     skrll 
    786  1.1     skrll       /* If there are no more uses, we can delete the address.  Reload
    787  1.1     skrll 	 the address from irelfn, in case it was changed by the
    788  1.1     skrll 	 previous call to sh_elf_relax_delete_bytes.  */
    789  1.1     skrll       if (irelcount->r_addend == 0)
    790  1.1     skrll 	{
    791  1.1     skrll 	  if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
    792  1.1     skrll 	    goto error_return;
    793  1.1     skrll 	}
    794  1.1     skrll 
    795  1.1     skrll       /* We've done all we can with that function call.  */
    796  1.1     skrll     }
    797  1.1     skrll 
    798  1.1     skrll   /* Look for load and store instructions that we can align on four
    799  1.1     skrll      byte boundaries.  */
    800  1.1     skrll   if ((elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK) != EF_SH4
    801  1.1     skrll       && have_code)
    802  1.1     skrll     {
    803  1.1     skrll       bfd_boolean swapped;
    804  1.1     skrll 
    805  1.1     skrll       /* Get the section contents.  */
    806  1.1     skrll       if (contents == NULL)
    807  1.1     skrll 	{
    808  1.1     skrll 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
    809  1.1     skrll 	    contents = elf_section_data (sec)->this_hdr.contents;
    810  1.1     skrll 	  else
    811  1.1     skrll 	    {
    812  1.1     skrll 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
    813  1.1     skrll 		goto error_return;
    814  1.1     skrll 	    }
    815  1.1     skrll 	}
    816  1.1     skrll 
    817  1.1     skrll       if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
    818  1.1     skrll 				&swapped))
    819  1.1     skrll 	goto error_return;
    820  1.1     skrll 
    821  1.1     skrll       if (swapped)
    822  1.1     skrll 	{
    823  1.1     skrll 	  elf_section_data (sec)->relocs = internal_relocs;
    824  1.1     skrll 	  elf_section_data (sec)->this_hdr.contents = contents;
    825  1.1     skrll 	  symtab_hdr->contents = (unsigned char *) isymbuf;
    826  1.1     skrll 	}
    827  1.1     skrll     }
    828  1.1     skrll 
    829  1.1     skrll   if (isymbuf != NULL
    830  1.1     skrll       && symtab_hdr->contents != (unsigned char *) isymbuf)
    831  1.1     skrll     {
    832  1.1     skrll       if (! link_info->keep_memory)
    833  1.1     skrll 	free (isymbuf);
    834  1.1     skrll       else
    835  1.1     skrll 	{
    836  1.1     skrll 	  /* Cache the symbols for elf_link_input_bfd.  */
    837  1.1     skrll 	  symtab_hdr->contents = (unsigned char *) isymbuf;
    838  1.1     skrll 	}
    839  1.1     skrll     }
    840  1.1     skrll 
    841  1.1     skrll   if (contents != NULL
    842  1.1     skrll       && elf_section_data (sec)->this_hdr.contents != contents)
    843  1.1     skrll     {
    844  1.1     skrll       if (! link_info->keep_memory)
    845  1.1     skrll 	free (contents);
    846  1.1     skrll       else
    847  1.1     skrll 	{
    848  1.1     skrll 	  /* Cache the section contents for elf_link_input_bfd.  */
    849  1.1     skrll 	  elf_section_data (sec)->this_hdr.contents = contents;
    850  1.1     skrll 	}
    851  1.1     skrll     }
    852  1.1     skrll 
    853  1.1     skrll   if (internal_relocs != NULL
    854  1.1     skrll       && elf_section_data (sec)->relocs != internal_relocs)
    855  1.1     skrll     free (internal_relocs);
    856  1.1     skrll 
    857  1.1     skrll   return TRUE;
    858  1.1     skrll 
    859  1.1     skrll  error_return:
    860  1.1     skrll   if (isymbuf != NULL
    861  1.1     skrll       && symtab_hdr->contents != (unsigned char *) isymbuf)
    862  1.1     skrll     free (isymbuf);
    863  1.1     skrll   if (contents != NULL
    864  1.1     skrll       && elf_section_data (sec)->this_hdr.contents != contents)
    865  1.1     skrll     free (contents);
    866  1.1     skrll   if (internal_relocs != NULL
    867  1.1     skrll       && elf_section_data (sec)->relocs != internal_relocs)
    868  1.1     skrll     free (internal_relocs);
    869  1.1     skrll 
    870  1.1     skrll   return FALSE;
    871  1.1     skrll }
    872  1.1     skrll 
    873  1.1     skrll /* Delete some bytes from a section while relaxing.  FIXME: There is a
    874  1.1     skrll    lot of duplication between this function and sh_relax_delete_bytes
    875  1.1     skrll    in coff-sh.c.  */
    876  1.1     skrll 
    877  1.1     skrll static bfd_boolean
    878  1.1     skrll sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr,
    879  1.1     skrll 			   int count)
    880  1.1     skrll {
    881  1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
    882  1.1     skrll   unsigned int sec_shndx;
    883  1.1     skrll   bfd_byte *contents;
    884  1.1     skrll   Elf_Internal_Rela *irel, *irelend;
    885  1.1     skrll   Elf_Internal_Rela *irelalign;
    886  1.1     skrll   bfd_vma toaddr;
    887  1.1     skrll   Elf_Internal_Sym *isymbuf, *isym, *isymend;
    888  1.1     skrll   struct elf_link_hash_entry **sym_hashes;
    889  1.1     skrll   struct elf_link_hash_entry **end_hashes;
    890  1.1     skrll   unsigned int symcount;
    891  1.1     skrll   asection *o;
    892  1.1     skrll 
    893  1.1     skrll   symtab_hdr = &elf_symtab_hdr (abfd);
    894  1.1     skrll   isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
    895  1.1     skrll 
    896  1.1     skrll   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
    897  1.1     skrll 
    898  1.1     skrll   contents = elf_section_data (sec)->this_hdr.contents;
    899  1.1     skrll 
    900  1.1     skrll   /* The deletion must stop at the next ALIGN reloc for an aligment
    901  1.1     skrll      power larger than the number of bytes we are deleting.  */
    902  1.1     skrll 
    903  1.1     skrll   irelalign = NULL;
    904  1.1     skrll   toaddr = sec->size;
    905  1.1     skrll 
    906  1.1     skrll   irel = elf_section_data (sec)->relocs;
    907  1.1     skrll   irelend = irel + sec->reloc_count;
    908  1.1     skrll   for (; irel < irelend; irel++)
    909  1.1     skrll     {
    910  1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
    911  1.1     skrll 	  && irel->r_offset > addr
    912  1.1     skrll 	  && count < (1 << irel->r_addend))
    913  1.1     skrll 	{
    914  1.1     skrll 	  irelalign = irel;
    915  1.1     skrll 	  toaddr = irel->r_offset;
    916  1.1     skrll 	  break;
    917  1.1     skrll 	}
    918  1.1     skrll     }
    919  1.1     skrll 
    920  1.1     skrll   /* Actually delete the bytes.  */
    921  1.1     skrll   memmove (contents + addr, contents + addr + count,
    922  1.1     skrll 	   (size_t) (toaddr - addr - count));
    923  1.1     skrll   if (irelalign == NULL)
    924  1.1     skrll     sec->size -= count;
    925  1.1     skrll   else
    926  1.1     skrll     {
    927  1.1     skrll       int i;
    928  1.1     skrll 
    929  1.1     skrll #define NOP_OPCODE (0x0009)
    930  1.1     skrll 
    931  1.1     skrll       BFD_ASSERT ((count & 1) == 0);
    932  1.1     skrll       for (i = 0; i < count; i += 2)
    933  1.1     skrll 	bfd_put_16 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
    934  1.1     skrll     }
    935  1.1     skrll 
    936  1.1     skrll   /* Adjust all the relocs.  */
    937  1.1     skrll   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
    938  1.1     skrll     {
    939  1.1     skrll       bfd_vma nraddr, stop;
    940  1.1     skrll       bfd_vma start = 0;
    941  1.1     skrll       int insn = 0;
    942  1.1     skrll       int off, adjust, oinsn;
    943  1.1     skrll       bfd_signed_vma voff = 0;
    944  1.1     skrll       bfd_boolean overflow;
    945  1.1     skrll 
    946  1.1     skrll       /* Get the new reloc address.  */
    947  1.1     skrll       nraddr = irel->r_offset;
    948  1.1     skrll       if ((irel->r_offset > addr
    949  1.1     skrll 	   && irel->r_offset < toaddr)
    950  1.1     skrll 	  || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
    951  1.1     skrll 	      && irel->r_offset == toaddr))
    952  1.1     skrll 	nraddr -= count;
    953  1.1     skrll 
    954  1.1     skrll       /* See if this reloc was for the bytes we have deleted, in which
    955  1.1     skrll 	 case we no longer care about it.  Don't delete relocs which
    956  1.1     skrll 	 represent addresses, though.  */
    957  1.1     skrll       if (irel->r_offset >= addr
    958  1.1     skrll 	  && irel->r_offset < addr + count
    959  1.1     skrll 	  && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
    960  1.1     skrll 	  && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
    961  1.1     skrll 	  && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
    962  1.1     skrll 	  && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
    963  1.1     skrll 	irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    964  1.1     skrll 				     (int) R_SH_NONE);
    965  1.1     skrll 
    966  1.1     skrll       /* If this is a PC relative reloc, see if the range it covers
    967  1.1     skrll 	 includes the bytes we have deleted.  */
    968  1.1     skrll       switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
    969  1.1     skrll 	{
    970  1.1     skrll 	default:
    971  1.1     skrll 	  break;
    972  1.1     skrll 
    973  1.1     skrll 	case R_SH_DIR8WPN:
    974  1.1     skrll 	case R_SH_IND12W:
    975  1.1     skrll 	case R_SH_DIR8WPZ:
    976  1.1     skrll 	case R_SH_DIR8WPL:
    977  1.1     skrll 	  start = irel->r_offset;
    978  1.1     skrll 	  insn = bfd_get_16 (abfd, contents + nraddr);
    979  1.1     skrll 	  break;
    980  1.1     skrll 	}
    981  1.1     skrll 
    982  1.1     skrll       switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
    983  1.1     skrll 	{
    984  1.1     skrll 	default:
    985  1.1     skrll 	  start = stop = addr;
    986  1.1     skrll 	  break;
    987  1.1     skrll 
    988  1.1     skrll 	case R_SH_DIR32:
    989  1.1     skrll 	  /* If this reloc is against a symbol defined in this
    990  1.1     skrll 	     section, and the symbol will not be adjusted below, we
    991  1.1     skrll 	     must check the addend to see it will put the value in
    992  1.1     skrll 	     range to be adjusted, and hence must be changed.  */
    993  1.1     skrll 	  if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
    994  1.1     skrll 	    {
    995  1.1     skrll 	      isym = isymbuf + ELF32_R_SYM (irel->r_info);
    996  1.1     skrll 	      if (isym->st_shndx == sec_shndx
    997  1.1     skrll 		  && (isym->st_value <= addr
    998  1.1     skrll 		      || isym->st_value >= toaddr))
    999  1.1     skrll 		{
   1000  1.1     skrll 		  bfd_vma val;
   1001  1.1     skrll 
   1002  1.1     skrll 		  if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace)
   1003  1.1     skrll 		    {
   1004  1.1     skrll 		      val = bfd_get_32 (abfd, contents + nraddr);
   1005  1.1     skrll 		      val += isym->st_value;
   1006  1.1     skrll 		      if (val > addr && val < toaddr)
   1007  1.1     skrll 			bfd_put_32 (abfd, val - count, contents + nraddr);
   1008  1.1     skrll 		    }
   1009  1.1     skrll 		  else
   1010  1.1     skrll 		    {
   1011  1.1     skrll 		      val = isym->st_value + irel->r_addend;
   1012  1.1     skrll 		      if (val > addr && val < toaddr)
   1013  1.1     skrll 			irel->r_addend -= count;
   1014  1.1     skrll 		    }
   1015  1.1     skrll 		}
   1016  1.1     skrll 	    }
   1017  1.1     skrll 	  start = stop = addr;
   1018  1.1     skrll 	  break;
   1019  1.1     skrll 
   1020  1.1     skrll 	case R_SH_DIR8WPN:
   1021  1.1     skrll 	  off = insn & 0xff;
   1022  1.1     skrll 	  if (off & 0x80)
   1023  1.1     skrll 	    off -= 0x100;
   1024  1.1     skrll 	  stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
   1025  1.1     skrll 	  break;
   1026  1.1     skrll 
   1027  1.1     skrll 	case R_SH_IND12W:
   1028  1.1     skrll 	  off = insn & 0xfff;
   1029  1.1     skrll 	  if (! off)
   1030  1.1     skrll 	    {
   1031  1.1     skrll 	      /* This has been made by previous relaxation.  Since the
   1032  1.1     skrll 		 relocation will be against an external symbol, the
   1033  1.1     skrll 		 final relocation will just do the right thing.  */
   1034  1.1     skrll 	      start = stop = addr;
   1035  1.1     skrll 	    }
   1036  1.1     skrll 	  else
   1037  1.1     skrll 	    {
   1038  1.1     skrll 	      if (off & 0x800)
   1039  1.1     skrll 		off -= 0x1000;
   1040  1.1     skrll 	      stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
   1041  1.1     skrll 
   1042  1.1     skrll 	      /* The addend will be against the section symbol, thus
   1043  1.1     skrll 		 for adjusting the addend, the relevant start is the
   1044  1.1     skrll 		 start of the section.
   1045  1.1     skrll 		 N.B. If we want to abandon in-place changes here and
   1046  1.1     skrll 		 test directly using symbol + addend, we have to take into
   1047  1.1     skrll 		 account that the addend has already been adjusted by -4.  */
   1048  1.1     skrll 	      if (stop > addr && stop < toaddr)
   1049  1.1     skrll 		irel->r_addend -= count;
   1050  1.1     skrll 	    }
   1051  1.1     skrll 	  break;
   1052  1.1     skrll 
   1053  1.1     skrll 	case R_SH_DIR8WPZ:
   1054  1.1     skrll 	  off = insn & 0xff;
   1055  1.1     skrll 	  stop = start + 4 + off * 2;
   1056  1.1     skrll 	  break;
   1057  1.1     skrll 
   1058  1.1     skrll 	case R_SH_DIR8WPL:
   1059  1.1     skrll 	  off = insn & 0xff;
   1060  1.1     skrll 	  stop = (start & ~(bfd_vma) 3) + 4 + off * 4;
   1061  1.1     skrll 	  break;
   1062  1.1     skrll 
   1063  1.1     skrll 	case R_SH_SWITCH8:
   1064  1.1     skrll 	case R_SH_SWITCH16:
   1065  1.1     skrll 	case R_SH_SWITCH32:
   1066  1.1     skrll 	  /* These relocs types represent
   1067  1.1     skrll 	       .word L2-L1
   1068  1.1     skrll 	     The r_addend field holds the difference between the reloc
   1069  1.1     skrll 	     address and L1.  That is the start of the reloc, and
   1070  1.1     skrll 	     adding in the contents gives us the top.  We must adjust
   1071  1.1     skrll 	     both the r_offset field and the section contents.
   1072  1.1     skrll 	     N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
   1073  1.1     skrll 	     and the elf bfd r_offset is called r_vaddr.  */
   1074  1.1     skrll 
   1075  1.1     skrll 	  stop = irel->r_offset;
   1076  1.1     skrll 	  start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
   1077  1.1     skrll 
   1078  1.1     skrll 	  if (start > addr
   1079  1.1     skrll 	      && start < toaddr
   1080  1.1     skrll 	      && (stop <= addr || stop >= toaddr))
   1081  1.1     skrll 	    irel->r_addend += count;
   1082  1.1     skrll 	  else if (stop > addr
   1083  1.1     skrll 		   && stop < toaddr
   1084  1.1     skrll 		   && (start <= addr || start >= toaddr))
   1085  1.1     skrll 	    irel->r_addend -= count;
   1086  1.1     skrll 
   1087  1.1     skrll 	  if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
   1088  1.1     skrll 	    voff = bfd_get_signed_16 (abfd, contents + nraddr);
   1089  1.1     skrll 	  else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
   1090  1.1     skrll 	    voff = bfd_get_8 (abfd, contents + nraddr);
   1091  1.1     skrll 	  else
   1092  1.1     skrll 	    voff = bfd_get_signed_32 (abfd, contents + nraddr);
   1093  1.1     skrll 	  stop = (bfd_vma) ((bfd_signed_vma) start + voff);
   1094  1.1     skrll 
   1095  1.1     skrll 	  break;
   1096  1.1     skrll 
   1097  1.1     skrll 	case R_SH_USES:
   1098  1.1     skrll 	  start = irel->r_offset;
   1099  1.1     skrll 	  stop = (bfd_vma) ((bfd_signed_vma) start
   1100  1.1     skrll 			    + (long) irel->r_addend
   1101  1.1     skrll 			    + 4);
   1102  1.1     skrll 	  break;
   1103  1.1     skrll 	}
   1104  1.1     skrll 
   1105  1.1     skrll       if (start > addr
   1106  1.1     skrll 	  && start < toaddr
   1107  1.1     skrll 	  && (stop <= addr || stop >= toaddr))
   1108  1.1     skrll 	adjust = count;
   1109  1.1     skrll       else if (stop > addr
   1110  1.1     skrll 	       && stop < toaddr
   1111  1.1     skrll 	       && (start <= addr || start >= toaddr))
   1112  1.1     skrll 	adjust = - count;
   1113  1.1     skrll       else
   1114  1.1     skrll 	adjust = 0;
   1115  1.1     skrll 
   1116  1.1     skrll       if (adjust != 0)
   1117  1.1     skrll 	{
   1118  1.1     skrll 	  oinsn = insn;
   1119  1.1     skrll 	  overflow = FALSE;
   1120  1.1     skrll 	  switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
   1121  1.1     skrll 	    {
   1122  1.1     skrll 	    default:
   1123  1.1     skrll 	      abort ();
   1124  1.1     skrll 	      break;
   1125  1.1     skrll 
   1126  1.1     skrll 	    case R_SH_DIR8WPN:
   1127  1.1     skrll 	    case R_SH_DIR8WPZ:
   1128  1.1     skrll 	      insn += adjust / 2;
   1129  1.1     skrll 	      if ((oinsn & 0xff00) != (insn & 0xff00))
   1130  1.1     skrll 		overflow = TRUE;
   1131  1.1     skrll 	      bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
   1132  1.1     skrll 	      break;
   1133  1.1     skrll 
   1134  1.1     skrll 	    case R_SH_IND12W:
   1135  1.1     skrll 	      insn += adjust / 2;
   1136  1.1     skrll 	      if ((oinsn & 0xf000) != (insn & 0xf000))
   1137  1.1     skrll 		overflow = TRUE;
   1138  1.1     skrll 	      bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
   1139  1.1     skrll 	      break;
   1140  1.1     skrll 
   1141  1.1     skrll 	    case R_SH_DIR8WPL:
   1142  1.1     skrll 	      BFD_ASSERT (adjust == count || count >= 4);
   1143  1.1     skrll 	      if (count >= 4)
   1144  1.1     skrll 		insn += adjust / 4;
   1145  1.1     skrll 	      else
   1146  1.1     skrll 		{
   1147  1.1     skrll 		  if ((irel->r_offset & 3) == 0)
   1148  1.1     skrll 		    ++insn;
   1149  1.1     skrll 		}
   1150  1.1     skrll 	      if ((oinsn & 0xff00) != (insn & 0xff00))
   1151  1.1     skrll 		overflow = TRUE;
   1152  1.1     skrll 	      bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
   1153  1.1     skrll 	      break;
   1154  1.1     skrll 
   1155  1.1     skrll 	    case R_SH_SWITCH8:
   1156  1.1     skrll 	      voff += adjust;
   1157  1.1     skrll 	      if (voff < 0 || voff >= 0xff)
   1158  1.1     skrll 		overflow = TRUE;
   1159  1.1     skrll 	      bfd_put_8 (abfd, voff, contents + nraddr);
   1160  1.1     skrll 	      break;
   1161  1.1     skrll 
   1162  1.1     skrll 	    case R_SH_SWITCH16:
   1163  1.1     skrll 	      voff += adjust;
   1164  1.1     skrll 	      if (voff < - 0x8000 || voff >= 0x8000)
   1165  1.1     skrll 		overflow = TRUE;
   1166  1.1     skrll 	      bfd_put_signed_16 (abfd, (bfd_vma) voff, contents + nraddr);
   1167  1.1     skrll 	      break;
   1168  1.1     skrll 
   1169  1.1     skrll 	    case R_SH_SWITCH32:
   1170  1.1     skrll 	      voff += adjust;
   1171  1.1     skrll 	      bfd_put_signed_32 (abfd, (bfd_vma) voff, contents + nraddr);
   1172  1.1     skrll 	      break;
   1173  1.1     skrll 
   1174  1.1     skrll 	    case R_SH_USES:
   1175  1.1     skrll 	      irel->r_addend += adjust;
   1176  1.1     skrll 	      break;
   1177  1.1     skrll 	    }
   1178  1.1     skrll 
   1179  1.1     skrll 	  if (overflow)
   1180  1.1     skrll 	    {
   1181  1.1     skrll 	      ((*_bfd_error_handler)
   1182  1.1     skrll 	       (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
   1183  1.1     skrll 		abfd, (unsigned long) irel->r_offset));
   1184  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   1185  1.1     skrll 	      return FALSE;
   1186  1.1     skrll 	    }
   1187  1.1     skrll 	}
   1188  1.1     skrll 
   1189  1.1     skrll       irel->r_offset = nraddr;
   1190  1.1     skrll     }
   1191  1.1     skrll 
   1192  1.1     skrll   /* Look through all the other sections.  If there contain any IMM32
   1193  1.1     skrll      relocs against internal symbols which we are not going to adjust
   1194  1.1     skrll      below, we may need to adjust the addends.  */
   1195  1.1     skrll   for (o = abfd->sections; o != NULL; o = o->next)
   1196  1.1     skrll     {
   1197  1.1     skrll       Elf_Internal_Rela *internal_relocs;
   1198  1.1     skrll       Elf_Internal_Rela *irelscan, *irelscanend;
   1199  1.1     skrll       bfd_byte *ocontents;
   1200  1.1     skrll 
   1201  1.1     skrll       if (o == sec
   1202  1.1     skrll 	  || (o->flags & SEC_RELOC) == 0
   1203  1.1     skrll 	  || o->reloc_count == 0)
   1204  1.1     skrll 	continue;
   1205  1.1     skrll 
   1206  1.1     skrll       /* We always cache the relocs.  Perhaps, if info->keep_memory is
   1207  1.1     skrll 	 FALSE, we should free them, if we are permitted to, when we
   1208  1.1     skrll 	 leave sh_coff_relax_section.  */
   1209  1.1     skrll       internal_relocs = (_bfd_elf_link_read_relocs
   1210  1.1     skrll 			 (abfd, o, NULL, (Elf_Internal_Rela *) NULL, TRUE));
   1211  1.1     skrll       if (internal_relocs == NULL)
   1212  1.1     skrll 	return FALSE;
   1213  1.1     skrll 
   1214  1.1     skrll       ocontents = NULL;
   1215  1.1     skrll       irelscanend = internal_relocs + o->reloc_count;
   1216  1.1     skrll       for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
   1217  1.1     skrll 	{
   1218  1.1     skrll 	  /* Dwarf line numbers use R_SH_SWITCH32 relocs.  */
   1219  1.1     skrll 	  if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
   1220  1.1     skrll 	    {
   1221  1.1     skrll 	      bfd_vma start, stop;
   1222  1.1     skrll 	      bfd_signed_vma voff;
   1223  1.1     skrll 
   1224  1.1     skrll 	      if (ocontents == NULL)
   1225  1.1     skrll 		{
   1226  1.1     skrll 		  if (elf_section_data (o)->this_hdr.contents != NULL)
   1227  1.1     skrll 		    ocontents = elf_section_data (o)->this_hdr.contents;
   1228  1.1     skrll 		  else
   1229  1.1     skrll 		    {
   1230  1.1     skrll 		      /* We always cache the section contents.
   1231  1.1     skrll 			 Perhaps, if info->keep_memory is FALSE, we
   1232  1.1     skrll 			 should free them, if we are permitted to,
   1233  1.1     skrll 			 when we leave sh_coff_relax_section.  */
   1234  1.1     skrll 		      if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
   1235  1.1     skrll 			{
   1236  1.1     skrll 			  if (ocontents != NULL)
   1237  1.1     skrll 			    free (ocontents);
   1238  1.1     skrll 			  return FALSE;
   1239  1.1     skrll 			}
   1240  1.1     skrll 
   1241  1.1     skrll 		      elf_section_data (o)->this_hdr.contents = ocontents;
   1242  1.1     skrll 		    }
   1243  1.1     skrll 		}
   1244  1.1     skrll 
   1245  1.1     skrll 	      stop = irelscan->r_offset;
   1246  1.1     skrll 	      start
   1247  1.1     skrll 		= (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
   1248  1.1     skrll 
   1249  1.1     skrll 	      /* STOP is in a different section, so it won't change.  */
   1250  1.1     skrll 	      if (start > addr && start < toaddr)
   1251  1.1     skrll 		irelscan->r_addend += count;
   1252  1.1     skrll 
   1253  1.1     skrll 	      voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
   1254  1.1     skrll 	      stop = (bfd_vma) ((bfd_signed_vma) start + voff);
   1255  1.1     skrll 
   1256  1.1     skrll 	      if (start > addr
   1257  1.1     skrll 		  && start < toaddr
   1258  1.1     skrll 		  && (stop <= addr || stop >= toaddr))
   1259  1.1     skrll 		bfd_put_signed_32 (abfd, (bfd_vma) voff + count,
   1260  1.1     skrll 				   ocontents + irelscan->r_offset);
   1261  1.1     skrll 	      else if (stop > addr
   1262  1.1     skrll 		       && stop < toaddr
   1263  1.1     skrll 		       && (start <= addr || start >= toaddr))
   1264  1.1     skrll 		bfd_put_signed_32 (abfd, (bfd_vma) voff - count,
   1265  1.1     skrll 				   ocontents + irelscan->r_offset);
   1266  1.1     skrll 	    }
   1267  1.1     skrll 
   1268  1.1     skrll 	  if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
   1269  1.1     skrll 	    continue;
   1270  1.1     skrll 
   1271  1.1     skrll 	  if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
   1272  1.1     skrll 	    continue;
   1273  1.1     skrll 
   1274  1.1     skrll 
   1275  1.1     skrll 	  isym = isymbuf + ELF32_R_SYM (irelscan->r_info);
   1276  1.1     skrll 	  if (isym->st_shndx == sec_shndx
   1277  1.1     skrll 	      && (isym->st_value <= addr
   1278  1.1     skrll 		  || isym->st_value >= toaddr))
   1279  1.1     skrll 	    {
   1280  1.1     skrll 	      bfd_vma val;
   1281  1.1     skrll 
   1282  1.1     skrll 	      if (ocontents == NULL)
   1283  1.1     skrll 		{
   1284  1.1     skrll 		  if (elf_section_data (o)->this_hdr.contents != NULL)
   1285  1.1     skrll 		    ocontents = elf_section_data (o)->this_hdr.contents;
   1286  1.1     skrll 		  else
   1287  1.1     skrll 		    {
   1288  1.1     skrll 		      /* We always cache the section contents.
   1289  1.1     skrll 			 Perhaps, if info->keep_memory is FALSE, we
   1290  1.1     skrll 			 should free them, if we are permitted to,
   1291  1.1     skrll 			 when we leave sh_coff_relax_section.  */
   1292  1.1     skrll 		      if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
   1293  1.1     skrll 			{
   1294  1.1     skrll 			  if (ocontents != NULL)
   1295  1.1     skrll 			    free (ocontents);
   1296  1.1     skrll 			  return FALSE;
   1297  1.1     skrll 			}
   1298  1.1     skrll 
   1299  1.1     skrll 		      elf_section_data (o)->this_hdr.contents = ocontents;
   1300  1.1     skrll 		    }
   1301  1.1     skrll 		}
   1302  1.1     skrll 
   1303  1.1     skrll 	      val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
   1304  1.1     skrll 	      val += isym->st_value;
   1305  1.1     skrll 	      if (val > addr && val < toaddr)
   1306  1.1     skrll 		bfd_put_32 (abfd, val - count,
   1307  1.1     skrll 			    ocontents + irelscan->r_offset);
   1308  1.1     skrll 	    }
   1309  1.1     skrll 	}
   1310  1.1     skrll     }
   1311  1.1     skrll 
   1312  1.1     skrll   /* Adjust the local symbols defined in this section.  */
   1313  1.1     skrll   isymend = isymbuf + symtab_hdr->sh_info;
   1314  1.1     skrll   for (isym = isymbuf; isym < isymend; isym++)
   1315  1.1     skrll     {
   1316  1.1     skrll       if (isym->st_shndx == sec_shndx
   1317  1.1     skrll 	  && isym->st_value > addr
   1318  1.1     skrll 	  && isym->st_value < toaddr)
   1319  1.1     skrll 	isym->st_value -= count;
   1320  1.1     skrll     }
   1321  1.1     skrll 
   1322  1.1     skrll   /* Now adjust the global symbols defined in this section.  */
   1323  1.1     skrll   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1324  1.1     skrll 	      - symtab_hdr->sh_info);
   1325  1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   1326  1.1     skrll   end_hashes = sym_hashes + symcount;
   1327  1.1     skrll   for (; sym_hashes < end_hashes; sym_hashes++)
   1328  1.1     skrll     {
   1329  1.1     skrll       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1330  1.1     skrll       if ((sym_hash->root.type == bfd_link_hash_defined
   1331  1.1     skrll 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1332  1.1     skrll 	  && sym_hash->root.u.def.section == sec
   1333  1.1     skrll 	  && sym_hash->root.u.def.value > addr
   1334  1.1     skrll 	  && sym_hash->root.u.def.value < toaddr)
   1335  1.1     skrll 	{
   1336  1.1     skrll 	  sym_hash->root.u.def.value -= count;
   1337  1.1     skrll 	}
   1338  1.1     skrll     }
   1339  1.1     skrll 
   1340  1.1     skrll   /* See if we can move the ALIGN reloc forward.  We have adjusted
   1341  1.1     skrll      r_offset for it already.  */
   1342  1.1     skrll   if (irelalign != NULL)
   1343  1.1     skrll     {
   1344  1.1     skrll       bfd_vma alignto, alignaddr;
   1345  1.1     skrll 
   1346  1.1     skrll       alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
   1347  1.1     skrll       alignaddr = BFD_ALIGN (irelalign->r_offset,
   1348  1.1     skrll 			     1 << irelalign->r_addend);
   1349  1.1     skrll       if (alignto != alignaddr)
   1350  1.1     skrll 	{
   1351  1.1     skrll 	  /* Tail recursion.  */
   1352  1.1     skrll 	  return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
   1353  1.1     skrll 					    (int) (alignto - alignaddr));
   1354  1.1     skrll 	}
   1355  1.1     skrll     }
   1356  1.1     skrll 
   1357  1.1     skrll   return TRUE;
   1358  1.1     skrll }
   1359  1.1     skrll 
   1360  1.1     skrll /* Look for loads and stores which we can align to four byte
   1361  1.1     skrll    boundaries.  This is like sh_align_loads in coff-sh.c.  */
   1362  1.1     skrll 
   1363  1.1     skrll static bfd_boolean
   1364  1.1     skrll sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
   1365  1.1     skrll 		    Elf_Internal_Rela *internal_relocs,
   1366  1.1     skrll 		    bfd_byte *contents ATTRIBUTE_UNUSED,
   1367  1.1     skrll 		    bfd_boolean *pswapped)
   1368  1.1     skrll {
   1369  1.1     skrll   Elf_Internal_Rela *irel, *irelend;
   1370  1.1     skrll   bfd_vma *labels = NULL;
   1371  1.1     skrll   bfd_vma *label, *label_end;
   1372  1.1     skrll   bfd_size_type amt;
   1373  1.1     skrll 
   1374  1.1     skrll   *pswapped = FALSE;
   1375  1.1     skrll 
   1376  1.1     skrll   irelend = internal_relocs + sec->reloc_count;
   1377  1.1     skrll 
   1378  1.1     skrll   /* Get all the addresses with labels on them.  */
   1379  1.1     skrll   amt = sec->reloc_count;
   1380  1.1     skrll   amt *= sizeof (bfd_vma);
   1381  1.1     skrll   labels = (bfd_vma *) bfd_malloc (amt);
   1382  1.1     skrll   if (labels == NULL)
   1383  1.1     skrll     goto error_return;
   1384  1.1     skrll   label_end = labels;
   1385  1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
   1386  1.1     skrll     {
   1387  1.1     skrll       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
   1388  1.1     skrll 	{
   1389  1.1     skrll 	  *label_end = irel->r_offset;
   1390  1.1     skrll 	  ++label_end;
   1391  1.1     skrll 	}
   1392  1.1     skrll     }
   1393  1.1     skrll 
   1394  1.1     skrll   /* Note that the assembler currently always outputs relocs in
   1395  1.1     skrll      address order.  If that ever changes, this code will need to sort
   1396  1.1     skrll      the label values and the relocs.  */
   1397  1.1     skrll 
   1398  1.1     skrll   label = labels;
   1399  1.1     skrll 
   1400  1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
   1401  1.1     skrll     {
   1402  1.1     skrll       bfd_vma start, stop;
   1403  1.1     skrll 
   1404  1.1     skrll       if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
   1405  1.1     skrll 	continue;
   1406  1.1     skrll 
   1407  1.1     skrll       start = irel->r_offset;
   1408  1.1     skrll 
   1409  1.1     skrll       for (irel++; irel < irelend; irel++)
   1410  1.1     skrll 	if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
   1411  1.1     skrll 	  break;
   1412  1.1     skrll       if (irel < irelend)
   1413  1.1     skrll 	stop = irel->r_offset;
   1414  1.1     skrll       else
   1415  1.1     skrll 	stop = sec->size;
   1416  1.1     skrll 
   1417  1.1     skrll       if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
   1418  1.1     skrll 				     internal_relocs, &label,
   1419  1.1     skrll 				     label_end, start, stop, pswapped))
   1420  1.1     skrll 	goto error_return;
   1421  1.1     skrll     }
   1422  1.1     skrll 
   1423  1.1     skrll   free (labels);
   1424  1.1     skrll 
   1425  1.1     skrll   return TRUE;
   1426  1.1     skrll 
   1427  1.1     skrll  error_return:
   1428  1.1     skrll   if (labels != NULL)
   1429  1.1     skrll     free (labels);
   1430  1.1     skrll   return FALSE;
   1431  1.1     skrll }
   1432  1.1     skrll 
   1433  1.1     skrll #ifndef SH64_ELF
   1434  1.1     skrll /* Swap two SH instructions.  This is like sh_swap_insns in coff-sh.c.  */
   1435  1.1     skrll 
   1436  1.1     skrll static bfd_boolean
   1437  1.1     skrll sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs,
   1438  1.1     skrll 		   bfd_byte *contents, bfd_vma addr)
   1439  1.1     skrll {
   1440  1.1     skrll   Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
   1441  1.1     skrll   unsigned short i1, i2;
   1442  1.1     skrll   Elf_Internal_Rela *irel, *irelend;
   1443  1.1     skrll 
   1444  1.1     skrll   /* Swap the instructions themselves.  */
   1445  1.1     skrll   i1 = bfd_get_16 (abfd, contents + addr);
   1446  1.1     skrll   i2 = bfd_get_16 (abfd, contents + addr + 2);
   1447  1.1     skrll   bfd_put_16 (abfd, (bfd_vma) i2, contents + addr);
   1448  1.1     skrll   bfd_put_16 (abfd, (bfd_vma) i1, contents + addr + 2);
   1449  1.1     skrll 
   1450  1.1     skrll   /* Adjust all reloc addresses.  */
   1451  1.1     skrll   irelend = internal_relocs + sec->reloc_count;
   1452  1.1     skrll   for (irel = internal_relocs; irel < irelend; irel++)
   1453  1.1     skrll     {
   1454  1.1     skrll       enum elf_sh_reloc_type type;
   1455  1.1     skrll       int add;
   1456  1.1     skrll 
   1457  1.1     skrll       /* There are a few special types of relocs that we don't want to
   1458  1.1     skrll 	 adjust.  These relocs do not apply to the instruction itself,
   1459  1.1     skrll 	 but are only associated with the address.  */
   1460  1.1     skrll       type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
   1461  1.1     skrll       if (type == R_SH_ALIGN
   1462  1.1     skrll 	  || type == R_SH_CODE
   1463  1.1     skrll 	  || type == R_SH_DATA
   1464  1.1     skrll 	  || type == R_SH_LABEL)
   1465  1.1     skrll 	continue;
   1466  1.1     skrll 
   1467  1.1     skrll       /* If an R_SH_USES reloc points to one of the addresses being
   1468  1.1     skrll 	 swapped, we must adjust it.  It would be incorrect to do this
   1469  1.1     skrll 	 for a jump, though, since we want to execute both
   1470  1.1     skrll 	 instructions after the jump.  (We have avoided swapping
   1471  1.1     skrll 	 around a label, so the jump will not wind up executing an
   1472  1.1     skrll 	 instruction it shouldn't).  */
   1473  1.1     skrll       if (type == R_SH_USES)
   1474  1.1     skrll 	{
   1475  1.1     skrll 	  bfd_vma off;
   1476  1.1     skrll 
   1477  1.1     skrll 	  off = irel->r_offset + 4 + irel->r_addend;
   1478  1.1     skrll 	  if (off == addr)
   1479  1.1     skrll 	    irel->r_offset += 2;
   1480  1.1     skrll 	  else if (off == addr + 2)
   1481  1.1     skrll 	    irel->r_offset -= 2;
   1482  1.1     skrll 	}
   1483  1.1     skrll 
   1484  1.1     skrll       if (irel->r_offset == addr)
   1485  1.1     skrll 	{
   1486  1.1     skrll 	  irel->r_offset += 2;
   1487  1.1     skrll 	  add = -2;
   1488  1.1     skrll 	}
   1489  1.1     skrll       else if (irel->r_offset == addr + 2)
   1490  1.1     skrll 	{
   1491  1.1     skrll 	  irel->r_offset -= 2;
   1492  1.1     skrll 	  add = 2;
   1493  1.1     skrll 	}
   1494  1.1     skrll       else
   1495  1.1     skrll 	add = 0;
   1496  1.1     skrll 
   1497  1.1     skrll       if (add != 0)
   1498  1.1     skrll 	{
   1499  1.1     skrll 	  bfd_byte *loc;
   1500  1.1     skrll 	  unsigned short insn, oinsn;
   1501  1.1     skrll 	  bfd_boolean overflow;
   1502  1.1     skrll 
   1503  1.1     skrll 	  loc = contents + irel->r_offset;
   1504  1.1     skrll 	  overflow = FALSE;
   1505  1.1     skrll 	  switch (type)
   1506  1.1     skrll 	    {
   1507  1.1     skrll 	    default:
   1508  1.1     skrll 	      break;
   1509  1.1     skrll 
   1510  1.1     skrll 	    case R_SH_DIR8WPN:
   1511  1.1     skrll 	    case R_SH_DIR8WPZ:
   1512  1.1     skrll 	      insn = bfd_get_16 (abfd, loc);
   1513  1.1     skrll 	      oinsn = insn;
   1514  1.1     skrll 	      insn += add / 2;
   1515  1.1     skrll 	      if ((oinsn & 0xff00) != (insn & 0xff00))
   1516  1.1     skrll 		overflow = TRUE;
   1517  1.1     skrll 	      bfd_put_16 (abfd, (bfd_vma) insn, loc);
   1518  1.1     skrll 	      break;
   1519  1.1     skrll 
   1520  1.1     skrll 	    case R_SH_IND12W:
   1521  1.1     skrll 	      insn = bfd_get_16 (abfd, loc);
   1522  1.1     skrll 	      oinsn = insn;
   1523  1.1     skrll 	      insn += add / 2;
   1524  1.1     skrll 	      if ((oinsn & 0xf000) != (insn & 0xf000))
   1525  1.1     skrll 		overflow = TRUE;
   1526  1.1     skrll 	      bfd_put_16 (abfd, (bfd_vma) insn, loc);
   1527  1.1     skrll 	      break;
   1528  1.1     skrll 
   1529  1.1     skrll 	    case R_SH_DIR8WPL:
   1530  1.1     skrll 	      /* This reloc ignores the least significant 3 bits of
   1531  1.1     skrll 		 the program counter before adding in the offset.
   1532  1.1     skrll 		 This means that if ADDR is at an even address, the
   1533  1.1     skrll 		 swap will not affect the offset.  If ADDR is an at an
   1534  1.1     skrll 		 odd address, then the instruction will be crossing a
   1535  1.1     skrll 		 four byte boundary, and must be adjusted.  */
   1536  1.1     skrll 	      if ((addr & 3) != 0)
   1537  1.1     skrll 		{
   1538  1.1     skrll 		  insn = bfd_get_16 (abfd, loc);
   1539  1.1     skrll 		  oinsn = insn;
   1540  1.1     skrll 		  insn += add / 2;
   1541  1.1     skrll 		  if ((oinsn & 0xff00) != (insn & 0xff00))
   1542  1.1     skrll 		    overflow = TRUE;
   1543  1.1     skrll 		  bfd_put_16 (abfd, (bfd_vma) insn, loc);
   1544  1.1     skrll 		}
   1545  1.1     skrll 
   1546  1.1     skrll 	      break;
   1547  1.1     skrll 	    }
   1548  1.1     skrll 
   1549  1.1     skrll 	  if (overflow)
   1550  1.1     skrll 	    {
   1551  1.1     skrll 	      ((*_bfd_error_handler)
   1552  1.1     skrll 	       (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
   1553  1.1     skrll 		abfd, (unsigned long) irel->r_offset));
   1554  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   1555  1.1     skrll 	      return FALSE;
   1556  1.1     skrll 	    }
   1557  1.1     skrll 	}
   1558  1.1     skrll     }
   1559  1.1     skrll 
   1560  1.1     skrll   return TRUE;
   1561  1.1     skrll }
   1562  1.1     skrll #endif /* defined SH64_ELF */
   1563  1.1     skrll 
   1564  1.1     skrll /* Describes one of the various PLT styles.  */
   1566  1.1     skrll 
   1567  1.1     skrll struct elf_sh_plt_info
   1568  1.1     skrll {
   1569  1.1     skrll   /* The template for the first PLT entry, or NULL if there is no special
   1570  1.1     skrll      first entry.  */
   1571  1.1     skrll   const bfd_byte *plt0_entry;
   1572  1.1     skrll 
   1573  1.1     skrll   /* The size of PLT0_ENTRY in bytes, or 0 if PLT0_ENTRY is NULL.  */
   1574  1.1     skrll   bfd_vma plt0_entry_size;
   1575  1.1     skrll 
   1576  1.1     skrll   /* Index I is the offset into PLT0_ENTRY of a pointer to
   1577  1.1     skrll      _GLOBAL_OFFSET_TABLE_ + I * 4.  The value is MINUS_ONE
   1578  1.1     skrll      if there is no such pointer.  */
   1579  1.1     skrll   bfd_vma plt0_got_fields[3];
   1580  1.1     skrll 
   1581  1.1     skrll   /* The template for a symbol's PLT entry.  */
   1582  1.1     skrll   const bfd_byte *symbol_entry;
   1583  1.1     skrll 
   1584  1.1     skrll   /* The size of SYMBOL_ENTRY in bytes.  */
   1585  1.1     skrll   bfd_vma symbol_entry_size;
   1586  1.1     skrll 
   1587  1.1     skrll   /* Byte offsets of fields in SYMBOL_ENTRY.  Not all fields are used
   1588  1.1     skrll      on all targets.  The comments by each member indicate the value
   1589  1.1     skrll      that the field must hold.  */
   1590  1.3  christos   struct {
   1591  1.3  christos     bfd_vma got_entry; /* the address of the symbol's .got.plt entry */
   1592  1.3  christos     bfd_vma plt; /* .plt (or a branch to .plt on VxWorks) */
   1593  1.1     skrll     bfd_vma reloc_offset; /* the offset of the symbol's JMP_SLOT reloc */
   1594  1.1     skrll     bfd_boolean got20; /* TRUE if got_entry points to a movi20
   1595  1.1     skrll 			  instruction (instead of a constant pool
   1596  1.1     skrll 			  entry).  */
   1597  1.3  christos   } symbol_fields;
   1598  1.3  christos 
   1599  1.3  christos   /* The offset of the resolver stub from the start of SYMBOL_ENTRY.  */
   1600  1.3  christos   bfd_vma symbol_resolve_offset;
   1601  1.3  christos 
   1602  1.1     skrll   /* A different PLT layout which can be used for the first
   1603  1.1     skrll      MAX_SHORT_PLT entries.  It must share the same plt0.  NULL in
   1604  1.1     skrll      other cases.  */
   1605  1.1     skrll   const struct elf_sh_plt_info *short_plt;
   1606  1.1     skrll };
   1607  1.1     skrll 
   1608  1.1     skrll #ifdef INCLUDE_SHMEDIA
   1609  1.1     skrll 
   1610  1.1     skrll /* The size in bytes of an entry in the procedure linkage table.  */
   1611  1.1     skrll 
   1612  1.1     skrll #define ELF_PLT_ENTRY_SIZE 64
   1613  1.1     skrll 
   1614  1.1     skrll /* First entry in an absolute procedure linkage table look like this.  */
   1615  1.1     skrll 
   1616  1.1     skrll static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] =
   1617  1.1     skrll {
   1618  1.1     skrll   0xcc, 0x00, 0x01, 0x10, /* movi  .got.plt >> 16, r17 */
   1619  1.1     skrll   0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
   1620  1.1     skrll   0x89, 0x10, 0x09, 0x90, /* ld.l  r17, 8, r25 */
   1621  1.1     skrll   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
   1622  1.1     skrll   0x89, 0x10, 0x05, 0x10, /* ld.l  r17, 4, r17 */
   1623  1.1     skrll   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
   1624  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1625  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1626  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1627  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1628  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1629  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1630  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1631  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1632  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1633  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1634  1.1     skrll };
   1635  1.1     skrll 
   1636  1.1     skrll static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] =
   1637  1.1     skrll {
   1638  1.1     skrll   0x10, 0x01, 0x00, 0xcc, /* movi  .got.plt >> 16, r17 */
   1639  1.1     skrll   0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
   1640  1.1     skrll   0x90, 0x09, 0x10, 0x89, /* ld.l  r17, 8, r25 */
   1641  1.1     skrll   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
   1642  1.1     skrll   0x10, 0x05, 0x10, 0x89, /* ld.l  r17, 4, r17 */
   1643  1.1     skrll   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
   1644  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1645  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1646  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1647  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1648  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1649  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1650  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1651  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1652  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1653  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1654  1.1     skrll };
   1655  1.1     skrll 
   1656  1.1     skrll /* Sebsequent entries in an absolute procedure linkage table look like
   1657  1.1     skrll    this.  */
   1658  1.1     skrll 
   1659  1.1     skrll static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
   1660  1.1     skrll {
   1661  1.1     skrll   0xcc, 0x00, 0x01, 0x90, /* movi  nameN-in-GOT >> 16, r25 */
   1662  1.1     skrll   0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
   1663  1.1     skrll   0x89, 0x90, 0x01, 0x90, /* ld.l  r25, 0, r25 */
   1664  1.1     skrll   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
   1665  1.1     skrll   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
   1666  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1667  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1668  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1669  1.1     skrll   0xcc, 0x00, 0x01, 0x90, /* movi  .PLT0 >> 16, r25 */
   1670  1.1     skrll   0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
   1671  1.1     skrll   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
   1672  1.1     skrll   0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
   1673  1.1     skrll   0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
   1674  1.1     skrll   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
   1675  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1676  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1677  1.1     skrll };
   1678  1.1     skrll 
   1679  1.1     skrll static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
   1680  1.1     skrll {
   1681  1.1     skrll   0x90, 0x01, 0x00, 0xcc, /* movi  nameN-in-GOT >> 16, r25 */
   1682  1.1     skrll   0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
   1683  1.1     skrll   0x90, 0x01, 0x90, 0x89, /* ld.l  r25, 0, r25 */
   1684  1.1     skrll   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
   1685  1.1     skrll   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
   1686  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1687  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1688  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1689  1.1     skrll   0x90, 0x01, 0x00, 0xcc, /* movi  .PLT0 >> 16, r25 */
   1690  1.1     skrll   0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
   1691  1.1     skrll   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
   1692  1.1     skrll   0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
   1693  1.1     skrll   0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
   1694  1.1     skrll   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
   1695  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1696  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1697  1.1     skrll };
   1698  1.1     skrll 
   1699  1.1     skrll /* Entries in a PIC procedure linkage table look like this.  */
   1700  1.1     skrll 
   1701  1.1     skrll static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
   1702  1.1     skrll {
   1703  1.1     skrll   0xcc, 0x00, 0x01, 0x90, /* movi  nameN@GOT >> 16, r25 */
   1704  1.1     skrll   0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
   1705  1.1     skrll   0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
   1706  1.1     skrll   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
   1707  1.1     skrll   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
   1708  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1709  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1710  1.1     skrll   0x6f, 0xf0, 0xff, 0xf0, /* nop */
   1711  1.1     skrll   0xce, 0x00, 0x01, 0x10, /* movi  -GOT_BIAS, r17 */
   1712  1.1     skrll   0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
   1713  1.1     skrll   0x89, 0x10, 0x09, 0x90, /* ld.l  r17, 8, r25 */
   1714  1.1     skrll   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
   1715  1.1     skrll   0x89, 0x10, 0x05, 0x10, /* ld.l  r17, 4, r17 */
   1716  1.1     skrll   0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
   1717  1.1     skrll   0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
   1718  1.1     skrll   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
   1719  1.1     skrll };
   1720  1.1     skrll 
   1721  1.1     skrll static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
   1722  1.1     skrll {
   1723  1.1     skrll   0x90, 0x01, 0x00, 0xcc, /* movi  nameN@GOT >> 16, r25 */
   1724  1.1     skrll   0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
   1725  1.1     skrll   0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
   1726  1.1     skrll   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
   1727  1.1     skrll   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
   1728  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1729  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1730  1.1     skrll   0xf0, 0xff, 0xf0, 0x6f, /* nop */
   1731  1.1     skrll   0x10, 0x01, 0x00, 0xce, /* movi  -GOT_BIAS, r17 */
   1732  1.1     skrll   0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
   1733  1.1     skrll   0x90, 0x09, 0x10, 0x89, /* ld.l  r17, 8, r25 */
   1734  1.1     skrll   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
   1735  1.1     skrll   0x10, 0x05, 0x10, 0x89, /* ld.l  r17, 4, r17 */
   1736  1.1     skrll   0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
   1737  1.1     skrll   0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
   1738  1.1     skrll   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
   1739  1.1     skrll };
   1740  1.1     skrll 
   1741  1.1     skrll static const struct elf_sh_plt_info elf_sh_plts[2][2] = {
   1742  1.1     skrll   {
   1743  1.1     skrll     {
   1744  1.1     skrll       /* Big-endian non-PIC.  */
   1745  1.1     skrll       elf_sh_plt0_entry_be,
   1746  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1747  1.3  christos       { 0, MINUS_ONE, MINUS_ONE },
   1748  1.3  christos       elf_sh_plt_entry_be,
   1749  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1750  1.1     skrll       { 0, 32, 48, FALSE },
   1751  1.1     skrll       33, /* includes ISA encoding */
   1752  1.1     skrll       NULL
   1753  1.1     skrll     },
   1754  1.1     skrll     {
   1755  1.1     skrll       /* Little-endian non-PIC.  */
   1756  1.1     skrll       elf_sh_plt0_entry_le,
   1757  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1758  1.3  christos       { 0, MINUS_ONE, MINUS_ONE },
   1759  1.3  christos       elf_sh_plt_entry_le,
   1760  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1761  1.1     skrll       { 0, 32, 48, FALSE },
   1762  1.1     skrll       33, /* includes ISA encoding */
   1763  1.1     skrll       NULL
   1764  1.1     skrll     },
   1765  1.1     skrll   },
   1766  1.1     skrll   {
   1767  1.1     skrll     {
   1768  1.1     skrll       /* Big-endian PIC.  */
   1769  1.1     skrll       elf_sh_plt0_entry_be,
   1770  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1771  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   1772  1.3  christos       elf_sh_pic_plt_entry_be,
   1773  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1774  1.1     skrll       { 0, MINUS_ONE, 52, FALSE },
   1775  1.1     skrll       33, /* includes ISA encoding */
   1776  1.1     skrll       NULL
   1777  1.1     skrll     },
   1778  1.1     skrll     {
   1779  1.1     skrll       /* Little-endian PIC.  */
   1780  1.1     skrll       elf_sh_plt0_entry_le,
   1781  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1782  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   1783  1.3  christos       elf_sh_pic_plt_entry_le,
   1784  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1785  1.1     skrll       { 0, MINUS_ONE, 52, FALSE },
   1786  1.1     skrll       33, /* includes ISA encoding */
   1787  1.1     skrll       NULL
   1788  1.1     skrll     },
   1789  1.1     skrll   }
   1790  1.1     skrll };
   1791  1.1     skrll 
   1792  1.1     skrll /* Return offset of the linker in PLT0 entry.  */
   1793  1.1     skrll #define elf_sh_plt0_gotplt_offset(info) 0
   1794  1.1     skrll 
   1795  1.1     skrll /* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD.
   1796  1.1     skrll    VALUE is the field's value and CODE_P is true if VALUE refers to code,
   1797  1.1     skrll    not data.
   1798  1.1     skrll 
   1799  1.1     skrll    On SH64, each 32-bit field is loaded by a movi/shori pair.  */
   1800  1.1     skrll 
   1801  1.1     skrll inline static void
   1802  1.1     skrll install_plt_field (bfd *output_bfd, bfd_boolean code_p,
   1803  1.1     skrll 		   unsigned long value, bfd_byte *addr)
   1804  1.1     skrll {
   1805  1.1     skrll   value |= code_p;
   1806  1.1     skrll   bfd_put_32 (output_bfd,
   1807  1.1     skrll 	      bfd_get_32 (output_bfd, addr)
   1808  1.1     skrll 	      | ((value >> 6) & 0x3fffc00),
   1809  1.1     skrll 	      addr);
   1810  1.1     skrll   bfd_put_32 (output_bfd,
   1811  1.1     skrll 	      bfd_get_32 (output_bfd, addr + 4)
   1812  1.1     skrll 	      | ((value << 10) & 0x3fffc00),
   1813  1.1     skrll 	      addr + 4);
   1814  1.1     skrll }
   1815  1.1     skrll 
   1816  1.1     skrll /* Return the type of PLT associated with ABFD.  PIC_P is true if
   1817  1.1     skrll    the object is position-independent.  */
   1818  1.1     skrll 
   1819  1.1     skrll static const struct elf_sh_plt_info *
   1820  1.1     skrll get_plt_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean pic_p)
   1821  1.1     skrll {
   1822  1.1     skrll   return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)];
   1823  1.1     skrll }
   1824  1.1     skrll #else
   1825  1.1     skrll /* The size in bytes of an entry in the procedure linkage table.  */
   1826  1.1     skrll 
   1827  1.1     skrll #define ELF_PLT_ENTRY_SIZE 28
   1828  1.1     skrll 
   1829  1.1     skrll /* First entry in an absolute procedure linkage table look like this.  */
   1830  1.1     skrll 
   1831  1.1     skrll /* Note - this code has been "optimised" not to use r2.  r2 is used by
   1832  1.1     skrll    GCC to return the address of large structures, so it should not be
   1833  1.1     skrll    corrupted here.  This does mean however, that this PLT does not conform
   1834  1.1     skrll    to the SH PIC ABI.  That spec says that r0 contains the type of the PLT
   1835  1.1     skrll    and r2 contains the GOT id.  This version stores the GOT id in r0 and
   1836  1.1     skrll    ignores the type.  Loaders can easily detect this difference however,
   1837  1.1     skrll    since the type will always be 0 or 8, and the GOT ids will always be
   1838  1.1     skrll    greater than or equal to 12.  */
   1839  1.1     skrll static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] =
   1840  1.1     skrll {
   1841  1.1     skrll   0xd0, 0x05,	/* mov.l 2f,r0 */
   1842  1.1     skrll   0x60, 0x02,	/* mov.l @r0,r0 */
   1843  1.1     skrll   0x2f, 0x06,	/* mov.l r0,@-r15 */
   1844  1.1     skrll   0xd0, 0x03,	/* mov.l 1f,r0 */
   1845  1.1     skrll   0x60, 0x02,	/* mov.l @r0,r0 */
   1846  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   1847  1.1     skrll   0x60, 0xf6,	/*  mov.l @r15+,r0 */
   1848  1.1     skrll   0x00, 0x09,	/* nop */
   1849  1.1     skrll   0x00, 0x09,	/* nop */
   1850  1.1     skrll   0x00, 0x09,	/* nop */
   1851  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of .got.plt + 8.  */
   1852  1.1     skrll   0, 0, 0, 0,	/* 2: replaced with address of .got.plt + 4.  */
   1853  1.1     skrll };
   1854  1.1     skrll 
   1855  1.1     skrll static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] =
   1856  1.1     skrll {
   1857  1.1     skrll   0x05, 0xd0,	/* mov.l 2f,r0 */
   1858  1.1     skrll   0x02, 0x60,	/* mov.l @r0,r0 */
   1859  1.1     skrll   0x06, 0x2f,	/* mov.l r0,@-r15 */
   1860  1.1     skrll   0x03, 0xd0,	/* mov.l 1f,r0 */
   1861  1.1     skrll   0x02, 0x60,	/* mov.l @r0,r0 */
   1862  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   1863  1.1     skrll   0xf6, 0x60,	/*  mov.l @r15+,r0 */
   1864  1.1     skrll   0x09, 0x00,	/* nop */
   1865  1.1     skrll   0x09, 0x00,	/* nop */
   1866  1.1     skrll   0x09, 0x00,	/* nop */
   1867  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of .got.plt + 8.  */
   1868  1.1     skrll   0, 0, 0, 0,	/* 2: replaced with address of .got.plt + 4.  */
   1869  1.1     skrll };
   1870  1.1     skrll 
   1871  1.1     skrll /* Sebsequent entries in an absolute procedure linkage table look like
   1872  1.1     skrll    this.  */
   1873  1.1     skrll 
   1874  1.1     skrll static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
   1875  1.1     skrll {
   1876  1.1     skrll   0xd0, 0x04,	/* mov.l 1f,r0 */
   1877  1.1     skrll   0x60, 0x02,	/* mov.l @(r0,r12),r0 */
   1878  1.1     skrll   0xd1, 0x02,	/* mov.l 0f,r1 */
   1879  1.1     skrll   0x40, 0x2b,   /* jmp @r0 */
   1880  1.1     skrll   0x60, 0x13,	/*  mov r1,r0 */
   1881  1.1     skrll   0xd1, 0x03,	/* mov.l 2f,r1 */
   1882  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   1883  1.1     skrll   0x00, 0x09,	/* nop */
   1884  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with address of .PLT0.  */
   1885  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of this symbol in .got.  */
   1886  1.1     skrll   0, 0, 0, 0,	/* 2: replaced with offset into relocation table.  */
   1887  1.1     skrll };
   1888  1.1     skrll 
   1889  1.1     skrll static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
   1890  1.1     skrll {
   1891  1.1     skrll   0x04, 0xd0,	/* mov.l 1f,r0 */
   1892  1.1     skrll   0x02, 0x60,	/* mov.l @r0,r0 */
   1893  1.1     skrll   0x02, 0xd1,	/* mov.l 0f,r1 */
   1894  1.1     skrll   0x2b, 0x40,   /* jmp @r0 */
   1895  1.1     skrll   0x13, 0x60,	/*  mov r1,r0 */
   1896  1.1     skrll   0x03, 0xd1,	/* mov.l 2f,r1 */
   1897  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   1898  1.1     skrll   0x09, 0x00,	/*  nop */
   1899  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with address of .PLT0.  */
   1900  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of this symbol in .got.  */
   1901  1.1     skrll   0, 0, 0, 0,	/* 2: replaced with offset into relocation table.  */
   1902  1.1     skrll };
   1903  1.1     skrll 
   1904  1.1     skrll /* Entries in a PIC procedure linkage table look like this.  */
   1905  1.1     skrll 
   1906  1.1     skrll static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] =
   1907  1.1     skrll {
   1908  1.1     skrll   0xd0, 0x04,	/* mov.l 1f,r0 */
   1909  1.1     skrll   0x00, 0xce,	/* mov.l @(r0,r12),r0 */
   1910  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   1911  1.1     skrll   0x00, 0x09,	/*  nop */
   1912  1.1     skrll   0x50, 0xc2,	/* mov.l @(8,r12),r0 */
   1913  1.1     skrll   0xd1, 0x03,	/* mov.l 2f,r1 */
   1914  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   1915  1.1     skrll   0x50, 0xc1,	/*  mov.l @(4,r12),r0 */
   1916  1.1     skrll   0x00, 0x09,	/* nop */
   1917  1.1     skrll   0x00, 0x09,	/* nop */
   1918  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of this symbol in .got.  */
   1919  1.1     skrll   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
   1920  1.1     skrll };
   1921  1.1     skrll 
   1922  1.1     skrll static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] =
   1923  1.1     skrll {
   1924  1.1     skrll   0x04, 0xd0,	/* mov.l 1f,r0 */
   1925  1.1     skrll   0xce, 0x00,	/* mov.l @(r0,r12),r0 */
   1926  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   1927  1.1     skrll   0x09, 0x00,	/*  nop */
   1928  1.1     skrll   0xc2, 0x50,	/* mov.l @(8,r12),r0 */
   1929  1.1     skrll   0x03, 0xd1,	/* mov.l 2f,r1 */
   1930  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   1931  1.1     skrll   0xc1, 0x50,	/*  mov.l @(4,r12),r0 */
   1932  1.1     skrll   0x09, 0x00,	/*  nop */
   1933  1.1     skrll   0x09, 0x00,	/* nop */
   1934  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with address of this symbol in .got.  */
   1935  1.1     skrll   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
   1936  1.1     skrll };
   1937  1.1     skrll 
   1938  1.1     skrll static const struct elf_sh_plt_info elf_sh_plts[2][2] = {
   1939  1.1     skrll   {
   1940  1.1     skrll     {
   1941  1.1     skrll       /* Big-endian non-PIC.  */
   1942  1.1     skrll       elf_sh_plt0_entry_be,
   1943  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1944  1.3  christos       { MINUS_ONE, 24, 20 },
   1945  1.3  christos       elf_sh_plt_entry_be,
   1946  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1947  1.1     skrll       { 20, 16, 24, FALSE },
   1948  1.1     skrll       8,
   1949  1.1     skrll       NULL
   1950  1.1     skrll     },
   1951  1.1     skrll     {
   1952  1.1     skrll       /* Little-endian non-PIC.  */
   1953  1.1     skrll       elf_sh_plt0_entry_le,
   1954  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1955  1.3  christos       { MINUS_ONE, 24, 20 },
   1956  1.3  christos       elf_sh_plt_entry_le,
   1957  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1958  1.1     skrll       { 20, 16, 24, FALSE },
   1959  1.1     skrll       8,
   1960  1.1     skrll       NULL
   1961  1.1     skrll     },
   1962  1.1     skrll   },
   1963  1.1     skrll   {
   1964  1.1     skrll     {
   1965  1.1     skrll       /* Big-endian PIC.  */
   1966  1.1     skrll       elf_sh_plt0_entry_be,
   1967  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1968  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   1969  1.3  christos       elf_sh_pic_plt_entry_be,
   1970  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1971  1.1     skrll       { 20, MINUS_ONE, 24, FALSE },
   1972  1.1     skrll       8,
   1973  1.1     skrll       NULL
   1974  1.1     skrll     },
   1975  1.1     skrll     {
   1976  1.1     skrll       /* Little-endian PIC.  */
   1977  1.1     skrll       elf_sh_plt0_entry_le,
   1978  1.3  christos       ELF_PLT_ENTRY_SIZE,
   1979  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   1980  1.3  christos       elf_sh_pic_plt_entry_le,
   1981  1.1     skrll       ELF_PLT_ENTRY_SIZE,
   1982  1.1     skrll       { 20, MINUS_ONE, 24, FALSE },
   1983  1.1     skrll       8,
   1984  1.1     skrll       NULL
   1985  1.1     skrll     },
   1986  1.1     skrll   }
   1987  1.1     skrll };
   1988  1.1     skrll 
   1989  1.1     skrll #define VXWORKS_PLT_HEADER_SIZE 12
   1990  1.1     skrll #define VXWORKS_PLT_ENTRY_SIZE 24
   1991  1.1     skrll 
   1992  1.1     skrll static const bfd_byte vxworks_sh_plt0_entry_be[VXWORKS_PLT_HEADER_SIZE] =
   1993  1.1     skrll {
   1994  1.1     skrll   0xd1, 0x01,	/* mov.l @(8,pc),r1 */
   1995  1.1     skrll   0x61, 0x12,	/* mov.l @r1,r1 */
   1996  1.1     skrll   0x41, 0x2b,	/* jmp @r1 */
   1997  1.1     skrll   0x00, 0x09,	/* nop */
   1998  1.1     skrll   0, 0, 0, 0	/* 0: replaced with _GLOBAL_OFFSET_TABLE+8.  */
   1999  1.1     skrll };
   2000  1.1     skrll 
   2001  1.1     skrll static const bfd_byte vxworks_sh_plt0_entry_le[VXWORKS_PLT_HEADER_SIZE] =
   2002  1.1     skrll {
   2003  1.1     skrll   0x01, 0xd1,	/* mov.l @(8,pc),r1 */
   2004  1.1     skrll   0x12, 0x61,	/* mov.l @r1,r1 */
   2005  1.1     skrll   0x2b, 0x41,	/* jmp @r1 */
   2006  1.1     skrll   0x09, 0x00,	/* nop */
   2007  1.1     skrll   0, 0, 0, 0	/* 0: replaced with _GLOBAL_OFFSET_TABLE+8.  */
   2008  1.1     skrll };
   2009  1.1     skrll 
   2010  1.1     skrll static const bfd_byte vxworks_sh_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] =
   2011  1.1     skrll {
   2012  1.1     skrll   0xd0, 0x01,	/* mov.l @(8,pc),r0 */
   2013  1.1     skrll   0x60, 0x02,	/* mov.l @r0,r0 */
   2014  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   2015  1.1     skrll   0x00, 0x09,	/* nop */
   2016  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with address of this symbol in .got.  */
   2017  1.1     skrll   0xd0, 0x01,	/* mov.l @(8,pc),r0 */
   2018  1.1     skrll   0xa0, 0x00,	/* bra PLT (We need to fix the offset.)  */
   2019  1.1     skrll   0x00, 0x09,	/* nop */
   2020  1.1     skrll   0x00, 0x09,	/* nop */
   2021  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2022  1.1     skrll };
   2023  1.1     skrll 
   2024  1.1     skrll static const bfd_byte vxworks_sh_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] =
   2025  1.1     skrll {
   2026  1.1     skrll   0x01, 0xd0,	/* mov.l @(8,pc),r0 */
   2027  1.1     skrll   0x02, 0x60,	/* mov.l @r0,r0 */
   2028  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   2029  1.1     skrll   0x09, 0x00,	/* nop */
   2030  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with address of this symbol in .got.  */
   2031  1.1     skrll   0x01, 0xd0,	/* mov.l @(8,pc),r0 */
   2032  1.1     skrll   0x00, 0xa0,	/* bra PLT (We need to fix the offset.)  */
   2033  1.1     skrll   0x09, 0x00,	/* nop */
   2034  1.1     skrll   0x09, 0x00,	/* nop */
   2035  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2036  1.1     skrll };
   2037  1.1     skrll 
   2038  1.1     skrll static const bfd_byte vxworks_sh_pic_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] =
   2039  1.1     skrll {
   2040  1.1     skrll   0xd0, 0x01,	/* mov.l @(8,pc),r0 */
   2041  1.1     skrll   0x00, 0xce,	/* mov.l @(r0,r12),r0 */
   2042  1.1     skrll   0x40, 0x2b,	/* jmp @r0 */
   2043  1.1     skrll   0x00, 0x09,	/* nop */
   2044  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with offset of this symbol in .got.  */
   2045  1.1     skrll   0xd0, 0x01,	/* mov.l @(8,pc),r0 */
   2046  1.1     skrll   0x51, 0xc2,	/* mov.l @(8,r12),r1 */
   2047  1.1     skrll   0x41, 0x2b,	/* jmp @r1 */
   2048  1.1     skrll   0x00, 0x09,	/* nop */
   2049  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2050  1.1     skrll };
   2051  1.1     skrll 
   2052  1.1     skrll static const bfd_byte vxworks_sh_pic_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] =
   2053  1.1     skrll {
   2054  1.1     skrll   0x01, 0xd0,	/* mov.l @(8,pc),r0 */
   2055  1.1     skrll   0xce, 0x00,	/* mov.l @(r0,r12),r0 */
   2056  1.1     skrll   0x2b, 0x40,	/* jmp @r0 */
   2057  1.1     skrll   0x09, 0x00,	/* nop */
   2058  1.1     skrll   0, 0, 0, 0,	/* 0: replaced with offset of this symbol in .got.  */
   2059  1.1     skrll   0x01, 0xd0,	/* mov.l @(8,pc),r0 */
   2060  1.1     skrll   0xc2, 0x51,	/* mov.l @(8,r12),r1 */
   2061  1.1     skrll   0x2b, 0x41,	/* jmp @r1 */
   2062  1.1     skrll   0x09, 0x00,	/* nop */
   2063  1.1     skrll   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2064  1.1     skrll };
   2065  1.1     skrll 
   2066  1.1     skrll static const struct elf_sh_plt_info vxworks_sh_plts[2][2] = {
   2067  1.1     skrll   {
   2068  1.1     skrll     {
   2069  1.1     skrll       /* Big-endian non-PIC.  */
   2070  1.1     skrll       vxworks_sh_plt0_entry_be,
   2071  1.3  christos       VXWORKS_PLT_HEADER_SIZE,
   2072  1.3  christos       { MINUS_ONE, MINUS_ONE, 8 },
   2073  1.3  christos       vxworks_sh_plt_entry_be,
   2074  1.1     skrll       VXWORKS_PLT_ENTRY_SIZE,
   2075  1.1     skrll       { 8, 14, 20, FALSE },
   2076  1.1     skrll       12,
   2077  1.1     skrll       NULL
   2078  1.1     skrll     },
   2079  1.1     skrll     {
   2080  1.1     skrll       /* Little-endian non-PIC.  */
   2081  1.1     skrll       vxworks_sh_plt0_entry_le,
   2082  1.3  christos       VXWORKS_PLT_HEADER_SIZE,
   2083  1.3  christos       { MINUS_ONE, MINUS_ONE, 8 },
   2084  1.3  christos       vxworks_sh_plt_entry_le,
   2085  1.1     skrll       VXWORKS_PLT_ENTRY_SIZE,
   2086  1.1     skrll       { 8, 14, 20, FALSE },
   2087  1.1     skrll       12,
   2088  1.1     skrll       NULL
   2089  1.1     skrll     },
   2090  1.1     skrll   },
   2091  1.1     skrll   {
   2092  1.1     skrll     {
   2093  1.1     skrll       /* Big-endian PIC.  */
   2094  1.1     skrll       NULL,
   2095  1.3  christos       0,
   2096  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2097  1.3  christos       vxworks_sh_pic_plt_entry_be,
   2098  1.1     skrll       VXWORKS_PLT_ENTRY_SIZE,
   2099  1.1     skrll       { 8, MINUS_ONE, 20, FALSE },
   2100  1.1     skrll       12,
   2101  1.1     skrll       NULL
   2102  1.1     skrll     },
   2103  1.1     skrll     {
   2104  1.1     skrll       /* Little-endian PIC.  */
   2105  1.1     skrll       NULL,
   2106  1.3  christos       0,
   2107  1.3  christos       { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2108  1.3  christos       vxworks_sh_pic_plt_entry_le,
   2109  1.1     skrll       VXWORKS_PLT_ENTRY_SIZE,
   2110  1.1     skrll       { 8, MINUS_ONE, 20, FALSE },
   2111  1.1     skrll       12,
   2112  1.1     skrll       NULL
   2113  1.3  christos     },
   2114  1.3  christos   }
   2115  1.3  christos };
   2116  1.3  christos 
   2117  1.3  christos /* FDPIC PLT entries.  Two unimplemented optimizations for lazy
   2118  1.3  christos    binding are to omit the lazy binding stub when linking with -z now
   2119  1.3  christos    and to move lazy binding stubs into a separate region for better
   2120  1.3  christos    cache behavior.  */
   2121  1.3  christos 
   2122  1.3  christos #define FDPIC_PLT_ENTRY_SIZE 28
   2123  1.3  christos #define FDPIC_PLT_LAZY_OFFSET 20
   2124  1.3  christos 
   2125  1.3  christos /* FIXME: The lazy binding stub requires a plt0 - which may need to be
   2126  1.3  christos    duplicated if it is out of range, or which can be inlined.  So
   2127  1.3  christos    right now it is always inlined, which wastes a word per stub.  It
   2128  1.3  christos    might be easier to handle the duplication if we put the lazy
   2129  1.3  christos    stubs separately.  */
   2130  1.3  christos 
   2131  1.3  christos static const bfd_byte fdpic_sh_plt_entry_be[FDPIC_PLT_ENTRY_SIZE] =
   2132  1.3  christos {
   2133  1.3  christos   0xd0, 0x02,	/* mov.l @(12,pc),r0 */
   2134  1.3  christos   0x01, 0xce,	/* mov.l @(r0,r12),r1 */
   2135  1.3  christos   0x70, 0x04,	/* add #4, r0 */
   2136  1.3  christos   0x41, 0x2b,	/* jmp @r1 */
   2137  1.3  christos   0x0c, 0xce,	/* mov.l @(r0,r12),r12 */
   2138  1.3  christos   0x00, 0x09,	/* nop */
   2139  1.3  christos   0, 0, 0, 0,	/* 0: replaced with offset of this symbol's funcdesc */
   2140  1.3  christos   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2141  1.3  christos   0x60, 0xc2,	/* mov.l @r12,r0 */
   2142  1.3  christos   0x40, 0x2b,	/* jmp @r0 */
   2143  1.3  christos   0x53, 0xc1,	/*  mov.l @(4,r12),r3 */
   2144  1.3  christos   0x00, 0x09,	/* nop */
   2145  1.3  christos };
   2146  1.3  christos 
   2147  1.3  christos static const bfd_byte fdpic_sh_plt_entry_le[FDPIC_PLT_ENTRY_SIZE] =
   2148  1.3  christos {
   2149  1.3  christos   0x02, 0xd0,	/* mov.l @(12,pc),r0 */
   2150  1.3  christos   0xce, 0x01,	/* mov.l @(r0,r12),r1 */
   2151  1.3  christos   0x04, 0x70,	/* add #4, r0 */
   2152  1.3  christos   0x2b, 0x41,	/* jmp @r1 */
   2153  1.3  christos   0xce, 0x0c,	/* mov.l @(r0,r12),r12 */
   2154  1.3  christos   0x09, 0x00,	/* nop */
   2155  1.3  christos   0, 0, 0, 0,	/* 0: replaced with offset of this symbol's funcdesc */
   2156  1.3  christos   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2157  1.3  christos   0xc2, 0x60,	/* mov.l @r12,r0 */
   2158  1.3  christos   0x2b, 0x40,	/* jmp @r0 */
   2159  1.3  christos   0xc1, 0x53,	/*  mov.l @(4,r12),r3 */
   2160  1.3  christos   0x09, 0x00,	/* nop */
   2161  1.3  christos };
   2162  1.3  christos 
   2163  1.3  christos static const struct elf_sh_plt_info fdpic_sh_plts[2] = {
   2164  1.3  christos   {
   2165  1.3  christos     /* Big-endian PIC.  */
   2166  1.3  christos     NULL,
   2167  1.3  christos     0,
   2168  1.3  christos     { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2169  1.3  christos     fdpic_sh_plt_entry_be,
   2170  1.3  christos     FDPIC_PLT_ENTRY_SIZE,
   2171  1.3  christos     { 12, MINUS_ONE, 16, FALSE },
   2172  1.3  christos     FDPIC_PLT_LAZY_OFFSET,
   2173  1.3  christos     NULL
   2174  1.3  christos   },
   2175  1.3  christos   {
   2176  1.3  christos     /* Little-endian PIC.  */
   2177  1.3  christos     NULL,
   2178  1.3  christos     0,
   2179  1.3  christos     { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2180  1.3  christos     fdpic_sh_plt_entry_le,
   2181  1.3  christos     FDPIC_PLT_ENTRY_SIZE,
   2182  1.3  christos     { 12, MINUS_ONE, 16, FALSE },
   2183  1.3  christos     FDPIC_PLT_LAZY_OFFSET,
   2184  1.3  christos     NULL
   2185  1.3  christos   },
   2186  1.3  christos };
   2187  1.3  christos 
   2188  1.3  christos /* On SH2A, we can use the movi20 instruction to generate shorter PLT
   2189  1.3  christos    entries for the first 64K slots.  We use the normal FDPIC PLT entry
   2190  1.3  christos    past that point; we could also use movi20s, which might be faster,
   2191  1.3  christos    but would not be any smaller.  */
   2192  1.3  christos 
   2193  1.3  christos #define FDPIC_SH2A_PLT_ENTRY_SIZE 24
   2194  1.3  christos #define FDPIC_SH2A_PLT_LAZY_OFFSET 16
   2195  1.3  christos 
   2196  1.3  christos static const bfd_byte fdpic_sh2a_plt_entry_be[FDPIC_SH2A_PLT_ENTRY_SIZE] =
   2197  1.3  christos {
   2198  1.3  christos   0, 0, 0, 0,	/* movi20 #gotofffuncdesc,r0 */
   2199  1.3  christos   0x01, 0xce,	/* mov.l @(r0,r12),r1 */
   2200  1.3  christos   0x70, 0x04,	/* add #4, r0 */
   2201  1.3  christos   0x41, 0x2b,	/* jmp @r1 */
   2202  1.3  christos   0x0c, 0xce,	/* mov.l @(r0,r12),r12 */
   2203  1.3  christos   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2204  1.3  christos   0x60, 0xc2,	/* mov.l @r12,r0 */
   2205  1.3  christos   0x40, 0x2b,	/* jmp @r0 */
   2206  1.3  christos   0x53, 0xc1,	/*  mov.l @(4,r12),r3 */
   2207  1.3  christos   0x00, 0x09,	/* nop */
   2208  1.3  christos };
   2209  1.3  christos 
   2210  1.3  christos static const bfd_byte fdpic_sh2a_plt_entry_le[FDPIC_SH2A_PLT_ENTRY_SIZE] =
   2211  1.3  christos {
   2212  1.3  christos   0, 0, 0, 0,	/* movi20 #gotofffuncdesc,r0 */
   2213  1.3  christos   0xce, 0x01,	/* mov.l @(r0,r12),r1 */
   2214  1.3  christos   0x04, 0x70,	/* add #4, r0 */
   2215  1.3  christos   0x2b, 0x41,	/* jmp @r1 */
   2216  1.3  christos   0xce, 0x0c,	/* mov.l @(r0,r12),r12 */
   2217  1.3  christos   0, 0, 0, 0,	/* 1: replaced with offset into relocation table.  */
   2218  1.3  christos   0xc2, 0x60,	/* mov.l @r12,r0 */
   2219  1.3  christos   0x2b, 0x40,	/* jmp @r0 */
   2220  1.3  christos   0xc1, 0x53,	/*  mov.l @(4,r12),r3 */
   2221  1.3  christos   0x09, 0x00,	/* nop */
   2222  1.3  christos };
   2223  1.3  christos 
   2224  1.3  christos static const struct elf_sh_plt_info fdpic_sh2a_short_plt_be = {
   2225  1.3  christos   /* Big-endian FDPIC, max index 64K.  */
   2226  1.3  christos   NULL,
   2227  1.3  christos   0,
   2228  1.3  christos   { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2229  1.3  christos   fdpic_sh2a_plt_entry_be,
   2230  1.3  christos   FDPIC_SH2A_PLT_ENTRY_SIZE,
   2231  1.3  christos   { 0, MINUS_ONE, 12, TRUE },
   2232  1.3  christos   FDPIC_SH2A_PLT_LAZY_OFFSET,
   2233  1.3  christos   NULL
   2234  1.3  christos };
   2235  1.3  christos 
   2236  1.3  christos static const struct elf_sh_plt_info fdpic_sh2a_short_plt_le = {
   2237  1.3  christos   /* Little-endian FDPIC, max index 64K.  */
   2238  1.3  christos   NULL,
   2239  1.3  christos   0,
   2240  1.3  christos   { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2241  1.3  christos   fdpic_sh2a_plt_entry_le,
   2242  1.3  christos   FDPIC_SH2A_PLT_ENTRY_SIZE,
   2243  1.3  christos   { 0, MINUS_ONE, 12, TRUE },
   2244  1.3  christos   FDPIC_SH2A_PLT_LAZY_OFFSET,
   2245  1.3  christos   NULL
   2246  1.3  christos };
   2247  1.3  christos 
   2248  1.3  christos static const struct elf_sh_plt_info fdpic_sh2a_plts[2] = {
   2249  1.3  christos   {
   2250  1.3  christos     /* Big-endian PIC.  */
   2251  1.3  christos     NULL,
   2252  1.3  christos     0,
   2253  1.3  christos     { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2254  1.3  christos     fdpic_sh_plt_entry_be,
   2255  1.3  christos     FDPIC_PLT_ENTRY_SIZE,
   2256  1.3  christos     { 12, MINUS_ONE, 16, FALSE },
   2257  1.3  christos     FDPIC_PLT_LAZY_OFFSET,
   2258  1.3  christos     &fdpic_sh2a_short_plt_be
   2259  1.3  christos   },
   2260  1.3  christos   {
   2261  1.3  christos     /* Little-endian PIC.  */
   2262  1.3  christos     NULL,
   2263  1.3  christos     0,
   2264  1.3  christos     { MINUS_ONE, MINUS_ONE, MINUS_ONE },
   2265  1.3  christos     fdpic_sh_plt_entry_le,
   2266  1.3  christos     FDPIC_PLT_ENTRY_SIZE,
   2267  1.3  christos     { 12, MINUS_ONE, 16, FALSE },
   2268  1.3  christos     FDPIC_PLT_LAZY_OFFSET,
   2269  1.1     skrll     &fdpic_sh2a_short_plt_le
   2270  1.1     skrll   },
   2271  1.1     skrll };
   2272  1.1     skrll 
   2273  1.3  christos /* Return the type of PLT associated with ABFD.  PIC_P is true if
   2274  1.1     skrll    the object is position-independent.  */
   2275  1.3  christos 
   2276  1.3  christos static const struct elf_sh_plt_info *
   2277  1.3  christos get_plt_info (bfd *abfd, bfd_boolean pic_p)
   2278  1.3  christos {
   2279  1.3  christos   if (fdpic_object_p (abfd))
   2280  1.3  christos     {
   2281  1.3  christos       /* If any input file requires SH2A we can use a shorter PLT
   2282  1.3  christos 	 sequence.  */
   2283  1.3  christos       if (sh_get_arch_from_bfd_mach (bfd_get_mach (abfd)) & arch_sh2a_base)
   2284  1.1     skrll 	return &fdpic_sh2a_plts[!bfd_big_endian (abfd)];
   2285  1.1     skrll       else
   2286  1.1     skrll 	return &fdpic_sh_plts[!bfd_big_endian (abfd)];
   2287  1.1     skrll     }
   2288  1.1     skrll   if (vxworks_object_p (abfd))
   2289  1.1     skrll     return &vxworks_sh_plts[pic_p][!bfd_big_endian (abfd)];
   2290  1.1     skrll   return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)];
   2291  1.1     skrll }
   2292  1.1     skrll 
   2293  1.1     skrll /* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD.
   2294  1.1     skrll    VALUE is the field's value and CODE_P is true if VALUE refers to code,
   2295  1.1     skrll    not data.  */
   2296  1.1     skrll 
   2297  1.1     skrll inline static void
   2298  1.1     skrll install_plt_field (bfd *output_bfd, bfd_boolean code_p ATTRIBUTE_UNUSED,
   2299  1.1     skrll 		   unsigned long value, bfd_byte *addr)
   2300  1.1     skrll {
   2301  1.3  christos   bfd_put_32 (output_bfd, value, addr);
   2302  1.3  christos }
   2303  1.3  christos #endif
   2304  1.3  christos 
   2305  1.3  christos /* The number of PLT entries which can use a shorter PLT, if any.
   2306  1.3  christos    Currently always 64K, since only SH-2A FDPIC uses this; a
   2307  1.1     skrll    20-bit movi20 can address that many function descriptors below
   2308  1.1     skrll    _GLOBAL_OFFSET_TABLE_.  */
   2309  1.1     skrll #define MAX_SHORT_PLT 65536
   2310  1.1     skrll 
   2311  1.1     skrll /* Return the index of the PLT entry at byte offset OFFSET.  */
   2312  1.3  christos 
   2313  1.3  christos static bfd_vma
   2314  1.3  christos get_plt_index (const struct elf_sh_plt_info *info, bfd_vma offset)
   2315  1.3  christos {
   2316  1.3  christos   bfd_vma plt_index = 0;
   2317  1.3  christos 
   2318  1.3  christos   offset -= info->plt0_entry_size;
   2319  1.3  christos   if (info->short_plt != NULL)
   2320  1.3  christos     {
   2321  1.3  christos       if (offset > MAX_SHORT_PLT * info->short_plt->symbol_entry_size)
   2322  1.3  christos 	{
   2323  1.3  christos 	  plt_index = MAX_SHORT_PLT;
   2324  1.3  christos 	  offset -= MAX_SHORT_PLT * info->short_plt->symbol_entry_size;
   2325  1.3  christos 	}
   2326  1.1     skrll       else
   2327  1.1     skrll 	info = info->short_plt;
   2328  1.1     skrll     }
   2329  1.1     skrll   return plt_index + offset / info->symbol_entry_size;
   2330  1.1     skrll }
   2331  1.3  christos 
   2332  1.1     skrll /* Do the inverse operation.  */
   2333  1.3  christos 
   2334  1.3  christos static bfd_vma
   2335  1.3  christos get_plt_offset (const struct elf_sh_plt_info *info, bfd_vma plt_index)
   2336  1.3  christos {
   2337  1.3  christos   bfd_vma offset = 0;
   2338  1.3  christos 
   2339  1.3  christos   if (info->short_plt != NULL)
   2340  1.3  christos     {
   2341  1.3  christos       if (plt_index > MAX_SHORT_PLT)
   2342  1.3  christos 	{
   2343  1.3  christos 	  offset = MAX_SHORT_PLT * info->short_plt->symbol_entry_size;
   2344  1.3  christos 	  plt_index -= MAX_SHORT_PLT;
   2345  1.3  christos 	}
   2346  1.3  christos       else
   2347  1.1     skrll 	info = info->short_plt;
   2348  1.1     skrll     }
   2349  1.1     skrll   return (offset + info->plt0_entry_size
   2350  1.1     skrll 	  + (plt_index * info->symbol_entry_size));
   2351  1.1     skrll }
   2352  1.1     skrll 
   2353  1.1     skrll /* The sh linker needs to keep track of the number of relocs that it
   2354  1.1     skrll    decides to copy as dynamic relocs in check_relocs for each symbol.
   2355  1.1     skrll    This is so that it can later discard them if they are found to be
   2356  1.1     skrll    unnecessary.  We store the information in a field extending the
   2357  1.1     skrll    regular ELF linker hash table.  */
   2358  1.1     skrll 
   2359  1.1     skrll struct elf_sh_dyn_relocs
   2360  1.1     skrll {
   2361  1.1     skrll   struct elf_sh_dyn_relocs *next;
   2362  1.1     skrll 
   2363  1.1     skrll   /* The input section of the reloc.  */
   2364  1.1     skrll   asection *sec;
   2365  1.1     skrll 
   2366  1.1     skrll   /* Total number of relocs copied for the input section.  */
   2367  1.1     skrll   bfd_size_type count;
   2368  1.1     skrll 
   2369  1.3  christos   /* Number of pc-relative relocs copied for the input section.  */
   2370  1.3  christos   bfd_size_type pc_count;
   2371  1.3  christos };
   2372  1.3  christos 
   2373  1.3  christos union gotref
   2374  1.3  christos {
   2375  1.1     skrll   bfd_signed_vma refcount;
   2376  1.1     skrll   bfd_vma offset;
   2377  1.1     skrll };
   2378  1.1     skrll 
   2379  1.1     skrll /* sh ELF linker hash entry.  */
   2380  1.1     skrll 
   2381  1.1     skrll struct elf_sh_link_hash_entry
   2382  1.1     skrll {
   2383  1.1     skrll   struct elf_link_hash_entry root;
   2384  1.1     skrll 
   2385  1.1     skrll #ifdef INCLUDE_SHMEDIA
   2386  1.1     skrll   union
   2387  1.1     skrll   {
   2388  1.1     skrll     bfd_signed_vma refcount;
   2389  1.1     skrll     bfd_vma offset;
   2390  1.1     skrll   } datalabel_got;
   2391  1.1     skrll #endif
   2392  1.1     skrll 
   2393  1.1     skrll   /* Track dynamic relocs copied for this symbol.  */
   2394  1.3  christos   struct elf_sh_dyn_relocs *dyn_relocs;
   2395  1.3  christos 
   2396  1.3  christos   bfd_signed_vma gotplt_refcount;
   2397  1.3  christos 
   2398  1.3  christos   /* A local function descriptor, for FDPIC.  The refcount counts
   2399  1.3  christos      R_SH_FUNCDESC, R_SH_GOTOFFFUNCDESC, and R_SH_GOTOFFFUNCDESC20
   2400  1.3  christos      relocations; the PLT and GOT entry are accounted
   2401  1.3  christos      for separately.  After adjust_dynamic_symbol, the offset is
   2402  1.3  christos      MINUS_ONE if there is no local descriptor (dynamic linker
   2403  1.3  christos      managed and no PLT entry, or undefined weak non-dynamic).
   2404  1.3  christos      During check_relocs we do not yet know whether the local
   2405  1.3  christos      descriptor will be canonical.  */
   2406  1.3  christos   union gotref funcdesc;
   2407  1.3  christos 
   2408  1.1     skrll   /* How many of the above refcounted relocations were R_SH_FUNCDESC,
   2409  1.3  christos      and thus require fixups or relocations.  */
   2410  1.3  christos   bfd_signed_vma abs_funcdesc_refcount;
   2411  1.1     skrll 
   2412  1.1     skrll   enum {
   2413  1.1     skrll     GOT_UNKNOWN = 0, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE, GOT_FUNCDESC
   2414  1.1     skrll   } got_type;
   2415  1.1     skrll };
   2416  1.1     skrll 
   2417  1.1     skrll #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
   2418  1.1     skrll 
   2419  1.3  christos struct sh_elf_obj_tdata
   2420  1.3  christos {
   2421  1.3  christos   struct elf_obj_tdata root;
   2422  1.3  christos 
   2423  1.3  christos   /* got_type for each local got entry.  */
   2424  1.1     skrll   char *local_got_type;
   2425  1.1     skrll 
   2426  1.1     skrll   /* Function descriptor refcount and offset for each local symbol.  */
   2427  1.1     skrll   union gotref *local_funcdesc;
   2428  1.1     skrll };
   2429  1.3  christos 
   2430  1.3  christos #define sh_elf_tdata(abfd) \
   2431  1.3  christos   ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
   2432  1.3  christos 
   2433  1.3  christos #define sh_elf_local_got_type(abfd) \
   2434  1.1     skrll   (sh_elf_tdata (abfd)->local_got_type)
   2435  1.1     skrll 
   2436  1.1     skrll #define sh_elf_local_funcdesc(abfd) \
   2437  1.1     skrll   (sh_elf_tdata (abfd)->local_funcdesc)
   2438  1.3  christos 
   2439  1.1     skrll #define is_sh_elf(bfd) \
   2440  1.1     skrll   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
   2441  1.1     skrll    && elf_tdata (bfd) != NULL \
   2442  1.1     skrll    && elf_object_id (bfd) == SH_ELF_DATA)
   2443  1.1     skrll 
   2444  1.1     skrll /* Override the generic function because we need to store sh_elf_obj_tdata
   2445  1.1     skrll    as the specific tdata.  */
   2446  1.1     skrll 
   2447  1.3  christos static bfd_boolean
   2448  1.1     skrll sh_elf_mkobject (bfd *abfd)
   2449  1.1     skrll {
   2450  1.1     skrll   return bfd_elf_allocate_object (abfd, sizeof (struct sh_elf_obj_tdata),
   2451  1.1     skrll 				  SH_ELF_DATA);
   2452  1.1     skrll }
   2453  1.1     skrll 
   2454  1.1     skrll /* sh ELF linker hash table.  */
   2455  1.1     skrll 
   2456  1.1     skrll struct elf_sh_link_hash_table
   2457  1.1     skrll {
   2458  1.1     skrll   struct elf_link_hash_table root;
   2459  1.1     skrll 
   2460  1.1     skrll   /* Short-cuts to get to dynamic linker sections.  */
   2461  1.1     skrll   asection *sgot;
   2462  1.1     skrll   asection *sgotplt;
   2463  1.1     skrll   asection *srelgot;
   2464  1.3  christos   asection *splt;
   2465  1.3  christos   asection *srelplt;
   2466  1.3  christos   asection *sdynbss;
   2467  1.1     skrll   asection *srelbss;
   2468  1.1     skrll   asection *sfuncdesc;
   2469  1.1     skrll   asection *srelfuncdesc;
   2470  1.1     skrll   asection *srofixup;
   2471  1.3  christos 
   2472  1.3  christos   /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
   2473  1.1     skrll   asection *srelplt2;
   2474  1.1     skrll 
   2475  1.1     skrll   /* Small local sym cache.  */
   2476  1.1     skrll   struct sym_cache sym_cache;
   2477  1.1     skrll 
   2478  1.1     skrll   /* A counter or offset to track a TLS got entry.  */
   2479  1.1     skrll   union
   2480  1.1     skrll     {
   2481  1.1     skrll       bfd_signed_vma refcount;
   2482  1.1     skrll       bfd_vma offset;
   2483  1.1     skrll     } tls_ldm_got;
   2484  1.1     skrll 
   2485  1.1     skrll   /* The type of PLT to use.  */
   2486  1.3  christos   const struct elf_sh_plt_info *plt_info;
   2487  1.3  christos 
   2488  1.3  christos   /* True if the target system is VxWorks.  */
   2489  1.1     skrll   bfd_boolean vxworks_p;
   2490  1.1     skrll 
   2491  1.1     skrll   /* True if the target system uses FDPIC.  */
   2492  1.1     skrll   bfd_boolean fdpic_p;
   2493  1.1     skrll };
   2494  1.1     skrll 
   2495  1.1     skrll /* Traverse an sh ELF linker hash table.  */
   2496  1.1     skrll 
   2497  1.1     skrll #define sh_elf_link_hash_traverse(table, func, info)			\
   2498  1.1     skrll   (elf_link_hash_traverse						\
   2499  1.1     skrll    (&(table)->root,							\
   2500  1.1     skrll     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
   2501  1.1     skrll     (info)))
   2502  1.3  christos 
   2503  1.3  christos /* Get the sh ELF linker hash table from a link_info structure.  */
   2504  1.1     skrll 
   2505  1.1     skrll #define sh_elf_hash_table(p) \
   2506  1.1     skrll   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
   2507  1.1     skrll   == SH_ELF_DATA ? ((struct elf_sh_link_hash_table *) ((p)->hash)) : NULL)
   2508  1.1     skrll 
   2509  1.1     skrll /* Create an entry in an sh ELF linker hash table.  */
   2510  1.1     skrll 
   2511  1.1     skrll static struct bfd_hash_entry *
   2512  1.1     skrll sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
   2513  1.1     skrll 			  struct bfd_hash_table *table,
   2514  1.1     skrll 			  const char *string)
   2515  1.1     skrll {
   2516  1.1     skrll   struct elf_sh_link_hash_entry *ret =
   2517  1.1     skrll     (struct elf_sh_link_hash_entry *) entry;
   2518  1.1     skrll 
   2519  1.1     skrll   /* Allocate the structure if it has not already been allocated by a
   2520  1.1     skrll      subclass.  */
   2521  1.1     skrll   if (ret == (struct elf_sh_link_hash_entry *) NULL)
   2522  1.1     skrll     ret = ((struct elf_sh_link_hash_entry *)
   2523  1.1     skrll 	   bfd_hash_allocate (table,
   2524  1.1     skrll 			      sizeof (struct elf_sh_link_hash_entry)));
   2525  1.1     skrll   if (ret == (struct elf_sh_link_hash_entry *) NULL)
   2526  1.1     skrll     return (struct bfd_hash_entry *) ret;
   2527  1.1     skrll 
   2528  1.1     skrll   /* Call the allocation method of the superclass.  */
   2529  1.1     skrll   ret = ((struct elf_sh_link_hash_entry *)
   2530  1.1     skrll 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   2531  1.1     skrll 				     table, string));
   2532  1.1     skrll   if (ret != (struct elf_sh_link_hash_entry *) NULL)
   2533  1.1     skrll     {
   2534  1.1     skrll       ret->dyn_relocs = NULL;
   2535  1.3  christos       ret->gotplt_refcount = 0;
   2536  1.3  christos #ifdef INCLUDE_SHMEDIA
   2537  1.3  christos       ret->datalabel_got.refcount = ret->root.got.refcount;
   2538  1.1     skrll #endif
   2539  1.1     skrll       ret->funcdesc.refcount = 0;
   2540  1.1     skrll       ret->abs_funcdesc_refcount = 0;
   2541  1.1     skrll       ret->got_type = GOT_UNKNOWN;
   2542  1.1     skrll     }
   2543  1.1     skrll 
   2544  1.1     skrll   return (struct bfd_hash_entry *) ret;
   2545  1.1     skrll }
   2546  1.1     skrll 
   2547  1.1     skrll /* Create an sh ELF linker hash table.  */
   2548  1.1     skrll 
   2549  1.1     skrll static struct bfd_link_hash_table *
   2550  1.1     skrll sh_elf_link_hash_table_create (bfd *abfd)
   2551  1.1     skrll {
   2552  1.1     skrll   struct elf_sh_link_hash_table *ret;
   2553  1.1     skrll   bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
   2554  1.1     skrll 
   2555  1.1     skrll   ret = (struct elf_sh_link_hash_table *) bfd_malloc (amt);
   2556  1.1     skrll   if (ret == (struct elf_sh_link_hash_table *) NULL)
   2557  1.3  christos     return NULL;
   2558  1.3  christos 
   2559  1.1     skrll   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
   2560  1.1     skrll 				      sh_elf_link_hash_newfunc,
   2561  1.1     skrll 				      sizeof (struct elf_sh_link_hash_entry),
   2562  1.1     skrll 				      SH_ELF_DATA))
   2563  1.1     skrll     {
   2564  1.1     skrll       free (ret);
   2565  1.1     skrll       return NULL;
   2566  1.1     skrll     }
   2567  1.1     skrll 
   2568  1.1     skrll   ret->sgot = NULL;
   2569  1.1     skrll   ret->sgotplt = NULL;
   2570  1.1     skrll   ret->srelgot = NULL;
   2571  1.1     skrll   ret->splt = NULL;
   2572  1.3  christos   ret->srelplt = NULL;
   2573  1.1     skrll   ret->sdynbss = NULL;
   2574  1.1     skrll   ret->srelbss = NULL;
   2575  1.1     skrll   ret->srelplt2 = NULL;
   2576  1.3  christos   ret->sym_cache.abfd = NULL;
   2577  1.1     skrll   ret->tls_ldm_got.refcount = 0;
   2578  1.1     skrll   ret->plt_info = NULL;
   2579  1.1     skrll   ret->vxworks_p = vxworks_object_p (abfd);
   2580  1.1     skrll   ret->fdpic_p = fdpic_object_p (abfd);
   2581  1.3  christos 
   2582  1.3  christos   return &ret->root.root;
   2583  1.3  christos }
   2584  1.3  christos 
   2585  1.3  christos static bfd_boolean
   2586  1.3  christos sh_elf_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
   2587  1.3  christos 			    struct bfd_link_info *info, asection *p)
   2588  1.3  christos {
   2589  1.3  christos   struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
   2590  1.3  christos 
   2591  1.3  christos   /* Non-FDPIC binaries do not need dynamic symbols for sections.  */
   2592  1.3  christos   if (!htab->fdpic_p)
   2593  1.3  christos     return TRUE;
   2594  1.3  christos 
   2595  1.3  christos   /* We need dynamic symbols for every section, since segments can
   2596  1.3  christos      relocate independently.  */
   2597  1.3  christos   switch (elf_section_data (p)->this_hdr.sh_type)
   2598  1.3  christos     {
   2599  1.3  christos     case SHT_PROGBITS:
   2600  1.3  christos     case SHT_NOBITS:
   2601  1.3  christos       /* If sh_type is yet undecided, assume it could be
   2602  1.3  christos 	 SHT_PROGBITS/SHT_NOBITS.  */
   2603  1.3  christos     case SHT_NULL:
   2604  1.3  christos       return FALSE;
   2605  1.3  christos 
   2606  1.3  christos       /* There shouldn't be section relative relocations
   2607  1.3  christos 	 against any other section.  */
   2608  1.3  christos     default:
   2609  1.1     skrll       return TRUE;
   2610  1.1     skrll     }
   2611  1.1     skrll }
   2612  1.1     skrll 
   2613  1.1     skrll /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
   2614  1.1     skrll    shortcuts to them in our hash table.  */
   2615  1.1     skrll 
   2616  1.1     skrll static bfd_boolean
   2617  1.1     skrll create_got_section (bfd *dynobj, struct bfd_link_info *info)
   2618  1.1     skrll {
   2619  1.1     skrll   struct elf_sh_link_hash_table *htab;
   2620  1.1     skrll 
   2621  1.3  christos   if (! _bfd_elf_create_got_section (dynobj, info))
   2622  1.3  christos     return FALSE;
   2623  1.3  christos 
   2624  1.1     skrll   htab = sh_elf_hash_table (info);
   2625  1.1     skrll   if (htab == NULL)
   2626  1.3  christos     return FALSE;
   2627  1.3  christos 
   2628  1.1     skrll   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
   2629  1.1     skrll   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
   2630  1.3  christos   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   2631  1.3  christos   if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
   2632  1.3  christos     abort ();
   2633  1.3  christos 
   2634  1.3  christos   htab->sfuncdesc = bfd_make_section_with_flags (dynobj, ".got.funcdesc",
   2635  1.3  christos 						 (SEC_ALLOC | SEC_LOAD
   2636  1.3  christos 						  | SEC_HAS_CONTENTS
   2637  1.3  christos 						  | SEC_IN_MEMORY
   2638  1.3  christos 						  | SEC_LINKER_CREATED));
   2639  1.3  christos   if (htab->sfuncdesc == NULL
   2640  1.3  christos       || ! bfd_set_section_alignment (dynobj, htab->sfuncdesc, 2))
   2641  1.3  christos     return FALSE;
   2642  1.3  christos 
   2643  1.3  christos   htab->srelfuncdesc = bfd_make_section_with_flags (dynobj,
   2644  1.3  christos 						    ".rela.got.funcdesc",
   2645  1.3  christos 						    (SEC_ALLOC | SEC_LOAD
   2646  1.3  christos 						     | SEC_HAS_CONTENTS
   2647  1.3  christos 						     | SEC_IN_MEMORY
   2648  1.3  christos 						     | SEC_LINKER_CREATED
   2649  1.3  christos 						     | SEC_READONLY));
   2650  1.3  christos   if (htab->srelfuncdesc == NULL
   2651  1.3  christos       || ! bfd_set_section_alignment (dynobj, htab->srelfuncdesc, 2))
   2652  1.3  christos     return FALSE;
   2653  1.3  christos 
   2654  1.3  christos   /* Also create .rofixup.  */
   2655  1.3  christos   htab->srofixup = bfd_make_section_with_flags (dynobj, ".rofixup",
   2656  1.3  christos 						(SEC_ALLOC | SEC_LOAD
   2657  1.3  christos 						 | SEC_HAS_CONTENTS
   2658  1.3  christos 						 | SEC_IN_MEMORY
   2659  1.1     skrll 						 | SEC_LINKER_CREATED
   2660  1.3  christos 						 | SEC_READONLY));
   2661  1.1     skrll   if (htab->srofixup == NULL
   2662  1.1     skrll       || ! bfd_set_section_alignment (dynobj, htab->srofixup, 2))
   2663  1.1     skrll     return FALSE;
   2664  1.1     skrll 
   2665  1.1     skrll   return TRUE;
   2666  1.1     skrll }
   2667  1.1     skrll 
   2668  1.1     skrll /* Create dynamic sections when linking against a dynamic object.  */
   2669  1.1     skrll 
   2670  1.1     skrll static bfd_boolean
   2671  1.3  christos sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   2672  1.1     skrll {
   2673  1.1     skrll   struct elf_sh_link_hash_table *htab;
   2674  1.1     skrll   flagword flags, pltflags;
   2675  1.1     skrll   asection *s;
   2676  1.1     skrll   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   2677  1.1     skrll   int ptralign = 0;
   2678  1.1     skrll 
   2679  1.1     skrll   switch (bed->s->arch_size)
   2680  1.1     skrll     {
   2681  1.1     skrll     case 32:
   2682  1.1     skrll       ptralign = 2;
   2683  1.1     skrll       break;
   2684  1.1     skrll 
   2685  1.1     skrll     case 64:
   2686  1.1     skrll       ptralign = 3;
   2687  1.1     skrll       break;
   2688  1.1     skrll 
   2689  1.1     skrll     default:
   2690  1.1     skrll       bfd_set_error (bfd_error_bad_value);
   2691  1.3  christos       return FALSE;
   2692  1.3  christos     }
   2693  1.3  christos 
   2694  1.1     skrll   htab = sh_elf_hash_table (info);
   2695  1.1     skrll   if (htab == NULL)
   2696  1.1     skrll     return FALSE;
   2697  1.1     skrll 
   2698  1.1     skrll   if (htab->root.dynamic_sections_created)
   2699  1.1     skrll     return TRUE;
   2700  1.1     skrll 
   2701  1.1     skrll   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
   2702  1.1     skrll      .rel[a].bss sections.  */
   2703  1.1     skrll 
   2704  1.1     skrll   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   2705  1.1     skrll 	   | SEC_LINKER_CREATED);
   2706  1.1     skrll 
   2707  1.1     skrll   pltflags = flags;
   2708  1.1     skrll   pltflags |= SEC_CODE;
   2709  1.1     skrll   if (bed->plt_not_loaded)
   2710  1.1     skrll     pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
   2711  1.1     skrll   if (bed->plt_readonly)
   2712  1.1     skrll     pltflags |= SEC_READONLY;
   2713  1.1     skrll 
   2714  1.1     skrll   s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
   2715  1.1     skrll   htab->splt = s;
   2716  1.1     skrll   if (s == NULL
   2717  1.1     skrll       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
   2718  1.1     skrll     return FALSE;
   2719  1.1     skrll 
   2720  1.1     skrll   if (bed->want_plt_sym)
   2721  1.1     skrll     {
   2722  1.1     skrll       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
   2723  1.1     skrll 	 .plt section.  */
   2724  1.1     skrll       struct elf_link_hash_entry *h;
   2725  1.1     skrll       struct bfd_link_hash_entry *bh = NULL;
   2726  1.1     skrll 
   2727  1.1     skrll       if (! (_bfd_generic_link_add_one_symbol
   2728  1.1     skrll 	     (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
   2729  1.1     skrll 	      (bfd_vma) 0, (const char *) NULL, FALSE,
   2730  1.1     skrll 	      get_elf_backend_data (abfd)->collect, &bh)))
   2731  1.1     skrll 	return FALSE;
   2732  1.1     skrll 
   2733  1.1     skrll       h = (struct elf_link_hash_entry *) bh;
   2734  1.1     skrll       h->def_regular = 1;
   2735  1.1     skrll       h->type = STT_OBJECT;
   2736  1.1     skrll       htab->root.hplt = h;
   2737  1.1     skrll 
   2738  1.1     skrll       if (info->shared
   2739  1.1     skrll 	  && ! bfd_elf_link_record_dynamic_symbol (info, h))
   2740  1.1     skrll 	return FALSE;
   2741  1.1     skrll     }
   2742  1.1     skrll 
   2743  1.1     skrll   s = bfd_make_section_with_flags (abfd,
   2744  1.1     skrll 				   bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
   2745  1.1     skrll 				   flags | SEC_READONLY);
   2746  1.1     skrll   htab->srelplt = s;
   2747  1.1     skrll   if (s == NULL
   2748  1.1     skrll       || ! bfd_set_section_alignment (abfd, s, ptralign))
   2749  1.1     skrll     return FALSE;
   2750  1.1     skrll 
   2751  1.1     skrll   if (htab->sgot == NULL
   2752  1.1     skrll       && !create_got_section (abfd, info))
   2753  1.1     skrll     return FALSE;
   2754  1.1     skrll 
   2755  1.1     skrll   {
   2756  1.1     skrll     const char *secname;
   2757  1.1     skrll     char *relname;
   2758  1.1     skrll     flagword secflags;
   2759  1.1     skrll     asection *sec;
   2760  1.1     skrll 
   2761  1.1     skrll     for (sec = abfd->sections; sec; sec = sec->next)
   2762  1.1     skrll       {
   2763  1.1     skrll 	secflags = bfd_get_section_flags (abfd, sec);
   2764  1.1     skrll 	if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
   2765  1.1     skrll 	    || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
   2766  1.1     skrll 	  continue;
   2767  1.1     skrll 	secname = bfd_get_section_name (abfd, sec);
   2768  1.1     skrll 	relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
   2769  1.1     skrll 	strcpy (relname, ".rela");
   2770  1.1     skrll 	strcat (relname, secname);
   2771  1.1     skrll 	if (bfd_get_section_by_name (abfd, secname))
   2772  1.1     skrll 	  continue;
   2773  1.1     skrll 	s = bfd_make_section_with_flags (abfd, relname,
   2774  1.1     skrll 					 flags | SEC_READONLY);
   2775  1.1     skrll 	if (s == NULL
   2776  1.1     skrll 	    || ! bfd_set_section_alignment (abfd, s, ptralign))
   2777  1.1     skrll 	  return FALSE;
   2778  1.1     skrll       }
   2779  1.1     skrll   }
   2780  1.1     skrll 
   2781  1.1     skrll   if (bed->want_dynbss)
   2782  1.1     skrll     {
   2783  1.1     skrll       /* The .dynbss section is a place to put symbols which are defined
   2784  1.1     skrll 	 by dynamic objects, are referenced by regular objects, and are
   2785  1.1     skrll 	 not functions.  We must allocate space for them in the process
   2786  1.1     skrll 	 image and use a R_*_COPY reloc to tell the dynamic linker to
   2787  1.1     skrll 	 initialize them at run time.  The linker script puts the .dynbss
   2788  1.1     skrll 	 section into the .bss section of the final image.  */
   2789  1.1     skrll       s = bfd_make_section_with_flags (abfd, ".dynbss",
   2790  1.1     skrll 				       SEC_ALLOC | SEC_LINKER_CREATED);
   2791  1.1     skrll       htab->sdynbss = s;
   2792  1.1     skrll       if (s == NULL)
   2793  1.1     skrll 	return FALSE;
   2794  1.1     skrll 
   2795  1.1     skrll       /* The .rel[a].bss section holds copy relocs.  This section is not
   2796  1.1     skrll 	 normally needed.  We need to create it here, though, so that the
   2797  1.1     skrll 	 linker will map it to an output section.  We can't just create it
   2798  1.1     skrll 	 only if we need it, because we will not know whether we need it
   2799  1.1     skrll 	 until we have seen all the input files, and the first time the
   2800  1.1     skrll 	 main linker code calls BFD after examining all the input files
   2801  1.1     skrll 	 (size_dynamic_sections) the input sections have already been
   2802  1.1     skrll 	 mapped to the output sections.  If the section turns out not to
   2803  1.1     skrll 	 be needed, we can discard it later.  We will never need this
   2804  1.1     skrll 	 section when generating a shared object, since they do not use
   2805  1.1     skrll 	 copy relocs.  */
   2806  1.1     skrll       if (! info->shared)
   2807  1.1     skrll 	{
   2808  1.1     skrll 	  s = bfd_make_section_with_flags (abfd,
   2809  1.1     skrll 					   (bed->default_use_rela_p
   2810  1.1     skrll 					    ? ".rela.bss" : ".rel.bss"),
   2811  1.1     skrll 					   flags | SEC_READONLY);
   2812  1.1     skrll 	  htab->srelbss = s;
   2813  1.1     skrll 	  if (s == NULL
   2814  1.1     skrll 	      || ! bfd_set_section_alignment (abfd, s, ptralign))
   2815  1.1     skrll 	    return FALSE;
   2816  1.1     skrll 	}
   2817  1.1     skrll     }
   2818  1.1     skrll 
   2819  1.1     skrll   if (htab->vxworks_p)
   2820  1.1     skrll     {
   2821  1.1     skrll       if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
   2822  1.1     skrll 	return FALSE;
   2823  1.1     skrll     }
   2824  1.1     skrll 
   2825  1.1     skrll   return TRUE;
   2826  1.1     skrll }
   2827  1.1     skrll 
   2828  1.1     skrll /* Adjust a symbol defined by a dynamic object and referenced by a
   2830  1.1     skrll    regular object.  The current definition is in some section of the
   2831  1.1     skrll    dynamic object, but we're not including those sections.  We have to
   2832  1.1     skrll    change the definition to something the rest of the link can
   2833  1.1     skrll    understand.  */
   2834  1.1     skrll 
   2835  1.1     skrll static bfd_boolean
   2836  1.1     skrll sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   2837  1.1     skrll 			      struct elf_link_hash_entry *h)
   2838  1.1     skrll {
   2839  1.1     skrll   struct elf_sh_link_hash_table *htab;
   2840  1.3  christos   struct elf_sh_link_hash_entry *eh;
   2841  1.3  christos   struct elf_sh_dyn_relocs *p;
   2842  1.1     skrll   asection *s;
   2843  1.1     skrll 
   2844  1.1     skrll   htab = sh_elf_hash_table (info);
   2845  1.1     skrll   if (htab == NULL)
   2846  1.1     skrll     return FALSE;
   2847  1.1     skrll 
   2848  1.1     skrll   /* Make sure we know what is going on here.  */
   2849  1.1     skrll   BFD_ASSERT (htab->root.dynobj != NULL
   2850  1.1     skrll 	      && (h->needs_plt
   2851  1.1     skrll 		  || h->u.weakdef != NULL
   2852  1.1     skrll 		  || (h->def_dynamic
   2853  1.1     skrll 		      && h->ref_regular
   2854  1.1     skrll 		      && !h->def_regular)));
   2855  1.1     skrll 
   2856  1.1     skrll   /* If this is a function, put it in the procedure linkage table.  We
   2857  1.1     skrll      will fill in the contents of the procedure linkage table later,
   2858  1.1     skrll      when we know the address of the .got section.  */
   2859  1.1     skrll   if (h->type == STT_FUNC
   2860  1.1     skrll       || h->needs_plt)
   2861  1.1     skrll     {
   2862  1.1     skrll       if (h->plt.refcount <= 0
   2863  1.1     skrll 	  || SYMBOL_CALLS_LOCAL (info, h)
   2864  1.1     skrll 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   2865  1.1     skrll 	      && h->root.type == bfd_link_hash_undefweak))
   2866  1.1     skrll 	{
   2867  1.1     skrll 	  /* This case can occur if we saw a PLT reloc in an input
   2868  1.1     skrll 	     file, but the symbol was never referred to by a dynamic
   2869  1.1     skrll 	     object.  In such a case, we don't actually need to build
   2870  1.1     skrll 	     a procedure linkage table, and we can just do a REL32
   2871  1.1     skrll 	     reloc instead.  */
   2872  1.1     skrll 	  h->plt.offset = (bfd_vma) -1;
   2873  1.1     skrll 	  h->needs_plt = 0;
   2874  1.1     skrll 	}
   2875  1.1     skrll 
   2876  1.1     skrll       return TRUE;
   2877  1.1     skrll     }
   2878  1.1     skrll   else
   2879  1.1     skrll     h->plt.offset = (bfd_vma) -1;
   2880  1.1     skrll 
   2881  1.1     skrll   /* If this is a weak symbol, and there is a real definition, the
   2882  1.1     skrll      processor independent code will have arranged for us to see the
   2883  1.1     skrll      real definition first, and we can just use the same value.  */
   2884  1.1     skrll   if (h->u.weakdef != NULL)
   2885  1.1     skrll     {
   2886  1.1     skrll       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   2887  1.1     skrll 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
   2888  1.1     skrll       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   2889  1.1     skrll       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   2890  1.1     skrll       if (info->nocopyreloc)
   2891  1.1     skrll 	h->non_got_ref = h->u.weakdef->non_got_ref;
   2892  1.1     skrll       return TRUE;
   2893  1.1     skrll     }
   2894  1.1     skrll 
   2895  1.1     skrll   /* This is a reference to a symbol defined by a dynamic object which
   2896  1.1     skrll      is not a function.  */
   2897  1.1     skrll 
   2898  1.1     skrll   /* If we are creating a shared library, we must presume that the
   2899  1.1     skrll      only references to the symbol are via the global offset table.
   2900  1.1     skrll      For such cases we need not do anything here; the relocations will
   2901  1.1     skrll      be handled correctly by relocate_section.  */
   2902  1.1     skrll   if (info->shared)
   2903  1.1     skrll     return TRUE;
   2904  1.1     skrll 
   2905  1.1     skrll   /* If there are no references to this symbol that do not use the
   2906  1.1     skrll      GOT, we don't need to generate a copy reloc.  */
   2907  1.1     skrll   if (!h->non_got_ref)
   2908  1.1     skrll     return TRUE;
   2909  1.1     skrll 
   2910  1.1     skrll   /* If -z nocopyreloc was given, we won't generate them either.  */
   2911  1.1     skrll   if (info->nocopyreloc)
   2912  1.1     skrll     {
   2913  1.1     skrll       h->non_got_ref = 0;
   2914  1.1     skrll       return TRUE;
   2915  1.1     skrll     }
   2916  1.1     skrll 
   2917  1.1     skrll   eh = (struct elf_sh_link_hash_entry *) h;
   2918  1.1     skrll   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2919  1.1     skrll     {
   2920  1.1     skrll       s = p->sec->output_section;
   2921  1.1     skrll       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
   2922  1.1     skrll 	break;
   2923  1.1     skrll     }
   2924  1.1     skrll 
   2925  1.1     skrll   /* If we didn't find any dynamic relocs in sections which needs the
   2926  1.1     skrll      copy reloc, then we'll be keeping the dynamic relocs and avoiding
   2927  1.1     skrll      the copy reloc.  */
   2928  1.1     skrll   if (p == NULL)
   2929  1.1     skrll     {
   2930  1.1     skrll       h->non_got_ref = 0;
   2931  1.1     skrll       return TRUE;
   2932  1.1     skrll     }
   2933  1.1     skrll 
   2934  1.1     skrll   if (h->size == 0)
   2935  1.1     skrll     {
   2936  1.1     skrll       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
   2937  1.1     skrll 			     h->root.root.string);
   2938  1.1     skrll       return TRUE;
   2939  1.1     skrll     }
   2940  1.1     skrll 
   2941  1.1     skrll   /* We must allocate the symbol in our .dynbss section, which will
   2942  1.1     skrll      become part of the .bss section of the executable.  There will be
   2943  1.1     skrll      an entry for this symbol in the .dynsym section.  The dynamic
   2944  1.1     skrll      object will contain position independent code, so all references
   2945  1.1     skrll      from the dynamic object to this symbol will go through the global
   2946  1.1     skrll      offset table.  The dynamic linker will use the .dynsym entry to
   2947  1.1     skrll      determine the address it must put in the global offset table, so
   2948  1.1     skrll      both the dynamic object and the regular object will refer to the
   2949  1.1     skrll      same memory location for the variable.  */
   2950  1.1     skrll 
   2951  1.1     skrll   s = htab->sdynbss;
   2952  1.1     skrll   BFD_ASSERT (s != NULL);
   2953  1.1     skrll 
   2954  1.1     skrll   /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
   2955  1.1     skrll      copy the initial value out of the dynamic object and into the
   2956  1.1     skrll      runtime process image.  We need to remember the offset into the
   2957  1.1     skrll      .rela.bss section we are going to use.  */
   2958  1.1     skrll   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
   2959  1.1     skrll     {
   2960  1.1     skrll       asection *srel;
   2961  1.1     skrll 
   2962  1.1     skrll       srel = htab->srelbss;
   2963  1.1     skrll       BFD_ASSERT (srel != NULL);
   2964  1.1     skrll       srel->size += sizeof (Elf32_External_Rela);
   2965  1.1     skrll       h->needs_copy = 1;
   2966  1.1     skrll     }
   2967  1.1     skrll 
   2968  1.1     skrll   return _bfd_elf_adjust_dynamic_copy (h, s);
   2969  1.1     skrll }
   2970  1.1     skrll 
   2971  1.1     skrll /* Allocate space in .plt, .got and associated reloc sections for
   2972  1.1     skrll    dynamic relocs.  */
   2973  1.1     skrll 
   2974  1.1     skrll static bfd_boolean
   2975  1.1     skrll allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   2976  1.1     skrll {
   2977  1.1     skrll   struct bfd_link_info *info;
   2978  1.1     skrll   struct elf_sh_link_hash_table *htab;
   2979  1.1     skrll   struct elf_sh_link_hash_entry *eh;
   2980  1.1     skrll   struct elf_sh_dyn_relocs *p;
   2981  1.1     skrll 
   2982  1.1     skrll   if (h->root.type == bfd_link_hash_indirect)
   2983  1.1     skrll     return TRUE;
   2984  1.1     skrll 
   2985  1.1     skrll   if (h->root.type == bfd_link_hash_warning)
   2986  1.1     skrll     /* When warning symbols are created, they **replace** the "real"
   2987  1.1     skrll        entry in the hash table, thus we never get to see the real
   2988  1.3  christos        symbol in a hash traversal.  So look at it now.  */
   2989  1.3  christos     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2990  1.1     skrll 
   2991  1.1     skrll   info = (struct bfd_link_info *) inf;
   2992  1.1     skrll   htab = sh_elf_hash_table (info);
   2993  1.1     skrll   if (htab == NULL)
   2994  1.1     skrll     return FALSE;
   2995  1.1     skrll 
   2996  1.1     skrll   eh = (struct elf_sh_link_hash_entry *) h;
   2997  1.1     skrll   if ((h->got.refcount > 0
   2998  1.1     skrll        || h->forced_local)
   2999  1.1     skrll       && eh->gotplt_refcount > 0)
   3000  1.1     skrll     {
   3001  1.1     skrll       /* The symbol has been forced local, or we have some direct got refs,
   3002  1.1     skrll 	 so treat all the gotplt refs as got refs. */
   3003  1.1     skrll       h->got.refcount += eh->gotplt_refcount;
   3004  1.1     skrll       if (h->plt.refcount >= eh->gotplt_refcount)
   3005  1.1     skrll 	h->plt.refcount -= eh->gotplt_refcount;
   3006  1.1     skrll     }
   3007  1.1     skrll 
   3008  1.1     skrll   if (htab->root.dynamic_sections_created
   3009  1.1     skrll       && h->plt.refcount > 0
   3010  1.1     skrll       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3011  1.1     skrll 	  || h->root.type != bfd_link_hash_undefweak))
   3012  1.1     skrll     {
   3013  1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   3014  1.1     skrll 	 Undefined weak syms won't yet be marked as dynamic.  */
   3015  1.1     skrll       if (h->dynindx == -1
   3016  1.1     skrll 	  && !h->forced_local)
   3017  1.1     skrll 	{
   3018  1.1     skrll 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3019  1.1     skrll 	    return FALSE;
   3020  1.1     skrll 	}
   3021  1.3  christos 
   3022  1.1     skrll       if (info->shared
   3023  1.1     skrll 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
   3024  1.1     skrll 	{
   3025  1.1     skrll 	  asection *s = htab->splt;
   3026  1.1     skrll 	  const struct elf_sh_plt_info *plt_info;
   3027  1.1     skrll 
   3028  1.1     skrll 	  /* If this is the first .plt entry, make room for the special
   3029  1.1     skrll 	     first entry.  */
   3030  1.1     skrll 	  if (s->size == 0)
   3031  1.1     skrll 	    s->size += htab->plt_info->plt0_entry_size;
   3032  1.1     skrll 
   3033  1.1     skrll 	  h->plt.offset = s->size;
   3034  1.3  christos 
   3035  1.3  christos 	  /* If this symbol is not defined in a regular file, and we are
   3036  1.3  christos 	     not generating a shared library, then set the symbol to this
   3037  1.3  christos 	     location in the .plt.  This is required to make function
   3038  1.1     skrll 	     pointers compare as equal between the normal executable and
   3039  1.1     skrll 	     the shared library.  Skip this for FDPIC, since the
   3040  1.1     skrll 	     function's address will be the address of the canonical
   3041  1.1     skrll 	     function descriptor.  */
   3042  1.1     skrll 	  if (!htab->fdpic_p && !info->shared && !h->def_regular)
   3043  1.1     skrll 	    {
   3044  1.3  christos 	      h->root.u.def.section = s;
   3045  1.3  christos 	      h->root.u.def.value = h->plt.offset;
   3046  1.3  christos 	    }
   3047  1.3  christos 
   3048  1.3  christos 	  /* Make room for this entry.  */
   3049  1.1     skrll 	  plt_info = htab->plt_info;
   3050  1.1     skrll 	  if (plt_info->short_plt != NULL
   3051  1.1     skrll 	      && (get_plt_index (plt_info->short_plt, s->size) < MAX_SHORT_PLT))
   3052  1.3  christos 	    plt_info = plt_info->short_plt;
   3053  1.3  christos 	  s->size += plt_info->symbol_entry_size;
   3054  1.3  christos 
   3055  1.3  christos 	  /* We also need to make an entry in the .got.plt section, which
   3056  1.1     skrll 	     will be placed in the .got section by the linker script.  */
   3057  1.1     skrll 	  if (!htab->fdpic_p)
   3058  1.1     skrll 	    htab->sgotplt->size += 4;
   3059  1.1     skrll 	  else
   3060  1.1     skrll 	    htab->sgotplt->size += 8;
   3061  1.1     skrll 
   3062  1.1     skrll 	  /* We also need to make an entry in the .rel.plt section.  */
   3063  1.1     skrll 	  htab->srelplt->size += sizeof (Elf32_External_Rela);
   3064  1.1     skrll 
   3065  1.1     skrll 	  if (htab->vxworks_p && !info->shared)
   3066  1.1     skrll 	    {
   3067  1.1     skrll 	      /* VxWorks executables have a second set of relocations
   3068  1.1     skrll 		 for each PLT entry.  They go in a separate relocation
   3069  1.1     skrll 		 section, which is processed by the kernel loader.  */
   3070  1.1     skrll 
   3071  1.1     skrll 	      /* There is a relocation for the initial PLT entry:
   3072  1.1     skrll 		 an R_SH_DIR32 relocation for _GLOBAL_OFFSET_TABLE_.  */
   3073  1.1     skrll 	      if (h->plt.offset == htab->plt_info->plt0_entry_size)
   3074  1.1     skrll 		htab->srelplt2->size += sizeof (Elf32_External_Rela);
   3075  1.1     skrll 
   3076  1.1     skrll 	      /* There are two extra relocations for each subsequent
   3077  1.1     skrll 		 PLT entry: an R_SH_DIR32 relocation for the GOT entry,
   3078  1.1     skrll 		 and an R_SH_DIR32 relocation for the PLT entry.  */
   3079  1.1     skrll 	      htab->srelplt2->size += sizeof (Elf32_External_Rela) * 2;
   3080  1.1     skrll 	    }
   3081  1.1     skrll 	}
   3082  1.1     skrll       else
   3083  1.1     skrll 	{
   3084  1.1     skrll 	  h->plt.offset = (bfd_vma) -1;
   3085  1.1     skrll 	  h->needs_plt = 0;
   3086  1.1     skrll 	}
   3087  1.1     skrll     }
   3088  1.1     skrll   else
   3089  1.1     skrll     {
   3090  1.1     skrll       h->plt.offset = (bfd_vma) -1;
   3091  1.1     skrll       h->needs_plt = 0;
   3092  1.1     skrll     }
   3093  1.3  christos 
   3094  1.1     skrll   if (h->got.refcount > 0)
   3095  1.1     skrll     {
   3096  1.1     skrll       asection *s;
   3097  1.1     skrll       bfd_boolean dyn;
   3098  1.1     skrll       int got_type = sh_elf_hash_entry (h)->got_type;
   3099  1.1     skrll 
   3100  1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   3101  1.1     skrll 	 Undefined weak syms won't yet be marked as dynamic.  */
   3102  1.1     skrll       if (h->dynindx == -1
   3103  1.1     skrll 	  && !h->forced_local)
   3104  1.1     skrll 	{
   3105  1.1     skrll 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3106  1.1     skrll 	    return FALSE;
   3107  1.1     skrll 	}
   3108  1.3  christos 
   3109  1.1     skrll       s = htab->sgot;
   3110  1.1     skrll       h->got.offset = s->size;
   3111  1.3  christos       s->size += 4;
   3112  1.3  christos       /* R_SH_TLS_GD needs 2 consecutive GOT slots.  */
   3113  1.3  christos       if (got_type == GOT_TLS_GD)
   3114  1.3  christos 	s->size += 4;
   3115  1.3  christos       dyn = htab->root.dynamic_sections_created;
   3116  1.3  christos       if (!dyn)
   3117  1.3  christos 	{
   3118  1.3  christos 	  /* No dynamic relocations required.  */
   3119  1.1     skrll 	  if (htab->fdpic_p && !info->shared
   3120  1.1     skrll 	      && h->root.type != bfd_link_hash_undefweak
   3121  1.3  christos 	      && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC))
   3122  1.3  christos 	    htab->srofixup->size += 4;
   3123  1.1     skrll 	}
   3124  1.3  christos       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
   3125  1.1     skrll 	 R_SH_TLS_GD needs one if local symbol and two if global.  */
   3126  1.3  christos       else if ((got_type == GOT_TLS_GD && h->dynindx == -1)
   3127  1.3  christos 	       || got_type == GOT_TLS_IE)
   3128  1.3  christos 	htab->srelgot->size += sizeof (Elf32_External_Rela);
   3129  1.3  christos       else if (got_type == GOT_TLS_GD)
   3130  1.3  christos 	htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
   3131  1.3  christos       else if (got_type == GOT_FUNCDESC)
   3132  1.3  christos 	{
   3133  1.1     skrll 	  if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
   3134  1.1     skrll 	    htab->srofixup->size += 4;
   3135  1.1     skrll 	  else
   3136  1.1     skrll 	    htab->srelgot->size += sizeof (Elf32_External_Rela);
   3137  1.1     skrll 	}
   3138  1.3  christos       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3139  1.3  christos 		|| h->root.type != bfd_link_hash_undefweak)
   3140  1.3  christos 	       && (info->shared
   3141  1.3  christos 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
   3142  1.1     skrll 	htab->srelgot->size += sizeof (Elf32_External_Rela);
   3143  1.1     skrll       else if (htab->fdpic_p && !info->shared && got_type == GOT_NORMAL
   3144  1.1     skrll 	       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3145  1.1     skrll 		   || h->root.type != bfd_link_hash_undefweak))
   3146  1.1     skrll 	htab->srofixup->size += 4;
   3147  1.1     skrll     }
   3148  1.1     skrll   else
   3149  1.1     skrll     h->got.offset = (bfd_vma) -1;
   3150  1.1     skrll 
   3151  1.1     skrll #ifdef INCLUDE_SHMEDIA
   3152  1.1     skrll   if (eh->datalabel_got.refcount > 0)
   3153  1.1     skrll     {
   3154  1.1     skrll       asection *s;
   3155  1.1     skrll       bfd_boolean dyn;
   3156  1.1     skrll 
   3157  1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   3158  1.1     skrll 	 Undefined weak syms won't yet be marked as dynamic.  */
   3159  1.1     skrll       if (h->dynindx == -1
   3160  1.1     skrll 	  && !h->forced_local)
   3161  1.1     skrll 	{
   3162  1.1     skrll 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3163  1.1     skrll 	    return FALSE;
   3164  1.1     skrll 	}
   3165  1.1     skrll 
   3166  1.1     skrll       s = htab->sgot;
   3167  1.1     skrll       eh->datalabel_got.offset = s->size;
   3168  1.1     skrll       s->size += 4;
   3169  1.1     skrll       dyn = htab->root.dynamic_sections_created;
   3170  1.1     skrll       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
   3171  1.1     skrll 	htab->srelgot->size += sizeof (Elf32_External_Rela);
   3172  1.3  christos     }
   3173  1.3  christos   else
   3174  1.3  christos     eh->datalabel_got.offset = (bfd_vma) -1;
   3175  1.3  christos #endif
   3176  1.3  christos 
   3177  1.3  christos   /* Allocate space for any dynamic relocations to function
   3178  1.3  christos      descriptors, canonical or otherwise.  We need to relocate the
   3179  1.3  christos      reference unless it resolves to zero, which only happens for
   3180  1.3  christos      undefined weak symbols (either non-default visibility, or when
   3181  1.3  christos      static linking).  Any GOT slot is accounted for elsewhere.  */
   3182  1.3  christos   if (eh->abs_funcdesc_refcount > 0
   3183  1.3  christos       && (h->root.type != bfd_link_hash_undefweak
   3184  1.3  christos 	  || (htab->root.dynamic_sections_created
   3185  1.3  christos 	      && ! SYMBOL_CALLS_LOCAL (info, h))))
   3186  1.3  christos     {
   3187  1.3  christos       if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
   3188  1.3  christos 	htab->srofixup->size += eh->abs_funcdesc_refcount * 4;
   3189  1.3  christos       else
   3190  1.3  christos 	htab->srelgot->size
   3191  1.3  christos 	  += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela);
   3192  1.3  christos     }
   3193  1.3  christos 
   3194  1.3  christos   /* We must allocate a function descriptor if there are references to
   3195  1.3  christos      a canonical descriptor (R_SH_GOTFUNCDESC or R_SH_FUNCDESC) and
   3196  1.3  christos      the dynamic linker isn't going to allocate it.  None of this
   3197  1.3  christos      applies if we already created one in .got.plt, but if the
   3198  1.3  christos      canonical function descriptor can be in this object, there
   3199  1.3  christos      won't be a PLT entry at all.  */
   3200  1.3  christos   if ((eh->funcdesc.refcount > 0
   3201  1.3  christos        || (h->got.offset != MINUS_ONE && eh->got_type == GOT_FUNCDESC))
   3202  1.3  christos       && h->root.type != bfd_link_hash_undefweak
   3203  1.3  christos       && SYMBOL_FUNCDESC_LOCAL (info, h))
   3204  1.3  christos     {
   3205  1.3  christos       /* Make room for this function descriptor.  */
   3206  1.3  christos       eh->funcdesc.offset = htab->sfuncdesc->size;
   3207  1.3  christos       htab->sfuncdesc->size += 8;
   3208  1.3  christos 
   3209  1.3  christos       /* We will need a relocation or two fixups to initialize the
   3210  1.3  christos 	 function descriptor, so allocate those too.  */
   3211  1.3  christos       if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
   3212  1.1     skrll 	htab->srofixup->size += 8;
   3213  1.1     skrll       else
   3214  1.1     skrll 	htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
   3215  1.1     skrll     }
   3216  1.1     skrll 
   3217  1.1     skrll   if (eh->dyn_relocs == NULL)
   3218  1.1     skrll     return TRUE;
   3219  1.1     skrll 
   3220  1.1     skrll   /* In the shared -Bsymbolic case, discard space allocated for
   3221  1.1     skrll      dynamic pc-relative relocs against symbols which turn out to be
   3222  1.1     skrll      defined in regular objects.  For the normal shared case, discard
   3223  1.1     skrll      space for pc-relative relocs that have become local due to symbol
   3224  1.1     skrll      visibility changes.  */
   3225  1.1     skrll 
   3226  1.1     skrll   if (info->shared)
   3227  1.1     skrll     {
   3228  1.1     skrll       if (SYMBOL_CALLS_LOCAL (info, h))
   3229  1.1     skrll 	{
   3230  1.1     skrll 	  struct elf_sh_dyn_relocs **pp;
   3231  1.1     skrll 
   3232  1.1     skrll 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   3233  1.1     skrll 	    {
   3234  1.1     skrll 	      p->count -= p->pc_count;
   3235  1.1     skrll 	      p->pc_count = 0;
   3236  1.1     skrll 	      if (p->count == 0)
   3237  1.1     skrll 		*pp = p->next;
   3238  1.1     skrll 	      else
   3239  1.1     skrll 		pp = &p->next;
   3240  1.1     skrll 	    }
   3241  1.1     skrll 	}
   3242  1.1     skrll 
   3243  1.1     skrll       if (htab->vxworks_p)
   3244  1.1     skrll 	{
   3245  1.1     skrll 	  struct elf_sh_dyn_relocs **pp;
   3246  1.1     skrll 
   3247  1.1     skrll 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   3248  1.1     skrll 	    {
   3249  1.1     skrll 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
   3250  1.1     skrll 		*pp = p->next;
   3251  1.1     skrll 	      else
   3252  1.1     skrll 		pp = &p->next;
   3253  1.1     skrll 	    }
   3254  1.1     skrll 	}
   3255  1.1     skrll 
   3256  1.1     skrll       /* Also discard relocs on undefined weak syms with non-default
   3257  1.1     skrll 	 visibility.  */
   3258  1.1     skrll       if (eh->dyn_relocs != NULL
   3259  1.1     skrll 	  && h->root.type == bfd_link_hash_undefweak)
   3260  1.1     skrll 	{
   3261  1.1     skrll 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   3262  1.1     skrll 	    eh->dyn_relocs = NULL;
   3263  1.1     skrll 
   3264  1.1     skrll 	  /* Make sure undefined weak symbols are output as a dynamic
   3265  1.1     skrll 	     symbol in PIEs.  */
   3266  1.1     skrll 	  else if (h->dynindx == -1
   3267  1.1     skrll 		   && !h->forced_local)
   3268  1.1     skrll 	    {
   3269  1.1     skrll 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3270  1.1     skrll 		return FALSE;
   3271  1.1     skrll 	    }
   3272  1.1     skrll 	}
   3273  1.1     skrll     }
   3274  1.1     skrll   else
   3275  1.1     skrll     {
   3276  1.1     skrll       /* For the non-shared case, discard space for relocs against
   3277  1.1     skrll 	 symbols which turn out to need copy relocs or are not
   3278  1.1     skrll 	 dynamic.  */
   3279  1.1     skrll 
   3280  1.1     skrll       if (!h->non_got_ref
   3281  1.1     skrll 	  && ((h->def_dynamic
   3282  1.1     skrll 	       && !h->def_regular)
   3283  1.1     skrll 	      || (htab->root.dynamic_sections_created
   3284  1.1     skrll 		  && (h->root.type == bfd_link_hash_undefweak
   3285  1.1     skrll 		      || h->root.type == bfd_link_hash_undefined))))
   3286  1.1     skrll 	{
   3287  1.1     skrll 	  /* Make sure this symbol is output as a dynamic symbol.
   3288  1.1     skrll 	     Undefined weak syms won't yet be marked as dynamic.  */
   3289  1.1     skrll 	  if (h->dynindx == -1
   3290  1.1     skrll 	      && !h->forced_local)
   3291  1.1     skrll 	    {
   3292  1.1     skrll 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3293  1.1     skrll 		return FALSE;
   3294  1.1     skrll 	    }
   3295  1.1     skrll 
   3296  1.1     skrll 	  /* If that succeeded, we know we'll be keeping all the
   3297  1.1     skrll 	     relocs.  */
   3298  1.1     skrll 	  if (h->dynindx != -1)
   3299  1.1     skrll 	    goto keep;
   3300  1.1     skrll 	}
   3301  1.1     skrll 
   3302  1.1     skrll       eh->dyn_relocs = NULL;
   3303  1.1     skrll 
   3304  1.1     skrll     keep: ;
   3305  1.1     skrll     }
   3306  1.1     skrll 
   3307  1.3  christos   /* Finally, allocate space.  */
   3308  1.3  christos   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   3309  1.3  christos     {
   3310  1.3  christos       asection *sreloc = elf_section_data (p->sec)->sreloc;
   3311  1.1     skrll       sreloc->size += p->count * sizeof (Elf32_External_Rela);
   3312  1.1     skrll 
   3313  1.1     skrll       /* If we need relocations, we do not need fixups.  */
   3314  1.1     skrll       if (htab->fdpic_p && !info->shared)
   3315  1.1     skrll 	htab->srofixup->size -= 4 * (p->count - p->pc_count);
   3316  1.1     skrll     }
   3317  1.1     skrll 
   3318  1.1     skrll   return TRUE;
   3319  1.1     skrll }
   3320  1.1     skrll 
   3321  1.1     skrll /* Find any dynamic relocs that apply to read-only sections.  */
   3322  1.1     skrll 
   3323  1.1     skrll static bfd_boolean
   3324  1.1     skrll readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   3325  1.1     skrll {
   3326  1.1     skrll   struct elf_sh_link_hash_entry *eh;
   3327  1.1     skrll   struct elf_sh_dyn_relocs *p;
   3328  1.1     skrll 
   3329  1.1     skrll   if (h->root.type == bfd_link_hash_warning)
   3330  1.1     skrll     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   3331  1.1     skrll 
   3332  1.1     skrll   eh = (struct elf_sh_link_hash_entry *) h;
   3333  1.1     skrll   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   3334  1.1     skrll     {
   3335  1.1     skrll       asection *s = p->sec->output_section;
   3336  1.2     skrll 
   3337  1.2     skrll       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   3338  1.2     skrll 	{
   3339  1.2     skrll 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
   3340  1.1     skrll 
   3341  1.1     skrll           if (info->warn_shared_textrel)
   3342  1.1     skrll             (*_bfd_error_handler)
   3343  1.1     skrll               (_("warning: dynamic relocation in readonly section `%s'"),
   3344  1.1     skrll               h->root.root.string);
   3345  1.1     skrll 	  info->flags |= DF_TEXTREL;
   3346  1.1     skrll 
   3347  1.1     skrll 	  /* Not an error, just cut short the traversal.  */
   3348  1.1     skrll 	  return FALSE;
   3349  1.1     skrll 	}
   3350  1.1     skrll     }
   3351  1.1     skrll   return TRUE;
   3352  1.1     skrll }
   3353  1.1     skrll 
   3354  1.1     skrll /* This function is called after all the input files have been read,
   3355  1.1     skrll    and the input sections have been assigned to output sections.
   3356  1.1     skrll    It's a convenient place to determine the PLT style.  */
   3357  1.3  christos 
   3358  1.3  christos static bfd_boolean
   3359  1.3  christos sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
   3360  1.3  christos {
   3361  1.3  christos   sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
   3362  1.3  christos 
   3363  1.3  christos   if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable)
   3364  1.3  christos     {
   3365  1.3  christos       struct elf_link_hash_entry *h;
   3366  1.3  christos 
   3367  1.3  christos       /* Force a PT_GNU_STACK segment to be created.  */
   3368  1.3  christos       if (! elf_tdata (output_bfd)->stack_flags)
   3369  1.3  christos 	elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
   3370  1.3  christos 
   3371  1.3  christos       /* Define __stacksize if it's not defined yet.  */
   3372  1.3  christos       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
   3373  1.3  christos 				FALSE, FALSE, FALSE);
   3374  1.3  christos       if (! h || h->root.type != bfd_link_hash_defined
   3375  1.3  christos 	  || h->type != STT_OBJECT
   3376  1.3  christos 	  || !h->def_regular)
   3377  1.3  christos 	{
   3378  1.3  christos 	  struct bfd_link_hash_entry *bh = NULL;
   3379  1.3  christos 
   3380  1.3  christos 	  if (!(_bfd_generic_link_add_one_symbol
   3381  1.3  christos 		(info, output_bfd, "__stacksize",
   3382  1.3  christos 		 BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
   3383  1.3  christos 		 (const char *) NULL, FALSE,
   3384  1.3  christos 		 get_elf_backend_data (output_bfd)->collect, &bh)))
   3385  1.3  christos 	    return FALSE;
   3386  1.3  christos 
   3387  1.3  christos 	  h = (struct elf_link_hash_entry *) bh;
   3388  1.3  christos 	  h->def_regular = 1;
   3389  1.3  christos 	  h->type = STT_OBJECT;
   3390  1.3  christos 	}
   3391  1.3  christos     }
   3392  1.3  christos   return TRUE;
   3393  1.3  christos }
   3394  1.3  christos 
   3395  1.3  christos #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
   3396  1.3  christos 
   3397  1.3  christos static bfd_boolean
   3398  1.3  christos sh_elf_modify_program_headers (bfd *output_bfd, struct bfd_link_info *info)
   3399  1.3  christos {
   3400  1.3  christos   struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
   3401  1.3  christos   struct elf_segment_map *m;
   3402  1.3  christos   Elf_Internal_Phdr *p;
   3403  1.3  christos 
   3404  1.3  christos   /* objcopy and strip preserve what's already there using
   3405  1.3  christos      sh_elf_copy_private_bfd_data ().  */
   3406  1.3  christos   if (! info)
   3407  1.3  christos     return TRUE;
   3408  1.3  christos 
   3409  1.3  christos   for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
   3410  1.3  christos     if (m->p_type == PT_GNU_STACK)
   3411  1.3  christos       break;
   3412  1.3  christos 
   3413  1.3  christos   if (m)
   3414  1.3  christos     {
   3415  1.3  christos       struct elf_link_hash_entry *h;
   3416  1.3  christos 
   3417  1.3  christos       /* Obtain the pointer to the __stacksize symbol.  */
   3418  1.3  christos       h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
   3419  1.3  christos 				FALSE, FALSE, FALSE);
   3420  1.3  christos       if (h)
   3421  1.3  christos 	{
   3422  1.3  christos 	  while (h->root.type == bfd_link_hash_indirect
   3423  1.3  christos 		 || h->root.type == bfd_link_hash_warning)
   3424  1.3  christos 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   3425  1.3  christos 	  BFD_ASSERT (h->root.type == bfd_link_hash_defined);
   3426  1.3  christos 	}
   3427  1.3  christos 
   3428  1.3  christos       /* Set the header p_memsz from the symbol value.  We
   3429  1.3  christos 	 intentionally ignore the symbol section.  */
   3430  1.3  christos       if (h && h->root.type == bfd_link_hash_defined)
   3431  1.3  christos 	p->p_memsz = h->root.u.def.value;
   3432  1.3  christos       else
   3433  1.1     skrll 	p->p_memsz = DEFAULT_STACK_SIZE;
   3434  1.1     skrll 
   3435  1.1     skrll       p->p_align = 8;
   3436  1.3  christos     }
   3437  1.3  christos 
   3438  1.1     skrll   return TRUE;
   3439  1.1     skrll }
   3440  1.1     skrll 
   3441  1.1     skrll #endif
   3442  1.1     skrll 
   3443  1.1     skrll /* Set the sizes of the dynamic sections.  */
   3444  1.1     skrll 
   3445  1.1     skrll static bfd_boolean
   3446  1.1     skrll sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   3447  1.1     skrll 			      struct bfd_link_info *info)
   3448  1.1     skrll {
   3449  1.1     skrll   struct elf_sh_link_hash_table *htab;
   3450  1.1     skrll   bfd *dynobj;
   3451  1.3  christos   asection *s;
   3452  1.3  christos   bfd_boolean relocs;
   3453  1.3  christos   bfd *ibfd;
   3454  1.1     skrll 
   3455  1.1     skrll   htab = sh_elf_hash_table (info);
   3456  1.1     skrll   if (htab == NULL)
   3457  1.1     skrll     return FALSE;
   3458  1.1     skrll 
   3459  1.1     skrll   dynobj = htab->root.dynobj;
   3460  1.1     skrll   BFD_ASSERT (dynobj != NULL);
   3461  1.1     skrll 
   3462  1.1     skrll   if (htab->root.dynamic_sections_created)
   3463  1.1     skrll     {
   3464  1.1     skrll       /* Set the contents of the .interp section to the interpreter.  */
   3465  1.1     skrll       if (info->executable)
   3466  1.1     skrll 	{
   3467  1.1     skrll 	  s = bfd_get_section_by_name (dynobj, ".interp");
   3468  1.1     skrll 	  BFD_ASSERT (s != NULL);
   3469  1.1     skrll 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   3470  1.1     skrll 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   3471  1.1     skrll 	}
   3472  1.1     skrll     }
   3473  1.1     skrll 
   3474  1.1     skrll   /* Set up .got offsets for local syms, and space for local dynamic
   3475  1.3  christos      relocs.  */
   3476  1.3  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   3477  1.1     skrll     {
   3478  1.1     skrll       bfd_signed_vma *local_got;
   3479  1.1     skrll       bfd_signed_vma *end_local_got;
   3480  1.1     skrll       union gotref *local_funcdesc, *end_local_funcdesc;
   3481  1.1     skrll       char *local_got_type;
   3482  1.1     skrll       bfd_size_type locsymcount;
   3483  1.1     skrll       Elf_Internal_Shdr *symtab_hdr;
   3484  1.1     skrll       asection *srel;
   3485  1.1     skrll 
   3486  1.1     skrll       if (! is_sh_elf (ibfd))
   3487  1.1     skrll 	continue;
   3488  1.1     skrll 
   3489  1.1     skrll       for (s = ibfd->sections; s != NULL; s = s->next)
   3490  1.1     skrll 	{
   3491  1.1     skrll 	  struct elf_sh_dyn_relocs *p;
   3492  1.1     skrll 
   3493  1.1     skrll 	  for (p = ((struct elf_sh_dyn_relocs *)
   3494  1.1     skrll 		    elf_section_data (s)->local_dynrel);
   3495  1.1     skrll 	       p != NULL;
   3496  1.1     skrll 	       p = p->next)
   3497  1.1     skrll 	    {
   3498  1.1     skrll 	      if (! bfd_is_abs_section (p->sec)
   3499  1.1     skrll 		  && bfd_is_abs_section (p->sec->output_section))
   3500  1.1     skrll 		{
   3501  1.1     skrll 		  /* Input section has been discarded, either because
   3502  1.1     skrll 		     it is a copy of a linkonce section or due to
   3503  1.1     skrll 		     linker script /DISCARD/, so we'll be discarding
   3504  1.1     skrll 		     the relocs too.  */
   3505  1.1     skrll 		}
   3506  1.1     skrll 	      else if (htab->vxworks_p
   3507  1.1     skrll 		       && strcmp (p->sec->output_section->name,
   3508  1.1     skrll 				  ".tls_vars") == 0)
   3509  1.1     skrll 		{
   3510  1.1     skrll 		  /* Relocations in vxworks .tls_vars sections are
   3511  1.1     skrll 		     handled specially by the loader.  */
   3512  1.1     skrll 		}
   3513  1.1     skrll 	      else if (p->count != 0)
   3514  1.3  christos 		{
   3515  1.3  christos 		  srel = elf_section_data (p->sec)->sreloc;
   3516  1.3  christos 		  srel->size += p->count * sizeof (Elf32_External_Rela);
   3517  1.3  christos 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   3518  1.1     skrll 		    info->flags |= DF_TEXTREL;
   3519  1.1     skrll 
   3520  1.1     skrll 		  /* If we need relocations, we do not need fixups.  */
   3521  1.1     skrll 		  if (htab->fdpic_p && !info->shared)
   3522  1.1     skrll 		    htab->srofixup->size -= 4 * (p->count - p->pc_count);
   3523  1.1     skrll 		}
   3524  1.1     skrll 	    }
   3525  1.1     skrll 	}
   3526  1.1     skrll 
   3527  1.1     skrll       symtab_hdr = &elf_symtab_hdr (ibfd);
   3528  1.1     skrll       locsymcount = symtab_hdr->sh_info;
   3529  1.1     skrll #ifdef INCLUDE_SHMEDIA
   3530  1.3  christos       /* Count datalabel local GOT.  */
   3531  1.3  christos       locsymcount *= 2;
   3532  1.3  christos #endif
   3533  1.1     skrll       s = htab->sgot;
   3534  1.3  christos       srel = htab->srelgot;
   3535  1.3  christos 
   3536  1.3  christos       local_got = elf_local_got_refcounts (ibfd);
   3537  1.3  christos       if (local_got)
   3538  1.3  christos 	{
   3539  1.3  christos 	  end_local_got = local_got + locsymcount;
   3540  1.3  christos 	  local_got_type = sh_elf_local_got_type (ibfd);
   3541  1.3  christos 	  local_funcdesc = sh_elf_local_funcdesc (ibfd);
   3542  1.3  christos 	  for (; local_got < end_local_got; ++local_got)
   3543  1.3  christos 	    {
   3544  1.3  christos 	      if (*local_got > 0)
   3545  1.3  christos 		{
   3546  1.3  christos 		  *local_got = s->size;
   3547  1.3  christos 		  s->size += 4;
   3548  1.3  christos 		  if (*local_got_type == GOT_TLS_GD)
   3549  1.3  christos 		    s->size += 4;
   3550  1.3  christos 		  if (info->shared)
   3551  1.3  christos 		    srel->size += sizeof (Elf32_External_Rela);
   3552  1.3  christos 		  else
   3553  1.3  christos 		    htab->srofixup->size += 4;
   3554  1.3  christos 
   3555  1.3  christos 		  if (*local_got_type == GOT_FUNCDESC)
   3556  1.3  christos 		    {
   3557  1.3  christos 		      if (local_funcdesc == NULL)
   3558  1.3  christos 			{
   3559  1.3  christos 			  bfd_size_type size;
   3560  1.3  christos 
   3561  1.3  christos 			  size = locsymcount * sizeof (union gotref);
   3562  1.3  christos 			  local_funcdesc = (union gotref *) bfd_zalloc (ibfd,
   3563  1.3  christos 									size);
   3564  1.3  christos 			  if (local_funcdesc == NULL)
   3565  1.3  christos 			    return FALSE;
   3566  1.3  christos 			  sh_elf_local_funcdesc (ibfd) = local_funcdesc;
   3567  1.3  christos 			  local_funcdesc += (local_got
   3568  1.3  christos 					     - elf_local_got_refcounts (ibfd));
   3569  1.3  christos 			}
   3570  1.3  christos 		      local_funcdesc->refcount++;
   3571  1.3  christos 		      ++local_funcdesc;
   3572  1.3  christos 		    }
   3573  1.3  christos 		}
   3574  1.3  christos 	      else
   3575  1.3  christos 		*local_got = (bfd_vma) -1;
   3576  1.3  christos 	      ++local_got_type;
   3577  1.3  christos 	    }
   3578  1.3  christos 	}
   3579  1.3  christos 
   3580  1.3  christos       local_funcdesc = sh_elf_local_funcdesc (ibfd);
   3581  1.1     skrll       if (local_funcdesc)
   3582  1.3  christos 	{
   3583  1.3  christos 	  end_local_funcdesc = local_funcdesc + locsymcount;
   3584  1.3  christos 
   3585  1.3  christos 	  for (; local_funcdesc < end_local_funcdesc; ++local_funcdesc)
   3586  1.3  christos 	    {
   3587  1.3  christos 	      if (local_funcdesc->refcount > 0)
   3588  1.3  christos 		{
   3589  1.3  christos 		  local_funcdesc->offset = htab->sfuncdesc->size;
   3590  1.3  christos 		  htab->sfuncdesc->size += 8;
   3591  1.3  christos 		  if (!info->shared)
   3592  1.3  christos 		    htab->srofixup->size += 8;
   3593  1.1     skrll 		  else
   3594  1.1     skrll 		    htab->srelfuncdesc->size += sizeof (Elf32_External_Rela);
   3595  1.3  christos 		}
   3596  1.1     skrll 	      else
   3597  1.1     skrll 		local_funcdesc->offset = MINUS_ONE;
   3598  1.1     skrll 	    }
   3599  1.1     skrll 	}
   3600  1.1     skrll 
   3601  1.1     skrll     }
   3602  1.1     skrll 
   3603  1.1     skrll   if (htab->tls_ldm_got.refcount > 0)
   3604  1.1     skrll     {
   3605  1.1     skrll       /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
   3606  1.1     skrll 	 relocs.  */
   3607  1.1     skrll       htab->tls_ldm_got.offset = htab->sgot->size;
   3608  1.1     skrll       htab->sgot->size += 8;
   3609  1.3  christos       htab->srelgot->size += sizeof (Elf32_External_Rela);
   3610  1.3  christos     }
   3611  1.3  christos   else
   3612  1.3  christos     htab->tls_ldm_got.offset = -1;
   3613  1.3  christos 
   3614  1.3  christos   /* Only the reserved entries should be present.  For FDPIC, they go at
   3615  1.3  christos      the end of .got.plt.  */
   3616  1.3  christos   if (htab->fdpic_p)
   3617  1.1     skrll     {
   3618  1.1     skrll       BFD_ASSERT (htab->sgotplt && htab->sgotplt->size == 12);
   3619  1.1     skrll       htab->sgotplt->size = 0;
   3620  1.1     skrll     }
   3621  1.3  christos 
   3622  1.3  christos   /* Allocate global sym .plt and .got entries, and space for global
   3623  1.3  christos      sym dynamic relocs.  */
   3624  1.3  christos   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
   3625  1.3  christos 
   3626  1.3  christos   /* Move the reserved entries and the _GLOBAL_OFFSET_TABLE_ symbol to the
   3627  1.3  christos      end of the FDPIC .got.plt.  */
   3628  1.3  christos   if (htab->fdpic_p)
   3629  1.3  christos     {
   3630  1.3  christos       htab->root.hgot->root.u.def.value = htab->sgotplt->size;
   3631  1.3  christos       htab->sgotplt->size += 12;
   3632  1.3  christos     }
   3633  1.1     skrll 
   3634  1.1     skrll   /* At the very end of the .rofixup section is a pointer to the GOT.  */
   3635  1.1     skrll   if (htab->fdpic_p && htab->srofixup != NULL)
   3636  1.1     skrll     htab->srofixup->size += 4;
   3637  1.1     skrll 
   3638  1.1     skrll   /* We now have determined the sizes of the various dynamic sections.
   3639  1.1     skrll      Allocate memory for them.  */
   3640  1.1     skrll   relocs = FALSE;
   3641  1.1     skrll   for (s = dynobj->sections; s != NULL; s = s->next)
   3642  1.1     skrll     {
   3643  1.1     skrll       if ((s->flags & SEC_LINKER_CREATED) == 0)
   3644  1.3  christos 	continue;
   3645  1.3  christos 
   3646  1.1     skrll       if (s == htab->splt
   3647  1.1     skrll 	  || s == htab->sgot
   3648  1.1     skrll 	  || s == htab->sgotplt
   3649  1.1     skrll 	  || s == htab->sfuncdesc
   3650  1.1     skrll 	  || s == htab->srofixup
   3651  1.1     skrll 	  || s == htab->sdynbss)
   3652  1.1     skrll 	{
   3653  1.1     skrll 	  /* Strip this section if we don't need it; see the
   3654  1.1     skrll 	     comment below.  */
   3655  1.1     skrll 	}
   3656  1.1     skrll       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
   3657  1.1     skrll 	{
   3658  1.1     skrll 	  if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
   3659  1.1     skrll 	    relocs = TRUE;
   3660  1.1     skrll 
   3661  1.1     skrll 	  /* We use the reloc_count field as a counter if we need
   3662  1.1     skrll 	     to copy relocs into the output file.  */
   3663  1.1     skrll 	  s->reloc_count = 0;
   3664  1.1     skrll 	}
   3665  1.1     skrll       else
   3666  1.1     skrll 	{
   3667  1.1     skrll 	  /* It's not one of our sections, so don't allocate space.  */
   3668  1.1     skrll 	  continue;
   3669  1.1     skrll 	}
   3670  1.1     skrll 
   3671  1.1     skrll       if (s->size == 0)
   3672  1.1     skrll 	{
   3673  1.1     skrll 	  /* If we don't need this section, strip it from the
   3674  1.1     skrll 	     output file.  This is mostly to handle .rela.bss and
   3675  1.1     skrll 	     .rela.plt.  We must create both sections in
   3676  1.1     skrll 	     create_dynamic_sections, because they must be created
   3677  1.1     skrll 	     before the linker maps input sections to output
   3678  1.1     skrll 	     sections.  The linker does that before
   3679  1.1     skrll 	     adjust_dynamic_symbol is called, and it is that
   3680  1.1     skrll 	     function which decides whether anything needs to go
   3681  1.1     skrll 	     into these sections.  */
   3682  1.1     skrll 
   3683  1.1     skrll 	  s->flags |= SEC_EXCLUDE;
   3684  1.1     skrll 	  continue;
   3685  1.1     skrll 	}
   3686  1.1     skrll 
   3687  1.1     skrll       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   3688  1.1     skrll 	continue;
   3689  1.1     skrll 
   3690  1.1     skrll       /* Allocate memory for the section contents.  We use bfd_zalloc
   3691  1.1     skrll 	 here in case unused entries are not reclaimed before the
   3692  1.1     skrll 	 section's contents are written out.  This should not happen,
   3693  1.1     skrll 	 but this way if it does, we get a R_SH_NONE reloc instead
   3694  1.1     skrll 	 of garbage.  */
   3695  1.1     skrll       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   3696  1.1     skrll       if (s->contents == NULL)
   3697  1.1     skrll 	return FALSE;
   3698  1.1     skrll     }
   3699  1.1     skrll 
   3700  1.1     skrll   if (htab->root.dynamic_sections_created)
   3701  1.1     skrll     {
   3702  1.1     skrll       /* Add some entries to the .dynamic section.  We fill in the
   3703  1.1     skrll 	 values later, in sh_elf_finish_dynamic_sections, but we
   3704  1.1     skrll 	 must add the entries now so that we get the correct size for
   3705  1.1     skrll 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   3706  1.1     skrll 	 dynamic linker and used by the debugger.  */
   3707  1.1     skrll #define add_dynamic_entry(TAG, VAL) \
   3708  1.1     skrll   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   3709  1.1     skrll 
   3710  1.1     skrll       if (info->executable)
   3711  1.1     skrll 	{
   3712  1.1     skrll 	  if (! add_dynamic_entry (DT_DEBUG, 0))
   3713  1.1     skrll 	    return FALSE;
   3714  1.1     skrll 	}
   3715  1.1     skrll 
   3716  1.1     skrll       if (htab->splt->size != 0)
   3717  1.1     skrll 	{
   3718  1.1     skrll 	  if (! add_dynamic_entry (DT_PLTGOT, 0)
   3719  1.3  christos 	      || ! add_dynamic_entry (DT_PLTRELSZ, 0)
   3720  1.3  christos 	      || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
   3721  1.3  christos 	      || ! add_dynamic_entry (DT_JMPREL, 0))
   3722  1.3  christos 	    return FALSE;
   3723  1.3  christos 	}
   3724  1.3  christos       else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC)
   3725  1.1     skrll 	       && htab->sgot->size != 0)
   3726  1.1     skrll 	{
   3727  1.1     skrll 	  if (! add_dynamic_entry (DT_PLTGOT, 0))
   3728  1.1     skrll 	    return FALSE;
   3729  1.1     skrll 	}
   3730  1.1     skrll 
   3731  1.1     skrll       if (relocs)
   3732  1.1     skrll 	{
   3733  1.1     skrll 	  if (! add_dynamic_entry (DT_RELA, 0)
   3734  1.1     skrll 	      || ! add_dynamic_entry (DT_RELASZ, 0)
   3735  1.1     skrll 	      || ! add_dynamic_entry (DT_RELAENT,
   3736  1.1     skrll 				      sizeof (Elf32_External_Rela)))
   3737  1.1     skrll 	    return FALSE;
   3738  1.1     skrll 
   3739  1.1     skrll 	  /* If any dynamic relocs apply to a read-only section,
   3740  1.1     skrll 	     then we need a DT_TEXTREL entry.  */
   3741  1.1     skrll 	  if ((info->flags & DF_TEXTREL) == 0)
   3742  1.1     skrll 	    elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info);
   3743  1.1     skrll 
   3744  1.1     skrll 	  if ((info->flags & DF_TEXTREL) != 0)
   3745  1.1     skrll 	    {
   3746  1.1     skrll 	      if (! add_dynamic_entry (DT_TEXTREL, 0))
   3747  1.1     skrll 		return FALSE;
   3748  1.1     skrll 	    }
   3749  1.1     skrll 	}
   3750  1.1     skrll       if (htab->vxworks_p
   3751  1.1     skrll 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
   3752  1.1     skrll 	return FALSE;
   3753  1.1     skrll     }
   3754  1.3  christos #undef add_dynamic_entry
   3755  1.3  christos 
   3756  1.3  christos   return TRUE;
   3757  1.3  christos }
   3758  1.3  christos 
   3759  1.3  christos /* Add a dynamic relocation to the SRELOC section.  */
   3761  1.3  christos 
   3762  1.3  christos inline static bfd_vma
   3763  1.3  christos sh_elf_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset,
   3764  1.3  christos 		      int reloc_type, long dynindx, bfd_vma addend)
   3765  1.3  christos {
   3766  1.3  christos   Elf_Internal_Rela outrel;
   3767  1.3  christos   bfd_vma reloc_offset;
   3768  1.3  christos 
   3769  1.3  christos   outrel.r_offset = offset;
   3770  1.3  christos   outrel.r_info = ELF32_R_INFO (dynindx, reloc_type);
   3771  1.3  christos   outrel.r_addend = addend;
   3772  1.3  christos 
   3773  1.3  christos   reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rela);
   3774  1.3  christos   BFD_ASSERT (reloc_offset < sreloc->size);
   3775  1.3  christos   bfd_elf32_swap_reloca_out (output_bfd, &outrel,
   3776  1.3  christos 			     sreloc->contents + reloc_offset);
   3777  1.3  christos   sreloc->reloc_count++;
   3778  1.3  christos 
   3779  1.3  christos   return reloc_offset;
   3780  1.3  christos }
   3781  1.3  christos 
   3782  1.3  christos /* Add an FDPIC read-only fixup.  */
   3783  1.3  christos 
   3784  1.3  christos inline static void
   3785  1.3  christos sh_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset)
   3786  1.3  christos {
   3787  1.3  christos   bfd_vma fixup_offset;
   3788  1.3  christos 
   3789  1.3  christos   fixup_offset = srofixup->reloc_count++ * 4;
   3790  1.3  christos   BFD_ASSERT (fixup_offset < srofixup->size);
   3791  1.3  christos   bfd_put_32 (output_bfd, offset, srofixup->contents + fixup_offset);
   3792  1.3  christos }
   3793  1.3  christos 
   3794  1.3  christos /* Return the offset of the generated .got section from the
   3795  1.3  christos    _GLOBAL_OFFSET_TABLE_ symbol.  */
   3796  1.3  christos 
   3797  1.3  christos static bfd_signed_vma
   3798  1.3  christos sh_elf_got_offset (struct elf_sh_link_hash_table *htab)
   3799  1.3  christos {
   3800  1.3  christos   return (htab->sgot->output_offset - htab->sgotplt->output_offset
   3801  1.3  christos 	  - htab->root.hgot->root.u.def.value);
   3802  1.3  christos }
   3803  1.3  christos 
   3804  1.3  christos /* Find the segment number in which OSEC, and output section, is
   3805  1.3  christos    located.  */
   3806  1.3  christos 
   3807  1.3  christos static unsigned
   3808  1.3  christos sh_elf_osec_to_segment (bfd *output_bfd, asection *osec)
   3809  1.3  christos {
   3810  1.3  christos   Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section (output_bfd,
   3811  1.3  christos 								   osec);
   3812  1.3  christos 
   3813  1.3  christos   /* FIXME: Nothing ever says what this index is relative to.  The kernel
   3814  1.3  christos      supplies data in terms of the number of load segments but this is
   3815  1.3  christos      a phdr index and the first phdr may not be a load segment.  */
   3816  1.3  christos   return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1;
   3817  1.3  christos }
   3818  1.3  christos 
   3819  1.3  christos static bfd_boolean
   3820  1.3  christos sh_elf_osec_readonly_p (bfd *output_bfd, asection *osec)
   3821  1.3  christos {
   3822  1.3  christos   unsigned seg = sh_elf_osec_to_segment (output_bfd, osec);
   3823  1.3  christos 
   3824  1.3  christos   return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W);
   3825  1.3  christos }
   3826  1.3  christos 
   3827  1.3  christos /* Generate the initial contents of a local function descriptor, along
   3828  1.3  christos    with any relocations or fixups required.  */
   3829  1.3  christos static bfd_boolean
   3830  1.3  christos sh_elf_initialize_funcdesc (bfd *output_bfd,
   3831  1.3  christos 			    struct bfd_link_info *info,
   3832  1.3  christos 			    struct elf_link_hash_entry *h,
   3833  1.3  christos 			    bfd_vma offset,
   3834  1.3  christos 			    asection *section,
   3835  1.3  christos 			    bfd_vma value)
   3836  1.3  christos {
   3837  1.3  christos   struct elf_sh_link_hash_table *htab;
   3838  1.3  christos   int dynindx;
   3839  1.3  christos   bfd_vma addr, seg;
   3840  1.3  christos 
   3841  1.3  christos   htab = sh_elf_hash_table (info);
   3842  1.3  christos 
   3843  1.3  christos   /* FIXME: The ABI says that the offset to the function goes in the
   3844  1.3  christos      descriptor, along with the segment index.  We're RELA, so it could
   3845  1.3  christos      go in the reloc instead... */
   3846  1.3  christos 
   3847  1.3  christos   if (h != NULL && SYMBOL_CALLS_LOCAL (info, h))
   3848  1.3  christos     {
   3849  1.3  christos       section = h->root.u.def.section;
   3850  1.3  christos       value = h->root.u.def.value;
   3851  1.3  christos     }
   3852  1.3  christos 
   3853  1.3  christos   if (h == NULL || SYMBOL_CALLS_LOCAL (info, h))
   3854  1.3  christos     {
   3855  1.3  christos       dynindx = elf_section_data (section->output_section)->dynindx;
   3856  1.3  christos       addr = value + section->output_offset;
   3857  1.3  christos       seg = sh_elf_osec_to_segment (output_bfd, section->output_section);
   3858  1.3  christos     }
   3859  1.3  christos   else
   3860  1.3  christos     {
   3861  1.3  christos       BFD_ASSERT (h->dynindx != -1);
   3862  1.3  christos       dynindx = h->dynindx;
   3863  1.3  christos       addr = seg = 0;
   3864  1.3  christos     }
   3865  1.3  christos 
   3866  1.3  christos   if (!info->shared && SYMBOL_CALLS_LOCAL (info, h))
   3867  1.3  christos     {
   3868  1.3  christos       if (h == NULL || h->root.type != bfd_link_hash_undefweak)
   3869  1.3  christos 	{
   3870  1.3  christos 	  sh_elf_add_rofixup (output_bfd, htab->srofixup,
   3871  1.3  christos 			      offset
   3872  1.3  christos 			      + htab->sfuncdesc->output_section->vma
   3873  1.3  christos 			      + htab->sfuncdesc->output_offset);
   3874  1.3  christos 	  sh_elf_add_rofixup (output_bfd, htab->srofixup,
   3875  1.3  christos 			      offset + 4
   3876  1.3  christos 			      + htab->sfuncdesc->output_section->vma
   3877  1.3  christos 			      + htab->sfuncdesc->output_offset);
   3878  1.3  christos 	}
   3879  1.3  christos 
   3880  1.3  christos       /* There are no dynamic relocations so fill in the final
   3881  1.3  christos 	 address and gp value (barring fixups).  */
   3882  1.3  christos       addr += section->output_section->vma;
   3883  1.3  christos       seg = htab->root.hgot->root.u.def.value
   3884  1.3  christos 	+ htab->root.hgot->root.u.def.section->output_section->vma
   3885  1.3  christos 	+ htab->root.hgot->root.u.def.section->output_offset;
   3886  1.3  christos     }
   3887  1.3  christos   else
   3888  1.3  christos     sh_elf_add_dyn_reloc (output_bfd, htab->srelfuncdesc,
   3889  1.3  christos 			  offset
   3890  1.3  christos 			  + htab->sfuncdesc->output_section->vma
   3891  1.3  christos 			  + htab->sfuncdesc->output_offset,
   3892  1.3  christos 			  R_SH_FUNCDESC_VALUE, dynindx, 0);
   3893  1.3  christos 
   3894  1.3  christos   bfd_put_32 (output_bfd, addr, htab->sfuncdesc->contents + offset);
   3895  1.3  christos   bfd_put_32 (output_bfd, seg, htab->sfuncdesc->contents + offset + 4);
   3896  1.3  christos 
   3897  1.3  christos   return TRUE;
   3898  1.3  christos }
   3899  1.3  christos 
   3900  1.3  christos /* Install a 20-bit movi20 field starting at ADDR, which occurs in OUTPUT_BFD.
   3901  1.3  christos    VALUE is the field's value.  Return bfd_reloc_ok if successful or an error
   3902  1.3  christos    otherwise.  */
   3903  1.3  christos 
   3904  1.3  christos static bfd_reloc_status_type
   3905  1.3  christos install_movi20_field (bfd *output_bfd, unsigned long relocation,
   3906  1.3  christos 		      bfd *input_bfd, asection *input_section,
   3907  1.3  christos 		      bfd_byte *contents, bfd_vma offset)
   3908  1.3  christos {
   3909  1.3  christos   unsigned long cur_val;
   3910  1.3  christos   bfd_byte *addr;
   3911  1.3  christos   bfd_reloc_status_type r;
   3912  1.3  christos 
   3913  1.3  christos   if (offset > bfd_get_section_limit (input_bfd, input_section))
   3914  1.3  christos     return bfd_reloc_outofrange;
   3915  1.3  christos 
   3916  1.3  christos   r = bfd_check_overflow (complain_overflow_signed, 20, 0,
   3917  1.3  christos 			  bfd_arch_bits_per_address (input_bfd), relocation);
   3918  1.3  christos   if (r != bfd_reloc_ok)
   3919  1.3  christos     return r;
   3920  1.3  christos 
   3921  1.3  christos   addr = contents + offset;
   3922  1.3  christos   cur_val = bfd_get_16 (output_bfd, addr);
   3923  1.1     skrll   bfd_put_16 (output_bfd, cur_val | ((relocation & 0xf0000) >> 12), addr);
   3924  1.1     skrll   bfd_put_16 (output_bfd, relocation & 0xffff, addr + 2);
   3925  1.1     skrll 
   3926  1.1     skrll   return bfd_reloc_ok;
   3927  1.1     skrll }
   3928  1.1     skrll 
   3929  1.1     skrll /* Relocate an SH ELF section.  */
   3930  1.1     skrll 
   3931  1.1     skrll static bfd_boolean
   3932  1.1     skrll sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   3933  1.1     skrll 			 bfd *input_bfd, asection *input_section,
   3934  1.1     skrll 			 bfd_byte *contents, Elf_Internal_Rela *relocs,
   3935  1.1     skrll 			 Elf_Internal_Sym *local_syms,
   3936  1.3  christos 			 asection **local_sections)
   3937  1.1     skrll {
   3938  1.3  christos   struct elf_sh_link_hash_table *htab;
   3939  1.3  christos   Elf_Internal_Shdr *symtab_hdr;
   3940  1.3  christos   struct elf_link_hash_entry **sym_hashes;
   3941  1.3  christos   Elf_Internal_Rela *rel, *relend;
   3942  1.3  christos   bfd *dynobj = NULL;
   3943  1.3  christos   bfd_vma *local_got_offsets;
   3944  1.3  christos   asection *sgot = NULL;
   3945  1.3  christos   asection *sgotplt = NULL;
   3946  1.1     skrll   asection *splt = NULL;
   3947  1.1     skrll   asection *sreloc = NULL;
   3948  1.1     skrll   asection *srelgot = NULL;
   3949  1.1     skrll   bfd_boolean is_vxworks_tls;
   3950  1.3  christos   unsigned isec_segment, got_segment, plt_segment, check_segment[2];
   3951  1.3  christos   bfd_boolean fdpic_p = FALSE;
   3952  1.3  christos 
   3953  1.3  christos   BFD_ASSERT (is_sh_elf (input_bfd));
   3954  1.3  christos 
   3955  1.3  christos   htab = sh_elf_hash_table (info);
   3956  1.3  christos   if (htab != NULL)
   3957  1.3  christos     {
   3958  1.1     skrll       dynobj = htab->root.dynobj;
   3959  1.1     skrll       sgot = htab->sgot;
   3960  1.1     skrll       sgotplt = htab->sgotplt;
   3961  1.1     skrll       splt = htab->splt;
   3962  1.3  christos       fdpic_p = htab->fdpic_p;
   3963  1.3  christos     }
   3964  1.3  christos   symtab_hdr = &elf_symtab_hdr (input_bfd);
   3965  1.3  christos   sym_hashes = elf_sym_hashes (input_bfd);
   3966  1.3  christos   local_got_offsets = elf_local_got_offsets (input_bfd);
   3967  1.3  christos 
   3968  1.3  christos   isec_segment = sh_elf_osec_to_segment (output_bfd,
   3969  1.3  christos 					 input_section->output_section);
   3970  1.3  christos   if (fdpic_p && sgot)
   3971  1.3  christos     got_segment = sh_elf_osec_to_segment (output_bfd,
   3972  1.3  christos 					  sgot->output_section);
   3973  1.3  christos   else
   3974  1.3  christos     got_segment = -1;
   3975  1.1     skrll   if (fdpic_p && splt)
   3976  1.1     skrll     plt_segment = sh_elf_osec_to_segment (output_bfd,
   3977  1.3  christos 					  splt->output_section);
   3978  1.1     skrll   else
   3979  1.1     skrll     plt_segment = -1;
   3980  1.1     skrll 
   3981  1.1     skrll   /* We have to handle relocations in vxworks .tls_vars sections
   3982  1.1     skrll      specially, because the dynamic loader is 'weird'.  */
   3983  1.1     skrll   is_vxworks_tls = (htab && htab->vxworks_p && info->shared
   3984  1.1     skrll 		    && !strcmp (input_section->output_section->name,
   3985  1.1     skrll 				".tls_vars"));
   3986  1.1     skrll 
   3987  1.1     skrll   rel = relocs;
   3988  1.1     skrll   relend = relocs + input_section->reloc_count;
   3989  1.1     skrll   for (; rel < relend; rel++)
   3990  1.1     skrll     {
   3991  1.1     skrll       int r_type;
   3992  1.1     skrll       reloc_howto_type *howto;
   3993  1.1     skrll       unsigned long r_symndx;
   3994  1.1     skrll       Elf_Internal_Sym *sym;
   3995  1.1     skrll       asection *sec;
   3996  1.3  christos       struct elf_link_hash_entry *h;
   3997  1.3  christos       bfd_vma relocation;
   3998  1.1     skrll       bfd_vma addend = (bfd_vma) 0;
   3999  1.1     skrll       bfd_reloc_status_type r;
   4000  1.1     skrll       int seen_stt_datalabel = 0;
   4001  1.1     skrll       bfd_vma off;
   4002  1.1     skrll       int got_type;
   4003  1.1     skrll       const char *symname = NULL;
   4004  1.1     skrll 
   4005  1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   4006  1.1     skrll 
   4007  1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   4008  1.1     skrll 
   4009  1.1     skrll       /* Many of the relocs are only used for relaxing, and are
   4010  1.1     skrll 	 handled entirely by the relaxation code.  */
   4011  1.1     skrll       if (r_type >= (int) R_SH_GNU_VTINHERIT
   4012  1.1     skrll 	  && r_type <= (int) R_SH_LABEL)
   4013  1.1     skrll 	continue;
   4014  1.1     skrll       if (r_type == (int) R_SH_NONE)
   4015  1.3  christos 	continue;
   4016  1.3  christos 
   4017  1.1     skrll       if (r_type < 0
   4018  1.1     skrll 	  || r_type >= R_SH_max
   4019  1.1     skrll 	  || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
   4020  1.1     skrll 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC)
   4021  1.1     skrll 	  || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
   4022  1.1     skrll 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC_2)
   4023  1.3  christos 	  || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_3
   4024  1.3  christos 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC_3)
   4025  1.1     skrll 	  || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
   4026  1.1     skrll 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC_4)
   4027  1.1     skrll 	  || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_5
   4028  1.1     skrll 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC_5)
   4029  1.1     skrll 	  || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_6
   4030  1.1     skrll 	      && r_type <= (int) R_SH_LAST_INVALID_RELOC_6))
   4031  1.1     skrll 	{
   4032  1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   4033  1.1     skrll 	  return FALSE;
   4034  1.1     skrll 	}
   4035  1.1     skrll 
   4036  1.1     skrll       howto = get_howto_table (output_bfd) + r_type;
   4037  1.1     skrll 
   4038  1.1     skrll       /* For relocs that aren't partial_inplace, we get the addend from
   4039  1.1     skrll 	 the relocation.  */
   4040  1.3  christos       if (! howto->partial_inplace)
   4041  1.3  christos 	addend = rel->r_addend;
   4042  1.1     skrll 
   4043  1.1     skrll       h = NULL;
   4044  1.1     skrll       sym = NULL;
   4045  1.1     skrll       sec = NULL;
   4046  1.3  christos       check_segment[0] = -1;
   4047  1.3  christos       check_segment[1] = -1;
   4048  1.3  christos       if (r_symndx < symtab_hdr->sh_info)
   4049  1.3  christos 	{
   4050  1.3  christos 	  sym = local_syms + r_symndx;
   4051  1.3  christos 	  sec = local_sections[r_symndx];
   4052  1.1     skrll 
   4053  1.1     skrll 	  symname = bfd_elf_string_from_elf_section
   4054  1.1     skrll 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
   4055  1.1     skrll 	  if (symname == NULL || *symname == '\0')
   4056  1.1     skrll 	    symname = bfd_section_name (input_bfd, sec);
   4057  1.1     skrll 
   4058  1.1     skrll 	  relocation = (sec->output_section->vma
   4059  1.1     skrll 			+ sec->output_offset
   4060  1.1     skrll 			+ sym->st_value);
   4061  1.1     skrll 	  /* A local symbol never has STO_SH5_ISA32, so we don't need
   4062  1.1     skrll 	     datalabel processing here.  Make sure this does not change
   4063  1.1     skrll 	     without notice.  */
   4064  1.1     skrll 	  if ((sym->st_other & STO_SH5_ISA32) != 0)
   4065  1.1     skrll 	    ((*info->callbacks->reloc_dangerous)
   4066  1.1     skrll 	     (info,
   4067  1.1     skrll 	      _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
   4068  1.1     skrll 	      input_bfd, input_section, rel->r_offset));
   4069  1.1     skrll 
   4070  1.1     skrll 	  if (sec != NULL && elf_discarded_section (sec))
   4071  1.1     skrll 	    /* Handled below.  */
   4072  1.1     skrll 	    ;
   4073  1.1     skrll 	  else if (info->relocatable)
   4074  1.1     skrll 	    {
   4075  1.1     skrll 	      /* This is a relocatable link.  We don't have to change
   4076  1.1     skrll 		 anything, unless the reloc is against a section symbol,
   4077  1.1     skrll 		 in which case we have to adjust according to where the
   4078  1.1     skrll 		 section symbol winds up in the output section.  */
   4079  1.1     skrll 	      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   4080  1.1     skrll 		{
   4081  1.1     skrll 		  if (! howto->partial_inplace)
   4082  1.1     skrll 		    {
   4083  1.1     skrll 		      /* For relocations with the addend in the
   4084  1.1     skrll 			 relocation, we need just to update the addend.
   4085  1.1     skrll 			 All real relocs are of type partial_inplace; this
   4086  1.1     skrll 			 code is mostly for completeness.  */
   4087  1.1     skrll 		      rel->r_addend += sec->output_offset;
   4088  1.1     skrll 
   4089  1.1     skrll 		      continue;
   4090  1.1     skrll 		    }
   4091  1.1     skrll 
   4092  1.1     skrll 		  /* Relocs of type partial_inplace need to pick up the
   4093  1.1     skrll 		     contents in the contents and add the offset resulting
   4094  1.1     skrll 		     from the changed location of the section symbol.
   4095  1.1     skrll 		     Using _bfd_final_link_relocate (e.g. goto
   4096  1.1     skrll 		     final_link_relocate) here would be wrong, because
   4097  1.1     skrll 		     relocations marked pc_relative would get the current
   4098  1.1     skrll 		     location subtracted, and we must only do that at the
   4099  1.1     skrll 		     final link.  */
   4100  1.1     skrll 		  r = _bfd_relocate_contents (howto, input_bfd,
   4101  1.1     skrll 					      sec->output_offset
   4102  1.1     skrll 					      + sym->st_value,
   4103  1.1     skrll 					      contents + rel->r_offset);
   4104  1.1     skrll 		  goto relocation_done;
   4105  1.1     skrll 		}
   4106  1.1     skrll 
   4107  1.1     skrll 	      continue;
   4108  1.1     skrll 	    }
   4109  1.1     skrll 	  else if (! howto->partial_inplace)
   4110  1.1     skrll 	    {
   4111  1.1     skrll 	      relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   4112  1.1     skrll 	      addend = rel->r_addend;
   4113  1.1     skrll 	    }
   4114  1.1     skrll 	  else if ((sec->flags & SEC_MERGE)
   4115  1.1     skrll 		   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   4116  1.1     skrll 	    {
   4117  1.1     skrll 	      asection *msec;
   4118  1.1     skrll 
   4119  1.1     skrll 	      if (howto->rightshift || howto->src_mask != 0xffffffff)
   4120  1.1     skrll 		{
   4121  1.1     skrll 		  (*_bfd_error_handler)
   4122  1.1     skrll 		    (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
   4123  1.1     skrll 		     input_bfd, input_section,
   4124  1.1     skrll 		     (long) rel->r_offset, howto->name);
   4125  1.1     skrll 		  return FALSE;
   4126  1.1     skrll 		}
   4127  1.1     skrll 
   4128  1.1     skrll 	      addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
   4129  1.1     skrll 	      msec = sec;
   4130  1.1     skrll 	      addend =
   4131  1.1     skrll 		_bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
   4132  1.1     skrll 		- relocation;
   4133  1.1     skrll 	      addend += msec->output_section->vma + msec->output_offset;
   4134  1.1     skrll 	      bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
   4135  1.1     skrll 	      addend = 0;
   4136  1.1     skrll 	    }
   4137  1.1     skrll 	}
   4138  1.3  christos       else
   4139  1.1     skrll 	{
   4140  1.1     skrll 	  /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro.  */
   4141  1.1     skrll 
   4142  1.1     skrll 	  relocation = 0;
   4143  1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   4144  1.1     skrll 	  symname = h->root.root.string;
   4145  1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   4146  1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   4147  1.1     skrll 	    {
   4148  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4149  1.1     skrll 	      /* If the reference passes a symbol marked with
   4150  1.1     skrll 		 STT_DATALABEL, then any STO_SH5_ISA32 on the final value
   4151  1.1     skrll 		 doesn't count.  */
   4152  1.1     skrll 	      seen_stt_datalabel |= h->type == STT_DATALABEL;
   4153  1.1     skrll #endif
   4154  1.1     skrll 	      h = (struct elf_link_hash_entry *) h->root.u.i.link;
   4155  1.3  christos 	    }
   4156  1.1     skrll 	  if (h->root.type == bfd_link_hash_defined
   4157  1.1     skrll 	      || h->root.type == bfd_link_hash_defweak)
   4158  1.1     skrll 	    {
   4159  1.1     skrll 	      bfd_boolean dyn;
   4160  1.1     skrll 
   4161  1.1     skrll 	      dyn = htab ? htab->root.dynamic_sections_created : FALSE;
   4162  1.1     skrll 	      sec = h->root.u.def.section;
   4163  1.1     skrll 	      /* In these cases, we don't need the relocation value.
   4164  1.1     skrll 		 We check specially because in some obscure cases
   4165  1.1     skrll 		 sec->output_section will be NULL.  */
   4166  1.1     skrll 	      if (r_type == R_SH_GOTPC
   4167  1.1     skrll 		  || r_type == R_SH_GOTPC_LOW16
   4168  1.1     skrll 		  || r_type == R_SH_GOTPC_MEDLOW16
   4169  1.1     skrll 		  || r_type == R_SH_GOTPC_MEDHI16
   4170  1.1     skrll 		  || r_type == R_SH_GOTPC_HI16
   4171  1.1     skrll 		  || ((r_type == R_SH_PLT32
   4172  1.3  christos 		       || r_type == R_SH_PLT_LOW16
   4173  1.3  christos 		       || r_type == R_SH_PLT_MEDLOW16
   4174  1.3  christos 		       || r_type == R_SH_PLT_MEDHI16
   4175  1.3  christos 		       || r_type == R_SH_PLT_HI16)
   4176  1.3  christos 		      && h->plt.offset != (bfd_vma) -1)
   4177  1.3  christos 		  || ((r_type == R_SH_GOT32
   4178  1.1     skrll 		       || r_type == R_SH_GOT20
   4179  1.1     skrll 		       || r_type == R_SH_GOTFUNCDESC
   4180  1.1     skrll 		       || r_type == R_SH_GOTFUNCDESC20
   4181  1.1     skrll 		       || r_type == R_SH_GOTOFFFUNCDESC
   4182  1.1     skrll 		       || r_type == R_SH_GOTOFFFUNCDESC20
   4183  1.1     skrll 		       || r_type == R_SH_FUNCDESC
   4184  1.1     skrll 		       || r_type == R_SH_GOT_LOW16
   4185  1.1     skrll 		       || r_type == R_SH_GOT_MEDLOW16
   4186  1.1     skrll 		       || r_type == R_SH_GOT_MEDHI16
   4187  1.1     skrll 		       || r_type == R_SH_GOT_HI16)
   4188  1.1     skrll 		      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   4189  1.1     skrll 		      && (! info->shared
   4190  1.1     skrll 			  || (! info->symbolic && h->dynindx != -1)
   4191  1.1     skrll 			  || !h->def_regular))
   4192  1.1     skrll 		  /* The cases above are those in which relocation is
   4193  1.1     skrll 		     overwritten in the switch block below.  The cases
   4194  1.1     skrll 		     below are those in which we must defer relocation
   4195  1.1     skrll 		     to run-time, because we can't resolve absolute
   4196  1.1     skrll 		     addresses when creating a shared library.  */
   4197  1.1     skrll 		  || (info->shared
   4198  1.1     skrll 		      && ((! info->symbolic && h->dynindx != -1)
   4199  1.1     skrll 			  || !h->def_regular)
   4200  1.1     skrll 		      && ((r_type == R_SH_DIR32
   4201  1.1     skrll 			   && !h->forced_local)
   4202  1.1     skrll 			  || (r_type == R_SH_REL32
   4203  1.1     skrll 			      && !SYMBOL_CALLS_LOCAL (info, h)))
   4204  1.1     skrll 		      && ((input_section->flags & SEC_ALLOC) != 0
   4205  1.1     skrll 			  /* DWARF will emit R_SH_DIR32 relocations in its
   4206  1.1     skrll 			     sections against symbols defined externally
   4207  1.1     skrll 			     in shared libraries.  We can't do anything
   4208  1.1     skrll 			     with them here.  */
   4209  1.1     skrll 			  || ((input_section->flags & SEC_DEBUGGING) != 0
   4210  1.1     skrll 			      && h->def_dynamic)))
   4211  1.1     skrll 		  /* Dynamic relocs are not propagated for SEC_DEBUGGING
   4212  1.3  christos 		     sections because such sections are not SEC_ALLOC and
   4213  1.3  christos 		     thus ld.so will not process them.  */
   4214  1.1     skrll 		  || (sec->output_section == NULL
   4215  1.1     skrll 		      && ((input_section->flags & SEC_DEBUGGING) != 0
   4216  1.1     skrll 			  && h->def_dynamic))
   4217  1.1     skrll 		  || (sec->output_section == NULL
   4218  1.1     skrll 		      && (sh_elf_hash_entry (h)->got_type == GOT_TLS_IE
   4219  1.1     skrll 			  || sh_elf_hash_entry (h)->got_type == GOT_TLS_GD)))
   4220  1.1     skrll 		;
   4221  1.1     skrll 	      else if (sec->output_section != NULL)
   4222  1.1     skrll 		relocation = ((h->root.u.def.value
   4223  1.1     skrll 			      + sec->output_section->vma
   4224  1.1     skrll 			      + sec->output_offset)
   4225  1.1     skrll 			      /* A STO_SH5_ISA32 causes a "bitor 1" to the
   4226  1.1     skrll 				 symbol value, unless we've seen
   4227  1.1     skrll 				 STT_DATALABEL on the way to it.  */
   4228  1.1     skrll 			      | ((h->other & STO_SH5_ISA32) != 0
   4229  1.1     skrll 				 && ! seen_stt_datalabel));
   4230  1.1     skrll 	      else if (!info->relocatable)
   4231  1.1     skrll 		{
   4232  1.1     skrll 		  (*_bfd_error_handler)
   4233  1.1     skrll 		    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   4234  1.1     skrll 		     input_bfd,
   4235  1.1     skrll 		     input_section,
   4236  1.1     skrll 		     (long) rel->r_offset,
   4237  1.1     skrll 		     howto->name,
   4238  1.1     skrll 		     h->root.root.string);
   4239  1.1     skrll 		  return FALSE;
   4240  1.1     skrll 		}
   4241  1.1     skrll 	    }
   4242  1.1     skrll 	  else if (h->root.type == bfd_link_hash_undefweak)
   4243  1.1     skrll 	    ;
   4244  1.1     skrll 	  else if (info->unresolved_syms_in_objects == RM_IGNORE
   4245  1.1     skrll 		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
   4246  1.1     skrll 	    ;
   4247  1.1     skrll 	  else if (!info->relocatable)
   4248  1.1     skrll 	    {
   4249  1.1     skrll 	      if (! info->callbacks->undefined_symbol
   4250  1.1     skrll 		  (info, h->root.root.string, input_bfd,
   4251  1.1     skrll 		   input_section, rel->r_offset,
   4252  1.1     skrll 		   (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
   4253  1.3  christos 		    || ELF_ST_VISIBILITY (h->other))))
   4254  1.3  christos 		return FALSE;
   4255  1.1     skrll 	    }
   4256  1.1     skrll 	}
   4257  1.1     skrll 
   4258  1.1     skrll       if (sec != NULL && elf_discarded_section (sec))
   4259  1.3  christos 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   4260  1.3  christos 					 rel, relend, howto, contents);
   4261  1.3  christos 
   4262  1.3  christos       if (info->relocatable)
   4263  1.3  christos 	continue;
   4264  1.3  christos 
   4265  1.3  christos       /* Check for inter-segment relocations in FDPIC files.  Most
   4266  1.3  christos 	 relocations connect the relocation site to the location of
   4267  1.3  christos 	 the target symbol, but there are some exceptions below.  */
   4268  1.3  christos       check_segment[0] = isec_segment;
   4269  1.1     skrll       if (sec != NULL)
   4270  1.1     skrll 	check_segment[1] = sh_elf_osec_to_segment (output_bfd,
   4271  1.1     skrll 						   sec->output_section);
   4272  1.1     skrll       else
   4273  1.1     skrll 	check_segment[1] = -1;
   4274  1.1     skrll 
   4275  1.1     skrll       switch ((int) r_type)
   4276  1.1     skrll 	{
   4277  1.1     skrll 	final_link_relocate:
   4278  1.1     skrll 	  /* COFF relocs don't use the addend. The addend is used for
   4279  1.1     skrll 	     R_SH_DIR32 to be compatible with other compilers.  */
   4280  1.1     skrll 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   4281  1.1     skrll 					contents, rel->r_offset,
   4282  1.1     skrll 					relocation, addend);
   4283  1.1     skrll 	  break;
   4284  1.1     skrll 
   4285  1.1     skrll 	case R_SH_IND12W:
   4286  1.1     skrll 	  goto final_link_relocate;
   4287  1.1     skrll 
   4288  1.1     skrll 	case R_SH_DIR8WPN:
   4289  1.1     skrll 	case R_SH_DIR8WPZ:
   4290  1.1     skrll 	case R_SH_DIR8WPL:
   4291  1.1     skrll 	  /* If the reloc is against the start of this section, then
   4292  1.1     skrll 	     the assembler has already taken care of it and the reloc
   4293  1.1     skrll 	     is here only to assist in relaxing.  If the reloc is not
   4294  1.1     skrll 	     against the start of this section, then it's against an
   4295  1.1     skrll 	     external symbol and we must deal with it ourselves.  */
   4296  1.1     skrll 	  if (input_section->output_section->vma + input_section->output_offset
   4297  1.1     skrll 	      != relocation)
   4298  1.1     skrll 	    {
   4299  1.1     skrll 	      int disp = (relocation
   4300  1.1     skrll 			  - input_section->output_section->vma
   4301  1.1     skrll 			  - input_section->output_offset
   4302  1.1     skrll 			  - rel->r_offset);
   4303  1.1     skrll 	      int mask = 0;
   4304  1.1     skrll 	      switch (r_type)
   4305  1.1     skrll 		{
   4306  1.1     skrll 		case R_SH_DIR8WPN:
   4307  1.1     skrll 		case R_SH_DIR8WPZ: mask = 1; break;
   4308  1.1     skrll 		case R_SH_DIR8WPL: mask = 3; break;
   4309  1.1     skrll 		default: mask = 0; break;
   4310  1.1     skrll 		}
   4311  1.1     skrll 	      if (disp & mask)
   4312  1.1     skrll 		{
   4313  1.1     skrll 		  ((*_bfd_error_handler)
   4314  1.1     skrll 		   (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
   4315  1.1     skrll 		    input_section->owner,
   4316  1.1     skrll 		    (unsigned long) rel->r_offset));
   4317  1.1     skrll 		  bfd_set_error (bfd_error_bad_value);
   4318  1.1     skrll 		  return FALSE;
   4319  1.1     skrll 		}
   4320  1.1     skrll 	      relocation -= 4;
   4321  1.1     skrll 	      goto final_link_relocate;
   4322  1.1     skrll 	    }
   4323  1.1     skrll 	  r = bfd_reloc_ok;
   4324  1.1     skrll 	  break;
   4325  1.1     skrll 
   4326  1.1     skrll 	default:
   4327  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4328  1.1     skrll 	  if (shmedia_prepare_reloc (info, input_bfd, input_section,
   4329  1.1     skrll 				     contents, rel, &relocation))
   4330  1.1     skrll 	    goto final_link_relocate;
   4331  1.1     skrll #endif
   4332  1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   4333  1.1     skrll 	  return FALSE;
   4334  1.1     skrll 
   4335  1.1     skrll 	case R_SH_DIR16:
   4336  1.1     skrll 	case R_SH_DIR8:
   4337  1.1     skrll 	case R_SH_DIR8U:
   4338  1.1     skrll 	case R_SH_DIR8S:
   4339  1.1     skrll 	case R_SH_DIR4U:
   4340  1.1     skrll 	  goto final_link_relocate;
   4341  1.1     skrll 
   4342  1.1     skrll 	case R_SH_DIR8UL:
   4343  1.1     skrll 	case R_SH_DIR4UL:
   4344  1.1     skrll 	  if (relocation & 3)
   4345  1.1     skrll 	    {
   4346  1.1     skrll 	      ((*_bfd_error_handler)
   4347  1.1     skrll 	       (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
   4348  1.1     skrll 		input_section->owner,
   4349  1.1     skrll 		(unsigned long) rel->r_offset, howto->name,
   4350  1.1     skrll 		(unsigned long) relocation));
   4351  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   4352  1.1     skrll 	      return FALSE;
   4353  1.1     skrll 	    }
   4354  1.1     skrll 	  goto final_link_relocate;
   4355  1.1     skrll 
   4356  1.1     skrll 	case R_SH_DIR8UW:
   4357  1.1     skrll 	case R_SH_DIR8SW:
   4358  1.1     skrll 	case R_SH_DIR4UW:
   4359  1.1     skrll 	  if (relocation & 1)
   4360  1.1     skrll 	    {
   4361  1.1     skrll 	      ((*_bfd_error_handler)
   4362  1.1     skrll 	       (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
   4363  1.1     skrll 		input_section->owner,
   4364  1.1     skrll 		(unsigned long) rel->r_offset, howto->name,
   4365  1.1     skrll 		(unsigned long) relocation));
   4366  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   4367  1.1     skrll 	      return FALSE;
   4368  1.1     skrll 	    }
   4369  1.1     skrll 	  goto final_link_relocate;
   4370  1.1     skrll 
   4371  1.1     skrll 	case R_SH_PSHA:
   4372  1.1     skrll 	  if ((signed int)relocation < -32
   4373  1.1     skrll 	      || (signed int)relocation > 32)
   4374  1.1     skrll 	    {
   4375  1.1     skrll 	      ((*_bfd_error_handler)
   4376  1.1     skrll 	       (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
   4377  1.1     skrll 		input_section->owner,
   4378  1.1     skrll 		(unsigned long) rel->r_offset,
   4379  1.1     skrll 		(unsigned long) relocation));
   4380  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   4381  1.1     skrll 	      return FALSE;
   4382  1.1     skrll 	    }
   4383  1.1     skrll 	  goto final_link_relocate;
   4384  1.1     skrll 
   4385  1.1     skrll 	case R_SH_PSHL:
   4386  1.1     skrll 	  if ((signed int)relocation < -16
   4387  1.1     skrll 	      || (signed int)relocation > 16)
   4388  1.1     skrll 	    {
   4389  1.1     skrll 	      ((*_bfd_error_handler)
   4390  1.1     skrll 	       (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
   4391  1.1     skrll 		input_section->owner,
   4392  1.1     skrll 		(unsigned long) rel->r_offset,
   4393  1.1     skrll 		(unsigned long) relocation));
   4394  1.1     skrll 	      bfd_set_error (bfd_error_bad_value);
   4395  1.1     skrll 	      return FALSE;
   4396  1.1     skrll 	    }
   4397  1.1     skrll 	  goto final_link_relocate;
   4398  1.1     skrll 
   4399  1.1     skrll 	case R_SH_DIR32:
   4400  1.1     skrll 	case R_SH_REL32:
   4401  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4402  1.1     skrll 	case R_SH_IMM_LOW16_PCREL:
   4403  1.1     skrll 	case R_SH_IMM_MEDLOW16_PCREL:
   4404  1.1     skrll 	case R_SH_IMM_MEDHI16_PCREL:
   4405  1.3  christos 	case R_SH_IMM_HI16_PCREL:
   4406  1.1     skrll #endif
   4407  1.1     skrll 	  if (info->shared
   4408  1.1     skrll 	      && (h == NULL
   4409  1.1     skrll 		  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   4410  1.1     skrll 		  || h->root.type != bfd_link_hash_undefweak)
   4411  1.1     skrll 	      && r_symndx != STN_UNDEF
   4412  1.1     skrll 	      && (input_section->flags & SEC_ALLOC) != 0
   4413  1.1     skrll 	      && !is_vxworks_tls
   4414  1.1     skrll 	      && (r_type == R_SH_DIR32
   4415  1.1     skrll 		  || !SYMBOL_CALLS_LOCAL (info, h)))
   4416  1.1     skrll 	    {
   4417  1.1     skrll 	      Elf_Internal_Rela outrel;
   4418  1.1     skrll 	      bfd_byte *loc;
   4419  1.1     skrll 	      bfd_boolean skip, relocate;
   4420  1.1     skrll 
   4421  1.3  christos 	      /* When generating a shared object, these relocations
   4422  1.3  christos 		 are copied into the output file to be resolved at run
   4423  1.3  christos 		 time.  */
   4424  1.1     skrll 
   4425  1.1     skrll 	      if (sreloc == NULL)
   4426  1.1     skrll 		{
   4427  1.1     skrll 		  sreloc = _bfd_elf_get_dynamic_reloc_section
   4428  1.1     skrll 		    (input_bfd, input_section, /*rela?*/ TRUE);
   4429  1.1     skrll 		  if (sreloc == NULL)
   4430  1.1     skrll 		    return FALSE;
   4431  1.1     skrll 		}
   4432  1.1     skrll 
   4433  1.1     skrll 	      skip = FALSE;
   4434  1.1     skrll 	      relocate = FALSE;
   4435  1.1     skrll 
   4436  1.1     skrll 	      outrel.r_offset =
   4437  1.1     skrll 		_bfd_elf_section_offset (output_bfd, info, input_section,
   4438  1.1     skrll 					 rel->r_offset);
   4439  1.1     skrll 	      if (outrel.r_offset == (bfd_vma) -1)
   4440  1.1     skrll 		skip = TRUE;
   4441  1.1     skrll 	      else if (outrel.r_offset == (bfd_vma) -2)
   4442  1.1     skrll 		skip = TRUE, relocate = TRUE;
   4443  1.1     skrll 	      outrel.r_offset += (input_section->output_section->vma
   4444  1.1     skrll 				  + input_section->output_offset);
   4445  1.1     skrll 
   4446  1.1     skrll 	      if (skip)
   4447  1.1     skrll 		memset (&outrel, 0, sizeof outrel);
   4448  1.1     skrll 	      else if (r_type == R_SH_REL32)
   4449  1.1     skrll 		{
   4450  1.1     skrll 		  BFD_ASSERT (h != NULL && h->dynindx != -1);
   4451  1.1     skrll 		  outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
   4452  1.1     skrll 		  outrel.r_addend
   4453  1.1     skrll 		    = (howto->partial_inplace
   4454  1.1     skrll 		       ? bfd_get_32 (input_bfd, contents + rel->r_offset)
   4455  1.1     skrll 		       : addend);
   4456  1.1     skrll 		}
   4457  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4458  1.1     skrll 	      else if (r_type == R_SH_IMM_LOW16_PCREL
   4459  1.1     skrll 		       || r_type == R_SH_IMM_MEDLOW16_PCREL
   4460  1.1     skrll 		       || r_type == R_SH_IMM_MEDHI16_PCREL
   4461  1.1     skrll 		       || r_type == R_SH_IMM_HI16_PCREL)
   4462  1.3  christos 		{
   4463  1.3  christos 		  BFD_ASSERT (h != NULL && h->dynindx != -1);
   4464  1.3  christos 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   4465  1.3  christos 		  outrel.r_addend = addend;
   4466  1.3  christos 		}
   4467  1.3  christos #endif
   4468  1.3  christos 	      else if (fdpic_p
   4469  1.3  christos 		       && (h == NULL
   4470  1.3  christos 			   || ((info->symbolic || h->dynindx == -1)
   4471  1.3  christos 			       && h->def_regular)))
   4472  1.3  christos 		{
   4473  1.3  christos 		  int dynindx;
   4474  1.3  christos 
   4475  1.3  christos 		  BFD_ASSERT (sec != NULL);
   4476  1.3  christos 		  BFD_ASSERT (sec->output_section != NULL);
   4477  1.3  christos 		  dynindx = elf_section_data (sec->output_section)->dynindx;
   4478  1.3  christos 		  outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
   4479  1.3  christos 		  outrel.r_addend = relocation;
   4480  1.1     skrll 		  outrel.r_addend
   4481  1.1     skrll 		    += (howto->partial_inplace
   4482  1.1     skrll 			? bfd_get_32 (input_bfd, contents + rel->r_offset)
   4483  1.1     skrll 			: addend);
   4484  1.1     skrll 		  outrel.r_addend -= sec->output_section->vma;
   4485  1.1     skrll 		}
   4486  1.1     skrll 	      else
   4487  1.1     skrll 		{
   4488  1.1     skrll 		  /* h->dynindx may be -1 if this symbol was marked to
   4489  1.1     skrll 		     become local.  */
   4490  1.1     skrll 		  if (h == NULL
   4491  1.1     skrll 		      || ((info->symbolic || h->dynindx == -1)
   4492  1.1     skrll 			  && h->def_regular))
   4493  1.1     skrll 		    {
   4494  1.1     skrll 		      relocate = howto->partial_inplace;
   4495  1.1     skrll 		      outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
   4496  1.1     skrll 		    }
   4497  1.1     skrll 		  else
   4498  1.1     skrll 		    {
   4499  1.1     skrll 		      BFD_ASSERT (h->dynindx != -1);
   4500  1.1     skrll 		      outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
   4501  1.1     skrll 		    }
   4502  1.1     skrll 		  outrel.r_addend = relocation;
   4503  1.1     skrll 		  outrel.r_addend
   4504  1.1     skrll 		    += (howto->partial_inplace
   4505  1.1     skrll 			? bfd_get_32 (input_bfd, contents + rel->r_offset)
   4506  1.1     skrll 			: addend);
   4507  1.3  christos 		}
   4508  1.3  christos 
   4509  1.1     skrll 	      loc = sreloc->contents;
   4510  1.1     skrll 	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   4511  1.1     skrll 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   4512  1.1     skrll 
   4513  1.1     skrll 	      check_segment[0] = check_segment[1] = -1;
   4514  1.1     skrll 
   4515  1.1     skrll 	      /* If this reloc is against an external symbol, we do
   4516  1.3  christos 		 not want to fiddle with the addend.  Otherwise, we
   4517  1.3  christos 		 need to include the symbol value so that it becomes
   4518  1.3  christos 		 an addend for the dynamic reloc.  */
   4519  1.3  christos 	      if (! relocate)
   4520  1.3  christos 		continue;
   4521  1.3  christos 	    }
   4522  1.3  christos 	  else if (fdpic_p && !info->shared
   4523  1.3  christos 		   && r_type == R_SH_DIR32
   4524  1.3  christos 		   && (input_section->flags & SEC_ALLOC) != 0)
   4525  1.3  christos 	    {
   4526  1.3  christos 	      bfd_vma offset;
   4527  1.3  christos 
   4528  1.3  christos 	      BFD_ASSERT (htab);
   4529  1.3  christos 
   4530  1.3  christos 		if (sh_elf_osec_readonly_p (output_bfd,
   4531  1.3  christos 					    input_section->output_section))
   4532  1.3  christos 		  {
   4533  1.3  christos 		    (*_bfd_error_handler)
   4534  1.3  christos 		      (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
   4535  1.3  christos 		       input_bfd,
   4536  1.3  christos 		       input_section,
   4537  1.3  christos 		       (long) rel->r_offset,
   4538  1.3  christos 		       symname);
   4539  1.3  christos 		    return FALSE;
   4540  1.3  christos 		  }
   4541  1.3  christos 
   4542  1.3  christos 	      offset = _bfd_elf_section_offset (output_bfd, info,
   4543  1.3  christos 						input_section, rel->r_offset);
   4544  1.3  christos 	      if (offset != (bfd_vma)-1)
   4545  1.3  christos 		sh_elf_add_rofixup (output_bfd, htab->srofixup,
   4546  1.1     skrll 				    input_section->output_section->vma
   4547  1.1     skrll 				    + input_section->output_offset
   4548  1.1     skrll 				    + rel->r_offset);
   4549  1.1     skrll 
   4550  1.1     skrll 	      check_segment[0] = check_segment[1] = -1;
   4551  1.1     skrll 	    }
   4552  1.1     skrll 	  goto final_link_relocate;
   4553  1.1     skrll 
   4554  1.1     skrll 	case R_SH_GOTPLT32:
   4555  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4556  1.1     skrll 	case R_SH_GOTPLT_LOW16:
   4557  1.1     skrll 	case R_SH_GOTPLT_MEDLOW16:
   4558  1.1     skrll 	case R_SH_GOTPLT_MEDHI16:
   4559  1.1     skrll 	case R_SH_GOTPLT_HI16:
   4560  1.1     skrll 	case R_SH_GOTPLT10BY4:
   4561  1.1     skrll 	case R_SH_GOTPLT10BY8:
   4562  1.1     skrll #endif
   4563  1.1     skrll 	  /* Relocation is to the entry for this symbol in the
   4564  1.1     skrll 	     procedure linkage table.  */
   4565  1.1     skrll 
   4566  1.1     skrll 	  if (h == NULL
   4567  1.1     skrll 	      || h->forced_local
   4568  1.1     skrll 	      || ! info->shared
   4569  1.1     skrll 	      || info->symbolic
   4570  1.1     skrll 	      || h->dynindx == -1
   4571  1.1     skrll 	      || h->plt.offset == (bfd_vma) -1
   4572  1.3  christos 	      || h->got.offset != (bfd_vma) -1)
   4573  1.1     skrll 	    goto force_got;
   4574  1.1     skrll 
   4575  1.1     skrll 	  /* Relocation is to the entry for this symbol in the global
   4576  1.1     skrll 	     offset table extension for the procedure linkage table.  */
   4577  1.1     skrll 
   4578  1.1     skrll 	  BFD_ASSERT (htab);
   4579  1.1     skrll 	  BFD_ASSERT (sgotplt != NULL);
   4580  1.1     skrll 	  relocation = (sgotplt->output_offset
   4581  1.1     skrll 			+ (get_plt_index (htab->plt_info, h->plt.offset)
   4582  1.1     skrll 			   + 3) * 4);
   4583  1.1     skrll 
   4584  1.1     skrll #ifdef GOT_BIAS
   4585  1.1     skrll 	  relocation -= GOT_BIAS;
   4586  1.3  christos #endif
   4587  1.1     skrll 
   4588  1.1     skrll 	  goto final_link_relocate;
   4589  1.1     skrll 
   4590  1.1     skrll 	force_got:
   4591  1.1     skrll 	case R_SH_GOT32:
   4592  1.1     skrll 	case R_SH_GOT20:
   4593  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4594  1.1     skrll 	case R_SH_GOT_LOW16:
   4595  1.1     skrll 	case R_SH_GOT_MEDLOW16:
   4596  1.1     skrll 	case R_SH_GOT_MEDHI16:
   4597  1.1     skrll 	case R_SH_GOT_HI16:
   4598  1.3  christos 	case R_SH_GOT10BY4:
   4599  1.1     skrll 	case R_SH_GOT10BY8:
   4600  1.3  christos #endif
   4601  1.1     skrll 	  /* Relocation is to the entry for this symbol in the global
   4602  1.1     skrll 	     offset table.  */
   4603  1.1     skrll 
   4604  1.1     skrll 	  BFD_ASSERT (htab);
   4605  1.1     skrll 	  BFD_ASSERT (sgot != NULL);
   4606  1.1     skrll 	  check_segment[0] = check_segment[1] = -1;
   4607  1.1     skrll 
   4608  1.1     skrll 	  if (h != NULL)
   4609  1.1     skrll 	    {
   4610  1.1     skrll 	      bfd_boolean dyn;
   4611  1.1     skrll 
   4612  1.1     skrll 	      off = h->got.offset;
   4613  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4614  1.1     skrll 	      if (seen_stt_datalabel)
   4615  1.1     skrll 		{
   4616  1.1     skrll 		  struct elf_sh_link_hash_entry *hsh;
   4617  1.1     skrll 
   4618  1.1     skrll 		  hsh = (struct elf_sh_link_hash_entry *)h;
   4619  1.1     skrll 		  off = hsh->datalabel_got.offset;
   4620  1.1     skrll 		}
   4621  1.1     skrll #endif
   4622  1.1     skrll 	      BFD_ASSERT (off != (bfd_vma) -1);
   4623  1.1     skrll 
   4624  1.1     skrll 	      dyn = htab->root.dynamic_sections_created;
   4625  1.1     skrll 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   4626  1.1     skrll 		  || (info->shared
   4627  1.1     skrll 		      && SYMBOL_REFERENCES_LOCAL (info, h))
   4628  1.1     skrll 		  || (ELF_ST_VISIBILITY (h->other)
   4629  1.1     skrll 		      && h->root.type == bfd_link_hash_undefweak))
   4630  1.1     skrll 		{
   4631  1.1     skrll 		  /* This is actually a static link, or it is a
   4632  1.1     skrll 		     -Bsymbolic link and the symbol is defined
   4633  1.1     skrll 		     locally, or the symbol was forced to be local
   4634  1.1     skrll 		     because of a version file.  We must initialize
   4635  1.1     skrll 		     this entry in the global offset table.  Since the
   4636  1.1     skrll 		     offset must always be a multiple of 4, we use the
   4637  1.1     skrll 		     least significant bit to record whether we have
   4638  1.1     skrll 		     initialized it already.
   4639  1.1     skrll 
   4640  1.1     skrll 		     When doing a dynamic link, we create a .rela.got
   4641  1.1     skrll 		     relocation entry to initialize the value.  This
   4642  1.1     skrll 		     is done in the finish_dynamic_symbol routine.  */
   4643  1.1     skrll 		  if ((off & 1) != 0)
   4644  1.1     skrll 		    off &= ~1;
   4645  1.1     skrll 		  else
   4646  1.1     skrll 		    {
   4647  1.1     skrll 		      bfd_put_32 (output_bfd, relocation,
   4648  1.1     skrll 				  sgot->contents + off);
   4649  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4650  1.1     skrll 		      if (seen_stt_datalabel)
   4651  1.1     skrll 			{
   4652  1.1     skrll 			  struct elf_sh_link_hash_entry *hsh;
   4653  1.1     skrll 
   4654  1.3  christos 			  hsh = (struct elf_sh_link_hash_entry *)h;
   4655  1.3  christos 			  hsh->datalabel_got.offset |= 1;
   4656  1.3  christos 			}
   4657  1.3  christos 		      else
   4658  1.3  christos #endif
   4659  1.3  christos 			h->got.offset |= 1;
   4660  1.3  christos 
   4661  1.3  christos 		      /* If we initialize the GOT entry here with a valid
   4662  1.3  christos 			 symbol address, also add a fixup.  */
   4663  1.3  christos 		      if (fdpic_p && !info->shared
   4664  1.3  christos 			  && sh_elf_hash_entry (h)->got_type == GOT_NORMAL
   4665  1.1     skrll 			  && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   4666  1.1     skrll 			      || h->root.type != bfd_link_hash_undefweak))
   4667  1.1     skrll 			sh_elf_add_rofixup (output_bfd, htab->srofixup,
   4668  1.3  christos 					    sgot->output_section->vma
   4669  1.1     skrll 					    + sgot->output_offset
   4670  1.1     skrll 					    + off);
   4671  1.1     skrll 		    }
   4672  1.1     skrll 		}
   4673  1.1     skrll 
   4674  1.1     skrll 	      relocation = sh_elf_got_offset (htab) + off;
   4675  1.1     skrll 	    }
   4676  1.1     skrll 	  else
   4677  1.1     skrll 	    {
   4678  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4679  1.1     skrll 	      if (rel->r_addend)
   4680  1.1     skrll 		{
   4681  1.1     skrll 		  BFD_ASSERT (local_got_offsets != NULL
   4682  1.1     skrll 			      && (local_got_offsets[symtab_hdr->sh_info
   4683  1.1     skrll 						    + r_symndx]
   4684  1.1     skrll 				  != (bfd_vma) -1));
   4685  1.1     skrll 
   4686  1.1     skrll 		  off = local_got_offsets[symtab_hdr->sh_info
   4687  1.1     skrll 					  + r_symndx];
   4688  1.1     skrll 		}
   4689  1.1     skrll 	      else
   4690  1.1     skrll 		{
   4691  1.1     skrll #endif
   4692  1.1     skrll 	      BFD_ASSERT (local_got_offsets != NULL
   4693  1.1     skrll 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
   4694  1.1     skrll 
   4695  1.1     skrll 	      off = local_got_offsets[r_symndx];
   4696  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4697  1.1     skrll 		}
   4698  1.1     skrll #endif
   4699  1.1     skrll 
   4700  1.1     skrll 	      /* The offset must always be a multiple of 4.  We use
   4701  1.1     skrll 		 the least significant bit to record whether we have
   4702  1.1     skrll 		 already generated the necessary reloc.  */
   4703  1.1     skrll 	      if ((off & 1) != 0)
   4704  1.1     skrll 		off &= ~1;
   4705  1.1     skrll 	      else
   4706  1.1     skrll 		{
   4707  1.1     skrll 		  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
   4708  1.1     skrll 
   4709  1.1     skrll 		  if (info->shared)
   4710  1.1     skrll 		    {
   4711  1.1     skrll 		      Elf_Internal_Rela outrel;
   4712  1.1     skrll 		      bfd_byte *loc;
   4713  1.1     skrll 
   4714  1.1     skrll 		      if (srelgot == NULL)
   4715  1.1     skrll 			{
   4716  1.1     skrll 			  srelgot = bfd_get_section_by_name (dynobj,
   4717  1.1     skrll 							     ".rela.got");
   4718  1.3  christos 			  BFD_ASSERT (srelgot != NULL);
   4719  1.3  christos 			}
   4720  1.3  christos 
   4721  1.3  christos 		      outrel.r_offset = (sgot->output_section->vma
   4722  1.3  christos 					 + sgot->output_offset
   4723  1.3  christos 					 + off);
   4724  1.3  christos 		      if (fdpic_p)
   4725  1.3  christos 			{
   4726  1.3  christos 			  int dynindx
   4727  1.3  christos 			    = elf_section_data (sec->output_section)->dynindx;
   4728  1.3  christos 			  outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
   4729  1.3  christos 			  outrel.r_addend = relocation;
   4730  1.3  christos 			  outrel.r_addend -= sec->output_section->vma;
   4731  1.1     skrll 			}
   4732  1.1     skrll 		      else
   4733  1.1     skrll 			{
   4734  1.1     skrll 			  outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
   4735  1.3  christos 			  outrel.r_addend = relocation;
   4736  1.3  christos 			}
   4737  1.3  christos 		      loc = srelgot->contents;
   4738  1.3  christos 		      loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   4739  1.3  christos 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   4740  1.3  christos 		    }
   4741  1.3  christos 		  else if (fdpic_p
   4742  1.1     skrll 			   && (sh_elf_local_got_type (input_bfd) [r_symndx]
   4743  1.1     skrll 			       == GOT_NORMAL))
   4744  1.1     skrll 		    sh_elf_add_rofixup (output_bfd, htab->srofixup,
   4745  1.1     skrll 					sgot->output_section->vma
   4746  1.1     skrll 					+ sgot->output_offset
   4747  1.1     skrll 					+ off);
   4748  1.1     skrll 
   4749  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4750  1.1     skrll 		  if (rel->r_addend)
   4751  1.3  christos 		    local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1;
   4752  1.1     skrll 		  else
   4753  1.1     skrll #endif
   4754  1.1     skrll 		    local_got_offsets[r_symndx] |= 1;
   4755  1.1     skrll 		}
   4756  1.1     skrll 
   4757  1.1     skrll 	      relocation = sh_elf_got_offset (htab) + off;
   4758  1.3  christos 	    }
   4759  1.3  christos 
   4760  1.3  christos #ifdef GOT_BIAS
   4761  1.3  christos 	  relocation -= GOT_BIAS;
   4762  1.3  christos #endif
   4763  1.3  christos 
   4764  1.3  christos 	  if (r_type == R_SH_GOT20)
   4765  1.3  christos 	    {
   4766  1.3  christos 	      r = install_movi20_field (output_bfd, relocation + addend,
   4767  1.1     skrll 					input_bfd, input_section, contents,
   4768  1.1     skrll 					rel->r_offset);
   4769  1.3  christos 	      break;
   4770  1.1     skrll 	    }
   4771  1.1     skrll 	  else
   4772  1.1     skrll 	    goto final_link_relocate;
   4773  1.1     skrll 
   4774  1.1     skrll 	case R_SH_GOTOFF:
   4775  1.1     skrll 	case R_SH_GOTOFF20:
   4776  1.3  christos #ifdef INCLUDE_SHMEDIA
   4777  1.3  christos 	case R_SH_GOTOFF_LOW16:
   4778  1.3  christos 	case R_SH_GOTOFF_MEDLOW16:
   4779  1.3  christos 	case R_SH_GOTOFF_MEDHI16:
   4780  1.3  christos 	case R_SH_GOTOFF_HI16:
   4781  1.3  christos #endif
   4782  1.3  christos 	  /* GOTOFF relocations are relative to _GLOBAL_OFFSET_TABLE_, which
   4783  1.3  christos 	     we place at the start of the .got.plt section.  This is the same
   4784  1.3  christos 	     as the start of the output .got section, unless there are function
   4785  1.1     skrll 	     descriptors in front of it.  */
   4786  1.1     skrll 	  BFD_ASSERT (htab);
   4787  1.1     skrll 	  BFD_ASSERT (sgotplt != NULL);
   4788  1.1     skrll 	  check_segment[0] = got_segment;
   4789  1.1     skrll 	  relocation -= sgotplt->output_section->vma + sgotplt->output_offset
   4790  1.1     skrll 	    + htab->root.hgot->root.u.def.value;
   4791  1.1     skrll 
   4792  1.3  christos #ifdef GOT_BIAS
   4793  1.3  christos 	  relocation -= GOT_BIAS;
   4794  1.3  christos #endif
   4795  1.3  christos 
   4796  1.3  christos 	  addend = rel->r_addend;
   4797  1.3  christos 
   4798  1.3  christos 	  if (r_type == R_SH_GOTOFF20)
   4799  1.3  christos 	    {
   4800  1.3  christos 	      r = install_movi20_field (output_bfd, relocation + addend,
   4801  1.1     skrll 					input_bfd, input_section, contents,
   4802  1.1     skrll 					rel->r_offset);
   4803  1.1     skrll 	      break;
   4804  1.1     skrll 	    }
   4805  1.1     skrll 	  else
   4806  1.1     skrll 	    goto final_link_relocate;
   4807  1.1     skrll 
   4808  1.1     skrll 	case R_SH_GOTPC:
   4809  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4810  1.1     skrll 	case R_SH_GOTPC_LOW16:
   4811  1.3  christos 	case R_SH_GOTPC_MEDLOW16:
   4812  1.3  christos 	case R_SH_GOTPC_MEDHI16:
   4813  1.1     skrll 	case R_SH_GOTPC_HI16:
   4814  1.1     skrll #endif
   4815  1.1     skrll 	  /* Use global offset table as symbol value.  */
   4816  1.1     skrll 
   4817  1.1     skrll 	  BFD_ASSERT (sgotplt != NULL);
   4818  1.1     skrll 	  relocation = sgotplt->output_section->vma + sgotplt->output_offset;
   4819  1.1     skrll 
   4820  1.1     skrll #ifdef GOT_BIAS
   4821  1.1     skrll 	  relocation += GOT_BIAS;
   4822  1.1     skrll #endif
   4823  1.1     skrll 
   4824  1.1     skrll 	  addend = rel->r_addend;
   4825  1.1     skrll 
   4826  1.1     skrll 	  goto final_link_relocate;
   4827  1.1     skrll 
   4828  1.1     skrll 	case R_SH_PLT32:
   4829  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4830  1.1     skrll 	case R_SH_PLT_LOW16:
   4831  1.1     skrll 	case R_SH_PLT_MEDLOW16:
   4832  1.1     skrll 	case R_SH_PLT_MEDHI16:
   4833  1.1     skrll 	case R_SH_PLT_HI16:
   4834  1.1     skrll #endif
   4835  1.1     skrll 	  /* Relocation is to the entry for this symbol in the
   4836  1.1     skrll 	     procedure linkage table.  */
   4837  1.3  christos 
   4838  1.3  christos 	  /* Resolve a PLT reloc against a local symbol directly,
   4839  1.3  christos 	     without using the procedure linkage table.  */
   4840  1.3  christos 	  if (h == NULL)
   4841  1.3  christos 	    goto final_link_relocate;
   4842  1.3  christos 
   4843  1.3  christos 	  /* We don't want to warn on calls to undefined weak symbols,
   4844  1.1     skrll 	     as calls to them must be protected by non-NULL tests
   4845  1.1     skrll 	     anyway, and unprotected calls would invoke undefined
   4846  1.1     skrll 	     behavior.  */
   4847  1.1     skrll 	  if (h->root.type == bfd_link_hash_undefweak)
   4848  1.1     skrll 	    check_segment[0] = check_segment[1] = -1;
   4849  1.1     skrll 
   4850  1.1     skrll 	  if (h->forced_local)
   4851  1.1     skrll 	    goto final_link_relocate;
   4852  1.1     skrll 
   4853  1.1     skrll 	  if (h->plt.offset == (bfd_vma) -1)
   4854  1.1     skrll 	    {
   4855  1.1     skrll 	      /* We didn't make a PLT entry for this symbol.  This
   4856  1.3  christos 		 happens when statically linking PIC code, or when
   4857  1.1     skrll 		 using -Bsymbolic.  */
   4858  1.1     skrll 	      goto final_link_relocate;
   4859  1.1     skrll 	    }
   4860  1.1     skrll 
   4861  1.1     skrll 	  BFD_ASSERT (splt != NULL);
   4862  1.1     skrll 	  check_segment[1] = plt_segment;
   4863  1.1     skrll 	  relocation = (splt->output_section->vma
   4864  1.1     skrll 			+ splt->output_offset
   4865  1.1     skrll 			+ h->plt.offset);
   4866  1.1     skrll 
   4867  1.1     skrll #ifdef INCLUDE_SHMEDIA
   4868  1.1     skrll 	  relocation++;
   4869  1.3  christos #endif
   4870  1.3  christos 
   4871  1.3  christos 	  addend = rel->r_addend;
   4872  1.3  christos 
   4873  1.3  christos 	  goto final_link_relocate;
   4874  1.3  christos 
   4875  1.3  christos 	/* Relocation is to the canonical function descriptor for this
   4876  1.3  christos 	   symbol, possibly via the GOT.  Initialize the GOT
   4877  1.3  christos 	   entry and function descriptor if necessary.  */
   4878  1.3  christos 	case R_SH_GOTFUNCDESC:
   4879  1.3  christos 	case R_SH_GOTFUNCDESC20:
   4880  1.3  christos 	case R_SH_FUNCDESC:
   4881  1.3  christos 	  {
   4882  1.3  christos 	    int dynindx = -1;
   4883  1.3  christos 	    asection *reloc_section;
   4884  1.3  christos 	    bfd_vma reloc_offset;
   4885  1.3  christos 	    int reloc_type = R_SH_FUNCDESC;
   4886  1.3  christos 
   4887  1.3  christos 	    BFD_ASSERT (htab);
   4888  1.3  christos 
   4889  1.3  christos 	    check_segment[0] = check_segment[1] = -1;
   4890  1.3  christos 
   4891  1.3  christos 	    /* FIXME: See what FRV does for global symbols in the
   4892  1.3  christos 	       executable, with --export-dynamic.  Do they need ld.so
   4893  1.3  christos 	       to allocate official descriptors?  See what this code
   4894  1.3  christos 	       does.  */
   4895  1.3  christos 
   4896  1.3  christos 	    relocation = 0;
   4897  1.3  christos 	    addend = 0;
   4898  1.3  christos 
   4899  1.3  christos 	    if (r_type == R_SH_FUNCDESC)
   4900  1.3  christos 	      {
   4901  1.3  christos 		reloc_section = input_section;
   4902  1.3  christos 		reloc_offset = rel->r_offset;
   4903  1.3  christos 	      }
   4904  1.3  christos 	    else
   4905  1.3  christos 	      {
   4906  1.3  christos 		reloc_section = sgot;
   4907  1.3  christos 
   4908  1.3  christos 		if (h != NULL)
   4909  1.3  christos 		  reloc_offset = h->got.offset;
   4910  1.3  christos 		else
   4911  1.3  christos 		  {
   4912  1.3  christos 		    BFD_ASSERT (local_got_offsets != NULL);
   4913  1.3  christos 		    reloc_offset = local_got_offsets[r_symndx];
   4914  1.3  christos 		  }
   4915  1.3  christos 		BFD_ASSERT (reloc_offset != MINUS_ONE);
   4916  1.3  christos 
   4917  1.3  christos 		if (reloc_offset & 1)
   4918  1.3  christos 		  {
   4919  1.3  christos 		    reloc_offset &= ~1;
   4920  1.3  christos 		    goto funcdesc_done_got;
   4921  1.3  christos 		  }
   4922  1.3  christos 	      }
   4923  1.3  christos 
   4924  1.3  christos 	    if (h && h->root.type == bfd_link_hash_undefweak
   4925  1.3  christos 		&& (SYMBOL_CALLS_LOCAL (info, h)
   4926  1.3  christos 		    || !htab->root.dynamic_sections_created))
   4927  1.3  christos 	      /* Undefined weak symbol which will not be dynamically
   4928  1.3  christos 		 resolved later; leave it at zero.  */
   4929  1.3  christos 	      goto funcdesc_leave_zero;
   4930  1.3  christos 	    else if (SYMBOL_CALLS_LOCAL (info, h)
   4931  1.3  christos 		     && ! SYMBOL_FUNCDESC_LOCAL (info, h))
   4932  1.3  christos 	      {
   4933  1.3  christos 		/* If the symbol needs a non-local function descriptor
   4934  1.3  christos 		   but binds locally (i.e., its visibility is
   4935  1.3  christos 		   protected), emit a dynamic relocation decayed to
   4936  1.3  christos 		   section+offset.  This is an optimization; the dynamic
   4937  1.3  christos 		   linker would resolve our function descriptor request
   4938  1.3  christos 		   to our copy of the function anyway.  */
   4939  1.3  christos 		dynindx = elf_section_data (h->root.u.def.section
   4940  1.3  christos 					    ->output_section)->dynindx;
   4941  1.3  christos 		relocation += h->root.u.def.section->output_offset
   4942  1.3  christos 		  + h->root.u.def.value;
   4943  1.3  christos 	      }
   4944  1.3  christos 	    else if (! SYMBOL_FUNCDESC_LOCAL (info, h))
   4945  1.3  christos 	      {
   4946  1.3  christos 		/* If the symbol is dynamic and there will be dynamic
   4947  1.3  christos 		   symbol resolution because we are or are linked with a
   4948  1.3  christos 		   shared library, emit a FUNCDESC relocation such that
   4949  1.3  christos 		   the dynamic linker will allocate the function
   4950  1.3  christos 		   descriptor.  */
   4951  1.3  christos 		BFD_ASSERT (h->dynindx != -1);
   4952  1.3  christos 		dynindx = h->dynindx;
   4953  1.3  christos 	      }
   4954  1.3  christos 	    else
   4955  1.3  christos 	      {
   4956  1.3  christos 		bfd_vma offset;
   4957  1.3  christos 
   4958  1.3  christos 		/* Otherwise, we know we have a private function
   4959  1.3  christos 		   descriptor, so reference it directly.  */
   4960  1.3  christos 		reloc_type = R_SH_DIR32;
   4961  1.3  christos 		dynindx = elf_section_data (htab->sfuncdesc
   4962  1.3  christos 					    ->output_section)->dynindx;
   4963  1.3  christos 
   4964  1.3  christos 		if (h)
   4965  1.3  christos 		  {
   4966  1.3  christos 		    offset = sh_elf_hash_entry (h)->funcdesc.offset;
   4967  1.3  christos 		    BFD_ASSERT (offset != MINUS_ONE);
   4968  1.3  christos 		    if ((offset & 1) == 0)
   4969  1.3  christos 		      {
   4970  1.3  christos 			if (!sh_elf_initialize_funcdesc (output_bfd, info, h,
   4971  1.3  christos 							 offset, NULL, 0))
   4972  1.3  christos 			  return FALSE;
   4973  1.3  christos 			sh_elf_hash_entry (h)->funcdesc.offset |= 1;
   4974  1.3  christos 		      }
   4975  1.3  christos 		  }
   4976  1.3  christos 		else
   4977  1.3  christos 		  {
   4978  1.3  christos 		    union gotref *local_funcdesc;
   4979  1.3  christos 
   4980  1.3  christos 		    local_funcdesc = sh_elf_local_funcdesc (input_bfd);
   4981  1.3  christos 		    offset = local_funcdesc[r_symndx].offset;
   4982  1.3  christos 		    BFD_ASSERT (offset != MINUS_ONE);
   4983  1.3  christos 		    if ((offset & 1) == 0)
   4984  1.3  christos 		      {
   4985  1.3  christos 			if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL,
   4986  1.3  christos 							 offset, sec,
   4987  1.3  christos 							 sym->st_value))
   4988  1.3  christos 			  return FALSE;
   4989  1.3  christos 			local_funcdesc[r_symndx].offset |= 1;
   4990  1.3  christos 		      }
   4991  1.3  christos 		  }
   4992  1.3  christos 
   4993  1.3  christos 		relocation = htab->sfuncdesc->output_offset + (offset & ~1);
   4994  1.3  christos 	      }
   4995  1.3  christos 
   4996  1.3  christos 	    if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h))
   4997  1.3  christos 	      {
   4998  1.3  christos 		bfd_vma offset;
   4999  1.3  christos 
   5000  1.3  christos 		if (sh_elf_osec_readonly_p (output_bfd,
   5001  1.3  christos 					    reloc_section->output_section))
   5002  1.3  christos 		  {
   5003  1.3  christos 		    (*_bfd_error_handler)
   5004  1.3  christos 		      (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"),
   5005  1.3  christos 		       input_bfd,
   5006  1.3  christos 		       input_section,
   5007  1.3  christos 		       (long) rel->r_offset,
   5008  1.3  christos 		       symname);
   5009  1.3  christos 		    return FALSE;
   5010  1.3  christos 		  }
   5011  1.3  christos 
   5012  1.3  christos 		offset = _bfd_elf_section_offset (output_bfd, info,
   5013  1.3  christos 						  reloc_section, reloc_offset);
   5014  1.3  christos 
   5015  1.3  christos 		if (offset != (bfd_vma)-1)
   5016  1.3  christos 		  sh_elf_add_rofixup (output_bfd, htab->srofixup,
   5017  1.3  christos 				      offset
   5018  1.3  christos 				      + reloc_section->output_section->vma
   5019  1.3  christos 				      + reloc_section->output_offset);
   5020  1.3  christos 	      }
   5021  1.3  christos 	    else if ((reloc_section->output_section->flags
   5022  1.3  christos 		      & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
   5023  1.3  christos 	      {
   5024  1.3  christos 		bfd_vma offset;
   5025  1.3  christos 
   5026  1.3  christos 		if (sh_elf_osec_readonly_p (output_bfd,
   5027  1.3  christos 					    reloc_section->output_section))
   5028  1.3  christos 		  {
   5029  1.3  christos 		    info->callbacks->warning
   5030  1.3  christos 		      (info,
   5031  1.3  christos 		       _("cannot emit dynamic relocations in read-only section"),
   5032  1.3  christos 		       symname, input_bfd, reloc_section, reloc_offset);
   5033  1.3  christos 		    return FALSE;
   5034  1.3  christos 		  }
   5035  1.3  christos 
   5036  1.3  christos 		if (srelgot == NULL)
   5037  1.3  christos 		  {
   5038  1.3  christos 		    srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   5039  1.3  christos 		    BFD_ASSERT (srelgot != NULL);
   5040  1.3  christos 		  }
   5041  1.3  christos 
   5042  1.3  christos 		offset = _bfd_elf_section_offset (output_bfd, info,
   5043  1.3  christos 						  reloc_section, reloc_offset);
   5044  1.3  christos 
   5045  1.3  christos 		if (offset != (bfd_vma)-1)
   5046  1.3  christos 		  sh_elf_add_dyn_reloc (output_bfd, srelgot,
   5047  1.3  christos 					offset
   5048  1.3  christos 					+ reloc_section->output_section->vma
   5049  1.3  christos 					+ reloc_section->output_offset,
   5050  1.3  christos 					reloc_type, dynindx, relocation);
   5051  1.3  christos 
   5052  1.3  christos 		if (r_type == R_SH_FUNCDESC)
   5053  1.3  christos 		  {
   5054  1.3  christos 		    r = bfd_reloc_ok;
   5055  1.3  christos 		    break;
   5056  1.3  christos 		  }
   5057  1.3  christos 		else
   5058  1.3  christos 		  {
   5059  1.3  christos 		    relocation = 0;
   5060  1.3  christos 		    goto funcdesc_leave_zero;
   5061  1.3  christos 		  }
   5062  1.3  christos 	      }
   5063  1.3  christos 
   5064  1.3  christos 	    if (SYMBOL_FUNCDESC_LOCAL (info, h))
   5065  1.3  christos 	      relocation += htab->sfuncdesc->output_section->vma;
   5066  1.3  christos 	  funcdesc_leave_zero:
   5067  1.3  christos 	    if (r_type != R_SH_FUNCDESC)
   5068  1.3  christos 	      {
   5069  1.3  christos 		bfd_put_32 (output_bfd, relocation,
   5070  1.3  christos 			    reloc_section->contents + reloc_offset);
   5071  1.3  christos 		if (h != NULL)
   5072  1.3  christos 		  h->got.offset |= 1;
   5073  1.3  christos 		else
   5074  1.3  christos 		  local_got_offsets[r_symndx] |= 1;
   5075  1.3  christos 
   5076  1.3  christos 	      funcdesc_done_got:
   5077  1.3  christos 
   5078  1.3  christos 		relocation = sh_elf_got_offset (htab) + reloc_offset;
   5079  1.3  christos #ifdef GOT_BIAS
   5080  1.3  christos 		relocation -= GOT_BIAS;
   5081  1.3  christos #endif
   5082  1.3  christos 	      }
   5083  1.3  christos 	    if (r_type == R_SH_GOTFUNCDESC20)
   5084  1.3  christos 	      {
   5085  1.3  christos 		r = install_movi20_field (output_bfd, relocation + addend,
   5086  1.3  christos 					  input_bfd, input_section, contents,
   5087  1.3  christos 					  rel->r_offset);
   5088  1.3  christos 		break;
   5089  1.3  christos 	      }
   5090  1.3  christos 	    else
   5091  1.3  christos 	      goto final_link_relocate;
   5092  1.3  christos 	  }
   5093  1.3  christos 	  break;
   5094  1.3  christos 
   5095  1.3  christos 	case R_SH_GOTOFFFUNCDESC:
   5096  1.3  christos 	case R_SH_GOTOFFFUNCDESC20:
   5097  1.3  christos 	  /* FIXME: See R_SH_FUNCDESC comment about global symbols in the
   5098  1.3  christos 	     executable and --export-dynamic.  If such symbols get
   5099  1.3  christos 	     ld.so-allocated descriptors we can not use R_SH_GOTOFFFUNCDESC
   5100  1.3  christos 	     for them.  */
   5101  1.3  christos 	  BFD_ASSERT (htab);
   5102  1.3  christos 
   5103  1.3  christos 	  check_segment[0] = check_segment[1] = -1;
   5104  1.3  christos 	  relocation = 0;
   5105  1.3  christos 	  addend = rel->r_addend;
   5106  1.3  christos 
   5107  1.3  christos 	  if (h && (h->root.type == bfd_link_hash_undefweak
   5108  1.3  christos 		    || !SYMBOL_FUNCDESC_LOCAL (info, h)))
   5109  1.3  christos 	    {
   5110  1.3  christos 	      _bfd_error_handler
   5111  1.3  christos 		(_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""),
   5112  1.3  christos 		 input_bfd, input_section, (long) rel->r_offset, howto->name,
   5113  1.3  christos 		 h->root.root.string);
   5114  1.3  christos 	      return FALSE;
   5115  1.3  christos 	    }
   5116  1.3  christos 	  else
   5117  1.3  christos 	    {
   5118  1.3  christos 	      bfd_vma offset;
   5119  1.3  christos 
   5120  1.3  christos 	      /* Otherwise, we know we have a private function
   5121  1.3  christos 		 descriptor, so reference it directly.  */
   5122  1.3  christos 	      if (h)
   5123  1.3  christos 		{
   5124  1.3  christos 		  offset = sh_elf_hash_entry (h)->funcdesc.offset;
   5125  1.3  christos 		  BFD_ASSERT (offset != MINUS_ONE);
   5126  1.3  christos 		  if ((offset & 1) == 0)
   5127  1.3  christos 		    {
   5128  1.3  christos 		      if (!sh_elf_initialize_funcdesc (output_bfd, info, h,
   5129  1.3  christos 						       offset, NULL, 0))
   5130  1.3  christos 			return FALSE;
   5131  1.3  christos 		      sh_elf_hash_entry (h)->funcdesc.offset |= 1;
   5132  1.3  christos 		    }
   5133  1.3  christos 		}
   5134  1.3  christos 	      else
   5135  1.3  christos 		{
   5136  1.3  christos 		  union gotref *local_funcdesc;
   5137  1.3  christos 
   5138  1.3  christos 		  local_funcdesc = sh_elf_local_funcdesc (input_bfd);
   5139  1.3  christos 		  offset = local_funcdesc[r_symndx].offset;
   5140  1.3  christos 		  BFD_ASSERT (offset != MINUS_ONE);
   5141  1.3  christos 		  if ((offset & 1) == 0)
   5142  1.3  christos 		    {
   5143  1.3  christos 		      if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL,
   5144  1.3  christos 						       offset, sec,
   5145  1.3  christos 						       sym->st_value))
   5146  1.3  christos 			return FALSE;
   5147  1.3  christos 		      local_funcdesc[r_symndx].offset |= 1;
   5148  1.3  christos 		    }
   5149  1.3  christos 		}
   5150  1.3  christos 
   5151  1.3  christos 	      relocation = htab->sfuncdesc->output_offset + (offset & ~1);
   5152  1.3  christos 	    }
   5153  1.3  christos 
   5154  1.3  christos 	  relocation -= (htab->root.hgot->root.u.def.value
   5155  1.3  christos 			 + sgotplt->output_offset);
   5156  1.3  christos #ifdef GOT_BIAS
   5157  1.3  christos 	  relocation -= GOT_BIAS;
   5158  1.3  christos #endif
   5159  1.3  christos 
   5160  1.3  christos 	  if (r_type == R_SH_GOTOFFFUNCDESC20)
   5161  1.3  christos 	    {
   5162  1.3  christos 	      r = install_movi20_field (output_bfd, relocation + addend,
   5163  1.3  christos 					input_bfd, input_section, contents,
   5164  1.1     skrll 					rel->r_offset);
   5165  1.1     skrll 	      break;
   5166  1.1     skrll 	    }
   5167  1.1     skrll 	  else
   5168  1.1     skrll 	    goto final_link_relocate;
   5169  1.1     skrll 
   5170  1.1     skrll 	case R_SH_LOOP_START:
   5171  1.1     skrll 	  {
   5172  1.1     skrll 	    static bfd_vma start, end;
   5173  1.1     skrll 
   5174  1.1     skrll 	    start = (relocation + rel->r_addend
   5175  1.1     skrll 		     - (sec->output_section->vma + sec->output_offset));
   5176  1.1     skrll 	    r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
   5177  1.1     skrll 				   rel->r_offset, sec, start, end);
   5178  1.1     skrll 	    break;
   5179  1.1     skrll 
   5180  1.1     skrll 	case R_SH_LOOP_END:
   5181  1.1     skrll 	    end = (relocation + rel->r_addend
   5182  1.1     skrll 		   - (sec->output_section->vma + sec->output_offset));
   5183  1.1     skrll 	    r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
   5184  1.3  christos 				   rel->r_offset, sec, start, end);
   5185  1.3  christos 	    break;
   5186  1.1     skrll 	  }
   5187  1.3  christos 
   5188  1.1     skrll 	case R_SH_TLS_GD_32:
   5189  1.3  christos 	case R_SH_TLS_IE_32:
   5190  1.1     skrll 	  BFD_ASSERT (htab);
   5191  1.1     skrll 	  check_segment[0] = check_segment[1] = -1;
   5192  1.3  christos 	  r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
   5193  1.1     skrll 	  got_type = GOT_UNKNOWN;
   5194  1.1     skrll 	  if (h == NULL && local_got_offsets)
   5195  1.1     skrll 	    got_type = sh_elf_local_got_type (input_bfd) [r_symndx];
   5196  1.1     skrll 	  else if (h != NULL)
   5197  1.1     skrll 	    {
   5198  1.1     skrll 	      got_type = sh_elf_hash_entry (h)->got_type;
   5199  1.3  christos 	      if (! info->shared
   5200  1.1     skrll 		  && (h->dynindx == -1
   5201  1.1     skrll 		      || h->def_regular))
   5202  1.1     skrll 		r_type = R_SH_TLS_LE_32;
   5203  1.1     skrll 	    }
   5204  1.1     skrll 
   5205  1.1     skrll 	  if (r_type == R_SH_TLS_GD_32 && got_type == GOT_TLS_IE)
   5206  1.1     skrll 	    r_type = R_SH_TLS_IE_32;
   5207  1.1     skrll 
   5208  1.1     skrll 	  if (r_type == R_SH_TLS_LE_32)
   5209  1.1     skrll 	    {
   5210  1.1     skrll 	      bfd_vma offset;
   5211  1.1     skrll 	      unsigned short insn;
   5212  1.1     skrll 
   5213  1.1     skrll 	      if (ELF32_R_TYPE (rel->r_info) == R_SH_TLS_GD_32)
   5214  1.1     skrll 		{
   5215  1.1     skrll 		  /* GD->LE transition:
   5216  1.1     skrll 		       mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
   5217  1.1     skrll 		       jsr @r1; add r12,r4; bra 3f; nop; .align 2;
   5218  1.1     skrll 		       1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
   5219  1.1     skrll 		     We change it into:
   5220  1.1     skrll 		       mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
   5221  1.1     skrll 		       nop; nop; ...
   5222  1.1     skrll 		       1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:.  */
   5223  1.1     skrll 
   5224  1.1     skrll 		  offset = rel->r_offset;
   5225  1.1     skrll 		  BFD_ASSERT (offset >= 16);
   5226  1.1     skrll 		  /* Size of GD instructions is 16 or 18.  */
   5227  1.1     skrll 		  offset -= 16;
   5228  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5229  1.1     skrll 		  if ((insn & 0xff00) == 0xc700)
   5230  1.1     skrll 		    {
   5231  1.1     skrll 		      BFD_ASSERT (offset >= 2);
   5232  1.1     skrll 		      offset -= 2;
   5233  1.1     skrll 		      insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5234  1.1     skrll 		    }
   5235  1.1     skrll 
   5236  1.1     skrll 		  BFD_ASSERT ((insn & 0xff00) == 0xd400);
   5237  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 2);
   5238  1.1     skrll 		  BFD_ASSERT ((insn & 0xff00) == 0xc700);
   5239  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 4);
   5240  1.1     skrll 		  BFD_ASSERT ((insn & 0xff00) == 0xd100);
   5241  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 6);
   5242  1.1     skrll 		  BFD_ASSERT (insn == 0x310c);
   5243  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 8);
   5244  1.1     skrll 		  BFD_ASSERT (insn == 0x410b);
   5245  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 10);
   5246  1.1     skrll 		  BFD_ASSERT (insn == 0x34cc);
   5247  1.1     skrll 
   5248  1.1     skrll 		  bfd_put_16 (output_bfd, 0x0012, contents + offset + 2);
   5249  1.1     skrll 		  bfd_put_16 (output_bfd, 0x304c, contents + offset + 4);
   5250  1.3  christos 		  bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
   5251  1.1     skrll 		  bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
   5252  1.1     skrll 		  bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
   5253  1.1     skrll 		}
   5254  1.1     skrll 	      else
   5255  1.1     skrll 		{
   5256  1.1     skrll 		  int target;
   5257  1.1     skrll 
   5258  1.1     skrll 		  /* IE->LE transition:
   5259  1.1     skrll 		     mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
   5260  1.1     skrll 		     bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
   5261  1.1     skrll 		     We change it into:
   5262  1.1     skrll 		     mov.l .Ln,rM; stc gbr,rN; nop; ...;
   5263  1.1     skrll 		     1: x@TPOFF; 2:.  */
   5264  1.1     skrll 
   5265  1.1     skrll 		  offset = rel->r_offset;
   5266  1.1     skrll 		  BFD_ASSERT (offset >= 16);
   5267  1.1     skrll 		  /* Size of IE instructions is 10 or 12.  */
   5268  1.1     skrll 		  offset -= 10;
   5269  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5270  1.1     skrll 		  if ((insn & 0xf0ff) == 0x0012)
   5271  1.1     skrll 		    {
   5272  1.3  christos 		      BFD_ASSERT (offset >= 2);
   5273  1.1     skrll 		      offset -= 2;
   5274  1.1     skrll 		      insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5275  1.1     skrll 		    }
   5276  1.1     skrll 
   5277  1.3  christos 		  BFD_ASSERT ((insn & 0xff00) == 0xd000);
   5278  1.1     skrll 		  target = insn & 0x00ff;
   5279  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 2);
   5280  1.1     skrll 		  BFD_ASSERT ((insn & 0xf0ff) == 0x0012);
   5281  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 4);
   5282  1.1     skrll 		  BFD_ASSERT ((insn & 0xf0ff) == 0x00ce);
   5283  1.1     skrll 		  insn = 0xd000 | (insn & 0x0f00) | target;
   5284  1.1     skrll 		  bfd_put_16 (output_bfd, insn, contents + offset + 0);
   5285  1.1     skrll 		  bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
   5286  1.1     skrll 		}
   5287  1.3  christos 
   5288  1.1     skrll 	      bfd_put_32 (output_bfd, tpoff (info, relocation),
   5289  1.1     skrll 			  contents + rel->r_offset);
   5290  1.1     skrll 	      continue;
   5291  1.1     skrll 	    }
   5292  1.1     skrll 
   5293  1.1     skrll 	  if (sgot == NULL || sgotplt == NULL)
   5294  1.1     skrll 	    abort ();
   5295  1.1     skrll 
   5296  1.1     skrll 	  if (h != NULL)
   5297  1.1     skrll 	    off = h->got.offset;
   5298  1.1     skrll 	  else
   5299  1.1     skrll 	    {
   5300  1.1     skrll 	      if (local_got_offsets == NULL)
   5301  1.1     skrll 		abort ();
   5302  1.1     skrll 
   5303  1.1     skrll 	      off = local_got_offsets[r_symndx];
   5304  1.1     skrll 	    }
   5305  1.1     skrll 
   5306  1.1     skrll 	  /* Relocate R_SH_TLS_IE_32 directly when statically linking.  */
   5307  1.3  christos 	  if (r_type == R_SH_TLS_IE_32
   5308  1.1     skrll 	      && ! htab->root.dynamic_sections_created)
   5309  1.1     skrll 	    {
   5310  1.1     skrll 	      off &= ~1;
   5311  1.1     skrll 	      bfd_put_32 (output_bfd, tpoff (info, relocation),
   5312  1.1     skrll 			  sgot->contents + off);
   5313  1.1     skrll 	      bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off,
   5314  1.1     skrll 			  contents + rel->r_offset);
   5315  1.1     skrll 	      continue;
   5316  1.1     skrll 	    }
   5317  1.1     skrll 
   5318  1.1     skrll 	  if ((off & 1) != 0)
   5319  1.1     skrll 	    off &= ~1;
   5320  1.1     skrll 	  else
   5321  1.1     skrll 	    {
   5322  1.1     skrll 	      Elf_Internal_Rela outrel;
   5323  1.1     skrll 	      bfd_byte *loc;
   5324  1.1     skrll 	      int dr_type, indx;
   5325  1.1     skrll 
   5326  1.1     skrll 	      if (srelgot == NULL)
   5327  1.1     skrll 		{
   5328  1.1     skrll 		  srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   5329  1.1     skrll 		  BFD_ASSERT (srelgot != NULL);
   5330  1.1     skrll 		}
   5331  1.1     skrll 
   5332  1.1     skrll 	      outrel.r_offset = (sgot->output_section->vma
   5333  1.1     skrll 				 + sgot->output_offset + off);
   5334  1.1     skrll 
   5335  1.1     skrll 	      if (h == NULL || h->dynindx == -1)
   5336  1.1     skrll 		indx = 0;
   5337  1.1     skrll 	      else
   5338  1.1     skrll 		indx = h->dynindx;
   5339  1.1     skrll 
   5340  1.1     skrll 	      dr_type = (r_type == R_SH_TLS_GD_32 ? R_SH_TLS_DTPMOD32 :
   5341  1.1     skrll 			 R_SH_TLS_TPOFF32);
   5342  1.1     skrll 	      if (dr_type == R_SH_TLS_TPOFF32 && indx == 0)
   5343  1.1     skrll 		outrel.r_addend = relocation - dtpoff_base (info);
   5344  1.1     skrll 	      else
   5345  1.1     skrll 		outrel.r_addend = 0;
   5346  1.1     skrll 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
   5347  1.1     skrll 	      loc = srelgot->contents;
   5348  1.1     skrll 	      loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   5349  1.1     skrll 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   5350  1.1     skrll 
   5351  1.1     skrll 	      if (r_type == R_SH_TLS_GD_32)
   5352  1.1     skrll 		{
   5353  1.1     skrll 		  if (indx == 0)
   5354  1.1     skrll 		    {
   5355  1.1     skrll 		      bfd_put_32 (output_bfd,
   5356  1.1     skrll 				  relocation - dtpoff_base (info),
   5357  1.1     skrll 				  sgot->contents + off + 4);
   5358  1.1     skrll 		    }
   5359  1.1     skrll 		  else
   5360  1.1     skrll 		    {
   5361  1.1     skrll 		      outrel.r_info = ELF32_R_INFO (indx,
   5362  1.1     skrll 						    R_SH_TLS_DTPOFF32);
   5363  1.1     skrll 		      outrel.r_offset += 4;
   5364  1.1     skrll 		      outrel.r_addend = 0;
   5365  1.1     skrll 		      srelgot->reloc_count++;
   5366  1.1     skrll 		      loc += sizeof (Elf32_External_Rela);
   5367  1.1     skrll 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   5368  1.1     skrll 		    }
   5369  1.1     skrll 		}
   5370  1.1     skrll 
   5371  1.1     skrll 	      if (h != NULL)
   5372  1.1     skrll 		h->got.offset |= 1;
   5373  1.1     skrll 	      else
   5374  1.1     skrll 		local_got_offsets[r_symndx] |= 1;
   5375  1.3  christos 	    }
   5376  1.1     skrll 
   5377  1.1     skrll 	  if (off >= (bfd_vma) -2)
   5378  1.1     skrll 	    abort ();
   5379  1.1     skrll 
   5380  1.1     skrll 	  if (r_type == (int) ELF32_R_TYPE (rel->r_info))
   5381  1.1     skrll 	    relocation = sh_elf_got_offset (htab) + off;
   5382  1.1     skrll 	  else
   5383  1.1     skrll 	    {
   5384  1.1     skrll 	      bfd_vma offset;
   5385  1.1     skrll 	      unsigned short insn;
   5386  1.1     skrll 
   5387  1.1     skrll 	      /* GD->IE transition:
   5388  1.1     skrll 		   mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
   5389  1.1     skrll 		   jsr @r1; add r12,r4; bra 3f; nop; .align 2;
   5390  1.1     skrll 		   1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
   5391  1.1     skrll 		 We change it into:
   5392  1.1     skrll 		   mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
   5393  1.1     skrll 		   nop; nop; bra 3f; nop; .align 2;
   5394  1.1     skrll 		   1: .long x@TPOFF; 2:...; 3:.  */
   5395  1.1     skrll 
   5396  1.1     skrll 	      offset = rel->r_offset;
   5397  1.1     skrll 	      BFD_ASSERT (offset >= 16);
   5398  1.1     skrll 	      /* Size of GD instructions is 16 or 18.  */
   5399  1.1     skrll 	      offset -= 16;
   5400  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5401  1.1     skrll 	      if ((insn & 0xff00) == 0xc700)
   5402  1.1     skrll 		{
   5403  1.1     skrll 		  BFD_ASSERT (offset >= 2);
   5404  1.1     skrll 		  offset -= 2;
   5405  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5406  1.1     skrll 		}
   5407  1.1     skrll 
   5408  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xd400);
   5409  1.1     skrll 
   5410  1.1     skrll 	      /* Replace mov.l 1f,R4 with mov.l 1f,r0.  */
   5411  1.1     skrll 	      bfd_put_16 (output_bfd, insn & 0xf0ff, contents + offset);
   5412  1.1     skrll 
   5413  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 2);
   5414  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xc700);
   5415  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 4);
   5416  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xd100);
   5417  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 6);
   5418  1.1     skrll 	      BFD_ASSERT (insn == 0x310c);
   5419  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 8);
   5420  1.1     skrll 	      BFD_ASSERT (insn == 0x410b);
   5421  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 10);
   5422  1.1     skrll 	      BFD_ASSERT (insn == 0x34cc);
   5423  1.1     skrll 
   5424  1.3  christos 	      bfd_put_16 (output_bfd, 0x0412, contents + offset + 2);
   5425  1.1     skrll 	      bfd_put_16 (output_bfd, 0x00ce, contents + offset + 4);
   5426  1.1     skrll 	      bfd_put_16 (output_bfd, 0x304c, contents + offset + 6);
   5427  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
   5428  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
   5429  1.1     skrll 
   5430  1.1     skrll 	      bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off,
   5431  1.1     skrll 			  contents + rel->r_offset);
   5432  1.1     skrll 
   5433  1.1     skrll 	      continue;
   5434  1.1     skrll 	  }
   5435  1.3  christos 
   5436  1.3  christos 	  addend = rel->r_addend;
   5437  1.1     skrll 
   5438  1.1     skrll 	  goto final_link_relocate;
   5439  1.1     skrll 
   5440  1.1     skrll 	case R_SH_TLS_LD_32:
   5441  1.1     skrll 	  BFD_ASSERT (htab);
   5442  1.1     skrll 	  check_segment[0] = check_segment[1] = -1;
   5443  1.1     skrll 	  if (! info->shared)
   5444  1.1     skrll 	    {
   5445  1.1     skrll 	      bfd_vma offset;
   5446  1.1     skrll 	      unsigned short insn;
   5447  1.1     skrll 
   5448  1.1     skrll 	      /* LD->LE transition:
   5449  1.1     skrll 		   mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
   5450  1.1     skrll 		   jsr @r1; add r12,r4; bra 3f; nop; .align 2;
   5451  1.1     skrll 		   1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
   5452  1.1     skrll 		 We change it into:
   5453  1.1     skrll 		   stc gbr,r0; nop; nop; nop;
   5454  1.1     skrll 		   nop; nop; bra 3f; ...; 3:.  */
   5455  1.1     skrll 
   5456  1.1     skrll 	      offset = rel->r_offset;
   5457  1.1     skrll 	      BFD_ASSERT (offset >= 16);
   5458  1.1     skrll 	      /* Size of LD instructions is 16 or 18.  */
   5459  1.1     skrll 	      offset -= 16;
   5460  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5461  1.1     skrll 	      if ((insn & 0xff00) == 0xc700)
   5462  1.1     skrll 		{
   5463  1.1     skrll 		  BFD_ASSERT (offset >= 2);
   5464  1.1     skrll 		  offset -= 2;
   5465  1.1     skrll 		  insn = bfd_get_16 (input_bfd, contents + offset + 0);
   5466  1.1     skrll 		}
   5467  1.1     skrll 
   5468  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xd400);
   5469  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 2);
   5470  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xc700);
   5471  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 4);
   5472  1.1     skrll 	      BFD_ASSERT ((insn & 0xff00) == 0xd100);
   5473  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 6);
   5474  1.1     skrll 	      BFD_ASSERT (insn == 0x310c);
   5475  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 8);
   5476  1.1     skrll 	      BFD_ASSERT (insn == 0x410b);
   5477  1.1     skrll 	      insn = bfd_get_16 (input_bfd, contents + offset + 10);
   5478  1.1     skrll 	      BFD_ASSERT (insn == 0x34cc);
   5479  1.1     skrll 
   5480  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0012, contents + offset + 0);
   5481  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 2);
   5482  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
   5483  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
   5484  1.3  christos 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
   5485  1.1     skrll 	      bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
   5486  1.1     skrll 
   5487  1.1     skrll 	      continue;
   5488  1.1     skrll 	    }
   5489  1.1     skrll 
   5490  1.1     skrll 	  if (sgot == NULL || sgotplt == NULL)
   5491  1.1     skrll 	    abort ();
   5492  1.1     skrll 
   5493  1.1     skrll 	  off = htab->tls_ldm_got.offset;
   5494  1.1     skrll 	  if (off & 1)
   5495  1.1     skrll 	    off &= ~1;
   5496  1.1     skrll 	  else
   5497  1.1     skrll 	    {
   5498  1.1     skrll 	      Elf_Internal_Rela outrel;
   5499  1.1     skrll 	      bfd_byte *loc;
   5500  1.1     skrll 
   5501  1.1     skrll 	      srelgot = htab->srelgot;
   5502  1.1     skrll 	      if (srelgot == NULL)
   5503  1.1     skrll 		abort ();
   5504  1.1     skrll 
   5505  1.1     skrll 	      outrel.r_offset = (sgot->output_section->vma
   5506  1.1     skrll 				 + sgot->output_offset + off);
   5507  1.1     skrll 	      outrel.r_addend = 0;
   5508  1.1     skrll 	      outrel.r_info = ELF32_R_INFO (0, R_SH_TLS_DTPMOD32);
   5509  1.3  christos 	      loc = srelgot->contents;
   5510  1.1     skrll 	      loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   5511  1.1     skrll 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   5512  1.1     skrll 	      htab->tls_ldm_got.offset |= 1;
   5513  1.1     skrll 	    }
   5514  1.1     skrll 
   5515  1.3  christos 	  relocation = sh_elf_got_offset (htab) + off;
   5516  1.1     skrll 	  addend = rel->r_addend;
   5517  1.1     skrll 
   5518  1.1     skrll 	  goto final_link_relocate;
   5519  1.1     skrll 
   5520  1.1     skrll 	case R_SH_TLS_LDO_32:
   5521  1.1     skrll 	  check_segment[0] = check_segment[1] = -1;
   5522  1.1     skrll 	  if (! info->shared)
   5523  1.1     skrll 	    relocation = tpoff (info, relocation);
   5524  1.1     skrll 	  else
   5525  1.1     skrll 	    relocation -= dtpoff_base (info);
   5526  1.1     skrll 
   5527  1.1     skrll 	  addend = rel->r_addend;
   5528  1.1     skrll 	  goto final_link_relocate;
   5529  1.1     skrll 
   5530  1.3  christos 	case R_SH_TLS_LE_32:
   5531  1.3  christos 	  {
   5532  1.1     skrll 	    int indx;
   5533  1.1     skrll 	    Elf_Internal_Rela outrel;
   5534  1.1     skrll 	    bfd_byte *loc;
   5535  1.1     skrll 
   5536  1.1     skrll 	    check_segment[0] = check_segment[1] = -1;
   5537  1.1     skrll 
   5538  1.1     skrll 	    if (! info->shared)
   5539  1.1     skrll 	      {
   5540  1.1     skrll 		relocation = tpoff (info, relocation);
   5541  1.3  christos 		addend = rel->r_addend;
   5542  1.3  christos 		goto final_link_relocate;
   5543  1.3  christos 	      }
   5544  1.1     skrll 
   5545  1.1     skrll 	    if (sreloc == NULL)
   5546  1.1     skrll 	      {
   5547  1.1     skrll 		sreloc = _bfd_elf_get_dynamic_reloc_section
   5548  1.1     skrll 		  (input_bfd, input_section, /*rela?*/ TRUE);
   5549  1.1     skrll 		if (sreloc == NULL)
   5550  1.1     skrll 		  return FALSE;
   5551  1.1     skrll 	      }
   5552  1.1     skrll 
   5553  1.1     skrll 	    if (h == NULL || h->dynindx == -1)
   5554  1.1     skrll 	      indx = 0;
   5555  1.1     skrll 	    else
   5556  1.1     skrll 	      indx = h->dynindx;
   5557  1.1     skrll 
   5558  1.1     skrll 	    outrel.r_offset = (input_section->output_section->vma
   5559  1.1     skrll 			       + input_section->output_offset
   5560  1.1     skrll 			       + rel->r_offset);
   5561  1.1     skrll 	    outrel.r_info = ELF32_R_INFO (indx, R_SH_TLS_TPOFF32);
   5562  1.1     skrll 	    if (indx == 0)
   5563  1.1     skrll 	      outrel.r_addend = relocation - dtpoff_base (info);
   5564  1.1     skrll 	    else
   5565  1.1     skrll 	      outrel.r_addend = 0;
   5566  1.1     skrll 
   5567  1.1     skrll 	    loc = sreloc->contents;
   5568  1.1     skrll 	    loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   5569  1.3  christos 	    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   5570  1.3  christos 	    continue;
   5571  1.3  christos 	  }
   5572  1.3  christos 	}
   5573  1.3  christos 
   5574  1.3  christos     relocation_done:
   5575  1.3  christos       if (fdpic_p && check_segment[0] != (unsigned) -1
   5576  1.3  christos 	  && check_segment[0] != check_segment[1])
   5577  1.3  christos 	{
   5578  1.3  christos 	  /* We don't want duplicate errors for undefined symbols.  */
   5579  1.3  christos 	  if (!h || h->root.type != bfd_link_hash_undefined)
   5580  1.3  christos 	    {
   5581  1.3  christos 	      if (info->shared)
   5582  1.3  christos 		{
   5583  1.3  christos 		  info->callbacks->einfo
   5584  1.3  christos 		    (_("%X%C: relocation to \"%s\" references a different segment\n"),
   5585  1.3  christos 		     input_bfd, input_section, rel->r_offset, symname);
   5586  1.3  christos 		  return FALSE;
   5587  1.3  christos 		}
   5588  1.3  christos 	      else
   5589  1.3  christos 		info->callbacks->einfo
   5590  1.3  christos 		  (_("%C: warning: relocation to \"%s\" references a different segment\n"),
   5591  1.1     skrll 		   input_bfd, input_section, rel->r_offset, symname);
   5592  1.1     skrll 	    }
   5593  1.1     skrll 
   5594  1.1     skrll 	  elf_elfheader (output_bfd)->e_flags &= ~EF_SH_PIC;
   5595  1.1     skrll 	}
   5596  1.1     skrll 
   5597  1.1     skrll       if (r != bfd_reloc_ok)
   5598  1.1     skrll 	{
   5599  1.1     skrll 	  switch (r)
   5600  1.1     skrll 	    {
   5601  1.1     skrll 	    default:
   5602  1.1     skrll 	    case bfd_reloc_outofrange:
   5603  1.1     skrll 	      abort ();
   5604  1.1     skrll 	    case bfd_reloc_overflow:
   5605  1.1     skrll 	      {
   5606  1.1     skrll 		const char *name;
   5607  1.1     skrll 
   5608  1.1     skrll 		if (h != NULL)
   5609  1.1     skrll 		  name = NULL;
   5610  1.1     skrll 		else
   5611  1.1     skrll 		  {
   5612  1.1     skrll 		    name = (bfd_elf_string_from_elf_section
   5613  1.1     skrll 			    (input_bfd, symtab_hdr->sh_link, sym->st_name));
   5614  1.1     skrll 		    if (name == NULL)
   5615  1.1     skrll 		      return FALSE;
   5616  1.1     skrll 		    if (*name == '\0')
   5617  1.1     skrll 		      name = bfd_section_name (input_bfd, sec);
   5618  1.1     skrll 		  }
   5619  1.1     skrll 		if (! ((*info->callbacks->reloc_overflow)
   5620  1.1     skrll 		       (info, (h ? &h->root : NULL), name, howto->name,
   5621  1.1     skrll 			(bfd_vma) 0, input_bfd, input_section,
   5622  1.1     skrll 			rel->r_offset)))
   5623  1.1     skrll 		  return FALSE;
   5624  1.1     skrll 	      }
   5625  1.1     skrll 	      break;
   5626  1.1     skrll 	    }
   5627  1.1     skrll 	}
   5628  1.1     skrll     }
   5629  1.1     skrll 
   5630  1.1     skrll   return TRUE;
   5631  1.1     skrll }
   5632  1.1     skrll 
   5633  1.1     skrll /* This is a version of bfd_generic_get_relocated_section_contents
   5634  1.1     skrll    which uses sh_elf_relocate_section.  */
   5635  1.1     skrll 
   5636  1.1     skrll static bfd_byte *
   5637  1.1     skrll sh_elf_get_relocated_section_contents (bfd *output_bfd,
   5638  1.1     skrll 				       struct bfd_link_info *link_info,
   5639  1.1     skrll 				       struct bfd_link_order *link_order,
   5640  1.1     skrll 				       bfd_byte *data,
   5641  1.1     skrll 				       bfd_boolean relocatable,
   5642  1.1     skrll 				       asymbol **symbols)
   5643  1.1     skrll {
   5644  1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   5645  1.1     skrll   asection *input_section = link_order->u.indirect.section;
   5646  1.1     skrll   bfd *input_bfd = input_section->owner;
   5647  1.1     skrll   asection **sections = NULL;
   5648  1.1     skrll   Elf_Internal_Rela *internal_relocs = NULL;
   5649  1.1     skrll   Elf_Internal_Sym *isymbuf = NULL;
   5650  1.1     skrll 
   5651  1.1     skrll   /* We only need to handle the case of relaxing, or of having a
   5652  1.1     skrll      particular set of section contents, specially.  */
   5653  1.1     skrll   if (relocatable
   5654  1.1     skrll       || elf_section_data (input_section)->this_hdr.contents == NULL)
   5655  1.1     skrll     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
   5656  1.1     skrll 						       link_order, data,
   5657  1.1     skrll 						       relocatable,
   5658  1.1     skrll 						       symbols);
   5659  1.1     skrll 
   5660  1.1     skrll   symtab_hdr = &elf_symtab_hdr (input_bfd);
   5661  1.1     skrll 
   5662  1.1     skrll   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
   5663  1.1     skrll 	  (size_t) input_section->size);
   5664  1.1     skrll 
   5665  1.1     skrll   if ((input_section->flags & SEC_RELOC) != 0
   5666  1.1     skrll       && input_section->reloc_count > 0)
   5667  1.1     skrll     {
   5668  1.1     skrll       asection **secpp;
   5669  1.1     skrll       Elf_Internal_Sym *isym, *isymend;
   5670  1.1     skrll       bfd_size_type amt;
   5671  1.1     skrll 
   5672  1.1     skrll       internal_relocs = (_bfd_elf_link_read_relocs
   5673  1.1     skrll 			 (input_bfd, input_section, NULL,
   5674  1.1     skrll 			  (Elf_Internal_Rela *) NULL, FALSE));
   5675  1.1     skrll       if (internal_relocs == NULL)
   5676  1.1     skrll 	goto error_return;
   5677  1.1     skrll 
   5678  1.1     skrll       if (symtab_hdr->sh_info != 0)
   5679  1.1     skrll 	{
   5680  1.1     skrll 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   5681  1.1     skrll 	  if (isymbuf == NULL)
   5682  1.1     skrll 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   5683  1.1     skrll 					    symtab_hdr->sh_info, 0,
   5684  1.1     skrll 					    NULL, NULL, NULL);
   5685  1.1     skrll 	  if (isymbuf == NULL)
   5686  1.1     skrll 	    goto error_return;
   5687  1.1     skrll 	}
   5688  1.1     skrll 
   5689  1.1     skrll       amt = symtab_hdr->sh_info;
   5690  1.1     skrll       amt *= sizeof (asection *);
   5691  1.1     skrll       sections = (asection **) bfd_malloc (amt);
   5692  1.1     skrll       if (sections == NULL && amt != 0)
   5693  1.1     skrll 	goto error_return;
   5694  1.1     skrll 
   5695  1.1     skrll       isymend = isymbuf + symtab_hdr->sh_info;
   5696  1.1     skrll       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
   5697  1.1     skrll 	{
   5698  1.1     skrll 	  asection *isec;
   5699  1.1     skrll 
   5700  1.1     skrll 	  if (isym->st_shndx == SHN_UNDEF)
   5701  1.1     skrll 	    isec = bfd_und_section_ptr;
   5702  1.1     skrll 	  else if (isym->st_shndx == SHN_ABS)
   5703  1.1     skrll 	    isec = bfd_abs_section_ptr;
   5704  1.1     skrll 	  else if (isym->st_shndx == SHN_COMMON)
   5705  1.1     skrll 	    isec = bfd_com_section_ptr;
   5706  1.1     skrll 	  else
   5707  1.1     skrll 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
   5708  1.1     skrll 
   5709  1.1     skrll 	  *secpp = isec;
   5710  1.1     skrll 	}
   5711  1.1     skrll 
   5712  1.1     skrll       if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
   5713  1.1     skrll 				     input_section, data, internal_relocs,
   5714  1.1     skrll 				     isymbuf, sections))
   5715  1.1     skrll 	goto error_return;
   5716  1.1     skrll 
   5717  1.1     skrll       if (sections != NULL)
   5718  1.1     skrll 	free (sections);
   5719  1.1     skrll       if (isymbuf != NULL
   5720  1.1     skrll 	  && symtab_hdr->contents != (unsigned char *) isymbuf)
   5721  1.1     skrll 	free (isymbuf);
   5722  1.1     skrll       if (elf_section_data (input_section)->relocs != internal_relocs)
   5723  1.1     skrll 	free (internal_relocs);
   5724  1.1     skrll     }
   5725  1.1     skrll 
   5726  1.1     skrll   return data;
   5727  1.1     skrll 
   5728  1.1     skrll  error_return:
   5729  1.1     skrll   if (sections != NULL)
   5730  1.1     skrll     free (sections);
   5731  1.1     skrll   if (isymbuf != NULL
   5732  1.1     skrll       && symtab_hdr->contents != (unsigned char *) isymbuf)
   5733  1.1     skrll     free (isymbuf);
   5734  1.1     skrll   if (internal_relocs != NULL
   5735  1.1     skrll       && elf_section_data (input_section)->relocs != internal_relocs)
   5736  1.1     skrll     free (internal_relocs);
   5737  1.1     skrll   return NULL;
   5738  1.1     skrll }
   5739  1.1     skrll 
   5740  1.1     skrll /* Return the base VMA address which should be subtracted from real addresses
   5741  1.1     skrll    when resolving @dtpoff relocation.
   5742  1.1     skrll    This is PT_TLS segment p_vaddr.  */
   5743  1.1     skrll 
   5744  1.1     skrll static bfd_vma
   5745  1.1     skrll dtpoff_base (struct bfd_link_info *info)
   5746  1.1     skrll {
   5747  1.1     skrll   /* If tls_sec is NULL, we should have signalled an error already.  */
   5748  1.1     skrll   if (elf_hash_table (info)->tls_sec == NULL)
   5749  1.1     skrll     return 0;
   5750  1.1     skrll   return elf_hash_table (info)->tls_sec->vma;
   5751  1.1     skrll }
   5752  1.1     skrll 
   5753  1.1     skrll /* Return the relocation value for R_SH_TLS_TPOFF32..  */
   5754  1.1     skrll 
   5755  1.1     skrll static bfd_vma
   5756  1.1     skrll tpoff (struct bfd_link_info *info, bfd_vma address)
   5757  1.1     skrll {
   5758  1.1     skrll   /* If tls_sec is NULL, we should have signalled an error already.  */
   5759  1.1     skrll   if (elf_hash_table (info)->tls_sec == NULL)
   5760  1.1     skrll     return 0;
   5761  1.1     skrll   /* SH TLS ABI is variant I and static TLS block start just after tcbhead
   5762  1.1     skrll      structure which has 2 pointer fields.  */
   5763  1.1     skrll   return (address - elf_hash_table (info)->tls_sec->vma
   5764  1.1     skrll 	  + align_power ((bfd_vma) 8,
   5765  1.1     skrll 			 elf_hash_table (info)->tls_sec->alignment_power));
   5766  1.1     skrll }
   5767  1.1     skrll 
   5768  1.1     skrll static asection *
   5769  1.1     skrll sh_elf_gc_mark_hook (asection *sec,
   5770  1.1     skrll 		     struct bfd_link_info *info,
   5771  1.1     skrll 		     Elf_Internal_Rela *rel,
   5772  1.1     skrll 		     struct elf_link_hash_entry *h,
   5773  1.1     skrll 		     Elf_Internal_Sym *sym)
   5774  1.1     skrll {
   5775  1.1     skrll   if (h != NULL)
   5776  1.1     skrll     switch (ELF32_R_TYPE (rel->r_info))
   5777  1.1     skrll       {
   5778  1.1     skrll       case R_SH_GNU_VTINHERIT:
   5779  1.1     skrll       case R_SH_GNU_VTENTRY:
   5780  1.1     skrll 	return NULL;
   5781  1.1     skrll       }
   5782  1.1     skrll 
   5783  1.1     skrll   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   5784  1.1     skrll }
   5785  1.1     skrll 
   5786  1.1     skrll /* Update the got entry reference counts for the section being removed.  */
   5787  1.1     skrll 
   5788  1.1     skrll static bfd_boolean
   5789  1.3  christos sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
   5790  1.1     skrll 		      asection *sec, const Elf_Internal_Rela *relocs)
   5791  1.1     skrll {
   5792  1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   5793  1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   5794  1.1     skrll   bfd_signed_vma *local_got_refcounts;
   5795  1.1     skrll   union gotref *local_funcdesc;
   5796  1.1     skrll   const Elf_Internal_Rela *rel, *relend;
   5797  1.1     skrll 
   5798  1.1     skrll   if (info->relocatable)
   5799  1.1     skrll     return TRUE;
   5800  1.3  christos 
   5801  1.1     skrll   elf_section_data (sec)->local_dynrel = NULL;
   5802  1.1     skrll 
   5803  1.1     skrll   symtab_hdr = &elf_symtab_hdr (abfd);
   5804  1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   5805  1.1     skrll   local_got_refcounts = elf_local_got_refcounts (abfd);
   5806  1.1     skrll   local_funcdesc = sh_elf_local_funcdesc (abfd);
   5807  1.1     skrll 
   5808  1.1     skrll   relend = relocs + sec->reloc_count;
   5809  1.1     skrll   for (rel = relocs; rel < relend; rel++)
   5810  1.1     skrll     {
   5811  1.1     skrll       unsigned long r_symndx;
   5812  1.1     skrll       unsigned int r_type;
   5813  1.1     skrll       struct elf_link_hash_entry *h = NULL;
   5814  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5815  1.1     skrll       int seen_stt_datalabel = 0;
   5816  1.1     skrll #endif
   5817  1.1     skrll 
   5818  1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   5819  1.1     skrll       if (r_symndx >= symtab_hdr->sh_info)
   5820  1.1     skrll 	{
   5821  1.1     skrll 	  struct elf_sh_link_hash_entry *eh;
   5822  1.1     skrll 	  struct elf_sh_dyn_relocs **pp;
   5823  1.1     skrll 	  struct elf_sh_dyn_relocs *p;
   5824  1.1     skrll 
   5825  1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   5826  1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   5827  1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   5828  1.1     skrll 	    {
   5829  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5830  1.1     skrll 	      seen_stt_datalabel |= h->type == STT_DATALABEL;
   5831  1.1     skrll #endif
   5832  1.1     skrll 	      h = (struct elf_link_hash_entry *) h->root.u.i.link;
   5833  1.1     skrll 	    }
   5834  1.1     skrll 	  eh = (struct elf_sh_link_hash_entry *) h;
   5835  1.1     skrll 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
   5836  1.1     skrll 	    if (p->sec == sec)
   5837  1.1     skrll 	      {
   5838  1.1     skrll 		/* Everything must go for SEC.  */
   5839  1.1     skrll 		*pp = p->next;
   5840  1.1     skrll 		break;
   5841  1.1     skrll 	      }
   5842  1.1     skrll 	}
   5843  1.1     skrll 
   5844  1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   5845  1.1     skrll       switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL))
   5846  1.1     skrll 	{
   5847  1.3  christos 	case R_SH_TLS_LD_32:
   5848  1.1     skrll 	  if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0)
   5849  1.3  christos 	    sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
   5850  1.1     skrll 	  break;
   5851  1.1     skrll 
   5852  1.1     skrll 	case R_SH_GOT32:
   5853  1.1     skrll 	case R_SH_GOT20:
   5854  1.1     skrll 	case R_SH_GOTOFF:
   5855  1.1     skrll 	case R_SH_GOTOFF20:
   5856  1.1     skrll 	case R_SH_GOTPC:
   5857  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5858  1.1     skrll 	case R_SH_GOT_LOW16:
   5859  1.1     skrll 	case R_SH_GOT_MEDLOW16:
   5860  1.1     skrll 	case R_SH_GOT_MEDHI16:
   5861  1.1     skrll 	case R_SH_GOT_HI16:
   5862  1.1     skrll 	case R_SH_GOT10BY4:
   5863  1.1     skrll 	case R_SH_GOT10BY8:
   5864  1.1     skrll 	case R_SH_GOTOFF_LOW16:
   5865  1.1     skrll 	case R_SH_GOTOFF_MEDLOW16:
   5866  1.1     skrll 	case R_SH_GOTOFF_MEDHI16:
   5867  1.1     skrll 	case R_SH_GOTOFF_HI16:
   5868  1.1     skrll 	case R_SH_GOTPC_LOW16:
   5869  1.3  christos 	case R_SH_GOTPC_MEDLOW16:
   5870  1.3  christos 	case R_SH_GOTPC_MEDHI16:
   5871  1.1     skrll 	case R_SH_GOTPC_HI16:
   5872  1.1     skrll #endif
   5873  1.1     skrll 	case R_SH_TLS_GD_32:
   5874  1.1     skrll 	case R_SH_TLS_IE_32:
   5875  1.1     skrll 	case R_SH_GOTFUNCDESC:
   5876  1.1     skrll 	case R_SH_GOTFUNCDESC20:
   5877  1.1     skrll 	  if (h != NULL)
   5878  1.1     skrll 	    {
   5879  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5880  1.1     skrll 	      if (seen_stt_datalabel)
   5881  1.1     skrll 		{
   5882  1.1     skrll 		  struct elf_sh_link_hash_entry *eh;
   5883  1.1     skrll 		  eh = (struct elf_sh_link_hash_entry *) h;
   5884  1.1     skrll 		  if (eh->datalabel_got.refcount > 0)
   5885  1.1     skrll 		    eh->datalabel_got.refcount -= 1;
   5886  1.1     skrll 		}
   5887  1.1     skrll 	      else
   5888  1.1     skrll #endif
   5889  1.1     skrll 		if (h->got.refcount > 0)
   5890  1.1     skrll 		  h->got.refcount -= 1;
   5891  1.1     skrll 	    }
   5892  1.1     skrll 	  else if (local_got_refcounts != NULL)
   5893  1.1     skrll 	    {
   5894  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5895  1.1     skrll 	      if (rel->r_addend & 1)
   5896  1.1     skrll 		{
   5897  1.1     skrll 		  if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
   5898  1.1     skrll 		    local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
   5899  1.1     skrll 		}
   5900  1.1     skrll 	      else
   5901  1.3  christos #endif
   5902  1.3  christos 		if (local_got_refcounts[r_symndx] > 0)
   5903  1.3  christos 		  local_got_refcounts[r_symndx] -= 1;
   5904  1.3  christos 	    }
   5905  1.3  christos 	  break;
   5906  1.3  christos 
   5907  1.3  christos 	case R_SH_FUNCDESC:
   5908  1.3  christos 	  if (h != NULL)
   5909  1.3  christos 	    sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1;
   5910  1.3  christos 	  else if (sh_elf_hash_table (info)->fdpic_p && !info->shared)
   5911  1.3  christos 	    sh_elf_hash_table (info)->srofixup->size -= 4;
   5912  1.3  christos 
   5913  1.3  christos 	  /* Fall through.  */
   5914  1.3  christos 
   5915  1.3  christos 	case R_SH_GOTOFFFUNCDESC:
   5916  1.3  christos 	case R_SH_GOTOFFFUNCDESC20:
   5917  1.1     skrll 	  if (h != NULL)
   5918  1.3  christos 	    sh_elf_hash_entry (h)->funcdesc.refcount -= 1;
   5919  1.3  christos 	  else
   5920  1.3  christos 	    local_funcdesc[r_symndx].refcount -= 1;
   5921  1.3  christos 	  break;
   5922  1.3  christos 
   5923  1.1     skrll 	case R_SH_DIR32:
   5924  1.1     skrll 	  if (sh_elf_hash_table (info)->fdpic_p && !info->shared
   5925  1.1     skrll 	      && (sec->flags & SEC_ALLOC) != 0)
   5926  1.1     skrll 	    sh_elf_hash_table (info)->srofixup->size -= 4;
   5927  1.1     skrll 	  /* Fall thru */
   5928  1.1     skrll 
   5929  1.1     skrll 	case R_SH_REL32:
   5930  1.1     skrll 	  if (info->shared)
   5931  1.1     skrll 	    break;
   5932  1.1     skrll 	  /* Fall thru */
   5933  1.1     skrll 
   5934  1.1     skrll 	case R_SH_PLT32:
   5935  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5936  1.1     skrll 	case R_SH_PLT_LOW16:
   5937  1.1     skrll 	case R_SH_PLT_MEDLOW16:
   5938  1.1     skrll 	case R_SH_PLT_MEDHI16:
   5939  1.1     skrll 	case R_SH_PLT_HI16:
   5940  1.1     skrll #endif
   5941  1.1     skrll 	  if (h != NULL)
   5942  1.1     skrll 	    {
   5943  1.1     skrll 	      if (h->plt.refcount > 0)
   5944  1.1     skrll 		h->plt.refcount -= 1;
   5945  1.1     skrll 	    }
   5946  1.1     skrll 	  break;
   5947  1.1     skrll 
   5948  1.1     skrll 	case R_SH_GOTPLT32:
   5949  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5950  1.1     skrll 	case R_SH_GOTPLT_LOW16:
   5951  1.1     skrll 	case R_SH_GOTPLT_MEDLOW16:
   5952  1.1     skrll 	case R_SH_GOTPLT_MEDHI16:
   5953  1.1     skrll 	case R_SH_GOTPLT_HI16:
   5954  1.1     skrll 	case R_SH_GOTPLT10BY4:
   5955  1.1     skrll 	case R_SH_GOTPLT10BY8:
   5956  1.1     skrll #endif
   5957  1.1     skrll 	  if (h != NULL)
   5958  1.1     skrll 	    {
   5959  1.1     skrll 	      struct elf_sh_link_hash_entry *eh;
   5960  1.1     skrll 	      eh = (struct elf_sh_link_hash_entry *) h;
   5961  1.1     skrll 	      if (eh->gotplt_refcount > 0)
   5962  1.1     skrll 		{
   5963  1.1     skrll 		  eh->gotplt_refcount -= 1;
   5964  1.1     skrll 		  if (h->plt.refcount > 0)
   5965  1.1     skrll 		    h->plt.refcount -= 1;
   5966  1.1     skrll 		}
   5967  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5968  1.1     skrll 	      else if (seen_stt_datalabel)
   5969  1.1     skrll 		{
   5970  1.1     skrll 		  if (eh->datalabel_got.refcount > 0)
   5971  1.1     skrll 		    eh->datalabel_got.refcount -= 1;
   5972  1.1     skrll 		}
   5973  1.1     skrll #endif
   5974  1.1     skrll 	      else if (h->got.refcount > 0)
   5975  1.1     skrll 		h->got.refcount -= 1;
   5976  1.1     skrll 	    }
   5977  1.1     skrll 	  else if (local_got_refcounts != NULL)
   5978  1.1     skrll 	    {
   5979  1.1     skrll #ifdef INCLUDE_SHMEDIA
   5980  1.1     skrll 	      if (rel->r_addend & 1)
   5981  1.1     skrll 		{
   5982  1.1     skrll 		  if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
   5983  1.1     skrll 		    local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
   5984  1.1     skrll 		}
   5985  1.1     skrll 	      else
   5986  1.1     skrll #endif
   5987  1.1     skrll 		if (local_got_refcounts[r_symndx] > 0)
   5988  1.1     skrll 		  local_got_refcounts[r_symndx] -= 1;
   5989  1.1     skrll 	    }
   5990  1.1     skrll 	  break;
   5991  1.1     skrll 
   5992  1.1     skrll 	default:
   5993  1.1     skrll 	  break;
   5994  1.1     skrll 	}
   5995  1.1     skrll     }
   5996  1.1     skrll 
   5997  1.1     skrll   return TRUE;
   5998  1.1     skrll }
   5999  1.1     skrll 
   6000  1.1     skrll /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   6001  1.1     skrll 
   6002  1.1     skrll static void
   6003  1.1     skrll sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
   6004  1.1     skrll 			     struct elf_link_hash_entry *dir,
   6005  1.1     skrll 			     struct elf_link_hash_entry *ind)
   6006  1.1     skrll {
   6007  1.1     skrll   struct elf_sh_link_hash_entry *edir, *eind;
   6008  1.1     skrll 
   6009  1.1     skrll   edir = (struct elf_sh_link_hash_entry *) dir;
   6010  1.1     skrll   eind = (struct elf_sh_link_hash_entry *) ind;
   6011  1.1     skrll 
   6012  1.1     skrll   if (eind->dyn_relocs != NULL)
   6013  1.1     skrll     {
   6014  1.1     skrll       if (edir->dyn_relocs != NULL)
   6015  1.1     skrll 	{
   6016  1.1     skrll 	  struct elf_sh_dyn_relocs **pp;
   6017  1.1     skrll 	  struct elf_sh_dyn_relocs *p;
   6018  1.1     skrll 
   6019  1.1     skrll 	  /* Add reloc counts against the indirect sym to the direct sym
   6020  1.1     skrll 	     list.  Merge any entries against the same section.  */
   6021  1.1     skrll 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
   6022  1.1     skrll 	    {
   6023  1.1     skrll 	      struct elf_sh_dyn_relocs *q;
   6024  1.1     skrll 
   6025  1.1     skrll 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
   6026  1.1     skrll 		if (q->sec == p->sec)
   6027  1.1     skrll 		  {
   6028  1.1     skrll 		    q->pc_count += p->pc_count;
   6029  1.1     skrll 		    q->count += p->count;
   6030  1.1     skrll 		    *pp = p->next;
   6031  1.1     skrll 		    break;
   6032  1.1     skrll 		  }
   6033  1.1     skrll 	      if (q == NULL)
   6034  1.1     skrll 		pp = &p->next;
   6035  1.1     skrll 	    }
   6036  1.1     skrll 	  *pp = edir->dyn_relocs;
   6037  1.1     skrll 	}
   6038  1.1     skrll 
   6039  1.1     skrll       edir->dyn_relocs = eind->dyn_relocs;
   6040  1.1     skrll       eind->dyn_relocs = NULL;
   6041  1.1     skrll     }
   6042  1.3  christos   edir->gotplt_refcount = eind->gotplt_refcount;
   6043  1.3  christos   eind->gotplt_refcount = 0;
   6044  1.3  christos #ifdef INCLUDE_SHMEDIA
   6045  1.3  christos   edir->datalabel_got.refcount += eind->datalabel_got.refcount;
   6046  1.1     skrll   eind->datalabel_got.refcount = 0;
   6047  1.1     skrll #endif
   6048  1.1     skrll   edir->funcdesc.refcount += eind->funcdesc.refcount;
   6049  1.1     skrll   eind->funcdesc.refcount = 0;
   6050  1.3  christos   edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount;
   6051  1.3  christos   eind->abs_funcdesc_refcount = 0;
   6052  1.1     skrll 
   6053  1.1     skrll   if (ind->root.type == bfd_link_hash_indirect
   6054  1.1     skrll       && dir->got.refcount <= 0)
   6055  1.1     skrll     {
   6056  1.1     skrll       edir->got_type = eind->got_type;
   6057  1.1     skrll       eind->got_type = GOT_UNKNOWN;
   6058  1.1     skrll     }
   6059  1.1     skrll 
   6060  1.1     skrll   if (ind->root.type != bfd_link_hash_indirect
   6061  1.1     skrll       && dir->dynamic_adjusted)
   6062  1.1     skrll     {
   6063  1.1     skrll       /* If called to transfer flags for a weakdef during processing
   6064  1.1     skrll 	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
   6065  1.1     skrll 	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
   6066  1.1     skrll       dir->ref_dynamic |= ind->ref_dynamic;
   6067  1.1     skrll       dir->ref_regular |= ind->ref_regular;
   6068  1.1     skrll       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
   6069  1.1     skrll       dir->needs_plt |= ind->needs_plt;
   6070  1.1     skrll     }
   6071  1.1     skrll   else
   6072  1.1     skrll     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   6073  1.1     skrll }
   6074  1.1     skrll 
   6075  1.1     skrll static int
   6076  1.1     skrll sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
   6077  1.1     skrll 			    int is_local)
   6078  1.1     skrll {
   6079  1.1     skrll   if (info->shared)
   6080  1.1     skrll     return r_type;
   6081  1.1     skrll 
   6082  1.1     skrll   switch (r_type)
   6083  1.1     skrll     {
   6084  1.1     skrll     case R_SH_TLS_GD_32:
   6085  1.1     skrll     case R_SH_TLS_IE_32:
   6086  1.1     skrll       if (is_local)
   6087  1.1     skrll 	return R_SH_TLS_LE_32;
   6088  1.1     skrll       return R_SH_TLS_IE_32;
   6089  1.1     skrll     case R_SH_TLS_LD_32:
   6090  1.1     skrll       return R_SH_TLS_LE_32;
   6091  1.1     skrll     }
   6092  1.1     skrll 
   6093  1.1     skrll   return r_type;
   6094  1.1     skrll }
   6095  1.1     skrll 
   6096  1.1     skrll /* Look through the relocs for a section during the first phase.
   6097  1.1     skrll    Since we don't do .gots or .plts, we just need to consider the
   6098  1.1     skrll    virtual table relocs for gc.  */
   6099  1.1     skrll 
   6100  1.1     skrll static bfd_boolean
   6101  1.1     skrll sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
   6102  1.1     skrll 		     const Elf_Internal_Rela *relocs)
   6103  1.1     skrll {
   6104  1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   6105  1.3  christos   struct elf_link_hash_entry **sym_hashes;
   6106  1.1     skrll   struct elf_sh_link_hash_table *htab;
   6107  1.1     skrll   const Elf_Internal_Rela *rel;
   6108  1.1     skrll   const Elf_Internal_Rela *rel_end;
   6109  1.1     skrll   asection *sreloc;
   6110  1.1     skrll   unsigned int r_type;
   6111  1.1     skrll   int got_type, old_got_type;
   6112  1.1     skrll 
   6113  1.1     skrll   sreloc = NULL;
   6114  1.1     skrll 
   6115  1.1     skrll   if (info->relocatable)
   6116  1.1     skrll     return TRUE;
   6117  1.1     skrll 
   6118  1.3  christos   BFD_ASSERT (is_sh_elf (abfd));
   6119  1.3  christos 
   6120  1.1     skrll   symtab_hdr = &elf_symtab_hdr (abfd);
   6121  1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   6122  1.1     skrll 
   6123  1.1     skrll   htab = sh_elf_hash_table (info);
   6124  1.1     skrll   if (htab == NULL)
   6125  1.1     skrll     return FALSE;
   6126  1.1     skrll 
   6127  1.1     skrll   rel_end = relocs + sec->reloc_count;
   6128  1.1     skrll   for (rel = relocs; rel < rel_end; rel++)
   6129  1.1     skrll     {
   6130  1.1     skrll       struct elf_link_hash_entry *h;
   6131  1.1     skrll       unsigned long r_symndx;
   6132  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6133  1.1     skrll       int seen_stt_datalabel = 0;
   6134  1.1     skrll #endif
   6135  1.1     skrll 
   6136  1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   6137  1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   6138  1.1     skrll 
   6139  1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
   6140  1.1     skrll 	h = NULL;
   6141  1.1     skrll       else
   6142  1.1     skrll 	{
   6143  1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   6144  1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   6145  1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   6146  1.1     skrll 	    {
   6147  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6148  1.1     skrll 	      seen_stt_datalabel |= h->type == STT_DATALABEL;
   6149  1.1     skrll #endif
   6150  1.1     skrll 	      h = (struct elf_link_hash_entry *) h->root.u.i.link;
   6151  1.1     skrll 	    }
   6152  1.1     skrll 	}
   6153  1.1     skrll 
   6154  1.1     skrll       r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
   6155  1.1     skrll       if (! info->shared
   6156  1.1     skrll 	  && r_type == R_SH_TLS_IE_32
   6157  1.1     skrll 	  && h != NULL
   6158  1.3  christos 	  && h->root.type != bfd_link_hash_undefined
   6159  1.3  christos 	  && h->root.type != bfd_link_hash_undefweak
   6160  1.3  christos 	  && (h->dynindx == -1
   6161  1.3  christos 	      || h->def_regular))
   6162  1.3  christos 	r_type = R_SH_TLS_LE_32;
   6163  1.3  christos 
   6164  1.3  christos       if (htab->fdpic_p)
   6165  1.3  christos 	switch (r_type)
   6166  1.3  christos 	  {
   6167  1.3  christos 	  case R_SH_GOTOFFFUNCDESC:
   6168  1.3  christos 	  case R_SH_GOTOFFFUNCDESC20:
   6169  1.3  christos 	  case R_SH_FUNCDESC:
   6170  1.3  christos 	  case R_SH_GOTFUNCDESC:
   6171  1.3  christos 	  case R_SH_GOTFUNCDESC20:
   6172  1.3  christos 	    if (h != NULL)
   6173  1.3  christos 	      {
   6174  1.3  christos 		if (h->dynindx == -1)
   6175  1.3  christos 		  switch (ELF_ST_VISIBILITY (h->other))
   6176  1.3  christos 		    {
   6177  1.3  christos 		    case STV_INTERNAL:
   6178  1.3  christos 		    case STV_HIDDEN:
   6179  1.3  christos 		      break;
   6180  1.3  christos 		    default:
   6181  1.3  christos 		      bfd_elf_link_record_dynamic_symbol (info, h);
   6182  1.1     skrll 		      break;
   6183  1.1     skrll 		    }
   6184  1.1     skrll 	      }
   6185  1.1     skrll 	    break;
   6186  1.1     skrll 	  }
   6187  1.3  christos 
   6188  1.3  christos       /* Some relocs require a global offset table.  */
   6189  1.3  christos       if (htab->sgot == NULL)
   6190  1.3  christos 	{
   6191  1.1     skrll 	  switch (r_type)
   6192  1.1     skrll 	    {
   6193  1.3  christos 	    case R_SH_DIR32:
   6194  1.1     skrll 	      /* This may require an rofixup.  */
   6195  1.3  christos 	      if (!htab->fdpic_p)
   6196  1.3  christos 		break;
   6197  1.3  christos 	    case R_SH_GOTPLT32:
   6198  1.3  christos 	    case R_SH_GOT32:
   6199  1.3  christos 	    case R_SH_GOT20:
   6200  1.3  christos 	    case R_SH_GOTOFF:
   6201  1.1     skrll 	    case R_SH_GOTOFF20:
   6202  1.1     skrll 	    case R_SH_FUNCDESC:
   6203  1.1     skrll 	    case R_SH_GOTFUNCDESC:
   6204  1.1     skrll 	    case R_SH_GOTFUNCDESC20:
   6205  1.1     skrll 	    case R_SH_GOTOFFFUNCDESC:
   6206  1.1     skrll 	    case R_SH_GOTOFFFUNCDESC20:
   6207  1.1     skrll 	    case R_SH_GOTPC:
   6208  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6209  1.1     skrll 	    case R_SH_GOTPLT_LOW16:
   6210  1.1     skrll 	    case R_SH_GOTPLT_MEDLOW16:
   6211  1.1     skrll 	    case R_SH_GOTPLT_MEDHI16:
   6212  1.1     skrll 	    case R_SH_GOTPLT_HI16:
   6213  1.1     skrll 	    case R_SH_GOTPLT10BY4:
   6214  1.1     skrll 	    case R_SH_GOTPLT10BY8:
   6215  1.1     skrll 	    case R_SH_GOT_LOW16:
   6216  1.1     skrll 	    case R_SH_GOT_MEDLOW16:
   6217  1.1     skrll 	    case R_SH_GOT_MEDHI16:
   6218  1.1     skrll 	    case R_SH_GOT_HI16:
   6219  1.1     skrll 	    case R_SH_GOT10BY4:
   6220  1.1     skrll 	    case R_SH_GOT10BY8:
   6221  1.1     skrll 	    case R_SH_GOTOFF_LOW16:
   6222  1.1     skrll 	    case R_SH_GOTOFF_MEDLOW16:
   6223  1.1     skrll 	    case R_SH_GOTOFF_MEDHI16:
   6224  1.1     skrll 	    case R_SH_GOTOFF_HI16:
   6225  1.1     skrll 	    case R_SH_GOTPC_LOW16:
   6226  1.1     skrll 	    case R_SH_GOTPC_MEDLOW16:
   6227  1.3  christos 	    case R_SH_GOTPC_MEDHI16:
   6228  1.3  christos 	    case R_SH_GOTPC_HI16:
   6229  1.3  christos #endif
   6230  1.3  christos 	    case R_SH_TLS_GD_32:
   6231  1.1     skrll 	    case R_SH_TLS_LD_32:
   6232  1.1     skrll 	    case R_SH_TLS_IE_32:
   6233  1.1     skrll 	      if (htab->root.dynobj == NULL)
   6234  1.1     skrll 		htab->root.dynobj = abfd;
   6235  1.1     skrll 	      if (!create_got_section (htab->root.dynobj, info))
   6236  1.1     skrll 		return FALSE;
   6237  1.1     skrll 	      break;
   6238  1.1     skrll 
   6239  1.1     skrll 	    default:
   6240  1.1     skrll 	      break;
   6241  1.1     skrll 	    }
   6242  1.1     skrll 	}
   6243  1.1     skrll 
   6244  1.1     skrll       switch (r_type)
   6245  1.1     skrll 	{
   6246  1.1     skrll 	  /* This relocation describes the C++ object vtable hierarchy.
   6247  1.1     skrll 	     Reconstruct it for later use during GC.  */
   6248  1.1     skrll 	case R_SH_GNU_VTINHERIT:
   6249  1.1     skrll 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   6250  1.1     skrll 	    return FALSE;
   6251  1.1     skrll 	  break;
   6252  1.1     skrll 
   6253  1.1     skrll 	  /* This relocation describes which C++ vtable entries are actually
   6254  1.1     skrll 	     used.  Record for later use during GC.  */
   6255  1.1     skrll 	case R_SH_GNU_VTENTRY:
   6256  1.1     skrll 	  BFD_ASSERT (h != NULL);
   6257  1.1     skrll 	  if (h != NULL
   6258  1.1     skrll 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   6259  1.1     skrll 	    return FALSE;
   6260  1.1     skrll 	  break;
   6261  1.1     skrll 
   6262  1.1     skrll 	case R_SH_TLS_IE_32:
   6263  1.1     skrll 	  if (info->shared)
   6264  1.3  christos 	    info->flags |= DF_STATIC_TLS;
   6265  1.1     skrll 
   6266  1.1     skrll 	  /* FALLTHROUGH */
   6267  1.1     skrll 	force_got:
   6268  1.1     skrll 	case R_SH_TLS_GD_32:
   6269  1.1     skrll 	case R_SH_GOT32:
   6270  1.1     skrll 	case R_SH_GOT20:
   6271  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6272  1.1     skrll 	case R_SH_GOT_LOW16:
   6273  1.3  christos 	case R_SH_GOT_MEDLOW16:
   6274  1.3  christos 	case R_SH_GOT_MEDHI16:
   6275  1.1     skrll 	case R_SH_GOT_HI16:
   6276  1.1     skrll 	case R_SH_GOT10BY4:
   6277  1.1     skrll 	case R_SH_GOT10BY8:
   6278  1.3  christos #endif
   6279  1.1     skrll 	case R_SH_GOTFUNCDESC:
   6280  1.1     skrll 	case R_SH_GOTFUNCDESC20:
   6281  1.3  christos 	  switch (r_type)
   6282  1.1     skrll 	    {
   6283  1.1     skrll 	    default:
   6284  1.3  christos 	      got_type = GOT_NORMAL;
   6285  1.3  christos 	      break;
   6286  1.3  christos 	    case R_SH_TLS_GD_32:
   6287  1.3  christos 	      got_type = GOT_TLS_GD;
   6288  1.3  christos 	      break;
   6289  1.1     skrll 	    case R_SH_TLS_IE_32:
   6290  1.1     skrll 	      got_type = GOT_TLS_IE;
   6291  1.1     skrll 	      break;
   6292  1.1     skrll 	    case R_SH_GOTFUNCDESC:
   6293  1.1     skrll 	    case R_SH_GOTFUNCDESC20:
   6294  1.1     skrll 	      got_type = GOT_FUNCDESC;
   6295  1.1     skrll 	      break;
   6296  1.1     skrll 	    }
   6297  1.1     skrll 
   6298  1.1     skrll 	  if (h != NULL)
   6299  1.1     skrll 	    {
   6300  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6301  1.1     skrll 	      if (seen_stt_datalabel)
   6302  1.1     skrll 		{
   6303  1.1     skrll 		  struct elf_sh_link_hash_entry *eh
   6304  1.1     skrll 		    = (struct elf_sh_link_hash_entry *) h;
   6305  1.3  christos 
   6306  1.1     skrll 		  eh->datalabel_got.refcount += 1;
   6307  1.1     skrll 		}
   6308  1.1     skrll 	      else
   6309  1.1     skrll #endif
   6310  1.1     skrll 		h->got.refcount += 1;
   6311  1.1     skrll 	      old_got_type = sh_elf_hash_entry (h)->got_type;
   6312  1.1     skrll 	    }
   6313  1.1     skrll 	  else
   6314  1.1     skrll 	    {
   6315  1.1     skrll 	      bfd_signed_vma *local_got_refcounts;
   6316  1.1     skrll 
   6317  1.1     skrll 	      /* This is a global offset table entry for a local
   6318  1.1     skrll 		 symbol.  */
   6319  1.1     skrll 	      local_got_refcounts = elf_local_got_refcounts (abfd);
   6320  1.1     skrll 	      if (local_got_refcounts == NULL)
   6321  1.1     skrll 		{
   6322  1.1     skrll 		  bfd_size_type size;
   6323  1.1     skrll 
   6324  1.1     skrll 		  size = symtab_hdr->sh_info;
   6325  1.1     skrll 		  size *= sizeof (bfd_signed_vma);
   6326  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6327  1.1     skrll 		  /* Reserve space for both the datalabel and
   6328  1.1     skrll 		     codelabel local GOT offsets.  */
   6329  1.1     skrll 		  size *= 2;
   6330  1.1     skrll #endif
   6331  1.1     skrll 		  size += symtab_hdr->sh_info;
   6332  1.1     skrll 		  local_got_refcounts = ((bfd_signed_vma *)
   6333  1.1     skrll 					 bfd_zalloc (abfd, size));
   6334  1.3  christos 		  if (local_got_refcounts == NULL)
   6335  1.1     skrll 		    return FALSE;
   6336  1.1     skrll 		  elf_local_got_refcounts (abfd) = local_got_refcounts;
   6337  1.3  christos #ifdef 	INCLUDE_SHMEDIA
   6338  1.1     skrll 		  /* Take care of both the datalabel and codelabel local
   6339  1.1     skrll 		     GOT offsets.  */
   6340  1.1     skrll 		  sh_elf_local_got_type (abfd)
   6341  1.1     skrll 		    = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
   6342  1.1     skrll #else
   6343  1.1     skrll 		  sh_elf_local_got_type (abfd)
   6344  1.1     skrll 		    = (char *) (local_got_refcounts + symtab_hdr->sh_info);
   6345  1.1     skrll #endif
   6346  1.1     skrll 		}
   6347  1.3  christos #ifdef INCLUDE_SHMEDIA
   6348  1.1     skrll 	      if (rel->r_addend & 1)
   6349  1.1     skrll 		local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1;
   6350  1.1     skrll 	      else
   6351  1.1     skrll #endif
   6352  1.3  christos 		local_got_refcounts[r_symndx] += 1;
   6353  1.3  christos 	      old_got_type = sh_elf_local_got_type (abfd) [r_symndx];
   6354  1.1     skrll 	    }
   6355  1.3  christos 
   6356  1.3  christos 	  /* If a TLS symbol is accessed using IE at least once,
   6357  1.1     skrll 	     there is no point to use dynamic model for it.  */
   6358  1.1     skrll 	  if (old_got_type != got_type && old_got_type != GOT_UNKNOWN
   6359  1.3  christos 	      && (old_got_type != GOT_TLS_GD || got_type != GOT_TLS_IE))
   6360  1.3  christos 	    {
   6361  1.3  christos 	      if (old_got_type == GOT_TLS_IE && got_type == GOT_TLS_GD)
   6362  1.3  christos 		got_type = GOT_TLS_IE;
   6363  1.3  christos 	      else
   6364  1.3  christos 		{
   6365  1.3  christos 		  if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC)
   6366  1.3  christos 		      && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL))
   6367  1.3  christos 		    (*_bfd_error_handler)
   6368  1.3  christos 		      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
   6369  1.3  christos 		       abfd, h->root.root.string);
   6370  1.3  christos 		  else if (old_got_type == GOT_FUNCDESC
   6371  1.1     skrll 			   || got_type == GOT_FUNCDESC)
   6372  1.1     skrll 		    (*_bfd_error_handler)
   6373  1.1     skrll 		      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
   6374  1.1     skrll 		       abfd, h->root.root.string);
   6375  1.1     skrll 		  else
   6376  1.1     skrll 		    (*_bfd_error_handler)
   6377  1.3  christos 		    (_("%B: `%s' accessed both as normal and thread local symbol"),
   6378  1.1     skrll 		     abfd, h->root.root.string);
   6379  1.1     skrll 		  return FALSE;
   6380  1.3  christos 		}
   6381  1.1     skrll 	    }
   6382  1.3  christos 
   6383  1.1     skrll 	  if (old_got_type != got_type)
   6384  1.1     skrll 	    {
   6385  1.1     skrll 	      if (h != NULL)
   6386  1.1     skrll 		sh_elf_hash_entry (h)->got_type = got_type;
   6387  1.1     skrll 	      else
   6388  1.1     skrll 		sh_elf_local_got_type (abfd) [r_symndx] = got_type;
   6389  1.1     skrll 	    }
   6390  1.1     skrll 
   6391  1.3  christos 	  break;
   6392  1.3  christos 
   6393  1.3  christos 	case R_SH_TLS_LD_32:
   6394  1.3  christos 	  sh_elf_hash_table(info)->tls_ldm_got.refcount += 1;
   6395  1.3  christos 	  break;
   6396  1.3  christos 
   6397  1.3  christos 	case R_SH_FUNCDESC:
   6398  1.3  christos 	case R_SH_GOTOFFFUNCDESC:
   6399  1.3  christos 	case R_SH_GOTOFFFUNCDESC20:
   6400  1.3  christos 	  if (rel->r_addend)
   6401  1.3  christos 	    {
   6402  1.3  christos 	      (*_bfd_error_handler)
   6403  1.3  christos 		(_("%B: Function descriptor relocation with non-zero addend"),
   6404  1.3  christos 		 abfd);
   6405  1.3  christos 	      return FALSE;
   6406  1.3  christos 	    }
   6407  1.3  christos 
   6408  1.3  christos 	  if (h == NULL)
   6409  1.3  christos 	    {
   6410  1.3  christos 	      union gotref *local_funcdesc;
   6411  1.3  christos 
   6412  1.3  christos 	      /* We need a function descriptor for a local symbol.  */
   6413  1.3  christos 	      local_funcdesc = sh_elf_local_funcdesc (abfd);
   6414  1.3  christos 	      if (local_funcdesc == NULL)
   6415  1.3  christos 		{
   6416  1.3  christos 		  bfd_size_type size;
   6417  1.3  christos 
   6418  1.3  christos 		  size = symtab_hdr->sh_info * sizeof (union gotref);
   6419  1.3  christos #ifdef INCLUDE_SHMEDIA
   6420  1.3  christos 		  /* Count datalabel local GOT.  */
   6421  1.3  christos 		  size *= 2;
   6422  1.3  christos #endif
   6423  1.3  christos 		  local_funcdesc = (union gotref *) bfd_zalloc (abfd, size);
   6424  1.3  christos 		  if (local_funcdesc == NULL)
   6425  1.3  christos 		    return FALSE;
   6426  1.3  christos 		  sh_elf_local_funcdesc (abfd) = local_funcdesc;
   6427  1.3  christos 		}
   6428  1.3  christos 	      local_funcdesc[r_symndx].refcount += 1;
   6429  1.3  christos 
   6430  1.3  christos 	      if (r_type == R_SH_FUNCDESC)
   6431  1.3  christos 		{
   6432  1.3  christos 		  if (!info->shared)
   6433  1.3  christos 		    htab->srofixup->size += 4;
   6434  1.3  christos 		  else
   6435  1.3  christos 		    htab->srelgot->size += sizeof (Elf32_External_Rela);
   6436  1.3  christos 		}
   6437  1.3  christos 	    }
   6438  1.3  christos 	  else
   6439  1.3  christos 	    {
   6440  1.3  christos 	      sh_elf_hash_entry (h)->funcdesc.refcount++;
   6441  1.3  christos 	      if (r_type == R_SH_FUNCDESC)
   6442  1.3  christos 		sh_elf_hash_entry (h)->abs_funcdesc_refcount++;
   6443  1.3  christos 
   6444  1.3  christos 	      /* If there is a function descriptor reference, then
   6445  1.3  christos 		 there should not be any non-FDPIC references.  */
   6446  1.3  christos 	      old_got_type = sh_elf_hash_entry (h)->got_type;
   6447  1.3  christos 	      if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN)
   6448  1.3  christos 		{
   6449  1.3  christos 		  if (old_got_type == GOT_NORMAL)
   6450  1.3  christos 		    (*_bfd_error_handler)
   6451  1.3  christos 		      (_("%B: `%s' accessed both as normal and FDPIC symbol"),
   6452  1.3  christos 		       abfd, h->root.root.string);
   6453  1.3  christos 		  else
   6454  1.3  christos 		    (*_bfd_error_handler)
   6455  1.1     skrll 		      (_("%B: `%s' accessed both as FDPIC and thread local symbol"),
   6456  1.1     skrll 		       abfd, h->root.root.string);
   6457  1.1     skrll 		}
   6458  1.1     skrll 	    }
   6459  1.1     skrll 	  break;
   6460  1.1     skrll 
   6461  1.1     skrll 	case R_SH_GOTPLT32:
   6462  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6463  1.1     skrll 	case R_SH_GOTPLT_LOW16:
   6464  1.1     skrll 	case R_SH_GOTPLT_MEDLOW16:
   6465  1.1     skrll 	case R_SH_GOTPLT_MEDHI16:
   6466  1.1     skrll 	case R_SH_GOTPLT_HI16:
   6467  1.1     skrll 	case R_SH_GOTPLT10BY4:
   6468  1.1     skrll 	case R_SH_GOTPLT10BY8:
   6469  1.1     skrll #endif
   6470  1.1     skrll 	  /* If this is a local symbol, we resolve it directly without
   6471  1.1     skrll 	     creating a procedure linkage table entry.  */
   6472  1.1     skrll 
   6473  1.1     skrll 	  if (h == NULL
   6474  1.1     skrll 	      || h->forced_local
   6475  1.1     skrll 	      || ! info->shared
   6476  1.1     skrll 	      || info->symbolic
   6477  1.1     skrll 	      || h->dynindx == -1)
   6478  1.1     skrll 	    goto force_got;
   6479  1.1     skrll 
   6480  1.1     skrll 	  h->needs_plt = 1;
   6481  1.1     skrll 	  h->plt.refcount += 1;
   6482  1.1     skrll 	  ((struct elf_sh_link_hash_entry *) h)->gotplt_refcount += 1;
   6483  1.1     skrll 
   6484  1.1     skrll 	  break;
   6485  1.1     skrll 
   6486  1.1     skrll 	case R_SH_PLT32:
   6487  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6488  1.1     skrll 	case R_SH_PLT_LOW16:
   6489  1.1     skrll 	case R_SH_PLT_MEDLOW16:
   6490  1.1     skrll 	case R_SH_PLT_MEDHI16:
   6491  1.1     skrll 	case R_SH_PLT_HI16:
   6492  1.1     skrll #endif
   6493  1.1     skrll 	  /* This symbol requires a procedure linkage table entry.  We
   6494  1.1     skrll 	     actually build the entry in adjust_dynamic_symbol,
   6495  1.1     skrll 	     because this might be a case of linking PIC code which is
   6496  1.1     skrll 	     never referenced by a dynamic object, in which case we
   6497  1.1     skrll 	     don't need to generate a procedure linkage table entry
   6498  1.1     skrll 	     after all.  */
   6499  1.1     skrll 
   6500  1.1     skrll 	  /* If this is a local symbol, we resolve it directly without
   6501  1.1     skrll 	     creating a procedure linkage table entry.  */
   6502  1.1     skrll 	  if (h == NULL)
   6503  1.1     skrll 	    continue;
   6504  1.1     skrll 
   6505  1.1     skrll 	  if (h->forced_local)
   6506  1.1     skrll 	    break;
   6507  1.1     skrll 
   6508  1.1     skrll 	  h->needs_plt = 1;
   6509  1.1     skrll 	  h->plt.refcount += 1;
   6510  1.1     skrll 	  break;
   6511  1.1     skrll 
   6512  1.1     skrll 	case R_SH_DIR32:
   6513  1.1     skrll 	case R_SH_REL32:
   6514  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6515  1.1     skrll 	case R_SH_IMM_LOW16_PCREL:
   6516  1.1     skrll 	case R_SH_IMM_MEDLOW16_PCREL:
   6517  1.1     skrll 	case R_SH_IMM_MEDHI16_PCREL:
   6518  1.1     skrll 	case R_SH_IMM_HI16_PCREL:
   6519  1.1     skrll #endif
   6520  1.1     skrll 	  if (h != NULL && ! info->shared)
   6521  1.1     skrll 	    {
   6522  1.1     skrll 	      h->non_got_ref = 1;
   6523  1.1     skrll 	      h->plt.refcount += 1;
   6524  1.1     skrll 	    }
   6525  1.1     skrll 
   6526  1.1     skrll 	  /* If we are creating a shared library, and this is a reloc
   6527  1.1     skrll 	     against a global symbol, or a non PC relative reloc
   6528  1.1     skrll 	     against a local symbol, then we need to copy the reloc
   6529  1.1     skrll 	     into the shared library.  However, if we are linking with
   6530  1.1     skrll 	     -Bsymbolic, we do not need to copy a reloc against a
   6531  1.1     skrll 	     global symbol which is defined in an object we are
   6532  1.1     skrll 	     including in the link (i.e., DEF_REGULAR is set).  At
   6533  1.1     skrll 	     this point we have not seen all the input files, so it is
   6534  1.1     skrll 	     possible that DEF_REGULAR is not set now but will be set
   6535  1.1     skrll 	     later (it is never cleared).  We account for that
   6536  1.1     skrll 	     possibility below by storing information in the
   6537  1.1     skrll 	     dyn_relocs field of the hash table entry. A similar
   6538  1.1     skrll 	     situation occurs when creating shared libraries and symbol
   6539  1.1     skrll 	     visibility changes render the symbol local.
   6540  1.1     skrll 
   6541  1.1     skrll 	     If on the other hand, we are creating an executable, we
   6542  1.1     skrll 	     may need to keep relocations for symbols satisfied by a
   6543  1.1     skrll 	     dynamic library if we manage to avoid copy relocs for the
   6544  1.1     skrll 	     symbol.  */
   6545  1.1     skrll 	  if ((info->shared
   6546  1.1     skrll 	       && (sec->flags & SEC_ALLOC) != 0
   6547  1.1     skrll 	       && (r_type != R_SH_REL32
   6548  1.1     skrll 		   || (h != NULL
   6549  1.1     skrll 		       && (! info->symbolic
   6550  1.1     skrll 			   || h->root.type == bfd_link_hash_defweak
   6551  1.1     skrll 			   || !h->def_regular))))
   6552  1.1     skrll 	      || (! info->shared
   6553  1.1     skrll 		  && (sec->flags & SEC_ALLOC) != 0
   6554  1.1     skrll 		  && h != NULL
   6555  1.1     skrll 		  && (h->root.type == bfd_link_hash_defweak
   6556  1.1     skrll 		      || !h->def_regular)))
   6557  1.1     skrll 	    {
   6558  1.1     skrll 	      struct elf_sh_dyn_relocs *p;
   6559  1.1     skrll 	      struct elf_sh_dyn_relocs **head;
   6560  1.1     skrll 
   6561  1.1     skrll 	      if (htab->root.dynobj == NULL)
   6562  1.1     skrll 		htab->root.dynobj = abfd;
   6563  1.3  christos 
   6564  1.3  christos 	      /* When creating a shared object, we must copy these
   6565  1.1     skrll 		 reloc types into the output file.  We create a reloc
   6566  1.3  christos 		 section in dynobj and make room for this reloc.  */
   6567  1.1     skrll 	      if (sreloc == NULL)
   6568  1.1     skrll 		{
   6569  1.1     skrll 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   6570  1.1     skrll 		    (sec, htab->root.dynobj, 2, abfd, /*rela?*/ TRUE);
   6571  1.1     skrll 
   6572  1.1     skrll 		  if (sreloc == NULL)
   6573  1.1     skrll 		    return FALSE;
   6574  1.1     skrll 		}
   6575  1.1     skrll 
   6576  1.3  christos 	      /* If this is a global symbol, we count the number of
   6577  1.1     skrll 		 relocations we need for this symbol.  */
   6578  1.1     skrll 	      if (h != NULL)
   6579  1.3  christos 		head = &((struct elf_sh_link_hash_entry *) h)->dyn_relocs;
   6580  1.3  christos 	      else
   6581  1.3  christos 		{
   6582  1.3  christos 		  /* Track dynamic relocs needed for local syms too.  */
   6583  1.3  christos 		  asection *s;
   6584  1.3  christos 		  void *vpp;
   6585  1.1     skrll 		  Elf_Internal_Sym *isym;
   6586  1.3  christos 
   6587  1.1     skrll 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   6588  1.3  christos 						abfd, r_symndx);
   6589  1.1     skrll 		  if (isym == NULL)
   6590  1.1     skrll 		    return FALSE;
   6591  1.1     skrll 
   6592  1.1     skrll 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   6593  1.1     skrll 		  if (s == NULL)
   6594  1.1     skrll 		    s = sec;
   6595  1.1     skrll 
   6596  1.1     skrll 		  vpp = &elf_section_data (s)->local_dynrel;
   6597  1.1     skrll 		  head = (struct elf_sh_dyn_relocs **) vpp;
   6598  1.1     skrll 		}
   6599  1.1     skrll 
   6600  1.1     skrll 	      p = *head;
   6601  1.1     skrll 	      if (p == NULL || p->sec != sec)
   6602  1.1     skrll 		{
   6603  1.1     skrll 		  bfd_size_type amt = sizeof (*p);
   6604  1.1     skrll 		  p = bfd_alloc (htab->root.dynobj, amt);
   6605  1.1     skrll 		  if (p == NULL)
   6606  1.1     skrll 		    return FALSE;
   6607  1.1     skrll 		  p->next = *head;
   6608  1.1     skrll 		  *head = p;
   6609  1.1     skrll 		  p->sec = sec;
   6610  1.1     skrll 		  p->count = 0;
   6611  1.1     skrll 		  p->pc_count = 0;
   6612  1.1     skrll 		}
   6613  1.1     skrll 
   6614  1.1     skrll 	      p->count += 1;
   6615  1.1     skrll 	      if (r_type == R_SH_REL32
   6616  1.1     skrll #ifdef INCLUDE_SHMEDIA
   6617  1.1     skrll 		  || r_type == R_SH_IMM_LOW16_PCREL
   6618  1.1     skrll 		  || r_type == R_SH_IMM_MEDLOW16_PCREL
   6619  1.1     skrll 		  || r_type == R_SH_IMM_MEDHI16_PCREL
   6620  1.3  christos 		  || r_type == R_SH_IMM_HI16_PCREL
   6621  1.3  christos #endif
   6622  1.3  christos 		  )
   6623  1.3  christos 		p->pc_count += 1;
   6624  1.3  christos 	    }
   6625  1.3  christos 
   6626  1.3  christos 	  /* Allocate the fixup regardless of whether we need a relocation.
   6627  1.1     skrll 	     If we end up generating the relocation, we'll unallocate the
   6628  1.1     skrll 	     fixup.  */
   6629  1.1     skrll 	  if (htab->fdpic_p && !info->shared
   6630  1.1     skrll 	      && r_type == R_SH_DIR32
   6631  1.1     skrll 	      && (sec->flags & SEC_ALLOC) != 0)
   6632  1.1     skrll 	    htab->srofixup->size += 4;
   6633  1.1     skrll 	  break;
   6634  1.1     skrll 
   6635  1.1     skrll 	case R_SH_TLS_LE_32:
   6636  1.1     skrll 	  if (info->shared)
   6637  1.1     skrll 	    {
   6638  1.1     skrll 	      (*_bfd_error_handler)
   6639  1.1     skrll 		(_("%B: TLS local exec code cannot be linked into shared objects"),
   6640  1.1     skrll 		 abfd);
   6641  1.1     skrll 	      return FALSE;
   6642  1.1     skrll 	    }
   6643  1.1     skrll 
   6644  1.1     skrll 	  break;
   6645  1.1     skrll 
   6646  1.1     skrll 	case R_SH_TLS_LDO_32:
   6647  1.1     skrll 	  /* Nothing to do.  */
   6648  1.1     skrll 	  break;
   6649  1.1     skrll 
   6650  1.1     skrll 	default:
   6651  1.1     skrll 	  break;
   6652  1.1     skrll 	}
   6653  1.1     skrll     }
   6654  1.1     skrll 
   6655  1.1     skrll   return TRUE;
   6656  1.1     skrll }
   6657  1.1     skrll 
   6658  1.1     skrll #ifndef sh_elf_set_mach_from_flags
   6659  1.1     skrll static unsigned int sh_ef_bfd_table[] = { EF_SH_BFD_TABLE };
   6660  1.1     skrll 
   6661  1.1     skrll static bfd_boolean
   6662  1.1     skrll sh_elf_set_mach_from_flags (bfd *abfd)
   6663  1.1     skrll {
   6664  1.1     skrll   flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
   6665  1.1     skrll 
   6666  1.1     skrll   if (flags >= sizeof(sh_ef_bfd_table))
   6667  1.1     skrll     return FALSE;
   6668  1.1     skrll 
   6669  1.1     skrll   if (sh_ef_bfd_table[flags] == 0)
   6670  1.1     skrll     return FALSE;
   6671  1.1     skrll 
   6672  1.1     skrll   bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
   6673  1.1     skrll 
   6674  1.1     skrll   return TRUE;
   6675  1.1     skrll }
   6676  1.1     skrll 
   6677  1.1     skrll 
   6678  1.1     skrll /* Reverse table lookup for sh_ef_bfd_table[].
   6679  1.1     skrll    Given a bfd MACH value from archures.c
   6680  1.1     skrll    return the equivalent ELF flags from the table.
   6681  1.1     skrll    Return -1 if no match is found.  */
   6682  1.1     skrll 
   6683  1.1     skrll int
   6684  1.1     skrll sh_elf_get_flags_from_mach (unsigned long mach)
   6685  1.1     skrll {
   6686  1.1     skrll   int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
   6687  1.1     skrll 
   6688  1.1     skrll   for (; i>0; i--)
   6689  1.1     skrll     if (sh_ef_bfd_table[i] == mach)
   6690  1.1     skrll       return i;
   6691  1.1     skrll 
   6692  1.1     skrll   /* shouldn't get here */
   6693  1.1     skrll   BFD_FAIL();
   6694  1.1     skrll 
   6695  1.1     skrll   return -1;
   6696  1.1     skrll }
   6697  1.1     skrll #endif /* not sh_elf_set_mach_from_flags */
   6698  1.1     skrll 
   6699  1.1     skrll #ifndef sh_elf_set_private_flags
   6700  1.1     skrll /* Function to keep SH specific file flags.  */
   6701  1.1     skrll 
   6702  1.1     skrll static bfd_boolean
   6703  1.1     skrll sh_elf_set_private_flags (bfd *abfd, flagword flags)
   6704  1.1     skrll {
   6705  1.1     skrll   BFD_ASSERT (! elf_flags_init (abfd)
   6706  1.1     skrll 	      || elf_elfheader (abfd)->e_flags == flags);
   6707  1.1     skrll 
   6708  1.1     skrll   elf_elfheader (abfd)->e_flags = flags;
   6709  1.1     skrll   elf_flags_init (abfd) = TRUE;
   6710  1.1     skrll   return sh_elf_set_mach_from_flags (abfd);
   6711  1.1     skrll }
   6712  1.1     skrll #endif /* not sh_elf_set_private_flags */
   6713  1.1     skrll 
   6714  1.1     skrll #ifndef sh_elf_copy_private_data
   6715  1.1     skrll /* Copy backend specific data from one object module to another */
   6716  1.1     skrll 
   6717  1.1     skrll static bfd_boolean
   6718  1.1     skrll sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
   6719  1.1     skrll {
   6720  1.3  christos   /* Copy object attributes.  */
   6721  1.3  christos   _bfd_elf_copy_obj_attributes (ibfd, obfd);
   6722  1.3  christos 
   6723  1.3  christos   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
   6724  1.3  christos     return TRUE;
   6725  1.3  christos 
   6726  1.3  christos   /* Copy the stack size.  */
   6727  1.3  christos   if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
   6728  1.3  christos       && fdpic_object_p (ibfd) && fdpic_object_p (obfd))
   6729  1.3  christos     {
   6730  1.3  christos       unsigned i;
   6731  1.3  christos 
   6732  1.3  christos       for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
   6733  1.3  christos 	if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
   6734  1.3  christos 	  {
   6735  1.3  christos 	    Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
   6736  1.3  christos 
   6737  1.3  christos 	    for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
   6738  1.3  christos 	      if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
   6739  1.3  christos 		{
   6740  1.3  christos 		  memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
   6741  1.3  christos 
   6742  1.3  christos 		  /* Rewrite the phdrs, since we're only called after they
   6743  1.3  christos 		     were first written.  */
   6744  1.3  christos 		  if (bfd_seek (obfd,
   6745  1.3  christos 				(bfd_signed_vma) get_elf_backend_data (obfd)
   6746  1.3  christos 				->s->sizeof_ehdr, SEEK_SET) != 0
   6747  1.3  christos 		      || get_elf_backend_data (obfd)->s
   6748  1.3  christos 		      ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
   6749  1.3  christos 					 elf_elfheader (obfd)->e_phnum) != 0)
   6750  1.3  christos 		    return FALSE;
   6751  1.3  christos 		  break;
   6752  1.1     skrll 		}
   6753  1.1     skrll 
   6754  1.1     skrll 	    break;
   6755  1.1     skrll 	  }
   6756  1.1     skrll     }
   6757  1.1     skrll 
   6758  1.1     skrll   return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
   6759  1.1     skrll }
   6760  1.1     skrll #endif /* not sh_elf_copy_private_data */
   6761  1.1     skrll 
   6762  1.1     skrll #ifndef sh_elf_merge_private_data
   6763  1.1     skrll 
   6764  1.1     skrll /* This function returns the ELF architecture number that
   6765  1.1     skrll    corresponds to the given arch_sh* flags.  */
   6766  1.1     skrll 
   6767  1.1     skrll int
   6768  1.1     skrll sh_find_elf_flags (unsigned int arch_set)
   6769  1.1     skrll {
   6770  1.1     skrll   extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int);
   6771  1.1     skrll   unsigned long bfd_mach = sh_get_bfd_mach_from_arch_set (arch_set);
   6772  1.1     skrll 
   6773  1.1     skrll   return sh_elf_get_flags_from_mach (bfd_mach);
   6774  1.1     skrll }
   6775  1.1     skrll 
   6776  1.1     skrll /* This routine initialises the elf flags when required and
   6777  1.1     skrll    calls sh_merge_bfd_arch() to check dsp/fpu compatibility.  */
   6778  1.1     skrll 
   6779  1.1     skrll static bfd_boolean
   6780  1.1     skrll sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
   6781  1.1     skrll {
   6782  1.1     skrll   extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *);
   6783  1.1     skrll 
   6784  1.1     skrll   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
   6785  1.3  christos     return TRUE;
   6786  1.1     skrll 
   6787  1.3  christos   if (! elf_flags_init (obfd))
   6788  1.3  christos     {
   6789  1.1     skrll       /* This happens when ld starts out with a 'blank' output file.  */
   6790  1.1     skrll       elf_flags_init (obfd) = TRUE;
   6791  1.1     skrll       elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
   6792  1.1     skrll       sh_elf_set_mach_from_flags (obfd);
   6793  1.1     skrll       if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC)
   6794  1.1     skrll 	elf_elfheader (obfd)->e_flags |= EF_SH_PIC;
   6795  1.1     skrll     }
   6796  1.1     skrll 
   6797  1.1     skrll   if (! sh_merge_bfd_arch (ibfd, obfd))
   6798  1.1     skrll     {
   6799  1.1     skrll       _bfd_error_handler ("%B: uses instructions which are incompatible "
   6800  1.3  christos 			  "with instructions used in previous modules",
   6801  1.3  christos 			  ibfd);
   6802  1.1     skrll       bfd_set_error (bfd_error_bad_value);
   6803  1.3  christos       return FALSE;
   6804  1.3  christos     }
   6805  1.3  christos 
   6806  1.3  christos   elf_elfheader (obfd)->e_flags &= ~EF_SH_MACH_MASK;
   6807  1.3  christos   elf_elfheader (obfd)->e_flags |=
   6808  1.3  christos     sh_elf_get_flags_from_mach (bfd_get_mach (obfd));
   6809  1.3  christos 
   6810  1.3  christos   if (fdpic_object_p (ibfd) != fdpic_object_p (obfd))
   6811  1.3  christos     {
   6812  1.1     skrll       _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects",
   6813  1.1     skrll 			  ibfd);
   6814  1.1     skrll       bfd_set_error (bfd_error_bad_value);
   6815  1.1     skrll       return FALSE;
   6816  1.1     skrll     }
   6817  1.1     skrll 
   6818  1.1     skrll   return TRUE;
   6819  1.1     skrll }
   6820  1.1     skrll #endif /* not sh_elf_merge_private_data */
   6821  1.1     skrll 
   6822  1.1     skrll /* Override the generic function because we need to store sh_elf_obj_tdata
   6823  1.3  christos    as the specific tdata.  We set also the machine architecture from flags
   6824  1.3  christos    here.  */
   6825  1.3  christos 
   6826  1.3  christos static bfd_boolean
   6827  1.3  christos sh_elf_object_p (bfd *abfd)
   6828  1.1     skrll {
   6829  1.1     skrll   if (! sh_elf_set_mach_from_flags (abfd))
   6830  1.1     skrll     return FALSE;
   6831  1.1     skrll 
   6832  1.1     skrll   return (((elf_elfheader (abfd)->e_flags & EF_SH_FDPIC) != 0)
   6833  1.1     skrll 	  == fdpic_object_p (abfd));
   6834  1.1     skrll }
   6835  1.1     skrll 
   6836  1.1     skrll /* Finish up dynamic symbol handling.  We set the contents of various
   6837  1.1     skrll    dynamic sections here.  */
   6838  1.1     skrll 
   6839  1.1     skrll static bfd_boolean
   6840  1.1     skrll sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
   6841  1.3  christos 			      struct elf_link_hash_entry *h,
   6842  1.3  christos 			      Elf_Internal_Sym *sym)
   6843  1.1     skrll {
   6844  1.1     skrll   struct elf_sh_link_hash_table *htab;
   6845  1.1     skrll 
   6846  1.1     skrll   htab = sh_elf_hash_table (info);
   6847  1.3  christos   if (htab == NULL)
   6848  1.3  christos     return FALSE;
   6849  1.1     skrll 
   6850  1.1     skrll   if (h->plt.offset != (bfd_vma) -1)
   6851  1.1     skrll     {
   6852  1.1     skrll       asection *splt;
   6853  1.1     skrll       asection *sgotplt;
   6854  1.3  christos       asection *srelplt;
   6855  1.1     skrll 
   6856  1.1     skrll       bfd_vma plt_index;
   6857  1.1     skrll       bfd_vma got_offset;
   6858  1.1     skrll       Elf_Internal_Rela rel;
   6859  1.1     skrll       bfd_byte *loc;
   6860  1.1     skrll       const struct elf_sh_plt_info *plt_info;
   6861  1.1     skrll 
   6862  1.3  christos       /* This symbol has an entry in the procedure linkage table.  Set
   6863  1.3  christos 	 it up.  */
   6864  1.3  christos 
   6865  1.1     skrll       BFD_ASSERT (h->dynindx != -1);
   6866  1.1     skrll 
   6867  1.1     skrll       splt = htab->splt;
   6868  1.1     skrll       sgotplt = htab->sgotplt;
   6869  1.1     skrll       srelplt = htab->srelplt;
   6870  1.1     skrll       BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL);
   6871  1.1     skrll 
   6872  1.3  christos       /* Get the index in the procedure linkage table which
   6873  1.3  christos 	 corresponds to this symbol.  This is the index of this symbol
   6874  1.3  christos 	 in all the symbols for which we are making plt entries.  The
   6875  1.3  christos 	 first entry in the procedure linkage table is reserved.  */
   6876  1.1     skrll       plt_index = get_plt_index (htab->plt_info, h->plt.offset);
   6877  1.3  christos 
   6878  1.3  christos       plt_info = htab->plt_info;
   6879  1.3  christos       if (plt_info->short_plt != NULL && plt_index <= MAX_SHORT_PLT)
   6880  1.3  christos 	plt_info = plt_info->short_plt;
   6881  1.3  christos 
   6882  1.3  christos       /* Get the offset into the .got table of the entry that
   6883  1.3  christos 	 corresponds to this function.  */
   6884  1.3  christos       if (htab->fdpic_p)
   6885  1.3  christos 	/* The offset must be relative to the GOT symbol, twelve bytes
   6886  1.3  christos 	   before the end of .got.plt.  Each descriptor is eight
   6887  1.1     skrll 	   bytes.  */
   6888  1.1     skrll 	got_offset = plt_index * 8 + 12 - sgotplt->size;
   6889  1.1     skrll       else
   6890  1.1     skrll 	/* Each .got entry is 4 bytes.  The first three are
   6891  1.1     skrll 	   reserved.  */
   6892  1.1     skrll 	got_offset = (plt_index + 3) * 4;
   6893  1.1     skrll 
   6894  1.1     skrll #ifdef GOT_BIAS
   6895  1.3  christos       if (info->shared)
   6896  1.3  christos 	got_offset -= GOT_BIAS;
   6897  1.1     skrll #endif
   6898  1.3  christos 
   6899  1.3  christos       /* Fill in the entry in the procedure linkage table.  */
   6900  1.3  christos       memcpy (splt->contents + h->plt.offset,
   6901  1.3  christos 	      plt_info->symbol_entry,
   6902  1.3  christos 	      plt_info->symbol_entry_size);
   6903  1.3  christos 
   6904  1.3  christos       if (info->shared || htab->fdpic_p)
   6905  1.3  christos 	{
   6906  1.3  christos 	  if (plt_info->symbol_fields.got20)
   6907  1.3  christos 	    {
   6908  1.3  christos 	      bfd_reloc_status_type r;
   6909  1.3  christos 	      r = install_movi20_field (output_bfd, got_offset,
   6910  1.3  christos 					splt->owner, splt, splt->contents,
   6911  1.3  christos 					h->plt.offset
   6912  1.3  christos 					+ plt_info->symbol_fields.got_entry);
   6913  1.3  christos 	      BFD_ASSERT (r == bfd_reloc_ok);
   6914  1.3  christos 	    }
   6915  1.1     skrll 	  else
   6916  1.1     skrll 	    install_plt_field (output_bfd, FALSE, got_offset,
   6917  1.3  christos 			       (splt->contents
   6918  1.3  christos 				+ h->plt.offset
   6919  1.1     skrll 				+ plt_info->symbol_fields.got_entry));
   6920  1.3  christos 	}
   6921  1.3  christos       else
   6922  1.1     skrll 	{
   6923  1.1     skrll 	  BFD_ASSERT (!plt_info->symbol_fields.got20);
   6924  1.1     skrll 
   6925  1.3  christos 	  install_plt_field (output_bfd, FALSE,
   6926  1.1     skrll 			     (sgotplt->output_section->vma
   6927  1.1     skrll 			      + sgotplt->output_offset
   6928  1.1     skrll 			      + got_offset),
   6929  1.1     skrll 			     (splt->contents
   6930  1.1     skrll 			      + h->plt.offset
   6931  1.1     skrll 			      + plt_info->symbol_fields.got_entry));
   6932  1.1     skrll 	  if (htab->vxworks_p)
   6933  1.1     skrll 	    {
   6934  1.1     skrll 	      unsigned int reachable_plts, plts_per_4k;
   6935  1.1     skrll 	      int distance;
   6936  1.1     skrll 
   6937  1.1     skrll 	      /* Divide the PLT into groups.  The first group contains
   6938  1.1     skrll 		 REACHABLE_PLTS entries and the other groups contain
   6939  1.3  christos 		 PLTS_PER_4K entries.  Entries in the first group can
   6940  1.3  christos 		 branch directly to .plt; those in later groups branch
   6941  1.3  christos 		 to the last element of the previous group.  */
   6942  1.3  christos 	      /* ??? It would be better to create multiple copies of
   6943  1.1     skrll 		 the common resolver stub.  */
   6944  1.1     skrll 	      reachable_plts = ((4096
   6945  1.3  christos 				 - plt_info->plt0_entry_size
   6946  1.1     skrll 				 - (plt_info->symbol_fields.plt + 4))
   6947  1.1     skrll 				/ plt_info->symbol_entry_size) + 1;
   6948  1.3  christos 	      plts_per_4k = (4096 / plt_info->symbol_entry_size);
   6949  1.1     skrll 	      if (plt_index < reachable_plts)
   6950  1.1     skrll 		distance = -(h->plt.offset
   6951  1.1     skrll 			     + plt_info->symbol_fields.plt);
   6952  1.1     skrll 	      else
   6953  1.1     skrll 		distance = -(((plt_index - reachable_plts) % plts_per_4k + 1)
   6954  1.1     skrll 			     * plt_info->symbol_entry_size);
   6955  1.3  christos 
   6956  1.1     skrll 	      /* Install the 'bra' with this offset.  */
   6957  1.1     skrll 	      bfd_put_16 (output_bfd,
   6958  1.1     skrll 			  0xa000 | (0x0fff & ((distance - 4) / 2)),
   6959  1.1     skrll 			  (splt->contents
   6960  1.1     skrll 			   + h->plt.offset
   6961  1.1     skrll 			   + plt_info->symbol_fields.plt));
   6962  1.3  christos 	    }
   6963  1.1     skrll 	  else
   6964  1.1     skrll 	    install_plt_field (output_bfd, TRUE,
   6965  1.3  christos 			       splt->output_section->vma + splt->output_offset,
   6966  1.1     skrll 			       (splt->contents
   6967  1.1     skrll 				+ h->plt.offset
   6968  1.1     skrll 				+ plt_info->symbol_fields.plt));
   6969  1.1     skrll 	}
   6970  1.3  christos 
   6971  1.3  christos       /* Make got_offset relative to the start of .got.plt.  */
   6972  1.1     skrll #ifdef GOT_BIAS
   6973  1.3  christos       if (info->shared)
   6974  1.3  christos 	got_offset += GOT_BIAS;
   6975  1.3  christos #endif
   6976  1.3  christos       if (htab->fdpic_p)
   6977  1.3  christos 	got_offset = plt_index * 8;
   6978  1.3  christos 
   6979  1.1     skrll       if (plt_info->symbol_fields.reloc_offset != MINUS_ONE)
   6980  1.1     skrll 	install_plt_field (output_bfd, FALSE,
   6981  1.1     skrll 			   plt_index * sizeof (Elf32_External_Rela),
   6982  1.1     skrll 			   (splt->contents
   6983  1.1     skrll 			    + h->plt.offset
   6984  1.1     skrll 			    + plt_info->symbol_fields.reloc_offset));
   6985  1.3  christos 
   6986  1.3  christos       /* Fill in the entry in the global offset table.  */
   6987  1.3  christos       bfd_put_32 (output_bfd,
   6988  1.3  christos 		  (splt->output_section->vma
   6989  1.3  christos 		   + splt->output_offset
   6990  1.3  christos 		   + h->plt.offset
   6991  1.3  christos 		   + plt_info->symbol_resolve_offset),
   6992  1.1     skrll 		  sgotplt->contents + got_offset);
   6993  1.1     skrll       if (htab->fdpic_p)
   6994  1.3  christos 	bfd_put_32 (output_bfd,
   6995  1.3  christos 		    sh_elf_osec_to_segment (output_bfd,
   6996  1.1     skrll 					    htab->splt->output_section),
   6997  1.3  christos 		    sgotplt->contents + got_offset + 4);
   6998  1.3  christos 
   6999  1.3  christos       /* Fill in the entry in the .rela.plt section.  */
   7000  1.3  christos       rel.r_offset = (sgotplt->output_section->vma
   7001  1.1     skrll 		      + sgotplt->output_offset
   7002  1.1     skrll 		      + got_offset);
   7003  1.1     skrll       if (htab->fdpic_p)
   7004  1.1     skrll 	rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_FUNCDESC_VALUE);
   7005  1.3  christos       else
   7006  1.1     skrll 	rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
   7007  1.1     skrll       rel.r_addend = 0;
   7008  1.1     skrll #ifdef GOT_BIAS
   7009  1.1     skrll       rel.r_addend = GOT_BIAS;
   7010  1.1     skrll #endif
   7011  1.1     skrll       loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
   7012  1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7013  1.1     skrll 
   7014  1.1     skrll       if (htab->vxworks_p && !info->shared)
   7015  1.1     skrll 	{
   7016  1.1     skrll 	  /* Create the .rela.plt.unloaded relocations for this PLT entry.
   7017  1.1     skrll 	     Begin by pointing LOC to the first such relocation.  */
   7018  1.1     skrll 	  loc = (htab->srelplt2->contents
   7019  1.1     skrll 		 + (plt_index * 2 + 1) * sizeof (Elf32_External_Rela));
   7020  1.3  christos 
   7021  1.1     skrll 	  /* Create a .rela.plt.unloaded R_SH_DIR32 relocation
   7022  1.1     skrll 	     for the PLT entry's pointer to the .got.plt entry.  */
   7023  1.1     skrll 	  rel.r_offset = (htab->splt->output_section->vma
   7024  1.1     skrll 			  + htab->splt->output_offset
   7025  1.1     skrll 			  + h->plt.offset
   7026  1.1     skrll 			  + plt_info->symbol_fields.got_entry);
   7027  1.1     skrll 	  rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
   7028  1.3  christos 	  rel.r_addend = got_offset;
   7029  1.3  christos 	  bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7030  1.1     skrll 	  loc += sizeof (Elf32_External_Rela);
   7031  1.1     skrll 
   7032  1.1     skrll 	  /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for
   7033  1.1     skrll 	     the .got.plt entry, which initially points to .plt.  */
   7034  1.1     skrll 	  rel.r_offset = (sgotplt->output_section->vma
   7035  1.1     skrll 			  + sgotplt->output_offset
   7036  1.1     skrll 			  + got_offset);
   7037  1.1     skrll 	  rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_SH_DIR32);
   7038  1.1     skrll 	  rel.r_addend = 0;
   7039  1.1     skrll 	  bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   7040  1.1     skrll 	}
   7041  1.1     skrll 
   7042  1.1     skrll       if (!h->def_regular)
   7043  1.1     skrll 	{
   7044  1.1     skrll 	  /* Mark the symbol as undefined, rather than as defined in
   7045  1.3  christos 	     the .plt section.  Leave the value alone.  */
   7046  1.3  christos 	  sym->st_shndx = SHN_UNDEF;
   7047  1.3  christos 	}
   7048  1.1     skrll     }
   7049  1.1     skrll 
   7050  1.3  christos   if (h->got.offset != (bfd_vma) -1
   7051  1.1     skrll       && sh_elf_hash_entry (h)->got_type != GOT_TLS_GD
   7052  1.1     skrll       && sh_elf_hash_entry (h)->got_type != GOT_TLS_IE
   7053  1.1     skrll       && sh_elf_hash_entry (h)->got_type != GOT_FUNCDESC)
   7054  1.1     skrll     {
   7055  1.1     skrll       asection *sgot;
   7056  1.1     skrll       asection *srelgot;
   7057  1.1     skrll       Elf_Internal_Rela rel;
   7058  1.3  christos       bfd_byte *loc;
   7059  1.3  christos 
   7060  1.1     skrll       /* This symbol has an entry in the global offset table.  Set it
   7061  1.1     skrll 	 up.  */
   7062  1.1     skrll 
   7063  1.1     skrll       sgot = htab->sgot;
   7064  1.1     skrll       srelgot = htab->srelgot;
   7065  1.1     skrll       BFD_ASSERT (sgot != NULL && srelgot != NULL);
   7066  1.1     skrll 
   7067  1.1     skrll       rel.r_offset = (sgot->output_section->vma
   7068  1.1     skrll 		      + sgot->output_offset
   7069  1.1     skrll 		      + (h->got.offset &~ (bfd_vma) 1));
   7070  1.1     skrll 
   7071  1.1     skrll       /* If this is a static link, or it is a -Bsymbolic link and the
   7072  1.1     skrll 	 symbol is defined locally or was forced to be local because
   7073  1.3  christos 	 of a version file, we just want to emit a RELATIVE reloc.
   7074  1.3  christos 	 The entry in the global offset table will already have been
   7075  1.3  christos 	 initialized in the relocate_section function.  */
   7076  1.3  christos       if (info->shared
   7077  1.3  christos 	  && SYMBOL_REFERENCES_LOCAL (info, h))
   7078  1.3  christos 	{
   7079  1.3  christos 	  if (htab->fdpic_p)
   7080  1.3  christos 	    {
   7081  1.3  christos 	      asection *sec = h->root.u.def.section;
   7082  1.3  christos 	      int dynindx
   7083  1.3  christos 		= elf_section_data (sec->output_section)->dynindx;
   7084  1.3  christos 
   7085  1.3  christos 	      rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
   7086  1.3  christos 	      rel.r_addend = (h->root.u.def.value
   7087  1.3  christos 			      + h->root.u.def.section->output_offset);
   7088  1.3  christos 	    }
   7089  1.3  christos 	  else
   7090  1.1     skrll 	    {
   7091  1.1     skrll 	      rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
   7092  1.1     skrll 	      rel.r_addend = (h->root.u.def.value
   7093  1.1     skrll 			      + h->root.u.def.section->output_section->vma
   7094  1.1     skrll 			      + h->root.u.def.section->output_offset);
   7095  1.1     skrll 	    }
   7096  1.1     skrll 	}
   7097  1.1     skrll       else
   7098  1.3  christos 	{
   7099  1.3  christos 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
   7100  1.1     skrll 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
   7101  1.1     skrll 	  rel.r_addend = 0;
   7102  1.1     skrll 	}
   7103  1.1     skrll 
   7104  1.1     skrll       loc = srelgot->contents;
   7105  1.1     skrll       loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   7106  1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7107  1.1     skrll     }
   7108  1.1     skrll 
   7109  1.1     skrll #ifdef INCLUDE_SHMEDIA
   7110  1.1     skrll   {
   7111  1.3  christos     struct elf_sh_link_hash_entry *eh;
   7112  1.1     skrll 
   7113  1.1     skrll     eh = (struct elf_sh_link_hash_entry *) h;
   7114  1.1     skrll     if (eh->datalabel_got.offset != (bfd_vma) -1)
   7115  1.1     skrll       {
   7116  1.1     skrll 	asection *sgot;
   7117  1.1     skrll 	asection *srelgot;
   7118  1.1     skrll 	Elf_Internal_Rela rel;
   7119  1.3  christos 	bfd_byte *loc;
   7120  1.3  christos 
   7121  1.1     skrll 	/* This symbol has a datalabel entry in the global offset table.
   7122  1.1     skrll 	   Set it up.  */
   7123  1.1     skrll 
   7124  1.1     skrll 	sgot = htab->sgot;
   7125  1.1     skrll 	srelgot = htab->srelgot;
   7126  1.1     skrll 	BFD_ASSERT (sgot != NULL && srelgot != NULL);
   7127  1.1     skrll 
   7128  1.1     skrll 	rel.r_offset = (sgot->output_section->vma
   7129  1.1     skrll 			+ sgot->output_offset
   7130  1.1     skrll 			+ (eh->datalabel_got.offset &~ (bfd_vma) 1));
   7131  1.1     skrll 
   7132  1.1     skrll 	/* If this is a static link, or it is a -Bsymbolic link and the
   7133  1.1     skrll 	   symbol is defined locally or was forced to be local because
   7134  1.3  christos 	   of a version file, we just want to emit a RELATIVE reloc.
   7135  1.3  christos 	   The entry in the global offset table will already have been
   7136  1.3  christos 	   initialized in the relocate_section function.  */
   7137  1.3  christos 	if (info->shared
   7138  1.3  christos 	    && SYMBOL_REFERENCES_LOCAL (info, h))
   7139  1.3  christos 	  {
   7140  1.3  christos 	    if (htab->fdpic_p)
   7141  1.3  christos 	      {
   7142  1.3  christos 		asection *sec = h->root.u.def.section;
   7143  1.3  christos 		int dynindx
   7144  1.3  christos 		  = elf_section_data (sec->output_section)->dynindx;
   7145  1.3  christos 
   7146  1.3  christos 		rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32);
   7147  1.3  christos 		rel.r_addend = (h->root.u.def.value
   7148  1.3  christos 				+ h->root.u.def.section->output_offset);
   7149  1.3  christos 	      }
   7150  1.3  christos 	    else
   7151  1.1     skrll 	      {
   7152  1.1     skrll 		rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
   7153  1.1     skrll 		rel.r_addend = (h->root.u.def.value
   7154  1.1     skrll 				+ h->root.u.def.section->output_section->vma
   7155  1.1     skrll 				+ h->root.u.def.section->output_offset);
   7156  1.1     skrll 	      }
   7157  1.1     skrll 	  }
   7158  1.1     skrll 	else
   7159  1.1     skrll 	  {
   7160  1.3  christos 	    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents
   7161  1.3  christos 			+ eh->datalabel_got.offset);
   7162  1.1     skrll 	    rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
   7163  1.1     skrll 	    rel.r_addend = 0;
   7164  1.1     skrll 	  }
   7165  1.1     skrll 
   7166  1.1     skrll 	loc = srelgot->contents;
   7167  1.1     skrll 	loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   7168  1.1     skrll 	bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7169  1.1     skrll       }
   7170  1.1     skrll   }
   7171  1.1     skrll #endif
   7172  1.1     skrll 
   7173  1.1     skrll   if (h->needs_copy)
   7174  1.1     skrll     {
   7175  1.1     skrll       asection *s;
   7176  1.1     skrll       Elf_Internal_Rela rel;
   7177  1.1     skrll       bfd_byte *loc;
   7178  1.1     skrll 
   7179  1.1     skrll       /* This symbol needs a copy reloc.  Set it up.  */
   7180  1.1     skrll 
   7181  1.1     skrll       BFD_ASSERT (h->dynindx != -1
   7182  1.1     skrll 		  && (h->root.type == bfd_link_hash_defined
   7183  1.1     skrll 		      || h->root.type == bfd_link_hash_defweak));
   7184  1.1     skrll 
   7185  1.1     skrll       s = bfd_get_section_by_name (h->root.u.def.section->owner,
   7186  1.1     skrll 				   ".rela.bss");
   7187  1.1     skrll       BFD_ASSERT (s != NULL);
   7188  1.1     skrll 
   7189  1.1     skrll       rel.r_offset = (h->root.u.def.value
   7190  1.1     skrll 		      + h->root.u.def.section->output_section->vma
   7191  1.1     skrll 		      + h->root.u.def.section->output_offset);
   7192  1.1     skrll       rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
   7193  1.1     skrll       rel.r_addend = 0;
   7194  1.1     skrll       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
   7195  1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7196  1.1     skrll     }
   7197  1.1     skrll 
   7198  1.1     skrll   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
   7199  1.1     skrll      _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
   7200  1.1     skrll      ".got" section.  */
   7201  1.1     skrll   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
   7202  1.1     skrll       || (!htab->vxworks_p && h == htab->root.hgot))
   7203  1.1     skrll     sym->st_shndx = SHN_ABS;
   7204  1.1     skrll 
   7205  1.1     skrll   return TRUE;
   7206  1.1     skrll }
   7207  1.1     skrll 
   7208  1.3  christos /* Finish up the dynamic sections.  */
   7209  1.1     skrll 
   7210  1.1     skrll static bfd_boolean
   7211  1.1     skrll sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   7212  1.3  christos {
   7213  1.3  christos   struct elf_sh_link_hash_table *htab;
   7214  1.3  christos   asection *sgotplt;
   7215  1.3  christos   asection *sdyn;
   7216  1.1     skrll 
   7217  1.1     skrll   htab = sh_elf_hash_table (info);
   7218  1.1     skrll   if (htab == NULL)
   7219  1.1     skrll     return FALSE;
   7220  1.1     skrll 
   7221  1.1     skrll   sgotplt = htab->sgotplt;
   7222  1.1     skrll   sdyn = bfd_get_section_by_name (htab->root.dynobj, ".dynamic");
   7223  1.3  christos 
   7224  1.1     skrll   if (htab->root.dynamic_sections_created)
   7225  1.1     skrll     {
   7226  1.1     skrll       asection *splt;
   7227  1.1     skrll       Elf32_External_Dyn *dyncon, *dynconend;
   7228  1.1     skrll 
   7229  1.1     skrll       BFD_ASSERT (sgotplt != NULL && sdyn != NULL);
   7230  1.1     skrll 
   7231  1.1     skrll       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   7232  1.1     skrll       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   7233  1.1     skrll       for (; dyncon < dynconend; dyncon++)
   7234  1.1     skrll 	{
   7235  1.1     skrll 	  Elf_Internal_Dyn dyn;
   7236  1.1     skrll 	  asection *s;
   7237  1.1     skrll #ifdef INCLUDE_SHMEDIA
   7238  1.1     skrll 	  const char *name;
   7239  1.1     skrll #endif
   7240  1.1     skrll 
   7241  1.1     skrll 	  bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn);
   7242  1.1     skrll 
   7243  1.1     skrll 	  switch (dyn.d_tag)
   7244  1.1     skrll 	    {
   7245  1.1     skrll 	    default:
   7246  1.1     skrll 	      if (htab->vxworks_p
   7247  1.1     skrll 		  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
   7248  1.1     skrll 		bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7249  1.1     skrll 	      break;
   7250  1.1     skrll 
   7251  1.1     skrll #ifdef INCLUDE_SHMEDIA
   7252  1.1     skrll 	    case DT_INIT:
   7253  1.1     skrll 	      name = info->init_function;
   7254  1.1     skrll 	      goto get_sym;
   7255  1.1     skrll 
   7256  1.1     skrll 	    case DT_FINI:
   7257  1.1     skrll 	      name = info->fini_function;
   7258  1.1     skrll 	    get_sym:
   7259  1.1     skrll 	      if (dyn.d_un.d_val != 0)
   7260  1.1     skrll 		{
   7261  1.1     skrll 		  struct elf_link_hash_entry *h;
   7262  1.1     skrll 
   7263  1.1     skrll 		  h = elf_link_hash_lookup (&htab->root, name,
   7264  1.1     skrll 					    FALSE, FALSE, TRUE);
   7265  1.1     skrll 		  if (h != NULL && (h->other & STO_SH5_ISA32))
   7266  1.1     skrll 		    {
   7267  1.1     skrll 		      dyn.d_un.d_val |= 1;
   7268  1.1     skrll 		      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7269  1.3  christos 		    }
   7270  1.3  christos 		}
   7271  1.3  christos 	      break;
   7272  1.3  christos #endif
   7273  1.3  christos 
   7274  1.3  christos 	    case DT_PLTGOT:
   7275  1.1     skrll 	      BFD_ASSERT (htab->root.hgot != NULL);
   7276  1.1     skrll 	      s = htab->root.hgot->root.u.def.section;
   7277  1.1     skrll 	      dyn.d_un.d_ptr = htab->root.hgot->root.u.def.value
   7278  1.1     skrll 		+ s->output_section->vma + s->output_offset;
   7279  1.1     skrll 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7280  1.1     skrll 	      break;
   7281  1.1     skrll 
   7282  1.1     skrll 	    case DT_JMPREL:
   7283  1.1     skrll 	      s = htab->srelplt->output_section;
   7284  1.1     skrll 	      BFD_ASSERT (s != NULL);
   7285  1.1     skrll 	      dyn.d_un.d_ptr = s->vma;
   7286  1.1     skrll 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7287  1.1     skrll 	      break;
   7288  1.1     skrll 
   7289  1.1     skrll 	    case DT_PLTRELSZ:
   7290  1.1     skrll 	      s = htab->srelplt->output_section;
   7291  1.1     skrll 	      BFD_ASSERT (s != NULL);
   7292  1.1     skrll 	      dyn.d_un.d_val = s->size;
   7293  1.1     skrll 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7294  1.1     skrll 	      break;
   7295  1.1     skrll 
   7296  1.1     skrll 	    case DT_RELASZ:
   7297  1.1     skrll 	      /* My reading of the SVR4 ABI indicates that the
   7298  1.1     skrll 		 procedure linkage table relocs (DT_JMPREL) should be
   7299  1.1     skrll 		 included in the overall relocs (DT_RELA).  This is
   7300  1.1     skrll 		 what Solaris does.  However, UnixWare can not handle
   7301  1.1     skrll 		 that case.  Therefore, we override the DT_RELASZ entry
   7302  1.1     skrll 		 here to make it not include the JMPREL relocs.  Since
   7303  1.1     skrll 		 the linker script arranges for .rela.plt to follow all
   7304  1.1     skrll 		 other relocation sections, we don't have to worry
   7305  1.1     skrll 		 about changing the DT_RELA entry.  */
   7306  1.1     skrll 	      if (htab->srelplt != NULL)
   7307  1.1     skrll 		{
   7308  1.1     skrll 		  s = htab->srelplt->output_section;
   7309  1.1     skrll 		  dyn.d_un.d_val -= s->size;
   7310  1.1     skrll 		}
   7311  1.1     skrll 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   7312  1.1     skrll 	      break;
   7313  1.1     skrll 	    }
   7314  1.1     skrll 	}
   7315  1.1     skrll 
   7316  1.1     skrll       /* Fill in the first entry in the procedure linkage table.  */
   7317  1.1     skrll       splt = htab->splt;
   7318  1.1     skrll       if (splt && splt->size > 0 && htab->plt_info->plt0_entry)
   7319  1.1     skrll 	{
   7320  1.1     skrll 	  unsigned int i;
   7321  1.1     skrll 
   7322  1.3  christos 	  memcpy (splt->contents,
   7323  1.3  christos 		  htab->plt_info->plt0_entry,
   7324  1.1     skrll 		  htab->plt_info->plt0_entry_size);
   7325  1.1     skrll 	  for (i = 0; i < ARRAY_SIZE (htab->plt_info->plt0_got_fields); i++)
   7326  1.1     skrll 	    if (htab->plt_info->plt0_got_fields[i] != MINUS_ONE)
   7327  1.1     skrll 	      install_plt_field (output_bfd, FALSE,
   7328  1.1     skrll 				 (sgotplt->output_section->vma
   7329  1.1     skrll 				  + sgotplt->output_offset
   7330  1.1     skrll 				  + (i * 4)),
   7331  1.1     skrll 				 (splt->contents
   7332  1.1     skrll 				  + htab->plt_info->plt0_got_fields[i]));
   7333  1.1     skrll 
   7334  1.1     skrll 	  if (htab->vxworks_p)
   7335  1.1     skrll 	    {
   7336  1.1     skrll 	      /* Finalize the .rela.plt.unloaded contents.  */
   7337  1.1     skrll 	      Elf_Internal_Rela rel;
   7338  1.1     skrll 	      bfd_byte *loc;
   7339  1.1     skrll 
   7340  1.1     skrll 	      /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for the
   7341  1.1     skrll 		 first PLT entry's pointer to _GLOBAL_OFFSET_TABLE_ + 8.  */
   7342  1.1     skrll 	      loc = htab->srelplt2->contents;
   7343  1.1     skrll 	      rel.r_offset = (splt->output_section->vma
   7344  1.1     skrll 			      + splt->output_offset
   7345  1.1     skrll 			      + htab->plt_info->plt0_got_fields[2]);
   7346  1.1     skrll 	      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
   7347  1.1     skrll 	      rel.r_addend = 8;
   7348  1.1     skrll 	      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
   7349  1.1     skrll 	      loc += sizeof (Elf32_External_Rela);
   7350  1.1     skrll 
   7351  1.1     skrll 	      /* Fix up the remaining .rela.plt.unloaded relocations.
   7352  1.1     skrll 		 They may have the wrong symbol index for _G_O_T_ or
   7353  1.1     skrll 		 _P_L_T_ depending on the order in which symbols were
   7354  1.1     skrll 		 output.  */
   7355  1.1     skrll 	      while (loc < htab->srelplt2->contents + htab->srelplt2->size)
   7356  1.1     skrll 		{
   7357  1.1     skrll 		  /* The PLT entry's pointer to the .got.plt slot.  */
   7358  1.1     skrll 		  bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   7359  1.1     skrll 		  rel.r_info = ELF32_R_INFO (htab->root.hgot->indx,
   7360  1.1     skrll 					     R_SH_DIR32);
   7361  1.1     skrll 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   7362  1.1     skrll 		  loc += sizeof (Elf32_External_Rela);
   7363  1.1     skrll 
   7364  1.1     skrll 		  /* The .got.plt slot's pointer to .plt.  */
   7365  1.1     skrll 		  bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   7366  1.1     skrll 		  rel.r_info = ELF32_R_INFO (htab->root.hplt->indx,
   7367  1.1     skrll 					     R_SH_DIR32);
   7368  1.1     skrll 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   7369  1.1     skrll 		  loc += sizeof (Elf32_External_Rela);
   7370  1.1     skrll 		}
   7371  1.1     skrll 	    }
   7372  1.1     skrll 
   7373  1.1     skrll 	  /* UnixWare sets the entsize of .plt to 4, although that doesn't
   7374  1.3  christos 	     really seem like the right value.  */
   7375  1.1     skrll 	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
   7376  1.1     skrll 	}
   7377  1.3  christos     }
   7378  1.1     skrll 
   7379  1.1     skrll   /* Fill in the first three entries in the global offset table.  */
   7380  1.1     skrll   if (sgotplt && sgotplt->size > 0 && !htab->fdpic_p)
   7381  1.3  christos     {
   7382  1.3  christos       if (sdyn == NULL)
   7383  1.3  christos 	bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
   7384  1.3  christos       else
   7385  1.1     skrll 	bfd_put_32 (output_bfd,
   7386  1.3  christos 		    sdyn->output_section->vma + sdyn->output_offset,
   7387  1.3  christos 		    sgotplt->contents);
   7388  1.3  christos       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
   7389  1.3  christos       bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
   7390  1.3  christos     }
   7391  1.3  christos 
   7392  1.3  christos   if (sgotplt && sgotplt->size > 0)
   7393  1.3  christos     elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
   7394  1.3  christos 
   7395  1.3  christos   /* At the very end of the .rofixup section is a pointer to the GOT.  */
   7396  1.3  christos   if (htab->fdpic_p && htab->srofixup != NULL)
   7397  1.3  christos     {
   7398  1.3  christos       struct elf_link_hash_entry *hgot = htab->root.hgot;
   7399  1.3  christos       bfd_vma got_value = hgot->root.u.def.value
   7400  1.3  christos 	+ hgot->root.u.def.section->output_section->vma
   7401  1.1     skrll 	+ hgot->root.u.def.section->output_offset;
   7402  1.1     skrll 
   7403  1.3  christos       sh_elf_add_rofixup (output_bfd, htab->srofixup, got_value);
   7404  1.3  christos 
   7405  1.3  christos       /* Make sure we allocated and generated the same number of fixups.  */
   7406  1.3  christos       BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size);
   7407  1.3  christos     }
   7408  1.3  christos 
   7409  1.3  christos   if (htab->srelfuncdesc)
   7410  1.3  christos     BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela)
   7411  1.1     skrll 		== htab->srelfuncdesc->size);
   7412  1.1     skrll 
   7413  1.1     skrll   if (htab->srelgot)
   7414  1.1     skrll     BFD_ASSERT (htab->srelgot->reloc_count * sizeof (Elf32_External_Rela)
   7415  1.1     skrll 		== htab->srelgot->size);
   7416  1.1     skrll 
   7417  1.1     skrll   return TRUE;
   7418  1.1     skrll }
   7419  1.1     skrll 
   7420  1.1     skrll static enum elf_reloc_type_class
   7421  1.1     skrll sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
   7422  1.1     skrll {
   7423  1.1     skrll   switch ((int) ELF32_R_TYPE (rela->r_info))
   7424  1.1     skrll     {
   7425  1.1     skrll     case R_SH_RELATIVE:
   7426  1.1     skrll       return reloc_class_relative;
   7427  1.1     skrll     case R_SH_JMP_SLOT:
   7428  1.1     skrll       return reloc_class_plt;
   7429  1.1     skrll     case R_SH_COPY:
   7430  1.1     skrll       return reloc_class_copy;
   7431  1.1     skrll     default:
   7432  1.1     skrll       return reloc_class_normal;
   7433  1.1     skrll     }
   7434  1.1     skrll }
   7435  1.1     skrll 
   7436  1.1     skrll #if !defined SH_TARGET_ALREADY_DEFINED
   7437  1.1     skrll /* Support for Linux core dump NOTE sections.  */
   7438  1.1     skrll 
   7439  1.1     skrll static bfd_boolean
   7440  1.1     skrll elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   7441  1.1     skrll {
   7442  1.1     skrll   int offset;
   7443  1.1     skrll   unsigned int size;
   7444  1.1     skrll 
   7445  1.1     skrll   switch (note->descsz)
   7446  1.1     skrll     {
   7447  1.1     skrll       default:
   7448  1.1     skrll 	return FALSE;
   7449  1.3  christos 
   7450  1.1     skrll       case 168:		/* Linux/SH */
   7451  1.1     skrll 	/* pr_cursig */
   7452  1.1     skrll 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
   7453  1.1     skrll 
   7454  1.1     skrll 	/* pr_pid */
   7455  1.1     skrll 	elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
   7456  1.1     skrll 
   7457  1.1     skrll 	/* pr_reg */
   7458  1.1     skrll 	offset = 72;
   7459  1.1     skrll 	size = 92;
   7460  1.1     skrll 
   7461  1.1     skrll 	break;
   7462  1.1     skrll     }
   7463  1.1     skrll 
   7464  1.1     skrll   /* Make a ".reg/999" section.  */
   7465  1.1     skrll   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   7466  1.1     skrll 					  size, note->descpos + offset);
   7467  1.1     skrll }
   7468  1.1     skrll 
   7469  1.1     skrll static bfd_boolean
   7470  1.1     skrll elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   7471  1.1     skrll {
   7472  1.1     skrll   switch (note->descsz)
   7473  1.1     skrll     {
   7474  1.1     skrll       default:
   7475  1.1     skrll 	return FALSE;
   7476  1.1     skrll 
   7477  1.1     skrll       case 124:		/* Linux/SH elf_prpsinfo */
   7478  1.1     skrll 	elf_tdata (abfd)->core_program
   7479  1.1     skrll 	 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
   7480  1.1     skrll 	elf_tdata (abfd)->core_command
   7481  1.1     skrll 	 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
   7482  1.1     skrll     }
   7483  1.1     skrll 
   7484  1.1     skrll   /* Note that for some reason, a spurious space is tacked
   7485  1.1     skrll      onto the end of the args in some (at least one anyway)
   7486  1.1     skrll      implementations, so strip it off if it exists.  */
   7487  1.1     skrll 
   7488  1.1     skrll   {
   7489  1.1     skrll     char *command = elf_tdata (abfd)->core_command;
   7490  1.1     skrll     int n = strlen (command);
   7491  1.1     skrll 
   7492  1.1     skrll     if (0 < n && command[n - 1] == ' ')
   7493  1.1     skrll       command[n - 1] = '\0';
   7494  1.1     skrll   }
   7495  1.1     skrll 
   7496  1.1     skrll   return TRUE;
   7497  1.1     skrll }
   7498  1.1     skrll #endif /* not SH_TARGET_ALREADY_DEFINED */
   7499  1.1     skrll 
   7500  1.1     skrll 
   7501  1.1     skrll /* Return address for Ith PLT stub in section PLT, for relocation REL
   7502  1.1     skrll    or (bfd_vma) -1 if it should not be included.  */
   7503  1.1     skrll 
   7504  1.1     skrll static bfd_vma
   7505  1.1     skrll sh_elf_plt_sym_val (bfd_vma i, const asection *plt,
   7506  1.1     skrll 		    const arelent *rel ATTRIBUTE_UNUSED)
   7507  1.1     skrll {
   7508  1.3  christos   const struct elf_sh_plt_info *plt_info;
   7509  1.3  christos 
   7510  1.3  christos   plt_info = get_plt_info (plt->owner, (plt->owner->flags & DYNAMIC) != 0);
   7511  1.3  christos   return plt->vma + get_plt_offset (plt_info, i);
   7512  1.3  christos }
   7513  1.3  christos 
   7514  1.3  christos /* Decide whether to attempt to turn absptr or lsda encodings in
   7515  1.3  christos    shared libraries into pcrel within the given input section.  */
   7516  1.3  christos 
   7517  1.3  christos static bfd_boolean
   7518  1.3  christos sh_elf_use_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED,
   7519  1.3  christos 			      struct bfd_link_info *info,
   7520  1.3  christos 			      asection *eh_frame_section ATTRIBUTE_UNUSED)
   7521  1.3  christos {
   7522  1.3  christos   struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
   7523  1.3  christos 
   7524  1.3  christos   /* We can't use PC-relative encodings in FDPIC binaries, in general.  */
   7525  1.3  christos   if (htab->fdpic_p)
   7526  1.3  christos     return FALSE;
   7527  1.3  christos 
   7528  1.3  christos   return TRUE;
   7529  1.3  christos }
   7530  1.3  christos 
   7531  1.3  christos /* Adjust the contents of an eh_frame_hdr section before they're output.  */
   7532  1.3  christos 
   7533  1.3  christos static bfd_byte
   7534  1.3  christos sh_elf_encode_eh_address (bfd *abfd,
   7535  1.3  christos 			  struct bfd_link_info *info,
   7536  1.3  christos 			  asection *osec, bfd_vma offset,
   7537  1.3  christos 			  asection *loc_sec, bfd_vma loc_offset,
   7538  1.3  christos 			  bfd_vma *encoded)
   7539  1.3  christos {
   7540  1.3  christos   struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info);
   7541  1.3  christos   struct elf_link_hash_entry *h;
   7542  1.3  christos 
   7543  1.3  christos   if (!htab->fdpic_p)
   7544  1.3  christos     return _bfd_elf_encode_eh_address (abfd, info, osec, offset, loc_sec,
   7545  1.3  christos 				       loc_offset, encoded);
   7546  1.3  christos 
   7547  1.3  christos   h = htab->root.hgot;
   7548  1.3  christos   BFD_ASSERT (h && h->root.type == bfd_link_hash_defined);
   7549  1.3  christos 
   7550  1.3  christos   if (! h || (sh_elf_osec_to_segment (abfd, osec)
   7551  1.3  christos 	      == sh_elf_osec_to_segment (abfd, loc_sec->output_section)))
   7552  1.3  christos     return _bfd_elf_encode_eh_address (abfd, info, osec, offset,
   7553  1.3  christos 				       loc_sec, loc_offset, encoded);
   7554  1.3  christos 
   7555  1.3  christos   BFD_ASSERT (sh_elf_osec_to_segment (abfd, osec)
   7556  1.3  christos 	      == (sh_elf_osec_to_segment
   7557  1.3  christos 		  (abfd, h->root.u.def.section->output_section)));
   7558  1.3  christos 
   7559  1.3  christos   *encoded = osec->vma + offset
   7560  1.3  christos     - (h->root.u.def.value
   7561  1.1     skrll        + h->root.u.def.section->output_section->vma
   7562  1.1     skrll        + h->root.u.def.section->output_offset);
   7563  1.1     skrll 
   7564  1.1     skrll   return DW_EH_PE_datarel | DW_EH_PE_sdata4;
   7565  1.1     skrll }
   7566  1.1     skrll 
   7567  1.1     skrll #if !defined SH_TARGET_ALREADY_DEFINED
   7568  1.1     skrll #define TARGET_BIG_SYM		bfd_elf32_sh_vec
   7569  1.3  christos #define TARGET_BIG_NAME		"elf32-sh"
   7570  1.1     skrll #define TARGET_LITTLE_SYM	bfd_elf32_shl_vec
   7571  1.1     skrll #define TARGET_LITTLE_NAME	"elf32-shl"
   7572  1.1     skrll #endif
   7573  1.1     skrll 
   7574  1.1     skrll #define ELF_ARCH		bfd_arch_sh
   7575  1.1     skrll #define ELF_TARGET_ID		SH_ELF_DATA
   7576  1.1     skrll #define ELF_MACHINE_CODE	EM_SH
   7577  1.1     skrll #ifdef __QNXTARGET__
   7578  1.1     skrll #define ELF_MAXPAGESIZE		0x1000
   7579  1.1     skrll #else
   7580  1.1     skrll #define ELF_MAXPAGESIZE		0x80
   7581  1.1     skrll #endif
   7582  1.1     skrll 
   7583  1.1     skrll #define elf_symbol_leading_char '_'
   7584  1.1     skrll 
   7585  1.1     skrll #define bfd_elf32_bfd_reloc_type_lookup	sh_elf_reloc_type_lookup
   7586  1.1     skrll #define bfd_elf32_bfd_reloc_name_lookup \
   7587  1.1     skrll 					sh_elf_reloc_name_lookup
   7588  1.1     skrll #define elf_info_to_howto		sh_elf_info_to_howto
   7589  1.1     skrll #define bfd_elf32_bfd_relax_section	sh_elf_relax_section
   7590  1.1     skrll #define elf_backend_relocate_section	sh_elf_relocate_section
   7591  1.1     skrll #define bfd_elf32_bfd_get_relocated_section_contents \
   7592  1.1     skrll 					sh_elf_get_relocated_section_contents
   7593  1.1     skrll #define bfd_elf32_mkobject		sh_elf_mkobject
   7594  1.1     skrll #define elf_backend_object_p		sh_elf_object_p
   7595  1.1     skrll #define bfd_elf32_bfd_set_private_bfd_flags \
   7596  1.1     skrll 					sh_elf_set_private_flags
   7597  1.1     skrll #define bfd_elf32_bfd_copy_private_bfd_data \
   7598  1.1     skrll 					sh_elf_copy_private_data
   7599  1.1     skrll #define bfd_elf32_bfd_merge_private_bfd_data \
   7600  1.1     skrll 					sh_elf_merge_private_data
   7601  1.1     skrll 
   7602  1.1     skrll #define elf_backend_gc_mark_hook	sh_elf_gc_mark_hook
   7603  1.1     skrll #define elf_backend_gc_sweep_hook	sh_elf_gc_sweep_hook
   7604  1.1     skrll #define elf_backend_check_relocs	sh_elf_check_relocs
   7605  1.1     skrll #define elf_backend_copy_indirect_symbol \
   7606  1.1     skrll 					sh_elf_copy_indirect_symbol
   7607  1.1     skrll #define elf_backend_create_dynamic_sections \
   7608  1.1     skrll 					sh_elf_create_dynamic_sections
   7609  1.1     skrll #define bfd_elf32_bfd_link_hash_table_create \
   7610  1.1     skrll 					sh_elf_link_hash_table_create
   7611  1.3  christos #define elf_backend_adjust_dynamic_symbol \
   7612  1.1     skrll 					sh_elf_adjust_dynamic_symbol
   7613  1.1     skrll #define elf_backend_always_size_sections \
   7614  1.1     skrll 					sh_elf_always_size_sections
   7615  1.1     skrll #define elf_backend_size_dynamic_sections \
   7616  1.1     skrll 					sh_elf_size_dynamic_sections
   7617  1.1     skrll #define elf_backend_omit_section_dynsym	sh_elf_omit_section_dynsym
   7618  1.3  christos #define elf_backend_finish_dynamic_symbol \
   7619  1.3  christos 					sh_elf_finish_dynamic_symbol
   7620  1.3  christos #define elf_backend_finish_dynamic_sections \
   7621  1.3  christos 					sh_elf_finish_dynamic_sections
   7622  1.3  christos #define elf_backend_reloc_type_class	sh_elf_reloc_type_class
   7623  1.3  christos #define elf_backend_plt_sym_val		sh_elf_plt_sym_val
   7624  1.1     skrll #define elf_backend_can_make_relative_eh_frame \
   7625  1.1     skrll 					sh_elf_use_relative_eh_frame
   7626  1.1     skrll #define elf_backend_can_make_lsda_relative_eh_frame \
   7627  1.1     skrll 					sh_elf_use_relative_eh_frame
   7628  1.1     skrll #define elf_backend_encode_eh_address \
   7629  1.1     skrll 					sh_elf_encode_eh_address
   7630  1.1     skrll 
   7631  1.1     skrll #define elf_backend_can_gc_sections	1
   7632  1.1     skrll #define elf_backend_can_refcount	1
   7633  1.1     skrll #define elf_backend_want_got_plt	1
   7634  1.1     skrll #define elf_backend_plt_readonly	1
   7635  1.1     skrll #define elf_backend_want_plt_sym	0
   7636  1.1     skrll #define elf_backend_got_header_size	12
   7637  1.1     skrll 
   7638  1.1     skrll #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
   7639  1.1     skrll 
   7640  1.1     skrll #include "elf32-target.h"
   7641  1.1     skrll 
   7642  1.1     skrll /* NetBSD support.  */
   7643  1.1     skrll #undef	TARGET_BIG_SYM
   7644  1.1     skrll #define	TARGET_BIG_SYM			bfd_elf32_shnbsd_vec
   7645  1.1     skrll #undef	TARGET_BIG_NAME
   7646  1.1     skrll #define	TARGET_BIG_NAME			"elf32-sh-nbsd"
   7647  1.1     skrll #undef	TARGET_LITTLE_SYM
   7648  1.1     skrll #define	TARGET_LITTLE_SYM		bfd_elf32_shlnbsd_vec
   7649  1.1     skrll #undef	TARGET_LITTLE_NAME
   7650  1.1     skrll #define	TARGET_LITTLE_NAME		"elf32-shl-nbsd"
   7651  1.1     skrll #undef	ELF_MAXPAGESIZE
   7652  1.1     skrll #define	ELF_MAXPAGESIZE			0x10000
   7653  1.1     skrll #undef	ELF_COMMONPAGESIZE
   7654  1.1     skrll #undef	elf_symbol_leading_char
   7655  1.1     skrll #define	elf_symbol_leading_char		0
   7656  1.1     skrll #undef	elf32_bed
   7657  1.1     skrll #define	elf32_bed			elf32_sh_nbsd_bed
   7658  1.1     skrll 
   7659  1.1     skrll #include "elf32-target.h"
   7660  1.1     skrll 
   7661  1.1     skrll 
   7662  1.1     skrll /* Linux support.  */
   7663  1.1     skrll #undef	TARGET_BIG_SYM
   7664  1.1     skrll #define	TARGET_BIG_SYM			bfd_elf32_shblin_vec
   7665  1.1     skrll #undef	TARGET_BIG_NAME
   7666  1.1     skrll #define	TARGET_BIG_NAME			"elf32-shbig-linux"
   7667  1.1     skrll #undef	TARGET_LITTLE_SYM
   7668  1.1     skrll #define	TARGET_LITTLE_SYM		bfd_elf32_shlin_vec
   7669  1.1     skrll #undef	TARGET_LITTLE_NAME
   7670  1.1     skrll #define	TARGET_LITTLE_NAME		"elf32-sh-linux"
   7671  1.1     skrll #undef	ELF_COMMONPAGESIZE
   7672  1.1     skrll #define	ELF_COMMONPAGESIZE		0x1000
   7673  1.1     skrll 
   7674  1.1     skrll #undef	elf_backend_grok_prstatus
   7675  1.1     skrll #define	elf_backend_grok_prstatus	elf32_shlin_grok_prstatus
   7676  1.1     skrll #undef	elf_backend_grok_psinfo
   7677  1.3  christos #define	elf_backend_grok_psinfo		elf32_shlin_grok_psinfo
   7678  1.3  christos #undef	elf32_bed
   7679  1.3  christos #define	elf32_bed			elf32_sh_lin_bed
   7680  1.3  christos 
   7681  1.3  christos #include "elf32-target.h"
   7682  1.3  christos 
   7683  1.3  christos 
   7684  1.3  christos /* FDPIC support.  */
   7685  1.3  christos #undef	TARGET_BIG_SYM
   7686  1.3  christos #define	TARGET_BIG_SYM			bfd_elf32_shbfd_vec
   7687  1.3  christos #undef	TARGET_BIG_NAME
   7688  1.3  christos #define	TARGET_BIG_NAME			"elf32-shbig-fdpic"
   7689  1.3  christos #undef	TARGET_LITTLE_SYM
   7690  1.3  christos #define	TARGET_LITTLE_SYM		bfd_elf32_shfd_vec
   7691  1.3  christos #undef	TARGET_LITTLE_NAME
   7692  1.3  christos #define	TARGET_LITTLE_NAME		"elf32-sh-fdpic"
   7693  1.3  christos #undef elf_backend_modify_program_headers
   7694  1.3  christos #define elf_backend_modify_program_headers \
   7695  1.3  christos 					sh_elf_modify_program_headers
   7696  1.3  christos 
   7697  1.3  christos #undef	elf32_bed
   7698  1.3  christos #define	elf32_bed			elf32_sh_fd_bed
   7699  1.1     skrll 
   7700  1.1     skrll #include "elf32-target.h"
   7701  1.1     skrll 
   7702  1.1     skrll #undef elf_backend_modify_program_headers
   7703  1.1     skrll 
   7704  1.1     skrll /* VxWorks support.  */
   7705  1.1     skrll #undef	TARGET_BIG_SYM
   7706  1.1     skrll #define	TARGET_BIG_SYM			bfd_elf32_shvxworks_vec
   7707  1.1     skrll #undef	TARGET_BIG_NAME
   7708  1.1     skrll #define	TARGET_BIG_NAME			"elf32-sh-vxworks"
   7709  1.1     skrll #undef	TARGET_LITTLE_SYM
   7710  1.1     skrll #define	TARGET_LITTLE_SYM		bfd_elf32_shlvxworks_vec
   7711  1.1     skrll #undef	TARGET_LITTLE_NAME
   7712  1.1     skrll #define	TARGET_LITTLE_NAME		"elf32-shl-vxworks"
   7713  1.1     skrll #undef	elf32_bed
   7714  1.1     skrll #define	elf32_bed			elf32_sh_vxworks_bed
   7715  1.1     skrll 
   7716  1.1     skrll #undef	elf_backend_want_plt_sym
   7717  1.1     skrll #define	elf_backend_want_plt_sym	1
   7718  1.1     skrll #undef	elf_symbol_leading_char
   7719  1.1     skrll #define	elf_symbol_leading_char		'_'
   7720  1.1     skrll #define	elf_backend_want_got_underscore 1
   7721  1.1     skrll #undef	elf_backend_grok_prstatus
   7722  1.1     skrll #undef	elf_backend_grok_psinfo
   7723  1.1     skrll #undef	elf_backend_add_symbol_hook
   7724  1.1     skrll #define	elf_backend_add_symbol_hook	elf_vxworks_add_symbol_hook
   7725  1.1     skrll #undef	elf_backend_link_output_symbol_hook
   7726  1.1     skrll #define	elf_backend_link_output_symbol_hook \
   7727  1.1     skrll 					elf_vxworks_link_output_symbol_hook
   7728  1.1     skrll #undef	elf_backend_emit_relocs
   7729  1.1     skrll #define	elf_backend_emit_relocs		elf_vxworks_emit_relocs
   7730  1.1     skrll #undef	elf_backend_final_write_processing
   7731  1.1     skrll #define	elf_backend_final_write_processing \
   7732  1.1     skrll 					elf_vxworks_final_write_processing
   7733  1.1     skrll #undef	ELF_MAXPAGESIZE
   7734                #define	ELF_MAXPAGESIZE			0x1000
   7735                #undef	ELF_COMMONPAGESIZE
   7736                
   7737                #include "elf32-target.h"
   7738                
   7739                #endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */
   7740