Home | History | Annotate | Line # | Download | only in bfd
elf32-m32r.c revision 1.1.1.2
      1      1.1     skrll /* M32R-specific support for 32-bit ELF.
      2      1.1     skrll    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
      3  1.1.1.2  christos    2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
      4      1.1     skrll 
      5      1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      6      1.1     skrll 
      7      1.1     skrll    This program is free software; you can redistribute it and/or modify
      8      1.1     skrll    it under the terms of the GNU General Public License as published by
      9      1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     10      1.1     skrll    (at your option) any later version.
     11      1.1     skrll 
     12      1.1     skrll    This program is distributed in the hope that it will be useful,
     13      1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1     skrll    GNU General Public License for more details.
     16      1.1     skrll 
     17      1.1     skrll    You should have received a copy of the GNU General Public License
     18      1.1     skrll    along with this program; if not, write to the Free Software
     19      1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20      1.1     skrll    MA 02110-1301, USA.  */
     21      1.1     skrll 
     22      1.1     skrll #include "sysdep.h"
     23      1.1     skrll #include "bfd.h"
     24      1.1     skrll #include "libbfd.h"
     25      1.1     skrll #include "elf-bfd.h"
     26      1.1     skrll #include "elf/m32r.h"
     27      1.1     skrll 
     28      1.1     skrll #define NOP_INSN		0x7000
     29      1.1     skrll #define MAKE_PARALLEL(insn)	((insn) | 0x8000)
     30      1.1     skrll 
     31      1.1     skrll /* Use REL instead of RELA to save space.
     32      1.1     skrll    This only saves space in libraries and object files, but perhaps
     33      1.1     skrll    relocs will be put in ROM?  All in all though, REL relocs are a pain
     34      1.1     skrll    to work with.  */
     35      1.1     skrll /* #define USE_REL	1
     36      1.1     skrll 
     37      1.1     skrll #ifndef USE_REL
     38      1.1     skrll #define USE_REL	0
     39      1.1     skrll #endif */
     40      1.1     skrll /* Use RELA. But use REL to link old objects for backwords compatibility.  */
     41      1.1     skrll 
     42      1.1     skrll /* Functions for the M32R ELF linker.  */
     43      1.1     skrll 
     44      1.1     skrll /* The name of the dynamic interpreter.  This is put in the .interp
     45      1.1     skrll    section.  */
     46      1.1     skrll 
     47      1.1     skrll #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
     48      1.1     skrll 
     49      1.1     skrll /* The nop opcode we use.  */
     50      1.1     skrll 
     51      1.1     skrll #define M32R_NOP 0x7000f000
     52      1.1     skrll 
     53      1.1     skrll #define PLT_EMPTY   0x10101010  /* RIE  -> RIE */
     54      1.1     skrll 
     55      1.1     skrll /* The size in bytes of an entry in the procedure linkage table.  */
     56      1.1     skrll 
     57      1.1     skrll #define PLT_ENTRY_SIZE 20
     58      1.1     skrll #define PLT_HEADER_SIZE 20
     59      1.1     skrll 
     60      1.1     skrll /* The first one entries in a procedure linkage table are reserved,
     61      1.1     skrll    and the initial contents are unimportant (we zero them out).
     62      1.1     skrll    Subsequent entries look like this. */
     63      1.1     skrll 
     64      1.1     skrll #define PLT0_ENTRY_WORD0  0xd6c00000    /* seth r6, #high(.got+4)          */
     65      1.1     skrll #define PLT0_ENTRY_WORD1  0x86e60000    /* or3  r6, r6, #low(.got)+4)      */
     66      1.1     skrll #define PLT0_ENTRY_WORD2  0x24e626c6    /* ld   r4, @r6+    -> ld r6, @r6  */
     67      1.1     skrll #define PLT0_ENTRY_WORD3  0x1fc6f000    /* jmp  r6          || pnop        */
     68      1.1     skrll #define PLT0_ENTRY_WORD4  PLT_EMPTY     /* RIE             -> RIE          */
     69      1.1     skrll 
     70      1.1     skrll #define PLT0_PIC_ENTRY_WORD0  0xa4cc0004 /* ld   r4, @(4,r12)              */
     71      1.1     skrll #define PLT0_PIC_ENTRY_WORD1  0xa6cc0008 /* ld   r6, @(8,r12)              */
     72      1.1     skrll #define PLT0_PIC_ENTRY_WORD2  0x1fc6f000 /* jmp  r6         || nop         */
     73      1.1     skrll #define PLT0_PIC_ENTRY_WORD3  PLT_EMPTY  /* RIE             -> RIE         */
     74      1.1     skrll #define PLT0_PIC_ENTRY_WORD4  PLT_EMPTY  /* RIE             -> RIE         */
     75      1.1     skrll 
     76      1.1     skrll #define PLT_ENTRY_WORD0  0xe6000000 /* ld24 r6, .name_in_GOT                */
     77      1.1     skrll #define PLT_ENTRY_WORD1  0x06acf000 /* add  r6, r12          || nop         */
     78      1.1     skrll #define PLT_ENTRY_WORD0b 0xd6c00000 /* seth r6, #high(.name_in_GOT)         */
     79      1.1     skrll #define PLT_ENTRY_WORD1b 0x86e60000 /* or3  r6, r6, #low(.name_in_GOT)      */
     80      1.1     skrll #define PLT_ENTRY_WORD2  0x26c61fc6 /* ld  r6, @r6           -> jmp r6      */
     81      1.1     skrll #define PLT_ENTRY_WORD3  0xe5000000 /* ld24 r5, $offset                     */
     82      1.1     skrll #define PLT_ENTRY_WORD4  0xff000000 /* bra  .plt0.                          */
     83      1.1     skrll 
     84      1.1     skrll 
     85      1.1     skrll /* Utility to actually perform an R_M32R_10_PCREL reloc.  */
     86      1.1     skrll 
     87      1.1     skrll static bfd_reloc_status_type
     88      1.1     skrll m32r_elf_do_10_pcrel_reloc (bfd *abfd,
     89      1.1     skrll 			    reloc_howto_type *howto,
     90      1.1     skrll 			    asection *input_section,
     91      1.1     skrll 			    bfd_byte *data,
     92      1.1     skrll 			    bfd_vma offset,
     93      1.1     skrll 			    asection *symbol_section ATTRIBUTE_UNUSED,
     94      1.1     skrll 			    bfd_vma symbol_value,
     95      1.1     skrll 			    bfd_vma addend)
     96      1.1     skrll {
     97      1.1     skrll   bfd_signed_vma relocation;
     98      1.1     skrll   unsigned long x;
     99      1.1     skrll   bfd_reloc_status_type status;
    100      1.1     skrll 
    101      1.1     skrll   /* Sanity check the address (offset in section).  */
    102      1.1     skrll   if (offset > bfd_get_section_limit (abfd, input_section))
    103      1.1     skrll     return bfd_reloc_outofrange;
    104      1.1     skrll 
    105      1.1     skrll   relocation = symbol_value + addend;
    106      1.1     skrll   /* Make it pc relative.  */
    107      1.1     skrll   relocation -=	(input_section->output_section->vma
    108      1.1     skrll 		 + input_section->output_offset);
    109      1.1     skrll   /* These jumps mask off the lower two bits of the current address
    110      1.1     skrll      before doing pcrel calculations.  */
    111      1.1     skrll   relocation -= (offset & -(bfd_vma) 4);
    112      1.1     skrll 
    113      1.1     skrll   if (relocation < -0x200 || relocation > 0x1ff)
    114      1.1     skrll     status = bfd_reloc_overflow;
    115      1.1     skrll   else
    116      1.1     skrll     status = bfd_reloc_ok;
    117      1.1     skrll 
    118      1.1     skrll   x = bfd_get_16 (abfd, data + offset);
    119      1.1     skrll   relocation >>= howto->rightshift;
    120      1.1     skrll   relocation <<= howto->bitpos;
    121      1.1     skrll   x = (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask);
    122      1.1     skrll   bfd_put_16 (abfd, (bfd_vma) x, data + offset);
    123      1.1     skrll 
    124      1.1     skrll   return status;
    125      1.1     skrll }
    126      1.1     skrll 
    127      1.1     skrll /* Handle the R_M32R_10_PCREL reloc.  */
    128      1.1     skrll 
    129      1.1     skrll static bfd_reloc_status_type
    130      1.1     skrll m32r_elf_10_pcrel_reloc (bfd * abfd,
    131      1.1     skrll 			 arelent * reloc_entry,
    132      1.1     skrll 			 asymbol * symbol,
    133      1.1     skrll 			 void * data,
    134      1.1     skrll 			 asection * input_section,
    135      1.1     skrll 			 bfd * output_bfd,
    136      1.1     skrll 			 char ** error_message ATTRIBUTE_UNUSED)
    137      1.1     skrll {
    138      1.1     skrll   /* This part is from bfd_elf_generic_reloc.  */
    139      1.1     skrll   if (output_bfd != NULL
    140      1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    141      1.1     skrll       && (! reloc_entry->howto->partial_inplace
    142      1.1     skrll 	  || reloc_entry->addend == 0))
    143      1.1     skrll     {
    144      1.1     skrll       reloc_entry->address += input_section->output_offset;
    145      1.1     skrll       return bfd_reloc_ok;
    146      1.1     skrll     }
    147      1.1     skrll 
    148      1.1     skrll   if (output_bfd != NULL)
    149      1.1     skrll     /* FIXME: See bfd_perform_relocation.  Is this right?  */
    150      1.1     skrll     return bfd_reloc_continue;
    151      1.1     skrll 
    152      1.1     skrll   return m32r_elf_do_10_pcrel_reloc (abfd, reloc_entry->howto,
    153      1.1     skrll 				     input_section,
    154      1.1     skrll 				     data, reloc_entry->address,
    155      1.1     skrll 				     symbol->section,
    156      1.1     skrll 				     (symbol->value
    157      1.1     skrll 				      + symbol->section->output_section->vma
    158      1.1     skrll 				      + symbol->section->output_offset),
    159      1.1     skrll 				     reloc_entry->addend);
    160      1.1     skrll }
    161      1.1     skrll 
    162      1.1     skrll /* Do generic partial_inplace relocation.
    163      1.1     skrll    This is a local replacement for bfd_elf_generic_reloc.  */
    164      1.1     skrll 
    165      1.1     skrll static bfd_reloc_status_type
    166      1.1     skrll m32r_elf_generic_reloc (bfd *input_bfd,
    167      1.1     skrll 			arelent *reloc_entry,
    168      1.1     skrll 			asymbol *symbol,
    169      1.1     skrll 			void * data,
    170      1.1     skrll 			asection *input_section,
    171      1.1     skrll 			bfd *output_bfd,
    172      1.1     skrll 			char **error_message ATTRIBUTE_UNUSED)
    173      1.1     skrll {
    174      1.1     skrll   bfd_reloc_status_type ret;
    175      1.1     skrll   bfd_vma relocation;
    176      1.1     skrll   bfd_byte *inplace_address;
    177      1.1     skrll 
    178      1.1     skrll   /* This part is from bfd_elf_generic_reloc.
    179      1.1     skrll      If we're relocating, and this an external symbol, we don't want
    180      1.1     skrll      to change anything.  */
    181      1.1     skrll   if (output_bfd != NULL
    182      1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    183      1.1     skrll       && reloc_entry->addend == 0)
    184      1.1     skrll     {
    185      1.1     skrll       reloc_entry->address += input_section->output_offset;
    186      1.1     skrll       return bfd_reloc_ok;
    187      1.1     skrll     }
    188      1.1     skrll 
    189      1.1     skrll   /* Now do the reloc in the usual way.
    190      1.1     skrll      ??? It would be nice to call bfd_elf_generic_reloc here,
    191      1.1     skrll      but we have partial_inplace set.  bfd_elf_generic_reloc will
    192      1.1     skrll      pass the handling back to bfd_install_relocation which will install
    193      1.1     skrll      a section relative addend which is wrong.  */
    194      1.1     skrll 
    195      1.1     skrll   /* Sanity check the address (offset in section).  */
    196      1.1     skrll   if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
    197      1.1     skrll     return bfd_reloc_outofrange;
    198      1.1     skrll 
    199      1.1     skrll   ret = bfd_reloc_ok;
    200      1.1     skrll   if (bfd_is_und_section (symbol->section)
    201      1.1     skrll       && output_bfd == NULL)
    202      1.1     skrll     ret = bfd_reloc_undefined;
    203      1.1     skrll 
    204      1.1     skrll   if (bfd_is_com_section (symbol->section)
    205      1.1     skrll       || output_bfd != NULL)
    206      1.1     skrll     relocation = 0;
    207      1.1     skrll   else
    208      1.1     skrll     relocation = symbol->value;
    209      1.1     skrll 
    210      1.1     skrll   /* Only do this for a final link.  */
    211      1.1     skrll   if (output_bfd == NULL)
    212      1.1     skrll     {
    213      1.1     skrll       relocation += symbol->section->output_section->vma;
    214      1.1     skrll       relocation += symbol->section->output_offset;
    215      1.1     skrll     }
    216      1.1     skrll 
    217      1.1     skrll   relocation += reloc_entry->addend;
    218      1.1     skrll   inplace_address = (bfd_byte *) data + reloc_entry->address;
    219      1.1     skrll 
    220      1.1     skrll #define DOIT(x) 					\
    221      1.1     skrll   x = ( (x & ~reloc_entry->howto->dst_mask) | 		\
    222      1.1     skrll   (((x & reloc_entry->howto->src_mask) +  relocation) &	\
    223      1.1     skrll   reloc_entry->howto->dst_mask))
    224      1.1     skrll 
    225      1.1     skrll   switch (reloc_entry->howto->size)
    226      1.1     skrll     {
    227      1.1     skrll     case 1:
    228      1.1     skrll       {
    229      1.1     skrll 	short x = bfd_get_16 (input_bfd, inplace_address);
    230      1.1     skrll 	DOIT (x);
    231      1.1     skrll       	bfd_put_16 (input_bfd, (bfd_vma) x, inplace_address);
    232      1.1     skrll       }
    233      1.1     skrll       break;
    234      1.1     skrll     case 2:
    235      1.1     skrll       {
    236      1.1     skrll 	unsigned long x = bfd_get_32 (input_bfd, inplace_address);
    237      1.1     skrll 	DOIT (x);
    238      1.1     skrll       	bfd_put_32 (input_bfd, (bfd_vma)x , inplace_address);
    239      1.1     skrll       }
    240      1.1     skrll       break;
    241      1.1     skrll     default:
    242      1.1     skrll       BFD_ASSERT (0);
    243      1.1     skrll     }
    244      1.1     skrll 
    245      1.1     skrll   if (output_bfd != NULL)
    246      1.1     skrll     reloc_entry->address += input_section->output_offset;
    247      1.1     skrll 
    248      1.1     skrll   return ret;
    249      1.1     skrll }
    250      1.1     skrll 
    251      1.1     skrll /* Handle the R_M32R_SDA16 reloc.
    252      1.1     skrll    This reloc is used to compute the address of objects in the small data area
    253      1.1     skrll    and to perform loads and stores from that area.
    254      1.1     skrll    The lower 16 bits are sign extended and added to the register specified
    255      1.1     skrll    in the instruction, which is assumed to point to _SDA_BASE_.  */
    256      1.1     skrll 
    257      1.1     skrll static bfd_reloc_status_type
    258      1.1     skrll m32r_elf_sda16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    259      1.1     skrll 		      arelent *reloc_entry,
    260      1.1     skrll 		      asymbol *symbol,
    261      1.1     skrll 		      void * data ATTRIBUTE_UNUSED,
    262      1.1     skrll 		      asection *input_section,
    263      1.1     skrll 		      bfd *output_bfd,
    264      1.1     skrll 		      char **error_message ATTRIBUTE_UNUSED)
    265      1.1     skrll {
    266      1.1     skrll   /* This part is from bfd_elf_generic_reloc.  */
    267      1.1     skrll   if (output_bfd != NULL
    268      1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    269      1.1     skrll       && (! reloc_entry->howto->partial_inplace
    270      1.1     skrll 	  || reloc_entry->addend == 0))
    271      1.1     skrll     {
    272      1.1     skrll       reloc_entry->address += input_section->output_offset;
    273      1.1     skrll       return bfd_reloc_ok;
    274      1.1     skrll     }
    275      1.1     skrll 
    276      1.1     skrll   if (output_bfd != NULL)
    277      1.1     skrll     /* FIXME: See bfd_perform_relocation.  Is this right?  */
    278      1.1     skrll     return bfd_reloc_continue;
    279      1.1     skrll 
    280      1.1     skrll   /* FIXME: not sure what to do here yet.  But then again, the linker
    281      1.1     skrll      may never call us.  */
    282      1.1     skrll   abort ();
    283      1.1     skrll }
    284      1.1     skrll 
    285      1.1     skrll 
    286      1.1     skrll /* Handle the R_M32R_HI16_[SU]LO relocs.
    288      1.1     skrll    HI16_SLO is for the add3 and load/store with displacement instructions.
    289      1.1     skrll    HI16_ULO is for the or3 instruction.
    290      1.1     skrll    For R_M32R_HI16_SLO, the lower 16 bits are sign extended when added to
    291      1.1     skrll    the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
    292      1.1     skrll    we must add one to the high 16 bytes (which will get subtracted off when
    293      1.1     skrll    the low 16 bits are added).
    294      1.1     skrll    These relocs have to be done in combination with an R_M32R_LO16 reloc
    295      1.1     skrll    because there is a carry from the LO16 to the HI16.  Here we just save
    296      1.1     skrll    the information we need; we do the actual relocation when we see the LO16.
    297      1.1     skrll    This code is copied from the elf32-mips.c.  We also support an arbitrary
    298      1.1     skrll    number of HI16 relocs to be associated with a single LO16 reloc.  The
    299      1.1     skrll    assembler sorts the relocs to ensure each HI16 immediately precedes its
    300      1.1     skrll    LO16.  However if there are multiple copies, the assembler may not find
    301      1.1     skrll    the real LO16 so it picks the first one it finds.  */
    302      1.1     skrll 
    303      1.1     skrll struct m32r_hi16
    304      1.1     skrll {
    305      1.1     skrll   struct m32r_hi16 *next;
    306      1.1     skrll   bfd_byte *addr;
    307      1.1     skrll   bfd_vma addend;
    308      1.1     skrll };
    309      1.1     skrll 
    310      1.1     skrll /* FIXME: This should not be a static variable.  */
    311      1.1     skrll 
    312      1.1     skrll static struct m32r_hi16 *m32r_hi16_list;
    313      1.1     skrll 
    314      1.1     skrll static bfd_reloc_status_type
    315      1.1     skrll m32r_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    316      1.1     skrll 		     arelent *reloc_entry,
    317      1.1     skrll 		     asymbol *symbol,
    318      1.1     skrll 		     void * data,
    319      1.1     skrll 		     asection *input_section,
    320      1.1     skrll 		     bfd *output_bfd,
    321      1.1     skrll 		     char **error_message ATTRIBUTE_UNUSED)
    322      1.1     skrll {
    323      1.1     skrll   bfd_reloc_status_type ret;
    324      1.1     skrll   bfd_vma relocation;
    325      1.1     skrll   struct m32r_hi16 *n;
    326      1.1     skrll 
    327      1.1     skrll   /* This part is from bfd_elf_generic_reloc.
    328      1.1     skrll      If we're relocating, and this an external symbol, we don't want
    329      1.1     skrll      to change anything.  */
    330      1.1     skrll   if (output_bfd != NULL
    331      1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    332      1.1     skrll       && reloc_entry->addend == 0)
    333      1.1     skrll     {
    334      1.1     skrll       reloc_entry->address += input_section->output_offset;
    335      1.1     skrll       return bfd_reloc_ok;
    336      1.1     skrll     }
    337      1.1     skrll 
    338      1.1     skrll   /* Sanity check the address (offset in section).  */
    339      1.1     skrll   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    340      1.1     skrll     return bfd_reloc_outofrange;
    341      1.1     skrll 
    342      1.1     skrll   ret = bfd_reloc_ok;
    343      1.1     skrll   if (bfd_is_und_section (symbol->section)
    344      1.1     skrll       && output_bfd == NULL)
    345      1.1     skrll     ret = bfd_reloc_undefined;
    346      1.1     skrll 
    347      1.1     skrll   if (bfd_is_com_section (symbol->section))
    348      1.1     skrll     relocation = 0;
    349      1.1     skrll   else
    350      1.1     skrll     relocation = symbol->value;
    351      1.1     skrll 
    352      1.1     skrll   relocation += symbol->section->output_section->vma;
    353      1.1     skrll   relocation += symbol->section->output_offset;
    354      1.1     skrll   relocation += reloc_entry->addend;
    355      1.1     skrll 
    356      1.1     skrll   /* Save the information, and let LO16 do the actual relocation.  */
    357      1.1     skrll   n = bfd_malloc ((bfd_size_type) sizeof *n);
    358      1.1     skrll   if (n == NULL)
    359      1.1     skrll     return bfd_reloc_outofrange;
    360      1.1     skrll   n->addr = (bfd_byte *) data + reloc_entry->address;
    361      1.1     skrll   n->addend = relocation;
    362      1.1     skrll   n->next = m32r_hi16_list;
    363      1.1     skrll   m32r_hi16_list = n;
    364      1.1     skrll 
    365      1.1     skrll   if (output_bfd != NULL)
    366      1.1     skrll     reloc_entry->address += input_section->output_offset;
    367      1.1     skrll 
    368      1.1     skrll   return ret;
    369      1.1     skrll }
    370      1.1     skrll 
    371      1.1     skrll /* Handle an M32R ELF HI16 reloc.  */
    372      1.1     skrll 
    373      1.1     skrll static void
    374      1.1     skrll m32r_elf_relocate_hi16 (bfd *input_bfd,
    375      1.1     skrll 			int type,
    376      1.1     skrll 			Elf_Internal_Rela *relhi,
    377      1.1     skrll 			Elf_Internal_Rela *rello,
    378      1.1     skrll 			bfd_byte *contents,
    379      1.1     skrll 			bfd_vma addend)
    380      1.1     skrll {
    381      1.1     skrll   unsigned long insn;
    382      1.1     skrll   bfd_vma addlo;
    383      1.1     skrll 
    384      1.1     skrll   insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
    385      1.1     skrll 
    386      1.1     skrll   addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
    387      1.1     skrll   if (type == R_M32R_HI16_SLO)
    388      1.1     skrll     addlo = ((addlo & 0xffff) ^ 0x8000) - 0x8000;
    389      1.1     skrll   else
    390      1.1     skrll     addlo &= 0xffff;
    391      1.1     skrll 
    392      1.1     skrll   addend += ((insn & 0xffff) << 16) + addlo;
    393      1.1     skrll 
    394      1.1     skrll   /* Reaccount for sign extension of low part.  */
    395      1.1     skrll   if (type == R_M32R_HI16_SLO
    396      1.1     skrll       && (addend & 0x8000) != 0)
    397      1.1     skrll     addend += 0x10000;
    398      1.1     skrll 
    399      1.1     skrll   bfd_put_32 (input_bfd,
    400      1.1     skrll 	      (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
    401      1.1     skrll 	      contents + relhi->r_offset);
    402      1.1     skrll }
    403      1.1     skrll 
    404      1.1     skrll /* Do an R_M32R_LO16 relocation.  This is a straightforward 16 bit
    405      1.1     skrll    inplace relocation; this function exists in order to do the
    406      1.1     skrll    R_M32R_HI16_[SU]LO relocation described above.  */
    407      1.1     skrll 
    408      1.1     skrll static bfd_reloc_status_type
    409      1.1     skrll m32r_elf_lo16_reloc (bfd *input_bfd,
    410      1.1     skrll 		     arelent *reloc_entry,
    411      1.1     skrll 		     asymbol *symbol,
    412      1.1     skrll 		     void * data,
    413      1.1     skrll 		     asection *input_section,
    414      1.1     skrll 		     bfd *output_bfd,
    415      1.1     skrll 		     char **error_message)
    416      1.1     skrll {
    417      1.1     skrll   /* This part is from bfd_elf_generic_reloc.
    418      1.1     skrll      If we're relocating, and this an external symbol, we don't want
    419      1.1     skrll      to change anything.  */
    420      1.1     skrll   if (output_bfd != NULL
    421      1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    422      1.1     skrll       && reloc_entry->addend == 0)
    423      1.1     skrll     {
    424      1.1     skrll       reloc_entry->address += input_section->output_offset;
    425      1.1     skrll       return bfd_reloc_ok;
    426      1.1     skrll     }
    427      1.1     skrll 
    428      1.1     skrll   if (m32r_hi16_list != NULL)
    429      1.1     skrll     {
    430      1.1     skrll       struct m32r_hi16 *l;
    431      1.1     skrll 
    432      1.1     skrll       l = m32r_hi16_list;
    433      1.1     skrll       while (l != NULL)
    434      1.1     skrll 	{
    435      1.1     skrll 	  unsigned long insn;
    436      1.1     skrll 	  unsigned long val;
    437      1.1     skrll 	  unsigned long vallo;
    438      1.1     skrll 	  struct m32r_hi16 *next;
    439      1.1     skrll 
    440      1.1     skrll 	  /* Do the HI16 relocation.  Note that we actually don't need
    441      1.1     skrll 	     to know anything about the LO16 itself, except where to
    442      1.1     skrll 	     find the low 16 bits of the addend needed by the LO16.  */
    443      1.1     skrll 	  insn = bfd_get_32 (input_bfd, l->addr);
    444      1.1     skrll 	  vallo = ((bfd_get_32 (input_bfd, (bfd_byte *) data + reloc_entry->address)
    445      1.1     skrll 		   & 0xffff) ^ 0x8000) - 0x8000;
    446      1.1     skrll 	  val = ((insn & 0xffff) << 16) + vallo;
    447      1.1     skrll 	  val += l->addend;
    448      1.1     skrll 
    449      1.1     skrll 	  /* Reaccount for sign extension of low part.  */
    450      1.1     skrll 	  if ((val & 0x8000) != 0)
    451      1.1     skrll 	    val += 0x10000;
    452      1.1     skrll 
    453      1.1     skrll 	  insn = (insn &~ (bfd_vma) 0xffff) | ((val >> 16) & 0xffff);
    454      1.1     skrll 	  bfd_put_32 (input_bfd, (bfd_vma) insn, l->addr);
    455      1.1     skrll 
    456      1.1     skrll 	  next = l->next;
    457      1.1     skrll 	  free (l);
    458      1.1     skrll 	  l = next;
    459      1.1     skrll 	}
    460      1.1     skrll 
    461      1.1     skrll       m32r_hi16_list = NULL;
    462      1.1     skrll     }
    463      1.1     skrll 
    464      1.1     skrll   /* Now do the LO16 reloc in the usual way.
    465      1.1     skrll      ??? It would be nice to call bfd_elf_generic_reloc here,
    466      1.1     skrll      but we have partial_inplace set.  bfd_elf_generic_reloc will
    467      1.1     skrll      pass the handling back to bfd_install_relocation which will install
    468      1.1     skrll      a section relative addend which is wrong.  */
    469      1.1     skrll   return m32r_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
    470      1.1     skrll 				input_section, output_bfd, error_message);
    471      1.1     skrll }
    472      1.1     skrll 
    473      1.1     skrll 
    474      1.1     skrll static reloc_howto_type m32r_elf_howto_table[] =
    476      1.1     skrll {
    477      1.1     skrll   /* This reloc does nothing.  */
    478      1.1     skrll   HOWTO (R_M32R_NONE,		/* type */
    479      1.1     skrll 	 0,			/* rightshift */
    480      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    481      1.1     skrll 	 32,			/* bitsize */
    482      1.1     skrll 	 FALSE,			/* pc_relative */
    483      1.1     skrll 	 0,			/* bitpos */
    484      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    485      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    486      1.1     skrll 	 "R_M32R_NONE",		/* name */
    487      1.1     skrll 	 FALSE,			/* partial_inplace */
    488      1.1     skrll 	 0,			/* src_mask */
    489      1.1     skrll 	 0,			/* dst_mask */
    490      1.1     skrll 	 FALSE),		/* pcrel_offset */
    491      1.1     skrll 
    492      1.1     skrll   /* A 16 bit absolute relocation.  */
    493      1.1     skrll   HOWTO (R_M32R_16,		/* type */
    494      1.1     skrll 	 0,			/* rightshift */
    495      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    496      1.1     skrll 	 16,			/* bitsize */
    497      1.1     skrll 	 FALSE,			/* pc_relative */
    498      1.1     skrll 	 0,			/* bitpos */
    499      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    500      1.1     skrll 	 m32r_elf_generic_reloc,/* special_function */
    501      1.1     skrll 	 "R_M32R_16",		/* name */
    502      1.1     skrll 	 TRUE,			/* partial_inplace */
    503      1.1     skrll 	 0xffff,		/* src_mask */
    504      1.1     skrll 	 0xffff,		/* dst_mask */
    505      1.1     skrll 	 FALSE),		/* pcrel_offset */
    506      1.1     skrll 
    507      1.1     skrll   /* A 32 bit absolute relocation.  */
    508      1.1     skrll   HOWTO (R_M32R_32,		/* type */
    509      1.1     skrll 	 0,			/* rightshift */
    510      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    511      1.1     skrll 	 32,			/* bitsize */
    512      1.1     skrll 	 FALSE,			/* pc_relative */
    513      1.1     skrll 	 0,			/* bitpos */
    514      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    515      1.1     skrll 	 m32r_elf_generic_reloc,/* special_function */
    516      1.1     skrll 	 "R_M32R_32",		/* name */
    517      1.1     skrll 	 TRUE,			/* partial_inplace */
    518      1.1     skrll 	 0xffffffff,		/* src_mask */
    519      1.1     skrll 	 0xffffffff,		/* dst_mask */
    520      1.1     skrll 	 FALSE),		/* pcrel_offset */
    521      1.1     skrll 
    522      1.1     skrll   /* A 24 bit address.  */
    523      1.1     skrll   HOWTO (R_M32R_24,		/* type */
    524      1.1     skrll 	 0,			/* rightshift */
    525      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    526      1.1     skrll 	 24,			/* bitsize */
    527      1.1     skrll 	 FALSE,			/* pc_relative */
    528      1.1     skrll 	 0,			/* bitpos */
    529      1.1     skrll 	 complain_overflow_unsigned, /* complain_on_overflow */
    530      1.1     skrll 	 m32r_elf_generic_reloc,/* special_function */
    531      1.1     skrll 	 "R_M32R_24",		/* name */
    532      1.1     skrll 	 TRUE,			/* partial_inplace */
    533      1.1     skrll 	 0xffffff,		/* src_mask */
    534      1.1     skrll 	 0xffffff,		/* dst_mask */
    535      1.1     skrll 	 FALSE),		/* pcrel_offset */
    536      1.1     skrll 
    537      1.1     skrll   /* An PC Relative 10-bit relocation, shifted by 2.
    538      1.1     skrll      This reloc is complicated because relocations are relative to pc & -4.
    539      1.1     skrll      i.e. branches in the right insn slot use the address of the left insn
    540      1.1     skrll      slot for pc.  */
    541      1.1     skrll   /* ??? It's not clear whether this should have partial_inplace set or not.
    542      1.1     skrll      Branch relaxing in the assembler can store the addend in the insn,
    543      1.1     skrll      and if bfd_install_relocation gets called the addend may get added
    544      1.1     skrll      again.  */
    545      1.1     skrll   HOWTO (R_M32R_10_PCREL,	/* type */
    546      1.1     skrll 	 2,	                /* rightshift */
    547      1.1     skrll 	 1,	                /* size (0 = byte, 1 = short, 2 = long) */
    548      1.1     skrll 	 10,	                /* bitsize */
    549      1.1     skrll 	 TRUE,	                /* pc_relative */
    550      1.1     skrll 	 0,	                /* bitpos */
    551      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    552      1.1     skrll 	 m32r_elf_10_pcrel_reloc, /* special_function */
    553      1.1     skrll 	 "R_M32R_10_PCREL",	/* name */
    554      1.1     skrll 	 FALSE,	                /* partial_inplace */
    555      1.1     skrll 	 0xff,		        /* src_mask */
    556      1.1     skrll 	 0xff,   		/* dst_mask */
    557      1.1     skrll 	 TRUE),			/* pcrel_offset */
    558      1.1     skrll 
    559      1.1     skrll   /* A relative 18 bit relocation, right shifted by 2.  */
    560      1.1     skrll   HOWTO (R_M32R_18_PCREL,	/* type */
    561      1.1     skrll 	 2,			/* rightshift */
    562      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    563      1.1     skrll 	 16,			/* bitsize */
    564      1.1     skrll 	 TRUE,			/* pc_relative */
    565      1.1     skrll 	 0,			/* bitpos */
    566      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    567      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    568      1.1     skrll 	 "R_M32R_18_PCREL",	/* name */
    569      1.1     skrll 	 FALSE,			/* partial_inplace */
    570      1.1     skrll 	 0xffff,		/* src_mask */
    571      1.1     skrll 	 0xffff,		/* dst_mask */
    572      1.1     skrll 	 TRUE),			/* pcrel_offset */
    573      1.1     skrll 
    574      1.1     skrll   /* A relative 26 bit relocation, right shifted by 2.  */
    575      1.1     skrll   /* ??? It's not clear whether this should have partial_inplace set or not.
    576      1.1     skrll      Branch relaxing in the assembler can store the addend in the insn,
    577      1.1     skrll      and if bfd_install_relocation gets called the addend may get added
    578      1.1     skrll      again.  */
    579      1.1     skrll   HOWTO (R_M32R_26_PCREL,	/* type */
    580      1.1     skrll 	 2,			/* rightshift */
    581      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    582      1.1     skrll 	 26,			/* bitsize */
    583      1.1     skrll 	 TRUE,			/* pc_relative */
    584      1.1     skrll 	 0,			/* bitpos */
    585      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    586      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    587      1.1     skrll 	 "R_M32R_26_PCREL",	/* name */
    588      1.1     skrll 	 FALSE,			/* partial_inplace */
    589      1.1     skrll 	 0xffffff,		/* src_mask */
    590      1.1     skrll 	 0xffffff,		/* dst_mask */
    591      1.1     skrll 	 TRUE),			/* pcrel_offset */
    592      1.1     skrll 
    593      1.1     skrll   /* High 16 bits of address when lower 16 is or'd in.  */
    594      1.1     skrll   HOWTO (R_M32R_HI16_ULO,	/* type */
    595      1.1     skrll 	 16,			/* rightshift */
    596      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    597      1.1     skrll 	 16,			/* bitsize */
    598      1.1     skrll 	 FALSE,			/* pc_relative */
    599      1.1     skrll 	 0,			/* bitpos */
    600      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    601      1.1     skrll 	 m32r_elf_hi16_reloc,	/* special_function */
    602      1.1     skrll 	 "R_M32R_HI16_ULO",	/* name */
    603      1.1     skrll 	 TRUE,			/* partial_inplace */
    604      1.1     skrll 	 0x0000ffff,		/* src_mask */
    605      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    606      1.1     skrll 	 FALSE),		/* pcrel_offset */
    607      1.1     skrll 
    608      1.1     skrll   /* High 16 bits of address when lower 16 is added in.  */
    609      1.1     skrll   HOWTO (R_M32R_HI16_SLO,	/* type */
    610      1.1     skrll 	 16,			/* rightshift */
    611      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    612      1.1     skrll 	 16,			/* bitsize */
    613      1.1     skrll 	 FALSE,			/* pc_relative */
    614      1.1     skrll 	 0,			/* bitpos */
    615      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    616      1.1     skrll 	 m32r_elf_hi16_reloc,	/* special_function */
    617      1.1     skrll 	 "R_M32R_HI16_SLO",	/* name */
    618      1.1     skrll 	 TRUE,			/* partial_inplace */
    619      1.1     skrll 	 0x0000ffff,		/* src_mask */
    620      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    621      1.1     skrll 	 FALSE),		/* pcrel_offset */
    622      1.1     skrll 
    623      1.1     skrll   /* Lower 16 bits of address.  */
    624      1.1     skrll   HOWTO (R_M32R_LO16,		/* type */
    625      1.1     skrll 	 0,			/* rightshift */
    626      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    627      1.1     skrll 	 16,			/* bitsize */
    628      1.1     skrll 	 FALSE,			/* pc_relative */
    629      1.1     skrll 	 0,			/* bitpos */
    630      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    631      1.1     skrll 	 m32r_elf_lo16_reloc,	/* special_function */
    632      1.1     skrll 	 "R_M32R_LO16",		/* name */
    633      1.1     skrll 	 TRUE,			/* partial_inplace */
    634      1.1     skrll 	 0x0000ffff,		/* src_mask */
    635      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    636      1.1     skrll 	 FALSE),		/* pcrel_offset */
    637      1.1     skrll 
    638      1.1     skrll   /* Small data area 16 bits offset.  */
    639      1.1     skrll   HOWTO (R_M32R_SDA16,		/* type */
    640      1.1     skrll 	 0,			/* rightshift */
    641      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    642      1.1     skrll 	 16,			/* bitsize */
    643      1.1     skrll 	 FALSE,			/* pc_relative */
    644      1.1     skrll 	 0,			/* bitpos */
    645      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    646      1.1     skrll 	 m32r_elf_sda16_reloc,	/* special_function */
    647      1.1     skrll 	 "R_M32R_SDA16",	/* name */
    648      1.1     skrll 	 TRUE,			/* partial_inplace */  /* FIXME: correct? */
    649      1.1     skrll 	 0x0000ffff,		/* src_mask */
    650      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    651      1.1     skrll 	 FALSE),		/* pcrel_offset */
    652      1.1     skrll 
    653      1.1     skrll   /* GNU extension to record C++ vtable hierarchy.  */
    654      1.1     skrll   HOWTO (R_M32R_GNU_VTINHERIT, /* type */
    655      1.1     skrll          0,                     /* rightshift */
    656      1.1     skrll          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    657      1.1     skrll          0,                     /* bitsize */
    658      1.1     skrll          FALSE,                 /* pc_relative */
    659      1.1     skrll          0,                     /* bitpos */
    660      1.1     skrll          complain_overflow_dont, /* complain_on_overflow */
    661      1.1     skrll          NULL,                  /* special_function */
    662      1.1     skrll          "R_M32R_GNU_VTINHERIT", /* name */
    663      1.1     skrll          FALSE,                 /* partial_inplace */
    664      1.1     skrll          0,                     /* src_mask */
    665      1.1     skrll          0,                     /* dst_mask */
    666      1.1     skrll          FALSE),                /* pcrel_offset */
    667      1.1     skrll 
    668      1.1     skrll   /* GNU extension to record C++ vtable member usage.  */
    669      1.1     skrll   HOWTO (R_M32R_GNU_VTENTRY,     /* type */
    670      1.1     skrll          0,                     /* rightshift */
    671      1.1     skrll          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    672      1.1     skrll          0,                     /* bitsize */
    673      1.1     skrll          FALSE,                 /* pc_relative */
    674      1.1     skrll          0,                     /* bitpos */
    675      1.1     skrll          complain_overflow_dont, /* complain_on_overflow */
    676      1.1     skrll          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
    677      1.1     skrll          "R_M32R_GNU_VTENTRY",   /* name */
    678      1.1     skrll          FALSE,                 /* partial_inplace */
    679      1.1     skrll          0,                     /* src_mask */
    680      1.1     skrll          0,                     /* dst_mask */
    681      1.1     skrll          FALSE),                /* pcrel_offset */
    682      1.1     skrll 
    683      1.1     skrll   EMPTY_HOWTO (13),
    684      1.1     skrll   EMPTY_HOWTO (14),
    685      1.1     skrll   EMPTY_HOWTO (15),
    686      1.1     skrll   EMPTY_HOWTO (16),
    687      1.1     skrll   EMPTY_HOWTO (17),
    688      1.1     skrll   EMPTY_HOWTO (18),
    689      1.1     skrll   EMPTY_HOWTO (19),
    690      1.1     skrll   EMPTY_HOWTO (20),
    691      1.1     skrll   EMPTY_HOWTO (21),
    692      1.1     skrll   EMPTY_HOWTO (22),
    693      1.1     skrll   EMPTY_HOWTO (23),
    694      1.1     skrll   EMPTY_HOWTO (24),
    695      1.1     skrll   EMPTY_HOWTO (25),
    696      1.1     skrll   EMPTY_HOWTO (26),
    697      1.1     skrll   EMPTY_HOWTO (27),
    698      1.1     skrll   EMPTY_HOWTO (28),
    699      1.1     skrll   EMPTY_HOWTO (29),
    700      1.1     skrll   EMPTY_HOWTO (30),
    701      1.1     skrll   EMPTY_HOWTO (31),
    702      1.1     skrll   EMPTY_HOWTO (32),
    703      1.1     skrll 
    704      1.1     skrll   /* A 16 bit absolute relocation.  */
    705      1.1     skrll   HOWTO (R_M32R_16_RELA,	/* type */
    706      1.1     skrll 	 0,			/* rightshift */
    707      1.1     skrll 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    708      1.1     skrll 	 16,			/* bitsize */
    709      1.1     skrll 	 FALSE,			/* pc_relative */
    710      1.1     skrll 	 0,			/* bitpos */
    711      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    712      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    713      1.1     skrll 	 "R_M32R_16_RELA",	/* name */
    714      1.1     skrll 	 FALSE,			/* partial_inplace */
    715      1.1     skrll 	 0xffff,		/* src_mask */
    716      1.1     skrll 	 0xffff,		/* dst_mask */
    717      1.1     skrll 	 FALSE),		/* pcrel_offset */
    718      1.1     skrll 
    719      1.1     skrll   /* A 32 bit absolute relocation.  */
    720      1.1     skrll   HOWTO (R_M32R_32_RELA,	/* type */
    721      1.1     skrll 	 0,			/* rightshift */
    722      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    723      1.1     skrll 	 32,			/* bitsize */
    724      1.1     skrll 	 FALSE,			/* pc_relative */
    725      1.1     skrll 	 0,			/* bitpos */
    726      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    727      1.1     skrll 	 bfd_elf_generic_reloc,/* special_function */
    728      1.1     skrll 	 "R_M32R_32_RELA",		/* name */
    729      1.1     skrll 	 FALSE,			/* partial_inplace */
    730      1.1     skrll 	 0xffffffff,		/* src_mask */
    731      1.1     skrll 	 0xffffffff,		/* dst_mask */
    732      1.1     skrll 	 FALSE),		/* pcrel_offset */
    733      1.1     skrll 
    734      1.1     skrll   /* A 24 bit address.  */
    735      1.1     skrll   HOWTO (R_M32R_24_RELA,	/* type */
    736      1.1     skrll 	 0,			/* rightshift */
    737      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    738      1.1     skrll 	 24,			/* bitsize */
    739      1.1     skrll 	 FALSE,			/* pc_relative */
    740      1.1     skrll 	 0,			/* bitpos */
    741      1.1     skrll 	 complain_overflow_unsigned, /* complain_on_overflow */
    742      1.1     skrll 	 bfd_elf_generic_reloc,/* special_function */
    743      1.1     skrll 	 "R_M32R_24_RELA",	/* name */
    744      1.1     skrll 	 FALSE,			/* partial_inplace */
    745      1.1     skrll 	 0xffffff,		/* src_mask */
    746      1.1     skrll 	 0xffffff,		/* dst_mask */
    747      1.1     skrll 	 FALSE),		/* pcrel_offset */
    748      1.1     skrll 
    749      1.1     skrll   HOWTO (R_M32R_10_PCREL_RELA,	/* type */
    750      1.1     skrll 	 2,	                /* rightshift */
    751      1.1     skrll 	 1,	                /* size (0 = byte, 1 = short, 2 = long) */
    752      1.1     skrll 	 10,	                /* bitsize */
    753      1.1     skrll 	 TRUE,	                /* pc_relative */
    754      1.1     skrll 	 0,	                /* bitpos */
    755      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    756      1.1     skrll 	 m32r_elf_10_pcrel_reloc, /* special_function */
    757      1.1     skrll 	 "R_M32R_10_PCREL_RELA",/* name */
    758      1.1     skrll 	 FALSE,	                /* partial_inplace */
    759      1.1     skrll 	 0xff,		        /* src_mask */
    760      1.1     skrll 	 0xff,   		/* dst_mask */
    761      1.1     skrll 	 TRUE),			/* pcrel_offset */
    762      1.1     skrll 
    763      1.1     skrll   /* A relative 18 bit relocation, right shifted by 2.  */
    764      1.1     skrll   HOWTO (R_M32R_18_PCREL_RELA,	/* type */
    765      1.1     skrll 	 2,			/* rightshift */
    766      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    767      1.1     skrll 	 16,			/* bitsize */
    768      1.1     skrll 	 TRUE,			/* pc_relative */
    769      1.1     skrll 	 0,			/* bitpos */
    770      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    771      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    772      1.1     skrll 	 "R_M32R_18_PCREL_RELA",/* name */
    773      1.1     skrll 	 FALSE,			/* partial_inplace */
    774      1.1     skrll 	 0xffff,		/* src_mask */
    775      1.1     skrll 	 0xffff,		/* dst_mask */
    776      1.1     skrll 	 TRUE),			/* pcrel_offset */
    777      1.1     skrll 
    778      1.1     skrll   /* A relative 26 bit relocation, right shifted by 2.  */
    779      1.1     skrll   HOWTO (R_M32R_26_PCREL_RELA,	/* type */
    780      1.1     skrll 	 2,			/* rightshift */
    781      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    782      1.1     skrll 	 26,			/* bitsize */
    783      1.1     skrll 	 TRUE,			/* pc_relative */
    784      1.1     skrll 	 0,			/* bitpos */
    785      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    786      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    787      1.1     skrll 	 "R_M32R_26_PCREL_RELA",/* name */
    788      1.1     skrll 	 FALSE,			/* partial_inplace */
    789      1.1     skrll 	 0xffffff,		/* src_mask */
    790      1.1     skrll 	 0xffffff,		/* dst_mask */
    791      1.1     skrll 	 TRUE),			/* pcrel_offset */
    792      1.1     skrll 
    793      1.1     skrll   /* High 16 bits of address when lower 16 is or'd in.  */
    794      1.1     skrll   HOWTO (R_M32R_HI16_ULO_RELA,	/* type */
    795      1.1     skrll 	 16,			/* rightshift */
    796      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    797      1.1     skrll 	 16,			/* bitsize */
    798      1.1     skrll 	 FALSE,			/* pc_relative */
    799      1.1     skrll 	 0,			/* bitpos */
    800      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    801      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    802      1.1     skrll 	 "R_M32R_HI16_ULO_RELA",/* name */
    803      1.1     skrll 	 FALSE,			/* partial_inplace */
    804      1.1     skrll 	 0x0000ffff,		/* src_mask */
    805      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    806      1.1     skrll 	 FALSE),		/* pcrel_offset */
    807      1.1     skrll 
    808      1.1     skrll   /* High 16 bits of address when lower 16 is added in.  */
    809      1.1     skrll   HOWTO (R_M32R_HI16_SLO_RELA,	/* type */
    810      1.1     skrll 	 16,			/* rightshift */
    811      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    812      1.1     skrll 	 16,			/* bitsize */
    813      1.1     skrll 	 FALSE,			/* pc_relative */
    814      1.1     skrll 	 0,			/* bitpos */
    815      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    816      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    817      1.1     skrll 	 "R_M32R_HI16_SLO_RELA",/* name */
    818      1.1     skrll 	 FALSE,			/* partial_inplace */
    819      1.1     skrll 	 0x0000ffff,		/* src_mask */
    820      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    821      1.1     skrll 	 FALSE),		/* pcrel_offset */
    822      1.1     skrll 
    823      1.1     skrll   /* Lower 16 bits of address.  */
    824      1.1     skrll   HOWTO (R_M32R_LO16_RELA,	/* type */
    825      1.1     skrll 	 0,			/* rightshift */
    826      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    827      1.1     skrll 	 16,			/* bitsize */
    828      1.1     skrll 	 FALSE,			/* pc_relative */
    829      1.1     skrll 	 0,			/* bitpos */
    830      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
    831      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    832      1.1     skrll 	 "R_M32R_LO16_RELA",	/* name */
    833      1.1     skrll 	 FALSE,			/* partial_inplace */
    834      1.1     skrll 	 0x0000ffff,		/* src_mask */
    835      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    836      1.1     skrll 	 FALSE),		/* pcrel_offset */
    837      1.1     skrll 
    838      1.1     skrll   /* Small data area 16 bits offset.  */
    839      1.1     skrll   HOWTO (R_M32R_SDA16_RELA,	/* type */
    840      1.1     skrll 	 0,			/* rightshift */
    841      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    842      1.1     skrll 	 16,			/* bitsize */
    843      1.1     skrll 	 FALSE,			/* pc_relative */
    844      1.1     skrll 	 0,			/* bitpos */
    845      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    846      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    847      1.1     skrll 	 "R_M32R_SDA16_RELA",	/* name */
    848      1.1     skrll 	 TRUE,			/* partial_inplace */  /* FIXME: correct? */
    849      1.1     skrll 	 0x0000ffff,		/* src_mask */
    850      1.1     skrll 	 0x0000ffff,		/* dst_mask */
    851      1.1     skrll 	 FALSE),		/* pcrel_offset */
    852      1.1     skrll 
    853      1.1     skrll   /* GNU extension to record C++ vtable hierarchy.  */
    854      1.1     skrll   HOWTO (R_M32R_RELA_GNU_VTINHERIT, /* type */
    855      1.1     skrll          0,                     /* rightshift */
    856      1.1     skrll          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    857      1.1     skrll          0,                     /* bitsize */
    858      1.1     skrll          FALSE,                 /* pc_relative */
    859      1.1     skrll          0,                     /* bitpos */
    860      1.1     skrll          complain_overflow_dont, /* complain_on_overflow */
    861      1.1     skrll          NULL,                  /* special_function */
    862      1.1     skrll          "R_M32R_RELA_GNU_VTINHERIT", /* name */
    863      1.1     skrll          FALSE,                 /* partial_inplace */
    864      1.1     skrll          0,                     /* src_mask */
    865      1.1     skrll          0,                     /* dst_mask */
    866      1.1     skrll          FALSE),                /* pcrel_offset */
    867      1.1     skrll 
    868      1.1     skrll   /* GNU extension to record C++ vtable member usage.  */
    869      1.1     skrll   HOWTO (R_M32R_RELA_GNU_VTENTRY,     /* type */
    870      1.1     skrll          0,                     /* rightshift */
    871      1.1     skrll          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    872      1.1     skrll          0,                     /* bitsize */
    873      1.1     skrll          FALSE,                 /* pc_relative */
    874      1.1     skrll          0,                     /* bitpos */
    875      1.1     skrll          complain_overflow_dont, /* complain_on_overflow */
    876      1.1     skrll          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
    877      1.1     skrll          "R_M32R_RELA_GNU_VTENTRY",   /* name */
    878      1.1     skrll          FALSE,                 /* partial_inplace */
    879      1.1     skrll          0,                     /* src_mask */
    880      1.1     skrll          0,                     /* dst_mask */
    881      1.1     skrll          FALSE),                /* pcrel_offset */
    882      1.1     skrll 
    883      1.1     skrll   /* A 32 bit PC relative relocation.  */
    884      1.1     skrll   HOWTO (R_M32R_REL32,		/* type */
    885      1.1     skrll 	 0,			/* rightshift */
    886      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    887      1.1     skrll 	 32,			/* bitsize */
    888      1.1     skrll 	 TRUE,			/* pc_relative */
    889      1.1     skrll 	 0,			/* bitpos */
    890      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    891      1.1     skrll 	 bfd_elf_generic_reloc,/* special_function */
    892      1.1     skrll 	 "R_M32R_REL32",		/* name */
    893      1.1     skrll 	 FALSE,			/* partial_inplace */
    894      1.1     skrll 	 0xffffffff,		/* src_mask */
    895      1.1     skrll 	 0xffffffff,		/* dst_mask */
    896      1.1     skrll 	 TRUE),			/* pcrel_offset */
    897      1.1     skrll 
    898      1.1     skrll   EMPTY_HOWTO (46),
    899      1.1     skrll   EMPTY_HOWTO (47),
    900      1.1     skrll 
    901      1.1     skrll   /* Like R_M32R_24, but referring to the GOT table entry for
    902      1.1     skrll      the symbol.  */
    903      1.1     skrll   HOWTO (R_M32R_GOT24,		/* type */
    904      1.1     skrll 	 0,			/* rightshift */
    905      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    906      1.1     skrll 	 24,			/* bitsize */
    907      1.1     skrll 	 FALSE,			/* pc_relative */
    908      1.1     skrll 	 0,			/* bitpos */
    909      1.1     skrll 	 complain_overflow_unsigned, /* complain_on_overflow */
    910      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
    911      1.1     skrll 	 "R_M32R_GOT24",	/* name */
    912      1.1     skrll 	 FALSE,			/* partial_inplace */
    913      1.1     skrll 	 0xffffff,		/* src_mask */
    914      1.1     skrll 	 0xffffff,		/* dst_mask */
    915      1.1     skrll 	 FALSE),		/* pcrel_offset */
    916      1.1     skrll 
    917      1.1     skrll   /* Like R_M32R_PCREL, but referring to the procedure linkage table
    918      1.1     skrll      entry for the symbol.  */
    919      1.1     skrll   HOWTO (R_M32R_26_PLTREL,	/* type */
    920      1.1     skrll 	 2,			/* rightshift */
    921      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    922      1.1     skrll 	 24,			/* bitsize */
    923      1.1     skrll 	 TRUE,			/* pc_relative */
    924      1.1     skrll 	 0,			/* bitpos */
    925      1.1     skrll 	 complain_overflow_signed, /* complain_on_overflow */
    926      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
    927      1.1     skrll 	 "R_M32R_26_PLTREL",	/* name */
    928      1.1     skrll 	 FALSE,			/* partial_inplace */
    929      1.1     skrll 	 0xffffff,		/* src_mask */
    930      1.1     skrll 	 0xffffff,		/* dst_mask */
    931      1.1     skrll 	 TRUE),			/* pcrel_offset */
    932      1.1     skrll 
    933      1.1     skrll   /* This is used only by the dynamic linker.  The symbol should exist
    934      1.1     skrll      both in the object being run and in some shared library.  The
    935      1.1     skrll      dynamic linker copies the data addressed by the symbol from the
    936      1.1     skrll      shared library into the object, because the object being
    937      1.1     skrll      run has to have the data at some particular address.  */
    938      1.1     skrll   HOWTO (R_M32R_COPY,		/* type */
    939      1.1     skrll 	 0,			/* rightshift */
    940      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    941      1.1     skrll 	 32,			/* bitsize */
    942      1.1     skrll 	 FALSE,			/* pc_relative */
    943      1.1     skrll 	 0,			/* bitpos */
    944      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    945      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
    946      1.1     skrll 	 "R_M32R_COPY",		/* name */
    947      1.1     skrll 	 FALSE,			/* partial_inplace */
    948      1.1     skrll 	 0xffffffff,		/* src_mask */
    949      1.1     skrll 	 0xffffffff,		/* dst_mask */
    950      1.1     skrll 	 FALSE),		/* pcrel_offset */
    951      1.1     skrll 
    952      1.1     skrll   /* Like R_M32R_24, but used when setting global offset table
    953      1.1     skrll      entries.  */
    954      1.1     skrll   HOWTO (R_M32R_GLOB_DAT,	/* type */
    955      1.1     skrll 	 0,			/* rightshift */
    956      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    957      1.1     skrll 	 32,			/* bitsize */
    958      1.1     skrll 	 FALSE,			/* pc_relative */
    959      1.1     skrll 	 0,			/* bitpos */
    960      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    961      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
    962      1.1     skrll 	 "R_M32R_GLOB_DAT",	/* name */
    963      1.1     skrll 	 FALSE,			/* partial_inplace */
    964      1.1     skrll 	 0xffffffff,		/* src_mask */
    965      1.1     skrll 	 0xffffffff,		/* dst_mask */
    966      1.1     skrll 	 FALSE),		/* pcrel_offset */
    967      1.1     skrll 
    968      1.1     skrll   /* Marks a procedure linkage table entry for a symbol.  */
    969      1.1     skrll   HOWTO (R_M32R_JMP_SLOT,	/* type */
    970      1.1     skrll 	 0,			/* rightshift */
    971      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    972      1.1     skrll 	 32,			/* bitsize */
    973      1.1     skrll 	 FALSE,			/* pc_relative */
    974      1.1     skrll 	 0,			/* bitpos */
    975      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    976      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
    977      1.1     skrll 	 "R_M32R_JMP_SLOT",	/* name */
    978      1.1     skrll 	 FALSE,			/* partial_inplace */
    979      1.1     skrll 	 0xffffffff,		/* src_mask */
    980      1.1     skrll 	 0xffffffff,		/* dst_mask */
    981      1.1     skrll 	 FALSE),		/* pcrel_offset */
    982      1.1     skrll 
    983      1.1     skrll   /* Used only by the dynamic linker.  When the object is run, this
    984      1.1     skrll      longword is set to the load address of the object, plus the
    985      1.1     skrll      addend.  */
    986      1.1     skrll   HOWTO (R_M32R_RELATIVE,	/* type */
    987      1.1     skrll 	 0,			/* rightshift */
    988      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    989      1.1     skrll 	 32,			/* bitsize */
    990      1.1     skrll 	 FALSE,			/* pc_relative */
    991      1.1     skrll 	 0,			/* bitpos */
    992      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
    993      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
    994      1.1     skrll 	 "R_M32R_RELATIVE",	/* name */
    995      1.1     skrll 	 FALSE,			/* partial_inplace */
    996      1.1     skrll 	 0xffffffff,		/* src_mask */
    997      1.1     skrll 	 0xffffffff,		/* dst_mask */
    998      1.1     skrll 	 FALSE),		/* pcrel_offset */
    999      1.1     skrll 
   1000      1.1     skrll   HOWTO (R_M32R_GOTOFF,		/* type */
   1001      1.1     skrll 	 0,			/* rightshift */
   1002      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1003      1.1     skrll 	 24,			/* bitsize */
   1004      1.1     skrll 	 FALSE,			/* pc_relative */
   1005      1.1     skrll 	 0,			/* bitpos */
   1006      1.1     skrll 	 complain_overflow_bitfield, /* complain_on_overflow */
   1007      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
   1008      1.1     skrll 	 "R_M32R_GOTOFF",	/* name */
   1009      1.1     skrll 	 FALSE,			/* partial_inplace */
   1010      1.1     skrll 	 0xffffff,		/* src_mask */
   1011      1.1     skrll 	 0xffffff,		/* dst_mask */
   1012      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1013      1.1     skrll 
   1014      1.1     skrll   /* An PC Relative 24-bit relocation used when setting PIC offset
   1015      1.1     skrll      table register. */
   1016      1.1     skrll   HOWTO (R_M32R_GOTPC24,	/* type */
   1017      1.1     skrll 	 0,			/* rightshift */
   1018      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1019      1.1     skrll 	 24,			/* bitsize */
   1020      1.1     skrll 	 TRUE,			/* pc_relative */
   1021      1.1     skrll 	 0,			/* bitpos */
   1022      1.1     skrll 	 complain_overflow_unsigned, /* complain_on_overflow */
   1023      1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
   1024      1.1     skrll 	 "R_M32R_GOTPC24",	/* name */
   1025      1.1     skrll 	 FALSE,			/* partial_inplace */
   1026      1.1     skrll 	 0xffffff,		/* src_mask */
   1027      1.1     skrll 	 0xffffff,		/* dst_mask */
   1028      1.1     skrll 	 TRUE),			/* pcrel_offset */
   1029      1.1     skrll 
   1030      1.1     skrll   /* Like R_M32R_HI16_ULO, but referring to the GOT table entry for
   1031      1.1     skrll      the symbol.  */
   1032      1.1     skrll   HOWTO (R_M32R_GOT16_HI_ULO,	/* type */
   1033      1.1     skrll 	 16,			/* rightshift */
   1034      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1035      1.1     skrll 	 16,			/* bitsize */
   1036      1.1     skrll 	 FALSE,			/* pc_relative */
   1037      1.1     skrll 	 0,			/* bitpos */
   1038      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1039      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1040      1.1     skrll 	 "R_M32R_GOT16_HI_ULO",	/* name */
   1041      1.1     skrll 	 FALSE,			/* partial_inplace */
   1042      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1043      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1044      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1045      1.1     skrll 
   1046      1.1     skrll   /* Like R_M32R_HI16_SLO, but referring to the GOT table entry for
   1047      1.1     skrll      the symbol.  */
   1048      1.1     skrll   HOWTO (R_M32R_GOT16_HI_SLO,	/* type */
   1049      1.1     skrll 	 16,			/* rightshift */
   1050      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1051      1.1     skrll 	 16,			/* bitsize */
   1052      1.1     skrll 	 FALSE,			/* pc_relative */
   1053      1.1     skrll 	 0,			/* bitpos */
   1054      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1055      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1056      1.1     skrll 	 "R_M32R_GOT16_HI_SLO",	/* name */
   1057      1.1     skrll 	 FALSE,			/* partial_inplace */
   1058      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1059      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1060      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1061      1.1     skrll 
   1062      1.1     skrll   /* Like R_M32R_LO16, but referring to the GOT table entry for
   1063      1.1     skrll      the symbol.  */
   1064      1.1     skrll   HOWTO (R_M32R_GOT16_LO,	/* type */
   1065      1.1     skrll 	 0,			/* rightshift */
   1066      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1067      1.1     skrll 	 16,			/* bitsize */
   1068      1.1     skrll 	 FALSE,			/* pc_relative */
   1069      1.1     skrll 	 0,			/* bitpos */
   1070      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1071      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1072      1.1     skrll 	 "R_M32R_GOT16_LO",	/* name */
   1073      1.1     skrll 	 FALSE,			/* partial_inplace */
   1074      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1075      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1076      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1077      1.1     skrll 
   1078      1.1     skrll   /* An PC Relative relocation used when setting PIC offset table register.
   1079      1.1     skrll      Like R_M32R_HI16_ULO, but referring to the GOT table entry for
   1080      1.1     skrll      the symbol.  */
   1081      1.1     skrll   HOWTO (R_M32R_GOTPC_HI_ULO,	/* type */
   1082      1.1     skrll 	 16,			/* rightshift */
   1083      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1084      1.1     skrll 	 16,			/* bitsize */
   1085      1.1     skrll 	 FALSE,			/* pc_relative */
   1086      1.1     skrll 	 0,			/* bitpos */
   1087      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1088      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1089      1.1     skrll 	 "R_M32R_GOTPC_HI_ULO",	/* name */
   1090      1.1     skrll 	 FALSE,			/* partial_inplace */
   1091      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1092      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1093      1.1     skrll 	 TRUE),			/* pcrel_offset */
   1094      1.1     skrll 
   1095      1.1     skrll   /* An PC Relative relocation used when setting PIC offset table register.
   1096      1.1     skrll      Like R_M32R_HI16_SLO, but referring to the GOT table entry for
   1097      1.1     skrll      the symbol.  */
   1098      1.1     skrll   HOWTO (R_M32R_GOTPC_HI_SLO,	/* type */
   1099      1.1     skrll 	 16,			/* rightshift */
   1100      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1101      1.1     skrll 	 16,			/* bitsize */
   1102      1.1     skrll 	 FALSE,			/* pc_relative */
   1103      1.1     skrll 	 0,			/* bitpos */
   1104      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1105      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1106      1.1     skrll 	 "R_M32R_GOTPC_HI_SLO",	/* name */
   1107      1.1     skrll 	 FALSE,			/* partial_inplace */
   1108      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1109      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1110      1.1     skrll 	 TRUE),			/* pcrel_offset */
   1111      1.1     skrll 
   1112      1.1     skrll   /* An PC Relative relocation used when setting PIC offset table register.
   1113      1.1     skrll      Like R_M32R_LO16, but referring to the GOT table entry for
   1114      1.1     skrll      the symbol.  */
   1115      1.1     skrll   HOWTO (R_M32R_GOTPC_LO,	/* type */
   1116      1.1     skrll 	 0,			/* rightshift */
   1117      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1118      1.1     skrll 	 16,			/* bitsize */
   1119      1.1     skrll 	 FALSE,			/* pc_relative */
   1120      1.1     skrll 	 0,			/* bitpos */
   1121      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1122      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1123      1.1     skrll 	 "R_M32R_GOTPC_LO",	/* name */
   1124      1.1     skrll 	 FALSE,			/* partial_inplace */
   1125      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1126      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1127      1.1     skrll 	 TRUE),			/* pcrel_offset */
   1128      1.1     skrll 
   1129      1.1     skrll   HOWTO (R_M32R_GOTOFF_HI_ULO,	/* type */
   1130      1.1     skrll 	 16,			/* rightshift */
   1131      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1132      1.1     skrll 	 16,			/* bitsize */
   1133      1.1     skrll 	 FALSE,			/* pc_relative */
   1134      1.1     skrll 	 0,			/* bitpos */
   1135      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1136      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1137      1.1     skrll 	 "R_M32R_GOTOFF_HI_ULO",/* name */
   1138      1.1     skrll 	 FALSE,			/* partial_inplace */
   1139      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1140      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1141      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1142      1.1     skrll 
   1143      1.1     skrll   HOWTO (R_M32R_GOTOFF_HI_SLO,	/* type */
   1144      1.1     skrll 	 16,			/* rightshift */
   1145      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1146      1.1     skrll 	 16,			/* bitsize */
   1147      1.1     skrll 	 FALSE,			/* pc_relative */
   1148      1.1     skrll 	 0,			/* bitpos */
   1149      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1150      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1151      1.1     skrll 	 "R_M32R_GOTOFF_HI_SLO",/* name */
   1152      1.1     skrll 	 FALSE,			/* partial_inplace */
   1153      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1154      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1155      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1156      1.1     skrll 
   1157      1.1     skrll   HOWTO (R_M32R_GOTOFF_LO,	/* type */
   1158      1.1     skrll 	 0,			/* rightshift */
   1159      1.1     skrll 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1160      1.1     skrll 	 16,			/* bitsize */
   1161      1.1     skrll 	 FALSE,			/* pc_relative */
   1162      1.1     skrll 	 0,			/* bitpos */
   1163      1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
   1164      1.1     skrll 	 bfd_elf_generic_reloc,	/* special_function */
   1165      1.1     skrll 	 "R_M32R_GOTOFF_LO",	/* name */
   1166      1.1     skrll 	 FALSE,			/* partial_inplace */
   1167      1.1     skrll 	 0x0000ffff,		/* src_mask */
   1168      1.1     skrll 	 0x0000ffff,		/* dst_mask */
   1169      1.1     skrll 	 FALSE),		/* pcrel_offset */
   1170      1.1     skrll };
   1171      1.1     skrll 
   1172      1.1     skrll /* Map BFD reloc types to M32R ELF reloc types.  */
   1173      1.1     skrll 
   1174      1.1     skrll struct m32r_reloc_map
   1175      1.1     skrll {
   1176      1.1     skrll   bfd_reloc_code_real_type bfd_reloc_val;
   1177      1.1     skrll   unsigned char elf_reloc_val;
   1178      1.1     skrll };
   1179      1.1     skrll 
   1180      1.1     skrll #ifdef USE_M32R_OLD_RELOC
   1181      1.1     skrll static const struct m32r_reloc_map m32r_reloc_map_old[] =
   1182      1.1     skrll {
   1183      1.1     skrll   { BFD_RELOC_NONE, R_M32R_NONE },
   1184      1.1     skrll   { BFD_RELOC_16, R_M32R_16 },
   1185      1.1     skrll   { BFD_RELOC_32, R_M32R_32 },
   1186      1.1     skrll   { BFD_RELOC_M32R_24, R_M32R_24 },
   1187      1.1     skrll   { BFD_RELOC_M32R_10_PCREL, R_M32R_10_PCREL },
   1188      1.1     skrll   { BFD_RELOC_M32R_18_PCREL, R_M32R_18_PCREL },
   1189      1.1     skrll   { BFD_RELOC_M32R_26_PCREL, R_M32R_26_PCREL },
   1190      1.1     skrll   { BFD_RELOC_M32R_HI16_ULO, R_M32R_HI16_ULO },
   1191      1.1     skrll   { BFD_RELOC_M32R_HI16_SLO, R_M32R_HI16_SLO },
   1192      1.1     skrll   { BFD_RELOC_M32R_LO16, R_M32R_LO16 },
   1193      1.1     skrll   { BFD_RELOC_M32R_SDA16, R_M32R_SDA16 },
   1194      1.1     skrll   { BFD_RELOC_VTABLE_INHERIT, R_M32R_GNU_VTINHERIT },
   1195      1.1     skrll   { BFD_RELOC_VTABLE_ENTRY, R_M32R_GNU_VTENTRY },
   1196      1.1     skrll };
   1197      1.1     skrll #else
   1198      1.1     skrll static const struct m32r_reloc_map m32r_reloc_map[] =
   1199      1.1     skrll {
   1200      1.1     skrll   { BFD_RELOC_NONE, R_M32R_NONE },
   1201      1.1     skrll   { BFD_RELOC_16, R_M32R_16_RELA },
   1202      1.1     skrll   { BFD_RELOC_32, R_M32R_32_RELA },
   1203      1.1     skrll   { BFD_RELOC_M32R_24, R_M32R_24_RELA },
   1204      1.1     skrll   { BFD_RELOC_M32R_10_PCREL, R_M32R_10_PCREL_RELA },
   1205      1.1     skrll   { BFD_RELOC_M32R_18_PCREL, R_M32R_18_PCREL_RELA },
   1206      1.1     skrll   { BFD_RELOC_M32R_26_PCREL, R_M32R_26_PCREL_RELA },
   1207      1.1     skrll   { BFD_RELOC_M32R_HI16_ULO, R_M32R_HI16_ULO_RELA },
   1208      1.1     skrll   { BFD_RELOC_M32R_HI16_SLO, R_M32R_HI16_SLO_RELA },
   1209      1.1     skrll   { BFD_RELOC_M32R_LO16, R_M32R_LO16_RELA },
   1210      1.1     skrll   { BFD_RELOC_M32R_SDA16, R_M32R_SDA16_RELA },
   1211      1.1     skrll   { BFD_RELOC_VTABLE_INHERIT, R_M32R_RELA_GNU_VTINHERIT },
   1212      1.1     skrll   { BFD_RELOC_VTABLE_ENTRY, R_M32R_RELA_GNU_VTENTRY },
   1213      1.1     skrll   { BFD_RELOC_32_PCREL, R_M32R_REL32 },
   1214      1.1     skrll 
   1215      1.1     skrll   { BFD_RELOC_M32R_GOT24, R_M32R_GOT24 },
   1216      1.1     skrll   { BFD_RELOC_M32R_26_PLTREL, R_M32R_26_PLTREL },
   1217      1.1     skrll   { BFD_RELOC_M32R_COPY, R_M32R_COPY },
   1218      1.1     skrll   { BFD_RELOC_M32R_GLOB_DAT, R_M32R_GLOB_DAT },
   1219      1.1     skrll   { BFD_RELOC_M32R_JMP_SLOT, R_M32R_JMP_SLOT },
   1220      1.1     skrll   { BFD_RELOC_M32R_RELATIVE, R_M32R_RELATIVE },
   1221      1.1     skrll   { BFD_RELOC_M32R_GOTOFF, R_M32R_GOTOFF },
   1222      1.1     skrll   { BFD_RELOC_M32R_GOTPC24, R_M32R_GOTPC24 },
   1223      1.1     skrll   { BFD_RELOC_M32R_GOT16_HI_ULO, R_M32R_GOT16_HI_ULO },
   1224      1.1     skrll   { BFD_RELOC_M32R_GOT16_HI_SLO, R_M32R_GOT16_HI_SLO },
   1225      1.1     skrll   { BFD_RELOC_M32R_GOT16_LO, R_M32R_GOT16_LO },
   1226      1.1     skrll   { BFD_RELOC_M32R_GOTPC_HI_ULO, R_M32R_GOTPC_HI_ULO },
   1227      1.1     skrll   { BFD_RELOC_M32R_GOTPC_HI_SLO, R_M32R_GOTPC_HI_SLO },
   1228      1.1     skrll   { BFD_RELOC_M32R_GOTPC_LO, R_M32R_GOTPC_LO },
   1229      1.1     skrll   { BFD_RELOC_M32R_GOTOFF_HI_ULO, R_M32R_GOTOFF_HI_ULO },
   1230      1.1     skrll   { BFD_RELOC_M32R_GOTOFF_HI_SLO, R_M32R_GOTOFF_HI_SLO },
   1231      1.1     skrll   { BFD_RELOC_M32R_GOTOFF_LO, R_M32R_GOTOFF_LO },
   1232      1.1     skrll };
   1233      1.1     skrll #endif
   1234      1.1     skrll 
   1235      1.1     skrll static reloc_howto_type *
   1236      1.1     skrll bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1237      1.1     skrll 				 bfd_reloc_code_real_type code)
   1238      1.1     skrll {
   1239      1.1     skrll   unsigned int i;
   1240      1.1     skrll 
   1241      1.1     skrll #ifdef USE_M32R_OLD_RELOC
   1242      1.1     skrll   for (i = 0;
   1243      1.1     skrll        i < sizeof (m32r_reloc_map_old) / sizeof (struct m32r_reloc_map);
   1244      1.1     skrll        i++)
   1245      1.1     skrll     if (m32r_reloc_map_old[i].bfd_reloc_val == code)
   1246      1.1     skrll       return &m32r_elf_howto_table[m32r_reloc_map_old[i].elf_reloc_val];
   1247      1.1     skrll 
   1248      1.1     skrll #else /* ! USE_M32R_OLD_RELOC */
   1249      1.1     skrll 
   1250      1.1     skrll   for (i = 0;
   1251      1.1     skrll        i < sizeof (m32r_reloc_map) / sizeof (struct m32r_reloc_map);
   1252      1.1     skrll        i++)
   1253      1.1     skrll     if (m32r_reloc_map[i].bfd_reloc_val == code)
   1254      1.1     skrll       return &m32r_elf_howto_table[m32r_reloc_map[i].elf_reloc_val];
   1255      1.1     skrll #endif
   1256      1.1     skrll 
   1257      1.1     skrll   return NULL;
   1258      1.1     skrll }
   1259      1.1     skrll 
   1260      1.1     skrll static reloc_howto_type *
   1261      1.1     skrll bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1262      1.1     skrll 				 const char *r_name)
   1263      1.1     skrll {
   1264      1.1     skrll   unsigned int i;
   1265      1.1     skrll 
   1266      1.1     skrll   for (i = 0;
   1267      1.1     skrll        i < sizeof (m32r_elf_howto_table) / sizeof (m32r_elf_howto_table[0]);
   1268      1.1     skrll        i++)
   1269      1.1     skrll     if (m32r_elf_howto_table[i].name != NULL
   1270      1.1     skrll 	&& strcasecmp (m32r_elf_howto_table[i].name, r_name) == 0)
   1271      1.1     skrll       return &m32r_elf_howto_table[i];
   1272      1.1     skrll 
   1273      1.1     skrll   return NULL;
   1274      1.1     skrll }
   1275      1.1     skrll 
   1276      1.1     skrll /* Set the howto pointer for an M32R ELF reloc.  */
   1277      1.1     skrll 
   1278      1.1     skrll static void
   1279      1.1     skrll m32r_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
   1280      1.1     skrll 			arelent *cache_ptr,
   1281      1.1     skrll 			Elf_Internal_Rela *dst)
   1282      1.1     skrll {
   1283      1.1     skrll   unsigned int r_type;
   1284      1.1     skrll 
   1285      1.1     skrll   r_type = ELF32_R_TYPE (dst->r_info);
   1286      1.1     skrll   BFD_ASSERT (ELF32_R_TYPE(dst->r_info) <= (unsigned int) R_M32R_GNU_VTENTRY);
   1287      1.1     skrll   cache_ptr->howto = &m32r_elf_howto_table[r_type];
   1288      1.1     skrll }
   1289      1.1     skrll 
   1290      1.1     skrll static void
   1291      1.1     skrll m32r_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
   1292      1.1     skrll 		    arelent *cache_ptr,
   1293      1.1     skrll 		    Elf_Internal_Rela *dst)
   1294      1.1     skrll {
   1295      1.1     skrll   BFD_ASSERT ((ELF32_R_TYPE(dst->r_info) == (unsigned int) R_M32R_NONE)
   1296      1.1     skrll               || ((ELF32_R_TYPE(dst->r_info) > (unsigned int) R_M32R_GNU_VTENTRY)
   1297      1.1     skrll                   && (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_M32R_max)));
   1298      1.1     skrll   cache_ptr->howto = &m32r_elf_howto_table[ELF32_R_TYPE(dst->r_info)];
   1299      1.1     skrll }
   1300      1.1     skrll 
   1301      1.1     skrll 
   1302      1.1     skrll /* Given a BFD section, try to locate the corresponding ELF section
   1304      1.1     skrll    index.  */
   1305      1.1     skrll 
   1306      1.1     skrll static bfd_boolean
   1307      1.1     skrll _bfd_m32r_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
   1308      1.1     skrll 					asection *sec,
   1309      1.1     skrll 					int *retval)
   1310      1.1     skrll {
   1311      1.1     skrll   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
   1312      1.1     skrll     {
   1313      1.1     skrll       *retval = SHN_M32R_SCOMMON;
   1314      1.1     skrll       return TRUE;
   1315      1.1     skrll     }
   1316      1.1     skrll   return FALSE;
   1317      1.1     skrll }
   1318      1.1     skrll 
   1319      1.1     skrll /* M32R ELF uses two common sections.  One is the usual one, and the other
   1320      1.1     skrll    is for small objects.  All the small objects are kept together, and then
   1321      1.1     skrll    referenced via one register, which yields faster assembler code.  It is
   1322      1.1     skrll    up to the compiler to emit an instruction to load the register with
   1323      1.1     skrll    _SDA_BASE.  This is what we use for the small common section.  This
   1324      1.1     skrll    approach is copied from elf32-mips.c.  */
   1325      1.1     skrll static asection m32r_elf_scom_section;
   1326      1.1     skrll static asymbol m32r_elf_scom_symbol;
   1327      1.1     skrll static asymbol *m32r_elf_scom_symbol_ptr;
   1328      1.1     skrll 
   1329      1.1     skrll /* Handle the special M32R section numbers that a symbol may use.  */
   1330      1.1     skrll 
   1331      1.1     skrll static void
   1332      1.1     skrll _bfd_m32r_elf_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
   1333      1.1     skrll {
   1334      1.1     skrll   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
   1335      1.1     skrll 
   1336      1.1     skrll   switch (elfsym->internal_elf_sym.st_shndx)
   1337      1.1     skrll     {
   1338      1.1     skrll     case SHN_M32R_SCOMMON:
   1339      1.1     skrll       if (m32r_elf_scom_section.name == NULL)
   1340      1.1     skrll 	{
   1341      1.1     skrll 	  /* Initialize the small common section.  */
   1342      1.1     skrll 	  m32r_elf_scom_section.name = ".scommon";
   1343      1.1     skrll 	  m32r_elf_scom_section.flags = SEC_IS_COMMON;
   1344      1.1     skrll 	  m32r_elf_scom_section.output_section = &m32r_elf_scom_section;
   1345      1.1     skrll 	  m32r_elf_scom_section.symbol = &m32r_elf_scom_symbol;
   1346      1.1     skrll 	  m32r_elf_scom_section.symbol_ptr_ptr = &m32r_elf_scom_symbol_ptr;
   1347      1.1     skrll 	  m32r_elf_scom_symbol.name = ".scommon";
   1348      1.1     skrll 	  m32r_elf_scom_symbol.flags = BSF_SECTION_SYM;
   1349      1.1     skrll 	  m32r_elf_scom_symbol.section = &m32r_elf_scom_section;
   1350      1.1     skrll 	  m32r_elf_scom_symbol_ptr = &m32r_elf_scom_symbol;
   1351      1.1     skrll 	}
   1352      1.1     skrll       asym->section = &m32r_elf_scom_section;
   1353      1.1     skrll       asym->value = elfsym->internal_elf_sym.st_size;
   1354      1.1     skrll       break;
   1355      1.1     skrll     }
   1356      1.1     skrll }
   1357      1.1     skrll 
   1358      1.1     skrll /* Hook called by the linker routine which adds symbols from an object
   1359      1.1     skrll    file.  We must handle the special M32R section numbers here.
   1360      1.1     skrll    We also keep watching for whether we need to create the sdata special
   1361      1.1     skrll    linker sections.  */
   1362      1.1     skrll 
   1363      1.1     skrll static bfd_boolean
   1364      1.1     skrll m32r_elf_add_symbol_hook (bfd *abfd,
   1365      1.1     skrll 			  struct bfd_link_info *info,
   1366      1.1     skrll 			  Elf_Internal_Sym *sym,
   1367      1.1     skrll 			  const char **namep,
   1368      1.1     skrll 			  flagword *flagsp ATTRIBUTE_UNUSED,
   1369      1.1     skrll 			  asection **secp,
   1370      1.1     skrll 			  bfd_vma *valp)
   1371      1.1     skrll {
   1372      1.1     skrll   if (! info->relocatable
   1373      1.1     skrll       && (*namep)[0] == '_' && (*namep)[1] == 'S'
   1374      1.1     skrll       && strcmp (*namep, "_SDA_BASE_") == 0
   1375      1.1     skrll       && is_elf_hash_table (info->hash))
   1376      1.1     skrll     {
   1377      1.1     skrll       /* This is simpler than using _bfd_elf_create_linker_section
   1378      1.1     skrll 	 (our needs are simpler than ppc's needs).  Also
   1379      1.1     skrll 	 _bfd_elf_create_linker_section currently has a bug where if a .sdata
   1380      1.1     skrll 	 section already exists a new one is created that follows it which
   1381      1.1     skrll 	 screws of _SDA_BASE_ address calcs because output_offset != 0.  */
   1382      1.1     skrll       struct elf_link_hash_entry *h;
   1383      1.1     skrll       struct bfd_link_hash_entry *bh;
   1384      1.1     skrll       asection *s = bfd_get_section_by_name (abfd, ".sdata");
   1385      1.1     skrll 
   1386      1.1     skrll       /* The following code was cobbled from elf32-ppc.c and elflink.c.  */
   1387      1.1     skrll       if (s == NULL)
   1388      1.1     skrll 	{
   1389      1.1     skrll 	  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
   1390      1.1     skrll 			    | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   1391      1.1     skrll 
   1392      1.1     skrll 	  s = bfd_make_section_anyway_with_flags (abfd, ".sdata",
   1393      1.1     skrll 						  flags);
   1394      1.1     skrll 	  if (s == NULL)
   1395      1.1     skrll 	    return FALSE;
   1396      1.1     skrll 	  bfd_set_section_alignment (abfd, s, 2);
   1397      1.1     skrll 	}
   1398      1.1     skrll 
   1399      1.1     skrll       bh = bfd_link_hash_lookup (info->hash, "_SDA_BASE_",
   1400      1.1     skrll 				 FALSE, FALSE, FALSE);
   1401      1.1     skrll 
   1402      1.1     skrll       if ((bh == NULL || bh->type == bfd_link_hash_undefined)
   1403      1.1     skrll 	  && !(_bfd_generic_link_add_one_symbol (info,
   1404      1.1     skrll 						 abfd,
   1405      1.1     skrll 						 "_SDA_BASE_",
   1406      1.1     skrll 						 BSF_GLOBAL,
   1407      1.1     skrll 						 s,
   1408      1.1     skrll 						 (bfd_vma) 32768,
   1409      1.1     skrll 						 NULL,
   1410      1.1     skrll 						 FALSE,
   1411      1.1     skrll 						 get_elf_backend_data (abfd)->collect,
   1412      1.1     skrll 						 &bh)))
   1413      1.1     skrll 	return FALSE;
   1414      1.1     skrll       h = (struct elf_link_hash_entry *) bh;
   1415      1.1     skrll       h->type = STT_OBJECT;
   1416      1.1     skrll     }
   1417      1.1     skrll 
   1418      1.1     skrll   switch (sym->st_shndx)
   1419      1.1     skrll     {
   1420      1.1     skrll     case SHN_M32R_SCOMMON:
   1421      1.1     skrll       *secp = bfd_make_section_old_way (abfd, ".scommon");
   1422      1.1     skrll       (*secp)->flags |= SEC_IS_COMMON;
   1423      1.1     skrll       *valp = sym->st_size;
   1424      1.1     skrll       break;
   1425      1.1     skrll     }
   1426      1.1     skrll 
   1427      1.1     skrll   return TRUE;
   1428      1.1     skrll }
   1429      1.1     skrll 
   1430      1.1     skrll /* We have to figure out the SDA_BASE value, so that we can adjust the
   1431      1.1     skrll    symbol value correctly.  We look up the symbol _SDA_BASE_ in the output
   1432      1.1     skrll    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   1433      1.1     skrll    target data.  We don't need to adjust the symbol value for an
   1434      1.1     skrll    external symbol if we are producing relocatable output.  */
   1435      1.1     skrll 
   1436      1.1     skrll static bfd_reloc_status_type
   1437      1.1     skrll m32r_elf_final_sda_base (bfd *output_bfd,
   1438      1.1     skrll 			 struct bfd_link_info *info,
   1439      1.1     skrll 			 const char **error_message,
   1440      1.1     skrll 			 bfd_vma *psb)
   1441      1.1     skrll {
   1442      1.1     skrll   if (elf_gp (output_bfd) == 0)
   1443      1.1     skrll     {
   1444      1.1     skrll       struct bfd_link_hash_entry *h;
   1445      1.1     skrll 
   1446      1.1     skrll       h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
   1447      1.1     skrll       if (h != NULL && h->type == bfd_link_hash_defined)
   1448      1.1     skrll 	elf_gp (output_bfd) = (h->u.def.value
   1449      1.1     skrll 			       + h->u.def.section->output_section->vma
   1450      1.1     skrll 			       + h->u.def.section->output_offset);
   1451      1.1     skrll       else
   1452      1.1     skrll 	{
   1453      1.1     skrll 	  /* Only get the error once.  */
   1454      1.1     skrll 	  *psb = elf_gp (output_bfd) = 4;
   1455      1.1     skrll 	  *error_message =
   1456      1.1     skrll 	    (const char *) _("SDA relocation when _SDA_BASE_ not defined");
   1457      1.1     skrll 	  return bfd_reloc_dangerous;
   1458      1.1     skrll 	}
   1459      1.1     skrll     }
   1460      1.1     skrll   *psb = elf_gp (output_bfd);
   1461      1.1     skrll   return bfd_reloc_ok;
   1462      1.1     skrll }
   1463      1.1     skrll 
   1464      1.1     skrll /* Return size of a PLT entry.  */
   1466      1.1     skrll #define elf_m32r_sizeof_plt(info) PLT_ENTRY_SIZE
   1467      1.1     skrll 
   1468      1.1     skrll /* The m32r linker needs to keep track of the number of relocs that it
   1469      1.1     skrll    decides to copy in check_relocs for each symbol.  This is so that
   1470      1.1     skrll    it can discard PC relative relocs if it doesn't need them when
   1471      1.1     skrll    linking with -Bsymbolic.  We store the information in a field
   1472      1.1     skrll    extending the regular ELF linker hash table.  */
   1473      1.1     skrll 
   1474      1.1     skrll /* This structure keeps track of the number of PC relative relocs we
   1475      1.1     skrll    have copied for a given symbol.  */
   1476      1.1     skrll 
   1477      1.1     skrll struct elf_m32r_pcrel_relocs_copied
   1478      1.1     skrll {
   1479      1.1     skrll   /* Next section.  */
   1480      1.1     skrll   struct elf_m32r_pcrel_relocs_copied *next;
   1481      1.1     skrll   /* A section in dynobj.  */
   1482      1.1     skrll   asection *section;
   1483      1.1     skrll   /* Number of relocs copied in this section.  */
   1484      1.1     skrll   bfd_size_type count;
   1485      1.1     skrll };
   1486      1.1     skrll 
   1487      1.1     skrll /* The sh linker needs to keep track of the number of relocs that it
   1488      1.1     skrll    decides to copy as dynamic relocs in check_relocs for each symbol.
   1489      1.1     skrll    This is so that it can later discard them if they are found to be
   1490      1.1     skrll    unnecessary.  We store the information in a field extending the
   1491      1.1     skrll    regular ELF linker hash table.  */
   1492      1.1     skrll 
   1493      1.1     skrll struct elf_m32r_dyn_relocs
   1494      1.1     skrll {
   1495      1.1     skrll   struct elf_m32r_dyn_relocs *next;
   1496      1.1     skrll 
   1497      1.1     skrll   /* The input section of the reloc.  */
   1498      1.1     skrll   asection *sec;
   1499      1.1     skrll 
   1500      1.1     skrll   /* Total number of relocs copied for the input section.  */
   1501      1.1     skrll   bfd_size_type count;
   1502      1.1     skrll 
   1503      1.1     skrll   /* Number of pc-relative relocs copied for the input section.  */
   1504      1.1     skrll   bfd_size_type pc_count;
   1505      1.1     skrll };
   1506      1.1     skrll 
   1507      1.1     skrll 
   1508      1.1     skrll /* m32r ELF linker hash entry.  */
   1509      1.1     skrll 
   1510      1.1     skrll struct elf_m32r_link_hash_entry
   1511      1.1     skrll {
   1512      1.1     skrll   struct elf_link_hash_entry root;
   1513      1.1     skrll 
   1514      1.1     skrll   /* Track dynamic relocs copied for this symbol.  */
   1515      1.1     skrll   struct elf_m32r_dyn_relocs *dyn_relocs;
   1516      1.1     skrll };
   1517      1.1     skrll 
   1518      1.1     skrll /* m32r ELF linker hash table.  */
   1519      1.1     skrll 
   1520      1.1     skrll struct elf_m32r_link_hash_table
   1521      1.1     skrll {
   1522      1.1     skrll   struct elf_link_hash_table root;
   1523      1.1     skrll 
   1524      1.1     skrll   /* Short-cuts to get to dynamic linker sections.  */
   1525      1.1     skrll   asection *sgot;
   1526      1.1     skrll   asection *sgotplt;
   1527      1.1     skrll   asection *srelgot;
   1528      1.1     skrll   asection *splt;
   1529  1.1.1.2  christos   asection *srelplt;
   1530  1.1.1.2  christos   asection *sdynbss;
   1531      1.1     skrll   asection *srelbss;
   1532      1.1     skrll 
   1533      1.1     skrll   /* Small local sym cache.  */
   1534      1.1     skrll   struct sym_cache sym_cache;
   1535      1.1     skrll };
   1536      1.1     skrll 
   1537      1.1     skrll /* Traverse an m32r ELF linker hash table.  */
   1538      1.1     skrll 
   1539      1.1     skrll #define m32r_elf_link_hash_traverse(table, func, info)			\
   1540      1.1     skrll   (elf_link_hash_traverse						\
   1541      1.1     skrll    (&(table)->root,							\
   1542      1.1     skrll     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),	\
   1543      1.1     skrll     (info)))
   1544  1.1.1.2  christos 
   1545  1.1.1.2  christos /* Get the m32r ELF linker hash table from a link_info structure.  */
   1546      1.1     skrll 
   1547      1.1     skrll #define m32r_elf_hash_table(p) \
   1548      1.1     skrll   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
   1549      1.1     skrll   == M32R_ELF_DATA ? ((struct elf_m32r_link_hash_table *) ((p)->hash)) : NULL)
   1550      1.1     skrll 
   1551      1.1     skrll /* Create an entry in an m32r ELF linker hash table.  */
   1552      1.1     skrll 
   1553      1.1     skrll static struct bfd_hash_entry *
   1554      1.1     skrll m32r_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
   1555      1.1     skrll 			    struct bfd_hash_table *table,
   1556      1.1     skrll 			    const char *string)
   1557      1.1     skrll {
   1558      1.1     skrll   struct elf_m32r_link_hash_entry *ret =
   1559      1.1     skrll     (struct elf_m32r_link_hash_entry *) entry;
   1560      1.1     skrll 
   1561      1.1     skrll   /* Allocate the structure if it has not already been allocated by a
   1562      1.1     skrll      subclass.  */
   1563      1.1     skrll   if (ret == NULL)
   1564      1.1     skrll     ret = bfd_hash_allocate (table,
   1565      1.1     skrll 			     sizeof (struct elf_m32r_link_hash_entry));
   1566      1.1     skrll   if (ret == NULL)
   1567      1.1     skrll     return NULL;
   1568      1.1     skrll 
   1569      1.1     skrll   /* Call the allocation method of the superclass.  */
   1570      1.1     skrll   ret = ((struct elf_m32r_link_hash_entry *)
   1571      1.1     skrll          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   1572      1.1     skrll                                      table, string));
   1573      1.1     skrll   if (ret != NULL)
   1574      1.1     skrll     {
   1575      1.1     skrll       struct elf_m32r_link_hash_entry *eh;
   1576      1.1     skrll 
   1577      1.1     skrll       eh = (struct elf_m32r_link_hash_entry *) ret;
   1578      1.1     skrll       eh->dyn_relocs = NULL;
   1579      1.1     skrll     }
   1580      1.1     skrll 
   1581      1.1     skrll   return (struct bfd_hash_entry *) ret;
   1582      1.1     skrll }
   1583      1.1     skrll 
   1584      1.1     skrll /* Create an m32r ELF linker hash table.  */
   1585      1.1     skrll 
   1586      1.1     skrll static struct bfd_link_hash_table *
   1587      1.1     skrll m32r_elf_link_hash_table_create (bfd *abfd)
   1588      1.1     skrll {
   1589      1.1     skrll   struct elf_m32r_link_hash_table *ret;
   1590      1.1     skrll   bfd_size_type amt = sizeof (struct elf_m32r_link_hash_table);
   1591      1.1     skrll 
   1592      1.1     skrll   ret = bfd_malloc (amt);
   1593      1.1     skrll   if (ret == NULL)
   1594  1.1.1.2  christos     return NULL;
   1595  1.1.1.2  christos 
   1596      1.1     skrll   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
   1597      1.1     skrll 				      m32r_elf_link_hash_newfunc,
   1598      1.1     skrll 				      sizeof (struct elf_m32r_link_hash_entry),
   1599      1.1     skrll 				      M32R_ELF_DATA))
   1600      1.1     skrll     {
   1601      1.1     skrll       free (ret);
   1602      1.1     skrll       return NULL;
   1603      1.1     skrll     }
   1604      1.1     skrll 
   1605      1.1     skrll   ret->sgot = NULL;
   1606      1.1     skrll   ret->sgotplt = NULL;
   1607      1.1     skrll   ret->srelgot = NULL;
   1608  1.1.1.2  christos   ret->splt = NULL;
   1609      1.1     skrll   ret->srelplt = NULL;
   1610      1.1     skrll   ret->sdynbss = NULL;
   1611      1.1     skrll   ret->srelbss = NULL;
   1612      1.1     skrll   ret->sym_cache.abfd = NULL;
   1613      1.1     skrll 
   1614      1.1     skrll   return &ret->root.root;
   1615      1.1     skrll }
   1616      1.1     skrll 
   1617      1.1     skrll /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
   1618      1.1     skrll    shortcuts to them in our hash table.  */
   1619      1.1     skrll 
   1620      1.1     skrll static bfd_boolean
   1621      1.1     skrll create_got_section (bfd *dynobj, struct bfd_link_info *info)
   1622      1.1     skrll {
   1623      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   1624      1.1     skrll 
   1625  1.1.1.2  christos   if (! _bfd_elf_create_got_section (dynobj, info))
   1626  1.1.1.2  christos     return FALSE;
   1627  1.1.1.2  christos 
   1628      1.1     skrll   htab = m32r_elf_hash_table (info);
   1629      1.1     skrll   if (htab == NULL)
   1630  1.1.1.2  christos     return FALSE;
   1631  1.1.1.2  christos 
   1632      1.1     skrll   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
   1633      1.1     skrll   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
   1634      1.1     skrll   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   1635      1.1     skrll   if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
   1636      1.1     skrll     abort ();
   1637      1.1     skrll 
   1638      1.1     skrll   return TRUE;
   1639      1.1     skrll }
   1640      1.1     skrll 
   1641      1.1     skrll /* Create dynamic sections when linking against a dynamic object.  */
   1642      1.1     skrll 
   1643      1.1     skrll static bfd_boolean
   1644      1.1     skrll m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   1645      1.1     skrll {
   1646      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   1647      1.1     skrll   flagword flags, pltflags;
   1648      1.1     skrll   asection *s;
   1649  1.1.1.2  christos   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   1650  1.1.1.2  christos   int ptralign = 2; /* 32bit */
   1651      1.1     skrll 
   1652      1.1     skrll   htab = m32r_elf_hash_table (info);
   1653      1.1     skrll   if (htab == NULL)
   1654      1.1     skrll     return FALSE;
   1655      1.1     skrll 
   1656      1.1     skrll   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
   1657      1.1     skrll      .rel[a].bss sections.  */
   1658      1.1     skrll   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   1659      1.1     skrll            | SEC_LINKER_CREATED);
   1660      1.1     skrll 
   1661      1.1     skrll   pltflags = flags;
   1662      1.1     skrll   pltflags |= SEC_CODE;
   1663      1.1     skrll   if (bed->plt_not_loaded)
   1664      1.1     skrll     pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
   1665      1.1     skrll   if (bed->plt_readonly)
   1666      1.1     skrll     pltflags |= SEC_READONLY;
   1667      1.1     skrll 
   1668      1.1     skrll   s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
   1669      1.1     skrll   htab->splt = s;
   1670      1.1     skrll   if (s == NULL
   1671      1.1     skrll       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
   1672      1.1     skrll     return FALSE;
   1673      1.1     skrll 
   1674      1.1     skrll   if (bed->want_plt_sym)
   1675      1.1     skrll     {
   1676      1.1     skrll       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
   1677      1.1     skrll          .plt section.  */
   1678      1.1     skrll       struct bfd_link_hash_entry *bh = NULL;
   1679      1.1     skrll       struct elf_link_hash_entry *h;
   1680      1.1     skrll 
   1681      1.1     skrll       if (! (_bfd_generic_link_add_one_symbol
   1682      1.1     skrll              (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
   1683      1.1     skrll               (bfd_vma) 0, NULL, FALSE,
   1684      1.1     skrll               get_elf_backend_data (abfd)->collect, &bh)))
   1685      1.1     skrll         return FALSE;
   1686      1.1     skrll       h = (struct elf_link_hash_entry *) bh;
   1687      1.1     skrll       h->def_regular = 1;
   1688      1.1     skrll       h->type = STT_OBJECT;
   1689      1.1     skrll       htab->root.hplt = h;
   1690      1.1     skrll 
   1691      1.1     skrll       if (info->shared
   1692      1.1     skrll           && ! bfd_elf_link_record_dynamic_symbol (info, h))
   1693      1.1     skrll         return FALSE;
   1694      1.1     skrll     }
   1695      1.1     skrll 
   1696      1.1     skrll   s = bfd_make_section_with_flags (abfd,
   1697      1.1     skrll 				   bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
   1698      1.1     skrll 				   flags | SEC_READONLY);
   1699      1.1     skrll   htab->srelplt = s;
   1700      1.1     skrll   if (s == NULL
   1701      1.1     skrll       || ! bfd_set_section_alignment (abfd, s, ptralign))
   1702      1.1     skrll     return FALSE;
   1703      1.1     skrll 
   1704      1.1     skrll   if (htab->sgot == NULL
   1705      1.1     skrll       && ! create_got_section (abfd, info))
   1706      1.1     skrll     return FALSE;
   1707      1.1     skrll 
   1708      1.1     skrll   {
   1709      1.1     skrll     const char *secname;
   1710      1.1     skrll     char *relname;
   1711      1.1     skrll     flagword secflags;
   1712      1.1     skrll     asection *sec;
   1713      1.1     skrll 
   1714      1.1     skrll     for (sec = abfd->sections; sec; sec = sec->next)
   1715      1.1     skrll       {
   1716      1.1     skrll         secflags = bfd_get_section_flags (abfd, sec);
   1717      1.1     skrll         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
   1718      1.1     skrll             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
   1719      1.1     skrll           continue;
   1720      1.1     skrll         secname = bfd_get_section_name (abfd, sec);
   1721      1.1     skrll         relname = bfd_malloc ((bfd_size_type) strlen (secname) + 6);
   1722      1.1     skrll         strcpy (relname, ".rela");
   1723      1.1     skrll         strcat (relname, secname);
   1724      1.1     skrll         if (bfd_get_section_by_name (abfd, secname))
   1725      1.1     skrll           continue;
   1726      1.1     skrll         s = bfd_make_section_with_flags (abfd, relname,
   1727      1.1     skrll 					 flags | SEC_READONLY);
   1728      1.1     skrll         if (s == NULL
   1729      1.1     skrll             || ! bfd_set_section_alignment (abfd, s, ptralign))
   1730      1.1     skrll           return FALSE;
   1731      1.1     skrll       }
   1732      1.1     skrll   }
   1733      1.1     skrll 
   1734      1.1     skrll   if (bed->want_dynbss)
   1735      1.1     skrll     {
   1736      1.1     skrll       /* The .dynbss section is a place to put symbols which are defined
   1737      1.1     skrll          by dynamic objects, are referenced by regular objects, and are
   1738      1.1     skrll          not functions.  We must allocate space for them in the process
   1739      1.1     skrll          image and use a R_*_COPY reloc to tell the dynamic linker to
   1740      1.1     skrll          initialize them at run time.  The linker script puts the .dynbss
   1741      1.1     skrll          section into the .bss section of the final image.  */
   1742      1.1     skrll       s = bfd_make_section_with_flags (abfd, ".dynbss",
   1743      1.1     skrll 				       SEC_ALLOC | SEC_LINKER_CREATED);
   1744      1.1     skrll       htab->sdynbss = s;
   1745      1.1     skrll       if (s == NULL)
   1746      1.1     skrll         return FALSE;
   1747      1.1     skrll       /* The .rel[a].bss section holds copy relocs.  This section is not
   1748      1.1     skrll          normally needed.  We need to create it here, though, so that the
   1749      1.1     skrll          linker will map it to an output section.  We can't just create it
   1750      1.1     skrll          only if we need it, because we will not know whether we need it
   1751      1.1     skrll          until we have seen all the input files, and the first time the
   1752      1.1     skrll          main linker code calls BFD after examining all the input files
   1753      1.1     skrll          (size_dynamic_sections) the input sections have already been
   1754      1.1     skrll          mapped to the output sections.  If the section turns out not to
   1755      1.1     skrll          be needed, we can discard it later.  We will never need this
   1756      1.1     skrll          section when generating a shared object, since they do not use
   1757      1.1     skrll          copy relocs.  */
   1758      1.1     skrll       if (! info->shared)
   1759      1.1     skrll         {
   1760      1.1     skrll           s = bfd_make_section_with_flags (abfd,
   1761      1.1     skrll 					   (bed->default_use_rela_p
   1762      1.1     skrll 					    ? ".rela.bss" : ".rel.bss"),
   1763      1.1     skrll 					   flags | SEC_READONLY);
   1764      1.1     skrll           htab->srelbss = s;
   1765      1.1     skrll           if (s == NULL
   1766      1.1     skrll               || ! bfd_set_section_alignment (abfd, s, ptralign))
   1767      1.1     skrll             return FALSE;
   1768      1.1     skrll         }
   1769      1.1     skrll     }
   1770      1.1     skrll 
   1771      1.1     skrll   return TRUE;
   1772      1.1     skrll }
   1773      1.1     skrll 
   1774      1.1     skrll /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   1775      1.1     skrll 
   1776      1.1     skrll static void
   1777      1.1     skrll m32r_elf_copy_indirect_symbol (struct bfd_link_info *info,
   1778      1.1     skrll                                struct elf_link_hash_entry *dir,
   1779      1.1     skrll                                struct elf_link_hash_entry *ind)
   1780      1.1     skrll {
   1781      1.1     skrll   struct elf_m32r_link_hash_entry * edir;
   1782      1.1     skrll   struct elf_m32r_link_hash_entry * eind;
   1783      1.1     skrll 
   1784      1.1     skrll   edir = (struct elf_m32r_link_hash_entry *) dir;
   1785      1.1     skrll   eind = (struct elf_m32r_link_hash_entry *) ind;
   1786      1.1     skrll 
   1787      1.1     skrll   if (eind->dyn_relocs != NULL)
   1788      1.1     skrll     {
   1789      1.1     skrll       if (edir->dyn_relocs != NULL)
   1790      1.1     skrll         {
   1791      1.1     skrll           struct elf_m32r_dyn_relocs **pp;
   1792      1.1     skrll           struct elf_m32r_dyn_relocs *p;
   1793      1.1     skrll 
   1794      1.1     skrll           /* Add reloc counts against the indirect sym to the direct sym
   1795      1.1     skrll              list.  Merge any entries against the same section.  */
   1796      1.1     skrll           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
   1797      1.1     skrll             {
   1798      1.1     skrll               struct elf_m32r_dyn_relocs *q;
   1799      1.1     skrll 
   1800      1.1     skrll               for (q = edir->dyn_relocs; q != NULL; q = q->next)
   1801      1.1     skrll                 if (q->sec == p->sec)
   1802      1.1     skrll                   {
   1803      1.1     skrll                     q->pc_count += p->pc_count;
   1804      1.1     skrll                     q->count += p->count;
   1805      1.1     skrll                     *pp = p->next;
   1806      1.1     skrll                     break;
   1807      1.1     skrll                   }
   1808      1.1     skrll               if (q == NULL)
   1809      1.1     skrll                 pp = &p->next;
   1810      1.1     skrll             }
   1811      1.1     skrll           *pp = edir->dyn_relocs;
   1812      1.1     skrll         }
   1813      1.1     skrll 
   1814      1.1     skrll       edir->dyn_relocs = eind->dyn_relocs;
   1815      1.1     skrll       eind->dyn_relocs = NULL;
   1816      1.1     skrll     }
   1817      1.1     skrll 
   1818      1.1     skrll   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   1819      1.1     skrll }
   1820      1.1     skrll 
   1821      1.1     skrll 
   1822      1.1     skrll /* Adjust a symbol defined by a dynamic object and referenced by a
   1824      1.1     skrll    regular object.  The current definition is in some section of the
   1825      1.1     skrll    dynamic object, but we're not including those sections.  We have to
   1826      1.1     skrll    change the definition to something the rest of the link can
   1827      1.1     skrll    understand.  */
   1828      1.1     skrll 
   1829      1.1     skrll static bfd_boolean
   1830      1.1     skrll m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   1831      1.1     skrll 				struct elf_link_hash_entry *h)
   1832      1.1     skrll {
   1833      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   1834      1.1     skrll   struct elf_m32r_link_hash_entry *eh;
   1835      1.1     skrll   struct elf_m32r_dyn_relocs *p;
   1836      1.1     skrll   bfd *dynobj;
   1837      1.1     skrll   asection *s;
   1838      1.1     skrll 
   1839      1.1     skrll #ifdef DEBUG_PIC
   1840      1.1     skrll   printf ("m32r_elf_adjust_dynamic_symbol()\n");
   1841      1.1     skrll #endif
   1842      1.1     skrll 
   1843      1.1     skrll   dynobj = elf_hash_table (info)->dynobj;
   1844      1.1     skrll 
   1845      1.1     skrll   /* Make sure we know what is going on here.  */
   1846      1.1     skrll   BFD_ASSERT (dynobj != NULL
   1847      1.1     skrll               && (h->needs_plt
   1848      1.1     skrll                   || h->u.weakdef != NULL
   1849      1.1     skrll                   || (h->def_dynamic
   1850      1.1     skrll                       && h->ref_regular
   1851      1.1     skrll                       && !h->def_regular)));
   1852      1.1     skrll 
   1853      1.1     skrll   /* If this is a function, put it in the procedure linkage table.  We
   1854      1.1     skrll      will fill in the contents of the procedure linkage table later,
   1855      1.1     skrll      when we know the address of the .got section.  */
   1856      1.1     skrll   if (h->type == STT_FUNC
   1857      1.1     skrll       || h->needs_plt)
   1858      1.1     skrll     {
   1859      1.1     skrll       if (! info->shared
   1860      1.1     skrll           && !h->def_dynamic
   1861      1.1     skrll           && !h->ref_dynamic
   1862      1.1     skrll 	  && h->root.type != bfd_link_hash_undefweak
   1863      1.1     skrll 	  && h->root.type != bfd_link_hash_undefined)
   1864      1.1     skrll         {
   1865      1.1     skrll           /* This case can occur if we saw a PLT reloc in an input
   1866      1.1     skrll              file, but the symbol was never referred to by a dynamic
   1867      1.1     skrll              object.  In such a case, we don't actually need to build
   1868      1.1     skrll              a procedure linkage table, and we can just do a PCREL
   1869      1.1     skrll              reloc instead.  */
   1870      1.1     skrll           h->plt.offset = (bfd_vma) -1;
   1871      1.1     skrll           h->needs_plt = 0;
   1872      1.1     skrll         }
   1873      1.1     skrll 
   1874      1.1     skrll       return TRUE;
   1875      1.1     skrll     }
   1876      1.1     skrll   else
   1877      1.1     skrll     h->plt.offset = (bfd_vma) -1;
   1878      1.1     skrll 
   1879      1.1     skrll   /* If this is a weak symbol, and there is a real definition, the
   1880      1.1     skrll      processor independent code will have arranged for us to see the
   1881      1.1     skrll      real definition first, and we can just use the same value.  */
   1882      1.1     skrll   if (h->u.weakdef != NULL)
   1883      1.1     skrll     {
   1884      1.1     skrll       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   1885      1.1     skrll                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
   1886      1.1     skrll       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   1887      1.1     skrll       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   1888      1.1     skrll       return TRUE;
   1889      1.1     skrll     }
   1890      1.1     skrll 
   1891      1.1     skrll   /* This is a reference to a symbol defined by a dynamic object which
   1892      1.1     skrll      is not a function.  */
   1893      1.1     skrll 
   1894      1.1     skrll   /* If we are creating a shared library, we must presume that the
   1895      1.1     skrll      only references to the symbol are via the global offset table.
   1896      1.1     skrll      For such cases we need not do anything here; the relocations will
   1897      1.1     skrll      be handled correctly by relocate_section.  */
   1898      1.1     skrll   if (info->shared)
   1899      1.1     skrll     return TRUE;
   1900      1.1     skrll 
   1901      1.1     skrll   /* If there are no references to this symbol that do not use the
   1902      1.1     skrll      GOT, we don't need to generate a copy reloc.  */
   1903      1.1     skrll   if (!h->non_got_ref)
   1904      1.1     skrll     return TRUE;
   1905      1.1     skrll 
   1906      1.1     skrll   /* If -z nocopyreloc was given, we won't generate them either.  */
   1907      1.1     skrll   if (info->nocopyreloc)
   1908      1.1     skrll     {
   1909      1.1     skrll       h->non_got_ref = 0;
   1910      1.1     skrll       return TRUE;
   1911      1.1     skrll     }
   1912      1.1     skrll 
   1913      1.1     skrll   eh = (struct elf_m32r_link_hash_entry *) h;
   1914      1.1     skrll   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   1915      1.1     skrll     {
   1916      1.1     skrll       s = p->sec->output_section;
   1917      1.1     skrll       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
   1918      1.1     skrll         break;
   1919      1.1     skrll     }
   1920      1.1     skrll 
   1921      1.1     skrll   /* If we didn't find any dynamic relocs in sections which needs the
   1922      1.1     skrll      copy reloc, then we'll be keeping the dynamic relocs and avoiding
   1923      1.1     skrll      the copy reloc.  */
   1924      1.1     skrll   if (p == NULL)
   1925      1.1     skrll     {
   1926      1.1     skrll       h->non_got_ref = 0;
   1927      1.1     skrll       return TRUE;
   1928      1.1     skrll     }
   1929      1.1     skrll 
   1930      1.1     skrll   if (h->size == 0)
   1931      1.1     skrll     {
   1932      1.1     skrll       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
   1933      1.1     skrll 			     h->root.root.string);
   1934      1.1     skrll       return TRUE;
   1935      1.1     skrll     }
   1936      1.1     skrll 
   1937      1.1     skrll   /* We must allocate the symbol in our .dynbss section, which will
   1938      1.1     skrll      become part of the .bss section of the executable.  There will be
   1939      1.1     skrll      an entry for this symbol in the .dynsym section.  The dynamic
   1940      1.1     skrll      object will contain position independent code, so all references
   1941      1.1     skrll      from the dynamic object to this symbol will go through the global
   1942      1.1     skrll      offset table.  The dynamic linker will use the .dynsym entry to
   1943  1.1.1.2  christos      determine the address it must put in the global offset table, so
   1944  1.1.1.2  christos      both the dynamic object and the regular object will refer to the
   1945  1.1.1.2  christos      same memory location for the variable.  */
   1946      1.1     skrll 
   1947      1.1     skrll   htab = m32r_elf_hash_table (info);
   1948      1.1     skrll   if (htab == NULL)
   1949      1.1     skrll     return FALSE;
   1950      1.1     skrll 
   1951      1.1     skrll   s = htab->sdynbss;
   1952      1.1     skrll   BFD_ASSERT (s != NULL);
   1953      1.1     skrll 
   1954      1.1     skrll   /* We must generate a R_M32R_COPY reloc to tell the dynamic linker
   1955      1.1     skrll      to copy the initial value out of the dynamic object and into the
   1956      1.1     skrll      runtime process image.  We need to remember the offset into the
   1957      1.1     skrll      .rela.bss section we are going to use.  */
   1958      1.1     skrll   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
   1959      1.1     skrll     {
   1960      1.1     skrll       asection *srel;
   1961      1.1     skrll 
   1962      1.1     skrll       srel = htab->srelbss;
   1963      1.1     skrll       BFD_ASSERT (srel != NULL);
   1964      1.1     skrll       srel->size += sizeof (Elf32_External_Rela);
   1965      1.1     skrll       h->needs_copy = 1;
   1966      1.1     skrll     }
   1967      1.1     skrll 
   1968      1.1     skrll   return _bfd_elf_adjust_dynamic_copy (h, s);
   1969      1.1     skrll }
   1970      1.1     skrll 
   1971      1.1     skrll /* Allocate space in .plt, .got and associated reloc sections for
   1972      1.1     skrll    dynamic relocs.  */
   1973      1.1     skrll 
   1974      1.1     skrll static bfd_boolean
   1975      1.1     skrll allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   1976      1.1     skrll {
   1977      1.1     skrll   struct bfd_link_info *info;
   1978      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   1979      1.1     skrll   struct elf_m32r_link_hash_entry *eh;
   1980      1.1     skrll   struct elf_m32r_dyn_relocs *p;
   1981      1.1     skrll 
   1982      1.1     skrll   if (h->root.type == bfd_link_hash_indirect)
   1983      1.1     skrll     return TRUE;
   1984      1.1     skrll 
   1985      1.1     skrll   if (h->root.type == bfd_link_hash_warning)
   1986      1.1     skrll     /* When warning symbols are created, they **replace** the "real"
   1987      1.1     skrll        entry in the hash table, thus we never get to see the real
   1988  1.1.1.2  christos        symbol in a hash traversal.  So look at it now.  */
   1989  1.1.1.2  christos     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1990      1.1     skrll 
   1991      1.1     skrll   info = (struct bfd_link_info *) inf;
   1992      1.1     skrll   htab = m32r_elf_hash_table (info);
   1993      1.1     skrll   if (htab == NULL)
   1994      1.1     skrll     return FALSE;
   1995      1.1     skrll 
   1996      1.1     skrll   eh = (struct elf_m32r_link_hash_entry *) h;
   1997      1.1     skrll 
   1998      1.1     skrll   if (htab->root.dynamic_sections_created
   1999      1.1     skrll       && h->plt.refcount > 0)
   2000      1.1     skrll     {
   2001      1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   2002      1.1     skrll          Undefined weak syms won't yet be marked as dynamic.  */
   2003      1.1     skrll       if (h->dynindx == -1
   2004      1.1     skrll           && !h->forced_local)
   2005      1.1     skrll         {
   2006      1.1     skrll           if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2007      1.1     skrll             return FALSE;
   2008      1.1     skrll         }
   2009      1.1     skrll 
   2010      1.1     skrll       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
   2011      1.1     skrll         {
   2012      1.1     skrll           asection *s = htab->splt;
   2013      1.1     skrll 
   2014      1.1     skrll           /* If this is the first .plt entry, make room for the special
   2015      1.1     skrll              first entry.  */
   2016      1.1     skrll           if (s->size == 0)
   2017      1.1     skrll             s->size += PLT_ENTRY_SIZE;
   2018      1.1     skrll 
   2019      1.1     skrll           h->plt.offset = s->size;
   2020      1.1     skrll 
   2021      1.1     skrll           /* If this symbol is not defined in a regular file, and we are
   2022      1.1     skrll              not generating a shared library, then set the symbol to this
   2023      1.1     skrll              location in the .plt.  This is required to make function
   2024      1.1     skrll              pointers compare as equal between the normal executable and
   2025      1.1     skrll              the shared library.  */
   2026      1.1     skrll           if (! info->shared
   2027      1.1     skrll               && !h->def_regular)
   2028      1.1     skrll             {
   2029      1.1     skrll               h->root.u.def.section = s;
   2030      1.1     skrll               h->root.u.def.value = h->plt.offset;
   2031      1.1     skrll             }
   2032      1.1     skrll 
   2033      1.1     skrll           /* Make room for this entry.  */
   2034      1.1     skrll           s->size += PLT_ENTRY_SIZE;
   2035      1.1     skrll 
   2036      1.1     skrll           /* We also need to make an entry in the .got.plt section, which
   2037      1.1     skrll              will be placed in the .got section by the linker script.  */
   2038      1.1     skrll           htab->sgotplt->size += 4;
   2039      1.1     skrll 
   2040      1.1     skrll           /* We also need to make an entry in the .rel.plt section.  */
   2041      1.1     skrll           htab->srelplt->size += sizeof (Elf32_External_Rela);
   2042      1.1     skrll         }
   2043      1.1     skrll       else
   2044      1.1     skrll         {
   2045      1.1     skrll           h->plt.offset = (bfd_vma) -1;
   2046      1.1     skrll           h->needs_plt = 0;
   2047      1.1     skrll         }
   2048      1.1     skrll     }
   2049      1.1     skrll   else
   2050      1.1     skrll     {
   2051      1.1     skrll       h->plt.offset = (bfd_vma) -1;
   2052      1.1     skrll       h->needs_plt = 0;
   2053      1.1     skrll     }
   2054      1.1     skrll 
   2055      1.1     skrll   if (h->got.refcount > 0)
   2056      1.1     skrll     {
   2057      1.1     skrll       asection *s;
   2058      1.1     skrll       bfd_boolean dyn;
   2059      1.1     skrll 
   2060      1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   2061      1.1     skrll          Undefined weak syms won't yet be marked as dynamic.  */
   2062      1.1     skrll       if (h->dynindx == -1
   2063      1.1     skrll           && !h->forced_local)
   2064      1.1     skrll         {
   2065      1.1     skrll           if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2066      1.1     skrll             return FALSE;
   2067      1.1     skrll         }
   2068      1.1     skrll 
   2069      1.1     skrll       s = htab->sgot;
   2070      1.1     skrll 
   2071      1.1     skrll       h->got.offset = s->size;
   2072      1.1     skrll       s->size += 4;
   2073      1.1     skrll       dyn = htab->root.dynamic_sections_created;
   2074      1.1     skrll       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
   2075      1.1     skrll         htab->srelgot->size += sizeof (Elf32_External_Rela);
   2076      1.1     skrll     }
   2077      1.1     skrll   else
   2078      1.1     skrll     h->got.offset = (bfd_vma) -1;
   2079      1.1     skrll 
   2080      1.1     skrll   if (eh->dyn_relocs == NULL)
   2081      1.1     skrll     return TRUE;
   2082      1.1     skrll 
   2083      1.1     skrll   /* In the shared -Bsymbolic case, discard space allocated for
   2084      1.1     skrll      dynamic pc-relative relocs against symbols which turn out to be
   2085      1.1     skrll      defined in regular objects.  For the normal shared case, discard
   2086      1.1     skrll      space for pc-relative relocs that have become local due to symbol
   2087      1.1     skrll      visibility changes.  */
   2088      1.1     skrll 
   2089      1.1     skrll   if (info->shared)
   2090      1.1     skrll     {
   2091      1.1     skrll       if (h->def_regular
   2092      1.1     skrll           && (h->forced_local
   2093      1.1     skrll               || info->symbolic))
   2094      1.1     skrll         {
   2095      1.1     skrll           struct elf_m32r_dyn_relocs **pp;
   2096      1.1     skrll 
   2097      1.1     skrll           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
   2098      1.1     skrll             {
   2099      1.1     skrll               p->count -= p->pc_count;
   2100      1.1     skrll               p->pc_count = 0;
   2101      1.1     skrll               if (p->count == 0)
   2102      1.1     skrll                 *pp = p->next;
   2103      1.1     skrll               else
   2104      1.1     skrll                 pp = &p->next;
   2105      1.1     skrll             }
   2106      1.1     skrll         }
   2107      1.1     skrll 
   2108      1.1     skrll       /* Also discard relocs on undefined weak syms with non-default
   2109      1.1     skrll 	 visibility.  */
   2110      1.1     skrll       if (eh->dyn_relocs != NULL
   2111      1.1     skrll 	  && h->root.type == bfd_link_hash_undefweak)
   2112      1.1     skrll 	{
   2113      1.1     skrll 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2114      1.1     skrll 	    eh->dyn_relocs = NULL;
   2115      1.1     skrll 
   2116      1.1     skrll 	  /* Make sure undefined weak symbols are output as a dynamic
   2117      1.1     skrll 	     symbol in PIEs.  */
   2118      1.1     skrll 	  else if (h->dynindx == -1
   2119      1.1     skrll 		   && !h->forced_local)
   2120      1.1     skrll 	    {
   2121      1.1     skrll 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2122      1.1     skrll 		return FALSE;
   2123      1.1     skrll 	    }
   2124      1.1     skrll 	}
   2125      1.1     skrll     }
   2126      1.1     skrll   else
   2127      1.1     skrll     {
   2128      1.1     skrll       /* For the non-shared case, discard space for relocs against
   2129      1.1     skrll          symbols which turn out to need copy relocs or are not
   2130      1.1     skrll          dynamic.  */
   2131      1.1     skrll 
   2132      1.1     skrll       if (!h->non_got_ref
   2133      1.1     skrll           && ((h->def_dynamic
   2134      1.1     skrll                && !h->def_regular)
   2135      1.1     skrll               || (htab->root.dynamic_sections_created
   2136      1.1     skrll                   && (h->root.type == bfd_link_hash_undefweak
   2137      1.1     skrll                       || h->root.type == bfd_link_hash_undefined))))
   2138      1.1     skrll         {
   2139      1.1     skrll           /* Make sure this symbol is output as a dynamic symbol.
   2140      1.1     skrll              Undefined weak syms won't yet be marked as dynamic.  */
   2141      1.1     skrll           if (h->dynindx == -1
   2142      1.1     skrll               && !h->forced_local)
   2143      1.1     skrll             {
   2144      1.1     skrll               if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2145      1.1     skrll                 return FALSE;
   2146      1.1     skrll             }
   2147      1.1     skrll 
   2148      1.1     skrll           /* If that succeeded, we know we'll be keeping all the
   2149      1.1     skrll              relocs.  */
   2150      1.1     skrll           if (h->dynindx != -1)
   2151      1.1     skrll             goto keep;
   2152      1.1     skrll         }
   2153      1.1     skrll 
   2154      1.1     skrll       eh->dyn_relocs = NULL;
   2155      1.1     skrll 
   2156      1.1     skrll     keep: ;
   2157      1.1     skrll     }
   2158      1.1     skrll 
   2159      1.1     skrll   /* Finally, allocate space.  */
   2160      1.1     skrll   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2161      1.1     skrll     {
   2162      1.1     skrll       asection *sreloc = elf_section_data (p->sec)->sreloc;
   2163      1.1     skrll       sreloc->size += p->count * sizeof (Elf32_External_Rela);
   2164      1.1     skrll     }
   2165      1.1     skrll 
   2166      1.1     skrll   return TRUE;
   2167      1.1     skrll }
   2168      1.1     skrll 
   2169      1.1     skrll /* Find any dynamic relocs that apply to read-only sections.  */
   2170      1.1     skrll 
   2171      1.1     skrll static bfd_boolean
   2172      1.1     skrll readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   2173      1.1     skrll {
   2174      1.1     skrll   struct elf_m32r_link_hash_entry *eh;
   2175      1.1     skrll   struct elf_m32r_dyn_relocs *p;
   2176      1.1     skrll 
   2177      1.1     skrll   if (h->root.type == bfd_link_hash_warning)
   2178      1.1     skrll     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2179      1.1     skrll 
   2180      1.1     skrll   eh = (struct elf_m32r_link_hash_entry *) h;
   2181      1.1     skrll   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2182      1.1     skrll     {
   2183      1.1     skrll       asection *s = p->sec->output_section;
   2184      1.1     skrll 
   2185      1.1     skrll       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2186      1.1     skrll         {
   2187      1.1     skrll           struct bfd_link_info *info = (struct bfd_link_info *) inf;
   2188      1.1     skrll 
   2189      1.1     skrll           info->flags |= DF_TEXTREL;
   2190      1.1     skrll 
   2191      1.1     skrll           /* Not an error, just cut short the traversal.  */
   2192      1.1     skrll           return FALSE;
   2193      1.1     skrll         }
   2194      1.1     skrll     }
   2195      1.1     skrll   return TRUE;
   2196      1.1     skrll }
   2197      1.1     skrll 
   2198      1.1     skrll /* Set the sizes of the dynamic sections.  */
   2199      1.1     skrll 
   2200      1.1     skrll static bfd_boolean
   2201      1.1     skrll m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2202      1.1     skrll 				struct bfd_link_info *info)
   2203      1.1     skrll {
   2204      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   2205      1.1     skrll   bfd *dynobj;
   2206      1.1     skrll   asection *s;
   2207      1.1     skrll   bfd_boolean relocs;
   2208      1.1     skrll   bfd *ibfd;
   2209      1.1     skrll 
   2210  1.1.1.2  christos #ifdef DEBUG_PIC
   2211  1.1.1.2  christos   printf ("m32r_elf_size_dynamic_sections()\n");
   2212  1.1.1.2  christos #endif
   2213      1.1     skrll 
   2214      1.1     skrll   htab = m32r_elf_hash_table (info);
   2215      1.1     skrll   if (htab == NULL)
   2216      1.1     skrll     return FALSE;
   2217      1.1     skrll 
   2218      1.1     skrll   dynobj = htab->root.dynobj;
   2219      1.1     skrll   BFD_ASSERT (dynobj != NULL);
   2220      1.1     skrll 
   2221      1.1     skrll   if (htab->root.dynamic_sections_created)
   2222      1.1     skrll     {
   2223      1.1     skrll       /* Set the contents of the .interp section to the interpreter.  */
   2224      1.1     skrll       if (info->executable)
   2225      1.1     skrll 	{
   2226      1.1     skrll 	  s = bfd_get_section_by_name (dynobj, ".interp");
   2227      1.1     skrll 	  BFD_ASSERT (s != NULL);
   2228      1.1     skrll 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   2229      1.1     skrll 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   2230      1.1     skrll 	}
   2231      1.1     skrll     }
   2232      1.1     skrll 
   2233      1.1     skrll   /* Set up .got offsets for local syms, and space for local dynamic
   2234      1.1     skrll      relocs.  */
   2235      1.1     skrll   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   2236      1.1     skrll     {
   2237      1.1     skrll       bfd_signed_vma *local_got;
   2238      1.1     skrll       bfd_signed_vma *end_local_got;
   2239      1.1     skrll       bfd_size_type locsymcount;
   2240      1.1     skrll       Elf_Internal_Shdr *symtab_hdr;
   2241      1.1     skrll       asection *srel;
   2242      1.1     skrll 
   2243      1.1     skrll       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
   2244      1.1     skrll         continue;
   2245      1.1     skrll 
   2246      1.1     skrll       for (s = ibfd->sections; s != NULL; s = s->next)
   2247      1.1     skrll         {
   2248      1.1     skrll           struct elf_m32r_dyn_relocs *p;
   2249      1.1     skrll 
   2250      1.1     skrll           for (p = ((struct elf_m32r_dyn_relocs *)
   2251      1.1     skrll                     elf_section_data (s)->local_dynrel);
   2252      1.1     skrll                p != NULL;
   2253      1.1     skrll                p = p->next)
   2254      1.1     skrll             {
   2255      1.1     skrll               if (! bfd_is_abs_section (p->sec)
   2256      1.1     skrll                   && bfd_is_abs_section (p->sec->output_section))
   2257      1.1     skrll                 {
   2258      1.1     skrll                   /* Input section has been discarded, either because
   2259      1.1     skrll                      it is a copy of a linkonce section or due to
   2260      1.1     skrll                      linker script /DISCARD/, so we'll be discarding
   2261      1.1     skrll                      the relocs too.  */
   2262      1.1     skrll                 }
   2263      1.1     skrll               else if (p->count != 0)
   2264      1.1     skrll                 {
   2265      1.1     skrll                   srel = elf_section_data (p->sec)->sreloc;
   2266      1.1     skrll                   srel->size += p->count * sizeof (Elf32_External_Rela);
   2267      1.1     skrll                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2268      1.1     skrll                     info->flags |= DF_TEXTREL;
   2269      1.1     skrll                 }
   2270      1.1     skrll             }
   2271      1.1     skrll         }
   2272      1.1     skrll 
   2273      1.1     skrll       local_got = elf_local_got_refcounts (ibfd);
   2274      1.1     skrll       if (!local_got)
   2275      1.1     skrll         continue;
   2276      1.1     skrll 
   2277      1.1     skrll       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
   2278      1.1     skrll       locsymcount = symtab_hdr->sh_info;
   2279      1.1     skrll       end_local_got = local_got + locsymcount;
   2280      1.1     skrll       s = htab->sgot;
   2281      1.1     skrll       srel = htab->srelgot;
   2282      1.1     skrll       for (; local_got < end_local_got; ++local_got)
   2283      1.1     skrll         {
   2284      1.1     skrll           if (*local_got > 0)
   2285      1.1     skrll             {
   2286      1.1     skrll               *local_got = s->size;
   2287      1.1     skrll               s->size += 4;
   2288      1.1     skrll               if (info->shared)
   2289      1.1     skrll                 srel->size += sizeof (Elf32_External_Rela);
   2290      1.1     skrll             }
   2291      1.1     skrll           else
   2292      1.1     skrll             *local_got = (bfd_vma) -1;
   2293      1.1     skrll         }
   2294      1.1     skrll     }
   2295      1.1     skrll 
   2296      1.1     skrll   /* Allocate global sym .plt and .got entries, and space for global
   2297      1.1     skrll      sym dynamic relocs.  */
   2298      1.1     skrll   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
   2299      1.1     skrll 
   2300      1.1     skrll   /* We now have determined the sizes of the various dynamic sections.
   2301      1.1     skrll      Allocate memory for them.  */
   2302      1.1     skrll   relocs = FALSE;
   2303      1.1     skrll   for (s = dynobj->sections; s != NULL; s = s->next)
   2304      1.1     skrll     {
   2305      1.1     skrll       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2306      1.1     skrll         continue;
   2307      1.1     skrll 
   2308      1.1     skrll       if (s == htab->splt
   2309      1.1     skrll           || s == htab->sgot
   2310      1.1     skrll           || s == htab->sgotplt
   2311      1.1     skrll 	  || s == htab->sdynbss)
   2312      1.1     skrll         {
   2313      1.1     skrll           /* Strip this section if we don't need it; see the
   2314      1.1     skrll              comment below.  */
   2315      1.1     skrll         }
   2316      1.1     skrll       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
   2317      1.1     skrll         {
   2318      1.1     skrll           if (s->size != 0 && s != htab->srelplt)
   2319      1.1     skrll             relocs = TRUE;
   2320      1.1     skrll 
   2321      1.1     skrll           /* We use the reloc_count field as a counter if we need
   2322      1.1     skrll              to copy relocs into the output file.  */
   2323      1.1     skrll           s->reloc_count = 0;
   2324      1.1     skrll         }
   2325      1.1     skrll       else
   2326      1.1     skrll 	/* It's not one of our sections, so don't allocate space.  */
   2327      1.1     skrll 	continue;
   2328      1.1     skrll 
   2329      1.1     skrll       if (s->size == 0)
   2330      1.1     skrll         {
   2331      1.1     skrll           /* If we don't need this section, strip it from the
   2332      1.1     skrll              output file.  This is mostly to handle .rela.bss and
   2333      1.1     skrll              .rela.plt.  We must create both sections in
   2334      1.1     skrll              create_dynamic_sections, because they must be created
   2335      1.1     skrll              before the linker maps input sections to output
   2336      1.1     skrll              sections.  The linker does that before
   2337      1.1     skrll              adjust_dynamic_symbol is called, and it is that
   2338      1.1     skrll              function which decides whether anything needs to go
   2339      1.1     skrll              into these sections.  */
   2340      1.1     skrll           s->flags |= SEC_EXCLUDE;
   2341      1.1     skrll           continue;
   2342      1.1     skrll         }
   2343      1.1     skrll 
   2344      1.1     skrll       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2345      1.1     skrll 	continue;
   2346      1.1     skrll 
   2347      1.1     skrll       /* Allocate memory for the section contents.  We use bfd_zalloc
   2348      1.1     skrll          here in case unused entries are not reclaimed before the
   2349      1.1     skrll          section's contents are written out.  This should not happen,
   2350      1.1     skrll          but this way if it does, we get a R_M32R_NONE reloc instead
   2351      1.1     skrll          of garbage.  */
   2352      1.1     skrll       s->contents = bfd_zalloc (dynobj, s->size);
   2353      1.1     skrll       if (s->contents == NULL)
   2354      1.1     skrll         return FALSE;
   2355      1.1     skrll     }
   2356      1.1     skrll 
   2357      1.1     skrll   if (htab->root.dynamic_sections_created)
   2358      1.1     skrll     {
   2359      1.1     skrll       /* Add some entries to the .dynamic section.  We fill in the
   2360      1.1     skrll 	 values later, in m32r_elf_finish_dynamic_sections, but we
   2361      1.1     skrll 	 must add the entries now so that we get the correct size for
   2362      1.1     skrll 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   2363      1.1     skrll 	 dynamic linker and used by the debugger.  */
   2364      1.1     skrll #define add_dynamic_entry(TAG, VAL) \
   2365      1.1     skrll   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2366      1.1     skrll 
   2367      1.1     skrll      if (info->executable)
   2368      1.1     skrll 	{
   2369      1.1     skrll 	  if (! add_dynamic_entry (DT_DEBUG, 0))
   2370      1.1     skrll 	    return FALSE;
   2371      1.1     skrll 	}
   2372      1.1     skrll 
   2373      1.1     skrll       if (htab->splt->size != 0)
   2374      1.1     skrll         {
   2375      1.1     skrll           if (! add_dynamic_entry (DT_PLTGOT, 0)
   2376      1.1     skrll               || ! add_dynamic_entry (DT_PLTRELSZ, 0)
   2377      1.1     skrll               || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
   2378      1.1     skrll               || ! add_dynamic_entry (DT_JMPREL, 0))
   2379      1.1     skrll             return FALSE;
   2380      1.1     skrll         }
   2381      1.1     skrll 
   2382      1.1     skrll       if (relocs)
   2383      1.1     skrll         {
   2384      1.1     skrll           if (! add_dynamic_entry (DT_RELA, 0)
   2385      1.1     skrll               || ! add_dynamic_entry (DT_RELASZ, 0)
   2386      1.1     skrll               || ! add_dynamic_entry (DT_RELAENT,
   2387      1.1     skrll                                       sizeof (Elf32_External_Rela)))
   2388      1.1     skrll             return FALSE;
   2389      1.1     skrll 
   2390      1.1     skrll           /* If any dynamic relocs apply to a read-only section,
   2391      1.1     skrll              then we need a DT_TEXTREL entry.  */
   2392      1.1     skrll           if ((info->flags & DF_TEXTREL) == 0)
   2393      1.1     skrll             elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
   2394      1.1     skrll                                     info);
   2395      1.1     skrll 
   2396      1.1     skrll           if ((info->flags & DF_TEXTREL) != 0)
   2397      1.1     skrll             {
   2398      1.1     skrll               if (! add_dynamic_entry (DT_TEXTREL, 0))
   2399      1.1     skrll                 return FALSE;
   2400      1.1     skrll             }
   2401      1.1     skrll         }
   2402      1.1     skrll     }
   2403      1.1     skrll #undef add_dynamic_entry
   2404      1.1     skrll 
   2405      1.1     skrll   return TRUE;
   2406      1.1     skrll }
   2407      1.1     skrll 
   2408      1.1     skrll /* Relocate an M32R/D ELF section.
   2409      1.1     skrll    There is some attempt to make this function usable for many architectures,
   2410      1.1     skrll    both for RELA and REL type relocs, if only to serve as a learning tool.
   2411      1.1     skrll 
   2412      1.1     skrll    The RELOCATE_SECTION function is called by the new ELF backend linker
   2413      1.1     skrll    to handle the relocations for a section.
   2414      1.1     skrll 
   2415      1.1     skrll    The relocs are always passed as Rela structures; if the section
   2416      1.1     skrll    actually uses Rel structures, the r_addend field will always be
   2417      1.1     skrll    zero.
   2418      1.1     skrll 
   2419      1.1     skrll    This function is responsible for adjust the section contents as
   2420      1.1     skrll    necessary, and (if using Rela relocs and generating a
   2421      1.1     skrll    relocatable output file) adjusting the reloc addend as
   2422      1.1     skrll    necessary.
   2423      1.1     skrll 
   2424      1.1     skrll    This function does not have to worry about setting the reloc
   2425      1.1     skrll    address or the reloc symbol index.
   2426      1.1     skrll 
   2427      1.1     skrll    LOCAL_SYMS is a pointer to the swapped in local symbols.
   2428      1.1     skrll 
   2429      1.1     skrll    LOCAL_SECTIONS is an array giving the section in the input file
   2430      1.1     skrll    corresponding to the st_shndx field of each local symbol.
   2431      1.1     skrll 
   2432      1.1     skrll    The global hash table entry for the global symbols can be found
   2433      1.1     skrll    via elf_sym_hashes (input_bfd).
   2434      1.1     skrll 
   2435      1.1     skrll    When generating relocatable output, this function must handle
   2436      1.1     skrll    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   2437      1.1     skrll    going to be the section symbol corresponding to the output
   2438      1.1     skrll    section, which means that the addend must be adjusted
   2439      1.1     skrll    accordingly.  */
   2440      1.1     skrll 
   2441      1.1     skrll static bfd_boolean
   2442      1.1     skrll m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
   2443      1.1     skrll 			   struct bfd_link_info *info,
   2444      1.1     skrll 			   bfd *input_bfd,
   2445      1.1     skrll 			   asection *input_section,
   2446      1.1     skrll 			   bfd_byte *contents,
   2447      1.1     skrll 			   Elf_Internal_Rela *relocs,
   2448      1.1     skrll 			   Elf_Internal_Sym *local_syms,
   2449      1.1     skrll 			   asection **local_sections)
   2450      1.1     skrll {
   2451      1.1     skrll   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   2452      1.1     skrll   struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
   2453      1.1     skrll   Elf_Internal_Rela *rel, *relend;
   2454      1.1     skrll   /* Assume success.  */
   2455      1.1     skrll   bfd_boolean ret = TRUE;
   2456      1.1     skrll   struct elf_m32r_link_hash_table *htab = m32r_elf_hash_table (info);
   2457  1.1.1.2  christos   bfd *dynobj;
   2458  1.1.1.2  christos   bfd_vma *local_got_offsets;
   2459  1.1.1.2  christos   asection *sgot, *splt, *sreloc;
   2460      1.1     skrll   bfd_vma high_address = bfd_get_section_limit (input_bfd, input_section);
   2461      1.1     skrll 
   2462      1.1     skrll   if (htab == NULL)
   2463      1.1     skrll     return FALSE;
   2464      1.1     skrll 
   2465      1.1     skrll   dynobj = htab->root.dynobj;
   2466      1.1     skrll   local_got_offsets = elf_local_got_offsets (input_bfd);
   2467      1.1     skrll 
   2468      1.1     skrll   sgot = htab->sgot;
   2469      1.1     skrll   splt = htab->splt;
   2470      1.1     skrll   sreloc = NULL;
   2471      1.1     skrll 
   2472      1.1     skrll   rel = relocs;
   2473      1.1     skrll   relend = relocs + input_section->reloc_count;
   2474      1.1     skrll   for (; rel < relend; rel++)
   2475      1.1     skrll     {
   2476      1.1     skrll       int r_type;
   2477      1.1     skrll       reloc_howto_type *howto;
   2478      1.1     skrll       unsigned long r_symndx;
   2479      1.1     skrll       struct elf_link_hash_entry *h;
   2480      1.1     skrll       /* We can't modify r_addend here as elf_link_input_bfd has an assert to
   2481      1.1     skrll          ensure it's zero (we use REL relocs, not RELA).  Therefore this
   2482      1.1     skrll          should be assigning zero to `addend', but for clarity we use
   2483      1.1     skrll          `r_addend'.  */
   2484      1.1     skrll       bfd_vma addend = rel->r_addend;
   2485      1.1     skrll       bfd_vma offset = rel->r_offset;
   2486      1.1     skrll       bfd_vma relocation;
   2487      1.1     skrll       Elf_Internal_Sym *sym;
   2488      1.1     skrll       asection *sec;
   2489      1.1     skrll       const char *sym_name;
   2490      1.1     skrll       bfd_reloc_status_type r;
   2491      1.1     skrll       const char *errmsg = NULL;
   2492      1.1     skrll       bfd_boolean use_rel = FALSE;
   2493      1.1     skrll 
   2494      1.1     skrll       h = NULL;
   2495      1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   2496      1.1     skrll       if (r_type < 0 || r_type >= (int) R_M32R_max)
   2497      1.1     skrll 	{
   2498      1.1     skrll 	  (*_bfd_error_handler) (_("%B: unknown relocation type %d"),
   2499      1.1     skrll 				 input_bfd,
   2500      1.1     skrll 				 (int) r_type);
   2501      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   2502      1.1     skrll 	  ret = FALSE;
   2503      1.1     skrll 	  continue;
   2504      1.1     skrll 	}
   2505      1.1     skrll 
   2506      1.1     skrll       if (   r_type == R_M32R_GNU_VTENTRY
   2507      1.1     skrll           || r_type == R_M32R_GNU_VTINHERIT
   2508      1.1     skrll           || r_type == R_M32R_NONE
   2509      1.1     skrll           || r_type == R_M32R_RELA_GNU_VTENTRY
   2510      1.1     skrll           || r_type == R_M32R_RELA_GNU_VTINHERIT)
   2511      1.1     skrll         continue;
   2512      1.1     skrll 
   2513      1.1     skrll       if (r_type <= R_M32R_GNU_VTENTRY)
   2514      1.1     skrll         use_rel = TRUE;
   2515      1.1     skrll 
   2516      1.1     skrll       howto = m32r_elf_howto_table + r_type;
   2517      1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   2518      1.1     skrll 
   2519      1.1     skrll       sym = NULL;
   2520      1.1     skrll       sec = NULL;
   2521      1.1     skrll       h = NULL;
   2522      1.1     skrll 
   2523      1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
   2524      1.1     skrll 	{
   2525      1.1     skrll 	  /* Local symbol.  */
   2526      1.1     skrll 	  sym = local_syms + r_symndx;
   2527      1.1     skrll 	  sec = local_sections[r_symndx];
   2528      1.1     skrll 	  sym_name = "<local symbol>";
   2529      1.1     skrll 
   2530      1.1     skrll 	  if (!use_rel)
   2531      1.1     skrll 	    {
   2532      1.1     skrll 	      relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   2533      1.1     skrll 	      addend = rel->r_addend;
   2534      1.1     skrll 	    }
   2535      1.1     skrll 	  else
   2536      1.1     skrll 	    {
   2537      1.1     skrll 	      relocation = (sec->output_section->vma
   2538      1.1     skrll 			    + sec->output_offset
   2539      1.1     skrll 			    + sym->st_value);
   2540      1.1     skrll 	    }
   2541      1.1     skrll 	}
   2542      1.1     skrll       else
   2543      1.1     skrll 	{
   2544      1.1     skrll 	  /* External symbol.  */
   2545      1.1     skrll 	  relocation = 0;
   2546      1.1     skrll 
   2547      1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   2548      1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   2549      1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   2550      1.1     skrll 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2551      1.1     skrll 	  sym_name = h->root.root.string;
   2552      1.1     skrll 
   2553      1.1     skrll 	  if (h->root.type == bfd_link_hash_defined
   2554      1.1     skrll 	      || h->root.type == bfd_link_hash_defweak)
   2555      1.1     skrll 	    {
   2556      1.1     skrll 	      bfd_boolean dyn;
   2557      1.1     skrll 	      sec = h->root.u.def.section;
   2558      1.1     skrll 
   2559      1.1     skrll 	      dyn = htab->root.dynamic_sections_created;
   2560      1.1     skrll 	      sec = h->root.u.def.section;
   2561      1.1     skrll 	      if (r_type == R_M32R_GOTPC24
   2562      1.1     skrll 		  || (r_type == R_M32R_GOTPC_HI_ULO
   2563      1.1     skrll 		      || r_type == R_M32R_GOTPC_HI_SLO
   2564      1.1     skrll 		      || r_type == R_M32R_GOTPC_LO)
   2565      1.1     skrll 		  || (r_type == R_M32R_26_PLTREL
   2566      1.1     skrll 		      && h->plt.offset != (bfd_vma) -1)
   2567      1.1     skrll 		  || ((r_type == R_M32R_GOT24
   2568      1.1     skrll 		       || r_type == R_M32R_GOT16_HI_ULO
   2569      1.1     skrll 		       || r_type == R_M32R_GOT16_HI_SLO
   2570      1.1     skrll 		       || r_type == R_M32R_GOT16_LO)
   2571      1.1     skrll 		      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   2572      1.1     skrll 							  info->shared, h)
   2573      1.1     skrll 		      && (! info->shared
   2574      1.1     skrll 			  || (! info->symbolic && h->dynindx != -1)
   2575      1.1     skrll 			  || !h->def_regular))
   2576      1.1     skrll 		  || (info->shared
   2577      1.1     skrll 		      && ((! info->symbolic && h->dynindx != -1)
   2578      1.1     skrll 			  || !h->def_regular)
   2579      1.1     skrll 		      && (((r_type == R_M32R_16_RELA
   2580      1.1     skrll 			    || r_type == R_M32R_32_RELA
   2581      1.1     skrll 			    || r_type == R_M32R_24_RELA
   2582      1.1     skrll 			    || r_type == R_M32R_HI16_ULO_RELA
   2583      1.1     skrll 			    || r_type == R_M32R_HI16_SLO_RELA
   2584      1.1     skrll 			    || r_type == R_M32R_LO16_RELA)
   2585      1.1     skrll 			   && !h->forced_local)
   2586      1.1     skrll 			  || r_type == R_M32R_REL32
   2587      1.1     skrll 			  || r_type == R_M32R_10_PCREL_RELA
   2588      1.1     skrll 			  || r_type == R_M32R_18_PCREL_RELA
   2589      1.1     skrll 			  || r_type == R_M32R_26_PCREL_RELA)
   2590      1.1     skrll 		      && ((input_section->flags & SEC_ALLOC) != 0
   2591      1.1     skrll 			  /* DWARF will emit R_M32R_16(24,32) relocations
   2592      1.1     skrll 			     in its sections against symbols defined
   2593      1.1     skrll 			     externally in shared libraries.  We can't do
   2594      1.1     skrll 			     anything with them here.  */
   2595      1.1     skrll 			  || ((input_section->flags & SEC_DEBUGGING) != 0
   2596      1.1     skrll 			      && h->def_dynamic))))
   2597      1.1     skrll 		{
   2598      1.1     skrll 		  /* In these cases, we don't need the relocation
   2599      1.1     skrll 		     value.  We check specially because in some
   2600      1.1     skrll 		     obscure cases sec->output_section will be NULL.  */
   2601      1.1     skrll 		}
   2602      1.1     skrll 	      else if (sec->output_section != NULL)
   2603      1.1     skrll 		relocation = (h->root.u.def.value
   2604      1.1     skrll 			      + sec->output_section->vma
   2605      1.1     skrll 			      + sec->output_offset);
   2606      1.1     skrll 	      else if (!info->relocatable)
   2607      1.1     skrll 		{
   2608      1.1     skrll 		  (*_bfd_error_handler)
   2609      1.1     skrll 		    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   2610      1.1     skrll 		     input_bfd,
   2611      1.1     skrll 		     input_section,
   2612      1.1     skrll 		     (long) rel->r_offset,
   2613      1.1     skrll 		     howto->name,
   2614      1.1     skrll 		     h->root.root.string);
   2615      1.1     skrll 		}
   2616      1.1     skrll 	    }
   2617      1.1     skrll 	  else if (h->root.type == bfd_link_hash_undefweak)
   2618      1.1     skrll 	    ;
   2619      1.1     skrll 	  else if (info->unresolved_syms_in_objects == RM_IGNORE
   2620      1.1     skrll 		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
   2621      1.1     skrll 	    ;
   2622      1.1     skrll 	  else if (!info->relocatable)
   2623      1.1     skrll 	    {
   2624      1.1     skrll 	      if (! ((*info->callbacks->undefined_symbol)
   2625      1.1     skrll 		     (info, h->root.root.string, input_bfd,
   2626      1.1     skrll 		      input_section, offset,
   2627      1.1     skrll 		      (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
   2628      1.1     skrll 		       || ELF_ST_VISIBILITY (h->other)))))
   2629  1.1.1.2  christos 		return FALSE;
   2630  1.1.1.2  christos 	    }
   2631      1.1     skrll 	}
   2632      1.1     skrll 
   2633      1.1     skrll       if (sec != NULL && elf_discarded_section (sec))
   2634      1.1     skrll 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   2635      1.1     skrll 					 rel, relend, howto, contents);
   2636      1.1     skrll 
   2637      1.1     skrll       if (info->relocatable && !use_rel)
   2638      1.1     skrll 	{
   2639      1.1     skrll 	  /* This is a relocatable link.  We don't have to change
   2640      1.1     skrll 	     anything, unless the reloc is against a section symbol,
   2641      1.1     skrll 	     in which case we have to adjust according to where the
   2642      1.1     skrll 	     section symbol winds up in the output section.  */
   2643      1.1     skrll 	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   2644      1.1     skrll 	    rel->r_addend += sec->output_offset;
   2645      1.1     skrll 	  continue;
   2646      1.1     skrll 	}
   2647      1.1     skrll 
   2648      1.1     skrll       if (info->relocatable && use_rel)
   2649      1.1     skrll 	{
   2650      1.1     skrll 	  /* This is a relocatable link.  We don't have to change
   2651      1.1     skrll 	     anything, unless the reloc is against a section symbol,
   2652      1.1     skrll 	     in which case we have to adjust according to where the
   2653      1.1     skrll 	     section symbol winds up in the output section.  */
   2654      1.1     skrll 	  if (sym == NULL || ELF_ST_TYPE (sym->st_info) != STT_SECTION)
   2655      1.1     skrll 	    continue;
   2656      1.1     skrll 
   2657      1.1     skrll 	  addend += sec->output_offset;
   2658      1.1     skrll 
   2659      1.1     skrll 	  /* If partial_inplace, we need to store any additional addend
   2660      1.1     skrll 	     back in the section.  */
   2661      1.1     skrll 	  if (! howto->partial_inplace)
   2662      1.1     skrll 	    continue;
   2663      1.1     skrll 	  /* ??? Here is a nice place to call a special_function
   2664      1.1     skrll 	     like handler.  */
   2665      1.1     skrll 	  if (r_type != R_M32R_HI16_SLO && r_type != R_M32R_HI16_ULO)
   2666      1.1     skrll 	    r = _bfd_relocate_contents (howto, input_bfd,
   2667      1.1     skrll 					addend, contents + offset);
   2668      1.1     skrll 	  else
   2669      1.1     skrll 	    {
   2670      1.1     skrll 	      Elf_Internal_Rela *lorel;
   2671      1.1     skrll 
   2672      1.1     skrll 	      /* We allow an arbitrary number of HI16 relocs before the
   2673      1.1     skrll 		 LO16 reloc.  This permits gcc to emit the HI and LO relocs
   2674      1.1     skrll 		 itself.  */
   2675      1.1     skrll 	      for (lorel = rel + 1;
   2676      1.1     skrll 		   (lorel < relend
   2677      1.1     skrll 		    && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
   2678      1.1     skrll 			|| ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
   2679      1.1     skrll 		   lorel++)
   2680      1.1     skrll 		continue;
   2681      1.1     skrll 	      if (lorel < relend
   2682      1.1     skrll 		  && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
   2683      1.1     skrll 		{
   2684      1.1     skrll 		  m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
   2685      1.1     skrll 					  contents, addend);
   2686      1.1     skrll 		  r = bfd_reloc_ok;
   2687      1.1     skrll 		}
   2688      1.1     skrll 	      else
   2689      1.1     skrll 		r = _bfd_relocate_contents (howto, input_bfd,
   2690      1.1     skrll 					    addend, contents + offset);
   2691      1.1     skrll 	    }
   2692      1.1     skrll 	}
   2693      1.1     skrll       else
   2694      1.1     skrll 	{
   2695      1.1     skrll 	  /* Sanity check the address.  */
   2696      1.1     skrll 	  if (offset > high_address)
   2697      1.1     skrll 	    {
   2698      1.1     skrll 	      r = bfd_reloc_outofrange;
   2699      1.1     skrll 	      goto check_reloc;
   2700      1.1     skrll 	    }
   2701      1.1     skrll 
   2702      1.1     skrll 	  switch ((int) r_type)
   2703      1.1     skrll 	    {
   2704      1.1     skrll             case R_M32R_GOTOFF:
   2705      1.1     skrll               /* Relocation is relative to the start of the global offset
   2706      1.1     skrll                  table (for ld24 rx, #uimm24). eg access at label+addend
   2707      1.1     skrll 
   2708      1.1     skrll                  ld24 rx. #label@GOTOFF + addend
   2709      1.1     skrll                  sub  rx, r12.  */
   2710      1.1     skrll 
   2711      1.1     skrll               BFD_ASSERT (sgot != NULL);
   2712      1.1     skrll 
   2713      1.1     skrll               relocation = -(relocation - sgot->output_section->vma);
   2714      1.1     skrll               rel->r_addend = -rel->r_addend;
   2715      1.1     skrll               break;
   2716      1.1     skrll 
   2717      1.1     skrll             case R_M32R_GOTOFF_HI_ULO:
   2718      1.1     skrll             case R_M32R_GOTOFF_HI_SLO:
   2719      1.1     skrll             case R_M32R_GOTOFF_LO:
   2720      1.1     skrll 	      BFD_ASSERT (sgot != NULL);
   2721      1.1     skrll 
   2722      1.1     skrll 	      relocation -= sgot->output_section->vma;
   2723      1.1     skrll 
   2724      1.1     skrll 	      if ((r_type == R_M32R_GOTOFF_HI_SLO)
   2725      1.1     skrll 		  && ((relocation + rel->r_addend) & 0x8000))
   2726      1.1     skrll 		rel->r_addend += 0x10000;
   2727      1.1     skrll 	      break;
   2728      1.1     skrll 
   2729      1.1     skrll             case R_M32R_GOTPC24:
   2730      1.1     skrll               /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
   2731      1.1     skrll                  ld24 rx,#_GLOBAL_OFFSET_TABLE_
   2732      1.1     skrll                */
   2733      1.1     skrll              relocation = sgot->output_section->vma;
   2734      1.1     skrll              break;
   2735      1.1     skrll 
   2736      1.1     skrll             case R_M32R_GOTPC_HI_ULO:
   2737      1.1     skrll             case R_M32R_GOTPC_HI_SLO:
   2738      1.1     skrll             case R_M32R_GOTPC_LO:
   2739      1.1     skrll               {
   2740      1.1     skrll                 /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
   2741      1.1     skrll                    bl .+4
   2742      1.1     skrll                    seth rx,#high(_GLOBAL_OFFSET_TABLE_)
   2743      1.1     skrll                    or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
   2744      1.1     skrll                    or
   2745      1.1     skrll                    bl .+4
   2746      1.1     skrll                    seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
   2747      1.1     skrll                    add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
   2748      1.1     skrll                  */
   2749      1.1     skrll                 relocation = sgot->output_section->vma;
   2750      1.1     skrll                 relocation -= (input_section->output_section->vma
   2751      1.1     skrll                                + input_section->output_offset
   2752      1.1     skrll                                + rel->r_offset);
   2753      1.1     skrll                 if ((r_type == R_M32R_GOTPC_HI_SLO)
   2754      1.1     skrll                      && ((relocation + rel->r_addend) & 0x8000))
   2755      1.1     skrll                   rel->r_addend += 0x10000;
   2756      1.1     skrll 
   2757      1.1     skrll                 break;
   2758      1.1     skrll               }
   2759      1.1     skrll             case R_M32R_GOT16_HI_ULO:
   2760      1.1     skrll             case R_M32R_GOT16_HI_SLO:
   2761      1.1     skrll             case R_M32R_GOT16_LO:
   2762      1.1     skrll               /* Fall through.  */
   2763      1.1     skrll             case R_M32R_GOT24:
   2764      1.1     skrll               /* Relocation is to the entry for this symbol in the global
   2765      1.1     skrll                  offset table.  */
   2766      1.1     skrll               BFD_ASSERT (sgot != NULL);
   2767      1.1     skrll 
   2768      1.1     skrll               if (h != NULL)
   2769      1.1     skrll                 {
   2770      1.1     skrll                   bfd_boolean dyn;
   2771      1.1     skrll                   bfd_vma off;
   2772      1.1     skrll 
   2773      1.1     skrll                   off = h->got.offset;
   2774      1.1     skrll                   BFD_ASSERT (off != (bfd_vma) -1);
   2775      1.1     skrll 
   2776      1.1     skrll                   dyn = htab->root.dynamic_sections_created;
   2777      1.1     skrll                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   2778      1.1     skrll                       || (info->shared
   2779      1.1     skrll                           && (info->symbolic
   2780      1.1     skrll                               || h->dynindx == -1
   2781      1.1     skrll                               || h->forced_local)
   2782      1.1     skrll                           && h->def_regular))
   2783      1.1     skrll                     {
   2784      1.1     skrll                       /* This is actually a static link, or it is a
   2785      1.1     skrll                          -Bsymbolic link and the symbol is defined
   2786      1.1     skrll                          locally, or the symbol was forced to be local
   2787      1.1     skrll                          because of a version file.  We must initialize
   2788      1.1     skrll                          this entry in the global offset table.  Since the
   2789      1.1     skrll                          offset must always be a multiple of 4, we use the
   2790      1.1     skrll                          least significant bit to record whether we have
   2791      1.1     skrll                          initialized it already.
   2792      1.1     skrll 
   2793      1.1     skrll                          When doing a dynamic link, we create a .rela.got
   2794      1.1     skrll                          relocation entry to initialize the value.  This
   2795      1.1     skrll                          is done in the finish_dynamic_symbol routine.  */
   2796      1.1     skrll                       if ((off & 1) != 0)
   2797      1.1     skrll                         off &= ~1;
   2798      1.1     skrll                       else
   2799      1.1     skrll                         {
   2800      1.1     skrll                           bfd_put_32 (output_bfd, relocation,
   2801      1.1     skrll                                       sgot->contents + off);
   2802      1.1     skrll                           h->got.offset |= 1;
   2803      1.1     skrll                         }
   2804      1.1     skrll                     }
   2805      1.1     skrll 
   2806      1.1     skrll                   relocation = sgot->output_offset + off;
   2807      1.1     skrll                 }
   2808      1.1     skrll               else
   2809      1.1     skrll                 {
   2810      1.1     skrll                   bfd_vma off;
   2811      1.1     skrll                   bfd_byte *loc;
   2812      1.1     skrll 
   2813      1.1     skrll                   BFD_ASSERT (local_got_offsets != NULL
   2814      1.1     skrll                               && local_got_offsets[r_symndx] != (bfd_vma) -1);
   2815      1.1     skrll 
   2816      1.1     skrll                   off = local_got_offsets[r_symndx];
   2817      1.1     skrll 
   2818      1.1     skrll                   /* The offset must always be a multiple of 4.  We use
   2819      1.1     skrll                      the least significant bit to record whether we have
   2820      1.1     skrll                      already processed this entry.  */
   2821      1.1     skrll                   if ((off & 1) != 0)
   2822      1.1     skrll                     off &= ~1;
   2823      1.1     skrll                   else
   2824      1.1     skrll                     {
   2825      1.1     skrll                       bfd_put_32 (output_bfd, relocation, sgot->contents + off);
   2826      1.1     skrll 
   2827      1.1     skrll                       if (info->shared)
   2828      1.1     skrll                         {
   2829      1.1     skrll                           asection *srelgot;
   2830      1.1     skrll                           Elf_Internal_Rela outrel;
   2831      1.1     skrll 
   2832      1.1     skrll                           /* We need to generate a R_M32R_RELATIVE reloc
   2833      1.1     skrll                              for the dynamic linker.  */
   2834      1.1     skrll                           srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   2835      1.1     skrll                           BFD_ASSERT (srelgot != NULL);
   2836      1.1     skrll 
   2837      1.1     skrll                           outrel.r_offset = (sgot->output_section->vma
   2838      1.1     skrll                                              + sgot->output_offset
   2839      1.1     skrll                                              + off);
   2840      1.1     skrll                           outrel.r_info = ELF32_R_INFO (0, R_M32R_RELATIVE);
   2841      1.1     skrll                           outrel.r_addend = relocation;
   2842      1.1     skrll                           loc = srelgot->contents;
   2843      1.1     skrll                           loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
   2844      1.1     skrll                           bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
   2845      1.1     skrll                           ++srelgot->reloc_count;
   2846      1.1     skrll                         }
   2847      1.1     skrll 
   2848      1.1     skrll                       local_got_offsets[r_symndx] |= 1;
   2849      1.1     skrll                     }
   2850      1.1     skrll 
   2851      1.1     skrll                   relocation = sgot->output_offset + off;
   2852      1.1     skrll                 }
   2853      1.1     skrll               if ((r_type == R_M32R_GOT16_HI_SLO)
   2854      1.1     skrll                   && ((relocation + rel->r_addend) & 0x8000))
   2855      1.1     skrll                 rel->r_addend += 0x10000;
   2856      1.1     skrll 
   2857      1.1     skrll               break;
   2858      1.1     skrll 
   2859      1.1     skrll             case R_M32R_26_PLTREL:
   2860      1.1     skrll               /* Relocation is to the entry for this symbol in the
   2861      1.1     skrll                  procedure linkage table.  */
   2862      1.1     skrll 
   2863      1.1     skrll               /* The native assembler will generate a 26_PLTREL reloc
   2864      1.1     skrll                  for a local symbol if you assemble a call from one
   2865      1.1     skrll                  section to another when using -K pic. */
   2866      1.1     skrll               if (h == NULL)
   2867      1.1     skrll                 break;
   2868      1.1     skrll 
   2869      1.1     skrll               if (h->forced_local)
   2870      1.1     skrll                 break;
   2871      1.1     skrll 
   2872      1.1     skrll               if (h->plt.offset == (bfd_vma) -1)
   2873      1.1     skrll 		/* We didn't make a PLT entry for this symbol.  This
   2874      1.1     skrll 		   happens when statically linking PIC code, or when
   2875      1.1     skrll 		   using -Bsymbolic.  */
   2876      1.1     skrll 		break;
   2877      1.1     skrll 
   2878      1.1     skrll               relocation = (splt->output_section->vma
   2879      1.1     skrll                             + splt->output_offset
   2880      1.1     skrll                             + h->plt.offset);
   2881      1.1     skrll               break;
   2882      1.1     skrll 
   2883      1.1     skrll             case R_M32R_HI16_SLO_RELA:
   2884      1.1     skrll 	      if ((relocation + rel->r_addend) & 0x8000)
   2885      1.1     skrll 		rel->r_addend += 0x10000;
   2886      1.1     skrll               /* Fall through.  */
   2887      1.1     skrll 
   2888      1.1     skrll             case R_M32R_16_RELA:
   2889      1.1     skrll             case R_M32R_24_RELA:
   2890      1.1     skrll             case R_M32R_32_RELA:
   2891      1.1     skrll             case R_M32R_REL32:
   2892      1.1     skrll 	    case R_M32R_10_PCREL_RELA:
   2893  1.1.1.2  christos             case R_M32R_18_PCREL_RELA:
   2894      1.1     skrll             case R_M32R_26_PCREL_RELA:
   2895      1.1     skrll             case R_M32R_HI16_ULO_RELA:
   2896      1.1     skrll             case R_M32R_LO16_RELA:
   2897      1.1     skrll               if (info->shared
   2898      1.1     skrll                   && r_symndx != STN_UNDEF
   2899      1.1     skrll                   && (input_section->flags & SEC_ALLOC) != 0
   2900      1.1     skrll                   && ((   r_type != R_M32R_10_PCREL_RELA
   2901      1.1     skrll                        && r_type != R_M32R_18_PCREL_RELA
   2902      1.1     skrll                        && r_type != R_M32R_26_PCREL_RELA
   2903      1.1     skrll                        && r_type != R_M32R_REL32)
   2904      1.1     skrll                       || (h != NULL
   2905      1.1     skrll                           && h->dynindx != -1
   2906      1.1     skrll                           && (! info->symbolic
   2907      1.1     skrll                               || !h->def_regular))))
   2908      1.1     skrll                 {
   2909      1.1     skrll                   Elf_Internal_Rela outrel;
   2910      1.1     skrll                   bfd_boolean skip, relocate;
   2911      1.1     skrll                   bfd_byte *loc;
   2912      1.1     skrll 
   2913  1.1.1.2  christos                   /* When generating a shared object, these relocations
   2914  1.1.1.2  christos                      are copied into the output file to be resolved at run
   2915  1.1.1.2  christos                      time.  */
   2916  1.1.1.2  christos                   if (sreloc == NULL)
   2917      1.1     skrll                     {
   2918      1.1     skrll 		      sreloc = _bfd_elf_get_dynamic_reloc_section
   2919      1.1     skrll 			(input_bfd, input_section, /*rela?*/ TRUE);
   2920      1.1     skrll 		      if (sreloc == NULL)
   2921      1.1     skrll 			return FALSE;
   2922      1.1     skrll                     }
   2923      1.1     skrll 
   2924      1.1     skrll                   skip = FALSE;
   2925      1.1     skrll                   relocate = FALSE;
   2926      1.1     skrll 
   2927      1.1     skrll                   outrel.r_offset = _bfd_elf_section_offset (output_bfd,
   2928      1.1     skrll                                                              info,
   2929      1.1     skrll                                                              input_section,
   2930      1.1     skrll                                                              rel->r_offset);
   2931      1.1     skrll                   if (outrel.r_offset == (bfd_vma) -1)
   2932      1.1     skrll                     skip = TRUE;
   2933      1.1     skrll                   else if (outrel.r_offset == (bfd_vma) -2)
   2934      1.1     skrll                     skip = relocate = TRUE;
   2935      1.1     skrll                   outrel.r_offset += (input_section->output_section->vma
   2936      1.1     skrll                                       + input_section->output_offset);
   2937      1.1     skrll 
   2938      1.1     skrll                   if (skip)
   2939      1.1     skrll                     memset (&outrel, 0, sizeof outrel);
   2940      1.1     skrll                   else if (   r_type == R_M32R_10_PCREL_RELA
   2941      1.1     skrll                            || r_type == R_M32R_18_PCREL_RELA
   2942      1.1     skrll                            || r_type == R_M32R_26_PCREL_RELA
   2943      1.1     skrll                            || r_type == R_M32R_REL32)
   2944      1.1     skrll                     {
   2945      1.1     skrll                       BFD_ASSERT (h != NULL && h->dynindx != -1);
   2946      1.1     skrll                       outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   2947      1.1     skrll                       outrel.r_addend = rel->r_addend;
   2948      1.1     skrll                     }
   2949      1.1     skrll                   else
   2950      1.1     skrll                     {
   2951      1.1     skrll                     /* h->dynindx may be -1 if this symbol was marked to
   2952      1.1     skrll                        become local.  */
   2953      1.1     skrll                     if (h == NULL
   2954      1.1     skrll                         || ((info->symbolic || h->dynindx == -1)
   2955      1.1     skrll                              && h->def_regular))
   2956      1.1     skrll                       {
   2957      1.1     skrll                         relocate = TRUE;
   2958      1.1     skrll                         outrel.r_info = ELF32_R_INFO (0, R_M32R_RELATIVE);
   2959      1.1     skrll                         outrel.r_addend = relocation + rel->r_addend;
   2960      1.1     skrll                       }
   2961      1.1     skrll                     else
   2962      1.1     skrll                       {
   2963      1.1     skrll                         BFD_ASSERT (h->dynindx != -1);
   2964      1.1     skrll                         outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   2965      1.1     skrll                         outrel.r_addend = relocation + rel->r_addend;
   2966      1.1     skrll                       }
   2967      1.1     skrll                     }
   2968      1.1     skrll 
   2969      1.1     skrll                   loc = sreloc->contents;
   2970      1.1     skrll                   loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
   2971      1.1     skrll                   bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
   2972      1.1     skrll                   ++sreloc->reloc_count;
   2973      1.1     skrll 
   2974      1.1     skrll                   /* If this reloc is against an external symbol, we do
   2975      1.1     skrll                      not want to fiddle with the addend.  Otherwise, we
   2976      1.1     skrll                      need to include the symbol value so that it becomes
   2977      1.1     skrll                      an addend for the dynamic reloc.  */
   2978      1.1     skrll                   if (! relocate)
   2979      1.1     skrll                     continue;
   2980      1.1     skrll 		  break;
   2981      1.1     skrll                 }
   2982      1.1     skrll 	      else if (r_type != R_M32R_10_PCREL_RELA)
   2983      1.1     skrll 		break;
   2984      1.1     skrll 	      /* Fall through.  */
   2985      1.1     skrll 
   2986      1.1     skrll 	    case (int) R_M32R_10_PCREL :
   2987      1.1     skrll 	      r = m32r_elf_do_10_pcrel_reloc (input_bfd, howto, input_section,
   2988      1.1     skrll 					      contents, offset,
   2989      1.1     skrll 					      sec, relocation, addend);
   2990      1.1     skrll               goto check_reloc;
   2991      1.1     skrll 
   2992      1.1     skrll 	    case (int) R_M32R_HI16_SLO :
   2993      1.1     skrll 	    case (int) R_M32R_HI16_ULO :
   2994      1.1     skrll 	      {
   2995      1.1     skrll 		Elf_Internal_Rela *lorel;
   2996      1.1     skrll 
   2997      1.1     skrll 		/* We allow an arbitrary number of HI16 relocs before the
   2998      1.1     skrll 		   LO16 reloc.  This permits gcc to emit the HI and LO relocs
   2999      1.1     skrll 		   itself.  */
   3000      1.1     skrll 		for (lorel = rel + 1;
   3001      1.1     skrll 		     (lorel < relend
   3002      1.1     skrll 		      && (ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_SLO
   3003      1.1     skrll 			  || ELF32_R_TYPE (lorel->r_info) == R_M32R_HI16_ULO));
   3004      1.1     skrll 		     lorel++)
   3005      1.1     skrll 		  continue;
   3006      1.1     skrll 		if (lorel < relend
   3007      1.1     skrll 		    && ELF32_R_TYPE (lorel->r_info) == R_M32R_LO16)
   3008      1.1     skrll 		  {
   3009      1.1     skrll 		    m32r_elf_relocate_hi16 (input_bfd, r_type, rel, lorel,
   3010      1.1     skrll 					    contents, relocation + addend);
   3011      1.1     skrll 		    r = bfd_reloc_ok;
   3012      1.1     skrll 		  }
   3013      1.1     skrll 		else
   3014      1.1     skrll 		  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3015      1.1     skrll 						contents, offset,
   3016      1.1     skrll 						relocation, addend);
   3017      1.1     skrll 	      }
   3018      1.1     skrll 
   3019      1.1     skrll               goto check_reloc;
   3020      1.1     skrll 
   3021      1.1     skrll             case (int) R_M32R_SDA16_RELA:
   3022      1.1     skrll 	    case (int) R_M32R_SDA16 :
   3023      1.1     skrll 	      {
   3024      1.1     skrll 		const char *name;
   3025      1.1     skrll 
   3026      1.1     skrll 		BFD_ASSERT (sec != NULL);
   3027      1.1     skrll 		name = bfd_get_section_name (abfd, sec);
   3028      1.1     skrll 
   3029      1.1     skrll 		if (   strcmp (name, ".sdata") == 0
   3030      1.1     skrll 		    || strcmp (name, ".sbss") == 0
   3031      1.1     skrll 		    || strcmp (name, ".scommon") == 0)
   3032      1.1     skrll 		  {
   3033      1.1     skrll 		    bfd_vma sda_base;
   3034      1.1     skrll 		    bfd *out_bfd = sec->output_section->owner;
   3035      1.1     skrll 
   3036      1.1     skrll 		    r = m32r_elf_final_sda_base (out_bfd, info,
   3037      1.1     skrll 						 &errmsg,
   3038      1.1     skrll 						 &sda_base);
   3039      1.1     skrll 		    if (r != bfd_reloc_ok)
   3040      1.1     skrll 		      {
   3041      1.1     skrll 			ret = FALSE;
   3042      1.1     skrll 			goto check_reloc;
   3043      1.1     skrll 		      }
   3044      1.1     skrll 
   3045      1.1     skrll 		    /* At this point `relocation' contains the object's
   3046      1.1     skrll 		       address.  */
   3047      1.1     skrll 		    relocation -= sda_base;
   3048      1.1     skrll 		    /* Now it contains the offset from _SDA_BASE_.  */
   3049      1.1     skrll 		  }
   3050      1.1     skrll 		else
   3051      1.1     skrll 		  {
   3052      1.1     skrll 		    (*_bfd_error_handler)
   3053      1.1     skrll 		      (_("%B: The target (%s) of an %s relocation is in the wrong section (%A)"),
   3054      1.1     skrll 		       input_bfd,
   3055      1.1     skrll 		       sec,
   3056      1.1     skrll 		       sym_name,
   3057      1.1     skrll 		       m32r_elf_howto_table[(int) r_type].name);
   3058      1.1     skrll 		    /*bfd_set_error (bfd_error_bad_value); ??? why? */
   3059      1.1     skrll 		    ret = FALSE;
   3060      1.1     skrll 		    continue;
   3061      1.1     skrll 		  }
   3062      1.1     skrll 	      }
   3063      1.1     skrll               /* Fall through.  */
   3064      1.1     skrll 
   3065      1.1     skrll 	    default : /* OLD_M32R_RELOC */
   3066      1.1     skrll 
   3067      1.1     skrll 	      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3068      1.1     skrll 					    contents, offset,
   3069      1.1     skrll 					    relocation, addend);
   3070      1.1     skrll 	      goto check_reloc;
   3071      1.1     skrll 	    }
   3072      1.1     skrll 
   3073      1.1     skrll           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3074      1.1     skrll                                         contents, rel->r_offset,
   3075      1.1     skrll                                         relocation, rel->r_addend);
   3076      1.1     skrll 
   3077      1.1     skrll 	}
   3078      1.1     skrll 
   3079      1.1     skrll     check_reloc:
   3080      1.1     skrll 
   3081      1.1     skrll       if (r != bfd_reloc_ok)
   3082      1.1     skrll 	{
   3083      1.1     skrll 	  /* FIXME: This should be generic enough to go in a utility.  */
   3084      1.1     skrll 	  const char *name;
   3085      1.1     skrll 
   3086      1.1     skrll 	  if (h != NULL)
   3087      1.1     skrll 	    name = h->root.root.string;
   3088      1.1     skrll 	  else
   3089      1.1     skrll 	    {
   3090      1.1     skrll 	      name = (bfd_elf_string_from_elf_section
   3091      1.1     skrll 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
   3092      1.1     skrll 	      if (name == NULL || *name == '\0')
   3093      1.1     skrll 		name = bfd_section_name (input_bfd, sec);
   3094      1.1     skrll 	    }
   3095      1.1     skrll 
   3096      1.1     skrll 	  if (errmsg != NULL)
   3097      1.1     skrll 	    goto common_error;
   3098      1.1     skrll 
   3099      1.1     skrll 	  switch (r)
   3100      1.1     skrll 	    {
   3101      1.1     skrll 	    case bfd_reloc_overflow:
   3102      1.1     skrll 	      if (! ((*info->callbacks->reloc_overflow)
   3103      1.1     skrll 		     (info, (h ? &h->root : NULL), name, howto->name,
   3104      1.1     skrll 		      (bfd_vma) 0, input_bfd, input_section, offset)))
   3105      1.1     skrll 		return FALSE;
   3106      1.1     skrll 	      break;
   3107      1.1     skrll 
   3108      1.1     skrll 	    case bfd_reloc_undefined:
   3109      1.1     skrll 	      if (! ((*info->callbacks->undefined_symbol)
   3110      1.1     skrll 		     (info, name, input_bfd, input_section,
   3111      1.1     skrll 		      offset, TRUE)))
   3112      1.1     skrll 		return FALSE;
   3113      1.1     skrll 	      break;
   3114      1.1     skrll 
   3115      1.1     skrll 	    case bfd_reloc_outofrange:
   3116      1.1     skrll 	      errmsg = _("internal error: out of range error");
   3117      1.1     skrll 	      goto common_error;
   3118      1.1     skrll 
   3119      1.1     skrll 	    case bfd_reloc_notsupported:
   3120      1.1     skrll 	      errmsg = _("internal error: unsupported relocation error");
   3121      1.1     skrll 	      goto common_error;
   3122      1.1     skrll 
   3123      1.1     skrll 	    case bfd_reloc_dangerous:
   3124      1.1     skrll 	      errmsg = _("internal error: dangerous error");
   3125      1.1     skrll 	      goto common_error;
   3126      1.1     skrll 
   3127      1.1     skrll 	    default:
   3128      1.1     skrll 	      errmsg = _("internal error: unknown error");
   3129      1.1     skrll 	      /* fall through */
   3130      1.1     skrll 
   3131      1.1     skrll 	    common_error:
   3132      1.1     skrll 	      if (!((*info->callbacks->warning)
   3133      1.1     skrll 		    (info, errmsg, name, input_bfd, input_section,
   3134      1.1     skrll 		     offset)))
   3135      1.1     skrll 		return FALSE;
   3136      1.1     skrll 	      break;
   3137      1.1     skrll 	    }
   3138      1.1     skrll 	}
   3139      1.1     skrll     }
   3140      1.1     skrll 
   3141      1.1     skrll   return ret;
   3142      1.1     skrll }
   3143      1.1     skrll 
   3144      1.1     skrll /* Finish up dynamic symbol handling.  We set the contents of various
   3145      1.1     skrll    dynamic sections here.  */
   3146      1.1     skrll 
   3147      1.1     skrll static bfd_boolean
   3148      1.1     skrll m32r_elf_finish_dynamic_symbol (bfd *output_bfd,
   3149      1.1     skrll 				struct bfd_link_info *info,
   3150      1.1     skrll 				struct elf_link_hash_entry *h,
   3151      1.1     skrll 				Elf_Internal_Sym *sym)
   3152      1.1     skrll {
   3153      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   3154      1.1     skrll   bfd_byte *loc;
   3155      1.1     skrll 
   3156  1.1.1.2  christos #ifdef DEBUG_PIC
   3157  1.1.1.2  christos   printf ("m32r_elf_finish_dynamic_symbol()\n");
   3158      1.1     skrll #endif
   3159      1.1     skrll 
   3160      1.1     skrll   htab = m32r_elf_hash_table (info);
   3161      1.1     skrll   if (htab == NULL)
   3162      1.1     skrll     return FALSE;
   3163      1.1     skrll 
   3164      1.1     skrll   if (h->plt.offset != (bfd_vma) -1)
   3165      1.1     skrll     {
   3166      1.1     skrll       asection *splt;
   3167      1.1     skrll       asection *sgot;
   3168      1.1     skrll       asection *srela;
   3169      1.1     skrll 
   3170      1.1     skrll       bfd_vma plt_index;
   3171      1.1     skrll       bfd_vma got_offset;
   3172      1.1     skrll       Elf_Internal_Rela rela;
   3173      1.1     skrll 
   3174      1.1     skrll       /* This symbol has an entry in the procedure linkage table.  Set
   3175      1.1     skrll          it up.  */
   3176      1.1     skrll 
   3177      1.1     skrll       BFD_ASSERT (h->dynindx != -1);
   3178      1.1     skrll 
   3179      1.1     skrll       splt = htab->splt;
   3180      1.1     skrll       sgot = htab->sgotplt;
   3181      1.1     skrll       srela = htab->srelplt;
   3182      1.1     skrll       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
   3183      1.1     skrll 
   3184      1.1     skrll       /* Get the index in the procedure linkage table which
   3185      1.1     skrll          corresponds to this symbol.  This is the index of this symbol
   3186      1.1     skrll          in all the symbols for which we are making plt entries.  The
   3187      1.1     skrll          first entry in the procedure linkage table is reserved.  */
   3188      1.1     skrll       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
   3189      1.1     skrll 
   3190      1.1     skrll       /* Get the offset into the .got table of the entry that
   3191      1.1     skrll         corresponds to this function.  Each .got entry is 4 bytes.
   3192      1.1     skrll         The first three are reserved.  */
   3193      1.1     skrll       got_offset = (plt_index + 3) * 4;
   3194      1.1     skrll 
   3195      1.1     skrll       /* Fill in the entry in the procedure linkage table.  */
   3196      1.1     skrll       if (! info->shared)
   3197      1.1     skrll         {
   3198      1.1     skrll           bfd_put_32 (output_bfd,
   3199      1.1     skrll               (PLT_ENTRY_WORD0b
   3200      1.1     skrll                + (((sgot->output_section->vma
   3201      1.1     skrll                     + sgot->output_offset
   3202      1.1     skrll                     + got_offset) >> 16) & 0xffff)),
   3203      1.1     skrll               splt->contents + h->plt.offset);
   3204      1.1     skrll           bfd_put_32 (output_bfd,
   3205      1.1     skrll               (PLT_ENTRY_WORD1b
   3206      1.1     skrll                + ((sgot->output_section->vma
   3207      1.1     skrll                    + sgot->output_offset
   3208      1.1     skrll                    + got_offset) & 0xffff)),
   3209      1.1     skrll               splt->contents + h->plt.offset + 4);
   3210      1.1     skrll           bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
   3211      1.1     skrll               splt->contents + h->plt.offset + 8);
   3212      1.1     skrll           bfd_put_32 (output_bfd,
   3213      1.1     skrll               (PLT_ENTRY_WORD3
   3214      1.1     skrll                + plt_index * sizeof (Elf32_External_Rela)),
   3215      1.1     skrll               splt->contents + h->plt.offset + 12);
   3216      1.1     skrll           bfd_put_32 (output_bfd,
   3217      1.1     skrll               (PLT_ENTRY_WORD4
   3218      1.1     skrll                + (((unsigned int) ((- (h->plt.offset + 16)) >> 2)) & 0xffffff)),
   3219      1.1     skrll               splt->contents + h->plt.offset + 16);
   3220      1.1     skrll         }
   3221      1.1     skrll       else
   3222      1.1     skrll         {
   3223      1.1     skrll           bfd_put_32 (output_bfd,
   3224      1.1     skrll               PLT_ENTRY_WORD0 + got_offset,
   3225      1.1     skrll               splt->contents + h->plt.offset);
   3226      1.1     skrll           bfd_put_32 (output_bfd, PLT_ENTRY_WORD1,
   3227      1.1     skrll               splt->contents + h->plt.offset + 4);
   3228      1.1     skrll           bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
   3229      1.1     skrll               splt->contents + h->plt.offset + 8);
   3230      1.1     skrll           bfd_put_32 (output_bfd,
   3231      1.1     skrll               (PLT_ENTRY_WORD3
   3232      1.1     skrll                + plt_index * sizeof (Elf32_External_Rela)),
   3233      1.1     skrll               splt->contents + h->plt.offset + 12);
   3234      1.1     skrll           bfd_put_32 (output_bfd,
   3235      1.1     skrll               (PLT_ENTRY_WORD4
   3236      1.1     skrll                + (((unsigned int) ((- (h->plt.offset + 16)) >> 2)) & 0xffffff)),
   3237      1.1     skrll               splt->contents + h->plt.offset + 16);
   3238      1.1     skrll         }
   3239      1.1     skrll 
   3240      1.1     skrll       /* Fill in the entry in the global offset table.  */
   3241      1.1     skrll       bfd_put_32 (output_bfd,
   3242      1.1     skrll                   (splt->output_section->vma
   3243      1.1     skrll                    + splt->output_offset
   3244      1.1     skrll                    + h->plt.offset
   3245      1.1     skrll                    + 12), /* same offset */
   3246      1.1     skrll                   sgot->contents + got_offset);
   3247      1.1     skrll 
   3248      1.1     skrll       /* Fill in the entry in the .rela.plt section.  */
   3249      1.1     skrll       rela.r_offset = (sgot->output_section->vma
   3250      1.1     skrll                        + sgot->output_offset
   3251      1.1     skrll                        + got_offset);
   3252      1.1     skrll       rela.r_info = ELF32_R_INFO (h->dynindx, R_M32R_JMP_SLOT);
   3253      1.1     skrll       rela.r_addend = 0;
   3254      1.1     skrll       loc = srela->contents;
   3255      1.1     skrll       loc += plt_index * sizeof (Elf32_External_Rela);
   3256      1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   3257      1.1     skrll 
   3258      1.1     skrll       if (!h->def_regular)
   3259      1.1     skrll         {
   3260      1.1     skrll           /* Mark the symbol as undefined, rather than as defined in
   3261      1.1     skrll              the .plt section.  Leave the value alone.  */
   3262      1.1     skrll           sym->st_shndx = SHN_UNDEF;
   3263      1.1     skrll         }
   3264      1.1     skrll     }
   3265      1.1     skrll 
   3266      1.1     skrll   if (h->got.offset != (bfd_vma) -1)
   3267      1.1     skrll     {
   3268      1.1     skrll       asection *sgot;
   3269      1.1     skrll       asection *srela;
   3270      1.1     skrll       Elf_Internal_Rela rela;
   3271      1.1     skrll 
   3272      1.1     skrll       /* This symbol has an entry in the global offset table.  Set it
   3273      1.1     skrll          up.  */
   3274      1.1     skrll 
   3275      1.1     skrll       sgot = htab->sgot;
   3276      1.1     skrll       srela = htab->srelgot;
   3277      1.1     skrll       BFD_ASSERT (sgot != NULL && srela != NULL);
   3278      1.1     skrll 
   3279      1.1     skrll       rela.r_offset = (sgot->output_section->vma
   3280      1.1     skrll                        + sgot->output_offset
   3281      1.1     skrll                        + (h->got.offset &~ 1));
   3282      1.1     skrll 
   3283      1.1     skrll       /* If this is a -Bsymbolic link, and the symbol is defined
   3284      1.1     skrll          locally, we just want to emit a RELATIVE reloc.  Likewise if
   3285      1.1     skrll          the symbol was forced to be local because of a version file.
   3286      1.1     skrll          The entry in the global offset table will already have been
   3287      1.1     skrll          initialized in the relocate_section function.  */
   3288      1.1     skrll       if (info->shared
   3289      1.1     skrll           && (info->symbolic
   3290      1.1     skrll 	      || h->dynindx == -1
   3291      1.1     skrll 	      || h->forced_local)
   3292      1.1     skrll           && h->def_regular)
   3293      1.1     skrll         {
   3294      1.1     skrll           rela.r_info = ELF32_R_INFO (0, R_M32R_RELATIVE);
   3295      1.1     skrll           rela.r_addend = (h->root.u.def.value
   3296      1.1     skrll                            + h->root.u.def.section->output_section->vma
   3297      1.1     skrll                            + h->root.u.def.section->output_offset);
   3298      1.1     skrll         }
   3299      1.1     skrll       else
   3300      1.1     skrll         {
   3301      1.1     skrll 	  BFD_ASSERT ((h->got.offset & 1) == 0);
   3302      1.1     skrll           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
   3303      1.1     skrll           rela.r_info = ELF32_R_INFO (h->dynindx, R_M32R_GLOB_DAT);
   3304      1.1     skrll           rela.r_addend = 0;
   3305      1.1     skrll         }
   3306      1.1     skrll 
   3307      1.1     skrll       loc = srela->contents;
   3308      1.1     skrll       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
   3309      1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   3310      1.1     skrll       ++srela->reloc_count;
   3311      1.1     skrll     }
   3312      1.1     skrll 
   3313      1.1     skrll   if (h->needs_copy)
   3314      1.1     skrll     {
   3315      1.1     skrll       asection *s;
   3316      1.1     skrll       Elf_Internal_Rela rela;
   3317      1.1     skrll 
   3318      1.1     skrll       /* This symbols needs a copy reloc.  Set it up.  */
   3319      1.1     skrll 
   3320      1.1     skrll       BFD_ASSERT (h->dynindx != -1
   3321      1.1     skrll                   && (h->root.type == bfd_link_hash_defined
   3322      1.1     skrll                       || h->root.type == bfd_link_hash_defweak));
   3323      1.1     skrll 
   3324      1.1     skrll       s = bfd_get_section_by_name (h->root.u.def.section->owner,
   3325      1.1     skrll                                    ".rela.bss");
   3326      1.1     skrll       BFD_ASSERT (s != NULL);
   3327      1.1     skrll 
   3328      1.1     skrll       rela.r_offset = (h->root.u.def.value
   3329      1.1     skrll                        + h->root.u.def.section->output_section->vma
   3330      1.1     skrll                        + h->root.u.def.section->output_offset);
   3331      1.1     skrll       rela.r_info = ELF32_R_INFO (h->dynindx, R_M32R_COPY);
   3332      1.1     skrll       rela.r_addend = 0;
   3333      1.1     skrll       loc = s->contents;
   3334      1.1     skrll       loc += s->reloc_count * sizeof (Elf32_External_Rela);
   3335      1.1     skrll       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   3336      1.1     skrll       ++s->reloc_count;
   3337      1.1     skrll     }
   3338      1.1     skrll 
   3339      1.1     skrll   /* Mark some specially defined symbols as absolute.  */
   3340      1.1     skrll   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
   3341      1.1     skrll       || h == htab->root.hgot)
   3342      1.1     skrll     sym->st_shndx = SHN_ABS;
   3343      1.1     skrll 
   3344      1.1     skrll   return TRUE;
   3345      1.1     skrll }
   3346      1.1     skrll 
   3347      1.1     skrll 
   3348      1.1     skrll /* Finish up the dynamic sections.  */
   3349      1.1     skrll 
   3350      1.1     skrll static bfd_boolean
   3351      1.1     skrll m32r_elf_finish_dynamic_sections (bfd *output_bfd,
   3352      1.1     skrll 				  struct bfd_link_info *info)
   3353      1.1     skrll {
   3354      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   3355      1.1     skrll   bfd *dynobj;
   3356      1.1     skrll   asection *sdyn;
   3357      1.1     skrll   asection *sgot;
   3358      1.1     skrll 
   3359  1.1.1.2  christos #ifdef DEBUG_PIC
   3360  1.1.1.2  christos   printf ("m32r_elf_finish_dynamic_sections()\n");
   3361  1.1.1.2  christos #endif
   3362      1.1     skrll 
   3363      1.1     skrll   htab = m32r_elf_hash_table (info);
   3364      1.1     skrll   if (htab == NULL)
   3365      1.1     skrll     return FALSE;
   3366      1.1     skrll 
   3367      1.1     skrll   dynobj = htab->root.dynobj;
   3368      1.1     skrll 
   3369      1.1     skrll   sgot = htab->sgotplt;
   3370      1.1     skrll   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
   3371      1.1     skrll 
   3372      1.1     skrll   if (htab->root.dynamic_sections_created)
   3373      1.1     skrll     {
   3374      1.1     skrll       asection *splt;
   3375      1.1     skrll       Elf32_External_Dyn *dyncon, *dynconend;
   3376      1.1     skrll 
   3377      1.1     skrll       BFD_ASSERT (sgot != NULL && sdyn != NULL);
   3378      1.1     skrll 
   3379      1.1     skrll       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   3380      1.1     skrll       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   3381      1.1     skrll 
   3382      1.1     skrll       for (; dyncon < dynconend; dyncon++)
   3383      1.1     skrll         {
   3384      1.1     skrll           Elf_Internal_Dyn dyn;
   3385      1.1     skrll           asection *s;
   3386      1.1     skrll 
   3387      1.1     skrll           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   3388      1.1     skrll 
   3389      1.1     skrll           switch (dyn.d_tag)
   3390      1.1     skrll             {
   3391      1.1     skrll             default:
   3392      1.1     skrll               break;
   3393      1.1     skrll 
   3394      1.1     skrll             case DT_PLTGOT:
   3395      1.1     skrll               s = htab->sgot->output_section;
   3396      1.1     skrll               goto get_vma;
   3397      1.1     skrll             case DT_JMPREL:
   3398      1.1     skrll               s = htab->srelplt->output_section;
   3399      1.1     skrll             get_vma:
   3400      1.1     skrll               BFD_ASSERT (s != NULL);
   3401      1.1     skrll               dyn.d_un.d_ptr = s->vma;
   3402      1.1     skrll               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   3403      1.1     skrll               break;
   3404      1.1     skrll 
   3405      1.1     skrll             case DT_PLTRELSZ:
   3406      1.1     skrll               s = htab->srelplt->output_section;
   3407      1.1     skrll               BFD_ASSERT (s != NULL);
   3408      1.1     skrll 	      dyn.d_un.d_val = s->size;
   3409      1.1     skrll               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   3410      1.1     skrll               break;
   3411      1.1     skrll 
   3412      1.1     skrll             case DT_RELASZ:
   3413      1.1     skrll               /* My reading of the SVR4 ABI indicates that the
   3414      1.1     skrll                  procedure linkage table relocs (DT_JMPREL) should be
   3415      1.1     skrll                  included in the overall relocs (DT_RELA).  This is
   3416      1.1     skrll                  what Solaris does.  However, UnixWare can not handle
   3417      1.1     skrll                  that case.  Therefore, we override the DT_RELASZ entry
   3418      1.1     skrll                  here to make it not include the JMPREL relocs.  Since
   3419      1.1     skrll                  the linker script arranges for .rela.plt to follow all
   3420      1.1     skrll                  other relocation sections, we don't have to worry
   3421      1.1     skrll                  about changing the DT_RELA entry.  */
   3422      1.1     skrll               if (htab->srelplt != NULL)
   3423      1.1     skrll                 {
   3424      1.1     skrll                   s = htab->srelplt->output_section;
   3425      1.1     skrll 		  dyn.d_un.d_val -= s->size;
   3426      1.1     skrll                 }
   3427      1.1     skrll               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   3428      1.1     skrll               break;
   3429      1.1     skrll             }
   3430      1.1     skrll         }
   3431      1.1     skrll 
   3432      1.1     skrll       /* Fill in the first entry in the procedure linkage table.  */
   3433      1.1     skrll       splt = htab->splt;
   3434      1.1     skrll       if (splt && splt->size > 0)
   3435      1.1     skrll         {
   3436      1.1     skrll           if (info->shared)
   3437      1.1     skrll             {
   3438      1.1     skrll               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0, splt->contents);
   3439      1.1     skrll               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1, splt->contents + 4);
   3440      1.1     skrll               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2, splt->contents + 8);
   3441      1.1     skrll               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3, splt->contents + 12);
   3442      1.1     skrll               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4, splt->contents + 16);
   3443      1.1     skrll             }
   3444      1.1     skrll           else
   3445      1.1     skrll             {
   3446      1.1     skrll               unsigned long addr;
   3447      1.1     skrll               /* addr = .got + 4 */
   3448      1.1     skrll               addr = sgot->output_section->vma + sgot->output_offset + 4;
   3449      1.1     skrll               bfd_put_32 (output_bfd,
   3450      1.1     skrll 			  PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff),
   3451      1.1     skrll 			  splt->contents);
   3452      1.1     skrll               bfd_put_32 (output_bfd,
   3453      1.1     skrll 			  PLT0_ENTRY_WORD1 | (addr & 0xffff),
   3454      1.1     skrll 			  splt->contents + 4);
   3455      1.1     skrll               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8);
   3456      1.1     skrll               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12);
   3457      1.1     skrll               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16);
   3458      1.1     skrll             }
   3459      1.1     skrll 
   3460      1.1     skrll           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
   3461      1.1     skrll             PLT_ENTRY_SIZE;
   3462      1.1     skrll         }
   3463      1.1     skrll     }
   3464      1.1     skrll 
   3465      1.1     skrll   /* Fill in the first three entries in the global offset table.  */
   3466      1.1     skrll   if (sgot && sgot->size > 0)
   3467      1.1     skrll     {
   3468      1.1     skrll       if (sdyn == NULL)
   3469      1.1     skrll         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
   3470      1.1     skrll       else
   3471      1.1     skrll         bfd_put_32 (output_bfd,
   3472      1.1     skrll                     sdyn->output_section->vma + sdyn->output_offset,
   3473      1.1     skrll                     sgot->contents);
   3474      1.1     skrll       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
   3475      1.1     skrll       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
   3476      1.1     skrll 
   3477      1.1     skrll       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
   3478      1.1     skrll     }
   3479      1.1     skrll 
   3480      1.1     skrll   return TRUE;
   3481      1.1     skrll }
   3482      1.1     skrll 
   3483      1.1     skrll 
   3484      1.1     skrll /* Set the right machine number.  */
   3486      1.1     skrll 
   3487      1.1     skrll static bfd_boolean
   3488      1.1     skrll m32r_elf_object_p (bfd *abfd)
   3489      1.1     skrll {
   3490      1.1     skrll   switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
   3491      1.1     skrll     {
   3492      1.1     skrll     default:
   3493      1.1     skrll     case E_M32R_ARCH:   (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32r);  break;
   3494      1.1     skrll     case E_M32RX_ARCH:  (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32rx); break;
   3495      1.1     skrll     case E_M32R2_ARCH:  (void) bfd_default_set_arch_mach (abfd, bfd_arch_m32r, bfd_mach_m32r2); break;
   3496      1.1     skrll     }
   3497      1.1     skrll   return TRUE;
   3498      1.1     skrll }
   3499      1.1     skrll 
   3500      1.1     skrll /* Store the machine number in the flags field.  */
   3501      1.1     skrll 
   3502      1.1     skrll static void
   3503      1.1     skrll m32r_elf_final_write_processing (bfd *abfd,
   3504      1.1     skrll 				 bfd_boolean linker ATTRIBUTE_UNUSED)
   3505      1.1     skrll {
   3506      1.1     skrll   unsigned long val;
   3507      1.1     skrll 
   3508      1.1     skrll   switch (bfd_get_mach (abfd))
   3509      1.1     skrll     {
   3510      1.1     skrll     default:
   3511      1.1     skrll     case bfd_mach_m32r:  val = E_M32R_ARCH; break;
   3512      1.1     skrll     case bfd_mach_m32rx: val = E_M32RX_ARCH; break;
   3513      1.1     skrll     case bfd_mach_m32r2: val = E_M32R2_ARCH; break;
   3514      1.1     skrll     }
   3515      1.1     skrll 
   3516      1.1     skrll   elf_elfheader (abfd)->e_flags &=~ EF_M32R_ARCH;
   3517      1.1     skrll   elf_elfheader (abfd)->e_flags |= val;
   3518      1.1     skrll }
   3519      1.1     skrll 
   3520      1.1     skrll /* Function to keep M32R specific file flags.  */
   3521      1.1     skrll 
   3522      1.1     skrll static bfd_boolean
   3523      1.1     skrll m32r_elf_set_private_flags (bfd *abfd, flagword flags)
   3524      1.1     skrll {
   3525      1.1     skrll   BFD_ASSERT (!elf_flags_init (abfd)
   3526      1.1     skrll 	      || elf_elfheader (abfd)->e_flags == flags);
   3527      1.1     skrll 
   3528      1.1     skrll   elf_elfheader (abfd)->e_flags = flags;
   3529      1.1     skrll   elf_flags_init (abfd) = TRUE;
   3530      1.1     skrll   return TRUE;
   3531      1.1     skrll }
   3532      1.1     skrll 
   3533      1.1     skrll /* Merge backend specific data from an object file to the output
   3534      1.1     skrll    object file when linking.  */
   3535      1.1     skrll 
   3536      1.1     skrll static bfd_boolean
   3537      1.1     skrll m32r_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   3538      1.1     skrll {
   3539      1.1     skrll   flagword out_flags;
   3540      1.1     skrll   flagword in_flags;
   3541      1.1     skrll 
   3542      1.1     skrll   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   3543      1.1     skrll       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   3544      1.1     skrll     return TRUE;
   3545      1.1     skrll 
   3546      1.1     skrll   in_flags  = elf_elfheader (ibfd)->e_flags;
   3547      1.1     skrll   out_flags = elf_elfheader (obfd)->e_flags;
   3548      1.1     skrll 
   3549      1.1     skrll   if (! elf_flags_init (obfd))
   3550      1.1     skrll     {
   3551      1.1     skrll       /* If the input is the default architecture then do not
   3552      1.1     skrll 	 bother setting the flags for the output architecture,
   3553      1.1     skrll 	 instead allow future merges to do this.  If no future
   3554      1.1     skrll 	 merges ever set these flags then they will retain their
   3555      1.1     skrll 	 unitialised values, which surprise surprise, correspond
   3556      1.1     skrll 	 to the default values.  */
   3557      1.1     skrll       if (bfd_get_arch_info (ibfd)->the_default)
   3558      1.1     skrll 	return TRUE;
   3559      1.1     skrll 
   3560      1.1     skrll       elf_flags_init (obfd) = TRUE;
   3561      1.1     skrll       elf_elfheader (obfd)->e_flags = in_flags;
   3562      1.1     skrll 
   3563      1.1     skrll       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   3564      1.1     skrll 	  && bfd_get_arch_info (obfd)->the_default)
   3565      1.1     skrll 	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
   3566      1.1     skrll 				  bfd_get_mach (ibfd));
   3567      1.1     skrll 
   3568      1.1     skrll       return TRUE;
   3569      1.1     skrll     }
   3570      1.1     skrll 
   3571      1.1     skrll   /* Check flag compatibility.  */
   3572      1.1     skrll   if (in_flags == out_flags)
   3573      1.1     skrll     return TRUE;
   3574      1.1     skrll 
   3575      1.1     skrll   if ((in_flags & EF_M32R_ARCH) != (out_flags & EF_M32R_ARCH))
   3576      1.1     skrll     {
   3577      1.1     skrll       if (   ((in_flags  & EF_M32R_ARCH) != E_M32R_ARCH)
   3578      1.1     skrll           || ((out_flags & EF_M32R_ARCH) == E_M32R_ARCH)
   3579      1.1     skrll           || ((in_flags  & EF_M32R_ARCH) == E_M32R2_ARCH))
   3580      1.1     skrll 	{
   3581      1.1     skrll 	  (*_bfd_error_handler)
   3582      1.1     skrll 	    (_("%B: Instruction set mismatch with previous modules"), ibfd);
   3583      1.1     skrll 
   3584      1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   3585      1.1     skrll 	  return FALSE;
   3586      1.1     skrll 	}
   3587      1.1     skrll     }
   3588      1.1     skrll 
   3589      1.1     skrll   return TRUE;
   3590      1.1     skrll }
   3591      1.1     skrll 
   3592      1.1     skrll /* Display the flags field.  */
   3593      1.1     skrll 
   3594      1.1     skrll static bfd_boolean
   3595      1.1     skrll m32r_elf_print_private_bfd_data (bfd *abfd, void * ptr)
   3596      1.1     skrll {
   3597      1.1     skrll   FILE * file = (FILE *) ptr;
   3598      1.1     skrll 
   3599      1.1     skrll   BFD_ASSERT (abfd != NULL && ptr != NULL);
   3600      1.1     skrll 
   3601      1.1     skrll   _bfd_elf_print_private_bfd_data (abfd, ptr);
   3602      1.1     skrll 
   3603      1.1     skrll   fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
   3604      1.1     skrll 
   3605      1.1     skrll   switch (elf_elfheader (abfd)->e_flags & EF_M32R_ARCH)
   3606      1.1     skrll     {
   3607      1.1     skrll     default:
   3608      1.1     skrll     case E_M32R_ARCH:  fprintf (file, _(": m32r instructions"));  break;
   3609      1.1     skrll     case E_M32RX_ARCH: fprintf (file, _(": m32rx instructions")); break;
   3610      1.1     skrll     case E_M32R2_ARCH: fprintf (file, _(": m32r2 instructions")); break;
   3611      1.1     skrll     }
   3612      1.1     skrll 
   3613      1.1     skrll   fputc ('\n', file);
   3614      1.1     skrll 
   3615      1.1     skrll   return TRUE;
   3616      1.1     skrll }
   3617      1.1     skrll 
   3618      1.1     skrll static asection *
   3619      1.1     skrll m32r_elf_gc_mark_hook (asection *sec,
   3620      1.1     skrll 		       struct bfd_link_info *info,
   3621      1.1     skrll 		       Elf_Internal_Rela *rel,
   3622      1.1     skrll 		       struct elf_link_hash_entry *h,
   3623      1.1     skrll 		       Elf_Internal_Sym *sym)
   3624      1.1     skrll {
   3625      1.1     skrll   if (h != NULL)
   3626      1.1     skrll     switch (ELF32_R_TYPE (rel->r_info))
   3627      1.1     skrll       {
   3628      1.1     skrll       case R_M32R_GNU_VTINHERIT:
   3629      1.1     skrll       case R_M32R_GNU_VTENTRY:
   3630      1.1     skrll       case R_M32R_RELA_GNU_VTINHERIT:
   3631      1.1     skrll       case R_M32R_RELA_GNU_VTENTRY:
   3632      1.1     skrll 	return NULL;
   3633      1.1     skrll       }
   3634      1.1     skrll 
   3635      1.1     skrll   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   3636      1.1     skrll }
   3637      1.1     skrll 
   3638      1.1     skrll static bfd_boolean
   3639      1.1     skrll m32r_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
   3640      1.1     skrll 			struct bfd_link_info *info ATTRIBUTE_UNUSED,
   3641      1.1     skrll 			asection *sec ATTRIBUTE_UNUSED,
   3642      1.1     skrll 			const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
   3643      1.1     skrll {
   3644      1.1     skrll   /* Update the got entry reference counts for the section being removed.  */
   3645      1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   3646      1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   3647      1.1     skrll   bfd_signed_vma *local_got_refcounts;
   3648      1.1     skrll   const Elf_Internal_Rela *rel, *relend;
   3649      1.1     skrll 
   3650      1.1     skrll   if (info->relocatable)
   3651      1.1     skrll     return TRUE;
   3652      1.1     skrll 
   3653      1.1     skrll   elf_section_data (sec)->local_dynrel = NULL;
   3654      1.1     skrll 
   3655      1.1     skrll   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   3656      1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   3657      1.1     skrll   local_got_refcounts = elf_local_got_refcounts (abfd);
   3658      1.1     skrll 
   3659      1.1     skrll   relend = relocs + sec->reloc_count;
   3660      1.1     skrll   for (rel = relocs; rel < relend; rel++)
   3661      1.1     skrll     {
   3662      1.1     skrll       unsigned long r_symndx;
   3663      1.1     skrll       struct elf_link_hash_entry *h = NULL;
   3664      1.1     skrll 
   3665      1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   3666      1.1     skrll       if (r_symndx >= symtab_hdr->sh_info)
   3667      1.1     skrll 	{
   3668      1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   3669      1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   3670      1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   3671      1.1     skrll 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   3672      1.1     skrll 	}
   3673      1.1     skrll 
   3674      1.1     skrll       switch (ELF32_R_TYPE (rel->r_info))
   3675      1.1     skrll 	{
   3676      1.1     skrll 	case R_M32R_GOT16_HI_ULO:
   3677      1.1     skrll 	case R_M32R_GOT16_HI_SLO:
   3678      1.1     skrll 	case R_M32R_GOT16_LO:
   3679      1.1     skrll 	case R_M32R_GOTOFF:
   3680      1.1     skrll 	case R_M32R_GOTOFF_HI_ULO:
   3681      1.1     skrll 	case R_M32R_GOTOFF_HI_SLO:
   3682      1.1     skrll 	case R_M32R_GOTOFF_LO:
   3683      1.1     skrll 	case R_M32R_GOT24:
   3684      1.1     skrll 	case R_M32R_GOTPC_HI_ULO:
   3685      1.1     skrll 	case R_M32R_GOTPC_HI_SLO:
   3686      1.1     skrll 	case R_M32R_GOTPC_LO:
   3687      1.1     skrll 	case R_M32R_GOTPC24:
   3688      1.1     skrll 	  if (h != NULL)
   3689      1.1     skrll 	    {
   3690      1.1     skrll 	      if (h->got.refcount > 0)
   3691      1.1     skrll 		h->got.refcount--;
   3692      1.1     skrll 	    }
   3693      1.1     skrll 	  else
   3694      1.1     skrll 	    {
   3695      1.1     skrll 	      if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
   3696      1.1     skrll 		local_got_refcounts[r_symndx]--;
   3697      1.1     skrll 	    }
   3698      1.1     skrll 	  break;
   3699      1.1     skrll 
   3700      1.1     skrll 	case R_M32R_16_RELA:
   3701      1.1     skrll 	case R_M32R_24_RELA:
   3702      1.1     skrll 	case R_M32R_32_RELA:
   3703      1.1     skrll 	case R_M32R_REL32:
   3704      1.1     skrll 	case R_M32R_HI16_ULO_RELA:
   3705      1.1     skrll 	case R_M32R_HI16_SLO_RELA:
   3706      1.1     skrll 	case R_M32R_LO16_RELA:
   3707      1.1     skrll 	case R_M32R_SDA16_RELA:
   3708      1.1     skrll 	case R_M32R_10_PCREL_RELA:
   3709      1.1     skrll 	case R_M32R_18_PCREL_RELA:
   3710      1.1     skrll 	case R_M32R_26_PCREL_RELA:
   3711      1.1     skrll 	  if (h != NULL)
   3712      1.1     skrll 	    {
   3713      1.1     skrll 	      struct elf_m32r_link_hash_entry *eh;
   3714      1.1     skrll 	      struct elf_m32r_dyn_relocs **pp;
   3715      1.1     skrll 	      struct elf_m32r_dyn_relocs *p;
   3716      1.1     skrll 
   3717      1.1     skrll 	      if (!info->shared && h->plt.refcount > 0)
   3718      1.1     skrll 		h->plt.refcount -= 1;
   3719      1.1     skrll 
   3720      1.1     skrll 	      eh = (struct elf_m32r_link_hash_entry *) h;
   3721      1.1     skrll 
   3722      1.1     skrll 	      for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
   3723      1.1     skrll 		if (p->sec == sec)
   3724      1.1     skrll 		  {
   3725      1.1     skrll 		    if (   ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
   3726      1.1     skrll 			|| ELF32_R_TYPE (rel->r_info) == R_M32R_18_PCREL_RELA
   3727      1.1     skrll 			|| ELF32_R_TYPE (rel->r_info) == R_M32R_10_PCREL_RELA
   3728      1.1     skrll 			|| ELF32_R_TYPE (rel->r_info) == R_M32R_REL32)
   3729      1.1     skrll 		      p->pc_count -= 1;
   3730      1.1     skrll 		    p->count -= 1;
   3731      1.1     skrll 		    if (p->count == 0)
   3732      1.1     skrll 		      *pp = p->next;
   3733      1.1     skrll 		    break;
   3734      1.1     skrll 		  }
   3735      1.1     skrll 	    }
   3736      1.1     skrll 	  break;
   3737      1.1     skrll 
   3738      1.1     skrll 	case R_M32R_26_PLTREL:
   3739      1.1     skrll 	  if (h != NULL)
   3740      1.1     skrll 	    {
   3741      1.1     skrll 	      if (h->plt.refcount > 0)
   3742      1.1     skrll 		h->plt.refcount--;
   3743      1.1     skrll 	    }
   3744      1.1     skrll 	  break;
   3745      1.1     skrll 
   3746      1.1     skrll 	default:
   3747      1.1     skrll 	  break;
   3748      1.1     skrll 	}
   3749      1.1     skrll     }
   3750      1.1     skrll 
   3751      1.1     skrll   return TRUE;
   3752      1.1     skrll }
   3753      1.1     skrll 
   3754      1.1     skrll /* Look through the relocs for a section during the first phase.
   3755      1.1     skrll    Since we don't do .gots or .plts, we just need to consider the
   3756      1.1     skrll    virtual table relocs for gc.  */
   3757      1.1     skrll 
   3758      1.1     skrll static bfd_boolean
   3759      1.1     skrll m32r_elf_check_relocs (bfd *abfd,
   3760      1.1     skrll 		       struct bfd_link_info *info,
   3761      1.1     skrll 		       asection *sec,
   3762      1.1     skrll 		       const Elf_Internal_Rela *relocs)
   3763      1.1     skrll {
   3764  1.1.1.2  christos   Elf_Internal_Shdr *symtab_hdr;
   3765      1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   3766      1.1     skrll   const Elf_Internal_Rela *rel;
   3767      1.1     skrll   const Elf_Internal_Rela *rel_end;
   3768      1.1     skrll   struct elf_m32r_link_hash_table *htab;
   3769  1.1.1.2  christos   bfd *dynobj;
   3770      1.1     skrll   asection *sreloc;
   3771      1.1     skrll 
   3772      1.1     skrll   if (info->relocatable)
   3773      1.1     skrll     return TRUE;
   3774  1.1.1.2  christos 
   3775  1.1.1.2  christos   sreloc = NULL;
   3776  1.1.1.2  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   3777      1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
   3778      1.1     skrll 
   3779      1.1     skrll   htab = m32r_elf_hash_table (info);
   3780      1.1     skrll   if (htab == NULL)
   3781      1.1     skrll     return FALSE;
   3782      1.1     skrll 
   3783      1.1     skrll   dynobj = htab->root.dynobj;
   3784      1.1     skrll 
   3785      1.1     skrll   rel_end = relocs + sec->reloc_count;
   3786      1.1     skrll   for (rel = relocs; rel < rel_end; rel++)
   3787      1.1     skrll     {
   3788      1.1     skrll       int r_type;
   3789      1.1     skrll       struct elf_link_hash_entry *h;
   3790      1.1     skrll       unsigned long r_symndx;
   3791      1.1     skrll 
   3792      1.1     skrll       r_symndx = ELF32_R_SYM (rel->r_info);
   3793      1.1     skrll       r_type = ELF32_R_TYPE (rel->r_info);
   3794      1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
   3795      1.1     skrll         h = NULL;
   3796      1.1     skrll       else
   3797      1.1     skrll 	{
   3798      1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   3799      1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
   3800      1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
   3801      1.1     skrll 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   3802      1.1     skrll 	}
   3803      1.1     skrll 
   3804      1.1     skrll       /* Some relocs require a global offset table.  */
   3805      1.1     skrll       if (htab->sgot == NULL)
   3806      1.1     skrll         {
   3807      1.1     skrll           switch (r_type)
   3808      1.1     skrll             {
   3809      1.1     skrll             case R_M32R_GOT16_HI_ULO:
   3810      1.1     skrll             case R_M32R_GOT16_HI_SLO:
   3811      1.1     skrll             case R_M32R_GOTOFF:
   3812      1.1     skrll             case R_M32R_GOTOFF_HI_ULO:
   3813      1.1     skrll             case R_M32R_GOTOFF_HI_SLO:
   3814      1.1     skrll             case R_M32R_GOTOFF_LO:
   3815      1.1     skrll             case R_M32R_GOT16_LO:
   3816      1.1     skrll             case R_M32R_GOTPC24:
   3817      1.1     skrll             case R_M32R_GOTPC_HI_ULO:
   3818      1.1     skrll             case R_M32R_GOTPC_HI_SLO:
   3819      1.1     skrll             case R_M32R_GOTPC_LO:
   3820      1.1     skrll             case R_M32R_GOT24:
   3821      1.1     skrll               if (dynobj == NULL)
   3822      1.1     skrll                 htab->root.dynobj = dynobj = abfd;
   3823      1.1     skrll               if (! create_got_section (dynobj, info))
   3824      1.1     skrll                 return FALSE;
   3825      1.1     skrll               break;
   3826      1.1     skrll 
   3827      1.1     skrll             default:
   3828      1.1     skrll               break;
   3829      1.1     skrll           }
   3830      1.1     skrll         }
   3831      1.1     skrll 
   3832      1.1     skrll       switch (r_type)
   3833      1.1     skrll         {
   3834      1.1     skrll 	case R_M32R_GOT16_HI_ULO:
   3835      1.1     skrll 	case R_M32R_GOT16_HI_SLO:
   3836      1.1     skrll 	case R_M32R_GOT16_LO:
   3837      1.1     skrll         case R_M32R_GOT24:
   3838      1.1     skrll 
   3839      1.1     skrll           if (h != NULL)
   3840      1.1     skrll             h->got.refcount += 1;
   3841      1.1     skrll           else
   3842      1.1     skrll             {
   3843      1.1     skrll               bfd_signed_vma *local_got_refcounts;
   3844      1.1     skrll 
   3845      1.1     skrll               /* This is a global offset table entry for a local
   3846      1.1     skrll                  symbol.  */
   3847      1.1     skrll               local_got_refcounts = elf_local_got_refcounts (abfd);
   3848      1.1     skrll               if (local_got_refcounts == NULL)
   3849      1.1     skrll                 {
   3850      1.1     skrll                   bfd_size_type size;
   3851      1.1     skrll 
   3852      1.1     skrll                   size = symtab_hdr->sh_info;
   3853      1.1     skrll                   size *= sizeof (bfd_signed_vma);
   3854      1.1     skrll                   local_got_refcounts = bfd_zalloc (abfd, size);
   3855      1.1     skrll                   if (local_got_refcounts == NULL)
   3856      1.1     skrll                     return FALSE;
   3857      1.1     skrll                   elf_local_got_refcounts (abfd) = local_got_refcounts;
   3858      1.1     skrll                 }
   3859      1.1     skrll               local_got_refcounts[r_symndx] += 1;
   3860      1.1     skrll             }
   3861      1.1     skrll           break;
   3862      1.1     skrll 
   3863      1.1     skrll         case R_M32R_26_PLTREL:
   3864      1.1     skrll           /* This symbol requires a procedure linkage table entry.  We
   3865      1.1     skrll              actually build the entry in adjust_dynamic_symbol,
   3866      1.1     skrll              because this might be a case of linking PIC code without
   3867      1.1     skrll              linking in any dynamic objects, in which case we don't
   3868      1.1     skrll              need to generate a procedure linkage table after all.  */
   3869      1.1     skrll 
   3870      1.1     skrll 	  /* If this is a local symbol, we resolve it directly without
   3871      1.1     skrll 	     creating a procedure linkage table entry.  */
   3872      1.1     skrll           if (h == NULL)
   3873      1.1     skrll             continue;
   3874      1.1     skrll 
   3875      1.1     skrll           if (h->forced_local)
   3876      1.1     skrll             break;
   3877      1.1     skrll 
   3878      1.1     skrll           h->needs_plt = 1;
   3879      1.1     skrll 	  h->plt.refcount += 1;
   3880      1.1     skrll           break;
   3881      1.1     skrll 
   3882      1.1     skrll         case R_M32R_16_RELA:
   3883      1.1     skrll         case R_M32R_24_RELA:
   3884      1.1     skrll         case R_M32R_32_RELA:
   3885      1.1     skrll         case R_M32R_REL32:
   3886      1.1     skrll         case R_M32R_HI16_ULO_RELA:
   3887      1.1     skrll         case R_M32R_HI16_SLO_RELA:
   3888      1.1     skrll         case R_M32R_LO16_RELA:
   3889      1.1     skrll         case R_M32R_SDA16_RELA:
   3890      1.1     skrll 	case R_M32R_10_PCREL_RELA:
   3891      1.1     skrll         case R_M32R_18_PCREL_RELA:
   3892      1.1     skrll         case R_M32R_26_PCREL_RELA:
   3893      1.1     skrll 
   3894      1.1     skrll           if (h != NULL && !info->shared)
   3895      1.1     skrll             {
   3896      1.1     skrll               h->non_got_ref = 1;
   3897      1.1     skrll               h->plt.refcount += 1;
   3898      1.1     skrll             }
   3899      1.1     skrll 
   3900      1.1     skrll           /* If we are creating a shared library, and this is a reloc
   3901      1.1     skrll              against a global symbol, or a non PC relative reloc
   3902      1.1     skrll              against a local symbol, then we need to copy the reloc
   3903      1.1     skrll              into the shared library.  However, if we are linking with
   3904      1.1     skrll              -Bsymbolic, we do not need to copy a reloc against a
   3905      1.1     skrll              global symbol which is defined in an object we are
   3906      1.1     skrll              including in the link (i.e., DEF_REGULAR is set).  At
   3907      1.1     skrll              this point we have not seen all the input files, so it is
   3908      1.1     skrll              possible that DEF_REGULAR is not set now but will be set
   3909      1.1     skrll              later (it is never cleared).  We account for that
   3910      1.1     skrll              possibility below by storing information in the
   3911      1.1     skrll              dyn_relocs field of the hash table entry. A similar
   3912      1.1     skrll              situation occurs when creating shared libraries and symbol
   3913      1.1     skrll              visibility changes render the symbol local.
   3914      1.1     skrll 
   3915      1.1     skrll              If on the other hand, we are creating an executable, we
   3916      1.1     skrll              may need to keep relocations for symbols satisfied by a
   3917      1.1     skrll              dynamic library if we manage to avoid copy relocs for the
   3918      1.1     skrll              symbol.  */
   3919      1.1     skrll           if ((info->shared
   3920      1.1     skrll                && (sec->flags & SEC_ALLOC) != 0
   3921      1.1     skrll 	       && ((   r_type != R_M32R_26_PCREL_RELA
   3922      1.1     skrll                     && r_type != R_M32R_18_PCREL_RELA
   3923      1.1     skrll                     && r_type != R_M32R_10_PCREL_RELA
   3924      1.1     skrll                     && r_type != R_M32R_REL32)
   3925      1.1     skrll 	           || (h != NULL
   3926      1.1     skrll 		       && (! info->symbolic
   3927      1.1     skrll 		           || h->root.type == bfd_link_hash_defweak
   3928      1.1     skrll 		           || !h->def_regular))))
   3929      1.1     skrll               || (!info->shared
   3930      1.1     skrll                   && (sec->flags & SEC_ALLOC) != 0
   3931      1.1     skrll                   && h != NULL
   3932      1.1     skrll                   && (h->root.type == bfd_link_hash_defweak
   3933      1.1     skrll                       || !h->def_regular)))
   3934      1.1     skrll             {
   3935      1.1     skrll               struct elf_m32r_dyn_relocs *p;
   3936      1.1     skrll               struct elf_m32r_dyn_relocs **head;
   3937      1.1     skrll 
   3938      1.1     skrll               if (dynobj == NULL)
   3939      1.1     skrll                 htab->root.dynobj = dynobj = abfd;
   3940  1.1.1.2  christos 
   3941  1.1.1.2  christos               /* When creating a shared object, we must copy these
   3942      1.1     skrll                  relocs into the output file.  We create a reloc
   3943  1.1.1.2  christos                  section in dynobj and make room for the reloc.  */
   3944  1.1.1.2  christos               if (sreloc == NULL)
   3945      1.1     skrll                 {
   3946      1.1     skrll 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   3947      1.1     skrll 		    (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
   3948      1.1     skrll 
   3949      1.1     skrll 		  if (sreloc == NULL)
   3950      1.1     skrll 		    return FALSE;
   3951      1.1     skrll                 }
   3952      1.1     skrll 
   3953  1.1.1.2  christos               /* If this is a global symbol, we count the number of
   3954      1.1     skrll                  relocations we need for this symbol.  */
   3955      1.1     skrll               if (h != NULL)
   3956  1.1.1.2  christos                 head = &((struct elf_m32r_link_hash_entry *) h)->dyn_relocs;
   3957      1.1     skrll               else
   3958  1.1.1.2  christos                 {
   3959  1.1.1.2  christos                   /* Track dynamic relocs needed for local syms too.  */
   3960  1.1.1.2  christos                   asection *s;
   3961  1.1.1.2  christos                   void *vpp;
   3962  1.1.1.2  christos 		  Elf_Internal_Sym *isym;
   3963  1.1.1.2  christos 
   3964  1.1.1.2  christos 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   3965  1.1.1.2  christos 						abfd, r_symndx);
   3966      1.1     skrll 		  if (isym == NULL)
   3967      1.1     skrll 		    return FALSE;
   3968      1.1     skrll 
   3969      1.1     skrll 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   3970      1.1     skrll 		  if (s == NULL)
   3971      1.1     skrll 		    s = sec;
   3972      1.1     skrll 
   3973      1.1     skrll 		  vpp = &elf_section_data (s)->local_dynrel;
   3974      1.1     skrll                   head = (struct elf_m32r_dyn_relocs **) vpp;
   3975      1.1     skrll                 }
   3976      1.1     skrll 
   3977      1.1     skrll               p = *head;
   3978      1.1     skrll               if (p == NULL || p->sec != sec)
   3979      1.1     skrll                 {
   3980      1.1     skrll                   bfd_size_type amt = sizeof (*p);
   3981      1.1     skrll 
   3982      1.1     skrll                   p = bfd_alloc (dynobj, amt);
   3983      1.1     skrll                   if (p == NULL)
   3984      1.1     skrll                     return FALSE;
   3985      1.1     skrll                   p->next = *head;
   3986      1.1     skrll                   *head = p;
   3987      1.1     skrll                   p->sec = sec;
   3988      1.1     skrll                   p->count = 0;
   3989      1.1     skrll                   p->pc_count = 0;
   3990      1.1     skrll                 }
   3991      1.1     skrll 
   3992      1.1     skrll               p->count += 1;
   3993      1.1     skrll               if (   ELF32_R_TYPE (rel->r_info) == R_M32R_26_PCREL_RELA
   3994      1.1     skrll                   || ELF32_R_TYPE (rel->r_info) == R_M32R_18_PCREL_RELA
   3995      1.1     skrll 		  || ELF32_R_TYPE (rel->r_info) == R_M32R_10_PCREL_RELA
   3996      1.1     skrll 		  || ELF32_R_TYPE (rel->r_info) == R_M32R_REL32)
   3997      1.1     skrll                 p->pc_count += 1;
   3998      1.1     skrll             }
   3999      1.1     skrll           break;
   4000      1.1     skrll 
   4001      1.1     skrll         /* This relocation describes the C++ object vtable hierarchy.
   4002      1.1     skrll            Reconstruct it for later use during GC.  */
   4003      1.1     skrll         case R_M32R_RELA_GNU_VTINHERIT:
   4004      1.1     skrll         case R_M32R_GNU_VTINHERIT:
   4005      1.1     skrll           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   4006      1.1     skrll             return FALSE;
   4007      1.1     skrll           break;
   4008      1.1     skrll 
   4009      1.1     skrll         /* This relocation describes which C++ vtable entries are actually
   4010      1.1     skrll            used.  Record for later use during GC.  */
   4011      1.1     skrll         case R_M32R_GNU_VTENTRY:
   4012      1.1     skrll           BFD_ASSERT (h != NULL);
   4013      1.1     skrll           if (h != NULL
   4014      1.1     skrll               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
   4015      1.1     skrll             return FALSE;
   4016      1.1     skrll           break;
   4017      1.1     skrll         case R_M32R_RELA_GNU_VTENTRY:
   4018      1.1     skrll           BFD_ASSERT (h != NULL);
   4019      1.1     skrll           if (h != NULL
   4020      1.1     skrll               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   4021      1.1     skrll             return FALSE;
   4022      1.1     skrll           break;
   4023      1.1     skrll         }
   4024      1.1     skrll     }
   4025      1.1     skrll 
   4026      1.1     skrll   return TRUE;
   4027      1.1     skrll }
   4028      1.1     skrll 
   4029      1.1     skrll static const struct bfd_elf_special_section m32r_elf_special_sections[] =
   4030      1.1     skrll {
   4031      1.1     skrll   { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
   4032      1.1     skrll   { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
   4033      1.1     skrll   { NULL,                     0,  0, 0,            0 }
   4034      1.1     skrll };
   4035      1.1     skrll 
   4036      1.1     skrll static enum elf_reloc_type_class
   4037      1.1     skrll m32r_elf_reloc_type_class (const Elf_Internal_Rela *rela)
   4038      1.1     skrll {
   4039      1.1     skrll   switch ((int) ELF32_R_TYPE (rela->r_info))
   4040      1.1     skrll     {
   4041      1.1     skrll     case R_M32R_RELATIVE:  return reloc_class_relative;
   4042      1.1     skrll     case R_M32R_JMP_SLOT:  return reloc_class_plt;
   4043  1.1.1.2  christos     case R_M32R_COPY:      return reloc_class_copy;
   4044      1.1     skrll     default:      	   return reloc_class_normal;
   4045      1.1     skrll     }
   4046      1.1     skrll }
   4047      1.1     skrll 
   4048      1.1     skrll #define ELF_ARCH		bfd_arch_m32r
   4050      1.1     skrll #define ELF_TARGET_ID		M32R_ELF_DATA
   4051      1.1     skrll #define ELF_MACHINE_CODE	EM_M32R
   4052      1.1     skrll #define ELF_MACHINE_ALT1	EM_CYGNUS_M32R
   4053      1.1     skrll #define ELF_MAXPAGESIZE		0x1 /* Explicitly requested by Mitsubishi.  */
   4054      1.1     skrll 
   4055      1.1     skrll #define TARGET_BIG_SYM          bfd_elf32_m32r_vec
   4056      1.1     skrll #define TARGET_BIG_NAME		"elf32-m32r"
   4057      1.1     skrll #define TARGET_LITTLE_SYM       bfd_elf32_m32rle_vec
   4058      1.1     skrll #define TARGET_LITTLE_NAME      "elf32-m32rle"
   4059      1.1     skrll 
   4060      1.1     skrll #define elf_info_to_howto			m32r_info_to_howto
   4061      1.1     skrll #define elf_info_to_howto_rel			m32r_info_to_howto_rel
   4062      1.1     skrll #define elf_backend_section_from_bfd_section	_bfd_m32r_elf_section_from_bfd_section
   4063      1.1     skrll #define elf_backend_symbol_processing		_bfd_m32r_elf_symbol_processing
   4064      1.1     skrll #define elf_backend_add_symbol_hook		m32r_elf_add_symbol_hook
   4065      1.1     skrll #define elf_backend_relocate_section		m32r_elf_relocate_section
   4066      1.1     skrll #define elf_backend_gc_mark_hook                m32r_elf_gc_mark_hook
   4067      1.1     skrll #define elf_backend_gc_sweep_hook               m32r_elf_gc_sweep_hook
   4068      1.1     skrll #define elf_backend_check_relocs                m32r_elf_check_relocs
   4069      1.1     skrll 
   4070      1.1     skrll #define elf_backend_create_dynamic_sections     m32r_elf_create_dynamic_sections
   4071      1.1     skrll #define bfd_elf32_bfd_link_hash_table_create    m32r_elf_link_hash_table_create
   4072      1.1     skrll #define elf_backend_size_dynamic_sections       m32r_elf_size_dynamic_sections
   4073      1.1     skrll #define elf_backend_omit_section_dynsym \
   4074      1.1     skrll   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
   4075      1.1     skrll #define elf_backend_finish_dynamic_sections     m32r_elf_finish_dynamic_sections
   4076      1.1     skrll #define elf_backend_adjust_dynamic_symbol       m32r_elf_adjust_dynamic_symbol
   4077      1.1     skrll #define elf_backend_finish_dynamic_symbol       m32r_elf_finish_dynamic_symbol
   4078      1.1     skrll #define elf_backend_reloc_type_class            m32r_elf_reloc_type_class
   4079      1.1     skrll #define elf_backend_copy_indirect_symbol        m32r_elf_copy_indirect_symbol
   4080      1.1     skrll 
   4081      1.1     skrll #define elf_backend_can_gc_sections             1
   4082      1.1     skrll /*#if !USE_REL
   4083      1.1     skrll #define elf_backend_rela_normal			1
   4084      1.1     skrll #endif*/
   4085      1.1     skrll #define elf_backend_can_refcount 1
   4086      1.1     skrll #define elf_backend_want_got_plt 1
   4087      1.1     skrll #define elf_backend_plt_readonly 1
   4088      1.1     skrll #define elf_backend_want_plt_sym 0
   4089      1.1     skrll #define elf_backend_got_header_size 12
   4090      1.1     skrll 
   4091      1.1     skrll #define elf_backend_may_use_rel_p       1
   4092      1.1     skrll #ifdef USE_M32R_OLD_RELOC
   4093      1.1     skrll #define elf_backend_default_use_rela_p  0
   4094      1.1     skrll #define elf_backend_may_use_rela_p      0
   4095      1.1     skrll #else
   4096      1.1     skrll #define elf_backend_default_use_rela_p  1
   4097      1.1     skrll #define elf_backend_may_use_rela_p      1
   4098      1.1     skrll #endif
   4099      1.1     skrll 
   4100      1.1     skrll #define elf_backend_object_p			m32r_elf_object_p
   4101      1.1     skrll #define elf_backend_final_write_processing 	m32r_elf_final_write_processing
   4102      1.1     skrll #define bfd_elf32_bfd_merge_private_bfd_data 	m32r_elf_merge_private_bfd_data
   4103      1.1     skrll #define bfd_elf32_bfd_set_private_flags		m32r_elf_set_private_flags
   4104      1.1     skrll #define bfd_elf32_bfd_print_private_bfd_data	m32r_elf_print_private_bfd_data
   4105      1.1     skrll #define elf_backend_special_sections		m32r_elf_special_sections
   4106      1.1     skrll 
   4107      1.1     skrll #include "elf32-target.h"
   4108      1.1     skrll 
   4109      1.1     skrll #undef  ELF_MAXPAGESIZE
   4110      1.1     skrll #define ELF_MAXPAGESIZE         0x1000
   4111      1.1     skrll 
   4112      1.1     skrll #undef  TARGET_BIG_SYM
   4113      1.1     skrll #define TARGET_BIG_SYM          bfd_elf32_m32rlin_vec
   4114      1.1     skrll #undef  TARGET_BIG_NAME
   4115      1.1     skrll #define TARGET_BIG_NAME         "elf32-m32r-linux"
   4116      1.1     skrll #undef  TARGET_LITTLE_SYM
   4117      1.1     skrll #define TARGET_LITTLE_SYM       bfd_elf32_m32rlelin_vec
   4118                    #undef  TARGET_LITTLE_NAME
   4119                    #define TARGET_LITTLE_NAME      "elf32-m32rle-linux"
   4120                    #undef  elf32_bed
   4121                    #define elf32_bed               elf32_m32r_lin_bed
   4122                    
   4123                    #include "elf32-target.h"
   4124                    
   4125