Home | History | Annotate | Line # | Download | only in bfd
elf32-ppc.c revision 1.1
      1 /* PowerPC-specific support for 32-bit ELF
      2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
      3    2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
      4    Free Software Foundation, Inc.
      5    Written by Ian Lance Taylor, Cygnus Support.
      6 
      7    This file is part of BFD, the Binary File Descriptor library.
      8 
      9    This program is free software; you can redistribute it and/or modify
     10    it under the terms of the GNU General Public License as published by
     11    the Free Software Foundation; either version 3 of the License, or
     12    (at your option) any later version.
     13 
     14    This program is distributed in the hope that it will be useful,
     15    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17    GNU General Public License for more details.
     18 
     19    You should have received a copy of the GNU General Public License
     20    along with this program; if not, write to the
     21    Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
     22    Boston, MA 02110-1301, USA.  */
     23 
     24 
     25 /* This file is based on a preliminary PowerPC ELF ABI.  The
     26    information may not match the final PowerPC ELF ABI.  It includes
     27    suggestions from the in-progress Embedded PowerPC ABI, and that
     28    information may also not match.  */
     29 
     30 #include "sysdep.h"
     31 #include <stdarg.h>
     32 #include "bfd.h"
     33 #include "bfdlink.h"
     34 #include "libbfd.h"
     35 #include "elf-bfd.h"
     36 #include "elf/ppc.h"
     37 #include "elf32-ppc.h"
     38 #include "elf-vxworks.h"
     39 #include "dwarf2.h"
     40 
     41 typedef enum split16_format_type
     42 {
     43   split16a_type = 0,
     44   split16d_type
     45 }
     46 split16_format_type;
     47 
     48 /* RELA relocations are used here.  */
     49 
     50 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
     51   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     52 static bfd_reloc_status_type ppc_elf_unhandled_reloc
     53   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     54 static void ppc_elf_vle_split16
     55   (bfd *, bfd_byte *, bfd_vma, bfd_vma, split16_format_type);
     56 
     57 /* Branch prediction bit for branch taken relocs.  */
     58 #define BRANCH_PREDICT_BIT 0x200000
     59 /* Mask to set RA in memory instructions.  */
     60 #define RA_REGISTER_MASK 0x001f0000
     61 /* Value to shift register by to insert RA.  */
     62 #define RA_REGISTER_SHIFT 16
     63 
     64 /* The name of the dynamic interpreter.  This is put in the .interp
     65    section.  */
     66 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
     67 
     68 /* For old-style PLT.  */
     69 /* The number of single-slot PLT entries (the rest use two slots).  */
     70 #define PLT_NUM_SINGLE_ENTRIES 8192
     71 
     72 /* For new-style .glink and .plt.  */
     73 #define GLINK_PLTRESOLVE 16*4
     74 #define GLINK_ENTRY_SIZE 4*4
     75 #define TLS_GET_ADDR_GLINK_SIZE 12*4
     76 
     77 /* VxWorks uses its own plt layout, filled in by the static linker.  */
     78 
     79 /* The standard VxWorks PLT entry.  */
     80 #define VXWORKS_PLT_ENTRY_SIZE 32
     81 static const bfd_vma ppc_elf_vxworks_plt_entry
     82     [VXWORKS_PLT_ENTRY_SIZE / 4] =
     83   {
     84     0x3d800000, /* lis     r12,0                 */
     85     0x818c0000, /* lwz     r12,0(r12)            */
     86     0x7d8903a6, /* mtctr   r12                   */
     87     0x4e800420, /* bctr                          */
     88     0x39600000, /* li      r11,0                 */
     89     0x48000000, /* b       14 <.PLT0resolve+0x4> */
     90     0x60000000, /* nop                           */
     91     0x60000000, /* nop                           */
     92   };
     93 static const bfd_vma ppc_elf_vxworks_pic_plt_entry
     94     [VXWORKS_PLT_ENTRY_SIZE / 4] =
     95   {
     96     0x3d9e0000, /* addis r12,r30,0 */
     97     0x818c0000, /* lwz	 r12,0(r12) */
     98     0x7d8903a6, /* mtctr r12 */
     99     0x4e800420, /* bctr */
    100     0x39600000, /* li	 r11,0 */
    101     0x48000000, /* b	 14 <.PLT0resolve+0x4> 14: R_PPC_REL24 .PLTresolve */
    102     0x60000000, /* nop */
    103     0x60000000, /* nop */
    104   };
    105 
    106 /* The initial VxWorks PLT entry.  */
    107 #define VXWORKS_PLT_INITIAL_ENTRY_SIZE 32
    108 static const bfd_vma ppc_elf_vxworks_plt0_entry
    109     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
    110   {
    111     0x3d800000, /* lis     r12,0        */
    112     0x398c0000, /* addi    r12,r12,0    */
    113     0x800c0008, /* lwz     r0,8(r12)    */
    114     0x7c0903a6, /* mtctr   r0           */
    115     0x818c0004, /* lwz     r12,4(r12)   */
    116     0x4e800420, /* bctr                 */
    117     0x60000000, /* nop                  */
    118     0x60000000, /* nop                  */
    119   };
    120 static const bfd_vma ppc_elf_vxworks_pic_plt0_entry
    121     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
    122   {
    123     0x819e0008, /* lwz	 r12,8(r30) */
    124     0x7d8903a6, /* mtctr r12        */
    125     0x819e0004, /* lwz	 r12,4(r30) */
    126     0x4e800420, /* bctr             */
    127     0x60000000, /* nop              */
    128     0x60000000, /* nop              */
    129     0x60000000, /* nop              */
    130     0x60000000, /* nop              */
    131   };
    132 
    133 /* For executables, we have some additional relocations in
    134    .rela.plt.unloaded, for the kernel loader.  */
    135 
    136 /* The number of non-JMP_SLOT relocations per PLT0 slot. */
    137 #define VXWORKS_PLT_NON_JMP_SLOT_RELOCS 3
    138 /* The number of relocations in the PLTResolve slot. */
    139 #define VXWORKS_PLTRESOLVE_RELOCS 2
    140 /* The number of relocations in the PLTResolve slot when when creating
    141    a shared library. */
    142 #define VXWORKS_PLTRESOLVE_RELOCS_SHLIB 0
    143 
    144 /* Some instructions.  */
    145 #define ADDIS_11_11	0x3d6b0000
    146 #define ADDIS_11_30	0x3d7e0000
    147 #define ADDIS_12_12	0x3d8c0000
    148 #define ADDI_11_11	0x396b0000
    149 #define ADD_0_11_11	0x7c0b5a14
    150 #define ADD_3_12_2	0x7c6c1214
    151 #define ADD_11_0_11	0x7d605a14
    152 #define B		0x48000000
    153 #define BCL_20_31	0x429f0005
    154 #define BCTR		0x4e800420
    155 #define BEQLR		0x4d820020
    156 #define CMPWI_11_0	0x2c0b0000
    157 #define LIS_11		0x3d600000
    158 #define LIS_12		0x3d800000
    159 #define LWZU_0_12	0x840c0000
    160 #define LWZ_0_12	0x800c0000
    161 #define LWZ_11_3	0x81630000
    162 #define LWZ_11_11	0x816b0000
    163 #define LWZ_11_30	0x817e0000
    164 #define LWZ_12_3	0x81830000
    165 #define LWZ_12_12	0x818c0000
    166 #define MR_0_3		0x7c601b78
    167 #define MR_3_0		0x7c030378
    168 #define MFLR_0		0x7c0802a6
    169 #define MFLR_12		0x7d8802a6
    170 #define MTCTR_0		0x7c0903a6
    171 #define MTCTR_11	0x7d6903a6
    172 #define MTLR_0		0x7c0803a6
    173 #define NOP		0x60000000
    174 #define SUB_11_11_12	0x7d6c5850
    175 
    176 /* Offset of tp and dtp pointers from start of TLS block.  */
    177 #define TP_OFFSET	0x7000
    178 #define DTP_OFFSET	0x8000
    179 
    180 /* The value of a defined global symbol.  */
    181 #define SYM_VAL(SYM) \
    182   ((SYM)->root.u.def.section->output_section->vma	\
    183    + (SYM)->root.u.def.section->output_offset		\
    184    + (SYM)->root.u.def.value)
    185 
    186 static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
    188 
    189 static reloc_howto_type ppc_elf_howto_raw[] = {
    190   /* This reloc does nothing.  */
    191   HOWTO (R_PPC_NONE,		/* type */
    192 	 0,			/* rightshift */
    193 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    194 	 32,			/* bitsize */
    195 	 FALSE,			/* pc_relative */
    196 	 0,			/* bitpos */
    197 	 complain_overflow_bitfield, /* complain_on_overflow */
    198 	 bfd_elf_generic_reloc,	/* special_function */
    199 	 "R_PPC_NONE",		/* name */
    200 	 FALSE,			/* partial_inplace */
    201 	 0,			/* src_mask */
    202 	 0,			/* dst_mask */
    203 	 FALSE),		/* pcrel_offset */
    204 
    205   /* A standard 32 bit relocation.  */
    206   HOWTO (R_PPC_ADDR32,		/* type */
    207 	 0,			/* rightshift */
    208 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    209 	 32,			/* bitsize */
    210 	 FALSE,			/* pc_relative */
    211 	 0,			/* bitpos */
    212 	 complain_overflow_bitfield, /* complain_on_overflow */
    213 	 bfd_elf_generic_reloc,	/* special_function */
    214 	 "R_PPC_ADDR32",	/* name */
    215 	 FALSE,			/* partial_inplace */
    216 	 0,			/* src_mask */
    217 	 0xffffffff,		/* dst_mask */
    218 	 FALSE),		/* pcrel_offset */
    219 
    220   /* An absolute 26 bit branch; the lower two bits must be zero.
    221      FIXME: we don't check that, we just clear them.  */
    222   HOWTO (R_PPC_ADDR24,		/* type */
    223 	 0,			/* rightshift */
    224 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    225 	 26,			/* bitsize */
    226 	 FALSE,			/* pc_relative */
    227 	 0,			/* bitpos */
    228 	 complain_overflow_bitfield, /* complain_on_overflow */
    229 	 bfd_elf_generic_reloc,	/* special_function */
    230 	 "R_PPC_ADDR24",	/* name */
    231 	 FALSE,			/* partial_inplace */
    232 	 0,			/* src_mask */
    233 	 0x3fffffc,		/* dst_mask */
    234 	 FALSE),		/* pcrel_offset */
    235 
    236   /* A standard 16 bit relocation.  */
    237   HOWTO (R_PPC_ADDR16,		/* type */
    238 	 0,			/* rightshift */
    239 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    240 	 16,			/* bitsize */
    241 	 FALSE,			/* pc_relative */
    242 	 0,			/* bitpos */
    243 	 complain_overflow_bitfield, /* complain_on_overflow */
    244 	 bfd_elf_generic_reloc,	/* special_function */
    245 	 "R_PPC_ADDR16",	/* name */
    246 	 FALSE,			/* partial_inplace */
    247 	 0,			/* src_mask */
    248 	 0xffff,		/* dst_mask */
    249 	 FALSE),		/* pcrel_offset */
    250 
    251   /* A 16 bit relocation without overflow.  */
    252   HOWTO (R_PPC_ADDR16_LO,	/* type */
    253 	 0,			/* rightshift */
    254 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    255 	 16,			/* bitsize */
    256 	 FALSE,			/* pc_relative */
    257 	 0,			/* bitpos */
    258 	 complain_overflow_dont,/* complain_on_overflow */
    259 	 bfd_elf_generic_reloc,	/* special_function */
    260 	 "R_PPC_ADDR16_LO",	/* name */
    261 	 FALSE,			/* partial_inplace */
    262 	 0,			/* src_mask */
    263 	 0xffff,		/* dst_mask */
    264 	 FALSE),		/* pcrel_offset */
    265 
    266   /* The high order 16 bits of an address.  */
    267   HOWTO (R_PPC_ADDR16_HI,	/* type */
    268 	 16,			/* rightshift */
    269 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    270 	 16,			/* bitsize */
    271 	 FALSE,			/* pc_relative */
    272 	 0,			/* bitpos */
    273 	 complain_overflow_dont, /* complain_on_overflow */
    274 	 bfd_elf_generic_reloc,	/* special_function */
    275 	 "R_PPC_ADDR16_HI",	/* name */
    276 	 FALSE,			/* partial_inplace */
    277 	 0,			/* src_mask */
    278 	 0xffff,		/* dst_mask */
    279 	 FALSE),		/* pcrel_offset */
    280 
    281   /* The high order 16 bits of an address, plus 1 if the contents of
    282      the low 16 bits, treated as a signed number, is negative.  */
    283   HOWTO (R_PPC_ADDR16_HA,	/* type */
    284 	 16,			/* rightshift */
    285 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    286 	 16,			/* bitsize */
    287 	 FALSE,			/* pc_relative */
    288 	 0,			/* bitpos */
    289 	 complain_overflow_dont, /* complain_on_overflow */
    290 	 ppc_elf_addr16_ha_reloc, /* special_function */
    291 	 "R_PPC_ADDR16_HA",	/* name */
    292 	 FALSE,			/* partial_inplace */
    293 	 0,			/* src_mask */
    294 	 0xffff,		/* dst_mask */
    295 	 FALSE),		/* pcrel_offset */
    296 
    297   /* An absolute 16 bit branch; the lower two bits must be zero.
    298      FIXME: we don't check that, we just clear them.  */
    299   HOWTO (R_PPC_ADDR14,		/* type */
    300 	 0,			/* rightshift */
    301 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    302 	 16,			/* bitsize */
    303 	 FALSE,			/* pc_relative */
    304 	 0,			/* bitpos */
    305 	 complain_overflow_bitfield, /* complain_on_overflow */
    306 	 bfd_elf_generic_reloc,	/* special_function */
    307 	 "R_PPC_ADDR14",	/* name */
    308 	 FALSE,			/* partial_inplace */
    309 	 0,			/* src_mask */
    310 	 0xfffc,		/* dst_mask */
    311 	 FALSE),		/* pcrel_offset */
    312 
    313   /* An absolute 16 bit branch, for which bit 10 should be set to
    314      indicate that the branch is expected to be taken.	The lower two
    315      bits must be zero.  */
    316   HOWTO (R_PPC_ADDR14_BRTAKEN,	/* type */
    317 	 0,			/* rightshift */
    318 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    319 	 16,			/* bitsize */
    320 	 FALSE,			/* pc_relative */
    321 	 0,			/* bitpos */
    322 	 complain_overflow_bitfield, /* complain_on_overflow */
    323 	 bfd_elf_generic_reloc,	/* special_function */
    324 	 "R_PPC_ADDR14_BRTAKEN",/* name */
    325 	 FALSE,			/* partial_inplace */
    326 	 0,			/* src_mask */
    327 	 0xfffc,		/* dst_mask */
    328 	 FALSE),		/* pcrel_offset */
    329 
    330   /* An absolute 16 bit branch, for which bit 10 should be set to
    331      indicate that the branch is not expected to be taken.  The lower
    332      two bits must be zero.  */
    333   HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
    334 	 0,			/* rightshift */
    335 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    336 	 16,			/* bitsize */
    337 	 FALSE,			/* pc_relative */
    338 	 0,			/* bitpos */
    339 	 complain_overflow_bitfield, /* complain_on_overflow */
    340 	 bfd_elf_generic_reloc,	/* special_function */
    341 	 "R_PPC_ADDR14_BRNTAKEN",/* name */
    342 	 FALSE,			/* partial_inplace */
    343 	 0,			/* src_mask */
    344 	 0xfffc,		/* dst_mask */
    345 	 FALSE),		/* pcrel_offset */
    346 
    347   /* A relative 26 bit branch; the lower two bits must be zero.  */
    348   HOWTO (R_PPC_REL24,		/* type */
    349 	 0,			/* rightshift */
    350 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    351 	 26,			/* bitsize */
    352 	 TRUE,			/* pc_relative */
    353 	 0,			/* bitpos */
    354 	 complain_overflow_signed, /* complain_on_overflow */
    355 	 bfd_elf_generic_reloc,	/* special_function */
    356 	 "R_PPC_REL24",		/* name */
    357 	 FALSE,			/* partial_inplace */
    358 	 0,			/* src_mask */
    359 	 0x3fffffc,		/* dst_mask */
    360 	 TRUE),			/* pcrel_offset */
    361 
    362   /* A relative 16 bit branch; the lower two bits must be zero.  */
    363   HOWTO (R_PPC_REL14,		/* type */
    364 	 0,			/* rightshift */
    365 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    366 	 16,			/* bitsize */
    367 	 TRUE,			/* pc_relative */
    368 	 0,			/* bitpos */
    369 	 complain_overflow_signed, /* complain_on_overflow */
    370 	 bfd_elf_generic_reloc,	/* special_function */
    371 	 "R_PPC_REL14",		/* name */
    372 	 FALSE,			/* partial_inplace */
    373 	 0,			/* src_mask */
    374 	 0xfffc,		/* dst_mask */
    375 	 TRUE),			/* pcrel_offset */
    376 
    377   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
    378      the branch is expected to be taken.  The lower two bits must be
    379      zero.  */
    380   HOWTO (R_PPC_REL14_BRTAKEN,	/* type */
    381 	 0,			/* rightshift */
    382 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    383 	 16,			/* bitsize */
    384 	 TRUE,			/* pc_relative */
    385 	 0,			/* bitpos */
    386 	 complain_overflow_signed, /* complain_on_overflow */
    387 	 bfd_elf_generic_reloc,	/* special_function */
    388 	 "R_PPC_REL14_BRTAKEN",	/* name */
    389 	 FALSE,			/* partial_inplace */
    390 	 0,			/* src_mask */
    391 	 0xfffc,		/* dst_mask */
    392 	 TRUE),			/* pcrel_offset */
    393 
    394   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
    395      the branch is not expected to be taken.  The lower two bits must
    396      be zero.  */
    397   HOWTO (R_PPC_REL14_BRNTAKEN,	/* type */
    398 	 0,			/* rightshift */
    399 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    400 	 16,			/* bitsize */
    401 	 TRUE,			/* pc_relative */
    402 	 0,			/* bitpos */
    403 	 complain_overflow_signed, /* complain_on_overflow */
    404 	 bfd_elf_generic_reloc,	/* special_function */
    405 	 "R_PPC_REL14_BRNTAKEN",/* name */
    406 	 FALSE,			/* partial_inplace */
    407 	 0,			/* src_mask */
    408 	 0xfffc,		/* dst_mask */
    409 	 TRUE),			/* pcrel_offset */
    410 
    411   /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
    412      symbol.  */
    413   HOWTO (R_PPC_GOT16,		/* type */
    414 	 0,			/* rightshift */
    415 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    416 	 16,			/* bitsize */
    417 	 FALSE,			/* pc_relative */
    418 	 0,			/* bitpos */
    419 	 complain_overflow_signed, /* complain_on_overflow */
    420 	 bfd_elf_generic_reloc,	/* special_function */
    421 	 "R_PPC_GOT16",		/* name */
    422 	 FALSE,			/* partial_inplace */
    423 	 0,			/* src_mask */
    424 	 0xffff,		/* dst_mask */
    425 	 FALSE),		/* pcrel_offset */
    426 
    427   /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
    428      the symbol.  */
    429   HOWTO (R_PPC_GOT16_LO,	/* type */
    430 	 0,			/* rightshift */
    431 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    432 	 16,			/* bitsize */
    433 	 FALSE,			/* pc_relative */
    434 	 0,			/* bitpos */
    435 	 complain_overflow_dont, /* complain_on_overflow */
    436 	 bfd_elf_generic_reloc,	/* special_function */
    437 	 "R_PPC_GOT16_LO",	/* name */
    438 	 FALSE,			/* partial_inplace */
    439 	 0,			/* src_mask */
    440 	 0xffff,		/* dst_mask */
    441 	 FALSE),		/* pcrel_offset */
    442 
    443   /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
    444      the symbol.  */
    445   HOWTO (R_PPC_GOT16_HI,	/* type */
    446 	 16,			/* rightshift */
    447 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    448 	 16,			/* bitsize */
    449 	 FALSE,			/* pc_relative */
    450 	 0,			/* bitpos */
    451 	 complain_overflow_bitfield, /* complain_on_overflow */
    452 	 bfd_elf_generic_reloc,	/* special_function */
    453 	 "R_PPC_GOT16_HI",	/* name */
    454 	 FALSE,			/* partial_inplace */
    455 	 0,			/* src_mask */
    456 	 0xffff,		/* dst_mask */
    457 	 FALSE),		 /* pcrel_offset */
    458 
    459   /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
    460      the symbol.  */
    461   HOWTO (R_PPC_GOT16_HA,	/* type */
    462 	 16,			/* rightshift */
    463 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    464 	 16,			/* bitsize */
    465 	 FALSE,			/* pc_relative */
    466 	 0,			/* bitpos */
    467 	 complain_overflow_bitfield, /* complain_on_overflow */
    468 	 ppc_elf_addr16_ha_reloc, /* special_function */
    469 	 "R_PPC_GOT16_HA",	/* name */
    470 	 FALSE,			/* partial_inplace */
    471 	 0,			/* src_mask */
    472 	 0xffff,		/* dst_mask */
    473 	 FALSE),		/* pcrel_offset */
    474 
    475   /* Like R_PPC_REL24, but referring to the procedure linkage table
    476      entry for the symbol.  */
    477   HOWTO (R_PPC_PLTREL24,	/* type */
    478 	 0,			/* rightshift */
    479 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    480 	 26,			/* bitsize */
    481 	 TRUE,			/* pc_relative */
    482 	 0,			/* bitpos */
    483 	 complain_overflow_signed,  /* complain_on_overflow */
    484 	 bfd_elf_generic_reloc,	/* special_function */
    485 	 "R_PPC_PLTREL24",	/* name */
    486 	 FALSE,			/* partial_inplace */
    487 	 0,			/* src_mask */
    488 	 0x3fffffc,		/* dst_mask */
    489 	 TRUE),			/* pcrel_offset */
    490 
    491   /* This is used only by the dynamic linker.  The symbol should exist
    492      both in the object being run and in some shared library.  The
    493      dynamic linker copies the data addressed by the symbol from the
    494      shared library into the object, because the object being
    495      run has to have the data at some particular address.  */
    496   HOWTO (R_PPC_COPY,		/* type */
    497 	 0,			/* rightshift */
    498 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    499 	 32,			/* bitsize */
    500 	 FALSE,			/* pc_relative */
    501 	 0,			/* bitpos */
    502 	 complain_overflow_bitfield, /* complain_on_overflow */
    503 	 bfd_elf_generic_reloc,	 /* special_function */
    504 	 "R_PPC_COPY",		/* name */
    505 	 FALSE,			/* partial_inplace */
    506 	 0,			/* src_mask */
    507 	 0,			/* dst_mask */
    508 	 FALSE),		/* pcrel_offset */
    509 
    510   /* Like R_PPC_ADDR32, but used when setting global offset table
    511      entries.  */
    512   HOWTO (R_PPC_GLOB_DAT,	/* type */
    513 	 0,			/* rightshift */
    514 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    515 	 32,			/* bitsize */
    516 	 FALSE,			/* pc_relative */
    517 	 0,			/* bitpos */
    518 	 complain_overflow_bitfield, /* complain_on_overflow */
    519 	 bfd_elf_generic_reloc,	 /* special_function */
    520 	 "R_PPC_GLOB_DAT",	/* name */
    521 	 FALSE,			/* partial_inplace */
    522 	 0,			/* src_mask */
    523 	 0xffffffff,		/* dst_mask */
    524 	 FALSE),		/* pcrel_offset */
    525 
    526   /* Marks a procedure linkage table entry for a symbol.  */
    527   HOWTO (R_PPC_JMP_SLOT,	/* type */
    528 	 0,			/* rightshift */
    529 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    530 	 32,			/* bitsize */
    531 	 FALSE,			/* pc_relative */
    532 	 0,			/* bitpos */
    533 	 complain_overflow_bitfield, /* complain_on_overflow */
    534 	 bfd_elf_generic_reloc,	 /* special_function */
    535 	 "R_PPC_JMP_SLOT",	/* name */
    536 	 FALSE,			/* partial_inplace */
    537 	 0,			/* src_mask */
    538 	 0,			/* dst_mask */
    539 	 FALSE),		/* pcrel_offset */
    540 
    541   /* Used only by the dynamic linker.  When the object is run, this
    542      longword is set to the load address of the object, plus the
    543      addend.  */
    544   HOWTO (R_PPC_RELATIVE,	/* type */
    545 	 0,			/* rightshift */
    546 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    547 	 32,			/* bitsize */
    548 	 FALSE,			/* pc_relative */
    549 	 0,			/* bitpos */
    550 	 complain_overflow_bitfield, /* complain_on_overflow */
    551 	 bfd_elf_generic_reloc,	 /* special_function */
    552 	 "R_PPC_RELATIVE",	/* name */
    553 	 FALSE,			/* partial_inplace */
    554 	 0,			/* src_mask */
    555 	 0xffffffff,		/* dst_mask */
    556 	 FALSE),		/* pcrel_offset */
    557 
    558   /* Like R_PPC_REL24, but uses the value of the symbol within the
    559      object rather than the final value.  Normally used for
    560      _GLOBAL_OFFSET_TABLE_.  */
    561   HOWTO (R_PPC_LOCAL24PC,	/* type */
    562 	 0,			/* rightshift */
    563 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    564 	 26,			/* bitsize */
    565 	 TRUE,			/* pc_relative */
    566 	 0,			/* bitpos */
    567 	 complain_overflow_signed, /* complain_on_overflow */
    568 	 bfd_elf_generic_reloc,	/* special_function */
    569 	 "R_PPC_LOCAL24PC",	/* name */
    570 	 FALSE,			/* partial_inplace */
    571 	 0,			/* src_mask */
    572 	 0x3fffffc,		/* dst_mask */
    573 	 TRUE),			/* pcrel_offset */
    574 
    575   /* Like R_PPC_ADDR32, but may be unaligned.  */
    576   HOWTO (R_PPC_UADDR32,		/* type */
    577 	 0,			/* rightshift */
    578 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    579 	 32,			/* bitsize */
    580 	 FALSE,			/* pc_relative */
    581 	 0,			/* bitpos */
    582 	 complain_overflow_bitfield, /* complain_on_overflow */
    583 	 bfd_elf_generic_reloc,	/* special_function */
    584 	 "R_PPC_UADDR32",	/* name */
    585 	 FALSE,			/* partial_inplace */
    586 	 0,			/* src_mask */
    587 	 0xffffffff,		/* dst_mask */
    588 	 FALSE),		/* pcrel_offset */
    589 
    590   /* Like R_PPC_ADDR16, but may be unaligned.  */
    591   HOWTO (R_PPC_UADDR16,		/* type */
    592 	 0,			/* rightshift */
    593 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    594 	 16,			/* bitsize */
    595 	 FALSE,			/* pc_relative */
    596 	 0,			/* bitpos */
    597 	 complain_overflow_bitfield, /* complain_on_overflow */
    598 	 bfd_elf_generic_reloc,	/* special_function */
    599 	 "R_PPC_UADDR16",	/* name */
    600 	 FALSE,			/* partial_inplace */
    601 	 0,			/* src_mask */
    602 	 0xffff,		/* dst_mask */
    603 	 FALSE),		/* pcrel_offset */
    604 
    605   /* 32-bit PC relative */
    606   HOWTO (R_PPC_REL32,		/* type */
    607 	 0,			/* rightshift */
    608 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    609 	 32,			/* bitsize */
    610 	 TRUE,			/* pc_relative */
    611 	 0,			/* bitpos */
    612 	 complain_overflow_bitfield, /* complain_on_overflow */
    613 	 bfd_elf_generic_reloc,	/* special_function */
    614 	 "R_PPC_REL32",		/* name */
    615 	 FALSE,			/* partial_inplace */
    616 	 0,			/* src_mask */
    617 	 0xffffffff,		/* dst_mask */
    618 	 TRUE),			/* pcrel_offset */
    619 
    620   /* 32-bit relocation to the symbol's procedure linkage table.
    621      FIXME: not supported.  */
    622   HOWTO (R_PPC_PLT32,		/* type */
    623 	 0,			/* rightshift */
    624 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    625 	 32,			/* bitsize */
    626 	 FALSE,			/* pc_relative */
    627 	 0,			/* bitpos */
    628 	 complain_overflow_bitfield, /* complain_on_overflow */
    629 	 bfd_elf_generic_reloc,	/* special_function */
    630 	 "R_PPC_PLT32",		/* name */
    631 	 FALSE,			/* partial_inplace */
    632 	 0,			/* src_mask */
    633 	 0,			/* dst_mask */
    634 	 FALSE),		/* pcrel_offset */
    635 
    636   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
    637      FIXME: not supported.  */
    638   HOWTO (R_PPC_PLTREL32,	/* type */
    639 	 0,			/* rightshift */
    640 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    641 	 32,			/* bitsize */
    642 	 TRUE,			/* pc_relative */
    643 	 0,			/* bitpos */
    644 	 complain_overflow_bitfield, /* complain_on_overflow */
    645 	 bfd_elf_generic_reloc,	/* special_function */
    646 	 "R_PPC_PLTREL32",	/* name */
    647 	 FALSE,			/* partial_inplace */
    648 	 0,			/* src_mask */
    649 	 0,			/* dst_mask */
    650 	 TRUE),			/* pcrel_offset */
    651 
    652   /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
    653      the symbol.  */
    654   HOWTO (R_PPC_PLT16_LO,	/* type */
    655 	 0,			/* rightshift */
    656 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    657 	 16,			/* bitsize */
    658 	 FALSE,			/* pc_relative */
    659 	 0,			/* bitpos */
    660 	 complain_overflow_dont, /* complain_on_overflow */
    661 	 bfd_elf_generic_reloc,	/* special_function */
    662 	 "R_PPC_PLT16_LO",	/* name */
    663 	 FALSE,			/* partial_inplace */
    664 	 0,			/* src_mask */
    665 	 0xffff,		/* dst_mask */
    666 	 FALSE),		/* pcrel_offset */
    667 
    668   /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
    669      the symbol.  */
    670   HOWTO (R_PPC_PLT16_HI,	/* type */
    671 	 16,			/* rightshift */
    672 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    673 	 16,			/* bitsize */
    674 	 FALSE,			/* pc_relative */
    675 	 0,			/* bitpos */
    676 	 complain_overflow_bitfield, /* complain_on_overflow */
    677 	 bfd_elf_generic_reloc,	/* special_function */
    678 	 "R_PPC_PLT16_HI",	/* name */
    679 	 FALSE,			/* partial_inplace */
    680 	 0,			/* src_mask */
    681 	 0xffff,		/* dst_mask */
    682 	 FALSE),		 /* pcrel_offset */
    683 
    684   /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
    685      the symbol.  */
    686   HOWTO (R_PPC_PLT16_HA,	/* type */
    687 	 16,			/* rightshift */
    688 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    689 	 16,			/* bitsize */
    690 	 FALSE,			/* pc_relative */
    691 	 0,			/* bitpos */
    692 	 complain_overflow_bitfield, /* complain_on_overflow */
    693 	 ppc_elf_addr16_ha_reloc, /* special_function */
    694 	 "R_PPC_PLT16_HA",	/* name */
    695 	 FALSE,			/* partial_inplace */
    696 	 0,			/* src_mask */
    697 	 0xffff,		/* dst_mask */
    698 	 FALSE),		/* pcrel_offset */
    699 
    700   /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
    701      small data items.  */
    702   HOWTO (R_PPC_SDAREL16,	/* type */
    703 	 0,			/* rightshift */
    704 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    705 	 16,			/* bitsize */
    706 	 FALSE,			/* pc_relative */
    707 	 0,			/* bitpos */
    708 	 complain_overflow_signed, /* complain_on_overflow */
    709 	 bfd_elf_generic_reloc,	/* special_function */
    710 	 "R_PPC_SDAREL16",	/* name */
    711 	 FALSE,			/* partial_inplace */
    712 	 0,			/* src_mask */
    713 	 0xffff,		/* dst_mask */
    714 	 FALSE),		/* pcrel_offset */
    715 
    716   /* 16-bit section relative relocation.  */
    717   HOWTO (R_PPC_SECTOFF,		/* type */
    718 	 0,			/* rightshift */
    719 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    720 	 16,			/* bitsize */
    721 	 FALSE,			/* pc_relative */
    722 	 0,			/* bitpos */
    723 	 complain_overflow_bitfield, /* complain_on_overflow */
    724 	 bfd_elf_generic_reloc,	/* special_function */
    725 	 "R_PPC_SECTOFF",	/* name */
    726 	 FALSE,			/* partial_inplace */
    727 	 0,			/* src_mask */
    728 	 0xffff,		/* dst_mask */
    729 	 FALSE),		/* pcrel_offset */
    730 
    731   /* 16-bit lower half section relative relocation.  */
    732   HOWTO (R_PPC_SECTOFF_LO,	  /* type */
    733 	 0,			/* rightshift */
    734 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    735 	 16,			/* bitsize */
    736 	 FALSE,			/* pc_relative */
    737 	 0,			/* bitpos */
    738 	 complain_overflow_dont, /* complain_on_overflow */
    739 	 bfd_elf_generic_reloc,	/* special_function */
    740 	 "R_PPC_SECTOFF_LO",	/* name */
    741 	 FALSE,			/* partial_inplace */
    742 	 0,			/* src_mask */
    743 	 0xffff,		/* dst_mask */
    744 	 FALSE),		/* pcrel_offset */
    745 
    746   /* 16-bit upper half section relative relocation.  */
    747   HOWTO (R_PPC_SECTOFF_HI,	/* type */
    748 	 16,			/* rightshift */
    749 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    750 	 16,			/* bitsize */
    751 	 FALSE,			/* pc_relative */
    752 	 0,			/* bitpos */
    753 	 complain_overflow_bitfield, /* complain_on_overflow */
    754 	 bfd_elf_generic_reloc,	/* special_function */
    755 	 "R_PPC_SECTOFF_HI",	/* name */
    756 	 FALSE,			/* partial_inplace */
    757 	 0,			/* src_mask */
    758 	 0xffff,		/* dst_mask */
    759 	 FALSE),		 /* pcrel_offset */
    760 
    761   /* 16-bit upper half adjusted section relative relocation.  */
    762   HOWTO (R_PPC_SECTOFF_HA,	/* type */
    763 	 16,			/* rightshift */
    764 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    765 	 16,			/* bitsize */
    766 	 FALSE,			/* pc_relative */
    767 	 0,			/* bitpos */
    768 	 complain_overflow_bitfield, /* complain_on_overflow */
    769 	 ppc_elf_addr16_ha_reloc, /* special_function */
    770 	 "R_PPC_SECTOFF_HA",	/* name */
    771 	 FALSE,			/* partial_inplace */
    772 	 0,			/* src_mask */
    773 	 0xffff,		/* dst_mask */
    774 	 FALSE),		/* pcrel_offset */
    775 
    776   /* Marker relocs for TLS.  */
    777   HOWTO (R_PPC_TLS,
    778 	 0,			/* rightshift */
    779 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    780 	 32,			/* bitsize */
    781 	 FALSE,			/* pc_relative */
    782 	 0,			/* bitpos */
    783 	 complain_overflow_dont, /* complain_on_overflow */
    784 	 bfd_elf_generic_reloc,	/* special_function */
    785 	 "R_PPC_TLS",		/* name */
    786 	 FALSE,			/* partial_inplace */
    787 	 0,			/* src_mask */
    788 	 0,			/* dst_mask */
    789 	 FALSE),		/* pcrel_offset */
    790 
    791   HOWTO (R_PPC_TLSGD,
    792 	 0,			/* rightshift */
    793 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    794 	 32,			/* bitsize */
    795 	 FALSE,			/* pc_relative */
    796 	 0,			/* bitpos */
    797 	 complain_overflow_dont, /* complain_on_overflow */
    798 	 bfd_elf_generic_reloc, /* special_function */
    799 	 "R_PPC_TLSGD",		/* name */
    800 	 FALSE,			/* partial_inplace */
    801 	 0,			/* src_mask */
    802 	 0,			/* dst_mask */
    803 	 FALSE),		/* pcrel_offset */
    804 
    805   HOWTO (R_PPC_TLSLD,
    806 	 0,			/* rightshift */
    807 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    808 	 32,			/* bitsize */
    809 	 FALSE,			/* pc_relative */
    810 	 0,			/* bitpos */
    811 	 complain_overflow_dont, /* complain_on_overflow */
    812 	 bfd_elf_generic_reloc, /* special_function */
    813 	 "R_PPC_TLSLD",		/* name */
    814 	 FALSE,			/* partial_inplace */
    815 	 0,			/* src_mask */
    816 	 0,			/* dst_mask */
    817 	 FALSE),		/* pcrel_offset */
    818 
    819   /* Computes the load module index of the load module that contains the
    820      definition of its TLS sym.  */
    821   HOWTO (R_PPC_DTPMOD32,
    822 	 0,			/* rightshift */
    823 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    824 	 32,			/* bitsize */
    825 	 FALSE,			/* pc_relative */
    826 	 0,			/* bitpos */
    827 	 complain_overflow_dont, /* complain_on_overflow */
    828 	 ppc_elf_unhandled_reloc, /* special_function */
    829 	 "R_PPC_DTPMOD32",	/* name */
    830 	 FALSE,			/* partial_inplace */
    831 	 0,			/* src_mask */
    832 	 0xffffffff,		/* dst_mask */
    833 	 FALSE),		/* pcrel_offset */
    834 
    835   /* Computes a dtv-relative displacement, the difference between the value
    836      of sym+add and the base address of the thread-local storage block that
    837      contains the definition of sym, minus 0x8000.  */
    838   HOWTO (R_PPC_DTPREL32,
    839 	 0,			/* rightshift */
    840 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    841 	 32,			/* bitsize */
    842 	 FALSE,			/* pc_relative */
    843 	 0,			/* bitpos */
    844 	 complain_overflow_dont, /* complain_on_overflow */
    845 	 ppc_elf_unhandled_reloc, /* special_function */
    846 	 "R_PPC_DTPREL32",	/* name */
    847 	 FALSE,			/* partial_inplace */
    848 	 0,			/* src_mask */
    849 	 0xffffffff,		/* dst_mask */
    850 	 FALSE),		/* pcrel_offset */
    851 
    852   /* A 16 bit dtprel reloc.  */
    853   HOWTO (R_PPC_DTPREL16,
    854 	 0,			/* rightshift */
    855 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    856 	 16,			/* bitsize */
    857 	 FALSE,			/* pc_relative */
    858 	 0,			/* bitpos */
    859 	 complain_overflow_signed, /* complain_on_overflow */
    860 	 ppc_elf_unhandled_reloc, /* special_function */
    861 	 "R_PPC_DTPREL16",	/* name */
    862 	 FALSE,			/* partial_inplace */
    863 	 0,			/* src_mask */
    864 	 0xffff,		/* dst_mask */
    865 	 FALSE),		/* pcrel_offset */
    866 
    867   /* Like DTPREL16, but no overflow.  */
    868   HOWTO (R_PPC_DTPREL16_LO,
    869 	 0,			/* rightshift */
    870 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    871 	 16,			/* bitsize */
    872 	 FALSE,			/* pc_relative */
    873 	 0,			/* bitpos */
    874 	 complain_overflow_dont, /* complain_on_overflow */
    875 	 ppc_elf_unhandled_reloc, /* special_function */
    876 	 "R_PPC_DTPREL16_LO",	/* name */
    877 	 FALSE,			/* partial_inplace */
    878 	 0,			/* src_mask */
    879 	 0xffff,		/* dst_mask */
    880 	 FALSE),		/* pcrel_offset */
    881 
    882   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
    883   HOWTO (R_PPC_DTPREL16_HI,
    884 	 16,			/* rightshift */
    885 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    886 	 16,			/* bitsize */
    887 	 FALSE,			/* pc_relative */
    888 	 0,			/* bitpos */
    889 	 complain_overflow_dont, /* complain_on_overflow */
    890 	 ppc_elf_unhandled_reloc, /* special_function */
    891 	 "R_PPC_DTPREL16_HI",	/* name */
    892 	 FALSE,			/* partial_inplace */
    893 	 0,			/* src_mask */
    894 	 0xffff,		/* dst_mask */
    895 	 FALSE),		/* pcrel_offset */
    896 
    897   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
    898   HOWTO (R_PPC_DTPREL16_HA,
    899 	 16,			/* rightshift */
    900 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    901 	 16,			/* bitsize */
    902 	 FALSE,			/* pc_relative */
    903 	 0,			/* bitpos */
    904 	 complain_overflow_dont, /* complain_on_overflow */
    905 	 ppc_elf_unhandled_reloc, /* special_function */
    906 	 "R_PPC_DTPREL16_HA",	/* name */
    907 	 FALSE,			/* partial_inplace */
    908 	 0,			/* src_mask */
    909 	 0xffff,		/* dst_mask */
    910 	 FALSE),		/* pcrel_offset */
    911 
    912   /* Computes a tp-relative displacement, the difference between the value of
    913      sym+add and the value of the thread pointer (r13).  */
    914   HOWTO (R_PPC_TPREL32,
    915 	 0,			/* rightshift */
    916 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    917 	 32,			/* bitsize */
    918 	 FALSE,			/* pc_relative */
    919 	 0,			/* bitpos */
    920 	 complain_overflow_dont, /* complain_on_overflow */
    921 	 ppc_elf_unhandled_reloc, /* special_function */
    922 	 "R_PPC_TPREL32",	/* name */
    923 	 FALSE,			/* partial_inplace */
    924 	 0,			/* src_mask */
    925 	 0xffffffff,		/* dst_mask */
    926 	 FALSE),		/* pcrel_offset */
    927 
    928   /* A 16 bit tprel reloc.  */
    929   HOWTO (R_PPC_TPREL16,
    930 	 0,			/* rightshift */
    931 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    932 	 16,			/* bitsize */
    933 	 FALSE,			/* pc_relative */
    934 	 0,			/* bitpos */
    935 	 complain_overflow_signed, /* complain_on_overflow */
    936 	 ppc_elf_unhandled_reloc, /* special_function */
    937 	 "R_PPC_TPREL16",	/* name */
    938 	 FALSE,			/* partial_inplace */
    939 	 0,			/* src_mask */
    940 	 0xffff,		/* dst_mask */
    941 	 FALSE),		/* pcrel_offset */
    942 
    943   /* Like TPREL16, but no overflow.  */
    944   HOWTO (R_PPC_TPREL16_LO,
    945 	 0,			/* rightshift */
    946 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    947 	 16,			/* bitsize */
    948 	 FALSE,			/* pc_relative */
    949 	 0,			/* bitpos */
    950 	 complain_overflow_dont, /* complain_on_overflow */
    951 	 ppc_elf_unhandled_reloc, /* special_function */
    952 	 "R_PPC_TPREL16_LO",	/* name */
    953 	 FALSE,			/* partial_inplace */
    954 	 0,			/* src_mask */
    955 	 0xffff,		/* dst_mask */
    956 	 FALSE),		/* pcrel_offset */
    957 
    958   /* Like TPREL16_LO, but next higher group of 16 bits.  */
    959   HOWTO (R_PPC_TPREL16_HI,
    960 	 16,			/* rightshift */
    961 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    962 	 16,			/* bitsize */
    963 	 FALSE,			/* pc_relative */
    964 	 0,			/* bitpos */
    965 	 complain_overflow_dont, /* complain_on_overflow */
    966 	 ppc_elf_unhandled_reloc, /* special_function */
    967 	 "R_PPC_TPREL16_HI",	/* name */
    968 	 FALSE,			/* partial_inplace */
    969 	 0,			/* src_mask */
    970 	 0xffff,		/* dst_mask */
    971 	 FALSE),		/* pcrel_offset */
    972 
    973   /* Like TPREL16_HI, but adjust for low 16 bits.  */
    974   HOWTO (R_PPC_TPREL16_HA,
    975 	 16,			/* rightshift */
    976 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    977 	 16,			/* bitsize */
    978 	 FALSE,			/* pc_relative */
    979 	 0,			/* bitpos */
    980 	 complain_overflow_dont, /* complain_on_overflow */
    981 	 ppc_elf_unhandled_reloc, /* special_function */
    982 	 "R_PPC_TPREL16_HA",	/* name */
    983 	 FALSE,			/* partial_inplace */
    984 	 0,			/* src_mask */
    985 	 0xffff,		/* dst_mask */
    986 	 FALSE),		/* pcrel_offset */
    987 
    988   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
    989      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
    990      to the first entry.  */
    991   HOWTO (R_PPC_GOT_TLSGD16,
    992 	 0,			/* rightshift */
    993 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    994 	 16,			/* bitsize */
    995 	 FALSE,			/* pc_relative */
    996 	 0,			/* bitpos */
    997 	 complain_overflow_signed, /* complain_on_overflow */
    998 	 ppc_elf_unhandled_reloc, /* special_function */
    999 	 "R_PPC_GOT_TLSGD16",	/* name */
   1000 	 FALSE,			/* partial_inplace */
   1001 	 0,			/* src_mask */
   1002 	 0xffff,		/* dst_mask */
   1003 	 FALSE),		/* pcrel_offset */
   1004 
   1005   /* Like GOT_TLSGD16, but no overflow.  */
   1006   HOWTO (R_PPC_GOT_TLSGD16_LO,
   1007 	 0,			/* rightshift */
   1008 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1009 	 16,			/* bitsize */
   1010 	 FALSE,			/* pc_relative */
   1011 	 0,			/* bitpos */
   1012 	 complain_overflow_dont, /* complain_on_overflow */
   1013 	 ppc_elf_unhandled_reloc, /* special_function */
   1014 	 "R_PPC_GOT_TLSGD16_LO", /* name */
   1015 	 FALSE,			/* partial_inplace */
   1016 	 0,			/* src_mask */
   1017 	 0xffff,		/* dst_mask */
   1018 	 FALSE),		/* pcrel_offset */
   1019 
   1020   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
   1021   HOWTO (R_PPC_GOT_TLSGD16_HI,
   1022 	 16,			/* rightshift */
   1023 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1024 	 16,			/* bitsize */
   1025 	 FALSE,			/* pc_relative */
   1026 	 0,			/* bitpos */
   1027 	 complain_overflow_dont, /* complain_on_overflow */
   1028 	 ppc_elf_unhandled_reloc, /* special_function */
   1029 	 "R_PPC_GOT_TLSGD16_HI", /* name */
   1030 	 FALSE,			/* partial_inplace */
   1031 	 0,			/* src_mask */
   1032 	 0xffff,		/* dst_mask */
   1033 	 FALSE),		/* pcrel_offset */
   1034 
   1035   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
   1036   HOWTO (R_PPC_GOT_TLSGD16_HA,
   1037 	 16,			/* rightshift */
   1038 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1039 	 16,			/* bitsize */
   1040 	 FALSE,			/* pc_relative */
   1041 	 0,			/* bitpos */
   1042 	 complain_overflow_dont, /* complain_on_overflow */
   1043 	 ppc_elf_unhandled_reloc, /* special_function */
   1044 	 "R_PPC_GOT_TLSGD16_HA", /* name */
   1045 	 FALSE,			/* partial_inplace */
   1046 	 0,			/* src_mask */
   1047 	 0xffff,		/* dst_mask */
   1048 	 FALSE),		/* pcrel_offset */
   1049 
   1050   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
   1051      with values (sym+add)@dtpmod and zero, and computes the offset to the
   1052      first entry.  */
   1053   HOWTO (R_PPC_GOT_TLSLD16,
   1054 	 0,			/* rightshift */
   1055 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1056 	 16,			/* bitsize */
   1057 	 FALSE,			/* pc_relative */
   1058 	 0,			/* bitpos */
   1059 	 complain_overflow_signed, /* complain_on_overflow */
   1060 	 ppc_elf_unhandled_reloc, /* special_function */
   1061 	 "R_PPC_GOT_TLSLD16",	/* name */
   1062 	 FALSE,			/* partial_inplace */
   1063 	 0,			/* src_mask */
   1064 	 0xffff,		/* dst_mask */
   1065 	 FALSE),		/* pcrel_offset */
   1066 
   1067   /* Like GOT_TLSLD16, but no overflow.  */
   1068   HOWTO (R_PPC_GOT_TLSLD16_LO,
   1069 	 0,			/* rightshift */
   1070 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1071 	 16,			/* bitsize */
   1072 	 FALSE,			/* pc_relative */
   1073 	 0,			/* bitpos */
   1074 	 complain_overflow_dont, /* complain_on_overflow */
   1075 	 ppc_elf_unhandled_reloc, /* special_function */
   1076 	 "R_PPC_GOT_TLSLD16_LO", /* name */
   1077 	 FALSE,			/* partial_inplace */
   1078 	 0,			/* src_mask */
   1079 	 0xffff,		/* dst_mask */
   1080 	 FALSE),		/* pcrel_offset */
   1081 
   1082   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
   1083   HOWTO (R_PPC_GOT_TLSLD16_HI,
   1084 	 16,			/* rightshift */
   1085 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1086 	 16,			/* bitsize */
   1087 	 FALSE,			/* pc_relative */
   1088 	 0,			/* bitpos */
   1089 	 complain_overflow_dont, /* complain_on_overflow */
   1090 	 ppc_elf_unhandled_reloc, /* special_function */
   1091 	 "R_PPC_GOT_TLSLD16_HI", /* name */
   1092 	 FALSE,			/* partial_inplace */
   1093 	 0,			/* src_mask */
   1094 	 0xffff,		/* dst_mask */
   1095 	 FALSE),		/* pcrel_offset */
   1096 
   1097   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
   1098   HOWTO (R_PPC_GOT_TLSLD16_HA,
   1099 	 16,			/* rightshift */
   1100 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1101 	 16,			/* bitsize */
   1102 	 FALSE,			/* pc_relative */
   1103 	 0,			/* bitpos */
   1104 	 complain_overflow_dont, /* complain_on_overflow */
   1105 	 ppc_elf_unhandled_reloc, /* special_function */
   1106 	 "R_PPC_GOT_TLSLD16_HA", /* name */
   1107 	 FALSE,			/* partial_inplace */
   1108 	 0,			/* src_mask */
   1109 	 0xffff,		/* dst_mask */
   1110 	 FALSE),		/* pcrel_offset */
   1111 
   1112   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
   1113      the offset to the entry.  */
   1114   HOWTO (R_PPC_GOT_DTPREL16,
   1115 	 0,			/* rightshift */
   1116 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1117 	 16,			/* bitsize */
   1118 	 FALSE,			/* pc_relative */
   1119 	 0,			/* bitpos */
   1120 	 complain_overflow_signed, /* complain_on_overflow */
   1121 	 ppc_elf_unhandled_reloc, /* special_function */
   1122 	 "R_PPC_GOT_DTPREL16",	/* name */
   1123 	 FALSE,			/* partial_inplace */
   1124 	 0,			/* src_mask */
   1125 	 0xffff,		/* dst_mask */
   1126 	 FALSE),		/* pcrel_offset */
   1127 
   1128   /* Like GOT_DTPREL16, but no overflow.  */
   1129   HOWTO (R_PPC_GOT_DTPREL16_LO,
   1130 	 0,			/* rightshift */
   1131 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1132 	 16,			/* bitsize */
   1133 	 FALSE,			/* pc_relative */
   1134 	 0,			/* bitpos */
   1135 	 complain_overflow_dont, /* complain_on_overflow */
   1136 	 ppc_elf_unhandled_reloc, /* special_function */
   1137 	 "R_PPC_GOT_DTPREL16_LO", /* name */
   1138 	 FALSE,			/* partial_inplace */
   1139 	 0,			/* src_mask */
   1140 	 0xffff,		/* dst_mask */
   1141 	 FALSE),		/* pcrel_offset */
   1142 
   1143   /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
   1144   HOWTO (R_PPC_GOT_DTPREL16_HI,
   1145 	 16,			/* rightshift */
   1146 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1147 	 16,			/* bitsize */
   1148 	 FALSE,			/* pc_relative */
   1149 	 0,			/* bitpos */
   1150 	 complain_overflow_dont, /* complain_on_overflow */
   1151 	 ppc_elf_unhandled_reloc, /* special_function */
   1152 	 "R_PPC_GOT_DTPREL16_HI", /* name */
   1153 	 FALSE,			/* partial_inplace */
   1154 	 0,			/* src_mask */
   1155 	 0xffff,		/* dst_mask */
   1156 	 FALSE),		/* pcrel_offset */
   1157 
   1158   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
   1159   HOWTO (R_PPC_GOT_DTPREL16_HA,
   1160 	 16,			/* rightshift */
   1161 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1162 	 16,			/* bitsize */
   1163 	 FALSE,			/* pc_relative */
   1164 	 0,			/* bitpos */
   1165 	 complain_overflow_dont, /* complain_on_overflow */
   1166 	 ppc_elf_unhandled_reloc, /* special_function */
   1167 	 "R_PPC_GOT_DTPREL16_HA", /* name */
   1168 	 FALSE,			/* partial_inplace */
   1169 	 0,			/* src_mask */
   1170 	 0xffff,		/* dst_mask */
   1171 	 FALSE),		/* pcrel_offset */
   1172 
   1173   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
   1174      offset to the entry.  */
   1175   HOWTO (R_PPC_GOT_TPREL16,
   1176 	 0,			/* rightshift */
   1177 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1178 	 16,			/* bitsize */
   1179 	 FALSE,			/* pc_relative */
   1180 	 0,			/* bitpos */
   1181 	 complain_overflow_signed, /* complain_on_overflow */
   1182 	 ppc_elf_unhandled_reloc, /* special_function */
   1183 	 "R_PPC_GOT_TPREL16",	/* name */
   1184 	 FALSE,			/* partial_inplace */
   1185 	 0,			/* src_mask */
   1186 	 0xffff,		/* dst_mask */
   1187 	 FALSE),		/* pcrel_offset */
   1188 
   1189   /* Like GOT_TPREL16, but no overflow.  */
   1190   HOWTO (R_PPC_GOT_TPREL16_LO,
   1191 	 0,			/* rightshift */
   1192 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1193 	 16,			/* bitsize */
   1194 	 FALSE,			/* pc_relative */
   1195 	 0,			/* bitpos */
   1196 	 complain_overflow_dont, /* complain_on_overflow */
   1197 	 ppc_elf_unhandled_reloc, /* special_function */
   1198 	 "R_PPC_GOT_TPREL16_LO", /* name */
   1199 	 FALSE,			/* partial_inplace */
   1200 	 0,			/* src_mask */
   1201 	 0xffff,		/* dst_mask */
   1202 	 FALSE),		/* pcrel_offset */
   1203 
   1204   /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
   1205   HOWTO (R_PPC_GOT_TPREL16_HI,
   1206 	 16,			/* rightshift */
   1207 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1208 	 16,			/* bitsize */
   1209 	 FALSE,			/* pc_relative */
   1210 	 0,			/* bitpos */
   1211 	 complain_overflow_dont, /* complain_on_overflow */
   1212 	 ppc_elf_unhandled_reloc, /* special_function */
   1213 	 "R_PPC_GOT_TPREL16_HI", /* name */
   1214 	 FALSE,			/* partial_inplace */
   1215 	 0,			/* src_mask */
   1216 	 0xffff,		/* dst_mask */
   1217 	 FALSE),		/* pcrel_offset */
   1218 
   1219   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
   1220   HOWTO (R_PPC_GOT_TPREL16_HA,
   1221 	 16,			/* rightshift */
   1222 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1223 	 16,			/* bitsize */
   1224 	 FALSE,			/* pc_relative */
   1225 	 0,			/* bitpos */
   1226 	 complain_overflow_dont, /* complain_on_overflow */
   1227 	 ppc_elf_unhandled_reloc, /* special_function */
   1228 	 "R_PPC_GOT_TPREL16_HA", /* name */
   1229 	 FALSE,			/* partial_inplace */
   1230 	 0,			/* src_mask */
   1231 	 0xffff,		/* dst_mask */
   1232 	 FALSE),		/* pcrel_offset */
   1233 
   1234   /* The remaining relocs are from the Embedded ELF ABI, and are not
   1235      in the SVR4 ELF ABI.  */
   1236 
   1237   /* 32 bit value resulting from the addend minus the symbol.  */
   1238   HOWTO (R_PPC_EMB_NADDR32,	/* type */
   1239 	 0,			/* rightshift */
   1240 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1241 	 32,			/* bitsize */
   1242 	 FALSE,			/* pc_relative */
   1243 	 0,			/* bitpos */
   1244 	 complain_overflow_bitfield, /* complain_on_overflow */
   1245 	 bfd_elf_generic_reloc,	/* special_function */
   1246 	 "R_PPC_EMB_NADDR32",	/* name */
   1247 	 FALSE,			/* partial_inplace */
   1248 	 0,			/* src_mask */
   1249 	 0xffffffff,		/* dst_mask */
   1250 	 FALSE),		/* pcrel_offset */
   1251 
   1252   /* 16 bit value resulting from the addend minus the symbol.  */
   1253   HOWTO (R_PPC_EMB_NADDR16,	/* type */
   1254 	 0,			/* rightshift */
   1255 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1256 	 16,			/* bitsize */
   1257 	 FALSE,			/* pc_relative */
   1258 	 0,			/* bitpos */
   1259 	 complain_overflow_bitfield, /* complain_on_overflow */
   1260 	 bfd_elf_generic_reloc,	/* special_function */
   1261 	 "R_PPC_EMB_NADDR16",	/* name */
   1262 	 FALSE,			/* partial_inplace */
   1263 	 0,			/* src_mask */
   1264 	 0xffff,		/* dst_mask */
   1265 	 FALSE),		/* pcrel_offset */
   1266 
   1267   /* 16 bit value resulting from the addend minus the symbol.  */
   1268   HOWTO (R_PPC_EMB_NADDR16_LO,	/* type */
   1269 	 0,			/* rightshift */
   1270 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1271 	 16,			/* bitsize */
   1272 	 FALSE,			/* pc_relative */
   1273 	 0,			/* bitpos */
   1274 	 complain_overflow_dont,/* complain_on_overflow */
   1275 	 bfd_elf_generic_reloc,	/* special_function */
   1276 	 "R_PPC_EMB_ADDR16_LO",	/* name */
   1277 	 FALSE,			/* partial_inplace */
   1278 	 0,			/* src_mask */
   1279 	 0xffff,		/* dst_mask */
   1280 	 FALSE),		/* pcrel_offset */
   1281 
   1282   /* The high order 16 bits of the addend minus the symbol.  */
   1283   HOWTO (R_PPC_EMB_NADDR16_HI,	/* type */
   1284 	 16,			/* rightshift */
   1285 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1286 	 16,			/* bitsize */
   1287 	 FALSE,			/* pc_relative */
   1288 	 0,			/* bitpos */
   1289 	 complain_overflow_dont, /* complain_on_overflow */
   1290 	 bfd_elf_generic_reloc,	/* special_function */
   1291 	 "R_PPC_EMB_NADDR16_HI", /* name */
   1292 	 FALSE,			/* partial_inplace */
   1293 	 0,			/* src_mask */
   1294 	 0xffff,		/* dst_mask */
   1295 	 FALSE),		/* pcrel_offset */
   1296 
   1297   /* The high order 16 bits of the result of the addend minus the address,
   1298      plus 1 if the contents of the low 16 bits, treated as a signed number,
   1299      is negative.  */
   1300   HOWTO (R_PPC_EMB_NADDR16_HA,	/* type */
   1301 	 16,			/* rightshift */
   1302 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1303 	 16,			/* bitsize */
   1304 	 FALSE,			/* pc_relative */
   1305 	 0,			/* bitpos */
   1306 	 complain_overflow_dont, /* complain_on_overflow */
   1307 	 ppc_elf_addr16_ha_reloc, /* special_function */
   1308 	 "R_PPC_EMB_NADDR16_HA", /* name */
   1309 	 FALSE,			/* partial_inplace */
   1310 	 0,			/* src_mask */
   1311 	 0xffff,		/* dst_mask */
   1312 	 FALSE),		/* pcrel_offset */
   1313 
   1314   /* 16 bit value resulting from allocating a 4 byte word to hold an
   1315      address in the .sdata section, and returning the offset from
   1316      _SDA_BASE_ for that relocation.  */
   1317   HOWTO (R_PPC_EMB_SDAI16,	/* type */
   1318 	 0,			/* rightshift */
   1319 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1320 	 16,			/* bitsize */
   1321 	 FALSE,			/* pc_relative */
   1322 	 0,			/* bitpos */
   1323 	 complain_overflow_signed, /* complain_on_overflow */
   1324 	 bfd_elf_generic_reloc,	/* special_function */
   1325 	 "R_PPC_EMB_SDAI16",	/* name */
   1326 	 FALSE,			/* partial_inplace */
   1327 	 0,			/* src_mask */
   1328 	 0xffff,		/* dst_mask */
   1329 	 FALSE),		/* pcrel_offset */
   1330 
   1331   /* 16 bit value resulting from allocating a 4 byte word to hold an
   1332      address in the .sdata2 section, and returning the offset from
   1333      _SDA2_BASE_ for that relocation.  */
   1334   HOWTO (R_PPC_EMB_SDA2I16,	/* type */
   1335 	 0,			/* rightshift */
   1336 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1337 	 16,			/* bitsize */
   1338 	 FALSE,			/* pc_relative */
   1339 	 0,			/* bitpos */
   1340 	 complain_overflow_signed, /* complain_on_overflow */
   1341 	 bfd_elf_generic_reloc,	/* special_function */
   1342 	 "R_PPC_EMB_SDA2I16",	/* name */
   1343 	 FALSE,			/* partial_inplace */
   1344 	 0,			/* src_mask */
   1345 	 0xffff,		/* dst_mask */
   1346 	 FALSE),		/* pcrel_offset */
   1347 
   1348   /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
   1349      small data items.	 */
   1350   HOWTO (R_PPC_EMB_SDA2REL,	/* type */
   1351 	 0,			/* rightshift */
   1352 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1353 	 16,			/* bitsize */
   1354 	 FALSE,			/* pc_relative */
   1355 	 0,			/* bitpos */
   1356 	 complain_overflow_signed, /* complain_on_overflow */
   1357 	 bfd_elf_generic_reloc,	/* special_function */
   1358 	 "R_PPC_EMB_SDA2REL",	/* name */
   1359 	 FALSE,			/* partial_inplace */
   1360 	 0,			/* src_mask */
   1361 	 0xffff,		/* dst_mask */
   1362 	 FALSE),		/* pcrel_offset */
   1363 
   1364   /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
   1365      signed offset from the appropriate base, and filling in the register
   1366      field with the appropriate register (0, 2, or 13).  */
   1367   HOWTO (R_PPC_EMB_SDA21,	/* type */
   1368 	 0,			/* rightshift */
   1369 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1370 	 16,			/* bitsize */
   1371 	 FALSE,			/* pc_relative */
   1372 	 0,			/* bitpos */
   1373 	 complain_overflow_signed, /* complain_on_overflow */
   1374 	 bfd_elf_generic_reloc,	/* special_function */
   1375 	 "R_PPC_EMB_SDA21",	/* name */
   1376 	 FALSE,			/* partial_inplace */
   1377 	 0,			/* src_mask */
   1378 	 0xffff,		/* dst_mask */
   1379 	 FALSE),		/* pcrel_offset */
   1380 
   1381   /* Relocation not handled: R_PPC_EMB_MRKREF */
   1382   /* Relocation not handled: R_PPC_EMB_RELSEC16 */
   1383   /* Relocation not handled: R_PPC_EMB_RELST_LO */
   1384   /* Relocation not handled: R_PPC_EMB_RELST_HI */
   1385   /* Relocation not handled: R_PPC_EMB_RELST_HA */
   1386   /* Relocation not handled: R_PPC_EMB_BIT_FLD */
   1387 
   1388   /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
   1389      in the 16 bit signed offset from the appropriate base, and filling in the
   1390      register field with the appropriate register (0, 2, or 13).  */
   1391   HOWTO (R_PPC_EMB_RELSDA,	/* type */
   1392 	 0,			/* rightshift */
   1393 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1394 	 16,			/* bitsize */
   1395 	 FALSE,			/* pc_relative */
   1396 	 0,			/* bitpos */
   1397 	 complain_overflow_signed, /* complain_on_overflow */
   1398 	 bfd_elf_generic_reloc,	/* special_function */
   1399 	 "R_PPC_EMB_RELSDA",	/* name */
   1400 	 FALSE,			/* partial_inplace */
   1401 	 0,			/* src_mask */
   1402 	 0xffff,		/* dst_mask */
   1403 	 FALSE),		/* pcrel_offset */
   1404 
   1405   /* A relative 8 bit branch.  */
   1406   HOWTO (R_PPC_VLE_REL8,	/* type */
   1407 	 1,			/* rightshift */
   1408 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1409 	 8,			/* bitsize */
   1410 	 TRUE,			/* pc_relative */
   1411 	 0,			/* bitpos */
   1412 	 complain_overflow_signed, /* complain_on_overflow */
   1413 	 bfd_elf_generic_reloc,	/* special_function */
   1414 	 "R_PPC_VLE_REL8",	/* name */
   1415 	 FALSE,			/* partial_inplace */
   1416 	 0,			/* src_mask */
   1417 	 0xff,			/* dst_mask */
   1418 	 TRUE),			/* pcrel_offset */
   1419 
   1420   /* A relative 15 bit branch.  */
   1421   HOWTO (R_PPC_VLE_REL15,	/* type */
   1422 	 1,			/* rightshift */
   1423 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1424 	 15,			/* bitsize */
   1425 	 TRUE,			/* pc_relative */
   1426 	 1,			/* bitpos */
   1427 	 complain_overflow_signed, /* complain_on_overflow */
   1428 	 bfd_elf_generic_reloc,	/* special_function */
   1429 	 "R_PPC_VLE_REL15",	/* name */
   1430 	 FALSE,			/* partial_inplace */
   1431 	 0,			/* src_mask */
   1432 	 0xfe,			/* dst_mask */
   1433 	 TRUE),			/* pcrel_offset */
   1434 
   1435   /* A relative 24 bit branch.  */
   1436   HOWTO (R_PPC_VLE_REL24,	/* type */
   1437 	 1,			/* rightshift */
   1438 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1439 	 24,			/* bitsize */
   1440 	 TRUE,			/* pc_relative */
   1441 	 1,			/* bitpos */
   1442 	 complain_overflow_signed, /* complain_on_overflow */
   1443 	 bfd_elf_generic_reloc,	/* special_function */
   1444 	 "R_PPC_VLE_REL24",	/* name */
   1445 	 FALSE,			/* partial_inplace */
   1446 	 0,			/* src_mask */
   1447 	 0x1fffffe,		/* dst_mask */
   1448 	 TRUE),			/* pcrel_offset */
   1449 
   1450   /* The 16 LSBS in split16a format.  */
   1451   HOWTO (R_PPC_VLE_LO16A,	/* type */
   1452 	 0,			/* rightshift */
   1453 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1454 	 32,			/* bitsize */
   1455 	 FALSE,			/* pc_relative */
   1456 	 0,			/* bitpos */
   1457 	 complain_overflow_bitfield, /* complain_on_overflow */
   1458 	 bfd_elf_generic_reloc,	 /* special_function */
   1459 	 "R_PPC_VLE_LO16A",	/* name */
   1460 	 FALSE,			/* partial_inplace */
   1461 	 0,			/* src_mask */
   1462 	 0x1f007ff,		/* dst_mask */
   1463 	 FALSE),		/* pcrel_offset */
   1464 
   1465   /* The 16 LSBS in split16d format.  */
   1466   HOWTO (R_PPC_VLE_LO16D,	/* type */
   1467 	 0,			/* rightshift */
   1468 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1469 	 32,			/* bitsize */
   1470 	 FALSE,			/* pc_relative */
   1471 	 0,			/* bitpos */
   1472 	 complain_overflow_bitfield, /* complain_on_overflow */
   1473 	 bfd_elf_generic_reloc,	 /* special_function */
   1474 	 "R_PPC_VLE_LO16D",		/* name */
   1475 	 FALSE,			/* partial_inplace */
   1476 	 0,			/* src_mask */
   1477 	 0x1f07ff,		/* dst_mask */
   1478 	 FALSE),		/* pcrel_offset */
   1479 
   1480   /* Bits 16-31 split16a format.  */
   1481   HOWTO (R_PPC_VLE_HI16A,	/* type */
   1482 	 0,			/* rightshift */
   1483 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1484 	 32,			/* bitsize */
   1485 	 FALSE,			/* pc_relative */
   1486 	 0,			/* bitpos */
   1487 	 complain_overflow_bitfield, /* complain_on_overflow */
   1488 	 bfd_elf_generic_reloc,	 /* special_function */
   1489 	 "R_PPC_VLE_HI16A",		/* name */
   1490 	 FALSE,			/* partial_inplace */
   1491 	 0,			/* src_mask */
   1492 	 0x1f007ff,		/* dst_mask */
   1493 	 FALSE),		/* pcrel_offset */
   1494 
   1495   /* Bits 16-31 split16d format.  */
   1496   HOWTO (R_PPC_VLE_HI16D,	/* type */
   1497 	 0,			/* rightshift */
   1498 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1499 	 32,			/* bitsize */
   1500 	 FALSE,			/* pc_relative */
   1501 	 0,			/* bitpos */
   1502 	 complain_overflow_bitfield, /* complain_on_overflow */
   1503 	 bfd_elf_generic_reloc,	 /* special_function */
   1504 	 "R_PPC_VLE_HI16D",		/* name */
   1505 	 FALSE,			/* partial_inplace */
   1506 	 0,			/* src_mask */
   1507 	 0x1f07ff,		/* dst_mask */
   1508 	 FALSE),		/* pcrel_offset */
   1509 
   1510   /* Bits 16-31 (High Adjusted) in split16a format.  */
   1511   HOWTO (R_PPC_VLE_HA16A,	/* type */
   1512 	 0,			/* rightshift */
   1513 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1514 	 32,			/* bitsize */
   1515 	 FALSE,			/* pc_relative */
   1516 	 0,			/* bitpos */
   1517 	 complain_overflow_bitfield, /* complain_on_overflow */
   1518 	 bfd_elf_generic_reloc,	 /* special_function */
   1519 	 "R_PPC_VLE_HA16A",		/* name */
   1520 	 FALSE,			/* partial_inplace */
   1521 	 0,			/* src_mask */
   1522 	 0x1f007ff,		/* dst_mask */
   1523 	 FALSE),		/* pcrel_offset */
   1524 
   1525   /* Bits 16-31 (High Adjusted) in split16d format.  */
   1526   HOWTO (R_PPC_VLE_HA16D,	/* type */
   1527 	 0,			/* rightshift */
   1528 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1529 	 32,			/* bitsize */
   1530 	 FALSE,			/* pc_relative */
   1531 	 0,			/* bitpos */
   1532 	 complain_overflow_bitfield, /* complain_on_overflow */
   1533 	 bfd_elf_generic_reloc,	 /* special_function */
   1534 	 "R_PPC_VLE_HA16D",		/* name */
   1535 	 FALSE,			/* partial_inplace */
   1536 	 0,			/* src_mask */
   1537 	 0x1f07ff,		/* dst_mask */
   1538 	 FALSE),		/* pcrel_offset */
   1539 
   1540   /* This reloc does nothing.  */
   1541   HOWTO (R_PPC_VLE_SDA21,		/* type */
   1542 	 0,			/* rightshift */
   1543 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1544 	 32,			/* bitsize */
   1545 	 FALSE,			/* pc_relative */
   1546 	 0,			/* bitpos */
   1547 	 complain_overflow_bitfield, /* complain_on_overflow */
   1548 	 bfd_elf_generic_reloc,	/* special_function */
   1549 	 "R_PPC_VLE_SDA21",		/* name */
   1550 	 FALSE,			/* partial_inplace */
   1551 	 0,			/* src_mask */
   1552 	 0xffff,		/* dst_mask */
   1553 	 FALSE),		/* pcrel_offset */
   1554 
   1555   /* This reloc does nothing.  */
   1556   HOWTO (R_PPC_VLE_SDA21_LO,	/* type */
   1557 	 0,			/* rightshift */
   1558 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1559 	 32,			/* bitsize */
   1560 	 FALSE,			/* pc_relative */
   1561 	 0,			/* bitpos */
   1562 	 complain_overflow_bitfield, /* complain_on_overflow */
   1563 	 bfd_elf_generic_reloc,	/* special_function */
   1564 	 "R_PPC_VLE_SDA21_LO",	/* name */
   1565 	 FALSE,			/* partial_inplace */
   1566 	 0,			/* src_mask */
   1567 	 0,			/* dst_mask */
   1568 	 FALSE),		/* pcrel_offset */
   1569 
   1570   /* The 16 LSBS relative to _SDA_BASE_ in split16a format.  */
   1571   HOWTO (R_PPC_VLE_SDAREL_LO16A,/* type */
   1572 	 0,			/* rightshift */
   1573 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1574 	 32,			/* bitsize */
   1575 	 FALSE,			/* pc_relative */
   1576 	 0,			/* bitpos */
   1577 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1578 	 bfd_elf_generic_reloc,	 /* special_function */
   1579 	 "R_PPC_VLE_SDAREL_LO16A",	/* name */
   1580 	 FALSE,			/* partial_inplace */
   1581 	 0,			/* src_mask */
   1582 	 0x1f007ff,		/* dst_mask */
   1583 	 FALSE),		/* pcrel_offset */
   1584 
   1585   /* The 16 LSBS relative to _SDA_BASE_ in split16d format.  */
   1586   /* This reloc does nothing.  */
   1587   HOWTO (R_PPC_VLE_SDAREL_LO16D, /* type */
   1588 	 0,			/* rightshift */
   1589 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1590 	 32,			/* bitsize */
   1591 	 FALSE,			/* pc_relative */
   1592 	 0,			/* bitpos */
   1593 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1594 	 bfd_elf_generic_reloc,	 /* special_function */
   1595 	 "R_PPC_VLE_SDAREL_LO16D",		/* name */
   1596 	 FALSE,			/* partial_inplace */
   1597 	 0,			/* src_mask */
   1598 	 0x1f07ff,		/* dst_mask */
   1599 	 FALSE),		/* pcrel_offset */
   1600 
   1601   /* Bits 16-31 relative to _SDA_BASE_ in split16a format.  */
   1602   HOWTO (R_PPC_VLE_SDAREL_HI16A,	/* type */
   1603 	 0,			/* rightshift */
   1604 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1605 	 32,			/* bitsize */
   1606 	 FALSE,			/* pc_relative */
   1607 	 0,			/* bitpos */
   1608 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1609 	 bfd_elf_generic_reloc,	 /* special_function */
   1610 	 "R_PPC_VLE_SDAREL_HI16A",	/* name */
   1611 	 FALSE,			/* partial_inplace */
   1612 	 0,			/* src_mask */
   1613 	 0x1f007ff,		/* dst_mask */
   1614 	 FALSE),		/* pcrel_offset */
   1615 
   1616   /* Bits 16-31 relative to _SDA_BASE_ in split16d format.  */
   1617   HOWTO (R_PPC_VLE_SDAREL_HI16D,	/* type */
   1618 	 0,			/* rightshift */
   1619 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1620 	 32,			/* bitsize */
   1621 	 FALSE,			/* pc_relative */
   1622 	 0,			/* bitpos */
   1623 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1624 	 bfd_elf_generic_reloc,	 /* special_function */
   1625 	 "R_PPC_VLE_SDAREL_HI16D",	/* name */
   1626 	 FALSE,			/* partial_inplace */
   1627 	 0,			/* src_mask */
   1628 	 0x1f07ff,		/* dst_mask */
   1629 	 FALSE),		/* pcrel_offset */
   1630 
   1631   /* Bits 16-31 (HA) relative to _SDA_BASE split16a format.  */
   1632   HOWTO (R_PPC_VLE_SDAREL_HA16A,	/* type */
   1633 	 0,			/* rightshift */
   1634 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1635 	 32,			/* bitsize */
   1636 	 FALSE,			/* pc_relative */
   1637 	 0,			/* bitpos */
   1638 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1639 	 bfd_elf_generic_reloc,	 /* special_function */
   1640 	 "R_PPC_VLE_SDAREL_HA16A",	/* name */
   1641 	 FALSE,			/* partial_inplace */
   1642 	 0,			/* src_mask */
   1643 	 0x1f007ff,		/* dst_mask */
   1644 	 FALSE),		/* pcrel_offset */
   1645 
   1646   /* Bits 16-31 (HA) relative to _SDA_BASE split16d format.  */
   1647   HOWTO (R_PPC_VLE_SDAREL_HA16D,	/* type */
   1648 	 0,			/* rightshift */
   1649 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1650 	 32,			/* bitsize */
   1651 	 FALSE,			/* pc_relative */
   1652 	 0,			/* bitpos */
   1653 	 complain_overflow_bitfield,	/* complain_on_overflow */
   1654 	 bfd_elf_generic_reloc,	 /* special_function */
   1655 	 "R_PPC_VLE_SDAREL_HA16D",	/* name */
   1656 	 FALSE,			/* partial_inplace */
   1657 	 0,			/* src_mask */
   1658 	 0x1f07ff,		/* dst_mask */
   1659 	 FALSE),		/* pcrel_offset */
   1660 
   1661   HOWTO (R_PPC_IRELATIVE,	/* type */
   1662 	 0,			/* rightshift */
   1663 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1664 	 32,			/* bitsize */
   1665 	 FALSE,			/* pc_relative */
   1666 	 0,			/* bitpos */
   1667 	 complain_overflow_bitfield, /* complain_on_overflow */
   1668 	 bfd_elf_generic_reloc,	 /* special_function */
   1669 	 "R_PPC_IRELATIVE",	/* name */
   1670 	 FALSE,			/* partial_inplace */
   1671 	 0,			/* src_mask */
   1672 	 0xffffffff,		/* dst_mask */
   1673 	 FALSE),		/* pcrel_offset */
   1674 
   1675   /* A 16 bit relative relocation.  */
   1676   HOWTO (R_PPC_REL16,		/* type */
   1677 	 0,			/* rightshift */
   1678 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1679 	 16,			/* bitsize */
   1680 	 TRUE,			/* pc_relative */
   1681 	 0,			/* bitpos */
   1682 	 complain_overflow_bitfield, /* complain_on_overflow */
   1683 	 bfd_elf_generic_reloc,	/* special_function */
   1684 	 "R_PPC_REL16",		/* name */
   1685 	 FALSE,			/* partial_inplace */
   1686 	 0,			/* src_mask */
   1687 	 0xffff,		/* dst_mask */
   1688 	 TRUE),			/* pcrel_offset */
   1689 
   1690   /* A 16 bit relative relocation without overflow.  */
   1691   HOWTO (R_PPC_REL16_LO,	/* type */
   1692 	 0,			/* rightshift */
   1693 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1694 	 16,			/* bitsize */
   1695 	 TRUE,			/* pc_relative */
   1696 	 0,			/* bitpos */
   1697 	 complain_overflow_dont,/* complain_on_overflow */
   1698 	 bfd_elf_generic_reloc,	/* special_function */
   1699 	 "R_PPC_REL16_LO",	/* name */
   1700 	 FALSE,			/* partial_inplace */
   1701 	 0,			/* src_mask */
   1702 	 0xffff,		/* dst_mask */
   1703 	 TRUE),			/* pcrel_offset */
   1704 
   1705   /* The high order 16 bits of a relative address.  */
   1706   HOWTO (R_PPC_REL16_HI,	/* type */
   1707 	 16,			/* rightshift */
   1708 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1709 	 16,			/* bitsize */
   1710 	 TRUE,			/* pc_relative */
   1711 	 0,			/* bitpos */
   1712 	 complain_overflow_dont, /* complain_on_overflow */
   1713 	 bfd_elf_generic_reloc,	/* special_function */
   1714 	 "R_PPC_REL16_HI",	/* name */
   1715 	 FALSE,			/* partial_inplace */
   1716 	 0,			/* src_mask */
   1717 	 0xffff,		/* dst_mask */
   1718 	 TRUE),			/* pcrel_offset */
   1719 
   1720   /* The high order 16 bits of a relative address, plus 1 if the contents of
   1721      the low 16 bits, treated as a signed number, is negative.  */
   1722   HOWTO (R_PPC_REL16_HA,	/* type */
   1723 	 16,			/* rightshift */
   1724 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1725 	 16,			/* bitsize */
   1726 	 TRUE,			/* pc_relative */
   1727 	 0,			/* bitpos */
   1728 	 complain_overflow_dont, /* complain_on_overflow */
   1729 	 ppc_elf_addr16_ha_reloc, /* special_function */
   1730 	 "R_PPC_REL16_HA",	/* name */
   1731 	 FALSE,			/* partial_inplace */
   1732 	 0,			/* src_mask */
   1733 	 0xffff,		/* dst_mask */
   1734 	 TRUE),			/* pcrel_offset */
   1735 
   1736   /* GNU extension to record C++ vtable hierarchy.  */
   1737   HOWTO (R_PPC_GNU_VTINHERIT,	/* type */
   1738 	 0,			/* rightshift */
   1739 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1740 	 0,			/* bitsize */
   1741 	 FALSE,			/* pc_relative */
   1742 	 0,			/* bitpos */
   1743 	 complain_overflow_dont, /* complain_on_overflow */
   1744 	 NULL,			/* special_function */
   1745 	 "R_PPC_GNU_VTINHERIT",	/* name */
   1746 	 FALSE,			/* partial_inplace */
   1747 	 0,			/* src_mask */
   1748 	 0,			/* dst_mask */
   1749 	 FALSE),		/* pcrel_offset */
   1750 
   1751   /* GNU extension to record C++ vtable member usage.  */
   1752   HOWTO (R_PPC_GNU_VTENTRY,	/* type */
   1753 	 0,			/* rightshift */
   1754 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1755 	 0,			/* bitsize */
   1756 	 FALSE,			/* pc_relative */
   1757 	 0,			/* bitpos */
   1758 	 complain_overflow_dont, /* complain_on_overflow */
   1759 	 NULL,			/* special_function */
   1760 	 "R_PPC_GNU_VTENTRY",	/* name */
   1761 	 FALSE,			/* partial_inplace */
   1762 	 0,			/* src_mask */
   1763 	 0,			/* dst_mask */
   1764 	 FALSE),		/* pcrel_offset */
   1765 
   1766   /* Phony reloc to handle AIX style TOC entries.  */
   1767   HOWTO (R_PPC_TOC16,		/* type */
   1768 	 0,			/* rightshift */
   1769 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1770 	 16,			/* bitsize */
   1771 	 FALSE,			/* pc_relative */
   1772 	 0,			/* bitpos */
   1773 	 complain_overflow_signed, /* complain_on_overflow */
   1774 	 bfd_elf_generic_reloc,	/* special_function */
   1775 	 "R_PPC_TOC16",		/* name */
   1776 	 FALSE,			/* partial_inplace */
   1777 	 0,			/* src_mask */
   1778 	 0xffff,		/* dst_mask */
   1779 	 FALSE),		/* pcrel_offset */
   1780 };
   1781 
   1782 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
   1784 
   1785 static void
   1786 ppc_elf_howto_init (void)
   1787 {
   1788   unsigned int i, type;
   1789 
   1790   for (i = 0;
   1791        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
   1792        i++)
   1793     {
   1794       type = ppc_elf_howto_raw[i].type;
   1795       if (type >= (sizeof (ppc_elf_howto_table)
   1796 		   / sizeof (ppc_elf_howto_table[0])))
   1797 	abort ();
   1798       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
   1799     }
   1800 }
   1801 
   1802 static reloc_howto_type *
   1803 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1804 			   bfd_reloc_code_real_type code)
   1805 {
   1806   enum elf_ppc_reloc_type r;
   1807 
   1808   /* Initialize howto table if not already done.  */
   1809   if (!ppc_elf_howto_table[R_PPC_ADDR32])
   1810     ppc_elf_howto_init ();
   1811 
   1812   switch (code)
   1813     {
   1814     default:
   1815       return NULL;
   1816 
   1817     case BFD_RELOC_NONE:		r = R_PPC_NONE;			break;
   1818     case BFD_RELOC_32:			r = R_PPC_ADDR32;		break;
   1819     case BFD_RELOC_PPC_BA26:		r = R_PPC_ADDR24;		break;
   1820     case BFD_RELOC_PPC64_ADDR16_DS:
   1821     case BFD_RELOC_16:			r = R_PPC_ADDR16;		break;
   1822     case BFD_RELOC_PPC64_ADDR16_LO_DS:
   1823     case BFD_RELOC_LO16:		r = R_PPC_ADDR16_LO;		break;
   1824     case BFD_RELOC_HI16:		r = R_PPC_ADDR16_HI;		break;
   1825     case BFD_RELOC_HI16_S:		r = R_PPC_ADDR16_HA;		break;
   1826     case BFD_RELOC_PPC_BA16:		r = R_PPC_ADDR14;		break;
   1827     case BFD_RELOC_PPC_BA16_BRTAKEN:	r = R_PPC_ADDR14_BRTAKEN;	break;
   1828     case BFD_RELOC_PPC_BA16_BRNTAKEN:	r = R_PPC_ADDR14_BRNTAKEN;	break;
   1829     case BFD_RELOC_PPC_B26:		r = R_PPC_REL24;		break;
   1830     case BFD_RELOC_PPC_B16:		r = R_PPC_REL14;		break;
   1831     case BFD_RELOC_PPC_B16_BRTAKEN:	r = R_PPC_REL14_BRTAKEN;	break;
   1832     case BFD_RELOC_PPC_B16_BRNTAKEN:	r = R_PPC_REL14_BRNTAKEN;	break;
   1833     case BFD_RELOC_PPC64_GOT16_DS:
   1834     case BFD_RELOC_16_GOTOFF:		r = R_PPC_GOT16;		break;
   1835     case BFD_RELOC_PPC64_GOT16_LO_DS:
   1836     case BFD_RELOC_LO16_GOTOFF:		r = R_PPC_GOT16_LO;		break;
   1837     case BFD_RELOC_HI16_GOTOFF:		r = R_PPC_GOT16_HI;		break;
   1838     case BFD_RELOC_HI16_S_GOTOFF:	r = R_PPC_GOT16_HA;		break;
   1839     case BFD_RELOC_24_PLT_PCREL:	r = R_PPC_PLTREL24;		break;
   1840     case BFD_RELOC_PPC_COPY:		r = R_PPC_COPY;			break;
   1841     case BFD_RELOC_PPC_GLOB_DAT:	r = R_PPC_GLOB_DAT;		break;
   1842     case BFD_RELOC_PPC_LOCAL24PC:	r = R_PPC_LOCAL24PC;		break;
   1843     case BFD_RELOC_32_PCREL:		r = R_PPC_REL32;		break;
   1844     case BFD_RELOC_32_PLTOFF:		r = R_PPC_PLT32;		break;
   1845     case BFD_RELOC_32_PLT_PCREL:	r = R_PPC_PLTREL32;		break;
   1846     case BFD_RELOC_PPC64_PLT16_LO_DS:
   1847     case BFD_RELOC_LO16_PLTOFF:		r = R_PPC_PLT16_LO;		break;
   1848     case BFD_RELOC_HI16_PLTOFF:		r = R_PPC_PLT16_HI;		break;
   1849     case BFD_RELOC_HI16_S_PLTOFF:	r = R_PPC_PLT16_HA;		break;
   1850     case BFD_RELOC_GPREL16:		r = R_PPC_SDAREL16;		break;
   1851     case BFD_RELOC_PPC64_SECTOFF_DS:
   1852     case BFD_RELOC_16_BASEREL:		r = R_PPC_SECTOFF;		break;
   1853     case BFD_RELOC_PPC64_SECTOFF_LO_DS:
   1854     case BFD_RELOC_LO16_BASEREL:	r = R_PPC_SECTOFF_LO;		break;
   1855     case BFD_RELOC_HI16_BASEREL:	r = R_PPC_SECTOFF_HI;		break;
   1856     case BFD_RELOC_HI16_S_BASEREL:	r = R_PPC_SECTOFF_HA;		break;
   1857     case BFD_RELOC_CTOR:		r = R_PPC_ADDR32;		break;
   1858     case BFD_RELOC_PPC64_TOC16_DS:
   1859     case BFD_RELOC_PPC_TOC16:		r = R_PPC_TOC16;		break;
   1860     case BFD_RELOC_PPC_TLS:		r = R_PPC_TLS;			break;
   1861     case BFD_RELOC_PPC_TLSGD:		r = R_PPC_TLSGD;		break;
   1862     case BFD_RELOC_PPC_TLSLD:		r = R_PPC_TLSLD;		break;
   1863     case BFD_RELOC_PPC_DTPMOD:		r = R_PPC_DTPMOD32;		break;
   1864     case BFD_RELOC_PPC64_TPREL16_DS:
   1865     case BFD_RELOC_PPC_TPREL16:		r = R_PPC_TPREL16;		break;
   1866     case BFD_RELOC_PPC64_TPREL16_LO_DS:
   1867     case BFD_RELOC_PPC_TPREL16_LO:	r = R_PPC_TPREL16_LO;		break;
   1868     case BFD_RELOC_PPC_TPREL16_HI:	r = R_PPC_TPREL16_HI;		break;
   1869     case BFD_RELOC_PPC_TPREL16_HA:	r = R_PPC_TPREL16_HA;		break;
   1870     case BFD_RELOC_PPC_TPREL:		r = R_PPC_TPREL32;		break;
   1871     case BFD_RELOC_PPC64_DTPREL16_DS:
   1872     case BFD_RELOC_PPC_DTPREL16:	r = R_PPC_DTPREL16;		break;
   1873     case BFD_RELOC_PPC64_DTPREL16_LO_DS:
   1874     case BFD_RELOC_PPC_DTPREL16_LO:	r = R_PPC_DTPREL16_LO;		break;
   1875     case BFD_RELOC_PPC_DTPREL16_HI:	r = R_PPC_DTPREL16_HI;		break;
   1876     case BFD_RELOC_PPC_DTPREL16_HA:	r = R_PPC_DTPREL16_HA;		break;
   1877     case BFD_RELOC_PPC_DTPREL:		r = R_PPC_DTPREL32;		break;
   1878     case BFD_RELOC_PPC_GOT_TLSGD16:	r = R_PPC_GOT_TLSGD16;		break;
   1879     case BFD_RELOC_PPC_GOT_TLSGD16_LO:	r = R_PPC_GOT_TLSGD16_LO;	break;
   1880     case BFD_RELOC_PPC_GOT_TLSGD16_HI:	r = R_PPC_GOT_TLSGD16_HI;	break;
   1881     case BFD_RELOC_PPC_GOT_TLSGD16_HA:	r = R_PPC_GOT_TLSGD16_HA;	break;
   1882     case BFD_RELOC_PPC_GOT_TLSLD16:	r = R_PPC_GOT_TLSLD16;		break;
   1883     case BFD_RELOC_PPC_GOT_TLSLD16_LO:	r = R_PPC_GOT_TLSLD16_LO;	break;
   1884     case BFD_RELOC_PPC_GOT_TLSLD16_HI:	r = R_PPC_GOT_TLSLD16_HI;	break;
   1885     case BFD_RELOC_PPC_GOT_TLSLD16_HA:	r = R_PPC_GOT_TLSLD16_HA;	break;
   1886     case BFD_RELOC_PPC_GOT_TPREL16:	r = R_PPC_GOT_TPREL16;		break;
   1887     case BFD_RELOC_PPC_GOT_TPREL16_LO:	r = R_PPC_GOT_TPREL16_LO;	break;
   1888     case BFD_RELOC_PPC_GOT_TPREL16_HI:	r = R_PPC_GOT_TPREL16_HI;	break;
   1889     case BFD_RELOC_PPC_GOT_TPREL16_HA:	r = R_PPC_GOT_TPREL16_HA;	break;
   1890     case BFD_RELOC_PPC_GOT_DTPREL16:	r = R_PPC_GOT_DTPREL16;		break;
   1891     case BFD_RELOC_PPC_GOT_DTPREL16_LO:	r = R_PPC_GOT_DTPREL16_LO;	break;
   1892     case BFD_RELOC_PPC_GOT_DTPREL16_HI:	r = R_PPC_GOT_DTPREL16_HI;	break;
   1893     case BFD_RELOC_PPC_GOT_DTPREL16_HA:	r = R_PPC_GOT_DTPREL16_HA;	break;
   1894     case BFD_RELOC_PPC_EMB_NADDR32:	r = R_PPC_EMB_NADDR32;		break;
   1895     case BFD_RELOC_PPC_EMB_NADDR16:	r = R_PPC_EMB_NADDR16;		break;
   1896     case BFD_RELOC_PPC_EMB_NADDR16_LO:	r = R_PPC_EMB_NADDR16_LO;	break;
   1897     case BFD_RELOC_PPC_EMB_NADDR16_HI:	r = R_PPC_EMB_NADDR16_HI;	break;
   1898     case BFD_RELOC_PPC_EMB_NADDR16_HA:	r = R_PPC_EMB_NADDR16_HA;	break;
   1899     case BFD_RELOC_PPC_EMB_SDAI16:	r = R_PPC_EMB_SDAI16;		break;
   1900     case BFD_RELOC_PPC_EMB_SDA2I16:	r = R_PPC_EMB_SDA2I16;		break;
   1901     case BFD_RELOC_PPC_EMB_SDA2REL:	r = R_PPC_EMB_SDA2REL;		break;
   1902     case BFD_RELOC_PPC_EMB_SDA21:	r = R_PPC_EMB_SDA21;		break;
   1903     case BFD_RELOC_PPC_EMB_MRKREF:	r = R_PPC_EMB_MRKREF;		break;
   1904     case BFD_RELOC_PPC_EMB_RELSEC16:	r = R_PPC_EMB_RELSEC16;		break;
   1905     case BFD_RELOC_PPC_EMB_RELST_LO:	r = R_PPC_EMB_RELST_LO;		break;
   1906     case BFD_RELOC_PPC_EMB_RELST_HI:	r = R_PPC_EMB_RELST_HI;		break;
   1907     case BFD_RELOC_PPC_EMB_RELST_HA:	r = R_PPC_EMB_RELST_HA;		break;
   1908     case BFD_RELOC_PPC_EMB_BIT_FLD:	r = R_PPC_EMB_BIT_FLD;		break;
   1909     case BFD_RELOC_PPC_EMB_RELSDA:	r = R_PPC_EMB_RELSDA;		break;
   1910     case BFD_RELOC_PPC_VLE_REL8:	r = R_PPC_VLE_REL8;		break;
   1911     case BFD_RELOC_PPC_VLE_REL15:	r = R_PPC_VLE_REL15;		break;
   1912     case BFD_RELOC_PPC_VLE_REL24:	r = R_PPC_VLE_REL24;		break;
   1913     case BFD_RELOC_PPC_VLE_LO16A:	r = R_PPC_VLE_LO16A;		break;
   1914     case BFD_RELOC_PPC_VLE_LO16D:	r = R_PPC_VLE_LO16D;		break;
   1915     case BFD_RELOC_PPC_VLE_HI16A:	r = R_PPC_VLE_HI16A;		break;
   1916     case BFD_RELOC_PPC_VLE_HI16D:	r = R_PPC_VLE_HI16D;		break;
   1917     case BFD_RELOC_PPC_VLE_HA16A:	r = R_PPC_VLE_HA16A;		break;
   1918     case BFD_RELOC_PPC_VLE_HA16D:	r = R_PPC_VLE_HA16D;		break;
   1919     case BFD_RELOC_PPC_VLE_SDA21:	r = R_PPC_VLE_SDA21;		break;
   1920     case BFD_RELOC_PPC_VLE_SDA21_LO:	r = R_PPC_VLE_SDA21_LO;		break;
   1921     case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
   1922       r = R_PPC_VLE_SDAREL_LO16A;
   1923       break;
   1924     case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
   1925       r = R_PPC_VLE_SDAREL_LO16D;
   1926       break;
   1927     case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
   1928       r = R_PPC_VLE_SDAREL_HI16A;
   1929       break;
   1930     case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
   1931       r = R_PPC_VLE_SDAREL_HI16D;
   1932       break;
   1933     case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
   1934       r = R_PPC_VLE_SDAREL_HA16A;
   1935       break;
   1936     case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
   1937       r = R_PPC_VLE_SDAREL_HA16D;
   1938       break;
   1939     case BFD_RELOC_16_PCREL:		r = R_PPC_REL16;		break;
   1940     case BFD_RELOC_LO16_PCREL:		r = R_PPC_REL16_LO;		break;
   1941     case BFD_RELOC_HI16_PCREL:		r = R_PPC_REL16_HI;		break;
   1942     case BFD_RELOC_HI16_S_PCREL:	r = R_PPC_REL16_HA;		break;
   1943     case BFD_RELOC_VTABLE_INHERIT:	r = R_PPC_GNU_VTINHERIT;	break;
   1944     case BFD_RELOC_VTABLE_ENTRY:	r = R_PPC_GNU_VTENTRY;		break;
   1945     }
   1946 
   1947   return ppc_elf_howto_table[r];
   1948 };
   1949 
   1950 static reloc_howto_type *
   1951 ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1952 			   const char *r_name)
   1953 {
   1954   unsigned int i;
   1955 
   1956   for (i = 0;
   1957        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
   1958        i++)
   1959     if (ppc_elf_howto_raw[i].name != NULL
   1960 	&& strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
   1961       return &ppc_elf_howto_raw[i];
   1962 
   1963   return NULL;
   1964 }
   1965 
   1966 /* Set the howto pointer for a PowerPC ELF reloc.  */
   1967 
   1968 static void
   1969 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
   1970 		       arelent *cache_ptr,
   1971 		       Elf_Internal_Rela *dst)
   1972 {
   1973   /* Initialize howto table if not already done.  */
   1974   if (!ppc_elf_howto_table[R_PPC_ADDR32])
   1975     ppc_elf_howto_init ();
   1976 
   1977   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
   1978   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
   1979 
   1980   /* Just because the above assert didn't trigger doesn't mean that
   1981      ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation.  */
   1982   if (!cache_ptr->howto)
   1983     {
   1984       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
   1985                              abfd, ELF32_R_TYPE (dst->r_info));
   1986       bfd_set_error (bfd_error_bad_value);
   1987 
   1988       cache_ptr->howto = ppc_elf_howto_table[R_PPC_NONE];
   1989     }
   1990 }
   1991 
   1992 /* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
   1993 
   1994 static bfd_reloc_status_type
   1995 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
   1996 			 arelent *reloc_entry,
   1997 			 asymbol *symbol,
   1998 			 void *data ATTRIBUTE_UNUSED,
   1999 			 asection *input_section,
   2000 			 bfd *output_bfd,
   2001 			 char **error_message ATTRIBUTE_UNUSED)
   2002 {
   2003   bfd_vma relocation;
   2004 
   2005   if (output_bfd != NULL)
   2006     {
   2007       reloc_entry->address += input_section->output_offset;
   2008       return bfd_reloc_ok;
   2009     }
   2010 
   2011   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   2012     return bfd_reloc_outofrange;
   2013 
   2014   if (bfd_is_com_section (symbol->section))
   2015     relocation = 0;
   2016   else
   2017     relocation = symbol->value;
   2018 
   2019   relocation += symbol->section->output_section->vma;
   2020   relocation += symbol->section->output_offset;
   2021   relocation += reloc_entry->addend;
   2022   if (reloc_entry->howto->pc_relative)
   2023     relocation -= reloc_entry->address;
   2024 
   2025   reloc_entry->addend += (relocation & 0x8000) << 1;
   2026 
   2027   return bfd_reloc_continue;
   2028 }
   2029 
   2030 static bfd_reloc_status_type
   2031 ppc_elf_unhandled_reloc (bfd *abfd,
   2032 			 arelent *reloc_entry,
   2033 			 asymbol *symbol,
   2034 			 void *data,
   2035 			 asection *input_section,
   2036 			 bfd *output_bfd,
   2037 			 char **error_message)
   2038 {
   2039   /* If this is a relocatable link (output_bfd test tells us), just
   2040      call the generic function.  Any adjustment will be done at final
   2041      link time.  */
   2042   if (output_bfd != NULL)
   2043     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   2044 				  input_section, output_bfd, error_message);
   2045 
   2046   if (error_message != NULL)
   2047     {
   2048       static char buf[60];
   2049       sprintf (buf, _("generic linker can't handle %s"),
   2050 	       reloc_entry->howto->name);
   2051       *error_message = buf;
   2052     }
   2053   return bfd_reloc_dangerous;
   2054 }
   2055 
   2056 /* Sections created by the linker.  */
   2058 
   2059 typedef struct elf_linker_section
   2060 {
   2061   /* Pointer to the bfd section.  */
   2062   asection *section;
   2063   /* Section name.  */
   2064   const char *name;
   2065   /* Associated bss section name.  */
   2066   const char *bss_name;
   2067   /* Associated symbol name.  */
   2068   const char *sym_name;
   2069   /* Associated symbol.  */
   2070   struct elf_link_hash_entry *sym;
   2071 } elf_linker_section_t;
   2072 
   2073 /* Linked list of allocated pointer entries.  This hangs off of the
   2074    symbol lists, and provides allows us to return different pointers,
   2075    based on different addend's.  */
   2076 
   2077 typedef struct elf_linker_section_pointers
   2078 {
   2079   /* next allocated pointer for this symbol */
   2080   struct elf_linker_section_pointers *next;
   2081   /* offset of pointer from beginning of section */
   2082   bfd_vma offset;
   2083   /* addend used */
   2084   bfd_vma addend;
   2085   /* which linker section this is */
   2086   elf_linker_section_t *lsect;
   2087 } elf_linker_section_pointers_t;
   2088 
   2089 struct ppc_elf_obj_tdata
   2090 {
   2091   struct elf_obj_tdata elf;
   2092 
   2093   /* A mapping from local symbols to offsets into the various linker
   2094      sections added.  This is index by the symbol index.  */
   2095   elf_linker_section_pointers_t **linker_section_pointers;
   2096 
   2097   /* Flags used to auto-detect plt type.  */
   2098   unsigned int makes_plt_call : 1;
   2099   unsigned int has_rel16 : 1;
   2100 };
   2101 
   2102 #define ppc_elf_tdata(bfd) \
   2103   ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
   2104 
   2105 #define elf_local_ptr_offsets(bfd) \
   2106   (ppc_elf_tdata (bfd)->linker_section_pointers)
   2107 
   2108 #define is_ppc_elf(bfd) \
   2109   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
   2110    && elf_object_id (bfd) == PPC32_ELF_DATA)
   2111 
   2112 /* Override the generic function because we store some extras.  */
   2113 
   2114 static bfd_boolean
   2115 ppc_elf_mkobject (bfd *abfd)
   2116 {
   2117   return bfd_elf_allocate_object (abfd, sizeof (struct ppc_elf_obj_tdata),
   2118 				  PPC32_ELF_DATA);
   2119 }
   2120 
   2121 /* Fix bad default arch selected for a 32 bit input bfd when the
   2122    default is 64 bit.  */
   2123 
   2124 static bfd_boolean
   2125 ppc_elf_object_p (bfd *abfd)
   2126 {
   2127   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
   2128     {
   2129       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
   2130 
   2131       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
   2132 	{
   2133 	  /* Relies on arch after 64 bit default being 32 bit default.  */
   2134 	  abfd->arch_info = abfd->arch_info->next;
   2135 	  BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
   2136 	}
   2137     }
   2138   return TRUE;
   2139 }
   2140 
   2141 /* Function to set whether a module needs the -mrelocatable bit set.  */
   2142 
   2143 static bfd_boolean
   2144 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
   2145 {
   2146   BFD_ASSERT (!elf_flags_init (abfd)
   2147 	      || elf_elfheader (abfd)->e_flags == flags);
   2148 
   2149   elf_elfheader (abfd)->e_flags = flags;
   2150   elf_flags_init (abfd) = TRUE;
   2151   return TRUE;
   2152 }
   2153 
   2154 /* Support for core dump NOTE sections.  */
   2155 
   2156 static bfd_boolean
   2157 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   2158 {
   2159   int offset;
   2160   unsigned int size;
   2161 
   2162   switch (note->descsz)
   2163     {
   2164     default:
   2165       return FALSE;
   2166 
   2167     case 268:		/* Linux/PPC.  */
   2168       /* pr_cursig */
   2169       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
   2170 
   2171       /* pr_pid */
   2172       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
   2173 
   2174       /* pr_reg */
   2175       offset = 72;
   2176       size = 192;
   2177 
   2178       break;
   2179     }
   2180 
   2181   /* Make a ".reg/999" section.  */
   2182   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   2183 					  size, note->descpos + offset);
   2184 }
   2185 
   2186 static bfd_boolean
   2187 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   2188 {
   2189   switch (note->descsz)
   2190     {
   2191     default:
   2192       return FALSE;
   2193 
   2194     case 128:		/* Linux/PPC elf_prpsinfo.  */
   2195       elf_tdata (abfd)->core_pid
   2196 	= bfd_get_32 (abfd, note->descdata + 16);
   2197       elf_tdata (abfd)->core_program
   2198 	= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   2199       elf_tdata (abfd)->core_command
   2200 	= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   2201     }
   2202 
   2203   /* Note that for some reason, a spurious space is tacked
   2204      onto the end of the args in some (at least one anyway)
   2205      implementations, so strip it off if it exists.  */
   2206 
   2207   {
   2208     char *command = elf_tdata (abfd)->core_command;
   2209     int n = strlen (command);
   2210 
   2211     if (0 < n && command[n - 1] == ' ')
   2212       command[n - 1] = '\0';
   2213   }
   2214 
   2215   return TRUE;
   2216 }
   2217 
   2218 static char *
   2219 ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
   2220 {
   2221   switch (note_type)
   2222     {
   2223     default:
   2224       return NULL;
   2225 
   2226     case NT_PRPSINFO:
   2227       {
   2228 	char data[128];
   2229 	va_list ap;
   2230 
   2231 	va_start (ap, note_type);
   2232 	memset (data, 0, sizeof (data));
   2233 	strncpy (data + 32, va_arg (ap, const char *), 16);
   2234 	strncpy (data + 48, va_arg (ap, const char *), 80);
   2235 	va_end (ap);
   2236 	return elfcore_write_note (abfd, buf, bufsiz,
   2237 				   "CORE", note_type, data, sizeof (data));
   2238       }
   2239 
   2240     case NT_PRSTATUS:
   2241       {
   2242 	char data[268];
   2243 	va_list ap;
   2244 	long pid;
   2245 	int cursig;
   2246 	const void *greg;
   2247 
   2248 	va_start (ap, note_type);
   2249 	memset (data, 0, 72);
   2250 	pid = va_arg (ap, long);
   2251 	bfd_put_32 (abfd, pid, data + 24);
   2252 	cursig = va_arg (ap, int);
   2253 	bfd_put_16 (abfd, cursig, data + 12);
   2254 	greg = va_arg (ap, const void *);
   2255 	memcpy (data + 72, greg, 192);
   2256 	memset (data + 264, 0, 4);
   2257 	va_end (ap);
   2258 	return elfcore_write_note (abfd, buf, bufsiz,
   2259 				   "CORE", note_type, data, sizeof (data));
   2260       }
   2261     }
   2262 }
   2263 
   2264 static flagword
   2265 ppc_elf_lookup_section_flags (char *flag_name)
   2266 {
   2267 
   2268   if (!strcmp (flag_name, "SHF_PPC_VLE"))
   2269     return SHF_PPC_VLE;
   2270 
   2271   return 0;
   2272 }
   2273 
   2274 /* Add the VLE flag if required.  */
   2275 
   2276 bfd_boolean
   2277 ppc_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *shdr)
   2278 {
   2279   if (bfd_get_mach (abfd) == bfd_mach_ppc_vle
   2280       && (shdr->sh_flags & SHF_EXECINSTR) != 0)
   2281     shdr->sh_flags |= SHF_PPC_VLE;
   2282 
   2283   return TRUE;
   2284 }
   2285 
   2286 /* Return address for Ith PLT stub in section PLT, for relocation REL
   2287    or (bfd_vma) -1 if it should not be included.  */
   2288 
   2289 static bfd_vma
   2290 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
   2291 		     const asection *plt ATTRIBUTE_UNUSED,
   2292 		     const arelent *rel)
   2293 {
   2294   return rel->address;
   2295 }
   2296 
   2297 /* Handle a PowerPC specific section when reading an object file.  This
   2298    is called when bfd_section_from_shdr finds a section with an unknown
   2299    type.  */
   2300 
   2301 static bfd_boolean
   2302 ppc_elf_section_from_shdr (bfd *abfd,
   2303 			   Elf_Internal_Shdr *hdr,
   2304 			   const char *name,
   2305 			   int shindex)
   2306 {
   2307   asection *newsect;
   2308   flagword flags;
   2309 
   2310   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   2311     return FALSE;
   2312 
   2313   newsect = hdr->bfd_section;
   2314   flags = bfd_get_section_flags (abfd, newsect);
   2315   if (hdr->sh_flags & SHF_EXCLUDE)
   2316     flags |= SEC_EXCLUDE;
   2317 
   2318   if (hdr->sh_type == SHT_ORDERED)
   2319     flags |= SEC_SORT_ENTRIES;
   2320 
   2321   bfd_set_section_flags (abfd, newsect, flags);
   2322   return TRUE;
   2323 }
   2324 
   2325 /* Set up any other section flags and such that may be necessary.  */
   2326 
   2327 static bfd_boolean
   2328 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
   2329 		       Elf_Internal_Shdr *shdr,
   2330 		       asection *asect)
   2331 {
   2332   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
   2333     shdr->sh_type = SHT_ORDERED;
   2334 
   2335   return TRUE;
   2336 }
   2337 
   2338 /* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
   2339    need to bump up the number of section headers.  */
   2340 
   2341 static int
   2342 ppc_elf_additional_program_headers (bfd *abfd,
   2343 				    struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2344 {
   2345   asection *s;
   2346   int ret = 0;
   2347 
   2348   s = bfd_get_section_by_name (abfd, ".sbss2");
   2349   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
   2350     ++ret;
   2351 
   2352   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
   2353   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
   2354     ++ret;
   2355 
   2356   return ret;
   2357 }
   2358 
   2359 /* Modify the segment map for VLE executables.  */
   2360 
   2361 bfd_boolean
   2362 ppc_elf_modify_segment_map (bfd *abfd,
   2363 			    struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2364 {
   2365   struct elf_segment_map *m, *n;
   2366   bfd_size_type amt;
   2367   unsigned int j, k;
   2368   bfd_boolean sect0_vle, sectj_vle;
   2369 
   2370   /* At this point in the link, output sections have already been sorted by
   2371      LMA and assigned to segments.  All that is left to do is to ensure
   2372      there is no mixing of VLE & non-VLE sections in a text segment.
   2373      If we find that case, we split the segment.
   2374      We maintain the original output section order.  */
   2375 
   2376   for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
   2377     {
   2378       if (m->count == 0)
   2379 	continue;
   2380 
   2381       sect0_vle = (elf_section_flags (m->sections[0]) & SHF_PPC_VLE) != 0;
   2382       for (j = 1; j < m->count; ++j)
   2383 	{
   2384 	  sectj_vle = (elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0;
   2385 
   2386 	  if (sectj_vle != sect0_vle)
   2387 	    break;
   2388         }
   2389       if (j >= m->count)
   2390 	continue;
   2391 
   2392       /* sections 0..j-1 stay in this (current) segment,
   2393 	 the remainder are put in a new segment.
   2394 	 The scan resumes with the new segment.  */
   2395 
   2396       /* Fix the new segment.  */
   2397       amt = sizeof (struct elf_segment_map);
   2398       amt += (m->count - j - 1) * sizeof (asection *);
   2399       n = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   2400       if (n == NULL)
   2401         return FALSE;
   2402 
   2403       n->p_type = PT_LOAD;
   2404       n->p_flags = PF_X | PF_R;
   2405       if (sectj_vle)
   2406         n->p_flags |= PF_PPC_VLE;
   2407       n->count = m->count - j;
   2408       for (k = 0; k < n->count; ++k)
   2409         {
   2410           n->sections[k] = m->sections[j+k];
   2411           m->sections[j+k] = NULL;
   2412 	}
   2413       n->next = m->next;
   2414       m->next = n;
   2415 
   2416       /* Fix the current segment  */
   2417       m->count = j;
   2418     }
   2419 
   2420   return TRUE;
   2421 }
   2422 
   2423 /* Add extra PPC sections -- Note, for now, make .sbss2 and
   2424    .PPC.EMB.sbss0 a normal section, and not a bss section so
   2425    that the linker doesn't crater when trying to make more than
   2426    2 sections.  */
   2427 
   2428 static const struct bfd_elf_special_section ppc_elf_special_sections[] =
   2429 {
   2430   { STRING_COMMA_LEN (".plt"),             0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
   2431   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
   2432   { STRING_COMMA_LEN (".sbss2"),          -2, SHT_PROGBITS, SHF_ALLOC },
   2433   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
   2434   { STRING_COMMA_LEN (".sdata2"),         -2, SHT_PROGBITS, SHF_ALLOC },
   2435   { STRING_COMMA_LEN (".tags"),            0, SHT_ORDERED,  SHF_ALLOC },
   2436   { STRING_COMMA_LEN (".PPC.EMB.apuinfo"), 0, SHT_NOTE,     0 },
   2437   { STRING_COMMA_LEN (".PPC.EMB.sbss0"),   0, SHT_PROGBITS, SHF_ALLOC },
   2438   { STRING_COMMA_LEN (".PPC.EMB.sdata0"),  0, SHT_PROGBITS, SHF_ALLOC },
   2439   { NULL,                              0,  0, 0,            0 }
   2440 };
   2441 
   2442 /* This is what we want for new plt/got.  */
   2443 static struct bfd_elf_special_section ppc_alt_plt =
   2444   { STRING_COMMA_LEN (".plt"),             0, SHT_PROGBITS, SHF_ALLOC };
   2445 
   2446 static const struct bfd_elf_special_section *
   2447 ppc_elf_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
   2448 {
   2449   const struct bfd_elf_special_section *ssect;
   2450 
   2451   /* See if this is one of the special sections.  */
   2452   if (sec->name == NULL)
   2453     return NULL;
   2454 
   2455   ssect = _bfd_elf_get_special_section (sec->name, ppc_elf_special_sections,
   2456 					sec->use_rela_p);
   2457   if (ssect != NULL)
   2458     {
   2459       if (ssect == ppc_elf_special_sections && (sec->flags & SEC_LOAD) != 0)
   2460 	ssect = &ppc_alt_plt;
   2461       return ssect;
   2462     }
   2463 
   2464   return _bfd_elf_get_sec_type_attr (abfd, sec);
   2465 }
   2466 
   2467 /* Very simple linked list structure for recording apuinfo values.  */
   2469 typedef struct apuinfo_list
   2470 {
   2471   struct apuinfo_list *next;
   2472   unsigned long value;
   2473 }
   2474 apuinfo_list;
   2475 
   2476 static apuinfo_list *head;
   2477 static bfd_boolean apuinfo_set;
   2478 
   2479 static void
   2480 apuinfo_list_init (void)
   2481 {
   2482   head = NULL;
   2483   apuinfo_set = FALSE;
   2484 }
   2485 
   2486 static void
   2487 apuinfo_list_add (unsigned long value)
   2488 {
   2489   apuinfo_list *entry = head;
   2490 
   2491   while (entry != NULL)
   2492     {
   2493       if (entry->value == value)
   2494 	return;
   2495       entry = entry->next;
   2496     }
   2497 
   2498   entry = bfd_malloc (sizeof (* entry));
   2499   if (entry == NULL)
   2500     return;
   2501 
   2502   entry->value = value;
   2503   entry->next  = head;
   2504   head = entry;
   2505 }
   2506 
   2507 static unsigned
   2508 apuinfo_list_length (void)
   2509 {
   2510   apuinfo_list *entry;
   2511   unsigned long count;
   2512 
   2513   for (entry = head, count = 0;
   2514        entry;
   2515        entry = entry->next)
   2516     ++ count;
   2517 
   2518   return count;
   2519 }
   2520 
   2521 static inline unsigned long
   2522 apuinfo_list_element (unsigned long number)
   2523 {
   2524   apuinfo_list * entry;
   2525 
   2526   for (entry = head;
   2527        entry && number --;
   2528        entry = entry->next)
   2529     ;
   2530 
   2531   return entry ? entry->value : 0;
   2532 }
   2533 
   2534 static void
   2535 apuinfo_list_finish (void)
   2536 {
   2537   apuinfo_list *entry;
   2538 
   2539   for (entry = head; entry;)
   2540     {
   2541       apuinfo_list *next = entry->next;
   2542       free (entry);
   2543       entry = next;
   2544     }
   2545 
   2546   head = NULL;
   2547 }
   2548 
   2549 #define APUINFO_SECTION_NAME	".PPC.EMB.apuinfo"
   2550 #define APUINFO_LABEL		"APUinfo"
   2551 
   2552 /* Scan the input BFDs and create a linked list of
   2553    the APUinfo values that will need to be emitted.  */
   2554 
   2555 static void
   2556 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
   2557 {
   2558   bfd *ibfd;
   2559   asection *asec;
   2560   char *buffer = NULL;
   2561   bfd_size_type largest_input_size = 0;
   2562   unsigned i;
   2563   unsigned long length;
   2564   const char *error_message = NULL;
   2565 
   2566   if (link_info == NULL)
   2567     return;
   2568 
   2569   apuinfo_list_init ();
   2570 
   2571   /* Read in the input sections contents.  */
   2572   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
   2573     {
   2574       unsigned long datum;
   2575 
   2576       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
   2577       if (asec == NULL)
   2578 	continue;
   2579 
   2580       error_message = _("corrupt %s section in %B");
   2581       length = asec->size;
   2582       if (length < 20)
   2583 	goto fail;
   2584 
   2585       apuinfo_set = TRUE;
   2586       if (largest_input_size < asec->size)
   2587 	{
   2588 	  if (buffer)
   2589 	    free (buffer);
   2590 	  largest_input_size = asec->size;
   2591 	  buffer = bfd_malloc (largest_input_size);
   2592 	  if (!buffer)
   2593 	    return;
   2594 	}
   2595 
   2596       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
   2597 	  || (bfd_bread (buffer, length, ibfd) != length))
   2598 	{
   2599 	  error_message = _("unable to read in %s section from %B");
   2600 	  goto fail;
   2601 	}
   2602 
   2603       /* Verify the contents of the header.  Note - we have to
   2604 	 extract the values this way in order to allow for a
   2605 	 host whose endian-ness is different from the target.  */
   2606       datum = bfd_get_32 (ibfd, buffer);
   2607       if (datum != sizeof APUINFO_LABEL)
   2608 	goto fail;
   2609 
   2610       datum = bfd_get_32 (ibfd, buffer + 8);
   2611       if (datum != 0x2)
   2612 	goto fail;
   2613 
   2614       if (strcmp (buffer + 12, APUINFO_LABEL) != 0)
   2615 	goto fail;
   2616 
   2617       /* Get the number of bytes used for apuinfo entries.  */
   2618       datum = bfd_get_32 (ibfd, buffer + 4);
   2619       if (datum + 20 != length)
   2620 	goto fail;
   2621 
   2622       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
   2623       for (i = 0; i < datum; i += 4)
   2624 	apuinfo_list_add (bfd_get_32 (ibfd, buffer + 20 + i));
   2625     }
   2626 
   2627   error_message = NULL;
   2628 
   2629   if (apuinfo_set)
   2630     {
   2631       /* Compute the size of the output section.  */
   2632       unsigned num_entries = apuinfo_list_length ();
   2633 
   2634       /* Set the output section size, if it exists.  */
   2635       asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
   2636 
   2637       if (asec && ! bfd_set_section_size (abfd, asec, 20 + num_entries * 4))
   2638 	{
   2639 	  ibfd = abfd;
   2640 	  error_message = _("warning: unable to set size of %s section in %B");
   2641 	}
   2642     }
   2643 
   2644  fail:
   2645   if (buffer)
   2646     free (buffer);
   2647 
   2648   if (error_message)
   2649     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
   2650 }
   2651 
   2652 /* Prevent the output section from accumulating the input sections'
   2653    contents.  We have already stored this in our linked list structure.  */
   2654 
   2655 static bfd_boolean
   2656 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
   2657 		       struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
   2658 		       asection *asec,
   2659 		       bfd_byte *contents ATTRIBUTE_UNUSED)
   2660 {
   2661   return apuinfo_set && strcmp (asec->name, APUINFO_SECTION_NAME) == 0;
   2662 }
   2663 
   2664 /* Finally we can generate the output section.  */
   2665 
   2666 static void
   2667 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
   2668 {
   2669   bfd_byte *buffer;
   2670   asection *asec;
   2671   unsigned i;
   2672   unsigned num_entries;
   2673   bfd_size_type length;
   2674 
   2675   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
   2676   if (asec == NULL)
   2677     return;
   2678 
   2679   if (!apuinfo_set)
   2680     return;
   2681 
   2682   length = asec->size;
   2683   if (length < 20)
   2684     return;
   2685 
   2686   buffer = bfd_malloc (length);
   2687   if (buffer == NULL)
   2688     {
   2689       (*_bfd_error_handler)
   2690 	(_("failed to allocate space for new APUinfo section."));
   2691       return;
   2692     }
   2693 
   2694   /* Create the apuinfo header.  */
   2695   num_entries = apuinfo_list_length ();
   2696   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
   2697   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
   2698   bfd_put_32 (abfd, 0x2, buffer + 8);
   2699   strcpy ((char *) buffer + 12, APUINFO_LABEL);
   2700 
   2701   length = 20;
   2702   for (i = 0; i < num_entries; i++)
   2703     {
   2704       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
   2705       length += 4;
   2706     }
   2707 
   2708   if (length != asec->size)
   2709     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
   2710 
   2711   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
   2712     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
   2713 
   2714   free (buffer);
   2715 
   2716   apuinfo_list_finish ();
   2717 }
   2718 
   2719 static bfd_boolean
   2721 is_nonpic_glink_stub (bfd *abfd, asection *glink, bfd_vma off)
   2722 {
   2723   bfd_byte buf[GLINK_ENTRY_SIZE];
   2724 
   2725   if (!bfd_get_section_contents (abfd, glink, buf, off, GLINK_ENTRY_SIZE))
   2726     return FALSE;
   2727 
   2728   return ((bfd_get_32 (abfd, buf + 0) & 0xffff0000) == LIS_11
   2729 	  && (bfd_get_32 (abfd, buf + 4) & 0xffff0000) == LWZ_11_11
   2730 	  && bfd_get_32 (abfd, buf + 8) == MTCTR_11
   2731 	  && bfd_get_32 (abfd, buf + 12) == BCTR);
   2732 }
   2733 
   2734 static bfd_boolean
   2735 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
   2736 {
   2737   bfd_vma vma = *(bfd_vma *) ptr;
   2738   return ((section->flags & SEC_ALLOC) != 0
   2739 	  && section->vma <= vma
   2740 	  && vma < section->vma + section->size);
   2741 }
   2742 
   2743 static long
   2744 ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
   2745 			      long dynsymcount, asymbol **dynsyms,
   2746 			      asymbol **ret)
   2747 {
   2748   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
   2749   asection *plt, *relplt, *dynamic, *glink;
   2750   bfd_vma glink_vma = 0;
   2751   bfd_vma resolv_vma = 0;
   2752   bfd_vma stub_vma;
   2753   asymbol *s;
   2754   arelent *p;
   2755   long count, i;
   2756   size_t size;
   2757   char *names;
   2758   bfd_byte buf[4];
   2759 
   2760   *ret = NULL;
   2761 
   2762   if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
   2763     return 0;
   2764 
   2765   if (dynsymcount <= 0)
   2766     return 0;
   2767 
   2768   relplt = bfd_get_section_by_name (abfd, ".rela.plt");
   2769   if (relplt == NULL)
   2770     return 0;
   2771 
   2772   plt = bfd_get_section_by_name (abfd, ".plt");
   2773   if (plt == NULL)
   2774     return 0;
   2775 
   2776   /* Call common code to handle old-style executable PLTs.  */
   2777   if (elf_section_flags (plt) & SHF_EXECINSTR)
   2778     return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
   2779 					  dynsymcount, dynsyms, ret);
   2780 
   2781   /* If this object was prelinked, the prelinker stored the address
   2782      of .glink at got[1].  If it wasn't prelinked, got[1] will be zero.  */
   2783   dynamic = bfd_get_section_by_name (abfd, ".dynamic");
   2784   if (dynamic != NULL)
   2785     {
   2786       bfd_byte *dynbuf, *extdyn, *extdynend;
   2787       size_t extdynsize;
   2788       void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
   2789 
   2790       if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
   2791 	return -1;
   2792 
   2793       extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
   2794       swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
   2795 
   2796       extdyn = dynbuf;
   2797       extdynend = extdyn + dynamic->size;
   2798       for (; extdyn < extdynend; extdyn += extdynsize)
   2799 	{
   2800 	  Elf_Internal_Dyn dyn;
   2801 	  (*swap_dyn_in) (abfd, extdyn, &dyn);
   2802 
   2803 	  if (dyn.d_tag == DT_NULL)
   2804 	    break;
   2805 
   2806 	  if (dyn.d_tag == DT_PPC_GOT)
   2807 	    {
   2808 	      unsigned int g_o_t = dyn.d_un.d_val;
   2809 	      asection *got = bfd_get_section_by_name (abfd, ".got");
   2810 	      if (got != NULL
   2811 		  && bfd_get_section_contents (abfd, got, buf,
   2812 					       g_o_t - got->vma + 4, 4))
   2813 		glink_vma = bfd_get_32 (abfd, buf);
   2814 	      break;
   2815 	    }
   2816 	}
   2817       free (dynbuf);
   2818     }
   2819 
   2820   /* Otherwise we read the first plt entry.  */
   2821   if (glink_vma == 0)
   2822     {
   2823       if (bfd_get_section_contents (abfd, plt, buf, 0, 4))
   2824 	glink_vma = bfd_get_32 (abfd, buf);
   2825     }
   2826 
   2827   if (glink_vma == 0)
   2828     return 0;
   2829 
   2830   /* The .glink section usually does not survive the final
   2831      link; search for the section (usually .text) where the
   2832      glink stubs now reside.  */
   2833   glink = bfd_sections_find_if (abfd, section_covers_vma, &glink_vma);
   2834   if (glink == NULL)
   2835     return 0;
   2836 
   2837   /* Determine glink PLT resolver by reading the relative branch
   2838      from the first glink stub.  */
   2839   if (bfd_get_section_contents (abfd, glink, buf,
   2840 				glink_vma - glink->vma, 4))
   2841     {
   2842       unsigned int insn = bfd_get_32 (abfd, buf);
   2843 
   2844       /* The first glink stub may either branch to the resolver ...  */
   2845       insn ^= B;
   2846       if ((insn & ~0x3fffffc) == 0)
   2847 	resolv_vma = glink_vma + (insn ^ 0x2000000) - 0x2000000;
   2848 
   2849       /* ... or fall through a bunch of NOPs.  */
   2850       else if ((insn ^ B ^ NOP) == 0)
   2851 	for (i = 4;
   2852 	     bfd_get_section_contents (abfd, glink, buf,
   2853 				       glink_vma - glink->vma + i, 4);
   2854 	     i += 4)
   2855 	  if (bfd_get_32 (abfd, buf) != NOP)
   2856 	    {
   2857 	      resolv_vma = glink_vma + i;
   2858 	      break;
   2859 	    }
   2860     }
   2861 
   2862   count = relplt->size / sizeof (Elf32_External_Rela);
   2863   stub_vma = glink_vma - (bfd_vma) count * 16;
   2864   /* If the stubs are those for -shared/-pie then we might have
   2865      multiple stubs for each plt entry.  If that is the case then
   2866      there is no way to associate stubs with their plt entries short
   2867      of figuring out the GOT pointer value used in the stub.  */
   2868   if (!is_nonpic_glink_stub (abfd, glink,
   2869 			     glink_vma - GLINK_ENTRY_SIZE - glink->vma))
   2870     return 0;
   2871 
   2872   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
   2873   if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
   2874     return -1;
   2875 
   2876   size = count * sizeof (asymbol);
   2877   p = relplt->relocation;
   2878   for (i = 0; i < count; i++, p++)
   2879     {
   2880       size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
   2881       if (p->addend != 0)
   2882 	size += sizeof ("+0x") - 1 + 8;
   2883     }
   2884 
   2885   size += sizeof (asymbol) + sizeof ("__glink");
   2886 
   2887   if (resolv_vma)
   2888     size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
   2889 
   2890   s = *ret = bfd_malloc (size);
   2891   if (s == NULL)
   2892     return -1;
   2893 
   2894   names = (char *) (s + count + 1 + (resolv_vma != 0));
   2895   p = relplt->relocation;
   2896   for (i = 0; i < count; i++, p++)
   2897     {
   2898       size_t len;
   2899 
   2900       *s = **p->sym_ptr_ptr;
   2901       /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
   2902 	 we are defining a symbol, ensure one of them is set.  */
   2903       if ((s->flags & BSF_LOCAL) == 0)
   2904 	s->flags |= BSF_GLOBAL;
   2905       s->flags |= BSF_SYNTHETIC;
   2906       s->section = glink;
   2907       s->value = stub_vma - glink->vma;
   2908       s->name = names;
   2909       s->udata.p = NULL;
   2910       len = strlen ((*p->sym_ptr_ptr)->name);
   2911       memcpy (names, (*p->sym_ptr_ptr)->name, len);
   2912       names += len;
   2913       if (p->addend != 0)
   2914 	{
   2915 	  memcpy (names, "+0x", sizeof ("+0x") - 1);
   2916 	  names += sizeof ("+0x") - 1;
   2917 	  bfd_sprintf_vma (abfd, names, p->addend);
   2918 	  names += strlen (names);
   2919 	}
   2920       memcpy (names, "@plt", sizeof ("@plt"));
   2921       names += sizeof ("@plt");
   2922       ++s;
   2923       stub_vma += 16;
   2924     }
   2925 
   2926   /* Add a symbol at the start of the glink branch table.  */
   2927   memset (s, 0, sizeof *s);
   2928   s->the_bfd = abfd;
   2929   s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
   2930   s->section = glink;
   2931   s->value = glink_vma - glink->vma;
   2932   s->name = names;
   2933   memcpy (names, "__glink", sizeof ("__glink"));
   2934   names += sizeof ("__glink");
   2935   s++;
   2936   count++;
   2937 
   2938   if (resolv_vma)
   2939     {
   2940       /* Add a symbol for the glink PLT resolver.  */
   2941       memset (s, 0, sizeof *s);
   2942       s->the_bfd = abfd;
   2943       s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
   2944       s->section = glink;
   2945       s->value = resolv_vma - glink->vma;
   2946       s->name = names;
   2947       memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
   2948       names += sizeof ("__glink_PLTresolve");
   2949       s++;
   2950       count++;
   2951     }
   2952 
   2953   return count;
   2954 }
   2955 
   2956 /* The following functions are specific to the ELF linker, while
   2958    functions above are used generally.  They appear in this file more
   2959    or less in the order in which they are called.  eg.
   2960    ppc_elf_check_relocs is called early in the link process,
   2961    ppc_elf_finish_dynamic_sections is one of the last functions
   2962    called.  */
   2963 
   2964 /* Track PLT entries needed for a given symbol.  We might need more
   2965    than one glink entry per symbol when generating a pic binary.  */
   2966 struct plt_entry
   2967 {
   2968   struct plt_entry *next;
   2969 
   2970   /* -fPIC uses multiple GOT sections, one per file, called ".got2".
   2971      This field stores the offset into .got2 used to initialise the
   2972      GOT pointer reg.  It will always be at least 32768.  (Current
   2973      gcc always uses an offset of 32768, but ld -r will pack .got2
   2974      sections together resulting in larger offsets).  */
   2975   bfd_vma addend;
   2976 
   2977   /* The .got2 section.  */
   2978   asection *sec;
   2979 
   2980   /* PLT refcount or offset.  */
   2981   union
   2982     {
   2983       bfd_signed_vma refcount;
   2984       bfd_vma offset;
   2985     } plt;
   2986 
   2987   /* .glink stub offset.  */
   2988   bfd_vma glink_offset;
   2989 };
   2990 
   2991 /* Of those relocs that might be copied as dynamic relocs, this function
   2992    selects those that must be copied when linking a shared library,
   2993    even when the symbol is local.  */
   2994 
   2995 static int
   2996 must_be_dyn_reloc (struct bfd_link_info *info,
   2997 		   enum elf_ppc_reloc_type r_type)
   2998 {
   2999   switch (r_type)
   3000     {
   3001     default:
   3002       return 1;
   3003 
   3004     case R_PPC_REL24:
   3005     case R_PPC_REL14:
   3006     case R_PPC_REL14_BRTAKEN:
   3007     case R_PPC_REL14_BRNTAKEN:
   3008     case R_PPC_REL32:
   3009       return 0;
   3010 
   3011     case R_PPC_TPREL32:
   3012     case R_PPC_TPREL16:
   3013     case R_PPC_TPREL16_LO:
   3014     case R_PPC_TPREL16_HI:
   3015     case R_PPC_TPREL16_HA:
   3016       return !info->executable;
   3017     }
   3018 }
   3019 
   3020 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
   3021    copying dynamic variables from a shared lib into an app's dynbss
   3022    section, and instead use a dynamic relocation to point into the
   3023    shared lib.  */
   3024 #define ELIMINATE_COPY_RELOCS 1
   3025 
   3026 /* PPC ELF linker hash entry.  */
   3027 
   3028 struct ppc_elf_link_hash_entry
   3029 {
   3030   struct elf_link_hash_entry elf;
   3031 
   3032   /* If this symbol is used in the linker created sections, the processor
   3033      specific backend uses this field to map the field into the offset
   3034      from the beginning of the section.  */
   3035   elf_linker_section_pointers_t *linker_section_pointer;
   3036 
   3037   /* Track dynamic relocs copied for this symbol.  */
   3038   struct elf_dyn_relocs *dyn_relocs;
   3039 
   3040   /* Contexts in which symbol is used in the GOT (or TOC).
   3041      TLS_GD .. TLS_TLS bits are or'd into the mask as the
   3042      corresponding relocs are encountered during check_relocs.
   3043      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
   3044      indicate the corresponding GOT entry type is not needed.  */
   3045 #define TLS_GD		 1	/* GD reloc. */
   3046 #define TLS_LD		 2	/* LD reloc. */
   3047 #define TLS_TPREL	 4	/* TPREL reloc, => IE. */
   3048 #define TLS_DTPREL	 8	/* DTPREL reloc, => LD. */
   3049 #define TLS_TLS		16	/* Any TLS reloc.  */
   3050 #define TLS_TPRELGD	32	/* TPREL reloc resulting from GD->IE. */
   3051 #define PLT_IFUNC	64	/* STT_GNU_IFUNC.  */
   3052   char tls_mask;
   3053 
   3054   /* Nonzero if we have seen a small data relocation referring to this
   3055      symbol.  */
   3056   unsigned char has_sda_refs;
   3057 };
   3058 
   3059 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
   3060 
   3061 /* PPC ELF linker hash table.  */
   3062 
   3063 struct ppc_elf_link_hash_table
   3064 {
   3065   struct elf_link_hash_table elf;
   3066 
   3067   /* Short-cuts to get to dynamic linker sections.  */
   3068   asection *got;
   3069   asection *relgot;
   3070   asection *glink;
   3071   asection *plt;
   3072   asection *relplt;
   3073   asection *iplt;
   3074   asection *reliplt;
   3075   asection *dynbss;
   3076   asection *relbss;
   3077   asection *dynsbss;
   3078   asection *relsbss;
   3079   elf_linker_section_t sdata[2];
   3080   asection *sbss;
   3081   asection *glink_eh_frame;
   3082 
   3083   /* The (unloaded but important) .rela.plt.unloaded on VxWorks.  */
   3084   asection *srelplt2;
   3085 
   3086   /* The .got.plt section (VxWorks only)*/
   3087   asection *sgotplt;
   3088 
   3089   /* Shortcut to __tls_get_addr.  */
   3090   struct elf_link_hash_entry *tls_get_addr;
   3091 
   3092   /* The bfd that forced an old-style PLT.  */
   3093   bfd *old_bfd;
   3094 
   3095   /* TLS local dynamic got entry handling.  */
   3096   union {
   3097     bfd_signed_vma refcount;
   3098     bfd_vma offset;
   3099   } tlsld_got;
   3100 
   3101   /* Offset of branch table to PltResolve function in glink.  */
   3102   bfd_vma glink_pltresolve;
   3103 
   3104   /* Size of reserved GOT entries.  */
   3105   unsigned int got_header_size;
   3106   /* Non-zero if allocating the header left a gap.  */
   3107   unsigned int got_gap;
   3108 
   3109   /* The type of PLT we have chosen to use.  */
   3110   enum ppc_elf_plt_type plt_type;
   3111 
   3112   /* Set if we should emit symbols for stubs.  */
   3113   unsigned int emit_stub_syms:1;
   3114 
   3115   /* Set if __tls_get_addr optimization should not be done.  */
   3116   unsigned int no_tls_get_addr_opt:1;
   3117 
   3118   /* True if the target system is VxWorks.  */
   3119   unsigned int is_vxworks:1;
   3120 
   3121   /* The size of PLT entries.  */
   3122   int plt_entry_size;
   3123   /* The distance between adjacent PLT slots.  */
   3124   int plt_slot_size;
   3125   /* The size of the first PLT entry.  */
   3126   int plt_initial_entry_size;
   3127 
   3128   /* Small local sym cache.  */
   3129   struct sym_cache sym_cache;
   3130 };
   3131 
   3132 /* Rename some of the generic section flags to better document how they
   3133    are used for ppc32.  The flags are only valid for ppc32 elf objects.  */
   3134 
   3135 /* Nonzero if this section has TLS related relocations.  */
   3136 #define has_tls_reloc sec_flg0
   3137 
   3138 /* Nonzero if this section has a call to __tls_get_addr.  */
   3139 #define has_tls_get_addr_call sec_flg1
   3140 
   3141 /* Get the PPC ELF linker hash table from a link_info structure.  */
   3142 
   3143 #define ppc_elf_hash_table(p) \
   3144   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
   3145   == PPC32_ELF_DATA ? ((struct ppc_elf_link_hash_table *) ((p)->hash)) : NULL)
   3146 
   3147 /* Create an entry in a PPC ELF linker hash table.  */
   3148 
   3149 static struct bfd_hash_entry *
   3150 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
   3151 			   struct bfd_hash_table *table,
   3152 			   const char *string)
   3153 {
   3154   /* Allocate the structure if it has not already been allocated by a
   3155      subclass.  */
   3156   if (entry == NULL)
   3157     {
   3158       entry = bfd_hash_allocate (table,
   3159 				 sizeof (struct ppc_elf_link_hash_entry));
   3160       if (entry == NULL)
   3161 	return entry;
   3162     }
   3163 
   3164   /* Call the allocation method of the superclass.  */
   3165   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
   3166   if (entry != NULL)
   3167     {
   3168       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
   3169       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
   3170       ppc_elf_hash_entry (entry)->tls_mask = 0;
   3171       ppc_elf_hash_entry (entry)->has_sda_refs = 0;
   3172     }
   3173 
   3174   return entry;
   3175 }
   3176 
   3177 /* Create a PPC ELF linker hash table.  */
   3178 
   3179 static struct bfd_link_hash_table *
   3180 ppc_elf_link_hash_table_create (bfd *abfd)
   3181 {
   3182   struct ppc_elf_link_hash_table *ret;
   3183 
   3184   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
   3185   if (ret == NULL)
   3186     return NULL;
   3187 
   3188   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
   3189 				      ppc_elf_link_hash_newfunc,
   3190 				      sizeof (struct ppc_elf_link_hash_entry),
   3191 				      PPC32_ELF_DATA))
   3192     {
   3193       free (ret);
   3194       return NULL;
   3195     }
   3196 
   3197   ret->elf.init_plt_refcount.refcount = 0;
   3198   ret->elf.init_plt_refcount.glist = NULL;
   3199   ret->elf.init_plt_offset.offset = 0;
   3200   ret->elf.init_plt_offset.glist = NULL;
   3201 
   3202   ret->sdata[0].name = ".sdata";
   3203   ret->sdata[0].sym_name = "_SDA_BASE_";
   3204   ret->sdata[0].bss_name = ".sbss";
   3205 
   3206   ret->sdata[1].name = ".sdata2";
   3207   ret->sdata[1].sym_name = "_SDA2_BASE_";
   3208   ret->sdata[1].bss_name = ".sbss2";
   3209 
   3210   ret->plt_entry_size = 12;
   3211   ret->plt_slot_size = 8;
   3212   ret->plt_initial_entry_size = 72;
   3213 
   3214   return &ret->elf.root;
   3215 }
   3216 
   3217 /* Create .got and the related sections.  */
   3218 
   3219 static bfd_boolean
   3220 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
   3221 {
   3222   struct ppc_elf_link_hash_table *htab;
   3223   asection *s;
   3224   flagword flags;
   3225 
   3226   if (!_bfd_elf_create_got_section (abfd, info))
   3227     return FALSE;
   3228 
   3229   htab = ppc_elf_hash_table (info);
   3230   htab->got = s = bfd_get_linker_section (abfd, ".got");
   3231   if (s == NULL)
   3232     abort ();
   3233 
   3234   if (htab->is_vxworks)
   3235     {
   3236       htab->sgotplt = bfd_get_linker_section (abfd, ".got.plt");
   3237       if (!htab->sgotplt)
   3238 	abort ();
   3239     }
   3240   else
   3241     {
   3242       /* The powerpc .got has a blrl instruction in it.  Mark it
   3243 	 executable.  */
   3244       flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
   3245 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   3246       if (!bfd_set_section_flags (abfd, s, flags))
   3247 	return FALSE;
   3248     }
   3249 
   3250   htab->relgot = bfd_get_linker_section (abfd, ".rela.got");
   3251   if (!htab->relgot)
   3252     abort ();
   3253 
   3254   return TRUE;
   3255 }
   3256 
   3257 static bfd_boolean
   3258 ppc_elf_create_glink (bfd *abfd, struct bfd_link_info *info)
   3259 {
   3260   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
   3261   asection *s;
   3262   flagword flags;
   3263 
   3264   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS
   3265 	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   3266   s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags);
   3267   htab->glink = s;
   3268   if (s == NULL
   3269       || !bfd_set_section_alignment (abfd, s, 4))
   3270     return FALSE;
   3271 
   3272   if (!info->no_ld_generated_unwind_info)
   3273     {
   3274       flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
   3275 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   3276       s = bfd_make_section_anyway_with_flags (abfd, ".eh_frame", flags);
   3277       htab->glink_eh_frame = s;
   3278       if (s == NULL
   3279 	  || !bfd_set_section_alignment (abfd, s, 2))
   3280 	return FALSE;
   3281     }
   3282 
   3283   flags = SEC_ALLOC | SEC_LINKER_CREATED;
   3284   s = bfd_make_section_anyway_with_flags (abfd, ".iplt", flags);
   3285   htab->iplt = s;
   3286   if (s == NULL
   3287       || !bfd_set_section_alignment (abfd, s, 4))
   3288     return FALSE;
   3289 
   3290   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
   3291 	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   3292   s = bfd_make_section_anyway_with_flags (abfd, ".rela.iplt", flags);
   3293   htab->reliplt = s;
   3294   if (s == NULL
   3295       || ! bfd_set_section_alignment (abfd, s, 2))
   3296     return FALSE;
   3297   return TRUE;
   3298 }
   3299 
   3300 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
   3301    to output sections (just like _bfd_elf_create_dynamic_sections has
   3302    to create .dynbss and .rela.bss).  */
   3303 
   3304 static bfd_boolean
   3305 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
   3306 {
   3307   struct ppc_elf_link_hash_table *htab;
   3308   asection *s;
   3309   flagword flags;
   3310 
   3311   htab = ppc_elf_hash_table (info);
   3312 
   3313   if (htab->got == NULL
   3314       && !ppc_elf_create_got (abfd, info))
   3315     return FALSE;
   3316 
   3317   if (!_bfd_elf_create_dynamic_sections (abfd, info))
   3318     return FALSE;
   3319 
   3320   if (htab->glink == NULL
   3321       && !ppc_elf_create_glink (abfd, info))
   3322     return FALSE;
   3323 
   3324   htab->dynbss = bfd_get_linker_section (abfd, ".dynbss");
   3325   s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss",
   3326 					  SEC_ALLOC | SEC_LINKER_CREATED);
   3327   htab->dynsbss = s;
   3328   if (s == NULL)
   3329     return FALSE;
   3330 
   3331   if (! info->shared)
   3332     {
   3333       htab->relbss = bfd_get_linker_section (abfd, ".rela.bss");
   3334       flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
   3335 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   3336       s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", flags);
   3337       htab->relsbss = s;
   3338       if (s == NULL
   3339 	  || ! bfd_set_section_alignment (abfd, s, 2))
   3340 	return FALSE;
   3341     }
   3342 
   3343   if (htab->is_vxworks
   3344       && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
   3345     return FALSE;
   3346 
   3347   htab->relplt = bfd_get_linker_section (abfd, ".rela.plt");
   3348   htab->plt = s = bfd_get_linker_section (abfd, ".plt");
   3349   if (s == NULL)
   3350     abort ();
   3351 
   3352   flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
   3353   if (htab->plt_type == PLT_VXWORKS)
   3354     /* The VxWorks PLT is a loaded section with contents.  */
   3355     flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
   3356   return bfd_set_section_flags (abfd, s, flags);
   3357 }
   3358 
   3359 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   3360 
   3361 static void
   3362 ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
   3363 			      struct elf_link_hash_entry *dir,
   3364 			      struct elf_link_hash_entry *ind)
   3365 {
   3366   struct ppc_elf_link_hash_entry *edir, *eind;
   3367 
   3368   edir = (struct ppc_elf_link_hash_entry *) dir;
   3369   eind = (struct ppc_elf_link_hash_entry *) ind;
   3370 
   3371   edir->tls_mask |= eind->tls_mask;
   3372   edir->has_sda_refs |= eind->has_sda_refs;
   3373 
   3374   /* If called to transfer flags for a weakdef during processing
   3375      of elf_adjust_dynamic_symbol, don't copy non_got_ref.
   3376      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
   3377   if (!(ELIMINATE_COPY_RELOCS
   3378 	&& eind->elf.root.type != bfd_link_hash_indirect
   3379 	&& edir->elf.dynamic_adjusted))
   3380     edir->elf.non_got_ref |= eind->elf.non_got_ref;
   3381 
   3382   edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
   3383   edir->elf.ref_regular |= eind->elf.ref_regular;
   3384   edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
   3385   edir->elf.needs_plt |= eind->elf.needs_plt;
   3386   edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
   3387 
   3388   if (eind->dyn_relocs != NULL)
   3389     {
   3390       if (edir->dyn_relocs != NULL)
   3391 	{
   3392 	  struct elf_dyn_relocs **pp;
   3393 	  struct elf_dyn_relocs *p;
   3394 
   3395 	  /* Add reloc counts against the indirect sym to the direct sym
   3396 	     list.  Merge any entries against the same section.  */
   3397 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
   3398 	    {
   3399 	      struct elf_dyn_relocs *q;
   3400 
   3401 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
   3402 		if (q->sec == p->sec)
   3403 		  {
   3404 		    q->pc_count += p->pc_count;
   3405 		    q->count += p->count;
   3406 		    *pp = p->next;
   3407 		    break;
   3408 		  }
   3409 	      if (q == NULL)
   3410 		pp = &p->next;
   3411 	    }
   3412 	  *pp = edir->dyn_relocs;
   3413 	}
   3414 
   3415       edir->dyn_relocs = eind->dyn_relocs;
   3416       eind->dyn_relocs = NULL;
   3417     }
   3418 
   3419   /* If we were called to copy over info for a weak sym, that's all.
   3420      You might think dyn_relocs need not be copied over;  After all,
   3421      both syms will be dynamic or both non-dynamic so we're just
   3422      moving reloc accounting around.  However, ELIMINATE_COPY_RELOCS
   3423      code in ppc_elf_adjust_dynamic_symbol needs to check for
   3424      dyn_relocs in read-only sections, and it does so on what is the
   3425      DIR sym here.  */
   3426   if (eind->elf.root.type != bfd_link_hash_indirect)
   3427     return;
   3428 
   3429   /* Copy over the GOT refcount entries that we may have already seen to
   3430      the symbol which just became indirect.  */
   3431   edir->elf.got.refcount += eind->elf.got.refcount;
   3432   eind->elf.got.refcount = 0;
   3433 
   3434   /* And plt entries.  */
   3435   if (eind->elf.plt.plist != NULL)
   3436     {
   3437       if (edir->elf.plt.plist != NULL)
   3438 	{
   3439 	  struct plt_entry **entp;
   3440 	  struct plt_entry *ent;
   3441 
   3442 	  for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
   3443 	    {
   3444 	      struct plt_entry *dent;
   3445 
   3446 	      for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
   3447 		if (dent->sec == ent->sec && dent->addend == ent->addend)
   3448 		  {
   3449 		    dent->plt.refcount += ent->plt.refcount;
   3450 		    *entp = ent->next;
   3451 		    break;
   3452 		  }
   3453 	      if (dent == NULL)
   3454 		entp = &ent->next;
   3455 	    }
   3456 	  *entp = edir->elf.plt.plist;
   3457 	}
   3458 
   3459       edir->elf.plt.plist = eind->elf.plt.plist;
   3460       eind->elf.plt.plist = NULL;
   3461     }
   3462 
   3463   if (eind->elf.dynindx != -1)
   3464     {
   3465       if (edir->elf.dynindx != -1)
   3466 	_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
   3467 				edir->elf.dynstr_index);
   3468       edir->elf.dynindx = eind->elf.dynindx;
   3469       edir->elf.dynstr_index = eind->elf.dynstr_index;
   3470       eind->elf.dynindx = -1;
   3471       eind->elf.dynstr_index = 0;
   3472     }
   3473 }
   3474 
   3475 /* Hook called by the linker routine which adds symbols from an object
   3476    file.  We use it to put .comm items in .sbss, and not .bss.  */
   3477 
   3478 static bfd_boolean
   3479 ppc_elf_add_symbol_hook (bfd *abfd,
   3480 			 struct bfd_link_info *info,
   3481 			 Elf_Internal_Sym *sym,
   3482 			 const char **namep ATTRIBUTE_UNUSED,
   3483 			 flagword *flagsp ATTRIBUTE_UNUSED,
   3484 			 asection **secp,
   3485 			 bfd_vma *valp)
   3486 {
   3487   if (sym->st_shndx == SHN_COMMON
   3488       && !info->relocatable
   3489       && is_ppc_elf (info->output_bfd)
   3490       && sym->st_size <= elf_gp_size (abfd))
   3491     {
   3492       /* Common symbols less than or equal to -G nn bytes are automatically
   3493 	 put into .sbss.  */
   3494       struct ppc_elf_link_hash_table *htab;
   3495 
   3496       htab = ppc_elf_hash_table (info);
   3497       if (htab->sbss == NULL)
   3498 	{
   3499 	  flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
   3500 
   3501 	  if (!htab->elf.dynobj)
   3502 	    htab->elf.dynobj = abfd;
   3503 
   3504 	  htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
   3505 							   ".sbss",
   3506 							   flags);
   3507 	  if (htab->sbss == NULL)
   3508 	    return FALSE;
   3509 	}
   3510 
   3511       *secp = htab->sbss;
   3512       *valp = sym->st_size;
   3513     }
   3514 
   3515   if ((abfd->flags & DYNAMIC) == 0
   3516       && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
   3517 	  || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
   3518     elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
   3519 
   3520   return TRUE;
   3521 }
   3522 
   3523 static bfd_boolean
   3525 create_sdata_sym (struct bfd_link_info *info, elf_linker_section_t *lsect)
   3526 {
   3527   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
   3528 
   3529   lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name,
   3530 				     TRUE, FALSE, TRUE);
   3531   if (lsect->sym == NULL)
   3532     return FALSE;
   3533   if (lsect->sym->root.type == bfd_link_hash_new)
   3534     lsect->sym->non_elf = 0;
   3535   lsect->sym->ref_regular = 1;
   3536   _bfd_elf_link_hash_hide_symbol (info, lsect->sym, TRUE);
   3537   return TRUE;
   3538 }
   3539 
   3540 /* Create a special linker section.  */
   3541 
   3542 static bfd_boolean
   3543 ppc_elf_create_linker_section (bfd *abfd,
   3544 			       struct bfd_link_info *info,
   3545 			       flagword flags,
   3546 			       elf_linker_section_t *lsect)
   3547 {
   3548   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
   3549   asection *s;
   3550 
   3551   flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   3552 	    | SEC_LINKER_CREATED);
   3553 
   3554   /* Record the first bfd that needs the special sections.  */
   3555   if (!htab->elf.dynobj)
   3556     htab->elf.dynobj = abfd;
   3557 
   3558   s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
   3559 					  lsect->name,
   3560 					  flags);
   3561   if (s == NULL
   3562       || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
   3563     return FALSE;
   3564   lsect->section = s;
   3565 
   3566   return create_sdata_sym (info, lsect);
   3567 }
   3568 
   3569 /* Find a linker generated pointer with a given addend and type.  */
   3570 
   3571 static elf_linker_section_pointers_t *
   3572 elf_find_pointer_linker_section
   3573   (elf_linker_section_pointers_t *linker_pointers,
   3574    bfd_vma addend,
   3575    elf_linker_section_t *lsect)
   3576 {
   3577   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
   3578     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
   3579       return linker_pointers;
   3580 
   3581   return NULL;
   3582 }
   3583 
   3584 /* Allocate a pointer to live in a linker created section.  */
   3585 
   3586 static bfd_boolean
   3587 elf_create_pointer_linker_section (bfd *abfd,
   3588 				   elf_linker_section_t *lsect,
   3589 				   struct elf_link_hash_entry *h,
   3590 				   const Elf_Internal_Rela *rel)
   3591 {
   3592   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
   3593   elf_linker_section_pointers_t *linker_section_ptr;
   3594   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
   3595   bfd_size_type amt;
   3596 
   3597   BFD_ASSERT (lsect != NULL);
   3598 
   3599   /* Is this a global symbol?  */
   3600   if (h != NULL)
   3601     {
   3602       struct ppc_elf_link_hash_entry *eh;
   3603 
   3604       /* Has this symbol already been allocated?  If so, our work is done.  */
   3605       eh = (struct ppc_elf_link_hash_entry *) h;
   3606       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
   3607 					   rel->r_addend,
   3608 					   lsect))
   3609 	return TRUE;
   3610 
   3611       ptr_linker_section_ptr = &eh->linker_section_pointer;
   3612     }
   3613   else
   3614     {
   3615       BFD_ASSERT (is_ppc_elf (abfd));
   3616 
   3617       /* Allocation of a pointer to a local symbol.  */
   3618       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
   3619 
   3620       /* Allocate a table to hold the local symbols if first time.  */
   3621       if (!ptr)
   3622 	{
   3623 	  unsigned int num_symbols = elf_symtab_hdr (abfd).sh_info;
   3624 
   3625 	  amt = num_symbols;
   3626 	  amt *= sizeof (elf_linker_section_pointers_t *);
   3627 	  ptr = bfd_zalloc (abfd, amt);
   3628 
   3629 	  if (!ptr)
   3630 	    return FALSE;
   3631 
   3632 	  elf_local_ptr_offsets (abfd) = ptr;
   3633 	}
   3634 
   3635       /* Has this symbol already been allocated?  If so, our work is done.  */
   3636       if (elf_find_pointer_linker_section (ptr[r_symndx],
   3637 					   rel->r_addend,
   3638 					   lsect))
   3639 	return TRUE;
   3640 
   3641       ptr_linker_section_ptr = &ptr[r_symndx];
   3642     }
   3643 
   3644   /* Allocate space for a pointer in the linker section, and allocate
   3645      a new pointer record from internal memory.  */
   3646   BFD_ASSERT (ptr_linker_section_ptr != NULL);
   3647   amt = sizeof (elf_linker_section_pointers_t);
   3648   linker_section_ptr = bfd_alloc (abfd, amt);
   3649 
   3650   if (!linker_section_ptr)
   3651     return FALSE;
   3652 
   3653   linker_section_ptr->next = *ptr_linker_section_ptr;
   3654   linker_section_ptr->addend = rel->r_addend;
   3655   linker_section_ptr->lsect = lsect;
   3656   *ptr_linker_section_ptr = linker_section_ptr;
   3657 
   3658   linker_section_ptr->offset = lsect->section->size;
   3659   lsect->section->size += 4;
   3660 
   3661 #ifdef DEBUG
   3662   fprintf (stderr,
   3663 	   "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
   3664 	   lsect->name, (long) linker_section_ptr->offset,
   3665 	   (long) lsect->section->size);
   3666 #endif
   3667 
   3668   return TRUE;
   3669 }
   3670 
   3671 static struct plt_entry **
   3672 update_local_sym_info (bfd *abfd,
   3673 		       Elf_Internal_Shdr *symtab_hdr,
   3674 		       unsigned long r_symndx,
   3675 		       int tls_type)
   3676 {
   3677   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
   3678   struct plt_entry **local_plt;
   3679   char *local_got_tls_masks;
   3680 
   3681   if (local_got_refcounts == NULL)
   3682     {
   3683       bfd_size_type size = symtab_hdr->sh_info;
   3684 
   3685       size *= (sizeof (*local_got_refcounts)
   3686 	       + sizeof (*local_plt)
   3687 	       + sizeof (*local_got_tls_masks));
   3688       local_got_refcounts = bfd_zalloc (abfd, size);
   3689       if (local_got_refcounts == NULL)
   3690 	return NULL;
   3691       elf_local_got_refcounts (abfd) = local_got_refcounts;
   3692     }
   3693 
   3694   local_plt = (struct plt_entry **) (local_got_refcounts + symtab_hdr->sh_info);
   3695   local_got_tls_masks = (char *) (local_plt + symtab_hdr->sh_info);
   3696   local_got_tls_masks[r_symndx] |= tls_type;
   3697   if (tls_type != PLT_IFUNC)
   3698     local_got_refcounts[r_symndx] += 1;
   3699   return local_plt + r_symndx;
   3700 }
   3701 
   3702 static bfd_boolean
   3703 update_plt_info (bfd *abfd, struct plt_entry **plist,
   3704 		 asection *sec, bfd_vma addend)
   3705 {
   3706   struct plt_entry *ent;
   3707 
   3708   if (addend < 32768)
   3709     sec = NULL;
   3710   for (ent = *plist; ent != NULL; ent = ent->next)
   3711     if (ent->sec == sec && ent->addend == addend)
   3712       break;
   3713   if (ent == NULL)
   3714     {
   3715       bfd_size_type amt = sizeof (*ent);
   3716       ent = bfd_alloc (abfd, amt);
   3717       if (ent == NULL)
   3718 	return FALSE;
   3719       ent->next = *plist;
   3720       ent->sec = sec;
   3721       ent->addend = addend;
   3722       ent->plt.refcount = 0;
   3723       *plist = ent;
   3724     }
   3725   ent->plt.refcount += 1;
   3726   return TRUE;
   3727 }
   3728 
   3729 static struct plt_entry *
   3730 find_plt_ent (struct plt_entry **plist, asection *sec, bfd_vma addend)
   3731 {
   3732   struct plt_entry *ent;
   3733 
   3734   if (addend < 32768)
   3735     sec = NULL;
   3736   for (ent = *plist; ent != NULL; ent = ent->next)
   3737     if (ent->sec == sec && ent->addend == addend)
   3738       break;
   3739   return ent;
   3740 }
   3741 
   3742 static bfd_boolean
   3743 is_branch_reloc (enum elf_ppc_reloc_type r_type)
   3744 {
   3745   return (r_type == R_PPC_PLTREL24
   3746 	  || r_type == R_PPC_LOCAL24PC
   3747 	  || r_type == R_PPC_REL24
   3748 	  || r_type == R_PPC_REL14
   3749 	  || r_type == R_PPC_REL14_BRTAKEN
   3750 	  || r_type == R_PPC_REL14_BRNTAKEN
   3751 	  || r_type == R_PPC_ADDR24
   3752 	  || r_type == R_PPC_ADDR14
   3753 	  || r_type == R_PPC_ADDR14_BRTAKEN
   3754 	  || r_type == R_PPC_ADDR14_BRNTAKEN);
   3755 }
   3756 
   3757 static void
   3758 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
   3759 {
   3760   (*_bfd_error_handler)
   3761     (_("%B: relocation %s cannot be used when making a shared object"),
   3762      abfd,
   3763      ppc_elf_howto_table[r_type]->name);
   3764   bfd_set_error (bfd_error_bad_value);
   3765 }
   3766 
   3767 /* Look through the relocs for a section during the first phase, and
   3768    allocate space in the global offset table or procedure linkage
   3769    table.  */
   3770 
   3771 static bfd_boolean
   3772 ppc_elf_check_relocs (bfd *abfd,
   3773 		      struct bfd_link_info *info,
   3774 		      asection *sec,
   3775 		      const Elf_Internal_Rela *relocs)
   3776 {
   3777   struct ppc_elf_link_hash_table *htab;
   3778   Elf_Internal_Shdr *symtab_hdr;
   3779   struct elf_link_hash_entry **sym_hashes;
   3780   const Elf_Internal_Rela *rel;
   3781   const Elf_Internal_Rela *rel_end;
   3782   asection *got2, *sreloc;
   3783   struct elf_link_hash_entry *tga;
   3784 
   3785   if (info->relocatable)
   3786     return TRUE;
   3787 
   3788   /* Don't do anything special with non-loaded, non-alloced sections.
   3789      In particular, any relocs in such sections should not affect GOT
   3790      and PLT reference counting (ie. we don't allow them to create GOT
   3791      or PLT entries), there's no possibility or desire to optimize TLS
   3792      relocs, and there's not much point in propagating relocs to shared
   3793      libs that the dynamic linker won't relocate.  */
   3794   if ((sec->flags & SEC_ALLOC) == 0)
   3795     return TRUE;
   3796 
   3797 #ifdef DEBUG
   3798   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
   3799 		      sec, abfd);
   3800 #endif
   3801 
   3802   BFD_ASSERT (is_ppc_elf (abfd));
   3803 
   3804   /* Initialize howto table if not already done.  */
   3805   if (!ppc_elf_howto_table[R_PPC_ADDR32])
   3806     ppc_elf_howto_init ();
   3807 
   3808   htab = ppc_elf_hash_table (info);
   3809   if (htab->glink == NULL)
   3810     {
   3811       if (htab->elf.dynobj == NULL)
   3812 	htab->elf.dynobj = abfd;
   3813       if (!ppc_elf_create_glink (htab->elf.dynobj, info))
   3814 	return FALSE;
   3815     }
   3816   tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
   3817 			      FALSE, FALSE, TRUE);
   3818   symtab_hdr = &elf_symtab_hdr (abfd);
   3819   sym_hashes = elf_sym_hashes (abfd);
   3820   got2 = bfd_get_section_by_name (abfd, ".got2");
   3821   sreloc = NULL;
   3822 
   3823   rel_end = relocs + sec->reloc_count;
   3824   for (rel = relocs; rel < rel_end; rel++)
   3825     {
   3826       unsigned long r_symndx;
   3827       enum elf_ppc_reloc_type r_type;
   3828       struct elf_link_hash_entry *h;
   3829       int tls_type;
   3830 
   3831       r_symndx = ELF32_R_SYM (rel->r_info);
   3832       if (r_symndx < symtab_hdr->sh_info)
   3833 	h = NULL;
   3834       else
   3835 	{
   3836 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   3837 	  while (h->root.type == bfd_link_hash_indirect
   3838 		 || h->root.type == bfd_link_hash_warning)
   3839 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   3840 	}
   3841 
   3842       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
   3843 	 This shows up in particular in an R_PPC_ADDR32 in the eabi
   3844 	 startup code.  */
   3845       if (h != NULL
   3846 	  && htab->got == NULL
   3847 	  && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   3848 	{
   3849 	  if (htab->elf.dynobj == NULL)
   3850 	    htab->elf.dynobj = abfd;
   3851 	  if (!ppc_elf_create_got (htab->elf.dynobj, info))
   3852 	    return FALSE;
   3853 	  BFD_ASSERT (h == htab->elf.hgot);
   3854 	}
   3855 
   3856       tls_type = 0;
   3857       r_type = ELF32_R_TYPE (rel->r_info);
   3858       if (h == NULL && !htab->is_vxworks)
   3859 	{
   3860 	  Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   3861 							  abfd, r_symndx);
   3862 	  if (isym == NULL)
   3863 	    return FALSE;
   3864 
   3865 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
   3866 	      && (!info->shared
   3867 		  || is_branch_reloc (r_type)))
   3868 	    {
   3869 	      struct plt_entry **ifunc;
   3870 	      bfd_vma addend;
   3871 
   3872 	      ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
   3873 					     PLT_IFUNC);
   3874 	      if (ifunc == NULL)
   3875 		return FALSE;
   3876 
   3877 	      /* STT_GNU_IFUNC symbols must have a PLT entry;
   3878 		 In a non-pie executable even when there are
   3879 		 no plt calls.  */
   3880 	      addend = 0;
   3881 	      if (r_type == R_PPC_PLTREL24)
   3882 		{
   3883 		  ppc_elf_tdata (abfd)->makes_plt_call = 1;
   3884 		  if (info->shared)
   3885 		    addend = rel->r_addend;
   3886 		}
   3887 	      if (!update_plt_info (abfd, ifunc, got2, addend))
   3888 		return FALSE;
   3889 	    }
   3890 	}
   3891 
   3892       if (!htab->is_vxworks
   3893 	  && is_branch_reloc (r_type)
   3894 	  && h != NULL
   3895 	  && h == tga)
   3896 	{
   3897 	  if (rel != relocs
   3898 	      && (ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSGD
   3899 		  || ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSLD))
   3900 	    /* We have a new-style __tls_get_addr call with a marker
   3901 	       reloc.  */
   3902 	    ;
   3903 	  else
   3904 	    /* Mark this section as having an old-style call.  */
   3905 	    sec->has_tls_get_addr_call = 1;
   3906 	}
   3907 
   3908       switch ((int)r_type)
   3909 	{
   3910 	case R_PPC_TLSGD:
   3911 	case R_PPC_TLSLD:
   3912 	  /* These special tls relocs tie a call to __tls_get_addr with
   3913 	     its parameter symbol.  */
   3914 	  break;
   3915 
   3916 	case R_PPC_GOT_TLSLD16:
   3917 	case R_PPC_GOT_TLSLD16_LO:
   3918 	case R_PPC_GOT_TLSLD16_HI:
   3919 	case R_PPC_GOT_TLSLD16_HA:
   3920 	  tls_type = TLS_TLS | TLS_LD;
   3921 	  goto dogottls;
   3922 
   3923 	case R_PPC_GOT_TLSGD16:
   3924 	case R_PPC_GOT_TLSGD16_LO:
   3925 	case R_PPC_GOT_TLSGD16_HI:
   3926 	case R_PPC_GOT_TLSGD16_HA:
   3927 	  tls_type = TLS_TLS | TLS_GD;
   3928 	  goto dogottls;
   3929 
   3930 	case R_PPC_GOT_TPREL16:
   3931 	case R_PPC_GOT_TPREL16_LO:
   3932 	case R_PPC_GOT_TPREL16_HI:
   3933 	case R_PPC_GOT_TPREL16_HA:
   3934 	  if (!info->executable)
   3935 	    info->flags |= DF_STATIC_TLS;
   3936 	  tls_type = TLS_TLS | TLS_TPREL;
   3937 	  goto dogottls;
   3938 
   3939 	case R_PPC_GOT_DTPREL16:
   3940 	case R_PPC_GOT_DTPREL16_LO:
   3941 	case R_PPC_GOT_DTPREL16_HI:
   3942 	case R_PPC_GOT_DTPREL16_HA:
   3943 	  tls_type = TLS_TLS | TLS_DTPREL;
   3944 	dogottls:
   3945 	  sec->has_tls_reloc = 1;
   3946 	  /* Fall thru */
   3947 
   3948 	  /* GOT16 relocations */
   3949 	case R_PPC_GOT16:
   3950 	case R_PPC_GOT16_LO:
   3951 	case R_PPC_GOT16_HI:
   3952 	case R_PPC_GOT16_HA:
   3953 	  /* This symbol requires a global offset table entry.  */
   3954 	  if (htab->got == NULL)
   3955 	    {
   3956 	      if (htab->elf.dynobj == NULL)
   3957 		htab->elf.dynobj = abfd;
   3958 	      if (!ppc_elf_create_got (htab->elf.dynobj, info))
   3959 		return FALSE;
   3960 	    }
   3961 	  if (h != NULL)
   3962 	    {
   3963 	      h->got.refcount += 1;
   3964 	      ppc_elf_hash_entry (h)->tls_mask |= tls_type;
   3965 	    }
   3966 	  else
   3967 	    /* This is a global offset table entry for a local symbol.  */
   3968 	    if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
   3969 	      return FALSE;
   3970 
   3971 	  /* We may also need a plt entry if the symbol turns out to be
   3972 	     an ifunc.  */
   3973 	  if (h != NULL && !info->shared)
   3974 	    {
   3975 	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
   3976 		return FALSE;
   3977 	    }
   3978 	  break;
   3979 
   3980 	  /* Indirect .sdata relocation.  */
   3981 	case R_PPC_EMB_SDAI16:
   3982 	  if (info->shared)
   3983 	    {
   3984 	      bad_shared_reloc (abfd, r_type);
   3985 	      return FALSE;
   3986 	    }
   3987 	  if (htab->sdata[0].section == NULL
   3988 	      && !ppc_elf_create_linker_section (abfd, info, 0,
   3989 						 &htab->sdata[0]))
   3990 	    return FALSE;
   3991 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
   3992 						  h, rel))
   3993 	    return FALSE;
   3994 	  if (h != NULL)
   3995 	    {
   3996 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
   3997 	      h->non_got_ref = TRUE;
   3998 	    }
   3999 	  break;
   4000 
   4001 	  /* Indirect .sdata2 relocation.  */
   4002 	case R_PPC_EMB_SDA2I16:
   4003 	  if (info->shared)
   4004 	    {
   4005 	      bad_shared_reloc (abfd, r_type);
   4006 	      return FALSE;
   4007 	    }
   4008 	  if (htab->sdata[1].section == NULL
   4009 	      && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
   4010 						 &htab->sdata[1]))
   4011 	    return FALSE;
   4012 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
   4013 						  h, rel))
   4014 	    return FALSE;
   4015 	  if (h != NULL)
   4016 	    {
   4017 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
   4018 	      h->non_got_ref = TRUE;
   4019 	    }
   4020 	  break;
   4021 
   4022 	case R_PPC_VLE_SDAREL_LO16A:
   4023 	case R_PPC_VLE_SDAREL_LO16D:
   4024 	case R_PPC_VLE_SDAREL_HI16A:
   4025 	case R_PPC_VLE_SDAREL_HI16D:
   4026 	case R_PPC_VLE_SDAREL_HA16A:
   4027 	case R_PPC_VLE_SDAREL_HA16D:
   4028 	case R_PPC_SDAREL16:
   4029 	  if (htab->sdata[0].sym == NULL
   4030 	      && !create_sdata_sym (info, &htab->sdata[0]))
   4031 	    return FALSE;
   4032 
   4033 	  if (htab->sdata[1].sym == NULL
   4034 	      && !create_sdata_sym (info, &htab->sdata[1]))
   4035 	    return FALSE;
   4036 
   4037 	  if (h != NULL)
   4038 	    {
   4039 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
   4040 	      h->non_got_ref = TRUE;
   4041 	    }
   4042 	  break;
   4043 
   4044 	case R_PPC_VLE_REL8:
   4045 	case R_PPC_VLE_REL15:
   4046 	case R_PPC_VLE_REL24:
   4047 	case R_PPC_VLE_LO16A:
   4048 	case R_PPC_VLE_LO16D:
   4049 	case R_PPC_VLE_HI16A:
   4050 	case R_PPC_VLE_HI16D:
   4051 	case R_PPC_VLE_HA16A:
   4052 	case R_PPC_VLE_HA16D:
   4053 	  break;
   4054 
   4055 	case R_PPC_EMB_SDA2REL:
   4056 	  if (info->shared)
   4057 	    {
   4058 	      bad_shared_reloc (abfd, r_type);
   4059 	      return FALSE;
   4060 	    }
   4061 	  if (htab->sdata[1].sym == NULL
   4062 	      && !create_sdata_sym (info, &htab->sdata[1]))
   4063 	    return FALSE;
   4064 	  if (h != NULL)
   4065 	    {
   4066 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
   4067 	      h->non_got_ref = TRUE;
   4068 	    }
   4069 	  break;
   4070 
   4071 	case R_PPC_VLE_SDA21_LO:
   4072 	case R_PPC_VLE_SDA21:
   4073 	case R_PPC_EMB_SDA21:
   4074 	case R_PPC_EMB_RELSDA:
   4075 	  if (info->shared)
   4076 	    {
   4077 	      bad_shared_reloc (abfd, r_type);
   4078 	      return FALSE;
   4079 	    }
   4080 	  if (htab->sdata[0].sym == NULL
   4081 	      && !create_sdata_sym (info, &htab->sdata[0]))
   4082 	    return FALSE;
   4083 	  if (htab->sdata[1].sym == NULL
   4084 	      && !create_sdata_sym (info, &htab->sdata[1]))
   4085 	    return FALSE;
   4086 	  if (h != NULL)
   4087 	    {
   4088 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
   4089 	      h->non_got_ref = TRUE;
   4090 	    }
   4091 	  break;
   4092 
   4093 	case R_PPC_EMB_NADDR32:
   4094 	case R_PPC_EMB_NADDR16:
   4095 	case R_PPC_EMB_NADDR16_LO:
   4096 	case R_PPC_EMB_NADDR16_HI:
   4097 	case R_PPC_EMB_NADDR16_HA:
   4098 	  if (info->shared)
   4099 	    {
   4100 	      bad_shared_reloc (abfd, r_type);
   4101 	      return FALSE;
   4102 	    }
   4103 	  if (h != NULL)
   4104 	    h->non_got_ref = TRUE;
   4105 	  break;
   4106 
   4107 	case R_PPC_PLTREL24:
   4108 	  if (h == NULL)
   4109 	    break;
   4110 	  /* Fall through */
   4111 	case R_PPC_PLT32:
   4112 	case R_PPC_PLTREL32:
   4113 	case R_PPC_PLT16_LO:
   4114 	case R_PPC_PLT16_HI:
   4115 	case R_PPC_PLT16_HA:
   4116 #ifdef DEBUG
   4117 	  fprintf (stderr, "Reloc requires a PLT entry\n");
   4118 #endif
   4119 	  /* This symbol requires a procedure linkage table entry.  We
   4120 	     actually build the entry in finish_dynamic_symbol,
   4121 	     because this might be a case of linking PIC code without
   4122 	     linking in any dynamic objects, in which case we don't
   4123 	     need to generate a procedure linkage table after all.  */
   4124 
   4125 	  if (h == NULL)
   4126 	    {
   4127 	      /* It does not make sense to have a procedure linkage
   4128 		 table entry for a local symbol.  */
   4129 	      info->callbacks->einfo (_("%P: %H: %s reloc against local symbol\n"),
   4130 				      abfd, sec, rel->r_offset,
   4131 				      ppc_elf_howto_table[r_type]->name);
   4132 	      bfd_set_error (bfd_error_bad_value);
   4133 	      return FALSE;
   4134 	    }
   4135 	  else
   4136 	    {
   4137 	      bfd_vma addend = 0;
   4138 
   4139 	      if (r_type == R_PPC_PLTREL24)
   4140 		{
   4141 		  ppc_elf_tdata (abfd)->makes_plt_call = 1;
   4142 		  if (info->shared)
   4143 		    addend = rel->r_addend;
   4144 		}
   4145 	      h->needs_plt = 1;
   4146 	      if (!update_plt_info (abfd, &h->plt.plist, got2, addend))
   4147 		return FALSE;
   4148 	    }
   4149 	  break;
   4150 
   4151 	  /* The following relocations don't need to propagate the
   4152 	     relocation if linking a shared object since they are
   4153 	     section relative.  */
   4154 	case R_PPC_SECTOFF:
   4155 	case R_PPC_SECTOFF_LO:
   4156 	case R_PPC_SECTOFF_HI:
   4157 	case R_PPC_SECTOFF_HA:
   4158 	case R_PPC_DTPREL16:
   4159 	case R_PPC_DTPREL16_LO:
   4160 	case R_PPC_DTPREL16_HI:
   4161 	case R_PPC_DTPREL16_HA:
   4162 	case R_PPC_TOC16:
   4163 	  break;
   4164 
   4165 	case R_PPC_REL16:
   4166 	case R_PPC_REL16_LO:
   4167 	case R_PPC_REL16_HI:
   4168 	case R_PPC_REL16_HA:
   4169 	  ppc_elf_tdata (abfd)->has_rel16 = 1;
   4170 	  break;
   4171 
   4172 	  /* These are just markers.  */
   4173 	case R_PPC_TLS:
   4174 	case R_PPC_EMB_MRKREF:
   4175 	case R_PPC_NONE:
   4176 	case R_PPC_max:
   4177 	case R_PPC_RELAX:
   4178 	case R_PPC_RELAX_PLT:
   4179 	case R_PPC_RELAX_PLTREL24:
   4180 	  break;
   4181 
   4182 	  /* These should only appear in dynamic objects.  */
   4183 	case R_PPC_COPY:
   4184 	case R_PPC_GLOB_DAT:
   4185 	case R_PPC_JMP_SLOT:
   4186 	case R_PPC_RELATIVE:
   4187 	case R_PPC_IRELATIVE:
   4188 	  break;
   4189 
   4190 	  /* These aren't handled yet.  We'll report an error later.  */
   4191 	case R_PPC_ADDR30:
   4192 	case R_PPC_EMB_RELSEC16:
   4193 	case R_PPC_EMB_RELST_LO:
   4194 	case R_PPC_EMB_RELST_HI:
   4195 	case R_PPC_EMB_RELST_HA:
   4196 	case R_PPC_EMB_BIT_FLD:
   4197 	  break;
   4198 
   4199 	  /* This refers only to functions defined in the shared library.  */
   4200 	case R_PPC_LOCAL24PC:
   4201 	  if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
   4202 	    {
   4203 	      htab->plt_type = PLT_OLD;
   4204 	      htab->old_bfd = abfd;
   4205 	    }
   4206 	  break;
   4207 
   4208 	  /* This relocation describes the C++ object vtable hierarchy.
   4209 	     Reconstruct it for later use during GC.  */
   4210 	case R_PPC_GNU_VTINHERIT:
   4211 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   4212 	    return FALSE;
   4213 	  break;
   4214 
   4215 	  /* This relocation describes which C++ vtable entries are actually
   4216 	     used.  Record for later use during GC.  */
   4217 	case R_PPC_GNU_VTENTRY:
   4218 	  BFD_ASSERT (h != NULL);
   4219 	  if (h != NULL
   4220 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   4221 	    return FALSE;
   4222 	  break;
   4223 
   4224 	  /* We shouldn't really be seeing these.  */
   4225 	case R_PPC_TPREL32:
   4226 	case R_PPC_TPREL16:
   4227 	case R_PPC_TPREL16_LO:
   4228 	case R_PPC_TPREL16_HI:
   4229 	case R_PPC_TPREL16_HA:
   4230 	  if (!info->executable)
   4231 	    info->flags |= DF_STATIC_TLS;
   4232 	  goto dodyn;
   4233 
   4234 	  /* Nor these.  */
   4235 	case R_PPC_DTPMOD32:
   4236 	case R_PPC_DTPREL32:
   4237 	  goto dodyn;
   4238 
   4239 	case R_PPC_REL32:
   4240 	  if (h == NULL
   4241 	      && got2 != NULL
   4242 	      && (sec->flags & SEC_CODE) != 0
   4243 	      && info->shared
   4244 	      && htab->plt_type == PLT_UNSET)
   4245 	    {
   4246 	      /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
   4247 		 the start of a function, which assembles to a REL32
   4248 		 reference to .got2.  If we detect one of these, then
   4249 		 force the old PLT layout because the linker cannot
   4250 		 reliably deduce the GOT pointer value needed for
   4251 		 PLT call stubs.  */
   4252 	      asection *s;
   4253 	      Elf_Internal_Sym *isym;
   4254 
   4255 	      isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   4256 					    abfd, r_symndx);
   4257 	      if (isym == NULL)
   4258 		return FALSE;
   4259 
   4260 	      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   4261 	      if (s == got2)
   4262 		{
   4263 		  htab->plt_type = PLT_OLD;
   4264 		  htab->old_bfd = abfd;
   4265 		}
   4266 	    }
   4267 	  if (h == NULL || h == htab->elf.hgot)
   4268 	    break;
   4269 	  /* fall through */
   4270 
   4271 	case R_PPC_ADDR32:
   4272 	case R_PPC_ADDR16:
   4273 	case R_PPC_ADDR16_LO:
   4274 	case R_PPC_ADDR16_HI:
   4275 	case R_PPC_ADDR16_HA:
   4276 	case R_PPC_UADDR32:
   4277 	case R_PPC_UADDR16:
   4278 	  if (h != NULL && !info->shared)
   4279 	    {
   4280 	      /* We may need a plt entry if the symbol turns out to be
   4281 		 a function defined in a dynamic object.  */
   4282 	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
   4283 		return FALSE;
   4284 
   4285 	      /* We may need a copy reloc too.  */
   4286 	      h->non_got_ref = 1;
   4287 	      h->pointer_equality_needed = 1;
   4288 	    }
   4289 	  goto dodyn;
   4290 
   4291 	case R_PPC_REL24:
   4292 	case R_PPC_REL14:
   4293 	case R_PPC_REL14_BRTAKEN:
   4294 	case R_PPC_REL14_BRNTAKEN:
   4295 	  if (h == NULL)
   4296 	    break;
   4297 	  if (h == htab->elf.hgot)
   4298 	    {
   4299 	      if (htab->plt_type == PLT_UNSET)
   4300 		{
   4301 		  htab->plt_type = PLT_OLD;
   4302 		  htab->old_bfd = abfd;
   4303 		}
   4304 	      break;
   4305 	    }
   4306 	  /* fall through */
   4307 
   4308 	case R_PPC_ADDR24:
   4309 	case R_PPC_ADDR14:
   4310 	case R_PPC_ADDR14_BRTAKEN:
   4311 	case R_PPC_ADDR14_BRNTAKEN:
   4312 	  if (h != NULL && !info->shared)
   4313 	    {
   4314 	      /* We may need a plt entry if the symbol turns out to be
   4315 		 a function defined in a dynamic object.  */
   4316 	      h->needs_plt = 1;
   4317 	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
   4318 		return FALSE;
   4319 	      break;
   4320 	    }
   4321 
   4322 	dodyn:
   4323 	  /* If we are creating a shared library, and this is a reloc
   4324 	     against a global symbol, or a non PC relative reloc
   4325 	     against a local symbol, then we need to copy the reloc
   4326 	     into the shared library.  However, if we are linking with
   4327 	     -Bsymbolic, we do not need to copy a reloc against a
   4328 	     global symbol which is defined in an object we are
   4329 	     including in the link (i.e., DEF_REGULAR is set).  At
   4330 	     this point we have not seen all the input files, so it is
   4331 	     possible that DEF_REGULAR is not set now but will be set
   4332 	     later (it is never cleared).  In case of a weak definition,
   4333 	     DEF_REGULAR may be cleared later by a strong definition in
   4334 	     a shared library.  We account for that possibility below by
   4335 	     storing information in the dyn_relocs field of the hash
   4336 	     table entry.  A similar situation occurs when creating
   4337 	     shared libraries and symbol visibility changes render the
   4338 	     symbol local.
   4339 
   4340 	     If on the other hand, we are creating an executable, we
   4341 	     may need to keep relocations for symbols satisfied by a
   4342 	     dynamic library if we manage to avoid copy relocs for the
   4343 	     symbol.  */
   4344 	  if ((info->shared
   4345 	       && (must_be_dyn_reloc (info, r_type)
   4346 		   || (h != NULL
   4347 		       && (! info->symbolic
   4348 			   || h->root.type == bfd_link_hash_defweak
   4349 			   || !h->def_regular))))
   4350 	      || (ELIMINATE_COPY_RELOCS
   4351 		  && !info->shared
   4352 		  && h != NULL
   4353 		  && (h->root.type == bfd_link_hash_defweak
   4354 		      || !h->def_regular)))
   4355 	    {
   4356 	      struct elf_dyn_relocs *p;
   4357 	      struct elf_dyn_relocs **rel_head;
   4358 
   4359 #ifdef DEBUG
   4360 	      fprintf (stderr,
   4361 		       "ppc_elf_check_relocs needs to "
   4362 		       "create relocation for %s\n",
   4363 		       (h && h->root.root.string
   4364 			? h->root.root.string : "<unknown>"));
   4365 #endif
   4366 	      if (sreloc == NULL)
   4367 		{
   4368 		  if (htab->elf.dynobj == NULL)
   4369 		    htab->elf.dynobj = abfd;
   4370 
   4371 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   4372 		    (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
   4373 
   4374 		  if (sreloc == NULL)
   4375 		    return FALSE;
   4376 		}
   4377 
   4378 	      /* If this is a global symbol, we count the number of
   4379 		 relocations we need for this symbol.  */
   4380 	      if (h != NULL)
   4381 		{
   4382 		  rel_head = &ppc_elf_hash_entry (h)->dyn_relocs;
   4383 		}
   4384 	      else
   4385 		{
   4386 		  /* Track dynamic relocs needed for local syms too.
   4387 		     We really need local syms available to do this
   4388 		     easily.  Oh well.  */
   4389 		  asection *s;
   4390 		  void *vpp;
   4391 		  Elf_Internal_Sym *isym;
   4392 
   4393 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   4394 						abfd, r_symndx);
   4395 		  if (isym == NULL)
   4396 		    return FALSE;
   4397 
   4398 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   4399 		  if (s == NULL)
   4400 		    s = sec;
   4401 
   4402 		  vpp = &elf_section_data (s)->local_dynrel;
   4403 		  rel_head = (struct elf_dyn_relocs **) vpp;
   4404 		}
   4405 
   4406 	      p = *rel_head;
   4407 	      if (p == NULL || p->sec != sec)
   4408 		{
   4409 		  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
   4410 		  if (p == NULL)
   4411 		    return FALSE;
   4412 		  p->next = *rel_head;
   4413 		  *rel_head = p;
   4414 		  p->sec = sec;
   4415 		  p->count = 0;
   4416 		  p->pc_count = 0;
   4417 		}
   4418 
   4419 	      p->count += 1;
   4420 	      if (!must_be_dyn_reloc (info, r_type))
   4421 		p->pc_count += 1;
   4422 	    }
   4423 
   4424 	  break;
   4425 	}
   4426     }
   4427 
   4428   return TRUE;
   4429 }
   4430 
   4431 
   4433 /* Merge object attributes from IBFD into OBFD.  Raise an error if
   4434    there are conflicting attributes.  */
   4435 static bfd_boolean
   4436 ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
   4437 {
   4438   obj_attribute *in_attr, *in_attrs;
   4439   obj_attribute *out_attr, *out_attrs;
   4440 
   4441   if (!elf_known_obj_attributes_proc (obfd)[0].i)
   4442     {
   4443       /* This is the first object.  Copy the attributes.  */
   4444       _bfd_elf_copy_obj_attributes (ibfd, obfd);
   4445 
   4446       /* Use the Tag_null value to indicate the attributes have been
   4447 	 initialized.  */
   4448       elf_known_obj_attributes_proc (obfd)[0].i = 1;
   4449 
   4450       return TRUE;
   4451     }
   4452 
   4453   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
   4454   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
   4455 
   4456   /* Check for conflicting Tag_GNU_Power_ABI_FP attributes and merge
   4457      non-conflicting ones.  */
   4458   in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
   4459   out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
   4460   if (in_attr->i != out_attr->i)
   4461     {
   4462       out_attr->type = 1;
   4463       if (out_attr->i == 0)
   4464 	out_attr->i = in_attr->i;
   4465       else if (in_attr->i == 0)
   4466 	;
   4467       else if (out_attr->i == 1 && in_attr->i == 2)
   4468 	_bfd_error_handler
   4469 	  (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
   4470       else if (out_attr->i == 1 && in_attr->i == 3)
   4471 	_bfd_error_handler
   4472 	  (_("Warning: %B uses double-precision hard float, %B uses single-precision hard float"),
   4473 	  obfd, ibfd);
   4474       else if (out_attr->i == 3 && in_attr->i == 1)
   4475 	_bfd_error_handler
   4476 	  (_("Warning: %B uses double-precision hard float, %B uses single-precision hard float"),
   4477 	  ibfd, obfd);
   4478       else if (out_attr->i == 3 && in_attr->i == 2)
   4479 	_bfd_error_handler
   4480 	  (_("Warning: %B uses soft float, %B uses single-precision hard float"),
   4481 	  ibfd, obfd);
   4482       else if (out_attr->i == 2 && (in_attr->i == 1 || in_attr->i == 3))
   4483 	_bfd_error_handler
   4484 	  (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
   4485       else if (in_attr->i > 3)
   4486 	_bfd_error_handler
   4487 	  (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
   4488 	   in_attr->i);
   4489       else
   4490 	_bfd_error_handler
   4491 	  (_("Warning: %B uses unknown floating point ABI %d"), obfd,
   4492 	   out_attr->i);
   4493     }
   4494 
   4495   /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
   4496      merge non-conflicting ones.  */
   4497   in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
   4498   out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
   4499   if (in_attr->i != out_attr->i)
   4500     {
   4501       const char *in_abi = NULL, *out_abi = NULL;
   4502 
   4503       switch (in_attr->i)
   4504 	{
   4505 	case 1: in_abi = "generic"; break;
   4506 	case 2: in_abi = "AltiVec"; break;
   4507 	case 3: in_abi = "SPE"; break;
   4508 	}
   4509 
   4510       switch (out_attr->i)
   4511 	{
   4512 	case 1: out_abi = "generic"; break;
   4513 	case 2: out_abi = "AltiVec"; break;
   4514 	case 3: out_abi = "SPE"; break;
   4515 	}
   4516 
   4517       out_attr->type = 1;
   4518       if (out_attr->i == 0)
   4519 	out_attr->i = in_attr->i;
   4520       else if (in_attr->i == 0)
   4521 	;
   4522       /* For now, allow generic to transition to AltiVec or SPE
   4523 	 without a warning.  If GCC marked files with their stack
   4524 	 alignment and used don't-care markings for files which are
   4525 	 not affected by the vector ABI, we could warn about this
   4526 	 case too.  */
   4527       else if (out_attr->i == 1)
   4528 	out_attr->i = in_attr->i;
   4529       else if (in_attr->i == 1)
   4530 	;
   4531       else if (in_abi == NULL)
   4532 	_bfd_error_handler
   4533 	  (_("Warning: %B uses unknown vector ABI %d"), ibfd,
   4534 	   in_attr->i);
   4535       else if (out_abi == NULL)
   4536 	_bfd_error_handler
   4537 	  (_("Warning: %B uses unknown vector ABI %d"), obfd,
   4538 	   in_attr->i);
   4539       else
   4540 	_bfd_error_handler
   4541 	  (_("Warning: %B uses vector ABI \"%s\", %B uses \"%s\""),
   4542 	   ibfd, obfd, in_abi, out_abi);
   4543     }
   4544 
   4545   /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
   4546      and merge non-conflicting ones.  */
   4547   in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
   4548   out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
   4549   if (in_attr->i != out_attr->i)
   4550     {
   4551       out_attr->type = 1;
   4552       if (out_attr->i == 0)
   4553        out_attr->i = in_attr->i;
   4554       else if (in_attr->i == 0)
   4555        ;
   4556       else if (out_attr->i == 1 && in_attr->i == 2)
   4557        _bfd_error_handler
   4558          (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), obfd, ibfd);
   4559       else if (out_attr->i == 2 && in_attr->i == 1)
   4560        _bfd_error_handler
   4561          (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), ibfd, obfd);
   4562       else if (in_attr->i > 2)
   4563        _bfd_error_handler
   4564          (_("Warning: %B uses unknown small structure return convention %d"), ibfd,
   4565           in_attr->i);
   4566       else
   4567        _bfd_error_handler
   4568          (_("Warning: %B uses unknown small structure return convention %d"), obfd,
   4569           out_attr->i);
   4570     }
   4571 
   4572   /* Merge Tag_compatibility attributes and any common GNU ones.  */
   4573   _bfd_elf_merge_object_attributes (ibfd, obfd);
   4574 
   4575   return TRUE;
   4576 }
   4577 
   4578 /* Merge backend specific data from an object file to the output
   4579    object file when linking.  */
   4580 
   4581 static bfd_boolean
   4582 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   4583 {
   4584   flagword old_flags;
   4585   flagword new_flags;
   4586   bfd_boolean error;
   4587 
   4588   if (!is_ppc_elf (ibfd) || !is_ppc_elf (obfd))
   4589     return TRUE;
   4590 
   4591   /* Check if we have the same endianness.  */
   4592   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
   4593     return FALSE;
   4594 
   4595   if (!ppc_elf_merge_obj_attributes (ibfd, obfd))
   4596     return FALSE;
   4597 
   4598   new_flags = elf_elfheader (ibfd)->e_flags;
   4599   old_flags = elf_elfheader (obfd)->e_flags;
   4600   if (!elf_flags_init (obfd))
   4601     {
   4602       /* First call, no flags set.  */
   4603       elf_flags_init (obfd) = TRUE;
   4604       elf_elfheader (obfd)->e_flags = new_flags;
   4605     }
   4606 
   4607   /* Compatible flags are ok.  */
   4608   else if (new_flags == old_flags)
   4609     ;
   4610 
   4611   /* Incompatible flags.  */
   4612   else
   4613     {
   4614       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
   4615 	 to be linked with either.  */
   4616       error = FALSE;
   4617       if ((new_flags & EF_PPC_RELOCATABLE) != 0
   4618 	  && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
   4619 	{
   4620 	  error = TRUE;
   4621 	  (*_bfd_error_handler)
   4622 	    (_("%B: compiled with -mrelocatable and linked with "
   4623 	       "modules compiled normally"), ibfd);
   4624 	}
   4625       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
   4626 	       && (old_flags & EF_PPC_RELOCATABLE) != 0)
   4627 	{
   4628 	  error = TRUE;
   4629 	  (*_bfd_error_handler)
   4630 	    (_("%B: compiled normally and linked with "
   4631 	       "modules compiled with -mrelocatable"), ibfd);
   4632 	}
   4633 
   4634       /* The output is -mrelocatable-lib iff both the input files are.  */
   4635       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
   4636 	elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
   4637 
   4638       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
   4639 	 but each input file is either -mrelocatable or -mrelocatable-lib.  */
   4640       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
   4641 	  && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
   4642 	  && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
   4643 	elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
   4644 
   4645       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
   4646 	 any module uses it.  */
   4647       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
   4648 
   4649       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
   4650       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
   4651 
   4652       /* Warn about any other mismatches.  */
   4653       if (new_flags != old_flags)
   4654 	{
   4655 	  error = TRUE;
   4656 	  (*_bfd_error_handler)
   4657 	    (_("%B: uses different e_flags (0x%lx) fields "
   4658 	       "than previous modules (0x%lx)"),
   4659 	     ibfd, (long) new_flags, (long) old_flags);
   4660 	}
   4661 
   4662       if (error)
   4663 	{
   4664 	  bfd_set_error (bfd_error_bad_value);
   4665 	  return FALSE;
   4666 	}
   4667     }
   4668 
   4669   return TRUE;
   4670 }
   4671 
   4672 static void
   4673 ppc_elf_vle_split16 (bfd *output_bfd, bfd_byte *contents,
   4674                  bfd_vma offset, bfd_vma relocation,
   4675 		 split16_format_type split16_format)
   4676 
   4677 {
   4678   bfd_vma insn, top5, bottom11;
   4679 
   4680   insn = bfd_get_32 (output_bfd, contents + offset);
   4681   top5 = relocation >> 11;
   4682   top5 = top5 << (split16_format == split16a_type ? 20 : 16);
   4683   bottom11 = relocation & 0x7ff;
   4684   insn |= top5;
   4685   insn |= bottom11;
   4686   bfd_put_32 (output_bfd, insn, contents + offset);
   4687 }
   4688 
   4689 
   4690 /* Choose which PLT scheme to use, and set .plt flags appropriately.
   4692    Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
   4693 int
   4694 ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
   4695 			   struct bfd_link_info *info,
   4696 			   enum ppc_elf_plt_type plt_style,
   4697 			   int emit_stub_syms)
   4698 {
   4699   struct ppc_elf_link_hash_table *htab;
   4700   flagword flags;
   4701 
   4702   htab = ppc_elf_hash_table (info);
   4703 
   4704   htab->emit_stub_syms = emit_stub_syms;
   4705 
   4706   if (htab->plt_type == PLT_UNSET)
   4707     {
   4708       struct elf_link_hash_entry *h;
   4709 
   4710       if (plt_style == PLT_OLD)
   4711 	htab->plt_type = PLT_OLD;
   4712       else if (info->shared
   4713 	       && htab->elf.dynamic_sections_created
   4714 	       && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
   4715 					     FALSE, FALSE, TRUE)) != NULL
   4716 	       && (h->type == STT_FUNC
   4717 		   || h->needs_plt)
   4718 	       && h->ref_regular
   4719 	       && !(SYMBOL_CALLS_LOCAL (info, h)
   4720 		    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   4721 			&& h->root.type == bfd_link_hash_undefweak)))
   4722 	{
   4723 	  /* Profiling of shared libs (and pies) is not supported with
   4724 	     secure plt, because ppc32 does profiling before a
   4725 	     function prologue and a secure plt pic call stubs needs
   4726 	     r30 to be set up.  */
   4727 	  htab->plt_type = PLT_OLD;
   4728 	}
   4729       else
   4730 	{
   4731 	  bfd *ibfd;
   4732 	  enum ppc_elf_plt_type plt_type = plt_style;
   4733 
   4734 	  /* Look through the reloc flags left by ppc_elf_check_relocs.
   4735 	     Use the old style bss plt if a file makes plt calls
   4736 	     without using the new relocs, and if ld isn't given
   4737 	     --secure-plt and we never see REL16 relocs.  */
   4738 	  if (plt_type == PLT_UNSET)
   4739 	    plt_type = PLT_OLD;
   4740 	  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
   4741 	    if (is_ppc_elf (ibfd))
   4742 	      {
   4743 		if (ppc_elf_tdata (ibfd)->has_rel16)
   4744 		  plt_type = PLT_NEW;
   4745 		else if (ppc_elf_tdata (ibfd)->makes_plt_call)
   4746 		  {
   4747 		    plt_type = PLT_OLD;
   4748 		    htab->old_bfd = ibfd;
   4749 		    break;
   4750 		  }
   4751 	      }
   4752 	  htab->plt_type = plt_type;
   4753 	}
   4754     }
   4755   if (htab->plt_type == PLT_OLD && plt_style == PLT_NEW)
   4756     {
   4757       if (htab->old_bfd != NULL)
   4758 	info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"),
   4759 				htab->old_bfd);
   4760       else
   4761 	info->callbacks->einfo (_("%P: bss-plt forced by profiling\n"));
   4762     }
   4763 
   4764   BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
   4765 
   4766   if (htab->plt_type == PLT_NEW)
   4767     {
   4768       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
   4769 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   4770 
   4771       /* The new PLT is a loaded section.  */
   4772       if (htab->plt != NULL
   4773 	  && !bfd_set_section_flags (htab->elf.dynobj, htab->plt, flags))
   4774 	return -1;
   4775 
   4776       /* The new GOT is not executable.  */
   4777       if (htab->got != NULL
   4778 	  && !bfd_set_section_flags (htab->elf.dynobj, htab->got, flags))
   4779 	return -1;
   4780     }
   4781   else
   4782     {
   4783       /* Stop an unused .glink section from affecting .text alignment.  */
   4784       if (htab->glink != NULL
   4785 	  && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
   4786 	return -1;
   4787     }
   4788   return htab->plt_type == PLT_NEW;
   4789 }
   4790 
   4791 /* Return the section that should be marked against GC for a given
   4793    relocation.  */
   4794 
   4795 static asection *
   4796 ppc_elf_gc_mark_hook (asection *sec,
   4797 		      struct bfd_link_info *info,
   4798 		      Elf_Internal_Rela *rel,
   4799 		      struct elf_link_hash_entry *h,
   4800 		      Elf_Internal_Sym *sym)
   4801 {
   4802   if (h != NULL)
   4803     switch (ELF32_R_TYPE (rel->r_info))
   4804       {
   4805       case R_PPC_GNU_VTINHERIT:
   4806       case R_PPC_GNU_VTENTRY:
   4807 	return NULL;
   4808       }
   4809 
   4810   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   4811 }
   4812 
   4813 /* Update the got, plt and dynamic reloc reference counts for the
   4814    section being removed.  */
   4815 
   4816 static bfd_boolean
   4817 ppc_elf_gc_sweep_hook (bfd *abfd,
   4818 		       struct bfd_link_info *info,
   4819 		       asection *sec,
   4820 		       const Elf_Internal_Rela *relocs)
   4821 {
   4822   struct ppc_elf_link_hash_table *htab;
   4823   Elf_Internal_Shdr *symtab_hdr;
   4824   struct elf_link_hash_entry **sym_hashes;
   4825   bfd_signed_vma *local_got_refcounts;
   4826   const Elf_Internal_Rela *rel, *relend;
   4827   asection *got2;
   4828 
   4829   if (info->relocatable)
   4830     return TRUE;
   4831 
   4832   if ((sec->flags & SEC_ALLOC) == 0)
   4833     return TRUE;
   4834 
   4835   elf_section_data (sec)->local_dynrel = NULL;
   4836 
   4837   htab = ppc_elf_hash_table (info);
   4838   symtab_hdr = &elf_symtab_hdr (abfd);
   4839   sym_hashes = elf_sym_hashes (abfd);
   4840   local_got_refcounts = elf_local_got_refcounts (abfd);
   4841   got2 = bfd_get_section_by_name (abfd, ".got2");
   4842 
   4843   relend = relocs + sec->reloc_count;
   4844   for (rel = relocs; rel < relend; rel++)
   4845     {
   4846       unsigned long r_symndx;
   4847       enum elf_ppc_reloc_type r_type;
   4848       struct elf_link_hash_entry *h = NULL;
   4849 
   4850       r_symndx = ELF32_R_SYM (rel->r_info);
   4851       if (r_symndx >= symtab_hdr->sh_info)
   4852 	{
   4853 	  struct elf_dyn_relocs **pp, *p;
   4854 	  struct ppc_elf_link_hash_entry *eh;
   4855 
   4856 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   4857 	  while (h->root.type == bfd_link_hash_indirect
   4858 		 || h->root.type == bfd_link_hash_warning)
   4859 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   4860 	  eh = (struct ppc_elf_link_hash_entry *) h;
   4861 
   4862 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
   4863 	    if (p->sec == sec)
   4864 	      {
   4865 		/* Everything must go for SEC.  */
   4866 		*pp = p->next;
   4867 		break;
   4868 	      }
   4869 	}
   4870 
   4871       r_type = ELF32_R_TYPE (rel->r_info);
   4872       if (!htab->is_vxworks
   4873 	  && h == NULL
   4874 	  && local_got_refcounts != NULL
   4875 	  && (!info->shared
   4876 	      || is_branch_reloc (r_type)))
   4877 	{
   4878 	  struct plt_entry **local_plt = (struct plt_entry **)
   4879 	    (local_got_refcounts + symtab_hdr->sh_info);
   4880 	  char *local_got_tls_masks = (char *)
   4881 	    (local_plt + symtab_hdr->sh_info);
   4882 	  if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
   4883 	    {
   4884 	      struct plt_entry **ifunc = local_plt + r_symndx;
   4885 	      bfd_vma addend = 0;
   4886 	      struct plt_entry *ent;
   4887 
   4888 	      if (r_type == R_PPC_PLTREL24 && info->shared)
   4889 		addend = rel->r_addend;
   4890 	      ent = find_plt_ent (ifunc, got2, addend);
   4891 	      if (ent->plt.refcount > 0)
   4892 		ent->plt.refcount -= 1;
   4893 	      continue;
   4894 	    }
   4895 	}
   4896 
   4897       switch (r_type)
   4898 	{
   4899 	case R_PPC_GOT_TLSLD16:
   4900 	case R_PPC_GOT_TLSLD16_LO:
   4901 	case R_PPC_GOT_TLSLD16_HI:
   4902 	case R_PPC_GOT_TLSLD16_HA:
   4903 	case R_PPC_GOT_TLSGD16:
   4904 	case R_PPC_GOT_TLSGD16_LO:
   4905 	case R_PPC_GOT_TLSGD16_HI:
   4906 	case R_PPC_GOT_TLSGD16_HA:
   4907 	case R_PPC_GOT_TPREL16:
   4908 	case R_PPC_GOT_TPREL16_LO:
   4909 	case R_PPC_GOT_TPREL16_HI:
   4910 	case R_PPC_GOT_TPREL16_HA:
   4911 	case R_PPC_GOT_DTPREL16:
   4912 	case R_PPC_GOT_DTPREL16_LO:
   4913 	case R_PPC_GOT_DTPREL16_HI:
   4914 	case R_PPC_GOT_DTPREL16_HA:
   4915 	case R_PPC_GOT16:
   4916 	case R_PPC_GOT16_LO:
   4917 	case R_PPC_GOT16_HI:
   4918 	case R_PPC_GOT16_HA:
   4919 	  if (h != NULL)
   4920 	    {
   4921 	      if (h->got.refcount > 0)
   4922 		h->got.refcount--;
   4923 	      if (!info->shared)
   4924 		{
   4925 		  struct plt_entry *ent;
   4926 
   4927 		  ent = find_plt_ent (&h->plt.plist, NULL, 0);
   4928 		  if (ent != NULL && ent->plt.refcount > 0)
   4929 		    ent->plt.refcount -= 1;
   4930 		}
   4931 	    }
   4932 	  else if (local_got_refcounts != NULL)
   4933 	    {
   4934 	      if (local_got_refcounts[r_symndx] > 0)
   4935 		local_got_refcounts[r_symndx]--;
   4936 	    }
   4937 	  break;
   4938 
   4939 	case R_PPC_REL24:
   4940 	case R_PPC_REL14:
   4941 	case R_PPC_REL14_BRTAKEN:
   4942 	case R_PPC_REL14_BRNTAKEN:
   4943 	case R_PPC_REL32:
   4944 	  if (h == NULL || h == htab->elf.hgot)
   4945 	    break;
   4946 	  /* Fall thru */
   4947 
   4948 	case R_PPC_ADDR32:
   4949 	case R_PPC_ADDR24:
   4950 	case R_PPC_ADDR16:
   4951 	case R_PPC_ADDR16_LO:
   4952 	case R_PPC_ADDR16_HI:
   4953 	case R_PPC_ADDR16_HA:
   4954 	case R_PPC_ADDR14:
   4955 	case R_PPC_ADDR14_BRTAKEN:
   4956 	case R_PPC_ADDR14_BRNTAKEN:
   4957 	case R_PPC_UADDR32:
   4958 	case R_PPC_UADDR16:
   4959 	  if (info->shared)
   4960 	    break;
   4961 
   4962 	case R_PPC_PLT32:
   4963 	case R_PPC_PLTREL24:
   4964 	case R_PPC_PLTREL32:
   4965 	case R_PPC_PLT16_LO:
   4966 	case R_PPC_PLT16_HI:
   4967 	case R_PPC_PLT16_HA:
   4968 	  if (h != NULL)
   4969 	    {
   4970 	      bfd_vma addend = 0;
   4971 	      struct plt_entry *ent;
   4972 
   4973 	      if (r_type == R_PPC_PLTREL24 && info->shared)
   4974 		addend = rel->r_addend;
   4975 	      ent = find_plt_ent (&h->plt.plist, got2, addend);
   4976 	      if (ent != NULL && ent->plt.refcount > 0)
   4977 		ent->plt.refcount -= 1;
   4978 	    }
   4979 	  break;
   4980 
   4981 	default:
   4982 	  break;
   4983 	}
   4984     }
   4985   return TRUE;
   4986 }
   4987 
   4988 /* Set plt output section type, htab->tls_get_addr, and call the
   4990    generic ELF tls_setup function.  */
   4991 
   4992 asection *
   4993 ppc_elf_tls_setup (bfd *obfd,
   4994 		   struct bfd_link_info *info,
   4995 		   int no_tls_get_addr_opt)
   4996 {
   4997   struct ppc_elf_link_hash_table *htab;
   4998 
   4999   htab = ppc_elf_hash_table (info);
   5000   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
   5001 					     FALSE, FALSE, TRUE);
   5002   if (!no_tls_get_addr_opt)
   5003     {
   5004       struct elf_link_hash_entry *opt, *tga;
   5005       opt = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
   5006 				  FALSE, FALSE, TRUE);
   5007       if (opt != NULL
   5008 	  && (opt->root.type == bfd_link_hash_defined
   5009 	      || opt->root.type == bfd_link_hash_defweak))
   5010 	{
   5011 	  /* If glibc supports an optimized __tls_get_addr call stub,
   5012 	     signalled by the presence of __tls_get_addr_opt, and we'll
   5013 	     be calling __tls_get_addr via a plt call stub, then
   5014 	     make __tls_get_addr point to __tls_get_addr_opt.  */
   5015 	  tga = htab->tls_get_addr;
   5016 	  if (htab->elf.dynamic_sections_created
   5017 	      && tga != NULL
   5018 	      && (tga->type == STT_FUNC
   5019 		  || tga->needs_plt)
   5020 	      && !(SYMBOL_CALLS_LOCAL (info, tga)
   5021 		   || (ELF_ST_VISIBILITY (tga->other) != STV_DEFAULT
   5022 		       && tga->root.type == bfd_link_hash_undefweak)))
   5023 	    {
   5024 	      struct plt_entry *ent;
   5025 	      for (ent = tga->plt.plist; ent != NULL; ent = ent->next)
   5026 		if (ent->plt.refcount > 0)
   5027 		  break;
   5028 	      if (ent != NULL)
   5029 		{
   5030 		  tga->root.type = bfd_link_hash_indirect;
   5031 		  tga->root.u.i.link = &opt->root;
   5032 		  ppc_elf_copy_indirect_symbol (info, opt, tga);
   5033 		  if (opt->dynindx != -1)
   5034 		    {
   5035 		      /* Use __tls_get_addr_opt in dynamic relocations.  */
   5036 		      opt->dynindx = -1;
   5037 		      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
   5038 					      opt->dynstr_index);
   5039 		      if (!bfd_elf_link_record_dynamic_symbol (info, opt))
   5040 			return FALSE;
   5041 		    }
   5042 		  htab->tls_get_addr = opt;
   5043 		}
   5044 	    }
   5045 	}
   5046       else
   5047 	no_tls_get_addr_opt = TRUE;
   5048     }
   5049   htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
   5050   if (htab->plt_type == PLT_NEW
   5051       && htab->plt != NULL
   5052       && htab->plt->output_section != NULL)
   5053     {
   5054       elf_section_type (htab->plt->output_section) = SHT_PROGBITS;
   5055       elf_section_flags (htab->plt->output_section) = SHF_ALLOC + SHF_WRITE;
   5056     }
   5057 
   5058   return _bfd_elf_tls_setup (obfd, info);
   5059 }
   5060 
   5061 /* Return TRUE iff REL is a branch reloc with a global symbol matching
   5062    HASH.  */
   5063 
   5064 static bfd_boolean
   5065 branch_reloc_hash_match (const bfd *ibfd,
   5066 			 const Elf_Internal_Rela *rel,
   5067 			 const struct elf_link_hash_entry *hash)
   5068 {
   5069   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
   5070   enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
   5071   unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
   5072 
   5073   if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
   5074     {
   5075       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
   5076       struct elf_link_hash_entry *h;
   5077 
   5078       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   5079       while (h->root.type == bfd_link_hash_indirect
   5080 	     || h->root.type == bfd_link_hash_warning)
   5081 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
   5082       if (h == hash)
   5083 	return TRUE;
   5084     }
   5085   return FALSE;
   5086 }
   5087 
   5088 /* Run through all the TLS relocs looking for optimization
   5089    opportunities.  */
   5090 
   5091 bfd_boolean
   5092 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
   5093 		      struct bfd_link_info *info)
   5094 {
   5095   bfd *ibfd;
   5096   asection *sec;
   5097   struct ppc_elf_link_hash_table *htab;
   5098   int pass;
   5099 
   5100   if (info->relocatable || !info->executable)
   5101     return TRUE;
   5102 
   5103   htab = ppc_elf_hash_table (info);
   5104   if (htab == NULL)
   5105     return FALSE;
   5106 
   5107   /* Make two passes through the relocs.  First time check that tls
   5108      relocs involved in setting up a tls_get_addr call are indeed
   5109      followed by such a call.  If they are not, don't do any tls
   5110      optimization.  On the second pass twiddle tls_mask flags to
   5111      notify relocate_section that optimization can be done, and
   5112      adjust got and plt refcounts.  */
   5113   for (pass = 0; pass < 2; ++pass)
   5114     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   5115       {
   5116 	Elf_Internal_Sym *locsyms = NULL;
   5117 	Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
   5118 	asection *got2 = bfd_get_section_by_name (ibfd, ".got2");
   5119 
   5120 	for (sec = ibfd->sections; sec != NULL; sec = sec->next)
   5121 	  if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
   5122 	    {
   5123 	      Elf_Internal_Rela *relstart, *rel, *relend;
   5124 	      int expecting_tls_get_addr = 0;
   5125 
   5126 	      /* Read the relocations.  */
   5127 	      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
   5128 						    info->keep_memory);
   5129 	      if (relstart == NULL)
   5130 		return FALSE;
   5131 
   5132 	      relend = relstart + sec->reloc_count;
   5133 	      for (rel = relstart; rel < relend; rel++)
   5134 		{
   5135 		  enum elf_ppc_reloc_type r_type;
   5136 		  unsigned long r_symndx;
   5137 		  struct elf_link_hash_entry *h = NULL;
   5138 		  char *tls_mask;
   5139 		  char tls_set, tls_clear;
   5140 		  bfd_boolean is_local;
   5141 		  bfd_signed_vma *got_count;
   5142 
   5143 		  r_symndx = ELF32_R_SYM (rel->r_info);
   5144 		  if (r_symndx >= symtab_hdr->sh_info)
   5145 		    {
   5146 		      struct elf_link_hash_entry **sym_hashes;
   5147 
   5148 		      sym_hashes = elf_sym_hashes (ibfd);
   5149 		      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   5150 		      while (h->root.type == bfd_link_hash_indirect
   5151 			     || h->root.type == bfd_link_hash_warning)
   5152 			h = (struct elf_link_hash_entry *) h->root.u.i.link;
   5153 		    }
   5154 
   5155 		  is_local = FALSE;
   5156 		  if (h == NULL
   5157 		      || !h->def_dynamic)
   5158 		    is_local = TRUE;
   5159 
   5160 		  r_type = ELF32_R_TYPE (rel->r_info);
   5161 		  /* If this section has old-style __tls_get_addr calls
   5162 		     without marker relocs, then check that each
   5163 		     __tls_get_addr call reloc is preceded by a reloc
   5164 		     that conceivably belongs to the __tls_get_addr arg
   5165 		     setup insn.  If we don't find matching arg setup
   5166 		     relocs, don't do any tls optimization.  */
   5167 		  if (pass == 0
   5168 		      && sec->has_tls_get_addr_call
   5169 		      && h != NULL
   5170 		      && h == htab->tls_get_addr
   5171 		      && !expecting_tls_get_addr
   5172 		      && is_branch_reloc (r_type))
   5173 		    {
   5174 		      info->callbacks->minfo ("%H __tls_get_addr lost arg, "
   5175 					      "TLS optimization disabled\n",
   5176 					      ibfd, sec, rel->r_offset);
   5177 		      if (elf_section_data (sec)->relocs != relstart)
   5178 			free (relstart);
   5179 		      return TRUE;
   5180 		    }
   5181 
   5182 		  expecting_tls_get_addr = 0;
   5183 		  switch (r_type)
   5184 		    {
   5185 		    case R_PPC_GOT_TLSLD16:
   5186 		    case R_PPC_GOT_TLSLD16_LO:
   5187 		      expecting_tls_get_addr = 1;
   5188 		      /* Fall thru */
   5189 
   5190 		    case R_PPC_GOT_TLSLD16_HI:
   5191 		    case R_PPC_GOT_TLSLD16_HA:
   5192 		      /* These relocs should never be against a symbol
   5193 			 defined in a shared lib.  Leave them alone if
   5194 			 that turns out to be the case.  */
   5195 		      if (!is_local)
   5196 			continue;
   5197 
   5198 		      /* LD -> LE */
   5199 		      tls_set = 0;
   5200 		      tls_clear = TLS_LD;
   5201 		      break;
   5202 
   5203 		    case R_PPC_GOT_TLSGD16:
   5204 		    case R_PPC_GOT_TLSGD16_LO:
   5205 		      expecting_tls_get_addr = 1;
   5206 		      /* Fall thru */
   5207 
   5208 		    case R_PPC_GOT_TLSGD16_HI:
   5209 		    case R_PPC_GOT_TLSGD16_HA:
   5210 		      if (is_local)
   5211 			/* GD -> LE */
   5212 			tls_set = 0;
   5213 		      else
   5214 			/* GD -> IE */
   5215 			tls_set = TLS_TLS | TLS_TPRELGD;
   5216 		      tls_clear = TLS_GD;
   5217 		      break;
   5218 
   5219 		    case R_PPC_GOT_TPREL16:
   5220 		    case R_PPC_GOT_TPREL16_LO:
   5221 		    case R_PPC_GOT_TPREL16_HI:
   5222 		    case R_PPC_GOT_TPREL16_HA:
   5223 		      if (is_local)
   5224 			{
   5225 			  /* IE -> LE */
   5226 			  tls_set = 0;
   5227 			  tls_clear = TLS_TPREL;
   5228 			  break;
   5229 			}
   5230 		      else
   5231 			continue;
   5232 
   5233 		    case R_PPC_TLSGD:
   5234 		    case R_PPC_TLSLD:
   5235 		      expecting_tls_get_addr = 2;
   5236 		      tls_set = 0;
   5237 		      tls_clear = 0;
   5238 		      break;
   5239 
   5240 		    default:
   5241 		      continue;
   5242 		    }
   5243 
   5244 		  if (pass == 0)
   5245 		    {
   5246 		      if (!expecting_tls_get_addr
   5247 			  || (expecting_tls_get_addr == 1
   5248 			      && !sec->has_tls_get_addr_call))
   5249 			continue;
   5250 
   5251 		      if (rel + 1 < relend
   5252 			  && branch_reloc_hash_match (ibfd, rel + 1,
   5253 						      htab->tls_get_addr))
   5254 			continue;
   5255 
   5256 		      /* Uh oh, we didn't find the expected call.  We
   5257 			 could just mark this symbol to exclude it
   5258 			 from tls optimization but it's safer to skip
   5259 			 the entire optimization.  */
   5260 		      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
   5261 						"TLS optimization disabled\n"),
   5262 					      ibfd, sec, rel->r_offset);
   5263 		      if (elf_section_data (sec)->relocs != relstart)
   5264 			free (relstart);
   5265 		      return TRUE;
   5266 		    }
   5267 
   5268 		  if (expecting_tls_get_addr)
   5269 		    {
   5270 		      struct plt_entry *ent;
   5271 		      bfd_vma addend = 0;
   5272 
   5273 		      if (info->shared
   5274 			  && ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTREL24)
   5275 			addend = rel[1].r_addend;
   5276 		      ent = find_plt_ent (&htab->tls_get_addr->plt.plist,
   5277 					  got2, addend);
   5278 		      if (ent != NULL && ent->plt.refcount > 0)
   5279 			ent->plt.refcount -= 1;
   5280 
   5281 		      if (expecting_tls_get_addr == 2)
   5282 			continue;
   5283 		    }
   5284 
   5285 		  if (h != NULL)
   5286 		    {
   5287 		      tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
   5288 		      got_count = &h->got.refcount;
   5289 		    }
   5290 		  else
   5291 		    {
   5292 		      bfd_signed_vma *lgot_refs;
   5293 		      struct plt_entry **local_plt;
   5294 		      char *lgot_masks;
   5295 
   5296 		      if (locsyms == NULL)
   5297 			{
   5298 			  locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
   5299 			  if (locsyms == NULL)
   5300 			    locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
   5301 							    symtab_hdr->sh_info,
   5302 							    0, NULL, NULL, NULL);
   5303 			  if (locsyms == NULL)
   5304 			    {
   5305 			      if (elf_section_data (sec)->relocs != relstart)
   5306 				free (relstart);
   5307 			      return FALSE;
   5308 			    }
   5309 			}
   5310 		      lgot_refs = elf_local_got_refcounts (ibfd);
   5311 		      if (lgot_refs == NULL)
   5312 			abort ();
   5313 		      local_plt = (struct plt_entry **)
   5314 			(lgot_refs + symtab_hdr->sh_info);
   5315 		      lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
   5316 		      tls_mask = &lgot_masks[r_symndx];
   5317 		      got_count = &lgot_refs[r_symndx];
   5318 		    }
   5319 
   5320 		  if (tls_set == 0)
   5321 		    {
   5322 		      /* We managed to get rid of a got entry.  */
   5323 		      if (*got_count > 0)
   5324 			*got_count -= 1;
   5325 		    }
   5326 
   5327 		  *tls_mask |= tls_set;
   5328 		  *tls_mask &= ~tls_clear;
   5329 		}
   5330 
   5331 	      if (elf_section_data (sec)->relocs != relstart)
   5332 		free (relstart);
   5333 	    }
   5334 
   5335 	if (locsyms != NULL
   5336 	    && (symtab_hdr->contents != (unsigned char *) locsyms))
   5337 	  {
   5338 	    if (!info->keep_memory)
   5339 	      free (locsyms);
   5340 	    else
   5341 	      symtab_hdr->contents = (unsigned char *) locsyms;
   5342 	  }
   5343       }
   5344   return TRUE;
   5345 }
   5346 
   5347 /* Return true if we have dynamic relocs that apply to read-only sections.  */
   5349 
   5350 static bfd_boolean
   5351 readonly_dynrelocs (struct elf_link_hash_entry *h)
   5352 {
   5353   struct elf_dyn_relocs *p;
   5354 
   5355   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
   5356     {
   5357       asection *s = p->sec->output_section;
   5358 
   5359       if (s != NULL
   5360 	  && ((s->flags & (SEC_READONLY | SEC_ALLOC))
   5361 	      == (SEC_READONLY | SEC_ALLOC)))
   5362 	return TRUE;
   5363     }
   5364   return FALSE;
   5365 }
   5366 
   5367 /* Adjust a symbol defined by a dynamic object and referenced by a
   5368    regular object.  The current definition is in some section of the
   5369    dynamic object, but we're not including those sections.  We have to
   5370    change the definition to something the rest of the link can
   5371    understand.  */
   5372 
   5373 static bfd_boolean
   5374 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   5375 			       struct elf_link_hash_entry *h)
   5376 {
   5377   struct ppc_elf_link_hash_table *htab;
   5378   asection *s;
   5379 
   5380 #ifdef DEBUG
   5381   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
   5382 	   h->root.root.string);
   5383 #endif
   5384 
   5385   /* Make sure we know what is going on here.  */
   5386   htab = ppc_elf_hash_table (info);
   5387   BFD_ASSERT (htab->elf.dynobj != NULL
   5388 	      && (h->needs_plt
   5389 		  || h->type == STT_GNU_IFUNC
   5390 		  || h->u.weakdef != NULL
   5391 		  || (h->def_dynamic
   5392 		      && h->ref_regular
   5393 		      && !h->def_regular)));
   5394 
   5395   /* Deal with function syms.  */
   5396   if (h->type == STT_FUNC
   5397       || h->type == STT_GNU_IFUNC
   5398       || h->needs_plt)
   5399     {
   5400       /* Clear procedure linkage table information for any symbol that
   5401 	 won't need a .plt entry.  */
   5402       struct plt_entry *ent;
   5403       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
   5404 	if (ent->plt.refcount > 0)
   5405 	  break;
   5406       if (ent == NULL
   5407 	  || (h->type != STT_GNU_IFUNC
   5408 	      && (SYMBOL_CALLS_LOCAL (info, h)
   5409 		  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   5410 		      && h->root.type == bfd_link_hash_undefweak))))
   5411 	{
   5412 	  /* A PLT entry is not required/allowed when:
   5413 
   5414 	     1. We are not using ld.so; because then the PLT entry
   5415 	     can't be set up, so we can't use one.  In this case,
   5416 	     ppc_elf_adjust_dynamic_symbol won't even be called.
   5417 
   5418 	     2. GC has rendered the entry unused.
   5419 
   5420 	     3. We know for certain that a call to this symbol
   5421 	     will go to this object, or will remain undefined.  */
   5422 	  h->plt.plist = NULL;
   5423 	  h->needs_plt = 0;
   5424 	}
   5425       else
   5426 	{
   5427 	  /* After adjust_dynamic_symbol, non_got_ref set in the
   5428 	     non-shared case means that we have allocated space in
   5429 	     .dynbss for the symbol and thus dyn_relocs for this
   5430 	     symbol should be discarded.
   5431 	     If we get here we know we are making a PLT entry for this
   5432 	     symbol, and in an executable we'd normally resolve
   5433 	     relocations against this symbol to the PLT entry.  Allow
   5434 	     dynamic relocs if the reference is weak, and the dynamic
   5435 	     relocs will not cause text relocation.  */
   5436 	  if (!h->ref_regular_nonweak
   5437 	      && h->non_got_ref
   5438 	      && h->type != STT_GNU_IFUNC
   5439 	      && !htab->is_vxworks
   5440 	      && !ppc_elf_hash_entry (h)->has_sda_refs
   5441 	      && !readonly_dynrelocs (h))
   5442 	    h->non_got_ref = 0;
   5443 	}
   5444       return TRUE;
   5445     }
   5446   else
   5447     h->plt.plist = NULL;
   5448 
   5449   /* If this is a weak symbol, and there is a real definition, the
   5450      processor independent code will have arranged for us to see the
   5451      real definition first, and we can just use the same value.  */
   5452   if (h->u.weakdef != NULL)
   5453     {
   5454       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   5455 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
   5456       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   5457       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   5458       if (ELIMINATE_COPY_RELOCS)
   5459 	h->non_got_ref = h->u.weakdef->non_got_ref;
   5460       return TRUE;
   5461     }
   5462 
   5463   /* This is a reference to a symbol defined by a dynamic object which
   5464      is not a function.  */
   5465 
   5466   /* If we are creating a shared library, we must presume that the
   5467      only references to the symbol are via the global offset table.
   5468      For such cases we need not do anything here; the relocations will
   5469      be handled correctly by relocate_section.  */
   5470   if (info->shared)
   5471     return TRUE;
   5472 
   5473   /* If there are no references to this symbol that do not use the
   5474      GOT, we don't need to generate a copy reloc.  */
   5475   if (!h->non_got_ref)
   5476     return TRUE;
   5477 
   5478    /* If we didn't find any dynamic relocs in read-only sections, then
   5479       we'll be keeping the dynamic relocs and avoiding the copy reloc.
   5480       We can't do this if there are any small data relocations.  This
   5481       doesn't work on VxWorks, where we can not have dynamic
   5482       relocations (other than copy and jump slot relocations) in an
   5483       executable.  */
   5484   if (ELIMINATE_COPY_RELOCS
   5485       && !ppc_elf_hash_entry (h)->has_sda_refs
   5486       && !htab->is_vxworks
   5487       && !h->def_regular
   5488       && !readonly_dynrelocs (h))
   5489     {
   5490       h->non_got_ref = 0;
   5491       return TRUE;
   5492     }
   5493 
   5494   /* We must allocate the symbol in our .dynbss section, which will
   5495      become part of the .bss section of the executable.  There will be
   5496      an entry for this symbol in the .dynsym section.  The dynamic
   5497      object will contain position independent code, so all references
   5498      from the dynamic object to this symbol will go through the global
   5499      offset table.  The dynamic linker will use the .dynsym entry to
   5500      determine the address it must put in the global offset table, so
   5501      both the dynamic object and the regular object will refer to the
   5502      same memory location for the variable.
   5503 
   5504      Of course, if the symbol is referenced using SDAREL relocs, we
   5505      must instead allocate it in .sbss.  */
   5506 
   5507   if (ppc_elf_hash_entry (h)->has_sda_refs)
   5508     s = htab->dynsbss;
   5509   else
   5510     s = htab->dynbss;
   5511   BFD_ASSERT (s != NULL);
   5512 
   5513   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
   5514      copy the initial value out of the dynamic object and into the
   5515      runtime process image.  We need to remember the offset into the
   5516      .rela.bss section we are going to use.  */
   5517   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   5518     {
   5519       asection *srel;
   5520 
   5521       if (ppc_elf_hash_entry (h)->has_sda_refs)
   5522 	srel = htab->relsbss;
   5523       else
   5524 	srel = htab->relbss;
   5525       BFD_ASSERT (srel != NULL);
   5526       srel->size += sizeof (Elf32_External_Rela);
   5527       h->needs_copy = 1;
   5528     }
   5529 
   5530   return _bfd_elf_adjust_dynamic_copy (h, s);
   5531 }
   5532 
   5533 /* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
   5535    xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
   5536    specifying the addend on the plt relocation.  For -fpic code, the sym
   5537    is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
   5538    xxxxxxxx.got2.plt_pic32.<callee>.  */
   5539 
   5540 static bfd_boolean
   5541 add_stub_sym (struct plt_entry *ent,
   5542 	      struct elf_link_hash_entry *h,
   5543 	      struct bfd_link_info *info)
   5544 {
   5545   struct elf_link_hash_entry *sh;
   5546   size_t len1, len2, len3;
   5547   char *name;
   5548   const char *stub;
   5549   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
   5550 
   5551   if (info->shared)
   5552     stub = ".plt_pic32.";
   5553   else
   5554     stub = ".plt_call32.";
   5555 
   5556   len1 = strlen (h->root.root.string);
   5557   len2 = strlen (stub);
   5558   len3 = 0;
   5559   if (ent->sec)
   5560     len3 = strlen (ent->sec->name);
   5561   name = bfd_malloc (len1 + len2 + len3 + 9);
   5562   if (name == NULL)
   5563     return FALSE;
   5564   sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
   5565   if (ent->sec)
   5566     memcpy (name + 8, ent->sec->name, len3);
   5567   memcpy (name + 8 + len3, stub, len2);
   5568   memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
   5569   sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
   5570   if (sh == NULL)
   5571     return FALSE;
   5572   if (sh->root.type == bfd_link_hash_new)
   5573     {
   5574       sh->root.type = bfd_link_hash_defined;
   5575       sh->root.u.def.section = htab->glink;
   5576       sh->root.u.def.value = ent->glink_offset;
   5577       sh->ref_regular = 1;
   5578       sh->def_regular = 1;
   5579       sh->ref_regular_nonweak = 1;
   5580       sh->forced_local = 1;
   5581       sh->non_elf = 0;
   5582     }
   5583   return TRUE;
   5584 }
   5585 
   5586 /* Allocate NEED contiguous space in .got, and return the offset.
   5587    Handles allocation of the got header when crossing 32k.  */
   5588 
   5589 static bfd_vma
   5590 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
   5591 {
   5592   bfd_vma where;
   5593   unsigned int max_before_header;
   5594 
   5595   if (htab->plt_type == PLT_VXWORKS)
   5596     {
   5597       where = htab->got->size;
   5598       htab->got->size += need;
   5599     }
   5600   else
   5601     {
   5602       max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
   5603       if (need <= htab->got_gap)
   5604 	{
   5605 	  where = max_before_header - htab->got_gap;
   5606 	  htab->got_gap -= need;
   5607 	}
   5608       else
   5609 	{
   5610 	  if (htab->got->size + need > max_before_header
   5611 	      && htab->got->size <= max_before_header)
   5612 	    {
   5613 	      htab->got_gap = max_before_header - htab->got->size;
   5614 	      htab->got->size = max_before_header + htab->got_header_size;
   5615 	    }
   5616 	  where = htab->got->size;
   5617 	  htab->got->size += need;
   5618 	}
   5619     }
   5620   return where;
   5621 }
   5622 
   5623 /* Allocate space in associated reloc sections for dynamic relocs.  */
   5624 
   5625 static bfd_boolean
   5626 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   5627 {
   5628   struct bfd_link_info *info = inf;
   5629   struct ppc_elf_link_hash_entry *eh;
   5630   struct ppc_elf_link_hash_table *htab;
   5631   struct elf_dyn_relocs *p;
   5632 
   5633   if (h->root.type == bfd_link_hash_indirect)
   5634     return TRUE;
   5635 
   5636   htab = ppc_elf_hash_table (info);
   5637   if (htab->elf.dynamic_sections_created
   5638       || h->type == STT_GNU_IFUNC)
   5639     {
   5640       struct plt_entry *ent;
   5641       bfd_boolean doneone = FALSE;
   5642       bfd_vma plt_offset = 0, glink_offset = 0;
   5643       bfd_boolean dyn;
   5644 
   5645       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
   5646 	if (ent->plt.refcount > 0)
   5647 	  {
   5648 	    /* Make sure this symbol is output as a dynamic symbol.  */
   5649 	    if (h->dynindx == -1
   5650 		&& !h->forced_local
   5651 		&& !h->def_regular
   5652 		&& htab->elf.dynamic_sections_created)
   5653 	      {
   5654 		if (! bfd_elf_link_record_dynamic_symbol (info, h))
   5655 		  return FALSE;
   5656 	      }
   5657 
   5658 	    dyn = htab->elf.dynamic_sections_created;
   5659 	    if (info->shared
   5660 		|| h->type == STT_GNU_IFUNC
   5661 		|| WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
   5662 	      {
   5663 		asection *s = htab->plt;
   5664 		if (!dyn || h->dynindx == -1)
   5665 		  s = htab->iplt;
   5666 
   5667 		if (htab->plt_type == PLT_NEW || !dyn || h->dynindx == -1)
   5668 		  {
   5669 		    if (!doneone)
   5670 		      {
   5671 			plt_offset = s->size;
   5672 			s->size += 4;
   5673 		      }
   5674 		    ent->plt.offset = plt_offset;
   5675 
   5676 		    s = htab->glink;
   5677 		    if (!doneone || info->shared)
   5678 		      {
   5679 			glink_offset = s->size;
   5680 			s->size += GLINK_ENTRY_SIZE;
   5681 			if (h == htab->tls_get_addr
   5682 			    && !htab->no_tls_get_addr_opt)
   5683 			  s->size += TLS_GET_ADDR_GLINK_SIZE - GLINK_ENTRY_SIZE;
   5684 		      }
   5685 		    if (!doneone
   5686 			&& !info->shared
   5687 			&& h->def_dynamic
   5688 			&& !h->def_regular)
   5689 		      {
   5690 			h->root.u.def.section = s;
   5691 			h->root.u.def.value = glink_offset;
   5692 		      }
   5693 		    ent->glink_offset = glink_offset;
   5694 
   5695 		    if (htab->emit_stub_syms
   5696 			&& !add_stub_sym (ent, h, info))
   5697 		      return FALSE;
   5698 		  }
   5699 		else
   5700 		  {
   5701 		    if (!doneone)
   5702 		      {
   5703 			/* If this is the first .plt entry, make room
   5704 			   for the special first entry.  */
   5705 			if (s->size == 0)
   5706 			  s->size += htab->plt_initial_entry_size;
   5707 
   5708 			/* The PowerPC PLT is actually composed of two
   5709 			   parts, the first part is 2 words (for a load
   5710 			   and a jump), and then there is a remaining
   5711 			   word available at the end.  */
   5712 			plt_offset = (htab->plt_initial_entry_size
   5713 				      + (htab->plt_slot_size
   5714 					 * ((s->size
   5715 					     - htab->plt_initial_entry_size)
   5716 					    / htab->plt_entry_size)));
   5717 
   5718 			/* If this symbol is not defined in a regular
   5719 			   file, and we are not generating a shared
   5720 			   library, then set the symbol to this location
   5721 			   in the .plt.  This is to avoid text
   5722 			   relocations, and is required to make
   5723 			   function pointers compare as equal between
   5724 			   the normal executable and the shared library.  */
   5725 			if (! info->shared
   5726 			    && h->def_dynamic
   5727 			    && !h->def_regular)
   5728 			  {
   5729 			    h->root.u.def.section = s;
   5730 			    h->root.u.def.value = plt_offset;
   5731 			  }
   5732 
   5733 			/* Make room for this entry.  */
   5734 			s->size += htab->plt_entry_size;
   5735 			/* After the 8192nd entry, room for two entries
   5736 			   is allocated.  */
   5737 			if (htab->plt_type == PLT_OLD
   5738 			    && (s->size - htab->plt_initial_entry_size)
   5739 				/ htab->plt_entry_size
   5740 			       > PLT_NUM_SINGLE_ENTRIES)
   5741 			  s->size += htab->plt_entry_size;
   5742 		      }
   5743 		    ent->plt.offset = plt_offset;
   5744 		  }
   5745 
   5746 		/* We also need to make an entry in the .rela.plt section.  */
   5747 		if (!doneone)
   5748 		  {
   5749 		    if (!htab->elf.dynamic_sections_created
   5750 			|| h->dynindx == -1)
   5751 		      htab->reliplt->size += sizeof (Elf32_External_Rela);
   5752 		    else
   5753 		      {
   5754 			htab->relplt->size += sizeof (Elf32_External_Rela);
   5755 
   5756 			if (htab->plt_type == PLT_VXWORKS)
   5757 			  {
   5758 			    /* Allocate space for the unloaded relocations.  */
   5759 			    if (!info->shared
   5760 				&& htab->elf.dynamic_sections_created)
   5761 			      {
   5762 				if (ent->plt.offset
   5763 				    == (bfd_vma) htab->plt_initial_entry_size)
   5764 				  {
   5765 				    htab->srelplt2->size
   5766 				      += (sizeof (Elf32_External_Rela)
   5767 					  * VXWORKS_PLTRESOLVE_RELOCS);
   5768 				  }
   5769 
   5770 				htab->srelplt2->size
   5771 				  += (sizeof (Elf32_External_Rela)
   5772 				      * VXWORKS_PLT_NON_JMP_SLOT_RELOCS);
   5773 			      }
   5774 
   5775 			    /* Every PLT entry has an associated GOT entry in
   5776 			       .got.plt.  */
   5777 			    htab->sgotplt->size += 4;
   5778 			  }
   5779 		      }
   5780 		    doneone = TRUE;
   5781 		  }
   5782 	      }
   5783 	    else
   5784 	      ent->plt.offset = (bfd_vma) -1;
   5785 	  }
   5786 	else
   5787 	  ent->plt.offset = (bfd_vma) -1;
   5788 
   5789       if (!doneone)
   5790 	{
   5791 	  h->plt.plist = NULL;
   5792 	  h->needs_plt = 0;
   5793 	}
   5794     }
   5795   else
   5796     {
   5797       h->plt.plist = NULL;
   5798       h->needs_plt = 0;
   5799     }
   5800 
   5801   eh = (struct ppc_elf_link_hash_entry *) h;
   5802   if (eh->elf.got.refcount > 0)
   5803     {
   5804       bfd_boolean dyn;
   5805       unsigned int need;
   5806 
   5807       /* Make sure this symbol is output as a dynamic symbol.  */
   5808       if (eh->elf.dynindx == -1
   5809 	  && !eh->elf.forced_local
   5810 	  && eh->elf.type != STT_GNU_IFUNC
   5811 	  && htab->elf.dynamic_sections_created)
   5812 	{
   5813 	  if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
   5814 	    return FALSE;
   5815 	}
   5816 
   5817       need = 0;
   5818       if ((eh->tls_mask & TLS_TLS) != 0)
   5819 	{
   5820 	  if ((eh->tls_mask & TLS_LD) != 0)
   5821 	    {
   5822 	      if (!eh->elf.def_dynamic)
   5823 		/* We'll just use htab->tlsld_got.offset.  This should
   5824 		   always be the case.  It's a little odd if we have
   5825 		   a local dynamic reloc against a non-local symbol.  */
   5826 		htab->tlsld_got.refcount += 1;
   5827 	      else
   5828 		need += 8;
   5829 	    }
   5830 	  if ((eh->tls_mask & TLS_GD) != 0)
   5831 	    need += 8;
   5832 	  if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
   5833 	    need += 4;
   5834 	  if ((eh->tls_mask & TLS_DTPREL) != 0)
   5835 	    need += 4;
   5836 	}
   5837       else
   5838 	need += 4;
   5839       if (need == 0)
   5840 	eh->elf.got.offset = (bfd_vma) -1;
   5841       else
   5842 	{
   5843 	  eh->elf.got.offset = allocate_got (htab, need);
   5844 	  dyn = htab->elf.dynamic_sections_created;
   5845 	  if ((info->shared
   5846 	       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
   5847 	      && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
   5848 		  || eh->elf.root.type != bfd_link_hash_undefweak))
   5849 	    {
   5850 	      asection *rsec = htab->relgot;
   5851 	      /* All the entries we allocated need relocs.
   5852 		 Except LD only needs one.  */
   5853 	      if ((eh->tls_mask & TLS_LD) != 0
   5854 		  && eh->elf.def_dynamic)
   5855 		need -= 4;
   5856 	      rsec->size += need * (sizeof (Elf32_External_Rela) / 4);
   5857 	    }
   5858 	}
   5859     }
   5860   else
   5861     eh->elf.got.offset = (bfd_vma) -1;
   5862 
   5863   if (eh->dyn_relocs == NULL
   5864       || !htab->elf.dynamic_sections_created)
   5865     return TRUE;
   5866 
   5867   /* In the shared -Bsymbolic case, discard space allocated for
   5868      dynamic pc-relative relocs against symbols which turn out to be
   5869      defined in regular objects.  For the normal shared case, discard
   5870      space for relocs that have become local due to symbol visibility
   5871      changes.  */
   5872 
   5873   if (info->shared)
   5874     {
   5875       /* Relocs that use pc_count are those that appear on a call insn,
   5876 	 or certain REL relocs (see must_be_dyn_reloc) that can be
   5877 	 generated via assembly.  We want calls to protected symbols to
   5878 	 resolve directly to the function rather than going via the plt.
   5879 	 If people want function pointer comparisons to work as expected
   5880 	 then they should avoid writing weird assembly.  */
   5881       if (SYMBOL_CALLS_LOCAL (info, h))
   5882 	{
   5883 	  struct elf_dyn_relocs **pp;
   5884 
   5885 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   5886 	    {
   5887 	      p->count -= p->pc_count;
   5888 	      p->pc_count = 0;
   5889 	      if (p->count == 0)
   5890 		*pp = p->next;
   5891 	      else
   5892 		pp = &p->next;
   5893 	    }
   5894 	}
   5895 
   5896       if (htab->is_vxworks)
   5897 	{
   5898 	  struct elf_dyn_relocs **pp;
   5899 
   5900 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   5901 	    {
   5902 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
   5903 		*pp = p->next;
   5904 	      else
   5905 		pp = &p->next;
   5906 	    }
   5907 	}
   5908 
   5909       /* Discard relocs on undefined symbols that must be local.  */
   5910       if (eh->dyn_relocs != NULL
   5911 	  && h->root.type == bfd_link_hash_undefined
   5912 	  && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
   5913 	      || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
   5914 	eh->dyn_relocs = NULL;
   5915 
   5916       /* Also discard relocs on undefined weak syms with non-default
   5917 	 visibility.  */
   5918       if (eh->dyn_relocs != NULL
   5919 	  && h->root.type == bfd_link_hash_undefweak)
   5920 	{
   5921 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   5922 	    eh->dyn_relocs = NULL;
   5923 
   5924 	  /* Make sure undefined weak symbols are output as a dynamic
   5925 	     symbol in PIEs.  */
   5926 	  else if (h->dynindx == -1
   5927 		   && !h->forced_local
   5928 		   && !h->def_regular)
   5929 	    {
   5930 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   5931 		return FALSE;
   5932 	    }
   5933 	}
   5934     }
   5935   else if (ELIMINATE_COPY_RELOCS)
   5936     {
   5937       /* For the non-shared case, discard space for relocs against
   5938 	 symbols which turn out to need copy relocs or are not
   5939 	 dynamic.  */
   5940 
   5941       if (!h->non_got_ref
   5942 	  && !h->def_regular)
   5943 	{
   5944 	  /* Make sure this symbol is output as a dynamic symbol.
   5945 	     Undefined weak syms won't yet be marked as dynamic.  */
   5946 	  if (h->dynindx == -1
   5947 	      && !h->forced_local)
   5948 	    {
   5949 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   5950 		return FALSE;
   5951 	    }
   5952 
   5953 	  /* If that succeeded, we know we'll be keeping all the
   5954 	     relocs.  */
   5955 	  if (h->dynindx != -1)
   5956 	    goto keep;
   5957 	}
   5958 
   5959       eh->dyn_relocs = NULL;
   5960 
   5961     keep: ;
   5962     }
   5963 
   5964   /* Finally, allocate space.  */
   5965   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   5966     {
   5967       asection *sreloc = elf_section_data (p->sec)->sreloc;
   5968       if (!htab->elf.dynamic_sections_created)
   5969 	sreloc = htab->reliplt;
   5970       sreloc->size += p->count * sizeof (Elf32_External_Rela);
   5971     }
   5972 
   5973   return TRUE;
   5974 }
   5975 
   5976 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
   5977    read-only sections.  */
   5978 
   5979 static bfd_boolean
   5980 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
   5981 {
   5982   if (h->root.type == bfd_link_hash_indirect)
   5983     return TRUE;
   5984 
   5985   if (readonly_dynrelocs (h))
   5986     {
   5987       ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
   5988 
   5989       /* Not an error, just cut short the traversal.  */
   5990       return FALSE;
   5991     }
   5992   return TRUE;
   5993 }
   5994 
   5995 static const unsigned char glink_eh_frame_cie[] =
   5996 {
   5997   0, 0, 0, 16,				/* length.  */
   5998   0, 0, 0, 0,				/* id.  */
   5999   1,					/* CIE version.  */
   6000   'z', 'R', 0,				/* Augmentation string.  */
   6001   4,					/* Code alignment.  */
   6002   0x7c,					/* Data alignment.  */
   6003   65,					/* RA reg.  */
   6004   1,					/* Augmentation size.  */
   6005   DW_EH_PE_pcrel | DW_EH_PE_sdata4,	/* FDE encoding.  */
   6006   DW_CFA_def_cfa, 1, 0			/* def_cfa: r1 offset 0.  */
   6007 };
   6008 
   6009 /* Set the sizes of the dynamic sections.  */
   6010 
   6011 static bfd_boolean
   6012 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   6013 			       struct bfd_link_info *info)
   6014 {
   6015   struct ppc_elf_link_hash_table *htab;
   6016   asection *s;
   6017   bfd_boolean relocs;
   6018   bfd *ibfd;
   6019 
   6020 #ifdef DEBUG
   6021   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
   6022 #endif
   6023 
   6024   htab = ppc_elf_hash_table (info);
   6025   BFD_ASSERT (htab->elf.dynobj != NULL);
   6026 
   6027   if (elf_hash_table (info)->dynamic_sections_created)
   6028     {
   6029       /* Set the contents of the .interp section to the interpreter.  */
   6030       if (info->executable)
   6031 	{
   6032 	  s = bfd_get_linker_section (htab->elf.dynobj, ".interp");
   6033 	  BFD_ASSERT (s != NULL);
   6034 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   6035 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   6036 	}
   6037     }
   6038 
   6039   if (htab->plt_type == PLT_OLD)
   6040     htab->got_header_size = 16;
   6041   else if (htab->plt_type == PLT_NEW)
   6042     htab->got_header_size = 12;
   6043 
   6044   /* Set up .got offsets for local syms, and space for local dynamic
   6045      relocs.  */
   6046   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   6047     {
   6048       bfd_signed_vma *local_got;
   6049       bfd_signed_vma *end_local_got;
   6050       struct plt_entry **local_plt;
   6051       struct plt_entry **end_local_plt;
   6052       char *lgot_masks;
   6053       bfd_size_type locsymcount;
   6054       Elf_Internal_Shdr *symtab_hdr;
   6055 
   6056       if (!is_ppc_elf (ibfd))
   6057 	continue;
   6058 
   6059       for (s = ibfd->sections; s != NULL; s = s->next)
   6060 	{
   6061 	  struct elf_dyn_relocs *p;
   6062 
   6063 	  for (p = ((struct elf_dyn_relocs *)
   6064 		    elf_section_data (s)->local_dynrel);
   6065 	       p != NULL;
   6066 	       p = p->next)
   6067 	    {
   6068 	      if (!bfd_is_abs_section (p->sec)
   6069 		  && bfd_is_abs_section (p->sec->output_section))
   6070 		{
   6071 		  /* Input section has been discarded, either because
   6072 		     it is a copy of a linkonce section or due to
   6073 		     linker script /DISCARD/, so we'll be discarding
   6074 		     the relocs too.  */
   6075 		}
   6076 	      else if (htab->is_vxworks
   6077 		       && strcmp (p->sec->output_section->name,
   6078 				  ".tls_vars") == 0)
   6079 		{
   6080 		  /* Relocations in vxworks .tls_vars sections are
   6081 		     handled specially by the loader.  */
   6082 		}
   6083 	      else if (p->count != 0)
   6084 		{
   6085 		  asection *sreloc = elf_section_data (p->sec)->sreloc;
   6086 		  if (!htab->elf.dynamic_sections_created)
   6087 		    sreloc = htab->reliplt;
   6088 		  sreloc->size += p->count * sizeof (Elf32_External_Rela);
   6089 		  if ((p->sec->output_section->flags
   6090 		       & (SEC_READONLY | SEC_ALLOC))
   6091 		      == (SEC_READONLY | SEC_ALLOC))
   6092 		    info->flags |= DF_TEXTREL;
   6093 		}
   6094 	    }
   6095 	}
   6096 
   6097       local_got = elf_local_got_refcounts (ibfd);
   6098       if (!local_got)
   6099 	continue;
   6100 
   6101       symtab_hdr = &elf_symtab_hdr (ibfd);
   6102       locsymcount = symtab_hdr->sh_info;
   6103       end_local_got = local_got + locsymcount;
   6104       local_plt = (struct plt_entry **) end_local_got;
   6105       end_local_plt = local_plt + locsymcount;
   6106       lgot_masks = (char *) end_local_plt;
   6107 
   6108       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
   6109 	if (*local_got > 0)
   6110 	  {
   6111 	    unsigned int need = 0;
   6112 	    if ((*lgot_masks & TLS_TLS) != 0)
   6113 	      {
   6114 		if ((*lgot_masks & TLS_GD) != 0)
   6115 		  need += 8;
   6116 		if ((*lgot_masks & TLS_LD) != 0)
   6117 		  htab->tlsld_got.refcount += 1;
   6118 		if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
   6119 		  need += 4;
   6120 		if ((*lgot_masks & TLS_DTPREL) != 0)
   6121 		  need += 4;
   6122 	      }
   6123 	    else
   6124 	      need += 4;
   6125 	    if (need == 0)
   6126 	      *local_got = (bfd_vma) -1;
   6127 	    else
   6128 	      {
   6129 		*local_got = allocate_got (htab, need);
   6130 		if (info->shared)
   6131 		  htab->relgot->size += (need
   6132 					 * (sizeof (Elf32_External_Rela) / 4));
   6133 	      }
   6134 	  }
   6135 	else
   6136 	  *local_got = (bfd_vma) -1;
   6137 
   6138       if (htab->is_vxworks)
   6139 	continue;
   6140 
   6141       /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
   6142       for (; local_plt < end_local_plt; ++local_plt)
   6143 	{
   6144 	  struct plt_entry *ent;
   6145 	  bfd_boolean doneone = FALSE;
   6146 	  bfd_vma plt_offset = 0, glink_offset = 0;
   6147 
   6148 	  for (ent = *local_plt; ent != NULL; ent = ent->next)
   6149 	    if (ent->plt.refcount > 0)
   6150 	      {
   6151 		s = htab->iplt;
   6152 
   6153 		if (!doneone)
   6154 		  {
   6155 		    plt_offset = s->size;
   6156 		    s->size += 4;
   6157 		  }
   6158 		ent->plt.offset = plt_offset;
   6159 
   6160 		s = htab->glink;
   6161 		if (!doneone || info->shared)
   6162 		  {
   6163 		    glink_offset = s->size;
   6164 		    s->size += GLINK_ENTRY_SIZE;
   6165 		  }
   6166 		ent->glink_offset = glink_offset;
   6167 
   6168 		if (!doneone)
   6169 		  {
   6170 		    htab->reliplt->size += sizeof (Elf32_External_Rela);
   6171 		    doneone = TRUE;
   6172 		  }
   6173 	      }
   6174 	    else
   6175 	      ent->plt.offset = (bfd_vma) -1;
   6176 	}
   6177     }
   6178 
   6179   /* Allocate space for global sym dynamic relocs.  */
   6180   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
   6181 
   6182   if (htab->tlsld_got.refcount > 0)
   6183     {
   6184       htab->tlsld_got.offset = allocate_got (htab, 8);
   6185       if (info->shared)
   6186 	htab->relgot->size += sizeof (Elf32_External_Rela);
   6187     }
   6188   else
   6189     htab->tlsld_got.offset = (bfd_vma) -1;
   6190 
   6191   if (htab->got != NULL && htab->plt_type != PLT_VXWORKS)
   6192     {
   6193       unsigned int g_o_t = 32768;
   6194 
   6195       /* If we haven't allocated the header, do so now.  When we get here,
   6196 	 for old plt/got the got size will be 0 to 32764 (not allocated),
   6197 	 or 32780 to 65536 (header allocated).  For new plt/got, the
   6198 	 corresponding ranges are 0 to 32768 and 32780 to 65536.  */
   6199       if (htab->got->size <= 32768)
   6200 	{
   6201 	  g_o_t = htab->got->size;
   6202 	  if (htab->plt_type == PLT_OLD)
   6203 	    g_o_t += 4;
   6204 	  htab->got->size += htab->got_header_size;
   6205 	}
   6206 
   6207       htab->elf.hgot->root.u.def.value = g_o_t;
   6208     }
   6209   if (info->shared)
   6210     {
   6211       struct elf_link_hash_entry *sda = htab->sdata[0].sym;
   6212       if (sda != NULL
   6213 	  && !(sda->root.type == bfd_link_hash_defined
   6214 	       || sda->root.type == bfd_link_hash_defweak))
   6215 	{
   6216 	  sda->root.type = bfd_link_hash_defined;
   6217 	  sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
   6218 	  sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
   6219 	}
   6220     }
   6221 
   6222   if (htab->glink != NULL
   6223       && htab->glink->size != 0
   6224       && htab->elf.dynamic_sections_created)
   6225     {
   6226       htab->glink_pltresolve = htab->glink->size;
   6227       /* Space for the branch table.  */
   6228       htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
   6229       /* Pad out to align the start of PLTresolve.  */
   6230       htab->glink->size += -htab->glink->size & 15;
   6231       htab->glink->size += GLINK_PLTRESOLVE;
   6232 
   6233       if (htab->emit_stub_syms)
   6234 	{
   6235 	  struct elf_link_hash_entry *sh;
   6236 	  sh = elf_link_hash_lookup (&htab->elf, "__glink",
   6237 				     TRUE, FALSE, FALSE);
   6238 	  if (sh == NULL)
   6239 	    return FALSE;
   6240 	  if (sh->root.type == bfd_link_hash_new)
   6241 	    {
   6242 	      sh->root.type = bfd_link_hash_defined;
   6243 	      sh->root.u.def.section = htab->glink;
   6244 	      sh->root.u.def.value = htab->glink_pltresolve;
   6245 	      sh->ref_regular = 1;
   6246 	      sh->def_regular = 1;
   6247 	      sh->ref_regular_nonweak = 1;
   6248 	      sh->forced_local = 1;
   6249 	      sh->non_elf = 0;
   6250 	    }
   6251 	  sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
   6252 				     TRUE, FALSE, FALSE);
   6253 	  if (sh == NULL)
   6254 	    return FALSE;
   6255 	  if (sh->root.type == bfd_link_hash_new)
   6256 	    {
   6257 	      sh->root.type = bfd_link_hash_defined;
   6258 	      sh->root.u.def.section = htab->glink;
   6259 	      sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
   6260 	      sh->ref_regular = 1;
   6261 	      sh->def_regular = 1;
   6262 	      sh->ref_regular_nonweak = 1;
   6263 	      sh->forced_local = 1;
   6264 	      sh->non_elf = 0;
   6265 	    }
   6266 	}
   6267     }
   6268 
   6269   if (htab->glink != NULL
   6270       && htab->glink->size != 0
   6271       && htab->glink_eh_frame != NULL
   6272       && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
   6273       && _bfd_elf_eh_frame_present (info))
   6274     {
   6275       s = htab->glink_eh_frame;
   6276       s->size = sizeof (glink_eh_frame_cie) + 20;
   6277       if (info->shared)
   6278 	{
   6279 	  s->size += 4;
   6280 	  if (htab->glink->size - GLINK_PLTRESOLVE + 8 >= 256)
   6281 	    s->size += 4;
   6282 	}
   6283     }
   6284 
   6285   /* We've now determined the sizes of the various dynamic sections.
   6286      Allocate memory for them.  */
   6287   relocs = FALSE;
   6288   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
   6289     {
   6290       bfd_boolean strip_section = TRUE;
   6291 
   6292       if ((s->flags & SEC_LINKER_CREATED) == 0)
   6293 	continue;
   6294 
   6295       if (s == htab->plt
   6296 	  || s == htab->got)
   6297 	{
   6298 	  /* We'd like to strip these sections if they aren't needed, but if
   6299 	     we've exported dynamic symbols from them we must leave them.
   6300 	     It's too late to tell BFD to get rid of the symbols.  */
   6301 	  if (htab->elf.hplt != NULL)
   6302 	    strip_section = FALSE;
   6303 	  /* Strip this section if we don't need it; see the
   6304 	     comment below.  */
   6305 	}
   6306       else if (s == htab->iplt
   6307 	       || s == htab->glink
   6308 	       || s == htab->glink_eh_frame
   6309 	       || s == htab->sgotplt
   6310 	       || s == htab->sbss
   6311 	       || s == htab->dynbss
   6312 	       || s == htab->dynsbss
   6313 	       || s == htab->sdata[0].section
   6314 	       || s == htab->sdata[1].section)
   6315 	{
   6316 	  /* Strip these too.  */
   6317 	}
   6318       else if (CONST_STRNEQ (bfd_get_section_name (htab->elf.dynobj, s),
   6319 			     ".rela"))
   6320 	{
   6321 	  if (s->size != 0)
   6322 	    {
   6323 	      /* Remember whether there are any relocation sections.  */
   6324 	      relocs = TRUE;
   6325 
   6326 	      /* We use the reloc_count field as a counter if we need
   6327 		 to copy relocs into the output file.  */
   6328 	      s->reloc_count = 0;
   6329 	    }
   6330 	}
   6331       else
   6332 	{
   6333 	  /* It's not one of our sections, so don't allocate space.  */
   6334 	  continue;
   6335 	}
   6336 
   6337       if (s->size == 0 && strip_section)
   6338 	{
   6339 	  /* If we don't need this section, strip it from the
   6340 	     output file.  This is mostly to handle .rela.bss and
   6341 	     .rela.plt.  We must create both sections in
   6342 	     create_dynamic_sections, because they must be created
   6343 	     before the linker maps input sections to output
   6344 	     sections.  The linker does that before
   6345 	     adjust_dynamic_symbol is called, and it is that
   6346 	     function which decides whether anything needs to go
   6347 	     into these sections.  */
   6348 	  s->flags |= SEC_EXCLUDE;
   6349 	  continue;
   6350 	}
   6351 
   6352       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   6353 	continue;
   6354 
   6355       /* Allocate memory for the section contents.  */
   6356       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
   6357       if (s->contents == NULL)
   6358 	return FALSE;
   6359     }
   6360 
   6361   if (htab->elf.dynamic_sections_created)
   6362     {
   6363       /* Add some entries to the .dynamic section.  We fill in the
   6364 	 values later, in ppc_elf_finish_dynamic_sections, but we
   6365 	 must add the entries now so that we get the correct size for
   6366 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   6367 	 dynamic linker and used by the debugger.  */
   6368 #define add_dynamic_entry(TAG, VAL) \
   6369   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   6370 
   6371       if (info->executable)
   6372 	{
   6373 	  if (!add_dynamic_entry (DT_DEBUG, 0))
   6374 	    return FALSE;
   6375 	}
   6376 
   6377       if (htab->plt != NULL && htab->plt->size != 0)
   6378 	{
   6379 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
   6380 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
   6381 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
   6382 	      || !add_dynamic_entry (DT_JMPREL, 0))
   6383 	    return FALSE;
   6384 	}
   6385 
   6386       if (htab->glink != NULL && htab->glink->size != 0)
   6387 	{
   6388 	  if (!add_dynamic_entry (DT_PPC_GOT, 0))
   6389 	    return FALSE;
   6390 	  if (!htab->no_tls_get_addr_opt
   6391 	      && htab->tls_get_addr != NULL
   6392 	      && htab->tls_get_addr->plt.plist != NULL
   6393 	      && !add_dynamic_entry (DT_PPC_TLSOPT, 0))
   6394 	    return FALSE;
   6395 	}
   6396 
   6397       if (relocs)
   6398 	{
   6399 	  if (!add_dynamic_entry (DT_RELA, 0)
   6400 	      || !add_dynamic_entry (DT_RELASZ, 0)
   6401 	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
   6402 	    return FALSE;
   6403 	}
   6404 
   6405       /* If any dynamic relocs apply to a read-only section, then we
   6406 	 need a DT_TEXTREL entry.  */
   6407       if ((info->flags & DF_TEXTREL) == 0)
   6408 	elf_link_hash_traverse (elf_hash_table (info), maybe_set_textrel,
   6409 				info);
   6410 
   6411       if ((info->flags & DF_TEXTREL) != 0)
   6412 	{
   6413 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
   6414 	    return FALSE;
   6415 	}
   6416       if (htab->is_vxworks
   6417 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
   6418 	return FALSE;
   6419    }
   6420 #undef add_dynamic_entry
   6421 
   6422   if (htab->glink_eh_frame != NULL
   6423       && htab->glink_eh_frame->contents != NULL)
   6424     {
   6425       unsigned char *p = htab->glink_eh_frame->contents;
   6426       bfd_vma val;
   6427 
   6428       memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
   6429       /* CIE length (rewrite in case little-endian).  */
   6430       bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
   6431       p += sizeof (glink_eh_frame_cie);
   6432       /* FDE length.  */
   6433       val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
   6434       bfd_put_32 (htab->elf.dynobj, val, p);
   6435       p += 4;
   6436       /* CIE pointer.  */
   6437       val = p - htab->glink_eh_frame->contents;
   6438       bfd_put_32 (htab->elf.dynobj, val, p);
   6439       p += 4;
   6440       /* Offset to .glink.  Set later.  */
   6441       p += 4;
   6442       /* .glink size.  */
   6443       bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
   6444       p += 4;
   6445       /* Augmentation.  */
   6446       p += 1;
   6447 
   6448       if (info->shared
   6449 	  && htab->elf.dynamic_sections_created)
   6450 	{
   6451 	  bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
   6452 	  if (adv < 64)
   6453 	    *p++ = DW_CFA_advance_loc + adv;
   6454 	  else if (adv < 256)
   6455 	    {
   6456 	      *p++ = DW_CFA_advance_loc1;
   6457 	      *p++ = adv;
   6458 	    }
   6459 	  else if (adv < 65536)
   6460 	    {
   6461 	      *p++ = DW_CFA_advance_loc2;
   6462 	      bfd_put_16 (htab->elf.dynobj, adv, p);
   6463 	      p += 2;
   6464 	    }
   6465 	  else
   6466 	    {
   6467 	      *p++ = DW_CFA_advance_loc4;
   6468 	      bfd_put_32 (htab->elf.dynobj, adv, p);
   6469 	      p += 4;
   6470 	    }
   6471 	  *p++ = DW_CFA_register;
   6472 	  *p++ = 65;
   6473 	  p++;
   6474 	  *p++ = DW_CFA_advance_loc + 4;
   6475 	  *p++ = DW_CFA_restore_extended;
   6476 	  *p++ = 65;
   6477 	}
   6478       BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
   6479 		  == htab->glink_eh_frame->size);
   6480     }
   6481 
   6482   return TRUE;
   6483 }
   6484 
   6485 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
   6486 
   6487 static bfd_boolean
   6488 ppc_elf_hash_symbol (struct elf_link_hash_entry *h)
   6489 {
   6490   if (h->plt.plist != NULL
   6491       && !h->def_regular
   6492       && (!h->pointer_equality_needed
   6493 	  || !h->ref_regular_nonweak))
   6494     return FALSE;
   6495 
   6496   return _bfd_elf_hash_symbol (h);
   6497 }
   6498 
   6499 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
   6501 
   6502 /* Relaxation trampolines.  r12 is available for clobbering (r11, is
   6503    used for some functions that are allowed to break the ABI).  */
   6504 static const int shared_stub_entry[] =
   6505   {
   6506     0x7c0802a6, /* mflr 0 */
   6507     0x429f0005, /* bcl 20, 31, .Lxxx */
   6508     0x7d8802a6, /* mflr 12 */
   6509     0x3d8c0000, /* addis 12, 12, (xxx-.Lxxx)@ha */
   6510     0x398c0008, /* addi 12, 12, (xxx-.Lxxx)@l */
   6511     0x7c0803a6, /* mtlr 0 */
   6512     0x7d8903a6, /* mtctr 12 */
   6513     0x4e800420, /* bctr */
   6514   };
   6515 
   6516 static const int stub_entry[] =
   6517   {
   6518     0x3d800000, /* lis 12,xxx@ha */
   6519     0x398c0000, /* addi 12,12,xxx@l */
   6520     0x7d8903a6, /* mtctr 12 */
   6521     0x4e800420, /* bctr */
   6522   };
   6523 
   6524 static bfd_boolean
   6525 ppc_elf_relax_section (bfd *abfd,
   6526 		       asection *isec,
   6527 		       struct bfd_link_info *link_info,
   6528 		       bfd_boolean *again)
   6529 {
   6530   struct one_fixup
   6531   {
   6532     struct one_fixup *next;
   6533     asection *tsec;
   6534     /* Final link, can use the symbol offset.  For a
   6535        relocatable link we use the symbol's index.  */
   6536     bfd_vma toff;
   6537     bfd_vma trampoff;
   6538   };
   6539 
   6540   Elf_Internal_Shdr *symtab_hdr;
   6541   bfd_byte *contents = NULL;
   6542   Elf_Internal_Sym *isymbuf = NULL;
   6543   Elf_Internal_Rela *internal_relocs = NULL;
   6544   Elf_Internal_Rela *irel, *irelend;
   6545   struct one_fixup *fixups = NULL;
   6546   unsigned changes = 0;
   6547   struct ppc_elf_link_hash_table *htab;
   6548   bfd_size_type trampoff;
   6549   asection *got2;
   6550   bfd_boolean maybe_pasted;
   6551 
   6552   *again = FALSE;
   6553 
   6554   /* Nothing to do if there are no relocations, and no need to do
   6555      anything with non-alloc or non-code sections.  */
   6556   if ((isec->flags & SEC_ALLOC) == 0
   6557       || (isec->flags & SEC_CODE) == 0
   6558       || (isec->flags & SEC_RELOC) == 0
   6559       || isec->reloc_count == 0)
   6560     return TRUE;
   6561 
   6562   /* We cannot represent the required PIC relocs in the output, so don't
   6563      do anything.  The linker doesn't support mixing -shared and -r
   6564      anyway.  */
   6565   if (link_info->relocatable && link_info->shared)
   6566      return TRUE;
   6567 
   6568   trampoff = (isec->size + 3) & (bfd_vma) -4;
   6569   maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0
   6570 		  || strcmp (isec->output_section->name, ".fini") == 0);
   6571   /* Space for a branch around any trampolines.  */
   6572   if (maybe_pasted)
   6573     trampoff += 4;
   6574 
   6575   symtab_hdr = &elf_symtab_hdr (abfd);
   6576 
   6577   /* Get a copy of the native relocations.  */
   6578   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
   6579 					       link_info->keep_memory);
   6580   if (internal_relocs == NULL)
   6581     goto error_return;
   6582 
   6583   htab = ppc_elf_hash_table (link_info);
   6584   got2 = bfd_get_section_by_name (abfd, ".got2");
   6585 
   6586   irelend = internal_relocs + isec->reloc_count;
   6587   for (irel = internal_relocs; irel < irelend; irel++)
   6588     {
   6589       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
   6590       bfd_vma toff, roff;
   6591       asection *tsec;
   6592       struct one_fixup *f;
   6593       size_t insn_offset = 0;
   6594       bfd_vma max_branch_offset, val;
   6595       bfd_byte *hit_addr;
   6596       unsigned long t0;
   6597       struct elf_link_hash_entry *h;
   6598       struct plt_entry **plist;
   6599       unsigned char sym_type;
   6600 
   6601       switch (r_type)
   6602 	{
   6603 	case R_PPC_REL24:
   6604 	case R_PPC_LOCAL24PC:
   6605 	case R_PPC_PLTREL24:
   6606 	  max_branch_offset = 1 << 25;
   6607 	  break;
   6608 
   6609 	case R_PPC_REL14:
   6610 	case R_PPC_REL14_BRTAKEN:
   6611 	case R_PPC_REL14_BRNTAKEN:
   6612 	  max_branch_offset = 1 << 15;
   6613 	  break;
   6614 
   6615 	default:
   6616 	  continue;
   6617 	}
   6618 
   6619       /* Get the value of the symbol referred to by the reloc.  */
   6620       h = NULL;
   6621       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   6622 	{
   6623 	  /* A local symbol.  */
   6624 	  Elf_Internal_Sym *isym;
   6625 
   6626 	  /* Read this BFD's local symbols.  */
   6627 	  if (isymbuf == NULL)
   6628 	    {
   6629 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   6630 	      if (isymbuf == NULL)
   6631 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   6632 						symtab_hdr->sh_info, 0,
   6633 						NULL, NULL, NULL);
   6634 	      if (isymbuf == 0)
   6635 		goto error_return;
   6636 	    }
   6637 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
   6638 	  if (isym->st_shndx == SHN_UNDEF)
   6639 	    tsec = bfd_und_section_ptr;
   6640 	  else if (isym->st_shndx == SHN_ABS)
   6641 	    tsec = bfd_abs_section_ptr;
   6642 	  else if (isym->st_shndx == SHN_COMMON)
   6643 	    tsec = bfd_com_section_ptr;
   6644 	  else
   6645 	    tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   6646 
   6647 	  toff = isym->st_value;
   6648 	  sym_type = ELF_ST_TYPE (isym->st_info);
   6649 	}
   6650       else
   6651 	{
   6652 	  /* Global symbol handling.  */
   6653 	  unsigned long indx;
   6654 
   6655 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   6656 	  h = elf_sym_hashes (abfd)[indx];
   6657 
   6658 	  while (h->root.type == bfd_link_hash_indirect
   6659 		 || h->root.type == bfd_link_hash_warning)
   6660 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   6661 
   6662 	  if (h->root.type == bfd_link_hash_defined
   6663 	      || h->root.type == bfd_link_hash_defweak)
   6664 	    {
   6665 	      tsec = h->root.u.def.section;
   6666 	      toff = h->root.u.def.value;
   6667 	    }
   6668 	  else if (h->root.type == bfd_link_hash_undefined
   6669 		   || h->root.type == bfd_link_hash_undefweak)
   6670 	    {
   6671 	      tsec = bfd_und_section_ptr;
   6672 	      toff = link_info->relocatable ? indx : 0;
   6673 	    }
   6674 	  else
   6675 	    continue;
   6676 
   6677 	  sym_type = h->type;
   6678 	}
   6679 
   6680       /* The condition here under which we call find_plt_ent must
   6681 	 match that in relocate_section.  If we call find_plt_ent here
   6682 	 but not in relocate_section, or vice versa, then the branch
   6683 	 destination used here may be incorrect.  */
   6684       plist = NULL;
   6685       if (h != NULL)
   6686 	{
   6687 	  /* We know is_branch_reloc (r_type) is true.  */
   6688 	  if (h->type == STT_GNU_IFUNC
   6689 	      || r_type == R_PPC_PLTREL24)
   6690 	    plist = &h->plt.plist;
   6691 	}
   6692       else if (sym_type == STT_GNU_IFUNC
   6693 	       && elf_local_got_offsets (abfd) != NULL)
   6694 	{
   6695 	  bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
   6696 	  struct plt_entry **local_plt = (struct plt_entry **)
   6697 	    (local_got_offsets + symtab_hdr->sh_info);
   6698 	  plist = local_plt + ELF32_R_SYM (irel->r_info);
   6699 	}
   6700       if (plist != NULL)
   6701 	{
   6702 	  bfd_vma addend = 0;
   6703 	  struct plt_entry *ent;
   6704 
   6705 	  if (r_type == R_PPC_PLTREL24 && link_info->shared)
   6706 	    addend = irel->r_addend;
   6707 	  ent = find_plt_ent (plist, got2, addend);
   6708 	  if (ent != NULL)
   6709 	    {
   6710 	      if (htab->plt_type == PLT_NEW
   6711 		  || h == NULL
   6712 		  || !htab->elf.dynamic_sections_created
   6713 		  || h->dynindx == -1)
   6714 		{
   6715 		  tsec = htab->glink;
   6716 		  toff = ent->glink_offset;
   6717 		}
   6718 	      else
   6719 		{
   6720 		  tsec = htab->plt;
   6721 		  toff = ent->plt.offset;
   6722 		}
   6723 	    }
   6724 	}
   6725 
   6726       /* If the branch and target are in the same section, you have
   6727 	 no hope of adding stubs.  We'll error out later should the
   6728 	 branch overflow.  */
   6729       if (tsec == isec)
   6730 	continue;
   6731 
   6732       /* There probably isn't any reason to handle symbols in
   6733 	 SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
   6734 	 attribute for a code section, and we are only looking at
   6735 	 branches.  However, implement it correctly here as a
   6736 	 reference for other target relax_section functions.  */
   6737       if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
   6738 	{
   6739 	  /* At this stage in linking, no SEC_MERGE symbol has been
   6740 	     adjusted, so all references to such symbols need to be
   6741 	     passed through _bfd_merged_section_offset.  (Later, in
   6742 	     relocate_section, all SEC_MERGE symbols *except* for
   6743 	     section symbols have been adjusted.)
   6744 
   6745 	     gas may reduce relocations against symbols in SEC_MERGE
   6746 	     sections to a relocation against the section symbol when
   6747 	     the original addend was zero.  When the reloc is against
   6748 	     a section symbol we should include the addend in the
   6749 	     offset passed to _bfd_merged_section_offset, since the
   6750 	     location of interest is the original symbol.  On the
   6751 	     other hand, an access to "sym+addend" where "sym" is not
   6752 	     a section symbol should not include the addend;  Such an
   6753 	     access is presumed to be an offset from "sym";  The
   6754 	     location of interest is just "sym".  */
   6755 	  if (sym_type == STT_SECTION)
   6756 	    toff += irel->r_addend;
   6757 
   6758 	  toff = _bfd_merged_section_offset (abfd, &tsec,
   6759 					     elf_section_data (tsec)->sec_info,
   6760 					     toff);
   6761 
   6762 	  if (sym_type != STT_SECTION)
   6763 	    toff += irel->r_addend;
   6764 	}
   6765       /* PLTREL24 addends are special.  */
   6766       else if (r_type != R_PPC_PLTREL24)
   6767 	toff += irel->r_addend;
   6768 
   6769       /* Attempted -shared link of non-pic code loses.  */
   6770       if (tsec->output_section == NULL)
   6771 	continue;
   6772 
   6773       roff = irel->r_offset;
   6774 
   6775       /* If the branch is in range, no need to do anything.  */
   6776       if (tsec != bfd_und_section_ptr
   6777 	  && (!link_info->relocatable
   6778 	      /* A relocatable link may have sections moved during
   6779 		 final link, so do not presume they remain in range.  */
   6780 	      || tsec->output_section == isec->output_section))
   6781 	{
   6782 	  bfd_vma symaddr, reladdr;
   6783 
   6784 	  symaddr = tsec->output_section->vma + tsec->output_offset + toff;
   6785 	  reladdr = isec->output_section->vma + isec->output_offset + roff;
   6786 	  if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
   6787 	    continue;
   6788 	}
   6789 
   6790       /* Look for an existing fixup to this address.  */
   6791       for (f = fixups; f ; f = f->next)
   6792 	if (f->tsec == tsec && f->toff == toff)
   6793 	  break;
   6794 
   6795       if (f == NULL)
   6796 	{
   6797 	  size_t size;
   6798 	  unsigned long stub_rtype;
   6799 
   6800 	  val = trampoff - roff;
   6801 	  if (val >= max_branch_offset)
   6802 	    /* Oh dear, we can't reach a trampoline.  Don't try to add
   6803 	       one.  We'll report an error later.  */
   6804 	    continue;
   6805 
   6806 	  if (link_info->shared)
   6807 	    {
   6808 	      size = 4 * ARRAY_SIZE (shared_stub_entry);
   6809 	      insn_offset = 12;
   6810 	    }
   6811 	  else
   6812 	    {
   6813 	      size = 4 * ARRAY_SIZE (stub_entry);
   6814 	      insn_offset = 0;
   6815 	    }
   6816 	  stub_rtype = R_PPC_RELAX;
   6817 	  if (tsec == htab->plt
   6818 	      || tsec == htab->glink)
   6819 	    {
   6820 	      stub_rtype = R_PPC_RELAX_PLT;
   6821 	      if (r_type == R_PPC_PLTREL24)
   6822 		stub_rtype = R_PPC_RELAX_PLTREL24;
   6823 	    }
   6824 
   6825 	  /* Hijack the old relocation.  Since we need two
   6826 	     relocations for this use a "composite" reloc.  */
   6827 	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   6828 				       stub_rtype);
   6829 	  irel->r_offset = trampoff + insn_offset;
   6830 	  if (r_type == R_PPC_PLTREL24
   6831 	      && stub_rtype != R_PPC_RELAX_PLTREL24)
   6832 	    irel->r_addend = 0;
   6833 
   6834 	  /* Record the fixup so we don't do it again this section.  */
   6835 	  f = bfd_malloc (sizeof (*f));
   6836 	  f->next = fixups;
   6837 	  f->tsec = tsec;
   6838 	  f->toff = toff;
   6839 	  f->trampoff = trampoff;
   6840 	  fixups = f;
   6841 
   6842 	  trampoff += size;
   6843 	  changes++;
   6844 	}
   6845       else
   6846 	{
   6847 	  val = f->trampoff - roff;
   6848 	  if (val >= max_branch_offset)
   6849 	    continue;
   6850 
   6851 	  /* Nop out the reloc, since we're finalizing things here.  */
   6852 	  irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
   6853 	}
   6854 
   6855       /* Get the section contents.  */
   6856       if (contents == NULL)
   6857 	{
   6858 	  /* Get cached copy if it exists.  */
   6859 	  if (elf_section_data (isec)->this_hdr.contents != NULL)
   6860 	    contents = elf_section_data (isec)->this_hdr.contents;
   6861 	  else
   6862 	    {
   6863 	      /* Go get them off disk.  */
   6864 	      if (!bfd_malloc_and_get_section (abfd, isec, &contents))
   6865 		goto error_return;
   6866 	    }
   6867 	}
   6868 
   6869       /* Fix up the existing branch to hit the trampoline.  */
   6870       hit_addr = contents + roff;
   6871       switch (r_type)
   6872 	{
   6873 	case R_PPC_REL24:
   6874 	case R_PPC_LOCAL24PC:
   6875 	case R_PPC_PLTREL24:
   6876 	  t0 = bfd_get_32 (abfd, hit_addr);
   6877 	  t0 &= ~0x3fffffc;
   6878 	  t0 |= val & 0x3fffffc;
   6879 	  bfd_put_32 (abfd, t0, hit_addr);
   6880 	  break;
   6881 
   6882 	case R_PPC_REL14:
   6883 	case R_PPC_REL14_BRTAKEN:
   6884 	case R_PPC_REL14_BRNTAKEN:
   6885 	  t0 = bfd_get_32 (abfd, hit_addr);
   6886 	  t0 &= ~0xfffc;
   6887 	  t0 |= val & 0xfffc;
   6888 	  bfd_put_32 (abfd, t0, hit_addr);
   6889 	  break;
   6890 	}
   6891     }
   6892 
   6893   /* Write out the trampolines.  */
   6894   if (fixups != NULL)
   6895     {
   6896       const int *stub;
   6897       bfd_byte *dest;
   6898       int i, size;
   6899 
   6900       do
   6901 	{
   6902 	  struct one_fixup *f = fixups;
   6903 	  fixups = fixups->next;
   6904 	  free (f);
   6905 	}
   6906       while (fixups);
   6907 
   6908       contents = bfd_realloc_or_free (contents, trampoff);
   6909       if (contents == NULL)
   6910 	goto error_return;
   6911 
   6912       isec->size = (isec->size + 3) & (bfd_vma) -4;
   6913       dest = contents + isec->size;
   6914       /* Branch around the trampolines.  */
   6915       if (maybe_pasted)
   6916 	{
   6917 	  bfd_vma val = B + trampoff - isec->size;
   6918 	  bfd_put_32 (abfd, val, dest);
   6919 	  dest += 4;
   6920 	}
   6921       isec->size = trampoff;
   6922 
   6923       if (link_info->shared)
   6924 	{
   6925 	  stub = shared_stub_entry;
   6926 	  size = ARRAY_SIZE (shared_stub_entry);
   6927 	}
   6928       else
   6929 	{
   6930 	  stub = stub_entry;
   6931 	  size = ARRAY_SIZE (stub_entry);
   6932 	}
   6933 
   6934       i = 0;
   6935       while (dest < contents + trampoff)
   6936 	{
   6937 	  bfd_put_32 (abfd, stub[i], dest);
   6938 	  i++;
   6939 	  if (i == size)
   6940 	    i = 0;
   6941 	  dest += 4;
   6942 	}
   6943       BFD_ASSERT (i == 0);
   6944     }
   6945 
   6946   if (isymbuf != NULL
   6947       && symtab_hdr->contents != (unsigned char *) isymbuf)
   6948     {
   6949       if (! link_info->keep_memory)
   6950 	free (isymbuf);
   6951       else
   6952 	{
   6953 	  /* Cache the symbols for elf_link_input_bfd.  */
   6954 	  symtab_hdr->contents = (unsigned char *) isymbuf;
   6955 	}
   6956     }
   6957 
   6958   if (contents != NULL
   6959       && elf_section_data (isec)->this_hdr.contents != contents)
   6960     {
   6961       if (!changes && !link_info->keep_memory)
   6962 	free (contents);
   6963       else
   6964 	{
   6965 	  /* Cache the section contents for elf_link_input_bfd.  */
   6966 	  elf_section_data (isec)->this_hdr.contents = contents;
   6967 	}
   6968     }
   6969 
   6970   if (changes != 0)
   6971     {
   6972       /* Append sufficient NOP relocs so we can write out relocation
   6973 	 information for the trampolines.  */
   6974       Elf_Internal_Shdr *rel_hdr;
   6975       Elf_Internal_Rela *new_relocs = bfd_malloc ((changes + isec->reloc_count)
   6976 						  * sizeof (*new_relocs));
   6977       unsigned ix;
   6978 
   6979       if (!new_relocs)
   6980 	goto error_return;
   6981       memcpy (new_relocs, internal_relocs,
   6982 	      isec->reloc_count * sizeof (*new_relocs));
   6983       for (ix = changes; ix--;)
   6984 	{
   6985 	  irel = new_relocs + ix + isec->reloc_count;
   6986 
   6987 	  irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
   6988 	}
   6989       if (internal_relocs != elf_section_data (isec)->relocs)
   6990 	free (internal_relocs);
   6991       elf_section_data (isec)->relocs = new_relocs;
   6992       isec->reloc_count += changes;
   6993       rel_hdr = _bfd_elf_single_rel_hdr (isec);
   6994       rel_hdr->sh_size += changes * rel_hdr->sh_entsize;
   6995     }
   6996   else if (elf_section_data (isec)->relocs != internal_relocs)
   6997     free (internal_relocs);
   6998 
   6999   *again = changes != 0;
   7000   if (!*again && link_info->relocatable)
   7001     {
   7002       /* Convert the internal relax relocs to external form.  */
   7003       for (irel = internal_relocs; irel < irelend; irel++)
   7004 	if (ELF32_R_TYPE (irel->r_info) == R_PPC_RELAX)
   7005 	  {
   7006 	    unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
   7007 
   7008 	    /* Rewrite the reloc and convert one of the trailing nop
   7009 	       relocs to describe this relocation.  */
   7010 	    BFD_ASSERT (ELF32_R_TYPE (irelend[-1].r_info) == R_PPC_NONE);
   7011 	    /* The relocs are at the bottom 2 bytes */
   7012 	    irel[0].r_offset += 2;
   7013 	    memmove (irel + 1, irel, (irelend - irel - 1) * sizeof (*irel));
   7014 	    irel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
   7015 	    irel[1].r_offset += 4;
   7016 	    irel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
   7017 	    irel++;
   7018 	  }
   7019     }
   7020 
   7021   return TRUE;
   7022 
   7023  error_return:
   7024   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
   7025     free (isymbuf);
   7026   if (contents != NULL
   7027       && elf_section_data (isec)->this_hdr.contents != contents)
   7028     free (contents);
   7029   if (internal_relocs != NULL
   7030       && elf_section_data (isec)->relocs != internal_relocs)
   7031     free (internal_relocs);
   7032   return FALSE;
   7033 }
   7034 
   7035 /* What to do when ld finds relocations against symbols defined in
   7037    discarded sections.  */
   7038 
   7039 static unsigned int
   7040 ppc_elf_action_discarded (asection *sec)
   7041 {
   7042   if (strcmp (".fixup", sec->name) == 0)
   7043     return 0;
   7044 
   7045   if (strcmp (".got2", sec->name) == 0)
   7046     return 0;
   7047 
   7048   return _bfd_elf_default_action_discarded (sec);
   7049 }
   7050 
   7051 /* Fill in the address for a pointer generated in a linker section.  */
   7053 
   7054 static bfd_vma
   7055 elf_finish_pointer_linker_section (bfd *input_bfd,
   7056 				   elf_linker_section_t *lsect,
   7057 				   struct elf_link_hash_entry *h,
   7058 				   bfd_vma relocation,
   7059 				   const Elf_Internal_Rela *rel)
   7060 {
   7061   elf_linker_section_pointers_t *linker_section_ptr;
   7062 
   7063   BFD_ASSERT (lsect != NULL);
   7064 
   7065   if (h != NULL)
   7066     {
   7067       /* Handle global symbol.  */
   7068       struct ppc_elf_link_hash_entry *eh;
   7069 
   7070       eh = (struct ppc_elf_link_hash_entry *) h;
   7071       BFD_ASSERT (eh->elf.def_regular);
   7072       linker_section_ptr = eh->linker_section_pointer;
   7073     }
   7074   else
   7075     {
   7076       /* Handle local symbol.  */
   7077       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
   7078 
   7079       BFD_ASSERT (is_ppc_elf (input_bfd));
   7080       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
   7081       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
   7082     }
   7083 
   7084   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
   7085 							rel->r_addend,
   7086 							lsect);
   7087   BFD_ASSERT (linker_section_ptr != NULL);
   7088 
   7089   /* Offset will always be a multiple of four, so use the bottom bit
   7090      as a "written" flag.  */
   7091   if ((linker_section_ptr->offset & 1) == 0)
   7092     {
   7093       bfd_put_32 (lsect->section->owner,
   7094 		  relocation + linker_section_ptr->addend,
   7095 		  lsect->section->contents + linker_section_ptr->offset);
   7096       linker_section_ptr->offset += 1;
   7097     }
   7098 
   7099   relocation = (lsect->section->output_section->vma
   7100 		+ lsect->section->output_offset
   7101 		+ linker_section_ptr->offset - 1
   7102 		- SYM_VAL (lsect->sym));
   7103 
   7104 #ifdef DEBUG
   7105   fprintf (stderr,
   7106 	   "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
   7107 	   lsect->name, (long) relocation, (long) relocation);
   7108 #endif
   7109 
   7110   return relocation;
   7111 }
   7112 
   7113 #define PPC_LO(v) ((v) & 0xffff)
   7114 #define PPC_HI(v) (((v) >> 16) & 0xffff)
   7115 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
   7116 
   7117 static void
   7118 write_glink_stub (struct plt_entry *ent, asection *plt_sec, unsigned char *p,
   7119 		  struct bfd_link_info *info)
   7120 {
   7121   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
   7122   bfd *output_bfd = info->output_bfd;
   7123   bfd_vma plt;
   7124 
   7125   plt = ((ent->plt.offset & ~1)
   7126 	 + plt_sec->output_section->vma
   7127 	 + plt_sec->output_offset);
   7128 
   7129   if (info->shared)
   7130     {
   7131       bfd_vma got = 0;
   7132 
   7133       if (ent->addend >= 32768)
   7134 	got = (ent->addend
   7135 	       + ent->sec->output_section->vma
   7136 	       + ent->sec->output_offset);
   7137       else if (htab->elf.hgot != NULL)
   7138 	got = SYM_VAL (htab->elf.hgot);
   7139 
   7140       plt -= got;
   7141 
   7142       if (plt + 0x8000 < 0x10000)
   7143 	{
   7144 	  bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
   7145 	  p += 4;
   7146 	  bfd_put_32 (output_bfd, MTCTR_11, p);
   7147 	  p += 4;
   7148 	  bfd_put_32 (output_bfd, BCTR, p);
   7149 	  p += 4;
   7150 	  bfd_put_32 (output_bfd, NOP, p);
   7151 	  p += 4;
   7152 	}
   7153       else
   7154 	{
   7155 	  bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
   7156 	  p += 4;
   7157 	  bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
   7158 	  p += 4;
   7159 	  bfd_put_32 (output_bfd, MTCTR_11, p);
   7160 	  p += 4;
   7161 	  bfd_put_32 (output_bfd, BCTR, p);
   7162 	  p += 4;
   7163 	}
   7164     }
   7165   else
   7166     {
   7167       bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
   7168       p += 4;
   7169       bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
   7170       p += 4;
   7171       bfd_put_32 (output_bfd, MTCTR_11, p);
   7172       p += 4;
   7173       bfd_put_32 (output_bfd, BCTR, p);
   7174       p += 4;
   7175     }
   7176 }
   7177 
   7178 /* Return true if symbol is defined statically.  */
   7179 
   7180 static bfd_boolean
   7181 is_static_defined (struct elf_link_hash_entry *h)
   7182 {
   7183   return ((h->root.type == bfd_link_hash_defined
   7184 	   || h->root.type == bfd_link_hash_defweak)
   7185 	  && h->root.u.def.section != NULL
   7186 	  && h->root.u.def.section->output_section != NULL);
   7187 }
   7188 
   7189 /* If INSN is an opcode that may be used with an @tls operand, return
   7190    the transformed insn for TLS optimisation, otherwise return 0.  If
   7191    REG is non-zero only match an insn with RB or RA equal to REG.  */
   7192 
   7193 unsigned int
   7194 _bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
   7195 {
   7196   unsigned int rtra;
   7197 
   7198   if ((insn & (0x3f << 26)) != 31 << 26)
   7199     return 0;
   7200 
   7201   if (reg == 0 || ((insn >> 11) & 0x1f) == reg)
   7202     rtra = insn & ((1 << 26) - (1 << 16));
   7203   else if (((insn >> 16) & 0x1f) == reg)
   7204     rtra = (insn & (0x1f << 21)) | ((insn & (0x1f << 11)) << 5);
   7205   else
   7206     return 0;
   7207 
   7208   if ((insn & (0x3ff << 1)) == 266 << 1)
   7209     /* add -> addi.  */
   7210     insn = 14 << 26;
   7211   else if ((insn & (0x1f << 1)) == 23 << 1
   7212 	   && ((insn & (0x1f << 6)) < 14 << 6
   7213 	       || ((insn & (0x1f << 6)) >= 16 << 6
   7214 		   && (insn & (0x1f << 6)) < 24 << 6)))
   7215     /* load and store indexed -> dform.  */
   7216     insn = (32 | ((insn >> 6) & 0x1f)) << 26;
   7217   else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1)
   7218     /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
   7219     insn = ((58 | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1);
   7220   else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1)
   7221     /* lwax -> lwa.  */
   7222     insn = (58 << 26) | 2;
   7223   else
   7224     return 0;
   7225   insn |= rtra;
   7226   return insn;
   7227 }
   7228 
   7229 /* If INSN is an opcode that may be used with an @tprel operand, return
   7230    the transformed insn for an undefined weak symbol, ie. with the
   7231    thread pointer REG operand removed.  Otherwise return 0.  */
   7232 
   7233 unsigned int
   7234 _bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
   7235 {
   7236   if ((insn & (0x1f << 16)) == reg << 16
   7237       && ((insn & (0x3f << 26)) == 14u << 26 /* addi */
   7238 	  || (insn & (0x3f << 26)) == 15u << 26 /* addis */
   7239 	  || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
   7240 	  || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
   7241 	  || (insn & (0x3f << 26)) == 36u << 26 /* stw */
   7242 	  || (insn & (0x3f << 26)) == 38u << 26 /* stb */
   7243 	  || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
   7244 	  || (insn & (0x3f << 26)) == 42u << 26 /* lha */
   7245 	  || (insn & (0x3f << 26)) == 44u << 26 /* sth */
   7246 	  || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
   7247 	  || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
   7248 	  || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
   7249 	  || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
   7250 	  || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
   7251 	  || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
   7252 	  || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
   7253 	      && (insn & 3) != 1)
   7254 	  || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
   7255 	      && ((insn & 3) == 0 || (insn & 3) == 3))))
   7256     {
   7257       insn &= ~(0x1f << 16);
   7258     }
   7259   else if ((insn & (0x1f << 21)) == reg << 21
   7260 	   && ((insn & (0x3e << 26)) == 24u << 26 /* ori, oris */
   7261 	       || (insn & (0x3e << 26)) == 26u << 26 /* xori,xoris */
   7262 	       || (insn & (0x3e << 26)) == 28u << 26 /* andi,andis */))
   7263     {
   7264       insn &= ~(0x1f << 21);
   7265       insn |= (insn & (0x1f << 16)) << 5;
   7266       if ((insn & (0x3e << 26)) == 26 << 26 /* xori,xoris */)
   7267 	insn -= 2 >> 26;  /* convert to ori,oris */
   7268     }
   7269   else
   7270     insn = 0;
   7271   return insn;
   7272 }
   7273 
   7274 static bfd_boolean
   7275 is_insn_ds_form (unsigned int insn)
   7276 {
   7277   return ((insn & (0x3f << 26)) == 58u << 26 /* ld,ldu,lwa */
   7278 	  || (insn & (0x3f << 26)) == 62u << 26 /* std,stdu,stq */
   7279 	  || (insn & (0x3f << 26)) == 57u << 26 /* lfdp */
   7280 	  || (insn & (0x3f << 26)) == 61u << 26 /* stfdp */);
   7281 }
   7282 
   7283 static bfd_boolean
   7284 is_insn_dq_form (unsigned int insn)
   7285 {
   7286   return (insn & (0x3f << 26)) == 56u << 26; /* lq */
   7287 }
   7288 
   7289 /* The RELOCATE_SECTION function is called by the ELF backend linker
   7290    to handle the relocations for a section.
   7291 
   7292    The relocs are always passed as Rela structures; if the section
   7293    actually uses Rel structures, the r_addend field will always be
   7294    zero.
   7295 
   7296    This function is responsible for adjust the section contents as
   7297    necessary, and (if using Rela relocs and generating a
   7298    relocatable output file) adjusting the reloc addend as
   7299    necessary.
   7300 
   7301    This function does not have to worry about setting the reloc
   7302    address or the reloc symbol index.
   7303 
   7304    LOCAL_SYMS is a pointer to the swapped in local symbols.
   7305 
   7306    LOCAL_SECTIONS is an array giving the section in the input file
   7307    corresponding to the st_shndx field of each local symbol.
   7308 
   7309    The global hash table entry for the global symbols can be found
   7310    via elf_sym_hashes (input_bfd).
   7311 
   7312    When generating relocatable output, this function must handle
   7313    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   7314    going to be the section symbol corresponding to the output
   7315    section, which means that the addend must be adjusted
   7316    accordingly.  */
   7317 
   7318 static bfd_boolean
   7319 ppc_elf_relocate_section (bfd *output_bfd,
   7320 			  struct bfd_link_info *info,
   7321 			  bfd *input_bfd,
   7322 			  asection *input_section,
   7323 			  bfd_byte *contents,
   7324 			  Elf_Internal_Rela *relocs,
   7325 			  Elf_Internal_Sym *local_syms,
   7326 			  asection **local_sections)
   7327 {
   7328   Elf_Internal_Shdr *symtab_hdr;
   7329   struct elf_link_hash_entry **sym_hashes;
   7330   struct ppc_elf_link_hash_table *htab;
   7331   Elf_Internal_Rela *rel;
   7332   Elf_Internal_Rela *relend;
   7333   Elf_Internal_Rela outrel;
   7334   asection *got2, *sreloc = NULL;
   7335   bfd_vma *local_got_offsets;
   7336   bfd_boolean ret = TRUE;
   7337   bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
   7338   bfd_boolean is_vxworks_tls;
   7339 
   7340 #ifdef DEBUG
   7341   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
   7342 		      "%ld relocations%s",
   7343 		      input_bfd, input_section,
   7344 		      (long) input_section->reloc_count,
   7345 		      (info->relocatable) ? " (relocatable)" : "");
   7346 #endif
   7347 
   7348   got2 = bfd_get_section_by_name (input_bfd, ".got2");
   7349 
   7350   /* Initialize howto table if not already done.  */
   7351   if (!ppc_elf_howto_table[R_PPC_ADDR32])
   7352     ppc_elf_howto_init ();
   7353 
   7354   htab = ppc_elf_hash_table (info);
   7355   local_got_offsets = elf_local_got_offsets (input_bfd);
   7356   symtab_hdr = &elf_symtab_hdr (input_bfd);
   7357   sym_hashes = elf_sym_hashes (input_bfd);
   7358   /* We have to handle relocations in vxworks .tls_vars sections
   7359      specially, because the dynamic loader is 'weird'.  */
   7360   is_vxworks_tls = (htab->is_vxworks && info->shared
   7361 		    && !strcmp (input_section->output_section->name,
   7362 				".tls_vars"));
   7363   rel = relocs;
   7364   relend = relocs + input_section->reloc_count;
   7365   for (; rel < relend; rel++)
   7366     {
   7367       enum elf_ppc_reloc_type r_type;
   7368       bfd_vma addend;
   7369       bfd_reloc_status_type r;
   7370       Elf_Internal_Sym *sym;
   7371       asection *sec;
   7372       struct elf_link_hash_entry *h;
   7373       const char *sym_name;
   7374       reloc_howto_type *howto;
   7375       unsigned long r_symndx;
   7376       bfd_vma relocation;
   7377       bfd_vma branch_bit, from;
   7378       bfd_boolean unresolved_reloc;
   7379       bfd_boolean warned;
   7380       unsigned int tls_type, tls_mask, tls_gd;
   7381       struct plt_entry **ifunc;
   7382 
   7383       r_type = ELF32_R_TYPE (rel->r_info);
   7384       sym = NULL;
   7385       sec = NULL;
   7386       h = NULL;
   7387       unresolved_reloc = FALSE;
   7388       warned = FALSE;
   7389       r_symndx = ELF32_R_SYM (rel->r_info);
   7390 
   7391       if (r_symndx < symtab_hdr->sh_info)
   7392 	{
   7393 	  sym = local_syms + r_symndx;
   7394 	  sec = local_sections[r_symndx];
   7395 	  sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
   7396 
   7397 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   7398 	}
   7399       else
   7400 	{
   7401 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   7402 				   r_symndx, symtab_hdr, sym_hashes,
   7403 				   h, sec, relocation,
   7404 				   unresolved_reloc, warned);
   7405 
   7406 	  sym_name = h->root.root.string;
   7407 	}
   7408 
   7409       if (sec != NULL && discarded_section (sec))
   7410 	{
   7411 	  /* For relocs against symbols from removed linkonce sections,
   7412 	     or sections discarded by a linker script, we just want the
   7413 	     section contents zeroed.  Avoid any special processing.  */
   7414 	  howto = NULL;
   7415 	  if (r_type < R_PPC_max)
   7416 	    howto = ppc_elf_howto_table[r_type];
   7417 	  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   7418 					   rel, 1, relend, howto, 0, contents);
   7419 	}
   7420 
   7421       if (info->relocatable)
   7422 	{
   7423 	  if (got2 != NULL
   7424 	      && r_type == R_PPC_PLTREL24
   7425 	      && rel->r_addend != 0)
   7426 	    {
   7427 	      /* R_PPC_PLTREL24 is rather special.  If non-zero, the
   7428 		 addend specifies the GOT pointer offset within .got2.  */
   7429 	      rel->r_addend += got2->output_offset;
   7430 	    }
   7431 	  continue;
   7432 	}
   7433 
   7434       /* TLS optimizations.  Replace instruction sequences and relocs
   7435 	 based on information we collected in tls_optimize.  We edit
   7436 	 RELOCS so that --emit-relocs will output something sensible
   7437 	 for the final instruction stream.  */
   7438       tls_mask = 0;
   7439       tls_gd = 0;
   7440       if (h != NULL)
   7441 	tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
   7442       else if (local_got_offsets != NULL)
   7443 	{
   7444 	  struct plt_entry **local_plt;
   7445 	  char *lgot_masks;
   7446 	  local_plt
   7447 	    = (struct plt_entry **) (local_got_offsets + symtab_hdr->sh_info);
   7448 	  lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
   7449 	  tls_mask = lgot_masks[r_symndx];
   7450 	}
   7451 
   7452       /* Ensure reloc mapping code below stays sane.  */
   7453       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
   7454 	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
   7455 	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
   7456 	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
   7457 	  || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
   7458 	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
   7459 	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
   7460 	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
   7461 	abort ();
   7462       switch (r_type)
   7463 	{
   7464 	default:
   7465 	  break;
   7466 
   7467 	case R_PPC_GOT_TPREL16:
   7468 	case R_PPC_GOT_TPREL16_LO:
   7469 	  if ((tls_mask & TLS_TLS) != 0
   7470 	      && (tls_mask & TLS_TPREL) == 0)
   7471 	    {
   7472 	      bfd_vma insn;
   7473 
   7474 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
   7475 	      insn &= 31 << 21;
   7476 	      insn |= 0x3c020000;	/* addis 0,2,0 */
   7477 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
   7478 	      r_type = R_PPC_TPREL16_HA;
   7479 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7480 	    }
   7481 	  break;
   7482 
   7483 	case R_PPC_TLS:
   7484 	  if ((tls_mask & TLS_TLS) != 0
   7485 	      && (tls_mask & TLS_TPREL) == 0)
   7486 	    {
   7487 	      bfd_vma insn;
   7488 
   7489 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
   7490 	      insn = _bfd_elf_ppc_at_tls_transform (insn, 2);
   7491 	      if (insn == 0)
   7492 		abort ();
   7493 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
   7494 	      r_type = R_PPC_TPREL16_LO;
   7495 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7496 
   7497 	      /* Was PPC_TLS which sits on insn boundary, now
   7498 		 PPC_TPREL16_LO which is at low-order half-word.  */
   7499 	      rel->r_offset += d_offset;
   7500 	    }
   7501 	  break;
   7502 
   7503 	case R_PPC_GOT_TLSGD16_HI:
   7504 	case R_PPC_GOT_TLSGD16_HA:
   7505 	  tls_gd = TLS_TPRELGD;
   7506 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
   7507 	    goto tls_gdld_hi;
   7508 	  break;
   7509 
   7510 	case R_PPC_GOT_TLSLD16_HI:
   7511 	case R_PPC_GOT_TLSLD16_HA:
   7512 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
   7513 	    {
   7514 	    tls_gdld_hi:
   7515 	      if ((tls_mask & tls_gd) != 0)
   7516 		r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
   7517 			  + R_PPC_GOT_TPREL16);
   7518 	      else
   7519 		{
   7520 		  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
   7521 		  rel->r_offset -= d_offset;
   7522 		  r_type = R_PPC_NONE;
   7523 		}
   7524 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7525 	    }
   7526 	  break;
   7527 
   7528 	case R_PPC_GOT_TLSGD16:
   7529 	case R_PPC_GOT_TLSGD16_LO:
   7530 	  tls_gd = TLS_TPRELGD;
   7531 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
   7532 	    goto tls_ldgd_opt;
   7533 	  break;
   7534 
   7535 	case R_PPC_GOT_TLSLD16:
   7536 	case R_PPC_GOT_TLSLD16_LO:
   7537 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
   7538 	    {
   7539 	      unsigned int insn1, insn2;
   7540 	      bfd_vma offset;
   7541 
   7542 	    tls_ldgd_opt:
   7543 	      offset = (bfd_vma) -1;
   7544 	      /* If not using the newer R_PPC_TLSGD/LD to mark
   7545 		 __tls_get_addr calls, we must trust that the call
   7546 		 stays with its arg setup insns, ie. that the next
   7547 		 reloc is the __tls_get_addr call associated with
   7548 		 the current reloc.  Edit both insns.  */
   7549 	      if (input_section->has_tls_get_addr_call
   7550 		  && rel + 1 < relend
   7551 		  && branch_reloc_hash_match (input_bfd, rel + 1,
   7552 					      htab->tls_get_addr))
   7553 		offset = rel[1].r_offset;
   7554 	      if ((tls_mask & tls_gd) != 0)
   7555 		{
   7556 		  /* IE */
   7557 		  insn1 = bfd_get_32 (output_bfd,
   7558 				      contents + rel->r_offset - d_offset);
   7559 		  insn1 &= (1 << 26) - 1;
   7560 		  insn1 |= 32 << 26;	/* lwz */
   7561 		  if (offset != (bfd_vma) -1)
   7562 		    {
   7563 		      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
   7564 		      insn2 = 0x7c631214;	/* add 3,3,2 */
   7565 		      bfd_put_32 (output_bfd, insn2, contents + offset);
   7566 		    }
   7567 		  r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
   7568 			    + R_PPC_GOT_TPREL16);
   7569 		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7570 		}
   7571 	      else
   7572 		{
   7573 		  /* LE */
   7574 		  insn1 = 0x3c620000;	/* addis 3,2,0 */
   7575 		  if (tls_gd == 0)
   7576 		    {
   7577 		      /* Was an LD reloc.  */
   7578 		      for (r_symndx = 0;
   7579 			   r_symndx < symtab_hdr->sh_info;
   7580 			   r_symndx++)
   7581 			if (local_sections[r_symndx] == sec)
   7582 			  break;
   7583 		      if (r_symndx >= symtab_hdr->sh_info)
   7584 			r_symndx = STN_UNDEF;
   7585 		      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
   7586 		      if (r_symndx != STN_UNDEF)
   7587 			rel->r_addend -= (local_syms[r_symndx].st_value
   7588 					  + sec->output_offset
   7589 					  + sec->output_section->vma);
   7590 		    }
   7591 		  r_type = R_PPC_TPREL16_HA;
   7592 		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7593 		  if (offset != (bfd_vma) -1)
   7594 		    {
   7595 		      rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
   7596 		      rel[1].r_offset = offset + d_offset;
   7597 		      rel[1].r_addend = rel->r_addend;
   7598 		      insn2 = 0x38630000;	/* addi 3,3,0 */
   7599 		      bfd_put_32 (output_bfd, insn2, contents + offset);
   7600 		    }
   7601 		}
   7602 	      bfd_put_32 (output_bfd, insn1,
   7603 			  contents + rel->r_offset - d_offset);
   7604 	      if (tls_gd == 0)
   7605 		{
   7606 		  /* We changed the symbol on an LD reloc.  Start over
   7607 		     in order to get h, sym, sec etc. right.  */
   7608 		  rel--;
   7609 		  continue;
   7610 		}
   7611 	    }
   7612 	  break;
   7613 
   7614 	case R_PPC_TLSGD:
   7615 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
   7616 	    {
   7617 	      unsigned int insn2;
   7618 	      bfd_vma offset = rel->r_offset;
   7619 
   7620 	      if ((tls_mask & TLS_TPRELGD) != 0)
   7621 		{
   7622 		  /* IE */
   7623 		  r_type = R_PPC_NONE;
   7624 		  insn2 = 0x7c631214;	/* add 3,3,2 */
   7625 		}
   7626 	      else
   7627 		{
   7628 		  /* LE */
   7629 		  r_type = R_PPC_TPREL16_LO;
   7630 		  rel->r_offset += d_offset;
   7631 		  insn2 = 0x38630000;	/* addi 3,3,0 */
   7632 		}
   7633 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
   7634 	      bfd_put_32 (output_bfd, insn2, contents + offset);
   7635 	      /* Zap the reloc on the _tls_get_addr call too.  */
   7636 	      BFD_ASSERT (offset == rel[1].r_offset);
   7637 	      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
   7638 	    }
   7639 	  break;
   7640 
   7641 	case R_PPC_TLSLD:
   7642 	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
   7643 	    {
   7644 	      unsigned int insn2;
   7645 
   7646 	      for (r_symndx = 0;
   7647 		   r_symndx < symtab_hdr->sh_info;
   7648 		   r_symndx++)
   7649 		if (local_sections[r_symndx] == sec)
   7650 		  break;
   7651 	      if (r_symndx >= symtab_hdr->sh_info)
   7652 		r_symndx = STN_UNDEF;
   7653 	      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
   7654 	      if (r_symndx != STN_UNDEF)
   7655 		rel->r_addend -= (local_syms[r_symndx].st_value
   7656 				  + sec->output_offset
   7657 				  + sec->output_section->vma);
   7658 
   7659 	      rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
   7660 	      rel->r_offset += d_offset;
   7661 	      insn2 = 0x38630000;	/* addi 3,3,0 */
   7662 	      bfd_put_32 (output_bfd, insn2,
   7663 			  contents + rel->r_offset - d_offset);
   7664 	      /* Zap the reloc on the _tls_get_addr call too.  */
   7665 	      BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
   7666 	      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
   7667 	      rel--;
   7668 	      continue;
   7669 	    }
   7670 	  break;
   7671 	}
   7672 
   7673       /* Handle other relocations that tweak non-addend part of insn.  */
   7674       branch_bit = 0;
   7675       switch (r_type)
   7676 	{
   7677 	default:
   7678 	  break;
   7679 
   7680 	  /* Branch taken prediction relocations.  */
   7681 	case R_PPC_ADDR14_BRTAKEN:
   7682 	case R_PPC_REL14_BRTAKEN:
   7683 	  branch_bit = BRANCH_PREDICT_BIT;
   7684 	  /* Fall thru */
   7685 
   7686 	  /* Branch not taken prediction relocations.  */
   7687 	case R_PPC_ADDR14_BRNTAKEN:
   7688 	case R_PPC_REL14_BRNTAKEN:
   7689 	  {
   7690 	    bfd_vma insn;
   7691 
   7692 	    insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
   7693 	    insn &= ~BRANCH_PREDICT_BIT;
   7694 	    insn |= branch_bit;
   7695 
   7696 	    from = (rel->r_offset
   7697 		    + input_section->output_offset
   7698 		    + input_section->output_section->vma);
   7699 
   7700 	    /* Invert 'y' bit if not the default.  */
   7701 	    if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
   7702 	      insn ^= BRANCH_PREDICT_BIT;
   7703 
   7704 	    bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
   7705 	    break;
   7706 	  }
   7707 	}
   7708 
   7709       ifunc = NULL;
   7710       if (!htab->is_vxworks)
   7711 	{
   7712 	  struct plt_entry *ent;
   7713 
   7714 	  if (h != NULL)
   7715 	    {
   7716 	      if (h->type == STT_GNU_IFUNC)
   7717 		ifunc = &h->plt.plist;
   7718 	    }
   7719 	  else if (local_got_offsets != NULL
   7720 		   && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
   7721 	    {
   7722 	      struct plt_entry **local_plt;
   7723 
   7724 	      local_plt = (struct plt_entry **) (local_got_offsets
   7725 						 + symtab_hdr->sh_info);
   7726 	      ifunc = local_plt + r_symndx;
   7727 	    }
   7728 
   7729 	  ent = NULL;
   7730 	  if (ifunc != NULL
   7731 	      && (!info->shared
   7732 		  || is_branch_reloc (r_type)))
   7733 	    {
   7734 	      addend = 0;
   7735 	      if (r_type == R_PPC_PLTREL24 && info->shared)
   7736 		addend = rel->r_addend;
   7737 	      ent = find_plt_ent (ifunc, got2, addend);
   7738 	    }
   7739 	  if (ent != NULL)
   7740 	    {
   7741 	      if (h == NULL && (ent->plt.offset & 1) == 0)
   7742 		{
   7743 		  Elf_Internal_Rela rela;
   7744 		  bfd_byte *loc;
   7745 
   7746 		  rela.r_offset = (htab->iplt->output_section->vma
   7747 				   + htab->iplt->output_offset
   7748 				   + ent->plt.offset);
   7749 		  rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
   7750 		  rela.r_addend = relocation;
   7751 		  loc = htab->reliplt->contents;
   7752 		  loc += (htab->reliplt->reloc_count++
   7753 			  * sizeof (Elf32_External_Rela));
   7754 		  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   7755 
   7756 		  ent->plt.offset |= 1;
   7757 		}
   7758 	      if (h == NULL && (ent->glink_offset & 1) == 0)
   7759 		{
   7760 		  unsigned char *p = ((unsigned char *) htab->glink->contents
   7761 				      + ent->glink_offset);
   7762 		  write_glink_stub (ent, htab->iplt, p, info);
   7763 		  ent->glink_offset |= 1;
   7764 		}
   7765 
   7766 	      unresolved_reloc = FALSE;
   7767 	      if (htab->plt_type == PLT_NEW
   7768 		  || !htab->elf.dynamic_sections_created
   7769 		  || h == NULL)
   7770 		relocation = (htab->glink->output_section->vma
   7771 			      + htab->glink->output_offset
   7772 			      + (ent->glink_offset & ~1));
   7773 	      else
   7774 		relocation = (htab->plt->output_section->vma
   7775 			      + htab->plt->output_offset
   7776 			      + ent->plt.offset);
   7777 	    }
   7778 	}
   7779 
   7780       addend = rel->r_addend;
   7781       tls_type = 0;
   7782       howto = NULL;
   7783       if (r_type < R_PPC_max)
   7784 	howto = ppc_elf_howto_table[r_type];
   7785       switch ((int)r_type)
   7786 	{
   7787 	default:
   7788 	  info->callbacks->einfo
   7789 	    (_("%P: %B: unknown relocation type %d for symbol %s\n"),
   7790 	     input_bfd, (int) r_type, sym_name);
   7791 
   7792 	  bfd_set_error (bfd_error_bad_value);
   7793 	  ret = FALSE;
   7794 	  continue;
   7795 
   7796 	case R_PPC_NONE:
   7797 	case R_PPC_TLS:
   7798 	case R_PPC_TLSGD:
   7799 	case R_PPC_TLSLD:
   7800 	case R_PPC_EMB_MRKREF:
   7801 	case R_PPC_GNU_VTINHERIT:
   7802 	case R_PPC_GNU_VTENTRY:
   7803 	  continue;
   7804 
   7805 	  /* GOT16 relocations.  Like an ADDR16 using the symbol's
   7806 	     address in the GOT as relocation value instead of the
   7807 	     symbol's value itself.  Also, create a GOT entry for the
   7808 	     symbol and put the symbol value there.  */
   7809 	case R_PPC_GOT_TLSGD16:
   7810 	case R_PPC_GOT_TLSGD16_LO:
   7811 	case R_PPC_GOT_TLSGD16_HI:
   7812 	case R_PPC_GOT_TLSGD16_HA:
   7813 	  tls_type = TLS_TLS | TLS_GD;
   7814 	  goto dogot;
   7815 
   7816 	case R_PPC_GOT_TLSLD16:
   7817 	case R_PPC_GOT_TLSLD16_LO:
   7818 	case R_PPC_GOT_TLSLD16_HI:
   7819 	case R_PPC_GOT_TLSLD16_HA:
   7820 	  tls_type = TLS_TLS | TLS_LD;
   7821 	  goto dogot;
   7822 
   7823 	case R_PPC_GOT_TPREL16:
   7824 	case R_PPC_GOT_TPREL16_LO:
   7825 	case R_PPC_GOT_TPREL16_HI:
   7826 	case R_PPC_GOT_TPREL16_HA:
   7827 	  tls_type = TLS_TLS | TLS_TPREL;
   7828 	  goto dogot;
   7829 
   7830 	case R_PPC_GOT_DTPREL16:
   7831 	case R_PPC_GOT_DTPREL16_LO:
   7832 	case R_PPC_GOT_DTPREL16_HI:
   7833 	case R_PPC_GOT_DTPREL16_HA:
   7834 	  tls_type = TLS_TLS | TLS_DTPREL;
   7835 	  goto dogot;
   7836 
   7837 	case R_PPC_GOT16:
   7838 	case R_PPC_GOT16_LO:
   7839 	case R_PPC_GOT16_HI:
   7840 	case R_PPC_GOT16_HA:
   7841 	  tls_mask = 0;
   7842 	dogot:
   7843 	  {
   7844 	    /* Relocation is to the entry for this symbol in the global
   7845 	       offset table.  */
   7846 	    bfd_vma off;
   7847 	    bfd_vma *offp;
   7848 	    unsigned long indx;
   7849 
   7850 	    if (htab->got == NULL)
   7851 	      abort ();
   7852 
   7853 	    indx = 0;
   7854 	    if (tls_type == (TLS_TLS | TLS_LD)
   7855 		&& (h == NULL
   7856 		    || !h->def_dynamic))
   7857 	      offp = &htab->tlsld_got.offset;
   7858 	    else if (h != NULL)
   7859 	      {
   7860 		bfd_boolean dyn;
   7861 		dyn = htab->elf.dynamic_sections_created;
   7862 		if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   7863 		    || (info->shared
   7864 			&& SYMBOL_REFERENCES_LOCAL (info, h)))
   7865 		  /* This is actually a static link, or it is a
   7866 		     -Bsymbolic link and the symbol is defined
   7867 		     locally, or the symbol was forced to be local
   7868 		     because of a version file.  */
   7869 		  ;
   7870 		else
   7871 		  {
   7872 		    BFD_ASSERT (h->dynindx != -1);
   7873 		    indx = h->dynindx;
   7874 		    unresolved_reloc = FALSE;
   7875 		  }
   7876 		offp = &h->got.offset;
   7877 	      }
   7878 	    else
   7879 	      {
   7880 		if (local_got_offsets == NULL)
   7881 		  abort ();
   7882 		offp = &local_got_offsets[r_symndx];
   7883 	      }
   7884 
   7885 	    /* The offset must always be a multiple of 4.  We use the
   7886 	       least significant bit to record whether we have already
   7887 	       processed this entry.  */
   7888 	    off = *offp;
   7889 	    if ((off & 1) != 0)
   7890 	      off &= ~1;
   7891 	    else
   7892 	      {
   7893 		unsigned int tls_m = (tls_mask
   7894 				      & (TLS_LD | TLS_GD | TLS_DTPREL
   7895 					 | TLS_TPREL | TLS_TPRELGD));
   7896 
   7897 		if (offp == &htab->tlsld_got.offset)
   7898 		  tls_m = TLS_LD;
   7899 		else if (h == NULL
   7900 			 || !h->def_dynamic)
   7901 		  tls_m &= ~TLS_LD;
   7902 
   7903 		/* We might have multiple got entries for this sym.
   7904 		   Initialize them all.  */
   7905 		do
   7906 		  {
   7907 		    int tls_ty = 0;
   7908 
   7909 		    if ((tls_m & TLS_LD) != 0)
   7910 		      {
   7911 			tls_ty = TLS_TLS | TLS_LD;
   7912 			tls_m &= ~TLS_LD;
   7913 		      }
   7914 		    else if ((tls_m & TLS_GD) != 0)
   7915 		      {
   7916 			tls_ty = TLS_TLS | TLS_GD;
   7917 			tls_m &= ~TLS_GD;
   7918 		      }
   7919 		    else if ((tls_m & TLS_DTPREL) != 0)
   7920 		      {
   7921 			tls_ty = TLS_TLS | TLS_DTPREL;
   7922 			tls_m &= ~TLS_DTPREL;
   7923 		      }
   7924 		    else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
   7925 		      {
   7926 			tls_ty = TLS_TLS | TLS_TPREL;
   7927 			tls_m = 0;
   7928 		      }
   7929 
   7930 		    /* Generate relocs for the dynamic linker.  */
   7931 		    if ((info->shared || indx != 0)
   7932 			&& (offp == &htab->tlsld_got.offset
   7933 			    || h == NULL
   7934 			    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   7935 			    || h->root.type != bfd_link_hash_undefweak))
   7936 		      {
   7937 			asection *rsec = htab->relgot;
   7938 			bfd_byte * loc;
   7939 
   7940 			outrel.r_offset = (htab->got->output_section->vma
   7941 					   + htab->got->output_offset
   7942 					   + off);
   7943 			outrel.r_addend = 0;
   7944 			if (tls_ty & (TLS_LD | TLS_GD))
   7945 			  {
   7946 			    outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
   7947 			    if (tls_ty == (TLS_TLS | TLS_GD))
   7948 			      {
   7949 				loc = rsec->contents;
   7950 				loc += (rsec->reloc_count++
   7951 					* sizeof (Elf32_External_Rela));
   7952 				bfd_elf32_swap_reloca_out (output_bfd,
   7953 							   &outrel, loc);
   7954 				outrel.r_offset += 4;
   7955 				outrel.r_info
   7956 				  = ELF32_R_INFO (indx, R_PPC_DTPREL32);
   7957 			      }
   7958 			  }
   7959 			else if (tls_ty == (TLS_TLS | TLS_DTPREL))
   7960 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
   7961 			else if (tls_ty == (TLS_TLS | TLS_TPREL))
   7962 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
   7963 			else if (indx != 0)
   7964 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
   7965 			else if (ifunc != NULL)
   7966 			  outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
   7967 			else
   7968 			  outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
   7969 			if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
   7970 			  {
   7971 			    outrel.r_addend += relocation;
   7972 			    if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
   7973 			      outrel.r_addend -= htab->elf.tls_sec->vma;
   7974 			  }
   7975 			loc = rsec->contents;
   7976 			loc += (rsec->reloc_count++
   7977 				* sizeof (Elf32_External_Rela));
   7978 			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   7979 		      }
   7980 
   7981 		    /* Init the .got section contents if we're not
   7982 		       emitting a reloc.  */
   7983 		    else
   7984 		      {
   7985 			bfd_vma value = relocation;
   7986 
   7987 			if (tls_ty == (TLS_TLS | TLS_LD))
   7988 			  value = 1;
   7989 			else if (tls_ty != 0)
   7990 			  {
   7991 			    value -= htab->elf.tls_sec->vma + DTP_OFFSET;
   7992 			    if (tls_ty == (TLS_TLS | TLS_TPREL))
   7993 			      value += DTP_OFFSET - TP_OFFSET;
   7994 
   7995 			    if (tls_ty == (TLS_TLS | TLS_GD))
   7996 			      {
   7997 				bfd_put_32 (output_bfd, value,
   7998 					    htab->got->contents + off + 4);
   7999 				value = 1;
   8000 			      }
   8001 			  }
   8002 			bfd_put_32 (output_bfd, value,
   8003 				    htab->got->contents + off);
   8004 		      }
   8005 
   8006 		    off += 4;
   8007 		    if (tls_ty & (TLS_LD | TLS_GD))
   8008 		      off += 4;
   8009 		  }
   8010 		while (tls_m != 0);
   8011 
   8012 		off = *offp;
   8013 		*offp = off | 1;
   8014 	      }
   8015 
   8016 	    if (off >= (bfd_vma) -2)
   8017 	      abort ();
   8018 
   8019 	    if ((tls_type & TLS_TLS) != 0)
   8020 	      {
   8021 		if (tls_type != (TLS_TLS | TLS_LD))
   8022 		  {
   8023 		    if ((tls_mask & TLS_LD) != 0
   8024 			&& !(h == NULL
   8025 			     || !h->def_dynamic))
   8026 		      off += 8;
   8027 		    if (tls_type != (TLS_TLS | TLS_GD))
   8028 		      {
   8029 			if ((tls_mask & TLS_GD) != 0)
   8030 			  off += 8;
   8031 			if (tls_type != (TLS_TLS | TLS_DTPREL))
   8032 			  {
   8033 			    if ((tls_mask & TLS_DTPREL) != 0)
   8034 			      off += 4;
   8035 			  }
   8036 		      }
   8037 		  }
   8038 	      }
   8039 
   8040 	    relocation = (htab->got->output_section->vma
   8041 			  + htab->got->output_offset
   8042 			  + off
   8043 			  - SYM_VAL (htab->elf.hgot));
   8044 
   8045 	    /* Addends on got relocations don't make much sense.
   8046 	       x+off@got is actually x@got+off, and since the got is
   8047 	       generated by a hash table traversal, the value in the
   8048 	       got at entry m+n bears little relation to the entry m.  */
   8049 	    if (addend != 0)
   8050 	      info->callbacks->einfo
   8051 		(_("%P: %H: non-zero addend on %s reloc against `%s'\n"),
   8052 		 input_bfd, input_section, rel->r_offset,
   8053 		 howto->name,
   8054 		 sym_name);
   8055 	  }
   8056 	break;
   8057 
   8058 	/* Relocations that need no special processing.  */
   8059 	case R_PPC_LOCAL24PC:
   8060 	  /* It makes no sense to point a local relocation
   8061 	     at a symbol not in this object.  */
   8062 	  if (unresolved_reloc)
   8063 	    {
   8064 	      if (! (*info->callbacks->undefined_symbol) (info,
   8065 							  h->root.root.string,
   8066 							  input_bfd,
   8067 							  input_section,
   8068 							  rel->r_offset,
   8069 							  TRUE))
   8070 		return FALSE;
   8071 	      continue;
   8072 	    }
   8073 	  break;
   8074 
   8075 	case R_PPC_DTPREL16:
   8076 	case R_PPC_DTPREL16_LO:
   8077 	case R_PPC_DTPREL16_HI:
   8078 	case R_PPC_DTPREL16_HA:
   8079 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
   8080 	  break;
   8081 
   8082 	  /* Relocations that may need to be propagated if this is a shared
   8083 	     object.  */
   8084 	case R_PPC_TPREL16:
   8085 	case R_PPC_TPREL16_LO:
   8086 	case R_PPC_TPREL16_HI:
   8087 	case R_PPC_TPREL16_HA:
   8088 	  if (h != NULL
   8089 	      && h->root.type == bfd_link_hash_undefweak
   8090 	      && h->dynindx == -1)
   8091 	    {
   8092 	      /* Make this relocation against an undefined weak symbol
   8093 		 resolve to zero.  This is really just a tweak, since
   8094 		 code using weak externs ought to check that they are
   8095 		 defined before using them.  */
   8096 	      bfd_byte *p = contents + rel->r_offset - d_offset;
   8097 	      unsigned int insn = bfd_get_32 (output_bfd, p);
   8098 	      insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
   8099 	      if (insn != 0)
   8100 		bfd_put_32 (output_bfd, insn, p);
   8101 	      break;
   8102 	    }
   8103 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
   8104 	  /* The TPREL16 relocs shouldn't really be used in shared
   8105 	     libs as they will result in DT_TEXTREL being set, but
   8106 	     support them anyway.  */
   8107 	  goto dodyn;
   8108 
   8109 	case R_PPC_TPREL32:
   8110 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
   8111 	  goto dodyn;
   8112 
   8113 	case R_PPC_DTPREL32:
   8114 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
   8115 	  goto dodyn;
   8116 
   8117 	case R_PPC_DTPMOD32:
   8118 	  relocation = 1;
   8119 	  addend = 0;
   8120 	  goto dodyn;
   8121 
   8122 	case R_PPC_REL16:
   8123 	case R_PPC_REL16_LO:
   8124 	case R_PPC_REL16_HI:
   8125 	case R_PPC_REL16_HA:
   8126 	  break;
   8127 
   8128 	case R_PPC_REL32:
   8129 	  if (h == NULL || h == htab->elf.hgot)
   8130 	    break;
   8131 	  /* fall through */
   8132 
   8133 	case R_PPC_ADDR32:
   8134 	case R_PPC_ADDR16:
   8135 	case R_PPC_ADDR16_LO:
   8136 	case R_PPC_ADDR16_HI:
   8137 	case R_PPC_ADDR16_HA:
   8138 	case R_PPC_UADDR32:
   8139 	case R_PPC_UADDR16:
   8140 	  goto dodyn;
   8141 
   8142 	case R_PPC_VLE_REL8:
   8143 	case R_PPC_VLE_REL15:
   8144 	case R_PPC_VLE_REL24:
   8145 	case R_PPC_REL24:
   8146 	case R_PPC_REL14:
   8147 	case R_PPC_REL14_BRTAKEN:
   8148 	case R_PPC_REL14_BRNTAKEN:
   8149 	  /* If these relocations are not to a named symbol, they can be
   8150 	     handled right here, no need to bother the dynamic linker.  */
   8151 	  if (SYMBOL_CALLS_LOCAL (info, h)
   8152 	      || h == htab->elf.hgot)
   8153 	    break;
   8154 	  /* fall through */
   8155 
   8156 	case R_PPC_ADDR24:
   8157 	case R_PPC_ADDR14:
   8158 	case R_PPC_ADDR14_BRTAKEN:
   8159 	case R_PPC_ADDR14_BRNTAKEN:
   8160 	  if (h != NULL && !info->shared)
   8161 	    break;
   8162 	  /* fall through */
   8163 
   8164 	dodyn:
   8165 	  if ((input_section->flags & SEC_ALLOC) == 0
   8166 	      || is_vxworks_tls)
   8167 	    break;
   8168 
   8169 	  if ((info->shared
   8170 	       && !(h != NULL
   8171 		    && ((h->root.type == bfd_link_hash_undefined
   8172 			 && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
   8173 			     || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
   8174 			|| (h->root.type == bfd_link_hash_undefweak
   8175 			    && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)))
   8176 	       && (must_be_dyn_reloc (info, r_type)
   8177 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   8178 	      || (ELIMINATE_COPY_RELOCS
   8179 		  && !info->shared
   8180 		  && h != NULL
   8181 		  && h->dynindx != -1
   8182 		  && !h->non_got_ref
   8183 		  && !h->def_regular))
   8184 	    {
   8185 	      int skip;
   8186 	      bfd_byte * loc;
   8187 #ifdef DEBUG
   8188 	      fprintf (stderr, "ppc_elf_relocate_section needs to "
   8189 		       "create relocation for %s\n",
   8190 		       (h && h->root.root.string
   8191 			? h->root.root.string : "<unknown>"));
   8192 #endif
   8193 
   8194 	      /* When generating a shared object, these relocations
   8195 		 are copied into the output file to be resolved at run
   8196 		 time.  */
   8197 	      if (sreloc == NULL)
   8198 		{
   8199 		  sreloc = elf_section_data (input_section)->sreloc;
   8200 		  if (!htab->elf.dynamic_sections_created)
   8201 		    sreloc = htab->reliplt;
   8202 		  if (sreloc == NULL)
   8203 		    return FALSE;
   8204 		}
   8205 
   8206 	      skip = 0;
   8207 	      outrel.r_offset = _bfd_elf_section_offset (output_bfd, info,
   8208 							 input_section,
   8209 							 rel->r_offset);
   8210 	      if (outrel.r_offset == (bfd_vma) -1
   8211 		  || outrel.r_offset == (bfd_vma) -2)
   8212 		skip = (int) outrel.r_offset;
   8213 	      outrel.r_offset += (input_section->output_section->vma
   8214 				  + input_section->output_offset);
   8215 
   8216 	      if (skip)
   8217 		memset (&outrel, 0, sizeof outrel);
   8218 	      else if ((h != NULL
   8219 			&& (h->root.type == bfd_link_hash_undefined
   8220 			    || h->root.type == bfd_link_hash_undefweak))
   8221 		       || !SYMBOL_REFERENCES_LOCAL (info, h))
   8222 		{
   8223 		  BFD_ASSERT (h->dynindx != -1);
   8224 		  unresolved_reloc = FALSE;
   8225 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   8226 		  outrel.r_addend = rel->r_addend;
   8227 		}
   8228 	      else
   8229 		{
   8230 		  outrel.r_addend = relocation + rel->r_addend;
   8231 
   8232 		  if (r_type != R_PPC_ADDR32)
   8233 		    {
   8234 		      long indx = 0;
   8235 
   8236 		      if (ifunc != NULL)
   8237 			{
   8238 			  /* If we get here when building a static
   8239 			     executable, then the libc startup function
   8240 			     responsible for applying indirect function
   8241 			     relocations is going to complain about
   8242 			     the reloc type.
   8243 			     If we get here when building a dynamic
   8244 			     executable, it will be because we have
   8245 			     a text relocation.  The dynamic loader
   8246 			     will set the text segment writable and
   8247 			     non-executable to apply text relocations.
   8248 			     So we'll segfault when trying to run the
   8249 			     indirection function to resolve the reloc.  */
   8250 			  info->callbacks->einfo
   8251 			    (_("%P: %H: relocation %s for indirect "
   8252 			       "function %s unsupported\n"),
   8253 			     input_bfd, input_section, rel->r_offset,
   8254 			     howto->name,
   8255 			     sym_name);
   8256 			  ret = FALSE;
   8257 			}
   8258 		      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
   8259 			;
   8260 		      else if (sec == NULL || sec->owner == NULL)
   8261 			{
   8262 			  bfd_set_error (bfd_error_bad_value);
   8263 			  ret = FALSE;
   8264 			}
   8265 		      else
   8266 			{
   8267 			  asection *osec;
   8268 
   8269 			  /* We are turning this relocation into one
   8270 			     against a section symbol.  It would be
   8271 			     proper to subtract the symbol's value,
   8272 			     osec->vma, from the emitted reloc addend,
   8273 			     but ld.so expects buggy relocs.
   8274 			     FIXME: Why not always use a zero index?  */
   8275 			  osec = sec->output_section;
   8276 			  indx = elf_section_data (osec)->dynindx;
   8277 			  if (indx == 0)
   8278 			    {
   8279 			      osec = htab->elf.text_index_section;
   8280 			      indx = elf_section_data (osec)->dynindx;
   8281 			    }
   8282 			  BFD_ASSERT (indx != 0);
   8283 #ifdef DEBUG
   8284 			  if (indx == 0)
   8285 			    printf ("indx=%ld section=%s flags=%08x name=%s\n",
   8286 				    indx, osec->name, osec->flags,
   8287 				    h->root.root.string);
   8288 #endif
   8289 			}
   8290 
   8291 		      outrel.r_info = ELF32_R_INFO (indx, r_type);
   8292 		    }
   8293 		  else if (ifunc != NULL)
   8294 		    outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
   8295 		  else
   8296 		    outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
   8297 		}
   8298 
   8299 	      loc = sreloc->contents;
   8300 	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   8301 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   8302 
   8303 	      if (skip == -1)
   8304 		continue;
   8305 
   8306 	      /* This reloc will be computed at runtime.  We clear the memory
   8307 		 so that it contains predictable value.  */
   8308 	      if (! skip
   8309 		  && ((input_section->flags & SEC_ALLOC) != 0
   8310 		      || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
   8311 		{
   8312 		  relocation = howto->pc_relative ? outrel.r_offset : 0;
   8313 		  addend = 0;
   8314 		  break;
   8315 		}
   8316 	    }
   8317 	  break;
   8318 
   8319 	case R_PPC_RELAX_PLT:
   8320 	case R_PPC_RELAX_PLTREL24:
   8321 	  if (h != NULL)
   8322 	    {
   8323 	      struct plt_entry *ent;
   8324 	      bfd_vma got2_addend = 0;
   8325 
   8326 	      if (r_type == R_PPC_RELAX_PLTREL24)
   8327 		{
   8328 		  if (info->shared)
   8329 		    got2_addend = addend;
   8330 		  addend = 0;
   8331 		}
   8332 	      ent = find_plt_ent (&h->plt.plist, got2, got2_addend);
   8333 	      if (htab->plt_type == PLT_NEW)
   8334 		relocation = (htab->glink->output_section->vma
   8335 			      + htab->glink->output_offset
   8336 			      + ent->glink_offset);
   8337 	      else
   8338 		relocation = (htab->plt->output_section->vma
   8339 			      + htab->plt->output_offset
   8340 			      + ent->plt.offset);
   8341 	    }
   8342 	  /* Fall thru */
   8343 
   8344 	case R_PPC_RELAX:
   8345 	  if (info->shared)
   8346 	    relocation -= (input_section->output_section->vma
   8347 			   + input_section->output_offset
   8348 			   + rel->r_offset - 4);
   8349 
   8350 	  {
   8351 	    unsigned long t0;
   8352 	    unsigned long t1;
   8353 
   8354 	    t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
   8355 	    t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
   8356 
   8357 	    /* We're clearing the bits for R_PPC_ADDR16_HA
   8358 	       and R_PPC_ADDR16_LO here.  */
   8359 	    t0 &= ~0xffff;
   8360 	    t1 &= ~0xffff;
   8361 
   8362 	    /* t0 is HA, t1 is LO */
   8363 	    relocation += addend;
   8364 	    t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
   8365 	    t1 |= relocation & 0xffff;
   8366 
   8367 	    bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
   8368 	    bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
   8369 
   8370 	    /* Rewrite the reloc and convert one of the trailing nop
   8371 	       relocs to describe this relocation.  */
   8372 	    BFD_ASSERT (ELF32_R_TYPE (relend[-1].r_info) == R_PPC_NONE);
   8373 	    /* The relocs are at the bottom 2 bytes */
   8374 	    rel[0].r_offset += 2;
   8375 	    memmove (rel + 1, rel, (relend - rel - 1) * sizeof (*rel));
   8376 	    rel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
   8377 	    rel[1].r_offset += 4;
   8378 	    rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
   8379 	    rel++;
   8380 	  }
   8381 	  continue;
   8382 
   8383 	  /* Indirect .sdata relocation.  */
   8384 	case R_PPC_EMB_SDAI16:
   8385 	  BFD_ASSERT (htab->sdata[0].section != NULL);
   8386 	  if (!is_static_defined (htab->sdata[0].sym))
   8387 	    {
   8388 	      unresolved_reloc = TRUE;
   8389 	      break;
   8390 	    }
   8391 	  relocation
   8392 	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
   8393 						 h, relocation, rel);
   8394 	  addend = 0;
   8395 	  break;
   8396 
   8397 	  /* Indirect .sdata2 relocation.  */
   8398 	case R_PPC_EMB_SDA2I16:
   8399 	  BFD_ASSERT (htab->sdata[1].section != NULL);
   8400 	  if (!is_static_defined (htab->sdata[1].sym))
   8401 	    {
   8402 	      unresolved_reloc = TRUE;
   8403 	      break;
   8404 	    }
   8405 	  relocation
   8406 	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
   8407 						 h, relocation, rel);
   8408 	  addend = 0;
   8409 	  break;
   8410 
   8411 	  /* Handle the TOC16 reloc.  We want to use the offset within the .got
   8412 	     section, not the actual VMA.  This is appropriate when generating
   8413 	     an embedded ELF object, for which the .got section acts like the
   8414 	     AIX .toc section.  */
   8415 	case R_PPC_TOC16:			/* phony GOT16 relocations */
   8416 	  if (sec == NULL || sec->output_section == NULL)
   8417 	    {
   8418 	      unresolved_reloc = TRUE;
   8419 	      break;
   8420 	    }
   8421 	  BFD_ASSERT (strcmp (bfd_get_section_name (sec->owner, sec),
   8422 			      ".got") == 0
   8423 		      || strcmp (bfd_get_section_name (sec->owner, sec),
   8424 				 ".cgot") == 0);
   8425 
   8426 	  addend -= sec->output_section->vma + sec->output_offset + 0x8000;
   8427 	  break;
   8428 
   8429 	case R_PPC_PLTREL24:
   8430 	  if (h != NULL && ifunc == NULL)
   8431 	    {
   8432 	      struct plt_entry *ent = find_plt_ent (&h->plt.plist, got2,
   8433 						    info->shared ? addend : 0);
   8434 	      if (ent == NULL
   8435 		  || htab->plt == NULL)
   8436 		{
   8437 		  /* We didn't make a PLT entry for this symbol.  This
   8438 		     happens when statically linking PIC code, or when
   8439 		     using -Bsymbolic.  */
   8440 		}
   8441 	      else
   8442 		{
   8443 		  /* Relocation is to the entry for this symbol in the
   8444 		     procedure linkage table.  */
   8445 		  unresolved_reloc = FALSE;
   8446 		  if (htab->plt_type == PLT_NEW)
   8447 		    relocation = (htab->glink->output_section->vma
   8448 				  + htab->glink->output_offset
   8449 				  + ent->glink_offset);
   8450 		  else
   8451 		    relocation = (htab->plt->output_section->vma
   8452 				  + htab->plt->output_offset
   8453 				  + ent->plt.offset);
   8454 		}
   8455 	    }
   8456 
   8457 	  /* R_PPC_PLTREL24 is rather special.  If non-zero, the
   8458 	     addend specifies the GOT pointer offset within .got2.
   8459 	     Don't apply it to the relocation field.  */
   8460 	  addend = 0;
   8461 	  break;
   8462 
   8463 	  /* Relocate against _SDA_BASE_.  */
   8464 	case R_PPC_SDAREL16:
   8465 	  {
   8466 	    const char *name;
   8467 	    struct elf_link_hash_entry *sda = htab->sdata[0].sym;
   8468 
   8469 	    if (sec == NULL
   8470 		|| sec->output_section == NULL
   8471 		|| !is_static_defined (sda))
   8472 	      {
   8473 		unresolved_reloc = TRUE;
   8474 		break;
   8475 	      }
   8476 	    addend -= SYM_VAL (sda);
   8477 
   8478 	    name = bfd_get_section_name (output_bfd, sec->output_section);
   8479 	    if (! ((CONST_STRNEQ (name, ".sdata")
   8480 		    && (name[6] == 0 || name[6] == '.'))
   8481 		   || (CONST_STRNEQ (name, ".sbss")
   8482 		       && (name[5] == 0 || name[5] == '.'))))
   8483 	      {
   8484 		info->callbacks->einfo
   8485 		  (_("%P: %B: the target (%s) of a %s relocation is "
   8486 		     "in the wrong output section (%s)\n"),
   8487 		   input_bfd,
   8488 		   sym_name,
   8489 		   howto->name,
   8490 		   name);
   8491 	      }
   8492 	  }
   8493 	  break;
   8494 
   8495 	  /* Relocate against _SDA2_BASE_.  */
   8496 	case R_PPC_EMB_SDA2REL:
   8497 	  {
   8498 	    const char *name;
   8499 	    struct elf_link_hash_entry *sda = htab->sdata[1].sym;
   8500 
   8501 	    if (sec == NULL
   8502 		|| sec->output_section == NULL
   8503 		|| !is_static_defined (sda))
   8504 	      {
   8505 		unresolved_reloc = TRUE;
   8506 		break;
   8507 	      }
   8508 	    addend -= SYM_VAL (sda);
   8509 
   8510 	    name = bfd_get_section_name (output_bfd, sec->output_section);
   8511 	    if (! (CONST_STRNEQ (name, ".sdata2")
   8512 		   || CONST_STRNEQ (name, ".sbss2")))
   8513 	      {
   8514 		info->callbacks->einfo
   8515 		  (_("%P: %B: the target (%s) of a %s relocation is "
   8516 		     "in the wrong output section (%s)\n"),
   8517 		   input_bfd,
   8518 		   sym_name,
   8519 		   howto->name,
   8520 		   name);
   8521 	      }
   8522 	  }
   8523 	  break;
   8524 
   8525 	case R_PPC_VLE_LO16A:
   8526 	  relocation = (relocation + addend) & 0xffff;
   8527 	  ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8528                                relocation, split16a_type);
   8529 	  continue;
   8530 
   8531 	case R_PPC_VLE_LO16D:
   8532 	  relocation = (relocation + addend) & 0xffff;
   8533 	  ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8534                                relocation, split16d_type);
   8535 	  continue;
   8536 
   8537 	case R_PPC_VLE_HI16A:
   8538 	  relocation = ((relocation + addend) >> 16) & 0xffff;
   8539 	  ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8540                                relocation, split16a_type);
   8541 	  continue;
   8542 
   8543 	case R_PPC_VLE_HI16D:
   8544 	  relocation = ((relocation + addend) >> 16) & 0xffff;
   8545 	  ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8546                                relocation, split16d_type);
   8547 	  continue;
   8548 
   8549 	case R_PPC_VLE_HA16A:
   8550 	  {
   8551 	    bfd_vma value = relocation + addend;
   8552 	    value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
   8553 	    ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8554                                  value, split16a_type);
   8555 	  }
   8556 	  continue;
   8557 
   8558 	case R_PPC_VLE_HA16D:
   8559 	  {
   8560 	    bfd_vma value = relocation + addend;
   8561 	    value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
   8562 	    ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8563                                  value, split16d_type);
   8564 	  }
   8565 	  continue;
   8566 
   8567 	  /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
   8568 	case R_PPC_EMB_SDA21:
   8569 	case R_PPC_VLE_SDA21:
   8570 	case R_PPC_EMB_RELSDA:
   8571 	case R_PPC_VLE_SDA21_LO:
   8572 	  {
   8573 	    const char *name;
   8574 	    int reg;
   8575 	    struct elf_link_hash_entry *sda = NULL;
   8576 
   8577 	    if (sec == NULL || sec->output_section == NULL)
   8578 	      {
   8579 		unresolved_reloc = TRUE;
   8580 		break;
   8581 	      }
   8582 
   8583 	    name = bfd_get_section_name (output_bfd, sec->output_section);
   8584 	    if (((CONST_STRNEQ (name, ".sdata")
   8585 		  && (name[6] == 0 || name[6] == '.'))
   8586 		 || (CONST_STRNEQ (name, ".sbss")
   8587 		     && (name[5] == 0 || name[5] == '.'))))
   8588 	      {
   8589 		reg = 13;
   8590 		sda = htab->sdata[0].sym;
   8591 	      }
   8592 	    else if (CONST_STRNEQ (name, ".sdata2")
   8593 		     || CONST_STRNEQ (name, ".sbss2"))
   8594 	      {
   8595 		reg = 2;
   8596 		sda = htab->sdata[1].sym;
   8597 	      }
   8598 	    else if (strcmp (name, ".PPC.EMB.sdata0") == 0
   8599 		     || strcmp (name, ".PPC.EMB.sbss0") == 0)
   8600 	      {
   8601 		reg = 0;
   8602 	      }
   8603 	    else
   8604 	      {
   8605 		info->callbacks->einfo
   8606 		  (_("%P: %B: the target (%s) of a %s relocation is "
   8607 		     "in the wrong output section (%s)\n"),
   8608 		   input_bfd,
   8609 		   sym_name,
   8610 		   howto->name,
   8611 		   name);
   8612 
   8613 		bfd_set_error (bfd_error_bad_value);
   8614 		ret = FALSE;
   8615 		continue;
   8616 	      }
   8617 
   8618 	    if (sda != NULL)
   8619 	      {
   8620 		if (!is_static_defined (sda))
   8621 		  {
   8622 		    unresolved_reloc = TRUE;
   8623 		    break;
   8624 		  }
   8625 		addend -= SYM_VAL (sda);
   8626 	      }
   8627 
   8628 	    if (reg == 0
   8629 		&& (r_type == R_PPC_VLE_SDA21
   8630 		    || r_type == R_PPC_VLE_SDA21_LO))
   8631 	      {
   8632 		/* Use the split20 format.  */
   8633 		bfd_vma insn, bits12to15, bits21to31;
   8634 		bfd_vma value  = (relocation + rel->r_offset) & 0xffff;
   8635 		/* Propagate sign bit, if necessary.  */
   8636 		insn = (value & 0x8000) ? 0x70107800 : 0x70000000;
   8637 		bits12to15 = value & 0x700;
   8638 		bits21to31 = value & 0x7ff;
   8639 		insn |= bits12to15;
   8640 		insn |= bits21to31;
   8641   		bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
   8642 		continue;
   8643 	      }
   8644 	    else if (r_type == R_PPC_EMB_SDA21
   8645 		     || r_type == R_PPC_VLE_SDA21
   8646 		     || r_type == R_PPC_VLE_SDA21_LO)
   8647 	      {
   8648 		bfd_vma insn;  /* Fill in register field.  */
   8649 
   8650 		insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
   8651 		insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
   8652 		bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
   8653 	      }
   8654 	  }
   8655 	  break;
   8656 
   8657 	case R_PPC_VLE_SDAREL_LO16A:
   8658 	case R_PPC_VLE_SDAREL_LO16D:
   8659 	case R_PPC_VLE_SDAREL_HI16A:
   8660 	case R_PPC_VLE_SDAREL_HI16D:
   8661 	case R_PPC_VLE_SDAREL_HA16A:
   8662 	case R_PPC_VLE_SDAREL_HA16D:
   8663 	  {
   8664 	    bfd_vma value;
   8665 	    const char *name;
   8666 	    //int reg;
   8667 	    struct elf_link_hash_entry *sda = NULL;
   8668 
   8669 	    if (sec == NULL || sec->output_section == NULL)
   8670 	      {
   8671 		unresolved_reloc = TRUE;
   8672 		break;
   8673 	      }
   8674 
   8675 	    name = bfd_get_section_name (output_bfd, sec->output_section);
   8676 	    if (((CONST_STRNEQ (name, ".sdata")
   8677 		  && (name[6] == 0 || name[6] == '.'))
   8678 		 || (CONST_STRNEQ (name, ".sbss")
   8679 		     && (name[5] == 0 || name[5] == '.'))))
   8680 	      {
   8681 		//reg = 13;
   8682 		sda = htab->sdata[0].sym;
   8683 	      }
   8684 	    else if (CONST_STRNEQ (name, ".sdata2")
   8685 		     || CONST_STRNEQ (name, ".sbss2"))
   8686 	      {
   8687 		//reg = 2;
   8688 		sda = htab->sdata[1].sym;
   8689 	      }
   8690 	    else
   8691 	      {
   8692 		(*_bfd_error_handler)
   8693 		  (_("%B: the target (%s) of a %s relocation is "
   8694 		     "in the wrong output section (%s)"),
   8695 		   input_bfd,
   8696 		   sym_name,
   8697 		   howto->name,
   8698 		   name);
   8699 
   8700 		bfd_set_error (bfd_error_bad_value);
   8701 		ret = FALSE;
   8702 		continue;
   8703 	      }
   8704 
   8705 	    if (sda != NULL)
   8706 	      {
   8707 		if (!is_static_defined (sda))
   8708 		  {
   8709 		    unresolved_reloc = TRUE;
   8710 		    break;
   8711 		  }
   8712 	      }
   8713 
   8714 	   value = sda->root.u.def.section->output_section->vma
   8715    		   + sda->root.u.def.section->output_offset;
   8716 
   8717 	   if (r_type == R_PPC_VLE_SDAREL_LO16A)
   8718 	      {
   8719 		value = (value + addend) & 0xffff;
   8720 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8721                                      value, split16a_type);
   8722 	      }
   8723 	   else if (r_type == R_PPC_VLE_SDAREL_LO16D)
   8724 	      {
   8725 		value = (value + addend) & 0xffff;
   8726 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8727                                      value, split16d_type);
   8728 	      }
   8729 	   else if (r_type == R_PPC_VLE_SDAREL_HI16A)
   8730 	      {
   8731 		value = ((value + addend) >> 16) & 0xffff;
   8732 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8733                                      value, split16a_type);
   8734 	      }
   8735 	   else if (r_type == R_PPC_VLE_SDAREL_HI16D)
   8736 	      {
   8737 		value = ((value + addend) >> 16) & 0xffff;
   8738 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8739                                      value, split16d_type);
   8740 	      }
   8741 	   else if (r_type == R_PPC_VLE_SDAREL_HA16A)
   8742 	      {
   8743 		value += addend;
   8744 		value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
   8745 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8746                                      value, split16a_type);
   8747 	      }
   8748 	   else if (r_type == R_PPC_VLE_SDAREL_HA16D)
   8749 	      {
   8750 		value += addend;
   8751 		value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
   8752 	        ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
   8753                                      value, split16d_type);
   8754 	      }
   8755 	  }
   8756 	  continue;
   8757 
   8758 	  /* Relocate against the beginning of the section.  */
   8759 	case R_PPC_SECTOFF:
   8760 	case R_PPC_SECTOFF_LO:
   8761 	case R_PPC_SECTOFF_HI:
   8762 	case R_PPC_SECTOFF_HA:
   8763 	  if (sec == NULL || sec->output_section == NULL)
   8764 	    {
   8765 	      unresolved_reloc = TRUE;
   8766 	      break;
   8767 	    }
   8768 	  addend -= sec->output_section->vma;
   8769 	  break;
   8770 
   8771 	  /* Negative relocations.  */
   8772 	case R_PPC_EMB_NADDR32:
   8773 	case R_PPC_EMB_NADDR16:
   8774 	case R_PPC_EMB_NADDR16_LO:
   8775 	case R_PPC_EMB_NADDR16_HI:
   8776 	case R_PPC_EMB_NADDR16_HA:
   8777 	  addend -= 2 * relocation;
   8778 	  break;
   8779 
   8780 	case R_PPC_COPY:
   8781 	case R_PPC_GLOB_DAT:
   8782 	case R_PPC_JMP_SLOT:
   8783 	case R_PPC_RELATIVE:
   8784 	case R_PPC_IRELATIVE:
   8785 	case R_PPC_PLT32:
   8786 	case R_PPC_PLTREL32:
   8787 	case R_PPC_PLT16_LO:
   8788 	case R_PPC_PLT16_HI:
   8789 	case R_PPC_PLT16_HA:
   8790 	case R_PPC_ADDR30:
   8791 	case R_PPC_EMB_RELSEC16:
   8792 	case R_PPC_EMB_RELST_LO:
   8793 	case R_PPC_EMB_RELST_HI:
   8794 	case R_PPC_EMB_RELST_HA:
   8795 	case R_PPC_EMB_BIT_FLD:
   8796 	  info->callbacks->einfo
   8797 	    (_("%P: %B: relocation %s is not yet supported for symbol %s\n"),
   8798 	     input_bfd,
   8799 	     howto->name,
   8800 	     sym_name);
   8801 
   8802 	  bfd_set_error (bfd_error_invalid_operation);
   8803 	  ret = FALSE;
   8804 	  continue;
   8805 	}
   8806 
   8807       /* Do any further special processing.  */
   8808       switch (r_type)
   8809 	{
   8810 	default:
   8811 	  break;
   8812 
   8813 	case R_PPC_ADDR16_HA:
   8814 	case R_PPC_REL16_HA:
   8815 	case R_PPC_SECTOFF_HA:
   8816 	case R_PPC_TPREL16_HA:
   8817 	case R_PPC_DTPREL16_HA:
   8818 	case R_PPC_EMB_NADDR16_HA:
   8819 	case R_PPC_EMB_RELST_HA:
   8820 	  /* It's just possible that this symbol is a weak symbol
   8821 	     that's not actually defined anywhere.  In that case,
   8822 	     'sec' would be NULL, and we should leave the symbol
   8823 	     alone (it will be set to zero elsewhere in the link).  */
   8824 	  if (sec == NULL)
   8825 	    break;
   8826 	  /* Fall thru */
   8827 
   8828 	case R_PPC_PLT16_HA:
   8829 	case R_PPC_GOT16_HA:
   8830 	case R_PPC_GOT_TLSGD16_HA:
   8831 	case R_PPC_GOT_TLSLD16_HA:
   8832 	case R_PPC_GOT_TPREL16_HA:
   8833 	case R_PPC_GOT_DTPREL16_HA:
   8834 	  /* Add 0x10000 if sign bit in 0:15 is set.
   8835 	     Bits 0:15 are not used.  */
   8836 	  addend += 0x8000;
   8837 	  break;
   8838 
   8839 	case R_PPC_ADDR16:
   8840 	case R_PPC_ADDR16_LO:
   8841 	case R_PPC_GOT16:
   8842 	case R_PPC_GOT16_LO:
   8843 	case R_PPC_SDAREL16:
   8844 	case R_PPC_SECTOFF:
   8845 	case R_PPC_SECTOFF_LO:
   8846 	case R_PPC_DTPREL16:
   8847 	case R_PPC_DTPREL16_LO:
   8848 	case R_PPC_TPREL16:
   8849 	case R_PPC_TPREL16_LO:
   8850 	case R_PPC_GOT_TLSGD16:
   8851 	case R_PPC_GOT_TLSGD16_LO:
   8852 	case R_PPC_GOT_TLSLD16:
   8853 	case R_PPC_GOT_TLSLD16_LO:
   8854 	case R_PPC_GOT_DTPREL16:
   8855 	case R_PPC_GOT_DTPREL16_LO:
   8856 	case R_PPC_GOT_TPREL16:
   8857 	case R_PPC_GOT_TPREL16_LO:
   8858 	  {
   8859 	    /* The 32-bit ABI lacks proper relocations to deal with
   8860 	       certain 64-bit instructions.  Prevent damage to bits
   8861 	       that make up part of the insn opcode.  */
   8862 	    unsigned int insn, mask, lobit;
   8863 
   8864 	    insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
   8865 	    mask = 0;
   8866 	    if (is_insn_ds_form (insn))
   8867 	      mask = 3;
   8868 	    else if (is_insn_dq_form (insn))
   8869 	      mask = 15;
   8870 	    else
   8871 	      break;
   8872 	    lobit = mask & (relocation + addend);
   8873 	    if (lobit != 0)
   8874 	      {
   8875 		addend -= lobit;
   8876 		info->callbacks->einfo
   8877 		  (_("%P: %H: error: %s against `%s' not a multiple of %u\n"),
   8878 		   input_bfd, input_section, rel->r_offset,
   8879 		   howto->name, sym_name, mask + 1);
   8880 		bfd_set_error (bfd_error_bad_value);
   8881 		ret = FALSE;
   8882 	      }
   8883 	    addend += insn & mask;
   8884 	  }
   8885 	  break;
   8886 	}
   8887 
   8888 #ifdef DEBUG
   8889       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
   8890 	       "offset = %ld, addend = %ld\n",
   8891 	       howto->name,
   8892 	       (int) r_type,
   8893 	       sym_name,
   8894 	       r_symndx,
   8895 	       (long) rel->r_offset,
   8896 	       (long) addend);
   8897 #endif
   8898 
   8899       if (unresolved_reloc
   8900 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   8901 	       && h->def_dynamic)
   8902 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   8903 				      rel->r_offset) != (bfd_vma) -1)
   8904 	{
   8905 	  info->callbacks->einfo
   8906 	    (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
   8907 	     input_bfd, input_section, rel->r_offset,
   8908 	     howto->name,
   8909 	     sym_name);
   8910 	  ret = FALSE;
   8911 	}
   8912 
   8913       r = _bfd_final_link_relocate (howto,
   8914 				    input_bfd,
   8915 				    input_section,
   8916 				    contents,
   8917 				    rel->r_offset,
   8918 				    relocation,
   8919 				    addend);
   8920 
   8921       if (r != bfd_reloc_ok)
   8922 	{
   8923 	  if (r == bfd_reloc_overflow)
   8924 	    {
   8925 	      if (warned)
   8926 		continue;
   8927 	      if (h != NULL
   8928 		  && h->root.type == bfd_link_hash_undefweak
   8929 		  && howto->pc_relative)
   8930 		{
   8931 		  /* Assume this is a call protected by other code that
   8932 		     detect the symbol is undefined.  If this is the case,
   8933 		     we can safely ignore the overflow.  If not, the
   8934 		     program is hosed anyway, and a little warning isn't
   8935 		     going to help.  */
   8936 
   8937 		  continue;
   8938 		}
   8939 
   8940 	      if (! (*info->callbacks->reloc_overflow) (info,
   8941 							(h ? &h->root : NULL),
   8942 							sym_name,
   8943 							howto->name,
   8944 							rel->r_addend,
   8945 							input_bfd,
   8946 							input_section,
   8947 							rel->r_offset))
   8948 		return FALSE;
   8949 	    }
   8950 	  else
   8951 	    {
   8952 	      info->callbacks->einfo
   8953 		(_("%P: %H: %s reloc against `%s': error %d\n"),
   8954 		 input_bfd, input_section, rel->r_offset,
   8955 		 howto->name, sym_name, (int) r);
   8956 	      ret = FALSE;
   8957 	    }
   8958 	}
   8959     }
   8960 
   8961 #ifdef DEBUG
   8962   fprintf (stderr, "\n");
   8963 #endif
   8964 
   8965   return ret;
   8966 }
   8967 
   8968 /* Finish up dynamic symbol handling.  We set the contents of various
   8970    dynamic sections here.  */
   8971 
   8972 static bfd_boolean
   8973 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
   8974 			       struct bfd_link_info *info,
   8975 			       struct elf_link_hash_entry *h,
   8976 			       Elf_Internal_Sym *sym)
   8977 {
   8978   struct ppc_elf_link_hash_table *htab;
   8979   struct plt_entry *ent;
   8980   bfd_boolean doneone;
   8981 
   8982 #ifdef DEBUG
   8983   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
   8984 	   h->root.root.string);
   8985 #endif
   8986 
   8987   htab = ppc_elf_hash_table (info);
   8988   BFD_ASSERT (htab->elf.dynobj != NULL);
   8989 
   8990   doneone = FALSE;
   8991   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
   8992     if (ent->plt.offset != (bfd_vma) -1)
   8993       {
   8994 	if (!doneone)
   8995 	  {
   8996 	    Elf_Internal_Rela rela;
   8997 	    bfd_byte *loc;
   8998 	    bfd_vma reloc_index;
   8999 
   9000 	    if (htab->plt_type == PLT_NEW
   9001 		|| !htab->elf.dynamic_sections_created
   9002 		|| h->dynindx == -1)
   9003 	      reloc_index = ent->plt.offset / 4;
   9004 	    else
   9005 	      {
   9006 		reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
   9007 			       / htab->plt_slot_size);
   9008 		if (reloc_index > PLT_NUM_SINGLE_ENTRIES
   9009 		    && htab->plt_type == PLT_OLD)
   9010 		  reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
   9011 	      }
   9012 
   9013 	    /* This symbol has an entry in the procedure linkage table.
   9014 	       Set it up.  */
   9015 	    if (htab->plt_type == PLT_VXWORKS
   9016 		&& htab->elf.dynamic_sections_created
   9017 		&& h->dynindx != -1)
   9018 	      {
   9019 		bfd_vma got_offset;
   9020 		const bfd_vma *plt_entry;
   9021 
   9022 		/* The first three entries in .got.plt are reserved.  */
   9023 		got_offset = (reloc_index + 3) * 4;
   9024 
   9025 		/* Use the right PLT. */
   9026 		plt_entry = info->shared ? ppc_elf_vxworks_pic_plt_entry
   9027 			    : ppc_elf_vxworks_plt_entry;
   9028 
   9029 		/* Fill in the .plt on VxWorks.  */
   9030 		if (info->shared)
   9031 		  {
   9032 		    bfd_put_32 (output_bfd,
   9033 				plt_entry[0] | PPC_HA (got_offset),
   9034 				htab->plt->contents + ent->plt.offset + 0);
   9035 		    bfd_put_32 (output_bfd,
   9036 				plt_entry[1] | PPC_LO (got_offset),
   9037 				htab->plt->contents + ent->plt.offset + 4);
   9038 		  }
   9039 		else
   9040 		  {
   9041 		    bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot);
   9042 
   9043 		    bfd_put_32 (output_bfd,
   9044 				plt_entry[0] | PPC_HA (got_loc),
   9045 				htab->plt->contents + ent->plt.offset + 0);
   9046 		    bfd_put_32 (output_bfd,
   9047 				plt_entry[1] | PPC_LO (got_loc),
   9048 				htab->plt->contents + ent->plt.offset + 4);
   9049 		  }
   9050 
   9051 		bfd_put_32 (output_bfd, plt_entry[2],
   9052 			    htab->plt->contents + ent->plt.offset + 8);
   9053 		bfd_put_32 (output_bfd, plt_entry[3],
   9054 			    htab->plt->contents + ent->plt.offset + 12);
   9055 
   9056 		/* This instruction is an immediate load.  The value loaded is
   9057 		   the byte offset of the R_PPC_JMP_SLOT relocation from the
   9058 		   start of the .rela.plt section.  The value is stored in the
   9059 		   low-order 16 bits of the load instruction.  */
   9060 		/* NOTE: It appears that this is now an index rather than a
   9061 		   prescaled offset.  */
   9062 		bfd_put_32 (output_bfd,
   9063 			    plt_entry[4] | reloc_index,
   9064 			    htab->plt->contents + ent->plt.offset + 16);
   9065 		/* This instruction is a PC-relative branch whose target is
   9066 		   the start of the PLT section.  The address of this branch
   9067 		   instruction is 20 bytes beyond the start of this PLT entry.
   9068 		   The address is encoded in bits 6-29, inclusive.  The value
   9069 		   stored is right-shifted by two bits, permitting a 26-bit
   9070 		   offset.  */
   9071 		bfd_put_32 (output_bfd,
   9072 			    (plt_entry[5]
   9073 			     | (-(ent->plt.offset + 20) & 0x03fffffc)),
   9074 			    htab->plt->contents + ent->plt.offset + 20);
   9075 		bfd_put_32 (output_bfd, plt_entry[6],
   9076 			    htab->plt->contents + ent->plt.offset + 24);
   9077 		bfd_put_32 (output_bfd, plt_entry[7],
   9078 			    htab->plt->contents + ent->plt.offset + 28);
   9079 
   9080 		/* Fill in the GOT entry corresponding to this PLT slot with
   9081 		   the address immediately after the "bctr" instruction
   9082 		   in this PLT entry.  */
   9083 		bfd_put_32 (output_bfd, (htab->plt->output_section->vma
   9084 					 + htab->plt->output_offset
   9085 					 + ent->plt.offset + 16),
   9086 			    htab->sgotplt->contents + got_offset);
   9087 
   9088 		if (!info->shared)
   9089 		  {
   9090 		    /* Fill in a couple of entries in .rela.plt.unloaded.  */
   9091 		    loc = htab->srelplt2->contents
   9092 		      + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
   9093 			  * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
   9094 			 * sizeof (Elf32_External_Rela));
   9095 
   9096 		    /* Provide the @ha relocation for the first instruction.  */
   9097 		    rela.r_offset = (htab->plt->output_section->vma
   9098 				     + htab->plt->output_offset
   9099 				     + ent->plt.offset + 2);
   9100 		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
   9101 						R_PPC_ADDR16_HA);
   9102 		    rela.r_addend = got_offset;
   9103 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9104 		    loc += sizeof (Elf32_External_Rela);
   9105 
   9106 		    /* Provide the @l relocation for the second instruction.  */
   9107 		    rela.r_offset = (htab->plt->output_section->vma
   9108 				     + htab->plt->output_offset
   9109 				     + ent->plt.offset + 6);
   9110 		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
   9111 						R_PPC_ADDR16_LO);
   9112 		    rela.r_addend = got_offset;
   9113 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9114 		    loc += sizeof (Elf32_External_Rela);
   9115 
   9116 		    /* Provide a relocation for the GOT entry corresponding to this
   9117 		       PLT slot.  Point it at the middle of the .plt entry.  */
   9118 		    rela.r_offset = (htab->sgotplt->output_section->vma
   9119 				     + htab->sgotplt->output_offset
   9120 				     + got_offset);
   9121 		    rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
   9122 						R_PPC_ADDR32);
   9123 		    rela.r_addend = ent->plt.offset + 16;
   9124 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9125 		  }
   9126 
   9127 		/* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
   9128 		   In particular, the offset for the relocation is not the
   9129 		   address of the PLT entry for this function, as specified
   9130 		   by the ABI.  Instead, the offset is set to the address of
   9131 		   the GOT slot for this function.  See EABI 4.4.4.1.  */
   9132 		rela.r_offset = (htab->sgotplt->output_section->vma
   9133 				 + htab->sgotplt->output_offset
   9134 				 + got_offset);
   9135 
   9136 	      }
   9137 	    else
   9138 	      {
   9139 		asection *splt = htab->plt;
   9140 		if (!htab->elf.dynamic_sections_created
   9141 		    || h->dynindx == -1)
   9142 		  splt = htab->iplt;
   9143 
   9144 		rela.r_offset = (splt->output_section->vma
   9145 				 + splt->output_offset
   9146 				 + ent->plt.offset);
   9147 		if (htab->plt_type == PLT_OLD
   9148 		    || !htab->elf.dynamic_sections_created
   9149 		    || h->dynindx == -1)
   9150 		  {
   9151 		    /* We don't need to fill in the .plt.  The ppc dynamic
   9152 		       linker will fill it in.  */
   9153 		  }
   9154 		else
   9155 		  {
   9156 		    bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
   9157 				   + htab->glink->output_section->vma
   9158 				   + htab->glink->output_offset);
   9159 		    bfd_put_32 (output_bfd, val,
   9160 				splt->contents + ent->plt.offset);
   9161 		  }
   9162 	      }
   9163 
   9164 	    /* Fill in the entry in the .rela.plt section.  */
   9165 	    rela.r_addend = 0;
   9166 	    if (!htab->elf.dynamic_sections_created
   9167 		|| h->dynindx == -1)
   9168 	      {
   9169 		BFD_ASSERT (h->type == STT_GNU_IFUNC
   9170 			    && h->def_regular
   9171 			    && (h->root.type == bfd_link_hash_defined
   9172 				|| h->root.type == bfd_link_hash_defweak));
   9173 		rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
   9174 		rela.r_addend = SYM_VAL (h);
   9175 	      }
   9176 	    else
   9177 	      rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
   9178 
   9179 	    if (!htab->elf.dynamic_sections_created
   9180 		|| h->dynindx == -1)
   9181 	      loc = (htab->reliplt->contents
   9182 		     + (htab->reliplt->reloc_count++
   9183 			* sizeof (Elf32_External_Rela)));
   9184 	    else
   9185 	      loc = (htab->relplt->contents
   9186 		     + reloc_index * sizeof (Elf32_External_Rela));
   9187 	    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9188 
   9189 	    if (!h->def_regular)
   9190 	      {
   9191 		/* Mark the symbol as undefined, rather than as
   9192 		   defined in the .plt section.  Leave the value if
   9193 		   there were any relocations where pointer equality
   9194 		   matters (this is a clue for the dynamic linker, to
   9195 		   make function pointer comparisons work between an
   9196 		   application and shared library), otherwise set it
   9197 		   to zero.  */
   9198 		sym->st_shndx = SHN_UNDEF;
   9199 		if (!h->pointer_equality_needed)
   9200 		  sym->st_value = 0;
   9201 		else if (!h->ref_regular_nonweak)
   9202 		  {
   9203 		    /* This breaks function pointer comparisons, but
   9204 		       that is better than breaking tests for a NULL
   9205 		       function pointer.  */
   9206 		    sym->st_value = 0;
   9207 		  }
   9208 	      }
   9209 	    else if (h->type == STT_GNU_IFUNC
   9210 		     && !info->shared)
   9211 	      {
   9212 		/* Set the value of ifunc symbols in a non-pie
   9213 		   executable to the glink entry.  This is to avoid
   9214 		   text relocations.  We can't do this for ifunc in
   9215 		   allocate_dynrelocs, as we do for normal dynamic
   9216 		   function symbols with plt entries, because we need
   9217 		   to keep the original value around for the ifunc
   9218 		   relocation.  */
   9219 		sym->st_shndx = (_bfd_elf_section_from_bfd_section
   9220 				 (output_bfd, htab->glink->output_section));
   9221 		sym->st_value = (ent->glink_offset
   9222 				 + htab->glink->output_offset
   9223 				 + htab->glink->output_section->vma);
   9224 	      }
   9225 	    doneone = TRUE;
   9226 	  }
   9227 
   9228 	if (htab->plt_type == PLT_NEW
   9229 	    || !htab->elf.dynamic_sections_created
   9230 	    || h->dynindx == -1)
   9231 	  {
   9232 	    unsigned char *p;
   9233 	    asection *splt = htab->plt;
   9234 	    if (!htab->elf.dynamic_sections_created
   9235 		|| h->dynindx == -1)
   9236 	      splt = htab->iplt;
   9237 
   9238 	    p = (unsigned char *) htab->glink->contents + ent->glink_offset;
   9239 
   9240 	    if (h == htab->tls_get_addr && !htab->no_tls_get_addr_opt)
   9241 	      {
   9242 		bfd_put_32 (output_bfd, LWZ_11_3, p);
   9243 		p += 4;
   9244 		bfd_put_32 (output_bfd, LWZ_12_3 + 4, p);
   9245 		p += 4;
   9246 		bfd_put_32 (output_bfd, MR_0_3, p);
   9247 		p += 4;
   9248 		bfd_put_32 (output_bfd, CMPWI_11_0, p);
   9249 		p += 4;
   9250 		bfd_put_32 (output_bfd, ADD_3_12_2, p);
   9251 		p += 4;
   9252 		bfd_put_32 (output_bfd, BEQLR, p);
   9253 		p += 4;
   9254 		bfd_put_32 (output_bfd, MR_3_0, p);
   9255 		p += 4;
   9256 		bfd_put_32 (output_bfd, NOP, p);
   9257 		p += 4;
   9258 	      }
   9259 
   9260 	    write_glink_stub (ent, splt, p, info);
   9261 
   9262 	    if (!info->shared)
   9263 	      /* We only need one non-PIC glink stub.  */
   9264 	      break;
   9265 	  }
   9266 	else
   9267 	  break;
   9268       }
   9269 
   9270   if (h->needs_copy)
   9271     {
   9272       asection *s;
   9273       Elf_Internal_Rela rela;
   9274       bfd_byte *loc;
   9275 
   9276       /* This symbols needs a copy reloc.  Set it up.  */
   9277 
   9278 #ifdef DEBUG
   9279       fprintf (stderr, ", copy");
   9280 #endif
   9281 
   9282       BFD_ASSERT (h->dynindx != -1);
   9283 
   9284       if (ppc_elf_hash_entry (h)->has_sda_refs)
   9285 	s = htab->relsbss;
   9286       else
   9287 	s = htab->relbss;
   9288       BFD_ASSERT (s != NULL);
   9289 
   9290       rela.r_offset = SYM_VAL (h);
   9291       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
   9292       rela.r_addend = 0;
   9293       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
   9294       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9295     }
   9296 
   9297 #ifdef DEBUG
   9298   fprintf (stderr, "\n");
   9299 #endif
   9300 
   9301   return TRUE;
   9302 }
   9303 
   9304 static enum elf_reloc_type_class
   9306 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
   9307 {
   9308   switch (ELF32_R_TYPE (rela->r_info))
   9309     {
   9310     case R_PPC_RELATIVE:
   9311       return reloc_class_relative;
   9312     case R_PPC_REL24:
   9313     case R_PPC_ADDR24:
   9314     case R_PPC_JMP_SLOT:
   9315       return reloc_class_plt;
   9316     case R_PPC_COPY:
   9317       return reloc_class_copy;
   9318     default:
   9319       return reloc_class_normal;
   9320     }
   9321 }
   9322 
   9323 /* Finish up the dynamic sections.  */
   9325 
   9326 static bfd_boolean
   9327 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
   9328 				 struct bfd_link_info *info)
   9329 {
   9330   asection *sdyn;
   9331   asection *splt;
   9332   struct ppc_elf_link_hash_table *htab;
   9333   bfd_vma got;
   9334   bfd *dynobj;
   9335   bfd_boolean ret = TRUE;
   9336 
   9337 #ifdef DEBUG
   9338   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
   9339 #endif
   9340 
   9341   htab = ppc_elf_hash_table (info);
   9342   dynobj = elf_hash_table (info)->dynobj;
   9343   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   9344   if (htab->is_vxworks)
   9345     splt = bfd_get_linker_section (dynobj, ".plt");
   9346   else
   9347     splt = NULL;
   9348 
   9349   got = 0;
   9350   if (htab->elf.hgot != NULL)
   9351     got = SYM_VAL (htab->elf.hgot);
   9352 
   9353   if (htab->elf.dynamic_sections_created)
   9354     {
   9355       Elf32_External_Dyn *dyncon, *dynconend;
   9356 
   9357       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
   9358 
   9359       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   9360       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   9361       for (; dyncon < dynconend; dyncon++)
   9362 	{
   9363 	  Elf_Internal_Dyn dyn;
   9364 	  asection *s;
   9365 
   9366 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   9367 
   9368 	  switch (dyn.d_tag)
   9369 	    {
   9370 	    case DT_PLTGOT:
   9371 	      if (htab->is_vxworks)
   9372 		s = htab->sgotplt;
   9373 	      else
   9374 		s = htab->plt;
   9375 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   9376 	      break;
   9377 
   9378 	    case DT_PLTRELSZ:
   9379 	      dyn.d_un.d_val = htab->relplt->size;
   9380 	      break;
   9381 
   9382 	    case DT_JMPREL:
   9383 	      s = htab->relplt;
   9384 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   9385 	      break;
   9386 
   9387 	    case DT_PPC_GOT:
   9388 	      dyn.d_un.d_ptr = got;
   9389 	      break;
   9390 
   9391 	    case DT_RELASZ:
   9392 	      if (htab->is_vxworks)
   9393 		{
   9394 		  if (htab->relplt)
   9395 		    dyn.d_un.d_ptr -= htab->relplt->size;
   9396 		  break;
   9397 		}
   9398 	      continue;
   9399 
   9400 	    default:
   9401 	      if (htab->is_vxworks
   9402 		  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
   9403 		break;
   9404 	      continue;
   9405 	    }
   9406 
   9407 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   9408 	}
   9409     }
   9410 
   9411   if (htab->got != NULL)
   9412     {
   9413       if (htab->elf.hgot->root.u.def.section == htab->got
   9414 	  || htab->elf.hgot->root.u.def.section == htab->sgotplt)
   9415 	{
   9416 	  unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
   9417 
   9418 	  p += htab->elf.hgot->root.u.def.value;
   9419 	  if (htab->plt_type == PLT_OLD)
   9420 	    {
   9421 	      /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
   9422 		 so that a function can easily find the address of
   9423 		 _GLOBAL_OFFSET_TABLE_.  */
   9424 	      BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
   9425 			  < htab->elf.hgot->root.u.def.section->size);
   9426 	      bfd_put_32 (output_bfd, 0x4e800021, p - 4);
   9427 	    }
   9428 
   9429 	  if (sdyn != NULL)
   9430 	    {
   9431 	      bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
   9432 	      BFD_ASSERT (htab->elf.hgot->root.u.def.value
   9433 			  < htab->elf.hgot->root.u.def.section->size);
   9434 	      bfd_put_32 (output_bfd, val, p);
   9435 	    }
   9436 	}
   9437       else
   9438 	{
   9439 	  info->callbacks->einfo (_("%P: %s not defined in linker created %s\n"),
   9440 				  htab->elf.hgot->root.root.string,
   9441 				  (htab->sgotplt != NULL
   9442 				   ? htab->sgotplt->name : htab->got->name));
   9443 	  bfd_set_error (bfd_error_bad_value);
   9444 	  ret = FALSE;
   9445 	}
   9446 
   9447       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
   9448     }
   9449 
   9450   /* Fill in the first entry in the VxWorks procedure linkage table.  */
   9451   if (splt && splt->size > 0)
   9452     {
   9453       /* Use the right PLT. */
   9454       const bfd_vma *plt_entry = (info->shared
   9455 				  ? ppc_elf_vxworks_pic_plt0_entry
   9456 				  : ppc_elf_vxworks_plt0_entry);
   9457 
   9458       if (!info->shared)
   9459 	{
   9460 	  bfd_vma got_value = SYM_VAL (htab->elf.hgot);
   9461 
   9462 	  bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value),
   9463 		      splt->contents +  0);
   9464 	  bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value),
   9465 		      splt->contents +  4);
   9466 	}
   9467       else
   9468 	{
   9469 	  bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
   9470 	  bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
   9471 	}
   9472       bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
   9473       bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
   9474       bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
   9475       bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
   9476       bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
   9477       bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
   9478 
   9479       if (! info->shared)
   9480 	{
   9481 	  Elf_Internal_Rela rela;
   9482 	  bfd_byte *loc;
   9483 
   9484 	  loc = htab->srelplt2->contents;
   9485 
   9486 	  /* Output the @ha relocation for the first instruction.  */
   9487 	  rela.r_offset = (htab->plt->output_section->vma
   9488 			   + htab->plt->output_offset
   9489 			   + 2);
   9490 	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
   9491 	  rela.r_addend = 0;
   9492 	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9493 	  loc += sizeof (Elf32_External_Rela);
   9494 
   9495 	  /* Output the @l relocation for the second instruction.  */
   9496 	  rela.r_offset = (htab->plt->output_section->vma
   9497 			   + htab->plt->output_offset
   9498 			   + 6);
   9499 	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
   9500 	  rela.r_addend = 0;
   9501 	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   9502 	  loc += sizeof (Elf32_External_Rela);
   9503 
   9504 	  /* Fix up the remaining relocations.  They may have the wrong
   9505 	     symbol index for _G_O_T_ or _P_L_T_ depending on the order
   9506 	     in which symbols were output.  */
   9507 	  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
   9508 	    {
   9509 	      Elf_Internal_Rela rel;
   9510 
   9511 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   9512 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
   9513 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   9514 	      loc += sizeof (Elf32_External_Rela);
   9515 
   9516 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   9517 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
   9518 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   9519 	      loc += sizeof (Elf32_External_Rela);
   9520 
   9521 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
   9522 	      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
   9523 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
   9524 	      loc += sizeof (Elf32_External_Rela);
   9525 	    }
   9526 	}
   9527     }
   9528 
   9529   if (htab->glink != NULL
   9530       && htab->glink->contents != NULL
   9531       && htab->elf.dynamic_sections_created)
   9532     {
   9533       unsigned char *p;
   9534       unsigned char *endp;
   9535       bfd_vma res0;
   9536       unsigned int i;
   9537 
   9538       /*
   9539        * PIC glink code is the following:
   9540        *
   9541        * # ith PLT code stub.
   9542        *   addis 11,30,(plt+(i-1)*4-got)@ha
   9543        *   lwz 11,(plt+(i-1)*4-got)@l(11)
   9544        *   mtctr 11
   9545        *   bctr
   9546        *
   9547        * # A table of branches, one for each plt entry.
   9548        * # The idea is that the plt call stub loads ctr and r11 with these
   9549        * # addresses, so (r11 - res_0) gives the plt index * 4.
   9550        * res_0:	b PLTresolve
   9551        * res_1:	b PLTresolve
   9552        * .
   9553        * # Some number of entries towards the end can be nops
   9554        * res_n_m3: nop
   9555        * res_n_m2: nop
   9556        * res_n_m1:
   9557        *
   9558        * PLTresolve:
   9559        *    addis 11,11,(1f-res_0)@ha
   9560        *    mflr 0
   9561        *    bcl 20,31,1f
   9562        * 1: addi 11,11,(1b-res_0)@l
   9563        *    mflr 12
   9564        *    mtlr 0
   9565        *    sub 11,11,12                # r11 = index * 4
   9566        *    addis 12,12,(got+4-1b)@ha
   9567        *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
   9568        *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
   9569        *    mtctr 0
   9570        *    add 0,11,11
   9571        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
   9572        *    bctr
   9573        */
   9574       static const unsigned int pic_plt_resolve[] =
   9575 	{
   9576 	  ADDIS_11_11,
   9577 	  MFLR_0,
   9578 	  BCL_20_31,
   9579 	  ADDI_11_11,
   9580 	  MFLR_12,
   9581 	  MTLR_0,
   9582 	  SUB_11_11_12,
   9583 	  ADDIS_12_12,
   9584 	  LWZ_0_12,
   9585 	  LWZ_12_12,
   9586 	  MTCTR_0,
   9587 	  ADD_0_11_11,
   9588 	  ADD_11_0_11,
   9589 	  BCTR,
   9590 	  NOP,
   9591 	  NOP
   9592 	};
   9593 
   9594       /*
   9595        * Non-PIC glink code is a little simpler.
   9596        *
   9597        * # ith PLT code stub.
   9598        *   lis 11,(plt+(i-1)*4)@ha
   9599        *   lwz 11,(plt+(i-1)*4)@l(11)
   9600        *   mtctr 11
   9601        *   bctr
   9602        *
   9603        * The branch table is the same, then comes
   9604        *
   9605        * PLTresolve:
   9606        *    lis 12,(got+4)@ha
   9607        *    addis 11,11,(-res_0)@ha
   9608        *    lwz 0,(got+4)@l(12)         # got[1] address of dl_runtime_resolve
   9609        *    addi 11,11,(-res_0)@l       # r11 = index * 4
   9610        *    mtctr 0
   9611        *    add 0,11,11
   9612        *    lwz 12,(got+8)@l(12)        # got[2] contains the map address
   9613        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
   9614        *    bctr
   9615        */
   9616       static const unsigned int plt_resolve[] =
   9617 	{
   9618 	  LIS_12,
   9619 	  ADDIS_11_11,
   9620 	  LWZ_0_12,
   9621 	  ADDI_11_11,
   9622 	  MTCTR_0,
   9623 	  ADD_0_11_11,
   9624 	  LWZ_12_12,
   9625 	  ADD_11_0_11,
   9626 	  BCTR,
   9627 	  NOP,
   9628 	  NOP,
   9629 	  NOP,
   9630 	  NOP,
   9631 	  NOP,
   9632 	  NOP,
   9633 	  NOP
   9634 	};
   9635 
   9636       if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
   9637 	abort ();
   9638       if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
   9639 	abort ();
   9640 
   9641       /* Build the branch table, one for each plt entry (less one),
   9642 	 and perhaps some padding.  */
   9643       p = htab->glink->contents;
   9644       p += htab->glink_pltresolve;
   9645       endp = htab->glink->contents;
   9646       endp += htab->glink->size - GLINK_PLTRESOLVE;
   9647       while (p < endp - 8 * 4)
   9648 	{
   9649 	  bfd_put_32 (output_bfd, B + endp - p, p);
   9650 	  p += 4;
   9651 	}
   9652       while (p < endp)
   9653 	{
   9654 	  bfd_put_32 (output_bfd, NOP, p);
   9655 	  p += 4;
   9656 	}
   9657 
   9658       res0 = (htab->glink_pltresolve
   9659 	      + htab->glink->output_section->vma
   9660 	      + htab->glink->output_offset);
   9661 
   9662       /* Last comes the PLTresolve stub.  */
   9663       if (info->shared)
   9664 	{
   9665 	  bfd_vma bcl;
   9666 
   9667 	  for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
   9668 	    {
   9669 	      bfd_put_32 (output_bfd, pic_plt_resolve[i], p);
   9670 	      p += 4;
   9671 	    }
   9672 	  p -= 4 * ARRAY_SIZE (pic_plt_resolve);
   9673 
   9674 	  bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
   9675 		 + htab->glink->output_section->vma
   9676 		 + htab->glink->output_offset);
   9677 
   9678 	  bfd_put_32 (output_bfd,
   9679 		      ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
   9680 	  bfd_put_32 (output_bfd,
   9681 		      ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
   9682 	  bfd_put_32 (output_bfd,
   9683 		      ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
   9684 	  if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
   9685 	    {
   9686 	      bfd_put_32 (output_bfd,
   9687 			  LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
   9688 	      bfd_put_32 (output_bfd,
   9689 			  LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
   9690 	    }
   9691 	  else
   9692 	    {
   9693 	      bfd_put_32 (output_bfd,
   9694 			  LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
   9695 	      bfd_put_32 (output_bfd,
   9696 			  LWZ_12_12 + 4, p + 9*4);
   9697 	    }
   9698 	}
   9699       else
   9700 	{
   9701 	  for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
   9702 	    {
   9703 	      bfd_put_32 (output_bfd, plt_resolve[i], p);
   9704 	      p += 4;
   9705 	    }
   9706 	  p -= 4 * ARRAY_SIZE (plt_resolve);
   9707 
   9708 	  bfd_put_32 (output_bfd,
   9709 		      LIS_12 + PPC_HA (got + 4), p + 0*4);
   9710 	  bfd_put_32 (output_bfd,
   9711 		      ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
   9712 	  bfd_put_32 (output_bfd,
   9713 		      ADDI_11_11 + PPC_LO (-res0), p + 3*4);
   9714 	  if (PPC_HA (got + 4) == PPC_HA (got + 8))
   9715 	    {
   9716 	      bfd_put_32 (output_bfd,
   9717 			  LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
   9718 	      bfd_put_32 (output_bfd,
   9719 			  LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
   9720 	    }
   9721 	  else
   9722 	    {
   9723 	      bfd_put_32 (output_bfd,
   9724 			  LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
   9725 	      bfd_put_32 (output_bfd,
   9726 			  LWZ_12_12 + 4, p + 6*4);
   9727 	    }
   9728 	}
   9729     }
   9730 
   9731   if (htab->glink_eh_frame != NULL
   9732       && htab->glink_eh_frame->contents != NULL)
   9733     {
   9734       unsigned char *p = htab->glink_eh_frame->contents;
   9735       bfd_vma val;
   9736 
   9737       p += sizeof (glink_eh_frame_cie);
   9738       /* FDE length.  */
   9739       p += 4;
   9740       /* CIE pointer.  */
   9741       p += 4;
   9742       /* Offset to .glink.  */
   9743       val = (htab->glink->output_section->vma
   9744 	     + htab->glink->output_offset);
   9745       val -= (htab->glink_eh_frame->output_section->vma
   9746 	      + htab->glink_eh_frame->output_offset);
   9747       val -= p - htab->glink_eh_frame->contents;
   9748       bfd_put_32 (htab->elf.dynobj, val, p);
   9749 
   9750       if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
   9751 	  && !_bfd_elf_write_section_eh_frame (output_bfd, info,
   9752 					       htab->glink_eh_frame,
   9753 					       htab->glink_eh_frame->contents))
   9754 	return FALSE;
   9755     }
   9756 
   9757   return ret;
   9758 }
   9759 
   9760 #define TARGET_LITTLE_SYM	bfd_elf32_powerpcle_vec
   9762 #define TARGET_LITTLE_NAME	"elf32-powerpcle"
   9763 #define TARGET_BIG_SYM		bfd_elf32_powerpc_vec
   9764 #define TARGET_BIG_NAME		"elf32-powerpc"
   9765 #define ELF_ARCH		bfd_arch_powerpc
   9766 #define ELF_TARGET_ID		PPC32_ELF_DATA
   9767 #define ELF_MACHINE_CODE	EM_PPC
   9768 #ifdef __QNXTARGET__
   9769 #define ELF_MAXPAGESIZE		0x1000
   9770 #else
   9771 #define ELF_MAXPAGESIZE		0x10000
   9772 #endif
   9773 #define ELF_MINPAGESIZE		0x1000
   9774 #define ELF_COMMONPAGESIZE	0x1000
   9775 #define elf_info_to_howto	ppc_elf_info_to_howto
   9776 
   9777 #ifdef  EM_CYGNUS_POWERPC
   9778 #define ELF_MACHINE_ALT1	EM_CYGNUS_POWERPC
   9779 #endif
   9780 
   9781 #ifdef EM_PPC_OLD
   9782 #define ELF_MACHINE_ALT2	EM_PPC_OLD
   9783 #endif
   9784 
   9785 #define elf_backend_plt_not_loaded	1
   9786 #define elf_backend_can_gc_sections	1
   9787 #define elf_backend_can_refcount	1
   9788 #define elf_backend_rela_normal		1
   9789 
   9790 #define bfd_elf32_mkobject			ppc_elf_mkobject
   9791 #define bfd_elf32_bfd_merge_private_bfd_data	ppc_elf_merge_private_bfd_data
   9792 #define bfd_elf32_bfd_relax_section		ppc_elf_relax_section
   9793 #define bfd_elf32_bfd_reloc_type_lookup		ppc_elf_reloc_type_lookup
   9794 #define bfd_elf32_bfd_reloc_name_lookup		ppc_elf_reloc_name_lookup
   9795 #define bfd_elf32_bfd_set_private_flags		ppc_elf_set_private_flags
   9796 #define bfd_elf32_bfd_link_hash_table_create	ppc_elf_link_hash_table_create
   9797 #define bfd_elf32_get_synthetic_symtab		ppc_elf_get_synthetic_symtab
   9798 
   9799 #define elf_backend_object_p			ppc_elf_object_p
   9800 #define elf_backend_gc_mark_hook		ppc_elf_gc_mark_hook
   9801 #define elf_backend_gc_sweep_hook		ppc_elf_gc_sweep_hook
   9802 #define elf_backend_section_from_shdr		ppc_elf_section_from_shdr
   9803 #define elf_backend_relocate_section		ppc_elf_relocate_section
   9804 #define elf_backend_create_dynamic_sections	ppc_elf_create_dynamic_sections
   9805 #define elf_backend_check_relocs		ppc_elf_check_relocs
   9806 #define elf_backend_copy_indirect_symbol	ppc_elf_copy_indirect_symbol
   9807 #define elf_backend_adjust_dynamic_symbol	ppc_elf_adjust_dynamic_symbol
   9808 #define elf_backend_add_symbol_hook		ppc_elf_add_symbol_hook
   9809 #define elf_backend_size_dynamic_sections	ppc_elf_size_dynamic_sections
   9810 #define elf_backend_hash_symbol			ppc_elf_hash_symbol
   9811 #define elf_backend_finish_dynamic_symbol	ppc_elf_finish_dynamic_symbol
   9812 #define elf_backend_finish_dynamic_sections	ppc_elf_finish_dynamic_sections
   9813 #define elf_backend_fake_sections		ppc_elf_fake_sections
   9814 #define elf_backend_additional_program_headers	ppc_elf_additional_program_headers
   9815 #define elf_backend_modify_segment_map     	ppc_elf_modify_segment_map
   9816 #define elf_backend_grok_prstatus		ppc_elf_grok_prstatus
   9817 #define elf_backend_grok_psinfo			ppc_elf_grok_psinfo
   9818 #define elf_backend_write_core_note		ppc_elf_write_core_note
   9819 #define elf_backend_reloc_type_class		ppc_elf_reloc_type_class
   9820 #define elf_backend_begin_write_processing	ppc_elf_begin_write_processing
   9821 #define elf_backend_final_write_processing	ppc_elf_final_write_processing
   9822 #define elf_backend_write_section		ppc_elf_write_section
   9823 #define elf_backend_get_sec_type_attr		ppc_elf_get_sec_type_attr
   9824 #define elf_backend_plt_sym_val			ppc_elf_plt_sym_val
   9825 #define elf_backend_action_discarded		ppc_elf_action_discarded
   9826 #define elf_backend_init_index_section		_bfd_elf_init_1_index_section
   9827 #define elf_backend_post_process_headers	_bfd_elf_set_osabi
   9828 #define elf_backend_lookup_section_flags_hook	ppc_elf_lookup_section_flags
   9829 #define elf_backend_section_processing		ppc_elf_section_processing
   9830 
   9831 #include "elf32-target.h"
   9832 
   9833 /* FreeBSD Target */
   9834 
   9835 #undef  TARGET_LITTLE_SYM
   9836 #undef  TARGET_LITTLE_NAME
   9837 
   9838 #undef  TARGET_BIG_SYM
   9839 #define TARGET_BIG_SYM  bfd_elf32_powerpc_freebsd_vec
   9840 #undef  TARGET_BIG_NAME
   9841 #define TARGET_BIG_NAME "elf32-powerpc-freebsd"
   9842 
   9843 #undef  ELF_OSABI
   9844 #define ELF_OSABI	ELFOSABI_FREEBSD
   9845 
   9846 #undef  elf32_bed
   9847 #define elf32_bed	elf32_powerpc_fbsd_bed
   9848 
   9849 #include "elf32-target.h"
   9850 
   9851 /* VxWorks Target */
   9852 
   9853 #undef TARGET_LITTLE_SYM
   9854 #undef TARGET_LITTLE_NAME
   9855 
   9856 #undef TARGET_BIG_SYM
   9857 #define TARGET_BIG_SYM		bfd_elf32_powerpc_vxworks_vec
   9858 #undef TARGET_BIG_NAME
   9859 #define TARGET_BIG_NAME		"elf32-powerpc-vxworks"
   9860 
   9861 #undef  ELF_OSABI
   9862 
   9863 /* VxWorks uses the elf default section flags for .plt.  */
   9864 static const struct bfd_elf_special_section *
   9865 ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
   9866 {
   9867   if (sec->name == NULL)
   9868     return NULL;
   9869 
   9870   if (strcmp (sec->name, ".plt") == 0)
   9871     return _bfd_elf_get_sec_type_attr (abfd, sec);
   9872 
   9873   return ppc_elf_get_sec_type_attr (abfd, sec);
   9874 }
   9875 
   9876 /* Like ppc_elf_link_hash_table_create, but overrides
   9877    appropriately for VxWorks.  */
   9878 static struct bfd_link_hash_table *
   9879 ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
   9880 {
   9881   struct bfd_link_hash_table *ret;
   9882 
   9883   ret = ppc_elf_link_hash_table_create (abfd);
   9884   if (ret)
   9885     {
   9886       struct ppc_elf_link_hash_table *htab
   9887         = (struct ppc_elf_link_hash_table *)ret;
   9888       htab->is_vxworks = 1;
   9889       htab->plt_type = PLT_VXWORKS;
   9890       htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
   9891       htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
   9892       htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
   9893     }
   9894   return ret;
   9895 }
   9896 
   9897 /* Tweak magic VxWorks symbols as they are loaded.  */
   9898 static bfd_boolean
   9899 ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
   9900 				 struct bfd_link_info *info,
   9901 				 Elf_Internal_Sym *sym,
   9902 				 const char **namep ATTRIBUTE_UNUSED,
   9903 				 flagword *flagsp ATTRIBUTE_UNUSED,
   9904 				 asection **secp,
   9905 				 bfd_vma *valp)
   9906 {
   9907   if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
   9908 				   valp))
   9909     return FALSE;
   9910 
   9911   return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
   9912 }
   9913 
   9914 static void
   9915 ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
   9916 {
   9917   ppc_elf_final_write_processing(abfd, linker);
   9918   elf_vxworks_final_write_processing(abfd, linker);
   9919 }
   9920 
   9921 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
   9922    define it.  */
   9923 #undef elf_backend_want_plt_sym
   9924 #define elf_backend_want_plt_sym		1
   9925 #undef elf_backend_want_got_plt
   9926 #define elf_backend_want_got_plt		1
   9927 #undef elf_backend_got_symbol_offset
   9928 #define elf_backend_got_symbol_offset		0
   9929 #undef elf_backend_plt_not_loaded
   9930 #define elf_backend_plt_not_loaded		0
   9931 #undef elf_backend_plt_readonly
   9932 #define elf_backend_plt_readonly		1
   9933 #undef elf_backend_got_header_size
   9934 #define elf_backend_got_header_size		12
   9935 
   9936 #undef bfd_elf32_get_synthetic_symtab
   9937 
   9938 #undef bfd_elf32_bfd_link_hash_table_create
   9939 #define bfd_elf32_bfd_link_hash_table_create \
   9940   ppc_elf_vxworks_link_hash_table_create
   9941 #undef elf_backend_add_symbol_hook
   9942 #define elf_backend_add_symbol_hook \
   9943   ppc_elf_vxworks_add_symbol_hook
   9944 #undef elf_backend_link_output_symbol_hook
   9945 #define elf_backend_link_output_symbol_hook \
   9946   elf_vxworks_link_output_symbol_hook
   9947 #undef elf_backend_final_write_processing
   9948 #define elf_backend_final_write_processing \
   9949   ppc_elf_vxworks_final_write_processing
   9950 #undef elf_backend_get_sec_type_attr
   9951 #define elf_backend_get_sec_type_attr \
   9952   ppc_elf_vxworks_get_sec_type_attr
   9953 #undef elf_backend_emit_relocs
   9954 #define elf_backend_emit_relocs \
   9955   elf_vxworks_emit_relocs
   9956 
   9957 #undef elf32_bed
   9958 #define elf32_bed				ppc_elf_vxworks_bed
   9959 #undef elf_backend_post_process_headers
   9960 
   9961 #include "elf32-target.h"
   9962