Home | History | Annotate | Line # | Download | only in bfd
elf32-arm.c revision 1.1.1.1
      1 /* 32-bit ELF support for ARM
      2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
      3    2008 Free Software Foundation, Inc.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 #include "sysdep.h"
     23 #include "bfd.h"
     24 #include "libiberty.h"
     25 #include "libbfd.h"
     26 #include "elf-bfd.h"
     27 #include "elf-vxworks.h"
     28 #include "elf/arm.h"
     29 
     30 /* Return the relocation section associated with NAME.  HTAB is the
     31    bfd's elf32_arm_link_hash_entry.  */
     32 #define RELOC_SECTION(HTAB, NAME) \
     33   ((HTAB)->use_rel ? ".rel" NAME : ".rela" NAME)
     34 
     35 /* Return size of a relocation entry.  HTAB is the bfd's
     36    elf32_arm_link_hash_entry.  */
     37 #define RELOC_SIZE(HTAB) \
     38   ((HTAB)->use_rel \
     39    ? sizeof (Elf32_External_Rel) \
     40    : sizeof (Elf32_External_Rela))
     41 
     42 /* Return function to swap relocations in.  HTAB is the bfd's
     43    elf32_arm_link_hash_entry.  */
     44 #define SWAP_RELOC_IN(HTAB) \
     45   ((HTAB)->use_rel \
     46    ? bfd_elf32_swap_reloc_in \
     47    : bfd_elf32_swap_reloca_in)
     48 
     49 /* Return function to swap relocations out.  HTAB is the bfd's
     50    elf32_arm_link_hash_entry.  */
     51 #define SWAP_RELOC_OUT(HTAB) \
     52   ((HTAB)->use_rel \
     53    ? bfd_elf32_swap_reloc_out \
     54    : bfd_elf32_swap_reloca_out)
     55 
     56 #define elf_info_to_howto               0
     57 #define elf_info_to_howto_rel           elf32_arm_info_to_howto
     58 
     59 #define ARM_ELF_ABI_VERSION		0
     60 #define ARM_ELF_OS_ABI_VERSION		ELFOSABI_ARM
     61 
     62 static struct elf_backend_data elf32_arm_vxworks_bed;
     63 
     64 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
     65    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
     66    in that slot.  */
     67 
     68 static reloc_howto_type elf32_arm_howto_table_1[] =
     69 {
     70   /* No relocation.  */
     71   HOWTO (R_ARM_NONE,		/* type */
     72 	 0,			/* rightshift */
     73 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
     74 	 0,			/* bitsize */
     75 	 FALSE,			/* pc_relative */
     76 	 0,			/* bitpos */
     77 	 complain_overflow_dont,/* complain_on_overflow */
     78 	 bfd_elf_generic_reloc,	/* special_function */
     79 	 "R_ARM_NONE",		/* name */
     80 	 FALSE,			/* partial_inplace */
     81 	 0,			/* src_mask */
     82 	 0,			/* dst_mask */
     83 	 FALSE),		/* pcrel_offset */
     84 
     85   HOWTO (R_ARM_PC24,		/* type */
     86 	 2,			/* rightshift */
     87 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
     88 	 24,			/* bitsize */
     89 	 TRUE,			/* pc_relative */
     90 	 0,			/* bitpos */
     91 	 complain_overflow_signed,/* complain_on_overflow */
     92 	 bfd_elf_generic_reloc,	/* special_function */
     93 	 "R_ARM_PC24",		/* name */
     94 	 FALSE,			/* partial_inplace */
     95 	 0x00ffffff,		/* src_mask */
     96 	 0x00ffffff,		/* dst_mask */
     97 	 TRUE),			/* pcrel_offset */
     98 
     99   /* 32 bit absolute */
    100   HOWTO (R_ARM_ABS32,		/* type */
    101 	 0,			/* rightshift */
    102 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    103 	 32,			/* bitsize */
    104 	 FALSE,			/* pc_relative */
    105 	 0,			/* bitpos */
    106 	 complain_overflow_bitfield,/* complain_on_overflow */
    107 	 bfd_elf_generic_reloc,	/* special_function */
    108 	 "R_ARM_ABS32",		/* name */
    109 	 FALSE,			/* partial_inplace */
    110 	 0xffffffff,		/* src_mask */
    111 	 0xffffffff,		/* dst_mask */
    112 	 FALSE),		/* pcrel_offset */
    113 
    114   /* standard 32bit pc-relative reloc */
    115   HOWTO (R_ARM_REL32,		/* type */
    116 	 0,			/* rightshift */
    117 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    118 	 32,			/* bitsize */
    119 	 TRUE,			/* pc_relative */
    120 	 0,			/* bitpos */
    121 	 complain_overflow_bitfield,/* complain_on_overflow */
    122 	 bfd_elf_generic_reloc,	/* special_function */
    123 	 "R_ARM_REL32",		/* name */
    124 	 FALSE,			/* partial_inplace */
    125 	 0xffffffff,		/* src_mask */
    126 	 0xffffffff,		/* dst_mask */
    127 	 TRUE),			/* pcrel_offset */
    128 
    129   /* 8 bit absolute - R_ARM_LDR_PC_G0 in AAELF */
    130   HOWTO (R_ARM_LDR_PC_G0,	/* type */
    131 	 0,			/* rightshift */
    132 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    133 	 32,			/* bitsize */
    134 	 TRUE,			/* pc_relative */
    135 	 0,			/* bitpos */
    136 	 complain_overflow_dont,/* complain_on_overflow */
    137 	 bfd_elf_generic_reloc,	/* special_function */
    138 	 "R_ARM_LDR_PC_G0",     /* name */
    139 	 FALSE,			/* partial_inplace */
    140 	 0xffffffff,		/* src_mask */
    141 	 0xffffffff,		/* dst_mask */
    142 	 TRUE),			/* pcrel_offset */
    143 
    144    /* 16 bit absolute */
    145   HOWTO (R_ARM_ABS16,		/* type */
    146 	 0,			/* rightshift */
    147 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    148 	 16,			/* bitsize */
    149 	 FALSE,			/* pc_relative */
    150 	 0,			/* bitpos */
    151 	 complain_overflow_bitfield,/* complain_on_overflow */
    152 	 bfd_elf_generic_reloc,	/* special_function */
    153 	 "R_ARM_ABS16",		/* name */
    154 	 FALSE,			/* partial_inplace */
    155 	 0x0000ffff,		/* src_mask */
    156 	 0x0000ffff,		/* dst_mask */
    157 	 FALSE),		/* pcrel_offset */
    158 
    159   /* 12 bit absolute */
    160   HOWTO (R_ARM_ABS12,		/* type */
    161 	 0,			/* rightshift */
    162 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    163 	 12,			/* bitsize */
    164 	 FALSE,			/* pc_relative */
    165 	 0,			/* bitpos */
    166 	 complain_overflow_bitfield,/* complain_on_overflow */
    167 	 bfd_elf_generic_reloc,	/* special_function */
    168 	 "R_ARM_ABS12",		/* name */
    169 	 FALSE,			/* partial_inplace */
    170 	 0x00000fff,		/* src_mask */
    171 	 0x00000fff,		/* dst_mask */
    172 	 FALSE),		/* pcrel_offset */
    173 
    174   HOWTO (R_ARM_THM_ABS5,	/* type */
    175 	 6,			/* rightshift */
    176 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    177 	 5,			/* bitsize */
    178 	 FALSE,			/* pc_relative */
    179 	 0,			/* bitpos */
    180 	 complain_overflow_bitfield,/* complain_on_overflow */
    181 	 bfd_elf_generic_reloc,	/* special_function */
    182 	 "R_ARM_THM_ABS5",	/* name */
    183 	 FALSE,			/* partial_inplace */
    184 	 0x000007e0,		/* src_mask */
    185 	 0x000007e0,		/* dst_mask */
    186 	 FALSE),		/* pcrel_offset */
    187 
    188   /* 8 bit absolute */
    189   HOWTO (R_ARM_ABS8,		/* type */
    190 	 0,			/* rightshift */
    191 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    192 	 8,			/* bitsize */
    193 	 FALSE,			/* pc_relative */
    194 	 0,			/* bitpos */
    195 	 complain_overflow_bitfield,/* complain_on_overflow */
    196 	 bfd_elf_generic_reloc,	/* special_function */
    197 	 "R_ARM_ABS8",		/* name */
    198 	 FALSE,			/* partial_inplace */
    199 	 0x000000ff,		/* src_mask */
    200 	 0x000000ff,		/* dst_mask */
    201 	 FALSE),		/* pcrel_offset */
    202 
    203   HOWTO (R_ARM_SBREL32,		/* type */
    204 	 0,			/* rightshift */
    205 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    206 	 32,			/* bitsize */
    207 	 FALSE,			/* pc_relative */
    208 	 0,			/* bitpos */
    209 	 complain_overflow_dont,/* complain_on_overflow */
    210 	 bfd_elf_generic_reloc,	/* special_function */
    211 	 "R_ARM_SBREL32",	/* name */
    212 	 FALSE,			/* partial_inplace */
    213 	 0xffffffff,		/* src_mask */
    214 	 0xffffffff,		/* dst_mask */
    215 	 FALSE),		/* pcrel_offset */
    216 
    217   HOWTO (R_ARM_THM_CALL,	/* type */
    218 	 1,			/* rightshift */
    219 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    220 	 25,			/* bitsize */
    221 	 TRUE,			/* pc_relative */
    222 	 0,			/* bitpos */
    223 	 complain_overflow_signed,/* complain_on_overflow */
    224 	 bfd_elf_generic_reloc,	/* special_function */
    225 	 "R_ARM_THM_CALL",	/* name */
    226 	 FALSE,			/* partial_inplace */
    227 	 0x07ff07ff,		/* src_mask */
    228 	 0x07ff07ff,		/* dst_mask */
    229 	 TRUE),			/* pcrel_offset */
    230 
    231   HOWTO (R_ARM_THM_PC8,	        /* type */
    232 	 1,			/* rightshift */
    233 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    234 	 8,			/* bitsize */
    235 	 TRUE,			/* pc_relative */
    236 	 0,			/* bitpos */
    237 	 complain_overflow_signed,/* complain_on_overflow */
    238 	 bfd_elf_generic_reloc,	/* special_function */
    239 	 "R_ARM_THM_PC8",	/* name */
    240 	 FALSE,			/* partial_inplace */
    241 	 0x000000ff,		/* src_mask */
    242 	 0x000000ff,		/* dst_mask */
    243 	 TRUE),			/* pcrel_offset */
    244 
    245   HOWTO (R_ARM_BREL_ADJ,	/* type */
    246 	 1,			/* rightshift */
    247 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    248 	 32,			/* bitsize */
    249 	 FALSE,			/* pc_relative */
    250 	 0,			/* bitpos */
    251 	 complain_overflow_signed,/* complain_on_overflow */
    252 	 bfd_elf_generic_reloc,	/* special_function */
    253 	 "R_ARM_BREL_ADJ",	/* name */
    254 	 FALSE,			/* partial_inplace */
    255 	 0xffffffff,		/* src_mask */
    256 	 0xffffffff,		/* dst_mask */
    257 	 FALSE),		/* pcrel_offset */
    258 
    259   HOWTO (R_ARM_SWI24,		/* type */
    260 	 0,			/* rightshift */
    261 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    262 	 0,			/* bitsize */
    263 	 FALSE,			/* pc_relative */
    264 	 0,			/* bitpos */
    265 	 complain_overflow_signed,/* complain_on_overflow */
    266 	 bfd_elf_generic_reloc,	/* special_function */
    267 	 "R_ARM_SWI24",		/* name */
    268 	 FALSE,			/* partial_inplace */
    269 	 0x00000000,		/* src_mask */
    270 	 0x00000000,		/* dst_mask */
    271 	 FALSE),		/* pcrel_offset */
    272 
    273   HOWTO (R_ARM_THM_SWI8,	/* type */
    274 	 0,			/* rightshift */
    275 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    276 	 0,			/* bitsize */
    277 	 FALSE,			/* pc_relative */
    278 	 0,			/* bitpos */
    279 	 complain_overflow_signed,/* complain_on_overflow */
    280 	 bfd_elf_generic_reloc,	/* special_function */
    281 	 "R_ARM_SWI8",		/* name */
    282 	 FALSE,			/* partial_inplace */
    283 	 0x00000000,		/* src_mask */
    284 	 0x00000000,		/* dst_mask */
    285 	 FALSE),		/* pcrel_offset */
    286 
    287   /* BLX instruction for the ARM.  */
    288   HOWTO (R_ARM_XPC25,		/* type */
    289 	 2,			/* rightshift */
    290 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    291 	 25,			/* bitsize */
    292 	 TRUE,			/* pc_relative */
    293 	 0,			/* bitpos */
    294 	 complain_overflow_signed,/* complain_on_overflow */
    295 	 bfd_elf_generic_reloc,	/* special_function */
    296 	 "R_ARM_XPC25",		/* name */
    297 	 FALSE,			/* partial_inplace */
    298 	 0x00ffffff,		/* src_mask */
    299 	 0x00ffffff,		/* dst_mask */
    300 	 TRUE),			/* pcrel_offset */
    301 
    302   /* BLX instruction for the Thumb.  */
    303   HOWTO (R_ARM_THM_XPC22,	/* type */
    304 	 2,			/* rightshift */
    305 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    306 	 22,			/* bitsize */
    307 	 TRUE,			/* pc_relative */
    308 	 0,			/* bitpos */
    309 	 complain_overflow_signed,/* complain_on_overflow */
    310 	 bfd_elf_generic_reloc,	/* special_function */
    311 	 "R_ARM_THM_XPC22",	/* name */
    312 	 FALSE,			/* partial_inplace */
    313 	 0x07ff07ff,		/* src_mask */
    314 	 0x07ff07ff,		/* dst_mask */
    315 	 TRUE),			/* pcrel_offset */
    316 
    317   /* Dynamic TLS relocations.  */
    318 
    319   HOWTO (R_ARM_TLS_DTPMOD32,	/* type */
    320          0,                     /* rightshift */
    321          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    322          32,                    /* bitsize */
    323          FALSE,                 /* pc_relative */
    324          0,                     /* bitpos */
    325          complain_overflow_bitfield,/* complain_on_overflow */
    326          bfd_elf_generic_reloc, /* special_function */
    327          "R_ARM_TLS_DTPMOD32",	/* name */
    328          TRUE,			/* partial_inplace */
    329          0xffffffff,		/* src_mask */
    330          0xffffffff,		/* dst_mask */
    331          FALSE),                /* pcrel_offset */
    332 
    333   HOWTO (R_ARM_TLS_DTPOFF32,	/* type */
    334          0,                     /* rightshift */
    335          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    336          32,                    /* bitsize */
    337          FALSE,                 /* pc_relative */
    338          0,                     /* bitpos */
    339          complain_overflow_bitfield,/* complain_on_overflow */
    340          bfd_elf_generic_reloc, /* special_function */
    341          "R_ARM_TLS_DTPOFF32",	/* name */
    342          TRUE,			/* partial_inplace */
    343          0xffffffff,		/* src_mask */
    344          0xffffffff,		/* dst_mask */
    345          FALSE),                /* pcrel_offset */
    346 
    347   HOWTO (R_ARM_TLS_TPOFF32,	/* type */
    348          0,                     /* rightshift */
    349          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    350          32,                    /* bitsize */
    351          FALSE,                 /* pc_relative */
    352          0,                     /* bitpos */
    353          complain_overflow_bitfield,/* complain_on_overflow */
    354          bfd_elf_generic_reloc, /* special_function */
    355          "R_ARM_TLS_TPOFF32",	/* name */
    356          TRUE,			/* partial_inplace */
    357          0xffffffff,		/* src_mask */
    358          0xffffffff,		/* dst_mask */
    359          FALSE),                /* pcrel_offset */
    360 
    361   /* Relocs used in ARM Linux */
    362 
    363   HOWTO (R_ARM_COPY,		/* type */
    364          0,                     /* rightshift */
    365          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    366          32,                    /* bitsize */
    367          FALSE,                 /* pc_relative */
    368          0,                     /* bitpos */
    369          complain_overflow_bitfield,/* complain_on_overflow */
    370          bfd_elf_generic_reloc, /* special_function */
    371          "R_ARM_COPY",		/* name */
    372          TRUE,			/* partial_inplace */
    373          0xffffffff,		/* src_mask */
    374          0xffffffff,		/* dst_mask */
    375          FALSE),                /* pcrel_offset */
    376 
    377   HOWTO (R_ARM_GLOB_DAT,	/* type */
    378          0,                     /* rightshift */
    379          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    380          32,                    /* bitsize */
    381          FALSE,                 /* pc_relative */
    382          0,                     /* bitpos */
    383          complain_overflow_bitfield,/* complain_on_overflow */
    384          bfd_elf_generic_reloc, /* special_function */
    385          "R_ARM_GLOB_DAT",	/* name */
    386          TRUE,			/* partial_inplace */
    387          0xffffffff,		/* src_mask */
    388          0xffffffff,		/* dst_mask */
    389          FALSE),                /* pcrel_offset */
    390 
    391   HOWTO (R_ARM_JUMP_SLOT,	/* type */
    392          0,                     /* rightshift */
    393          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    394          32,                    /* bitsize */
    395          FALSE,                 /* pc_relative */
    396          0,                     /* bitpos */
    397          complain_overflow_bitfield,/* complain_on_overflow */
    398          bfd_elf_generic_reloc, /* special_function */
    399          "R_ARM_JUMP_SLOT",	/* name */
    400          TRUE,			/* partial_inplace */
    401          0xffffffff,		/* src_mask */
    402          0xffffffff,		/* dst_mask */
    403          FALSE),                /* pcrel_offset */
    404 
    405   HOWTO (R_ARM_RELATIVE,	/* type */
    406          0,                     /* rightshift */
    407          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    408          32,                    /* bitsize */
    409          FALSE,                 /* pc_relative */
    410          0,                     /* bitpos */
    411          complain_overflow_bitfield,/* complain_on_overflow */
    412          bfd_elf_generic_reloc, /* special_function */
    413          "R_ARM_RELATIVE",	/* name */
    414          TRUE,			/* partial_inplace */
    415          0xffffffff,		/* src_mask */
    416          0xffffffff,		/* dst_mask */
    417          FALSE),                /* pcrel_offset */
    418 
    419   HOWTO (R_ARM_GOTOFF32,	/* type */
    420          0,                     /* rightshift */
    421          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    422          32,                    /* bitsize */
    423          FALSE,                 /* pc_relative */
    424          0,                     /* bitpos */
    425          complain_overflow_bitfield,/* complain_on_overflow */
    426          bfd_elf_generic_reloc, /* special_function */
    427          "R_ARM_GOTOFF32",	/* name */
    428          TRUE,			/* partial_inplace */
    429          0xffffffff,		/* src_mask */
    430          0xffffffff,		/* dst_mask */
    431          FALSE),                /* pcrel_offset */
    432 
    433   HOWTO (R_ARM_GOTPC,		/* type */
    434          0,                     /* rightshift */
    435          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    436          32,                    /* bitsize */
    437          TRUE,			/* pc_relative */
    438          0,                     /* bitpos */
    439          complain_overflow_bitfield,/* complain_on_overflow */
    440          bfd_elf_generic_reloc, /* special_function */
    441          "R_ARM_GOTPC",		/* name */
    442          TRUE,			/* partial_inplace */
    443          0xffffffff,		/* src_mask */
    444          0xffffffff,		/* dst_mask */
    445          TRUE),			/* pcrel_offset */
    446 
    447   HOWTO (R_ARM_GOT32,		/* type */
    448          0,                     /* rightshift */
    449          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    450          32,                    /* bitsize */
    451          FALSE,			/* pc_relative */
    452          0,                     /* bitpos */
    453          complain_overflow_bitfield,/* complain_on_overflow */
    454          bfd_elf_generic_reloc, /* special_function */
    455          "R_ARM_GOT32",		/* name */
    456          TRUE,			/* partial_inplace */
    457          0xffffffff,		/* src_mask */
    458          0xffffffff,		/* dst_mask */
    459          FALSE),		/* pcrel_offset */
    460 
    461   HOWTO (R_ARM_PLT32,		/* type */
    462          2,                     /* rightshift */
    463          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    464          24,                    /* bitsize */
    465          TRUE,			/* pc_relative */
    466          0,                     /* bitpos */
    467          complain_overflow_bitfield,/* complain_on_overflow */
    468          bfd_elf_generic_reloc, /* special_function */
    469          "R_ARM_PLT32",		/* name */
    470          FALSE,			/* partial_inplace */
    471          0x00ffffff,		/* src_mask */
    472          0x00ffffff,		/* dst_mask */
    473          TRUE),			/* pcrel_offset */
    474 
    475   HOWTO (R_ARM_CALL,		/* type */
    476 	 2,			/* rightshift */
    477 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    478 	 24,			/* bitsize */
    479 	 TRUE,			/* pc_relative */
    480 	 0,			/* bitpos */
    481 	 complain_overflow_signed,/* complain_on_overflow */
    482 	 bfd_elf_generic_reloc,	/* special_function */
    483 	 "R_ARM_CALL",		/* name */
    484 	 FALSE,			/* partial_inplace */
    485 	 0x00ffffff,		/* src_mask */
    486 	 0x00ffffff,		/* dst_mask */
    487 	 TRUE),			/* pcrel_offset */
    488 
    489   HOWTO (R_ARM_JUMP24,		/* type */
    490 	 2,			/* rightshift */
    491 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    492 	 24,			/* bitsize */
    493 	 TRUE,			/* pc_relative */
    494 	 0,			/* bitpos */
    495 	 complain_overflow_signed,/* complain_on_overflow */
    496 	 bfd_elf_generic_reloc,	/* special_function */
    497 	 "R_ARM_JUMP24",	/* name */
    498 	 FALSE,			/* partial_inplace */
    499 	 0x00ffffff,		/* src_mask */
    500 	 0x00ffffff,		/* dst_mask */
    501 	 TRUE),			/* pcrel_offset */
    502 
    503   HOWTO (R_ARM_THM_JUMP24,	/* type */
    504 	 1,			/* rightshift */
    505 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    506 	 24,			/* bitsize */
    507 	 TRUE,			/* pc_relative */
    508 	 0,			/* bitpos */
    509 	 complain_overflow_signed,/* complain_on_overflow */
    510 	 bfd_elf_generic_reloc,	/* special_function */
    511 	 "R_ARM_THM_JUMP24",	/* name */
    512 	 FALSE,			/* partial_inplace */
    513 	 0x07ff2fff,		/* src_mask */
    514 	 0x07ff2fff,		/* dst_mask */
    515 	 TRUE),			/* pcrel_offset */
    516 
    517   HOWTO (R_ARM_BASE_ABS,	/* type */
    518 	 0,			/* rightshift */
    519 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    520 	 32,			/* bitsize */
    521 	 FALSE,			/* pc_relative */
    522 	 0,			/* bitpos */
    523 	 complain_overflow_dont,/* complain_on_overflow */
    524 	 bfd_elf_generic_reloc,	/* special_function */
    525 	 "R_ARM_BASE_ABS",	/* name */
    526 	 FALSE,			/* partial_inplace */
    527 	 0xffffffff,		/* src_mask */
    528 	 0xffffffff,		/* dst_mask */
    529 	 FALSE),		/* pcrel_offset */
    530 
    531   HOWTO (R_ARM_ALU_PCREL7_0,	/* type */
    532 	 0,			/* rightshift */
    533 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    534 	 12,			/* bitsize */
    535 	 TRUE,			/* pc_relative */
    536 	 0,			/* bitpos */
    537 	 complain_overflow_dont,/* complain_on_overflow */
    538 	 bfd_elf_generic_reloc,	/* special_function */
    539 	 "R_ARM_ALU_PCREL_7_0",	/* name */
    540 	 FALSE,			/* partial_inplace */
    541 	 0x00000fff,		/* src_mask */
    542 	 0x00000fff,		/* dst_mask */
    543 	 TRUE),			/* pcrel_offset */
    544 
    545   HOWTO (R_ARM_ALU_PCREL15_8,	/* type */
    546 	 0,			/* rightshift */
    547 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    548 	 12,			/* bitsize */
    549 	 TRUE,			/* pc_relative */
    550 	 8,			/* bitpos */
    551 	 complain_overflow_dont,/* complain_on_overflow */
    552 	 bfd_elf_generic_reloc,	/* special_function */
    553 	 "R_ARM_ALU_PCREL_15_8",/* name */
    554 	 FALSE,			/* partial_inplace */
    555 	 0x00000fff,		/* src_mask */
    556 	 0x00000fff,		/* dst_mask */
    557 	 TRUE),			/* pcrel_offset */
    558 
    559   HOWTO (R_ARM_ALU_PCREL23_15,	/* type */
    560 	 0,			/* rightshift */
    561 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    562 	 12,			/* bitsize */
    563 	 TRUE,			/* pc_relative */
    564 	 16,			/* bitpos */
    565 	 complain_overflow_dont,/* complain_on_overflow */
    566 	 bfd_elf_generic_reloc,	/* special_function */
    567 	 "R_ARM_ALU_PCREL_23_15",/* name */
    568 	 FALSE,			/* partial_inplace */
    569 	 0x00000fff,		/* src_mask */
    570 	 0x00000fff,		/* dst_mask */
    571 	 TRUE),			/* pcrel_offset */
    572 
    573   HOWTO (R_ARM_LDR_SBREL_11_0,	/* type */
    574 	 0,			/* rightshift */
    575 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    576 	 12,			/* bitsize */
    577 	 FALSE,			/* pc_relative */
    578 	 0,			/* bitpos */
    579 	 complain_overflow_dont,/* complain_on_overflow */
    580 	 bfd_elf_generic_reloc,	/* special_function */
    581 	 "R_ARM_LDR_SBREL_11_0",/* name */
    582 	 FALSE,			/* partial_inplace */
    583 	 0x00000fff,		/* src_mask */
    584 	 0x00000fff,		/* dst_mask */
    585 	 FALSE),		/* pcrel_offset */
    586 
    587   HOWTO (R_ARM_ALU_SBREL_19_12,	/* type */
    588 	 0,			/* rightshift */
    589 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    590 	 8,			/* bitsize */
    591 	 FALSE,			/* pc_relative */
    592 	 12,			/* bitpos */
    593 	 complain_overflow_dont,/* complain_on_overflow */
    594 	 bfd_elf_generic_reloc,	/* special_function */
    595 	 "R_ARM_ALU_SBREL_19_12",/* name */
    596 	 FALSE,			/* partial_inplace */
    597 	 0x000ff000,		/* src_mask */
    598 	 0x000ff000,		/* dst_mask */
    599 	 FALSE),		/* pcrel_offset */
    600 
    601   HOWTO (R_ARM_ALU_SBREL_27_20,	/* type */
    602 	 0,			/* rightshift */
    603 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    604 	 8,			/* bitsize */
    605 	 FALSE,			/* pc_relative */
    606 	 20,			/* bitpos */
    607 	 complain_overflow_dont,/* complain_on_overflow */
    608 	 bfd_elf_generic_reloc,	/* special_function */
    609 	 "R_ARM_ALU_SBREL_27_20",/* name */
    610 	 FALSE,			/* partial_inplace */
    611 	 0x0ff00000,		/* src_mask */
    612 	 0x0ff00000,		/* dst_mask */
    613 	 FALSE),		/* pcrel_offset */
    614 
    615   HOWTO (R_ARM_TARGET1,		/* type */
    616 	 0,			/* rightshift */
    617 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    618 	 32,			/* bitsize */
    619 	 FALSE,			/* pc_relative */
    620 	 0,			/* bitpos */
    621 	 complain_overflow_dont,/* complain_on_overflow */
    622 	 bfd_elf_generic_reloc,	/* special_function */
    623 	 "R_ARM_TARGET1",	/* name */
    624 	 FALSE,			/* partial_inplace */
    625 	 0xffffffff,		/* src_mask */
    626 	 0xffffffff,		/* dst_mask */
    627 	 FALSE),		/* pcrel_offset */
    628 
    629   HOWTO (R_ARM_ROSEGREL32,	/* type */
    630 	 0,			/* rightshift */
    631 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    632 	 32,			/* bitsize */
    633 	 FALSE,			/* pc_relative */
    634 	 0,			/* bitpos */
    635 	 complain_overflow_dont,/* complain_on_overflow */
    636 	 bfd_elf_generic_reloc,	/* special_function */
    637 	 "R_ARM_ROSEGREL32",	/* name */
    638 	 FALSE,			/* partial_inplace */
    639 	 0xffffffff,		/* src_mask */
    640 	 0xffffffff,		/* dst_mask */
    641 	 FALSE),		/* pcrel_offset */
    642 
    643   HOWTO (R_ARM_V4BX,		/* type */
    644 	 0,			/* rightshift */
    645 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    646 	 32,			/* bitsize */
    647 	 FALSE,			/* pc_relative */
    648 	 0,			/* bitpos */
    649 	 complain_overflow_dont,/* complain_on_overflow */
    650 	 bfd_elf_generic_reloc,	/* special_function */
    651 	 "R_ARM_V4BX",		/* name */
    652 	 FALSE,			/* partial_inplace */
    653 	 0xffffffff,		/* src_mask */
    654 	 0xffffffff,		/* dst_mask */
    655 	 FALSE),		/* pcrel_offset */
    656 
    657   HOWTO (R_ARM_TARGET2,		/* type */
    658 	 0,			/* rightshift */
    659 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    660 	 32,			/* bitsize */
    661 	 FALSE,			/* pc_relative */
    662 	 0,			/* bitpos */
    663 	 complain_overflow_signed,/* complain_on_overflow */
    664 	 bfd_elf_generic_reloc,	/* special_function */
    665 	 "R_ARM_TARGET2",	/* name */
    666 	 FALSE,			/* partial_inplace */
    667 	 0xffffffff,		/* src_mask */
    668 	 0xffffffff,		/* dst_mask */
    669 	 TRUE),			/* pcrel_offset */
    670 
    671   HOWTO (R_ARM_PREL31,		/* type */
    672 	 0,			/* rightshift */
    673 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    674 	 31,			/* bitsize */
    675 	 TRUE,			/* pc_relative */
    676 	 0,			/* bitpos */
    677 	 complain_overflow_signed,/* complain_on_overflow */
    678 	 bfd_elf_generic_reloc,	/* special_function */
    679 	 "R_ARM_PREL31",	/* name */
    680 	 FALSE,			/* partial_inplace */
    681 	 0x7fffffff,		/* src_mask */
    682 	 0x7fffffff,		/* dst_mask */
    683 	 TRUE),			/* pcrel_offset */
    684 
    685   HOWTO (R_ARM_MOVW_ABS_NC,	/* type */
    686 	 0,			/* rightshift */
    687 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    688 	 16,			/* bitsize */
    689 	 FALSE,			/* pc_relative */
    690 	 0,			/* bitpos */
    691 	 complain_overflow_dont,/* complain_on_overflow */
    692 	 bfd_elf_generic_reloc,	/* special_function */
    693 	 "R_ARM_MOVW_ABS_NC",	/* name */
    694 	 FALSE,			/* partial_inplace */
    695 	 0x000f0fff,		/* src_mask */
    696 	 0x000f0fff,		/* dst_mask */
    697 	 FALSE),		/* pcrel_offset */
    698 
    699   HOWTO (R_ARM_MOVT_ABS,	/* type */
    700 	 0,			/* rightshift */
    701 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    702 	 16,			/* bitsize */
    703 	 FALSE,			/* pc_relative */
    704 	 0,			/* bitpos */
    705 	 complain_overflow_bitfield,/* complain_on_overflow */
    706 	 bfd_elf_generic_reloc,	/* special_function */
    707 	 "R_ARM_MOVT_ABS",	/* name */
    708 	 FALSE,			/* partial_inplace */
    709 	 0x000f0fff,		/* src_mask */
    710 	 0x000f0fff,		/* dst_mask */
    711 	 FALSE),		/* pcrel_offset */
    712 
    713   HOWTO (R_ARM_MOVW_PREL_NC,	/* type */
    714 	 0,			/* rightshift */
    715 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    716 	 16,			/* bitsize */
    717 	 TRUE,			/* pc_relative */
    718 	 0,			/* bitpos */
    719 	 complain_overflow_dont,/* complain_on_overflow */
    720 	 bfd_elf_generic_reloc,	/* special_function */
    721 	 "R_ARM_MOVW_PREL_NC",	/* name */
    722 	 FALSE,			/* partial_inplace */
    723 	 0x000f0fff,		/* src_mask */
    724 	 0x000f0fff,		/* dst_mask */
    725 	 TRUE),			/* pcrel_offset */
    726 
    727   HOWTO (R_ARM_MOVT_PREL,	/* type */
    728 	 0,			/* rightshift */
    729 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    730 	 16,			/* bitsize */
    731 	 TRUE,			/* pc_relative */
    732 	 0,			/* bitpos */
    733 	 complain_overflow_bitfield,/* complain_on_overflow */
    734 	 bfd_elf_generic_reloc,	/* special_function */
    735 	 "R_ARM_MOVT_PREL",	/* name */
    736 	 FALSE,			/* partial_inplace */
    737 	 0x000f0fff,		/* src_mask */
    738 	 0x000f0fff,		/* dst_mask */
    739 	 TRUE),			/* pcrel_offset */
    740 
    741   HOWTO (R_ARM_THM_MOVW_ABS_NC,	/* type */
    742 	 0,			/* rightshift */
    743 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    744 	 16,			/* bitsize */
    745 	 FALSE,			/* pc_relative */
    746 	 0,			/* bitpos */
    747 	 complain_overflow_dont,/* complain_on_overflow */
    748 	 bfd_elf_generic_reloc,	/* special_function */
    749 	 "R_ARM_THM_MOVW_ABS_NC",/* name */
    750 	 FALSE,			/* partial_inplace */
    751 	 0x040f70ff,		/* src_mask */
    752 	 0x040f70ff,		/* dst_mask */
    753 	 FALSE),		/* pcrel_offset */
    754 
    755   HOWTO (R_ARM_THM_MOVT_ABS,	/* type */
    756 	 0,			/* rightshift */
    757 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    758 	 16,			/* bitsize */
    759 	 FALSE,			/* pc_relative */
    760 	 0,			/* bitpos */
    761 	 complain_overflow_bitfield,/* complain_on_overflow */
    762 	 bfd_elf_generic_reloc,	/* special_function */
    763 	 "R_ARM_THM_MOVT_ABS",	/* name */
    764 	 FALSE,			/* partial_inplace */
    765 	 0x040f70ff,		/* src_mask */
    766 	 0x040f70ff,		/* dst_mask */
    767 	 FALSE),		/* pcrel_offset */
    768 
    769   HOWTO (R_ARM_THM_MOVW_PREL_NC,/* type */
    770 	 0,			/* rightshift */
    771 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    772 	 16,			/* bitsize */
    773 	 TRUE,			/* pc_relative */
    774 	 0,			/* bitpos */
    775 	 complain_overflow_dont,/* complain_on_overflow */
    776 	 bfd_elf_generic_reloc,	/* special_function */
    777 	 "R_ARM_THM_MOVW_PREL_NC",/* name */
    778 	 FALSE,			/* partial_inplace */
    779 	 0x040f70ff,		/* src_mask */
    780 	 0x040f70ff,		/* dst_mask */
    781 	 TRUE),			/* pcrel_offset */
    782 
    783   HOWTO (R_ARM_THM_MOVT_PREL,	/* type */
    784 	 0,			/* rightshift */
    785 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    786 	 16,			/* bitsize */
    787 	 TRUE,			/* pc_relative */
    788 	 0,			/* bitpos */
    789 	 complain_overflow_bitfield,/* complain_on_overflow */
    790 	 bfd_elf_generic_reloc,	/* special_function */
    791 	 "R_ARM_THM_MOVT_PREL",	/* name */
    792 	 FALSE,			/* partial_inplace */
    793 	 0x040f70ff,		/* src_mask */
    794 	 0x040f70ff,		/* dst_mask */
    795 	 TRUE),			/* pcrel_offset */
    796 
    797   HOWTO (R_ARM_THM_JUMP19,	/* type */
    798 	 1,			/* rightshift */
    799 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    800 	 19,			/* bitsize */
    801 	 TRUE,			/* pc_relative */
    802 	 0,			/* bitpos */
    803 	 complain_overflow_signed,/* complain_on_overflow */
    804 	 bfd_elf_generic_reloc, /* special_function */
    805 	 "R_ARM_THM_JUMP19",	/* name */
    806 	 FALSE,			/* partial_inplace */
    807 	 0x043f2fff,		/* src_mask */
    808 	 0x043f2fff,		/* dst_mask */
    809 	 TRUE),			/* pcrel_offset */
    810 
    811   HOWTO (R_ARM_THM_JUMP6,	/* type */
    812 	 1,			/* rightshift */
    813 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    814 	 6,			/* bitsize */
    815 	 TRUE,			/* pc_relative */
    816 	 0,			/* bitpos */
    817 	 complain_overflow_unsigned,/* complain_on_overflow */
    818 	 bfd_elf_generic_reloc,	/* special_function */
    819 	 "R_ARM_THM_JUMP6",	/* name */
    820 	 FALSE,			/* partial_inplace */
    821 	 0x02f8,		/* src_mask */
    822 	 0x02f8,		/* dst_mask */
    823 	 TRUE),			/* pcrel_offset */
    824 
    825   /* These are declared as 13-bit signed relocations because we can
    826      address -4095 .. 4095(base) by altering ADDW to SUBW or vice
    827      versa.  */
    828   HOWTO (R_ARM_THM_ALU_PREL_11_0,/* type */
    829 	 0,			/* rightshift */
    830 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    831 	 13,			/* bitsize */
    832 	 TRUE,			/* pc_relative */
    833 	 0,			/* bitpos */
    834 	 complain_overflow_dont,/* complain_on_overflow */
    835 	 bfd_elf_generic_reloc,	/* special_function */
    836 	 "R_ARM_THM_ALU_PREL_11_0",/* name */
    837 	 FALSE,			/* partial_inplace */
    838 	 0xffffffff,		/* src_mask */
    839 	 0xffffffff,		/* dst_mask */
    840 	 TRUE),			/* pcrel_offset */
    841 
    842   HOWTO (R_ARM_THM_PC12,	/* type */
    843 	 0,			/* rightshift */
    844 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    845 	 13,			/* bitsize */
    846 	 TRUE,			/* pc_relative */
    847 	 0,			/* bitpos */
    848 	 complain_overflow_dont,/* complain_on_overflow */
    849 	 bfd_elf_generic_reloc,	/* special_function */
    850 	 "R_ARM_THM_PC12",	/* name */
    851 	 FALSE,			/* partial_inplace */
    852 	 0xffffffff,		/* src_mask */
    853 	 0xffffffff,		/* dst_mask */
    854 	 TRUE),			/* pcrel_offset */
    855 
    856   HOWTO (R_ARM_ABS32_NOI,	/* type */
    857 	 0,			/* rightshift */
    858 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    859 	 32,			/* bitsize */
    860 	 FALSE,			/* pc_relative */
    861 	 0,			/* bitpos */
    862 	 complain_overflow_dont,/* complain_on_overflow */
    863 	 bfd_elf_generic_reloc,	/* special_function */
    864 	 "R_ARM_ABS32_NOI",	/* name */
    865 	 FALSE,			/* partial_inplace */
    866 	 0xffffffff,		/* src_mask */
    867 	 0xffffffff,		/* dst_mask */
    868 	 FALSE),		/* pcrel_offset */
    869 
    870   HOWTO (R_ARM_REL32_NOI,	/* type */
    871 	 0,			/* rightshift */
    872 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    873 	 32,			/* bitsize */
    874 	 TRUE,			/* pc_relative */
    875 	 0,			/* bitpos */
    876 	 complain_overflow_dont,/* complain_on_overflow */
    877 	 bfd_elf_generic_reloc,	/* special_function */
    878 	 "R_ARM_REL32_NOI",	/* name */
    879 	 FALSE,			/* partial_inplace */
    880 	 0xffffffff,		/* src_mask */
    881 	 0xffffffff,		/* dst_mask */
    882 	 FALSE),		/* pcrel_offset */
    883 
    884   /* Group relocations.  */
    885 
    886   HOWTO (R_ARM_ALU_PC_G0_NC,	/* type */
    887 	 0,			/* rightshift */
    888 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    889 	 32,			/* bitsize */
    890 	 TRUE,			/* pc_relative */
    891 	 0,			/* bitpos */
    892 	 complain_overflow_dont,/* complain_on_overflow */
    893 	 bfd_elf_generic_reloc,	/* special_function */
    894 	 "R_ARM_ALU_PC_G0_NC",	/* name */
    895 	 FALSE,			/* partial_inplace */
    896 	 0xffffffff,		/* src_mask */
    897 	 0xffffffff,		/* dst_mask */
    898 	 TRUE),			/* pcrel_offset */
    899 
    900   HOWTO (R_ARM_ALU_PC_G0,   	/* type */
    901 	 0,			/* rightshift */
    902 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    903 	 32,			/* bitsize */
    904 	 TRUE,			/* pc_relative */
    905 	 0,			/* bitpos */
    906 	 complain_overflow_dont,/* complain_on_overflow */
    907 	 bfd_elf_generic_reloc,	/* special_function */
    908 	 "R_ARM_ALU_PC_G0",   	/* name */
    909 	 FALSE,			/* partial_inplace */
    910 	 0xffffffff,		/* src_mask */
    911 	 0xffffffff,		/* dst_mask */
    912 	 TRUE),			/* pcrel_offset */
    913 
    914   HOWTO (R_ARM_ALU_PC_G1_NC,	/* type */
    915 	 0,			/* rightshift */
    916 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    917 	 32,			/* bitsize */
    918 	 TRUE,			/* pc_relative */
    919 	 0,			/* bitpos */
    920 	 complain_overflow_dont,/* complain_on_overflow */
    921 	 bfd_elf_generic_reloc,	/* special_function */
    922 	 "R_ARM_ALU_PC_G1_NC",	/* name */
    923 	 FALSE,			/* partial_inplace */
    924 	 0xffffffff,		/* src_mask */
    925 	 0xffffffff,		/* dst_mask */
    926 	 TRUE),			/* pcrel_offset */
    927 
    928   HOWTO (R_ARM_ALU_PC_G1,   	/* type */
    929 	 0,			/* rightshift */
    930 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    931 	 32,			/* bitsize */
    932 	 TRUE,			/* pc_relative */
    933 	 0,			/* bitpos */
    934 	 complain_overflow_dont,/* complain_on_overflow */
    935 	 bfd_elf_generic_reloc,	/* special_function */
    936 	 "R_ARM_ALU_PC_G1",   	/* name */
    937 	 FALSE,			/* partial_inplace */
    938 	 0xffffffff,		/* src_mask */
    939 	 0xffffffff,		/* dst_mask */
    940 	 TRUE),			/* pcrel_offset */
    941 
    942   HOWTO (R_ARM_ALU_PC_G2,   	/* type */
    943 	 0,			/* rightshift */
    944 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    945 	 32,			/* bitsize */
    946 	 TRUE,			/* pc_relative */
    947 	 0,			/* bitpos */
    948 	 complain_overflow_dont,/* complain_on_overflow */
    949 	 bfd_elf_generic_reloc,	/* special_function */
    950 	 "R_ARM_ALU_PC_G2",   	/* name */
    951 	 FALSE,			/* partial_inplace */
    952 	 0xffffffff,		/* src_mask */
    953 	 0xffffffff,		/* dst_mask */
    954 	 TRUE),			/* pcrel_offset */
    955 
    956   HOWTO (R_ARM_LDR_PC_G1,   	/* type */
    957 	 0,			/* rightshift */
    958 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    959 	 32,			/* bitsize */
    960 	 TRUE,			/* pc_relative */
    961 	 0,			/* bitpos */
    962 	 complain_overflow_dont,/* complain_on_overflow */
    963 	 bfd_elf_generic_reloc,	/* special_function */
    964 	 "R_ARM_LDR_PC_G1",   	/* name */
    965 	 FALSE,			/* partial_inplace */
    966 	 0xffffffff,		/* src_mask */
    967 	 0xffffffff,		/* dst_mask */
    968 	 TRUE),			/* pcrel_offset */
    969 
    970   HOWTO (R_ARM_LDR_PC_G2,   	/* type */
    971 	 0,			/* rightshift */
    972 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    973 	 32,			/* bitsize */
    974 	 TRUE,			/* pc_relative */
    975 	 0,			/* bitpos */
    976 	 complain_overflow_dont,/* complain_on_overflow */
    977 	 bfd_elf_generic_reloc,	/* special_function */
    978 	 "R_ARM_LDR_PC_G2",   	/* name */
    979 	 FALSE,			/* partial_inplace */
    980 	 0xffffffff,		/* src_mask */
    981 	 0xffffffff,		/* dst_mask */
    982 	 TRUE),			/* pcrel_offset */
    983 
    984   HOWTO (R_ARM_LDRS_PC_G0,   	/* type */
    985 	 0,			/* rightshift */
    986 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    987 	 32,			/* bitsize */
    988 	 TRUE,			/* pc_relative */
    989 	 0,			/* bitpos */
    990 	 complain_overflow_dont,/* complain_on_overflow */
    991 	 bfd_elf_generic_reloc,	/* special_function */
    992 	 "R_ARM_LDRS_PC_G0",   	/* name */
    993 	 FALSE,			/* partial_inplace */
    994 	 0xffffffff,		/* src_mask */
    995 	 0xffffffff,		/* dst_mask */
    996 	 TRUE),			/* pcrel_offset */
    997 
    998   HOWTO (R_ARM_LDRS_PC_G1,   	/* type */
    999 	 0,			/* rightshift */
   1000 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1001 	 32,			/* bitsize */
   1002 	 TRUE,			/* pc_relative */
   1003 	 0,			/* bitpos */
   1004 	 complain_overflow_dont,/* complain_on_overflow */
   1005 	 bfd_elf_generic_reloc,	/* special_function */
   1006 	 "R_ARM_LDRS_PC_G1",   	/* name */
   1007 	 FALSE,			/* partial_inplace */
   1008 	 0xffffffff,		/* src_mask */
   1009 	 0xffffffff,		/* dst_mask */
   1010 	 TRUE),			/* pcrel_offset */
   1011 
   1012   HOWTO (R_ARM_LDRS_PC_G2,   	/* type */
   1013 	 0,			/* rightshift */
   1014 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1015 	 32,			/* bitsize */
   1016 	 TRUE,			/* pc_relative */
   1017 	 0,			/* bitpos */
   1018 	 complain_overflow_dont,/* complain_on_overflow */
   1019 	 bfd_elf_generic_reloc,	/* special_function */
   1020 	 "R_ARM_LDRS_PC_G2",   	/* name */
   1021 	 FALSE,			/* partial_inplace */
   1022 	 0xffffffff,		/* src_mask */
   1023 	 0xffffffff,		/* dst_mask */
   1024 	 TRUE),			/* pcrel_offset */
   1025 
   1026   HOWTO (R_ARM_LDC_PC_G0,   	/* type */
   1027 	 0,			/* rightshift */
   1028 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1029 	 32,			/* bitsize */
   1030 	 TRUE,			/* pc_relative */
   1031 	 0,			/* bitpos */
   1032 	 complain_overflow_dont,/* complain_on_overflow */
   1033 	 bfd_elf_generic_reloc,	/* special_function */
   1034 	 "R_ARM_LDC_PC_G0",   	/* name */
   1035 	 FALSE,			/* partial_inplace */
   1036 	 0xffffffff,		/* src_mask */
   1037 	 0xffffffff,		/* dst_mask */
   1038 	 TRUE),			/* pcrel_offset */
   1039 
   1040   HOWTO (R_ARM_LDC_PC_G1,   	/* type */
   1041 	 0,			/* rightshift */
   1042 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1043 	 32,			/* bitsize */
   1044 	 TRUE,			/* pc_relative */
   1045 	 0,			/* bitpos */
   1046 	 complain_overflow_dont,/* complain_on_overflow */
   1047 	 bfd_elf_generic_reloc,	/* special_function */
   1048 	 "R_ARM_LDC_PC_G1",   	/* name */
   1049 	 FALSE,			/* partial_inplace */
   1050 	 0xffffffff,		/* src_mask */
   1051 	 0xffffffff,		/* dst_mask */
   1052 	 TRUE),			/* pcrel_offset */
   1053 
   1054   HOWTO (R_ARM_LDC_PC_G2,   	/* type */
   1055 	 0,			/* rightshift */
   1056 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1057 	 32,			/* bitsize */
   1058 	 TRUE,			/* pc_relative */
   1059 	 0,			/* bitpos */
   1060 	 complain_overflow_dont,/* complain_on_overflow */
   1061 	 bfd_elf_generic_reloc,	/* special_function */
   1062 	 "R_ARM_LDC_PC_G2",   	/* name */
   1063 	 FALSE,			/* partial_inplace */
   1064 	 0xffffffff,		/* src_mask */
   1065 	 0xffffffff,		/* dst_mask */
   1066 	 TRUE),			/* pcrel_offset */
   1067 
   1068   HOWTO (R_ARM_ALU_SB_G0_NC,   	/* type */
   1069 	 0,			/* rightshift */
   1070 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1071 	 32,			/* bitsize */
   1072 	 TRUE,			/* pc_relative */
   1073 	 0,			/* bitpos */
   1074 	 complain_overflow_dont,/* complain_on_overflow */
   1075 	 bfd_elf_generic_reloc,	/* special_function */
   1076 	 "R_ARM_ALU_SB_G0_NC", 	/* name */
   1077 	 FALSE,			/* partial_inplace */
   1078 	 0xffffffff,		/* src_mask */
   1079 	 0xffffffff,		/* dst_mask */
   1080 	 TRUE),			/* pcrel_offset */
   1081 
   1082   HOWTO (R_ARM_ALU_SB_G0,   	/* type */
   1083 	 0,			/* rightshift */
   1084 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1085 	 32,			/* bitsize */
   1086 	 TRUE,			/* pc_relative */
   1087 	 0,			/* bitpos */
   1088 	 complain_overflow_dont,/* complain_on_overflow */
   1089 	 bfd_elf_generic_reloc,	/* special_function */
   1090 	 "R_ARM_ALU_SB_G0", 	/* name */
   1091 	 FALSE,			/* partial_inplace */
   1092 	 0xffffffff,		/* src_mask */
   1093 	 0xffffffff,		/* dst_mask */
   1094 	 TRUE),			/* pcrel_offset */
   1095 
   1096   HOWTO (R_ARM_ALU_SB_G1_NC,   	/* type */
   1097 	 0,			/* rightshift */
   1098 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1099 	 32,			/* bitsize */
   1100 	 TRUE,			/* pc_relative */
   1101 	 0,			/* bitpos */
   1102 	 complain_overflow_dont,/* complain_on_overflow */
   1103 	 bfd_elf_generic_reloc,	/* special_function */
   1104 	 "R_ARM_ALU_SB_G1_NC", 	/* name */
   1105 	 FALSE,			/* partial_inplace */
   1106 	 0xffffffff,		/* src_mask */
   1107 	 0xffffffff,		/* dst_mask */
   1108 	 TRUE),			/* pcrel_offset */
   1109 
   1110   HOWTO (R_ARM_ALU_SB_G1,   	/* type */
   1111 	 0,			/* rightshift */
   1112 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1113 	 32,			/* bitsize */
   1114 	 TRUE,			/* pc_relative */
   1115 	 0,			/* bitpos */
   1116 	 complain_overflow_dont,/* complain_on_overflow */
   1117 	 bfd_elf_generic_reloc,	/* special_function */
   1118 	 "R_ARM_ALU_SB_G1", 	/* name */
   1119 	 FALSE,			/* partial_inplace */
   1120 	 0xffffffff,		/* src_mask */
   1121 	 0xffffffff,		/* dst_mask */
   1122 	 TRUE),			/* pcrel_offset */
   1123 
   1124   HOWTO (R_ARM_ALU_SB_G2,   	/* type */
   1125 	 0,			/* rightshift */
   1126 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1127 	 32,			/* bitsize */
   1128 	 TRUE,			/* pc_relative */
   1129 	 0,			/* bitpos */
   1130 	 complain_overflow_dont,/* complain_on_overflow */
   1131 	 bfd_elf_generic_reloc,	/* special_function */
   1132 	 "R_ARM_ALU_SB_G2", 	/* name */
   1133 	 FALSE,			/* partial_inplace */
   1134 	 0xffffffff,		/* src_mask */
   1135 	 0xffffffff,		/* dst_mask */
   1136 	 TRUE),			/* pcrel_offset */
   1137 
   1138   HOWTO (R_ARM_LDR_SB_G0,   	/* type */
   1139 	 0,			/* rightshift */
   1140 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1141 	 32,			/* bitsize */
   1142 	 TRUE,			/* pc_relative */
   1143 	 0,			/* bitpos */
   1144 	 complain_overflow_dont,/* complain_on_overflow */
   1145 	 bfd_elf_generic_reloc,	/* special_function */
   1146 	 "R_ARM_LDR_SB_G0", 	/* name */
   1147 	 FALSE,			/* partial_inplace */
   1148 	 0xffffffff,		/* src_mask */
   1149 	 0xffffffff,		/* dst_mask */
   1150 	 TRUE),			/* pcrel_offset */
   1151 
   1152   HOWTO (R_ARM_LDR_SB_G1,   	/* type */
   1153 	 0,			/* rightshift */
   1154 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1155 	 32,			/* bitsize */
   1156 	 TRUE,			/* pc_relative */
   1157 	 0,			/* bitpos */
   1158 	 complain_overflow_dont,/* complain_on_overflow */
   1159 	 bfd_elf_generic_reloc,	/* special_function */
   1160 	 "R_ARM_LDR_SB_G1", 	/* name */
   1161 	 FALSE,			/* partial_inplace */
   1162 	 0xffffffff,		/* src_mask */
   1163 	 0xffffffff,		/* dst_mask */
   1164 	 TRUE),			/* pcrel_offset */
   1165 
   1166   HOWTO (R_ARM_LDR_SB_G2,   	/* type */
   1167 	 0,			/* rightshift */
   1168 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1169 	 32,			/* bitsize */
   1170 	 TRUE,			/* pc_relative */
   1171 	 0,			/* bitpos */
   1172 	 complain_overflow_dont,/* complain_on_overflow */
   1173 	 bfd_elf_generic_reloc,	/* special_function */
   1174 	 "R_ARM_LDR_SB_G2", 	/* name */
   1175 	 FALSE,			/* partial_inplace */
   1176 	 0xffffffff,		/* src_mask */
   1177 	 0xffffffff,		/* dst_mask */
   1178 	 TRUE),			/* pcrel_offset */
   1179 
   1180   HOWTO (R_ARM_LDRS_SB_G0,   	/* type */
   1181 	 0,			/* rightshift */
   1182 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1183 	 32,			/* bitsize */
   1184 	 TRUE,			/* pc_relative */
   1185 	 0,			/* bitpos */
   1186 	 complain_overflow_dont,/* complain_on_overflow */
   1187 	 bfd_elf_generic_reloc,	/* special_function */
   1188 	 "R_ARM_LDRS_SB_G0", 	/* name */
   1189 	 FALSE,			/* partial_inplace */
   1190 	 0xffffffff,		/* src_mask */
   1191 	 0xffffffff,		/* dst_mask */
   1192 	 TRUE),			/* pcrel_offset */
   1193 
   1194   HOWTO (R_ARM_LDRS_SB_G1,   	/* type */
   1195 	 0,			/* rightshift */
   1196 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1197 	 32,			/* bitsize */
   1198 	 TRUE,			/* pc_relative */
   1199 	 0,			/* bitpos */
   1200 	 complain_overflow_dont,/* complain_on_overflow */
   1201 	 bfd_elf_generic_reloc,	/* special_function */
   1202 	 "R_ARM_LDRS_SB_G1", 	/* name */
   1203 	 FALSE,			/* partial_inplace */
   1204 	 0xffffffff,		/* src_mask */
   1205 	 0xffffffff,		/* dst_mask */
   1206 	 TRUE),			/* pcrel_offset */
   1207 
   1208   HOWTO (R_ARM_LDRS_SB_G2,   	/* type */
   1209 	 0,			/* rightshift */
   1210 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1211 	 32,			/* bitsize */
   1212 	 TRUE,			/* pc_relative */
   1213 	 0,			/* bitpos */
   1214 	 complain_overflow_dont,/* complain_on_overflow */
   1215 	 bfd_elf_generic_reloc,	/* special_function */
   1216 	 "R_ARM_LDRS_SB_G2", 	/* name */
   1217 	 FALSE,			/* partial_inplace */
   1218 	 0xffffffff,		/* src_mask */
   1219 	 0xffffffff,		/* dst_mask */
   1220 	 TRUE),			/* pcrel_offset */
   1221 
   1222   HOWTO (R_ARM_LDC_SB_G0,   	/* type */
   1223 	 0,			/* rightshift */
   1224 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1225 	 32,			/* bitsize */
   1226 	 TRUE,			/* pc_relative */
   1227 	 0,			/* bitpos */
   1228 	 complain_overflow_dont,/* complain_on_overflow */
   1229 	 bfd_elf_generic_reloc,	/* special_function */
   1230 	 "R_ARM_LDC_SB_G0", 	/* name */
   1231 	 FALSE,			/* partial_inplace */
   1232 	 0xffffffff,		/* src_mask */
   1233 	 0xffffffff,		/* dst_mask */
   1234 	 TRUE),			/* pcrel_offset */
   1235 
   1236   HOWTO (R_ARM_LDC_SB_G1,   	/* type */
   1237 	 0,			/* rightshift */
   1238 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1239 	 32,			/* bitsize */
   1240 	 TRUE,			/* pc_relative */
   1241 	 0,			/* bitpos */
   1242 	 complain_overflow_dont,/* complain_on_overflow */
   1243 	 bfd_elf_generic_reloc,	/* special_function */
   1244 	 "R_ARM_LDC_SB_G1", 	/* name */
   1245 	 FALSE,			/* partial_inplace */
   1246 	 0xffffffff,		/* src_mask */
   1247 	 0xffffffff,		/* dst_mask */
   1248 	 TRUE),			/* pcrel_offset */
   1249 
   1250   HOWTO (R_ARM_LDC_SB_G2,   	/* type */
   1251 	 0,			/* rightshift */
   1252 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1253 	 32,			/* bitsize */
   1254 	 TRUE,			/* pc_relative */
   1255 	 0,			/* bitpos */
   1256 	 complain_overflow_dont,/* complain_on_overflow */
   1257 	 bfd_elf_generic_reloc,	/* special_function */
   1258 	 "R_ARM_LDC_SB_G2", 	/* name */
   1259 	 FALSE,			/* partial_inplace */
   1260 	 0xffffffff,		/* src_mask */
   1261 	 0xffffffff,		/* dst_mask */
   1262 	 TRUE),			/* pcrel_offset */
   1263 
   1264   /* End of group relocations.  */
   1265 
   1266   HOWTO (R_ARM_MOVW_BREL_NC,	/* type */
   1267 	 0,			/* rightshift */
   1268 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1269 	 16,			/* bitsize */
   1270 	 FALSE,			/* pc_relative */
   1271 	 0,			/* bitpos */
   1272 	 complain_overflow_dont,/* complain_on_overflow */
   1273 	 bfd_elf_generic_reloc,	/* special_function */
   1274 	 "R_ARM_MOVW_BREL_NC",	/* name */
   1275 	 FALSE,			/* partial_inplace */
   1276 	 0x0000ffff,		/* src_mask */
   1277 	 0x0000ffff,		/* dst_mask */
   1278 	 FALSE),		/* pcrel_offset */
   1279 
   1280   HOWTO (R_ARM_MOVT_BREL,	/* type */
   1281 	 0,			/* rightshift */
   1282 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1283 	 16,			/* bitsize */
   1284 	 FALSE,			/* pc_relative */
   1285 	 0,			/* bitpos */
   1286 	 complain_overflow_bitfield,/* complain_on_overflow */
   1287 	 bfd_elf_generic_reloc,	/* special_function */
   1288 	 "R_ARM_MOVT_BREL",	/* name */
   1289 	 FALSE,			/* partial_inplace */
   1290 	 0x0000ffff,		/* src_mask */
   1291 	 0x0000ffff,		/* dst_mask */
   1292 	 FALSE),		/* pcrel_offset */
   1293 
   1294   HOWTO (R_ARM_MOVW_BREL,	/* type */
   1295 	 0,			/* rightshift */
   1296 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1297 	 16,			/* bitsize */
   1298 	 FALSE,			/* pc_relative */
   1299 	 0,			/* bitpos */
   1300 	 complain_overflow_dont,/* complain_on_overflow */
   1301 	 bfd_elf_generic_reloc,	/* special_function */
   1302 	 "R_ARM_MOVW_BREL",	/* name */
   1303 	 FALSE,			/* partial_inplace */
   1304 	 0x0000ffff,		/* src_mask */
   1305 	 0x0000ffff,		/* dst_mask */
   1306 	 FALSE),		/* pcrel_offset */
   1307 
   1308   HOWTO (R_ARM_THM_MOVW_BREL_NC,/* type */
   1309 	 0,			/* rightshift */
   1310 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1311 	 16,			/* bitsize */
   1312 	 FALSE,			/* pc_relative */
   1313 	 0,			/* bitpos */
   1314 	 complain_overflow_dont,/* complain_on_overflow */
   1315 	 bfd_elf_generic_reloc,	/* special_function */
   1316 	 "R_ARM_THM_MOVW_BREL_NC",/* name */
   1317 	 FALSE,			/* partial_inplace */
   1318 	 0x040f70ff,		/* src_mask */
   1319 	 0x040f70ff,		/* dst_mask */
   1320 	 FALSE),		/* pcrel_offset */
   1321 
   1322   HOWTO (R_ARM_THM_MOVT_BREL,	/* type */
   1323 	 0,			/* rightshift */
   1324 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1325 	 16,			/* bitsize */
   1326 	 FALSE,			/* pc_relative */
   1327 	 0,			/* bitpos */
   1328 	 complain_overflow_bitfield,/* complain_on_overflow */
   1329 	 bfd_elf_generic_reloc,	/* special_function */
   1330 	 "R_ARM_THM_MOVT_BREL",	/* name */
   1331 	 FALSE,			/* partial_inplace */
   1332 	 0x040f70ff,		/* src_mask */
   1333 	 0x040f70ff,		/* dst_mask */
   1334 	 FALSE),		/* pcrel_offset */
   1335 
   1336   HOWTO (R_ARM_THM_MOVW_BREL,	/* type */
   1337 	 0,			/* rightshift */
   1338 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1339 	 16,			/* bitsize */
   1340 	 FALSE,			/* pc_relative */
   1341 	 0,			/* bitpos */
   1342 	 complain_overflow_dont,/* complain_on_overflow */
   1343 	 bfd_elf_generic_reloc,	/* special_function */
   1344 	 "R_ARM_THM_MOVW_BREL",	/* name */
   1345 	 FALSE,			/* partial_inplace */
   1346 	 0x040f70ff,		/* src_mask */
   1347 	 0x040f70ff,		/* dst_mask */
   1348 	 FALSE),		/* pcrel_offset */
   1349 
   1350   EMPTY_HOWTO (90),   /* Unallocated.  */
   1351   EMPTY_HOWTO (91),
   1352   EMPTY_HOWTO (92),
   1353   EMPTY_HOWTO (93),
   1354 
   1355   HOWTO (R_ARM_PLT32_ABS,	/* type */
   1356 	 0,			/* rightshift */
   1357 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1358 	 32,			/* bitsize */
   1359 	 FALSE,			/* pc_relative */
   1360 	 0,			/* bitpos */
   1361 	 complain_overflow_dont,/* complain_on_overflow */
   1362 	 bfd_elf_generic_reloc,	/* special_function */
   1363 	 "R_ARM_PLT32_ABS",	/* name */
   1364 	 FALSE,			/* partial_inplace */
   1365 	 0xffffffff,		/* src_mask */
   1366 	 0xffffffff,		/* dst_mask */
   1367 	 FALSE),		/* pcrel_offset */
   1368 
   1369   HOWTO (R_ARM_GOT_ABS,		/* type */
   1370 	 0,			/* rightshift */
   1371 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1372 	 32,			/* bitsize */
   1373 	 FALSE,			/* pc_relative */
   1374 	 0,			/* bitpos */
   1375 	 complain_overflow_dont,/* complain_on_overflow */
   1376 	 bfd_elf_generic_reloc,	/* special_function */
   1377 	 "R_ARM_GOT_ABS",	/* name */
   1378 	 FALSE,			/* partial_inplace */
   1379 	 0xffffffff,		/* src_mask */
   1380 	 0xffffffff,		/* dst_mask */
   1381 	 FALSE),			/* pcrel_offset */
   1382 
   1383   HOWTO (R_ARM_GOT_PREL,	/* type */
   1384 	 0,			/* rightshift */
   1385 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1386 	 32,			/* bitsize */
   1387 	 TRUE,			/* pc_relative */
   1388 	 0,			/* bitpos */
   1389 	 complain_overflow_dont,	/* complain_on_overflow */
   1390 	 bfd_elf_generic_reloc,	/* special_function */
   1391 	 "R_ARM_GOT_PREL",	/* name */
   1392 	 FALSE,			/* partial_inplace */
   1393 	 0xffffffff,		/* src_mask */
   1394 	 0xffffffff,		/* dst_mask */
   1395 	 TRUE),			/* pcrel_offset */
   1396 
   1397   HOWTO (R_ARM_GOT_BREL12,	/* type */
   1398 	 0,			/* rightshift */
   1399 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1400 	 12,			/* bitsize */
   1401 	 FALSE,			/* pc_relative */
   1402 	 0,			/* bitpos */
   1403 	 complain_overflow_bitfield,/* complain_on_overflow */
   1404 	 bfd_elf_generic_reloc,	/* special_function */
   1405 	 "R_ARM_GOT_BREL12",	/* name */
   1406 	 FALSE,			/* partial_inplace */
   1407 	 0x00000fff,		/* src_mask */
   1408 	 0x00000fff,		/* dst_mask */
   1409 	 FALSE),		/* pcrel_offset */
   1410 
   1411   HOWTO (R_ARM_GOTOFF12,	/* type */
   1412 	 0,			/* rightshift */
   1413 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1414 	 12,			/* bitsize */
   1415 	 FALSE,			/* pc_relative */
   1416 	 0,			/* bitpos */
   1417 	 complain_overflow_bitfield,/* complain_on_overflow */
   1418 	 bfd_elf_generic_reloc,	/* special_function */
   1419 	 "R_ARM_GOTOFF12",	/* name */
   1420 	 FALSE,			/* partial_inplace */
   1421 	 0x00000fff,		/* src_mask */
   1422 	 0x00000fff,		/* dst_mask */
   1423 	 FALSE),		/* pcrel_offset */
   1424 
   1425   EMPTY_HOWTO (R_ARM_GOTRELAX),  /* reserved for future GOT-load optimizations */
   1426 
   1427   /* GNU extension to record C++ vtable member usage */
   1428   HOWTO (R_ARM_GNU_VTENTRY,     /* type */
   1429          0,                     /* rightshift */
   1430          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1431          0,                     /* bitsize */
   1432          FALSE,                 /* pc_relative */
   1433          0,                     /* bitpos */
   1434          complain_overflow_dont, /* complain_on_overflow */
   1435          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
   1436          "R_ARM_GNU_VTENTRY",   /* name */
   1437          FALSE,                 /* partial_inplace */
   1438          0,                     /* src_mask */
   1439          0,                     /* dst_mask */
   1440          FALSE),                /* pcrel_offset */
   1441 
   1442   /* GNU extension to record C++ vtable hierarchy */
   1443   HOWTO (R_ARM_GNU_VTINHERIT, /* type */
   1444          0,                     /* rightshift */
   1445          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1446          0,                     /* bitsize */
   1447          FALSE,                 /* pc_relative */
   1448          0,                     /* bitpos */
   1449          complain_overflow_dont, /* complain_on_overflow */
   1450          NULL,                  /* special_function */
   1451          "R_ARM_GNU_VTINHERIT", /* name */
   1452          FALSE,                 /* partial_inplace */
   1453          0,                     /* src_mask */
   1454          0,                     /* dst_mask */
   1455          FALSE),                /* pcrel_offset */
   1456 
   1457   HOWTO (R_ARM_THM_JUMP11,	/* type */
   1458 	 1,			/* rightshift */
   1459 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1460 	 11,			/* bitsize */
   1461 	 TRUE,			/* pc_relative */
   1462 	 0,			/* bitpos */
   1463 	 complain_overflow_signed,	/* complain_on_overflow */
   1464 	 bfd_elf_generic_reloc,	/* special_function */
   1465 	 "R_ARM_THM_JUMP11",	/* name */
   1466 	 FALSE,			/* partial_inplace */
   1467 	 0x000007ff,		/* src_mask */
   1468 	 0x000007ff,		/* dst_mask */
   1469 	 TRUE),			/* pcrel_offset */
   1470 
   1471   HOWTO (R_ARM_THM_JUMP8,	/* type */
   1472 	 1,			/* rightshift */
   1473 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1474 	 8,			/* bitsize */
   1475 	 TRUE,			/* pc_relative */
   1476 	 0,			/* bitpos */
   1477 	 complain_overflow_signed,	/* complain_on_overflow */
   1478 	 bfd_elf_generic_reloc,	/* special_function */
   1479 	 "R_ARM_THM_JUMP8",	/* name */
   1480 	 FALSE,			/* partial_inplace */
   1481 	 0x000000ff,		/* src_mask */
   1482 	 0x000000ff,		/* dst_mask */
   1483 	 TRUE),			/* pcrel_offset */
   1484 
   1485   /* TLS relocations */
   1486   HOWTO (R_ARM_TLS_GD32,	/* type */
   1487          0,                     /* rightshift */
   1488          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1489          32,                    /* bitsize */
   1490          FALSE,                 /* pc_relative */
   1491          0,                     /* bitpos */
   1492          complain_overflow_bitfield,/* complain_on_overflow */
   1493          NULL,			/* special_function */
   1494          "R_ARM_TLS_GD32",	/* name */
   1495          TRUE,			/* partial_inplace */
   1496          0xffffffff,		/* src_mask */
   1497          0xffffffff,		/* dst_mask */
   1498          FALSE),                /* pcrel_offset */
   1499 
   1500   HOWTO (R_ARM_TLS_LDM32,	/* type */
   1501          0,                     /* rightshift */
   1502          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1503          32,                    /* bitsize */
   1504          FALSE,                 /* pc_relative */
   1505          0,                     /* bitpos */
   1506          complain_overflow_bitfield,/* complain_on_overflow */
   1507          bfd_elf_generic_reloc, /* special_function */
   1508          "R_ARM_TLS_LDM32",	/* name */
   1509          TRUE,			/* partial_inplace */
   1510          0xffffffff,		/* src_mask */
   1511          0xffffffff,		/* dst_mask */
   1512          FALSE),                /* pcrel_offset */
   1513 
   1514   HOWTO (R_ARM_TLS_LDO32,	/* type */
   1515          0,                     /* rightshift */
   1516          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1517          32,                    /* bitsize */
   1518          FALSE,                 /* pc_relative */
   1519          0,                     /* bitpos */
   1520          complain_overflow_bitfield,/* complain_on_overflow */
   1521          bfd_elf_generic_reloc, /* special_function */
   1522          "R_ARM_TLS_LDO32",	/* name */
   1523          TRUE,			/* partial_inplace */
   1524          0xffffffff,		/* src_mask */
   1525          0xffffffff,		/* dst_mask */
   1526          FALSE),                /* pcrel_offset */
   1527 
   1528   HOWTO (R_ARM_TLS_IE32,	/* type */
   1529          0,                     /* rightshift */
   1530          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1531          32,                    /* bitsize */
   1532          FALSE,                  /* pc_relative */
   1533          0,                     /* bitpos */
   1534          complain_overflow_bitfield,/* complain_on_overflow */
   1535          NULL,			/* special_function */
   1536          "R_ARM_TLS_IE32",	/* name */
   1537          TRUE,			/* partial_inplace */
   1538          0xffffffff,		/* src_mask */
   1539          0xffffffff,		/* dst_mask */
   1540          FALSE),                /* pcrel_offset */
   1541 
   1542   HOWTO (R_ARM_TLS_LE32,	/* type */
   1543          0,                     /* rightshift */
   1544          2,                     /* size (0 = byte, 1 = short, 2 = long) */
   1545          32,                    /* bitsize */
   1546          FALSE,                 /* pc_relative */
   1547          0,                     /* bitpos */
   1548          complain_overflow_bitfield,/* complain_on_overflow */
   1549          bfd_elf_generic_reloc, /* special_function */
   1550          "R_ARM_TLS_LE32",	/* name */
   1551          TRUE,			/* partial_inplace */
   1552          0xffffffff,		/* src_mask */
   1553          0xffffffff,		/* dst_mask */
   1554          FALSE),                /* pcrel_offset */
   1555 
   1556   HOWTO (R_ARM_TLS_LDO12,	/* type */
   1557 	 0,			/* rightshift */
   1558 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1559 	 12,			/* bitsize */
   1560 	 FALSE,			/* pc_relative */
   1561 	 0,			/* bitpos */
   1562 	 complain_overflow_bitfield,/* complain_on_overflow */
   1563 	 bfd_elf_generic_reloc,	/* special_function */
   1564 	 "R_ARM_TLS_LDO12",	/* name */
   1565 	 FALSE,			/* partial_inplace */
   1566 	 0x00000fff,		/* src_mask */
   1567 	 0x00000fff,		/* dst_mask */
   1568 	 FALSE),		/* pcrel_offset */
   1569 
   1570   HOWTO (R_ARM_TLS_LE12,	/* type */
   1571 	 0,			/* rightshift */
   1572 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1573 	 12,			/* bitsize */
   1574 	 FALSE,			/* pc_relative */
   1575 	 0,			/* bitpos */
   1576 	 complain_overflow_bitfield,/* complain_on_overflow */
   1577 	 bfd_elf_generic_reloc,	/* special_function */
   1578 	 "R_ARM_TLS_LE12",	/* name */
   1579 	 FALSE,			/* partial_inplace */
   1580 	 0x00000fff,		/* src_mask */
   1581 	 0x00000fff,		/* dst_mask */
   1582 	 FALSE),		/* pcrel_offset */
   1583 
   1584   HOWTO (R_ARM_TLS_IE12GP,	/* type */
   1585 	 0,			/* rightshift */
   1586 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1587 	 12,			/* bitsize */
   1588 	 FALSE,			/* pc_relative */
   1589 	 0,			/* bitpos */
   1590 	 complain_overflow_bitfield,/* complain_on_overflow */
   1591 	 bfd_elf_generic_reloc,	/* special_function */
   1592 	 "R_ARM_TLS_IE12GP",	/* name */
   1593 	 FALSE,			/* partial_inplace */
   1594 	 0x00000fff,		/* src_mask */
   1595 	 0x00000fff,		/* dst_mask */
   1596 	 FALSE),		/* pcrel_offset */
   1597 };
   1598 
   1599 /* 112-127 private relocations
   1600    128 R_ARM_ME_TOO, obsolete
   1601    129-255 unallocated in AAELF.
   1602 
   1603    249-255 extended, currently unused, relocations:  */
   1604 
   1605 static reloc_howto_type elf32_arm_howto_table_2[4] =
   1606 {
   1607   HOWTO (R_ARM_RREL32,		/* type */
   1608 	 0,			/* rightshift */
   1609 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1610 	 0,			/* bitsize */
   1611 	 FALSE,			/* pc_relative */
   1612 	 0,			/* bitpos */
   1613 	 complain_overflow_dont,/* complain_on_overflow */
   1614 	 bfd_elf_generic_reloc,	/* special_function */
   1615 	 "R_ARM_RREL32",	/* name */
   1616 	 FALSE,			/* partial_inplace */
   1617 	 0,			/* src_mask */
   1618 	 0,			/* dst_mask */
   1619 	 FALSE),		/* pcrel_offset */
   1620 
   1621   HOWTO (R_ARM_RABS32,		/* type */
   1622 	 0,			/* rightshift */
   1623 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1624 	 0,			/* bitsize */
   1625 	 FALSE,			/* pc_relative */
   1626 	 0,			/* bitpos */
   1627 	 complain_overflow_dont,/* complain_on_overflow */
   1628 	 bfd_elf_generic_reloc,	/* special_function */
   1629 	 "R_ARM_RABS32",	/* name */
   1630 	 FALSE,			/* partial_inplace */
   1631 	 0,			/* src_mask */
   1632 	 0,			/* dst_mask */
   1633 	 FALSE),		/* pcrel_offset */
   1634 
   1635   HOWTO (R_ARM_RPC24,		/* type */
   1636 	 0,			/* rightshift */
   1637 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1638 	 0,			/* bitsize */
   1639 	 FALSE,			/* pc_relative */
   1640 	 0,			/* bitpos */
   1641 	 complain_overflow_dont,/* complain_on_overflow */
   1642 	 bfd_elf_generic_reloc,	/* special_function */
   1643 	 "R_ARM_RPC24",		/* name */
   1644 	 FALSE,			/* partial_inplace */
   1645 	 0,			/* src_mask */
   1646 	 0,			/* dst_mask */
   1647 	 FALSE),		/* pcrel_offset */
   1648 
   1649   HOWTO (R_ARM_RBASE,		/* type */
   1650 	 0,			/* rightshift */
   1651 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
   1652 	 0,			/* bitsize */
   1653 	 FALSE,			/* pc_relative */
   1654 	 0,			/* bitpos */
   1655 	 complain_overflow_dont,/* complain_on_overflow */
   1656 	 bfd_elf_generic_reloc,	/* special_function */
   1657 	 "R_ARM_RBASE",		/* name */
   1658 	 FALSE,			/* partial_inplace */
   1659 	 0,			/* src_mask */
   1660 	 0,			/* dst_mask */
   1661 	 FALSE)			/* pcrel_offset */
   1662 };
   1663 
   1664 static reloc_howto_type *
   1665 elf32_arm_howto_from_type (unsigned int r_type)
   1666 {
   1667   if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
   1668     return &elf32_arm_howto_table_1[r_type];
   1669 
   1670   if (r_type >= R_ARM_RREL32
   1671       && r_type < R_ARM_RREL32 + ARRAY_SIZE (elf32_arm_howto_table_2))
   1672     return &elf32_arm_howto_table_2[r_type - R_ARM_RREL32];
   1673 
   1674   return NULL;
   1675 }
   1676 
   1677 static void
   1678 elf32_arm_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * bfd_reloc,
   1679 			 Elf_Internal_Rela * elf_reloc)
   1680 {
   1681   unsigned int r_type;
   1682 
   1683   r_type = ELF32_R_TYPE (elf_reloc->r_info);
   1684   bfd_reloc->howto = elf32_arm_howto_from_type (r_type);
   1685 }
   1686 
   1687 struct elf32_arm_reloc_map
   1688   {
   1689     bfd_reloc_code_real_type  bfd_reloc_val;
   1690     unsigned char             elf_reloc_val;
   1691   };
   1692 
   1693 /* All entries in this list must also be present in elf32_arm_howto_table.  */
   1694 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
   1695   {
   1696     {BFD_RELOC_NONE,                 R_ARM_NONE},
   1697     {BFD_RELOC_ARM_PCREL_BRANCH,     R_ARM_PC24},
   1698     {BFD_RELOC_ARM_PCREL_CALL,	     R_ARM_CALL},
   1699     {BFD_RELOC_ARM_PCREL_JUMP,	     R_ARM_JUMP24},
   1700     {BFD_RELOC_ARM_PCREL_BLX,        R_ARM_XPC25},
   1701     {BFD_RELOC_THUMB_PCREL_BLX,      R_ARM_THM_XPC22},
   1702     {BFD_RELOC_32,                   R_ARM_ABS32},
   1703     {BFD_RELOC_32_PCREL,             R_ARM_REL32},
   1704     {BFD_RELOC_8,                    R_ARM_ABS8},
   1705     {BFD_RELOC_16,                   R_ARM_ABS16},
   1706     {BFD_RELOC_ARM_OFFSET_IMM,       R_ARM_ABS12},
   1707     {BFD_RELOC_ARM_THUMB_OFFSET,     R_ARM_THM_ABS5},
   1708     {BFD_RELOC_THUMB_PCREL_BRANCH25, R_ARM_THM_JUMP24},
   1709     {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_CALL},
   1710     {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_JUMP11},
   1711     {BFD_RELOC_THUMB_PCREL_BRANCH20, R_ARM_THM_JUMP19},
   1712     {BFD_RELOC_THUMB_PCREL_BRANCH9,  R_ARM_THM_JUMP8},
   1713     {BFD_RELOC_THUMB_PCREL_BRANCH7,  R_ARM_THM_JUMP6},
   1714     {BFD_RELOC_ARM_GLOB_DAT,         R_ARM_GLOB_DAT},
   1715     {BFD_RELOC_ARM_JUMP_SLOT,        R_ARM_JUMP_SLOT},
   1716     {BFD_RELOC_ARM_RELATIVE,         R_ARM_RELATIVE},
   1717     {BFD_RELOC_ARM_GOTOFF,           R_ARM_GOTOFF32},
   1718     {BFD_RELOC_ARM_GOTPC,            R_ARM_GOTPC},
   1719     {BFD_RELOC_ARM_GOT32,            R_ARM_GOT32},
   1720     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
   1721     {BFD_RELOC_ARM_TARGET1,	     R_ARM_TARGET1},
   1722     {BFD_RELOC_ARM_ROSEGREL32,	     R_ARM_ROSEGREL32},
   1723     {BFD_RELOC_ARM_SBREL32,	     R_ARM_SBREL32},
   1724     {BFD_RELOC_ARM_PREL31,	     R_ARM_PREL31},
   1725     {BFD_RELOC_ARM_TARGET2,	     R_ARM_TARGET2},
   1726     {BFD_RELOC_ARM_PLT32,            R_ARM_PLT32},
   1727     {BFD_RELOC_ARM_TLS_GD32,	     R_ARM_TLS_GD32},
   1728     {BFD_RELOC_ARM_TLS_LDO32,	     R_ARM_TLS_LDO32},
   1729     {BFD_RELOC_ARM_TLS_LDM32,	     R_ARM_TLS_LDM32},
   1730     {BFD_RELOC_ARM_TLS_DTPMOD32,     R_ARM_TLS_DTPMOD32},
   1731     {BFD_RELOC_ARM_TLS_DTPOFF32,     R_ARM_TLS_DTPOFF32},
   1732     {BFD_RELOC_ARM_TLS_TPOFF32,      R_ARM_TLS_TPOFF32},
   1733     {BFD_RELOC_ARM_TLS_IE32,         R_ARM_TLS_IE32},
   1734     {BFD_RELOC_ARM_TLS_LE32,         R_ARM_TLS_LE32},
   1735     {BFD_RELOC_VTABLE_INHERIT,	     R_ARM_GNU_VTINHERIT},
   1736     {BFD_RELOC_VTABLE_ENTRY,	     R_ARM_GNU_VTENTRY},
   1737     {BFD_RELOC_ARM_MOVW,	     R_ARM_MOVW_ABS_NC},
   1738     {BFD_RELOC_ARM_MOVT,	     R_ARM_MOVT_ABS},
   1739     {BFD_RELOC_ARM_MOVW_PCREL,	     R_ARM_MOVW_PREL_NC},
   1740     {BFD_RELOC_ARM_MOVT_PCREL,	     R_ARM_MOVT_PREL},
   1741     {BFD_RELOC_ARM_THUMB_MOVW,	     R_ARM_THM_MOVW_ABS_NC},
   1742     {BFD_RELOC_ARM_THUMB_MOVT,	     R_ARM_THM_MOVT_ABS},
   1743     {BFD_RELOC_ARM_THUMB_MOVW_PCREL, R_ARM_THM_MOVW_PREL_NC},
   1744     {BFD_RELOC_ARM_THUMB_MOVT_PCREL, R_ARM_THM_MOVT_PREL},
   1745     {BFD_RELOC_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G0_NC},
   1746     {BFD_RELOC_ARM_ALU_PC_G0, R_ARM_ALU_PC_G0},
   1747     {BFD_RELOC_ARM_ALU_PC_G1_NC, R_ARM_ALU_PC_G1_NC},
   1748     {BFD_RELOC_ARM_ALU_PC_G1, R_ARM_ALU_PC_G1},
   1749     {BFD_RELOC_ARM_ALU_PC_G2, R_ARM_ALU_PC_G2},
   1750     {BFD_RELOC_ARM_LDR_PC_G0, R_ARM_LDR_PC_G0},
   1751     {BFD_RELOC_ARM_LDR_PC_G1, R_ARM_LDR_PC_G1},
   1752     {BFD_RELOC_ARM_LDR_PC_G2, R_ARM_LDR_PC_G2},
   1753     {BFD_RELOC_ARM_LDRS_PC_G0, R_ARM_LDRS_PC_G0},
   1754     {BFD_RELOC_ARM_LDRS_PC_G1, R_ARM_LDRS_PC_G1},
   1755     {BFD_RELOC_ARM_LDRS_PC_G2, R_ARM_LDRS_PC_G2},
   1756     {BFD_RELOC_ARM_LDC_PC_G0, R_ARM_LDC_PC_G0},
   1757     {BFD_RELOC_ARM_LDC_PC_G1, R_ARM_LDC_PC_G1},
   1758     {BFD_RELOC_ARM_LDC_PC_G2, R_ARM_LDC_PC_G2},
   1759     {BFD_RELOC_ARM_ALU_SB_G0_NC, R_ARM_ALU_SB_G0_NC},
   1760     {BFD_RELOC_ARM_ALU_SB_G0, R_ARM_ALU_SB_G0},
   1761     {BFD_RELOC_ARM_ALU_SB_G1_NC, R_ARM_ALU_SB_G1_NC},
   1762     {BFD_RELOC_ARM_ALU_SB_G1, R_ARM_ALU_SB_G1},
   1763     {BFD_RELOC_ARM_ALU_SB_G2, R_ARM_ALU_SB_G2},
   1764     {BFD_RELOC_ARM_LDR_SB_G0, R_ARM_LDR_SB_G0},
   1765     {BFD_RELOC_ARM_LDR_SB_G1, R_ARM_LDR_SB_G1},
   1766     {BFD_RELOC_ARM_LDR_SB_G2, R_ARM_LDR_SB_G2},
   1767     {BFD_RELOC_ARM_LDRS_SB_G0, R_ARM_LDRS_SB_G0},
   1768     {BFD_RELOC_ARM_LDRS_SB_G1, R_ARM_LDRS_SB_G1},
   1769     {BFD_RELOC_ARM_LDRS_SB_G2, R_ARM_LDRS_SB_G2},
   1770     {BFD_RELOC_ARM_LDC_SB_G0, R_ARM_LDC_SB_G0},
   1771     {BFD_RELOC_ARM_LDC_SB_G1, R_ARM_LDC_SB_G1},
   1772     {BFD_RELOC_ARM_LDC_SB_G2, R_ARM_LDC_SB_G2},
   1773     {BFD_RELOC_ARM_V4BX,	     R_ARM_V4BX}
   1774   };
   1775 
   1776 static reloc_howto_type *
   1777 elf32_arm_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1778 			     bfd_reloc_code_real_type code)
   1779 {
   1780   unsigned int i;
   1781 
   1782   for (i = 0; i < ARRAY_SIZE (elf32_arm_reloc_map); i ++)
   1783     if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
   1784       return elf32_arm_howto_from_type (elf32_arm_reloc_map[i].elf_reloc_val);
   1785 
   1786   return NULL;
   1787 }
   1788 
   1789 static reloc_howto_type *
   1790 elf32_arm_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1791 			     const char *r_name)
   1792 {
   1793   unsigned int i;
   1794 
   1795   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_1); i++)
   1796     if (elf32_arm_howto_table_1[i].name != NULL
   1797 	&& strcasecmp (elf32_arm_howto_table_1[i].name, r_name) == 0)
   1798       return &elf32_arm_howto_table_1[i];
   1799 
   1800   for (i = 0; i < ARRAY_SIZE (elf32_arm_howto_table_2); i++)
   1801     if (elf32_arm_howto_table_2[i].name != NULL
   1802 	&& strcasecmp (elf32_arm_howto_table_2[i].name, r_name) == 0)
   1803       return &elf32_arm_howto_table_2[i];
   1804 
   1805   return NULL;
   1806 }
   1807 
   1808 /* Support for core dump NOTE sections.  */
   1809 
   1810 static bfd_boolean
   1811 elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   1812 {
   1813   int offset;
   1814   size_t size;
   1815 
   1816   switch (note->descsz)
   1817     {
   1818       default:
   1819 	return FALSE;
   1820 
   1821       case 148:		/* Linux/ARM 32-bit.  */
   1822 	/* pr_cursig */
   1823 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
   1824 
   1825 	/* pr_pid */
   1826 	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
   1827 
   1828 	/* pr_reg */
   1829 	offset = 72;
   1830 	size = 72;
   1831 
   1832 	break;
   1833     }
   1834 
   1835   /* Make a ".reg/999" section.  */
   1836   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   1837 					  size, note->descpos + offset);
   1838 }
   1839 
   1840 static bfd_boolean
   1841 elf32_arm_nabi_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   1842 {
   1843   switch (note->descsz)
   1844     {
   1845       default:
   1846 	return FALSE;
   1847 
   1848       case 124:		/* Linux/ARM elf_prpsinfo.  */
   1849 	elf_tdata (abfd)->core_program
   1850 	 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
   1851 	elf_tdata (abfd)->core_command
   1852 	 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
   1853     }
   1854 
   1855   /* Note that for some reason, a spurious space is tacked
   1856      onto the end of the args in some (at least one anyway)
   1857      implementations, so strip it off if it exists.  */
   1858   {
   1859     char *command = elf_tdata (abfd)->core_command;
   1860     int n = strlen (command);
   1861 
   1862     if (0 < n && command[n - 1] == ' ')
   1863       command[n - 1] = '\0';
   1864   }
   1865 
   1866   return TRUE;
   1867 }
   1868 
   1869 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vec
   1870 #define TARGET_LITTLE_NAME              "elf32-littlearm"
   1871 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vec
   1872 #define TARGET_BIG_NAME                 "elf32-bigarm"
   1873 
   1874 #define elf_backend_grok_prstatus	elf32_arm_nabi_grok_prstatus
   1875 #define elf_backend_grok_psinfo		elf32_arm_nabi_grok_psinfo
   1876 
   1877 typedef unsigned long int insn32;
   1878 typedef unsigned short int insn16;
   1879 
   1880 /* In lieu of proper flags, assume all EABIv4 or later objects are
   1881    interworkable.  */
   1882 #define INTERWORK_FLAG(abfd)  \
   1883   (EF_ARM_EABI_VERSION (elf_elfheader (abfd)->e_flags) >= EF_ARM_EABI_VER4 \
   1884   || (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK))
   1885 
   1886 /* The linker script knows the section names for placement.
   1887    The entry_names are used to do simple name mangling on the stubs.
   1888    Given a function name, and its type, the stub can be found. The
   1889    name can be changed. The only requirement is the %s be present.  */
   1890 #define THUMB2ARM_GLUE_SECTION_NAME ".glue_7t"
   1891 #define THUMB2ARM_GLUE_ENTRY_NAME   "__%s_from_thumb"
   1892 
   1893 #define ARM2THUMB_GLUE_SECTION_NAME ".glue_7"
   1894 #define ARM2THUMB_GLUE_ENTRY_NAME   "__%s_from_arm"
   1895 
   1896 #define VFP11_ERRATUM_VENEER_SECTION_NAME ".vfp11_veneer"
   1897 #define VFP11_ERRATUM_VENEER_ENTRY_NAME   "__vfp11_veneer_%x"
   1898 
   1899 #define ARM_BX_GLUE_SECTION_NAME ".v4_bx"
   1900 #define ARM_BX_GLUE_ENTRY_NAME   "__bx_r%d"
   1901 
   1902 #define STUB_ENTRY_NAME   "__%s_veneer"
   1903 
   1904 /* The name of the dynamic interpreter.  This is put in the .interp
   1905    section.  */
   1906 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
   1907 
   1908 #ifdef FOUR_WORD_PLT
   1909 
   1910 /* The first entry in a procedure linkage table looks like
   1911    this.  It is set up so that any shared library function that is
   1912    called before the relocation has been set up calls the dynamic
   1913    linker first.  */
   1914 static const bfd_vma elf32_arm_plt0_entry [] =
   1915   {
   1916     0xe52de004,		/* str   lr, [sp, #-4]! */
   1917     0xe59fe010,		/* ldr   lr, [pc, #16]  */
   1918     0xe08fe00e,		/* add   lr, pc, lr     */
   1919     0xe5bef008,		/* ldr   pc, [lr, #8]!  */
   1920   };
   1921 
   1922 /* Subsequent entries in a procedure linkage table look like
   1923    this.  */
   1924 static const bfd_vma elf32_arm_plt_entry [] =
   1925   {
   1926     0xe28fc600,		/* add   ip, pc, #NN	*/
   1927     0xe28cca00,		/* add	 ip, ip, #NN	*/
   1928     0xe5bcf000,		/* ldr	 pc, [ip, #NN]! */
   1929     0x00000000,		/* unused		*/
   1930   };
   1931 
   1932 #else
   1933 
   1934 /* The first entry in a procedure linkage table looks like
   1935    this.  It is set up so that any shared library function that is
   1936    called before the relocation has been set up calls the dynamic
   1937    linker first.  */
   1938 static const bfd_vma elf32_arm_plt0_entry [] =
   1939   {
   1940     0xe52de004,		/* str   lr, [sp, #-4]! */
   1941     0xe59fe004,		/* ldr   lr, [pc, #4]   */
   1942     0xe08fe00e,		/* add   lr, pc, lr     */
   1943     0xe5bef008,		/* ldr   pc, [lr, #8]!  */
   1944     0x00000000,		/* &GOT[0] - .          */
   1945   };
   1946 
   1947 /* Subsequent entries in a procedure linkage table look like
   1948    this.  */
   1949 static const bfd_vma elf32_arm_plt_entry [] =
   1950   {
   1951     0xe28fc600,		/* add   ip, pc, #0xNN00000 */
   1952     0xe28cca00,		/* add	 ip, ip, #0xNN000   */
   1953     0xe5bcf000,		/* ldr	 pc, [ip, #0xNNN]!  */
   1954   };
   1955 
   1956 #endif
   1957 
   1958 /* The format of the first entry in the procedure linkage table
   1959    for a VxWorks executable.  */
   1960 static const bfd_vma elf32_arm_vxworks_exec_plt0_entry[] =
   1961   {
   1962     0xe52dc008,	        /* str    ip,[sp,#-8]!			*/
   1963     0xe59fc000,         /* ldr    ip,[pc]			*/
   1964     0xe59cf008,         /* ldr    pc,[ip,#8]			*/
   1965     0x00000000,         /* .long  _GLOBAL_OFFSET_TABLE_		*/
   1966   };
   1967 
   1968 /* The format of subsequent entries in a VxWorks executable.  */
   1969 static const bfd_vma elf32_arm_vxworks_exec_plt_entry[] =
   1970   {
   1971     0xe59fc000,         /* ldr    ip,[pc]			*/
   1972     0xe59cf000,         /* ldr    pc,[ip]			*/
   1973     0x00000000,         /* .long  @got				*/
   1974     0xe59fc000,         /* ldr    ip,[pc]			*/
   1975     0xea000000,         /* b      _PLT				*/
   1976     0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)	*/
   1977   };
   1978 
   1979 /* The format of entries in a VxWorks shared library.  */
   1980 static const bfd_vma elf32_arm_vxworks_shared_plt_entry[] =
   1981   {
   1982     0xe59fc000,         /* ldr    ip,[pc]			*/
   1983     0xe79cf009,         /* ldr    pc,[ip,r9]			*/
   1984     0x00000000,         /* .long  @got				*/
   1985     0xe59fc000,         /* ldr    ip,[pc]			*/
   1986     0xe599f008,         /* ldr    pc,[r9,#8]			*/
   1987     0x00000000,         /* .long  @pltindex*sizeof(Elf32_Rela)	*/
   1988   };
   1989 
   1990 /* An initial stub used if the PLT entry is referenced from Thumb code.  */
   1991 #define PLT_THUMB_STUB_SIZE 4
   1992 static const bfd_vma elf32_arm_plt_thumb_stub [] =
   1993   {
   1994     0x4778,		/* bx pc */
   1995     0x46c0		/* nop   */
   1996   };
   1997 
   1998 /* The entries in a PLT when using a DLL-based target with multiple
   1999    address spaces.  */
   2000 static const bfd_vma elf32_arm_symbian_plt_entry [] =
   2001   {
   2002     0xe51ff004,         /* ldr   pc, [pc, #-4] */
   2003     0x00000000,         /* dcd   R_ARM_GLOB_DAT(X) */
   2004   };
   2005 
   2006 #define ARM_MAX_FWD_BRANCH_OFFSET  ((((1 << 23) - 1) << 2) + 8)
   2007 #define ARM_MAX_BWD_BRANCH_OFFSET  ((-((1 << 23) << 2)) + 8)
   2008 #define THM_MAX_FWD_BRANCH_OFFSET  ((1 << 22) -2 + 4)
   2009 #define THM_MAX_BWD_BRANCH_OFFSET  (-(1 << 22) + 4)
   2010 #define THM2_MAX_FWD_BRANCH_OFFSET (((1 << 24) - 2) + 4)
   2011 #define THM2_MAX_BWD_BRANCH_OFFSET (-(1 << 24) + 4)
   2012 
   2013 static const bfd_vma arm_long_branch_stub[] =
   2014   {
   2015     0xe51ff004,         /* ldr   pc, [pc, #-4] */
   2016     0x00000000,         /* dcd   R_ARM_ABS32(X) */
   2017   };
   2018 
   2019 static const bfd_vma arm_thumb_v4t_long_branch_stub[] =
   2020   {
   2021     0xe59fc000,         /* ldr   ip, [pc, #0] */
   2022     0xe12fff1c,         /* bx    ip */
   2023     0x00000000,         /* dcd   R_ARM_ABS32(X) */
   2024   };
   2025 
   2026 static const bfd_vma arm_thumb_thumb_long_branch_stub[] =
   2027   {
   2028     0x4e02b540,         /* push {r6, lr} */
   2029                         /* ldr  r6, [pc, #8] */
   2030     0x473046fe,         /* mov  lr, pc */
   2031                         /* bx   r6 */
   2032     0xbf00bd40,         /* pop  {r6, pc} */
   2033                         /* nop */
   2034     0x00000000,         /* dcd  R_ARM_ABS32(X) */
   2035   };
   2036 
   2037 static const bfd_vma arm_thumb_arm_v4t_long_branch_stub[] =
   2038   {
   2039     0x4e03b540,         /* push {r6, lr} */
   2040                         /* ldr  r6, [pc, #12] */
   2041     0x473046fe,         /* mov  lr, pc */
   2042                         /* bx   r6 */
   2043     0xe8bd4040,         /* pop  {r6, pc} */
   2044     0xe12fff1e,         /* bx   lr */
   2045     0x00000000,         /* dcd  R_ARM_ABS32(X) */
   2046   };
   2047 
   2048 static const bfd_vma arm_thumb_arm_v4t_short_branch_stub[] =
   2049   {
   2050     0x46c04778,         /* bx   pc */
   2051                         /* nop   */
   2052     0xea000000,         /* b    (X) */
   2053   };
   2054 
   2055 static const bfd_vma arm_pic_long_branch_stub[] =
   2056   {
   2057     0xe59fc000,         /* ldr   r12, [pc] */
   2058     0xe08ff00c,         /* add   pc, pc, ip */
   2059     0x00000000,         /* dcd   R_ARM_REL32(X) */
   2060   };
   2061 
   2062 /* Section name for stubs is the associated section name plus this
   2063    string.  */
   2064 #define STUB_SUFFIX ".stub"
   2065 
   2066 enum elf32_arm_stub_type
   2067 {
   2068   arm_stub_none,
   2069   arm_stub_long_branch,
   2070   arm_thumb_v4t_stub_long_branch,
   2071   arm_thumb_thumb_stub_long_branch,
   2072   arm_thumb_arm_v4t_stub_long_branch,
   2073   arm_thumb_arm_v4t_stub_short_branch,
   2074   arm_stub_pic_long_branch,
   2075 };
   2076 
   2077 struct elf32_arm_stub_hash_entry
   2078 {
   2079   /* Base hash table entry structure.  */
   2080   struct bfd_hash_entry root;
   2081 
   2082   /* The stub section.  */
   2083   asection *stub_sec;
   2084 
   2085   /* Offset within stub_sec of the beginning of this stub.  */
   2086   bfd_vma stub_offset;
   2087 
   2088   /* Given the symbol's value and its section we can determine its final
   2089      value when building the stubs (so the stub knows where to jump).  */
   2090   bfd_vma target_value;
   2091   asection *target_section;
   2092 
   2093   enum elf32_arm_stub_type stub_type;
   2094 
   2095   /* The symbol table entry, if any, that this was derived from.  */
   2096   struct elf32_arm_link_hash_entry *h;
   2097 
   2098   /* Destination symbol type (STT_ARM_TFUNC, ...) */
   2099   unsigned char st_type;
   2100 
   2101   /* Where this stub is being called from, or, in the case of combined
   2102      stub sections, the first input section in the group.  */
   2103   asection *id_sec;
   2104 
   2105   /* The name for the local symbol at the start of this stub.  The
   2106      stub name in the hash table has to be unique; this does not, so
   2107      it can be friendlier.  */
   2108   char *output_name;
   2109 };
   2110 
   2111 /* Used to build a map of a section.  This is required for mixed-endian
   2112    code/data.  */
   2113 
   2114 typedef struct elf32_elf_section_map
   2115 {
   2116   bfd_vma vma;
   2117   char type;
   2118 }
   2119 elf32_arm_section_map;
   2120 
   2121 /* Information about a VFP11 erratum veneer, or a branch to such a veneer.  */
   2122 
   2123 typedef enum
   2124 {
   2125   VFP11_ERRATUM_BRANCH_TO_ARM_VENEER,
   2126   VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER,
   2127   VFP11_ERRATUM_ARM_VENEER,
   2128   VFP11_ERRATUM_THUMB_VENEER
   2129 }
   2130 elf32_vfp11_erratum_type;
   2131 
   2132 typedef struct elf32_vfp11_erratum_list
   2133 {
   2134   struct elf32_vfp11_erratum_list *next;
   2135   bfd_vma vma;
   2136   union
   2137   {
   2138     struct
   2139     {
   2140       struct elf32_vfp11_erratum_list *veneer;
   2141       unsigned int vfp_insn;
   2142     } b;
   2143     struct
   2144     {
   2145       struct elf32_vfp11_erratum_list *branch;
   2146       unsigned int id;
   2147     } v;
   2148   } u;
   2149   elf32_vfp11_erratum_type type;
   2150 }
   2151 elf32_vfp11_erratum_list;
   2152 
   2153 typedef struct _arm_elf_section_data
   2154 {
   2155   struct bfd_elf_section_data elf;
   2156   unsigned int mapcount;
   2157   unsigned int mapsize;
   2158   elf32_arm_section_map *map;
   2159   unsigned int erratumcount;
   2160   elf32_vfp11_erratum_list *erratumlist;
   2161 }
   2162 _arm_elf_section_data;
   2163 
   2164 #define elf32_arm_section_data(sec) \
   2165   ((_arm_elf_section_data *) elf_section_data (sec))
   2166 
   2167 /* The size of the thread control block.  */
   2168 #define TCB_SIZE	8
   2169 
   2170 struct elf_arm_obj_tdata
   2171 {
   2172   struct elf_obj_tdata root;
   2173 
   2174   /* tls_type for each local got entry.  */
   2175   char *local_got_tls_type;
   2176 
   2177   /* Zero to warn when linking objects with incompatible enum sizes.  */
   2178   int no_enum_size_warning;
   2179 
   2180   /* Zero to warn when linking objects with incompatible wchar_t sizes.  */
   2181   int no_wchar_size_warning;
   2182 };
   2183 
   2184 #define elf_arm_tdata(bfd) \
   2185   ((struct elf_arm_obj_tdata *) (bfd)->tdata.any)
   2186 
   2187 #define elf32_arm_local_got_tls_type(bfd) \
   2188   (elf_arm_tdata (bfd)->local_got_tls_type)
   2189 
   2190 #define is_arm_elf(bfd) \
   2191   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
   2192    && elf_tdata (bfd) != NULL \
   2193    && elf_object_id (bfd) == ARM_ELF_TDATA)
   2194 
   2195 static bfd_boolean
   2196 elf32_arm_mkobject (bfd *abfd)
   2197 {
   2198   return bfd_elf_allocate_object (abfd, sizeof (struct elf_arm_obj_tdata),
   2199 				  ARM_ELF_TDATA);
   2200 }
   2201 
   2202 /* The ARM linker needs to keep track of the number of relocs that it
   2203    decides to copy in check_relocs for each symbol.  This is so that
   2204    it can discard PC relative relocs if it doesn't need them when
   2205    linking with -Bsymbolic.  We store the information in a field
   2206    extending the regular ELF linker hash table.  */
   2207 
   2208 /* This structure keeps track of the number of relocs we have copied
   2209    for a given symbol.  */
   2210 struct elf32_arm_relocs_copied
   2211   {
   2212     /* Next section.  */
   2213     struct elf32_arm_relocs_copied * next;
   2214     /* A section in dynobj.  */
   2215     asection * section;
   2216     /* Number of relocs copied in this section.  */
   2217     bfd_size_type count;
   2218     /* Number of PC-relative relocs copied in this section.  */
   2219     bfd_size_type pc_count;
   2220   };
   2221 
   2222 #define elf32_arm_hash_entry(ent) ((struct elf32_arm_link_hash_entry *)(ent))
   2223 
   2224 /* Arm ELF linker hash entry.  */
   2225 struct elf32_arm_link_hash_entry
   2226   {
   2227     struct elf_link_hash_entry root;
   2228 
   2229     /* Number of PC relative relocs copied for this symbol.  */
   2230     struct elf32_arm_relocs_copied * relocs_copied;
   2231 
   2232     /* We reference count Thumb references to a PLT entry separately,
   2233        so that we can emit the Thumb trampoline only if needed.  */
   2234     bfd_signed_vma plt_thumb_refcount;
   2235 
   2236     /* Some references from Thumb code may be eliminated by BL->BLX
   2237        conversion, so record them separately.  */
   2238     bfd_signed_vma plt_maybe_thumb_refcount;
   2239 
   2240     /* Since PLT entries have variable size if the Thumb prologue is
   2241        used, we need to record the index into .got.plt instead of
   2242        recomputing it from the PLT offset.  */
   2243     bfd_signed_vma plt_got_offset;
   2244 
   2245 #define GOT_UNKNOWN	0
   2246 #define GOT_NORMAL	1
   2247 #define GOT_TLS_GD	2
   2248 #define GOT_TLS_IE	4
   2249     unsigned char tls_type;
   2250 
   2251     /* The symbol marking the real symbol location for exported thumb
   2252        symbols with Arm stubs.  */
   2253     struct elf_link_hash_entry *export_glue;
   2254 
   2255    /* A pointer to the most recently used stub hash entry against this
   2256      symbol.  */
   2257     struct elf32_arm_stub_hash_entry *stub_cache;
   2258   };
   2259 
   2260 /* Traverse an arm ELF linker hash table.  */
   2261 #define elf32_arm_link_hash_traverse(table, func, info)			\
   2262   (elf_link_hash_traverse						\
   2263    (&(table)->root,							\
   2264     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func),	\
   2265     (info)))
   2266 
   2267 /* Get the ARM elf linker hash table from a link_info structure.  */
   2268 #define elf32_arm_hash_table(info) \
   2269   ((struct elf32_arm_link_hash_table *) ((info)->hash))
   2270 
   2271 #define arm_stub_hash_lookup(table, string, create, copy) \
   2272   ((struct elf32_arm_stub_hash_entry *) \
   2273    bfd_hash_lookup ((table), (string), (create), (copy)))
   2274 
   2275 /* ARM ELF linker hash table.  */
   2276 struct elf32_arm_link_hash_table
   2277 {
   2278   /* The main hash table.  */
   2279   struct elf_link_hash_table root;
   2280 
   2281   /* The size in bytes of the section containing the Thumb-to-ARM glue.  */
   2282   bfd_size_type thumb_glue_size;
   2283 
   2284   /* The size in bytes of the section containing the ARM-to-Thumb glue.  */
   2285   bfd_size_type arm_glue_size;
   2286 
   2287   /* The size in bytes of section containing the ARMv4 BX veneers.  */
   2288   bfd_size_type bx_glue_size;
   2289 
   2290   /* Offsets of ARMv4 BX veneers.  Bit1 set if present, and Bit0 set when
   2291      veneer has been populated.  */
   2292   bfd_vma bx_glue_offset[15];
   2293 
   2294   /* The size in bytes of the section containing glue for VFP11 erratum
   2295      veneers.  */
   2296   bfd_size_type vfp11_erratum_glue_size;
   2297 
   2298   /* An arbitrary input BFD chosen to hold the glue sections.  */
   2299   bfd * bfd_of_glue_owner;
   2300 
   2301   /* Nonzero to output a BE8 image.  */
   2302   int byteswap_code;
   2303 
   2304   /* Zero if R_ARM_TARGET1 means R_ARM_ABS32.
   2305      Nonzero if R_ARM_TARGET1 means R_ARM_REL32.  */
   2306   int target1_is_rel;
   2307 
   2308   /* The relocation to use for R_ARM_TARGET2 relocations.  */
   2309   int target2_reloc;
   2310 
   2311   /* 0 = Ignore R_ARM_V4BX.
   2312      1 = Convert BX to MOV PC.
   2313      2 = Generate v4 interworing stubs.  */
   2314   int fix_v4bx;
   2315 
   2316   /* Nonzero if the ARM/Thumb BLX instructions are available for use.  */
   2317   int use_blx;
   2318 
   2319   /* What sort of code sequences we should look for which may trigger the
   2320      VFP11 denorm erratum.  */
   2321   bfd_arm_vfp11_fix vfp11_fix;
   2322 
   2323   /* Global counter for the number of fixes we have emitted.  */
   2324   int num_vfp11_fixes;
   2325 
   2326   /* Nonzero to force PIC branch veneers.  */
   2327   int pic_veneer;
   2328 
   2329   /* The number of bytes in the initial entry in the PLT.  */
   2330   bfd_size_type plt_header_size;
   2331 
   2332   /* The number of bytes in the subsequent PLT etries.  */
   2333   bfd_size_type plt_entry_size;
   2334 
   2335   /* True if the target system is VxWorks.  */
   2336   int vxworks_p;
   2337 
   2338   /* True if the target system is Symbian OS.  */
   2339   int symbian_p;
   2340 
   2341   /* True if the target uses REL relocations.  */
   2342   int use_rel;
   2343 
   2344   /* Short-cuts to get to dynamic linker sections.  */
   2345   asection *sgot;
   2346   asection *sgotplt;
   2347   asection *srelgot;
   2348   asection *splt;
   2349   asection *srelplt;
   2350   asection *sdynbss;
   2351   asection *srelbss;
   2352 
   2353   /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
   2354   asection *srelplt2;
   2355 
   2356   /* Data for R_ARM_TLS_LDM32 relocations.  */
   2357   union
   2358   {
   2359     bfd_signed_vma refcount;
   2360     bfd_vma offset;
   2361   } tls_ldm_got;
   2362 
   2363   /* Small local sym to section mapping cache.  */
   2364   struct sym_sec_cache sym_sec;
   2365 
   2366   /* For convenience in allocate_dynrelocs.  */
   2367   bfd * obfd;
   2368 
   2369   /* The stub hash table.  */
   2370   struct bfd_hash_table stub_hash_table;
   2371 
   2372   /* Linker stub bfd.  */
   2373   bfd *stub_bfd;
   2374 
   2375   /* Linker call-backs.  */
   2376   asection * (*add_stub_section) (const char *, asection *);
   2377   void (*layout_sections_again) (void);
   2378 
   2379   /* Array to keep track of which stub sections have been created, and
   2380      information on stub grouping.  */
   2381   struct map_stub
   2382   {
   2383     /* This is the section to which stubs in the group will be
   2384        attached.  */
   2385     asection *link_sec;
   2386     /* The stub section.  */
   2387     asection *stub_sec;
   2388   } *stub_group;
   2389 
   2390   /* Assorted information used by elf32_arm_size_stubs.  */
   2391   unsigned int bfd_count;
   2392   int top_index;
   2393   asection **input_list;
   2394 };
   2395 
   2396 /* Create an entry in an ARM ELF linker hash table.  */
   2397 
   2398 static struct bfd_hash_entry *
   2399 elf32_arm_link_hash_newfunc (struct bfd_hash_entry * entry,
   2400                              struct bfd_hash_table * table,
   2401                              const char * string)
   2402 {
   2403   struct elf32_arm_link_hash_entry * ret =
   2404     (struct elf32_arm_link_hash_entry *) entry;
   2405 
   2406   /* Allocate the structure if it has not already been allocated by a
   2407      subclass.  */
   2408   if (ret == NULL)
   2409     ret = bfd_hash_allocate (table, sizeof (struct elf32_arm_link_hash_entry));
   2410   if (ret == NULL)
   2411     return (struct bfd_hash_entry *) ret;
   2412 
   2413   /* Call the allocation method of the superclass.  */
   2414   ret = ((struct elf32_arm_link_hash_entry *)
   2415 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   2416 				     table, string));
   2417   if (ret != NULL)
   2418     {
   2419       ret->relocs_copied = NULL;
   2420       ret->tls_type = GOT_UNKNOWN;
   2421       ret->plt_thumb_refcount = 0;
   2422       ret->plt_maybe_thumb_refcount = 0;
   2423       ret->plt_got_offset = -1;
   2424       ret->export_glue = NULL;
   2425 
   2426       ret->stub_cache = NULL;
   2427     }
   2428 
   2429   return (struct bfd_hash_entry *) ret;
   2430 }
   2431 
   2432 /* Initialize an entry in the stub hash table.  */
   2433 
   2434 static struct bfd_hash_entry *
   2435 stub_hash_newfunc (struct bfd_hash_entry *entry,
   2436 		   struct bfd_hash_table *table,
   2437 		   const char *string)
   2438 {
   2439   /* Allocate the structure if it has not already been allocated by a
   2440      subclass.  */
   2441   if (entry == NULL)
   2442     {
   2443       entry = bfd_hash_allocate (table,
   2444 				 sizeof (struct elf32_arm_stub_hash_entry));
   2445       if (entry == NULL)
   2446 	return entry;
   2447     }
   2448 
   2449   /* Call the allocation method of the superclass.  */
   2450   entry = bfd_hash_newfunc (entry, table, string);
   2451   if (entry != NULL)
   2452     {
   2453       struct elf32_arm_stub_hash_entry *eh;
   2454 
   2455       /* Initialize the local fields.  */
   2456       eh = (struct elf32_arm_stub_hash_entry *) entry;
   2457       eh->stub_sec = NULL;
   2458       eh->stub_offset = 0;
   2459       eh->target_value = 0;
   2460       eh->target_section = NULL;
   2461       eh->stub_type = arm_stub_none;
   2462       eh->h = NULL;
   2463       eh->id_sec = NULL;
   2464     }
   2465 
   2466   return entry;
   2467 }
   2468 
   2469 /* Return true if NAME is the name of the relocation section associated
   2470    with S.  */
   2471 
   2472 static bfd_boolean
   2473 reloc_section_p (struct elf32_arm_link_hash_table *htab,
   2474 		 const char *name, asection *s)
   2475 {
   2476   if (htab->use_rel)
   2477     return CONST_STRNEQ (name, ".rel") && strcmp (s->name, name + 4) == 0;
   2478   else
   2479     return CONST_STRNEQ (name, ".rela") && strcmp (s->name, name + 5) == 0;
   2480 }
   2481 
   2482 /* Create .got, .gotplt, and .rel(a).got sections in DYNOBJ, and set up
   2483    shortcuts to them in our hash table.  */
   2484 
   2485 static bfd_boolean
   2486 create_got_section (bfd *dynobj, struct bfd_link_info *info)
   2487 {
   2488   struct elf32_arm_link_hash_table *htab;
   2489 
   2490   htab = elf32_arm_hash_table (info);
   2491   /* BPABI objects never have a GOT, or associated sections.  */
   2492   if (htab->symbian_p)
   2493     return TRUE;
   2494 
   2495   if (! _bfd_elf_create_got_section (dynobj, info))
   2496     return FALSE;
   2497 
   2498   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
   2499   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
   2500   if (!htab->sgot || !htab->sgotplt)
   2501     abort ();
   2502 
   2503   htab->srelgot = bfd_make_section_with_flags (dynobj,
   2504 					       RELOC_SECTION (htab, ".got"),
   2505 					       (SEC_ALLOC | SEC_LOAD
   2506 						| SEC_HAS_CONTENTS
   2507 						| SEC_IN_MEMORY
   2508 						| SEC_LINKER_CREATED
   2509 						| SEC_READONLY));
   2510   if (htab->srelgot == NULL
   2511       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
   2512     return FALSE;
   2513   return TRUE;
   2514 }
   2515 
   2516 /* Create .plt, .rel(a).plt, .got, .got.plt, .rel(a).got, .dynbss, and
   2517    .rel(a).bss sections in DYNOBJ, and set up shortcuts to them in our
   2518    hash table.  */
   2519 
   2520 static bfd_boolean
   2521 elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
   2522 {
   2523   struct elf32_arm_link_hash_table *htab;
   2524 
   2525   htab = elf32_arm_hash_table (info);
   2526   if (!htab->sgot && !create_got_section (dynobj, info))
   2527     return FALSE;
   2528 
   2529   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
   2530     return FALSE;
   2531 
   2532   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
   2533   htab->srelplt = bfd_get_section_by_name (dynobj,
   2534 					   RELOC_SECTION (htab, ".plt"));
   2535   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
   2536   if (!info->shared)
   2537     htab->srelbss = bfd_get_section_by_name (dynobj,
   2538 					     RELOC_SECTION (htab, ".bss"));
   2539 
   2540   if (htab->vxworks_p)
   2541     {
   2542       if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
   2543 	return FALSE;
   2544 
   2545       if (info->shared)
   2546 	{
   2547 	  htab->plt_header_size = 0;
   2548 	  htab->plt_entry_size
   2549 	    = 4 * ARRAY_SIZE (elf32_arm_vxworks_shared_plt_entry);
   2550 	}
   2551       else
   2552 	{
   2553 	  htab->plt_header_size
   2554 	    = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt0_entry);
   2555 	  htab->plt_entry_size
   2556 	    = 4 * ARRAY_SIZE (elf32_arm_vxworks_exec_plt_entry);
   2557 	}
   2558     }
   2559 
   2560   if (!htab->splt
   2561       || !htab->srelplt
   2562       || !htab->sdynbss
   2563       || (!info->shared && !htab->srelbss))
   2564     abort ();
   2565 
   2566   return TRUE;
   2567 }
   2568 
   2569 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   2570 
   2571 static void
   2572 elf32_arm_copy_indirect_symbol (struct bfd_link_info *info,
   2573 				struct elf_link_hash_entry *dir,
   2574 				struct elf_link_hash_entry *ind)
   2575 {
   2576   struct elf32_arm_link_hash_entry *edir, *eind;
   2577 
   2578   edir = (struct elf32_arm_link_hash_entry *) dir;
   2579   eind = (struct elf32_arm_link_hash_entry *) ind;
   2580 
   2581   if (eind->relocs_copied != NULL)
   2582     {
   2583       if (edir->relocs_copied != NULL)
   2584 	{
   2585 	  struct elf32_arm_relocs_copied **pp;
   2586 	  struct elf32_arm_relocs_copied *p;
   2587 
   2588 	  /* Add reloc counts against the indirect sym to the direct sym
   2589 	     list.  Merge any entries against the same section.  */
   2590 	  for (pp = &eind->relocs_copied; (p = *pp) != NULL; )
   2591 	    {
   2592 	      struct elf32_arm_relocs_copied *q;
   2593 
   2594 	      for (q = edir->relocs_copied; q != NULL; q = q->next)
   2595 		if (q->section == p->section)
   2596 		  {
   2597 		    q->pc_count += p->pc_count;
   2598 		    q->count += p->count;
   2599 		    *pp = p->next;
   2600 		    break;
   2601 		  }
   2602 	      if (q == NULL)
   2603 		pp = &p->next;
   2604 	    }
   2605 	  *pp = edir->relocs_copied;
   2606 	}
   2607 
   2608       edir->relocs_copied = eind->relocs_copied;
   2609       eind->relocs_copied = NULL;
   2610     }
   2611 
   2612   if (ind->root.type == bfd_link_hash_indirect)
   2613     {
   2614       /* Copy over PLT info.  */
   2615       edir->plt_thumb_refcount += eind->plt_thumb_refcount;
   2616       eind->plt_thumb_refcount = 0;
   2617       edir->plt_maybe_thumb_refcount += eind->plt_maybe_thumb_refcount;
   2618       eind->plt_maybe_thumb_refcount = 0;
   2619 
   2620       if (dir->got.refcount <= 0)
   2621 	{
   2622 	  edir->tls_type = eind->tls_type;
   2623 	  eind->tls_type = GOT_UNKNOWN;
   2624 	}
   2625     }
   2626 
   2627   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   2628 }
   2629 
   2630 /* Create an ARM elf linker hash table.  */
   2631 
   2632 static struct bfd_link_hash_table *
   2633 elf32_arm_link_hash_table_create (bfd *abfd)
   2634 {
   2635   struct elf32_arm_link_hash_table *ret;
   2636   bfd_size_type amt = sizeof (struct elf32_arm_link_hash_table);
   2637 
   2638   ret = bfd_malloc (amt);
   2639   if (ret == NULL)
   2640     return NULL;
   2641 
   2642   if (!_bfd_elf_link_hash_table_init (& ret->root, abfd,
   2643 				      elf32_arm_link_hash_newfunc,
   2644 				      sizeof (struct elf32_arm_link_hash_entry)))
   2645     {
   2646       free (ret);
   2647       return NULL;
   2648     }
   2649 
   2650   ret->sgot = NULL;
   2651   ret->sgotplt = NULL;
   2652   ret->srelgot = NULL;
   2653   ret->splt = NULL;
   2654   ret->srelplt = NULL;
   2655   ret->sdynbss = NULL;
   2656   ret->srelbss = NULL;
   2657   ret->srelplt2 = NULL;
   2658   ret->thumb_glue_size = 0;
   2659   ret->arm_glue_size = 0;
   2660   ret->bx_glue_size = 0;
   2661   memset (ret->bx_glue_offset, 0, sizeof (ret->bx_glue_offset));
   2662   ret->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
   2663   ret->vfp11_erratum_glue_size = 0;
   2664   ret->num_vfp11_fixes = 0;
   2665   ret->bfd_of_glue_owner = NULL;
   2666   ret->byteswap_code = 0;
   2667   ret->target1_is_rel = 0;
   2668   ret->target2_reloc = R_ARM_NONE;
   2669 #ifdef FOUR_WORD_PLT
   2670   ret->plt_header_size = 16;
   2671   ret->plt_entry_size = 16;
   2672 #else
   2673   ret->plt_header_size = 20;
   2674   ret->plt_entry_size = 12;
   2675 #endif
   2676   ret->fix_v4bx = 0;
   2677   ret->use_blx = 0;
   2678   ret->vxworks_p = 0;
   2679   ret->symbian_p = 0;
   2680   ret->use_rel = 1;
   2681   ret->sym_sec.abfd = NULL;
   2682   ret->obfd = abfd;
   2683   ret->tls_ldm_got.refcount = 0;
   2684   ret->stub_bfd = NULL;
   2685   ret->add_stub_section = NULL;
   2686   ret->layout_sections_again = NULL;
   2687   ret->stub_group = NULL;
   2688   ret->bfd_count = 0;
   2689   ret->top_index = 0;
   2690   ret->input_list = NULL;
   2691 
   2692   if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
   2693 			    sizeof (struct elf32_arm_stub_hash_entry)))
   2694     {
   2695       free (ret);
   2696       return NULL;
   2697     }
   2698 
   2699   return &ret->root.root;
   2700 }
   2701 
   2702 /* Free the derived linker hash table.  */
   2703 
   2704 static void
   2705 elf32_arm_hash_table_free (struct bfd_link_hash_table *hash)
   2706 {
   2707   struct elf32_arm_link_hash_table *ret
   2708     = (struct elf32_arm_link_hash_table *) hash;
   2709 
   2710   bfd_hash_table_free (&ret->stub_hash_table);
   2711   _bfd_generic_link_hash_table_free (hash);
   2712 }
   2713 
   2714 /* Determine if we're dealing with a Thumb only architecture.  */
   2715 
   2716 static bfd_boolean
   2717 using_thumb_only (struct elf32_arm_link_hash_table *globals)
   2718 {
   2719   int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
   2720 				       Tag_CPU_arch);
   2721   int profile;
   2722 
   2723   if (arch != TAG_CPU_ARCH_V7)
   2724     return FALSE;
   2725 
   2726   profile = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
   2727 				      Tag_CPU_arch_profile);
   2728 
   2729   return profile == 'M';
   2730 }
   2731 
   2732 /* Determine if we're dealing with a Thumb-2 object.  */
   2733 
   2734 static bfd_boolean
   2735 using_thumb2 (struct elf32_arm_link_hash_table *globals)
   2736 {
   2737   int arch = bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
   2738 				       Tag_CPU_arch);
   2739   return arch == TAG_CPU_ARCH_V6T2 || arch >= TAG_CPU_ARCH_V7;
   2740 }
   2741 
   2742 static bfd_boolean
   2743 arm_stub_is_thumb (enum elf32_arm_stub_type stub_type)
   2744 {
   2745   switch (stub_type)
   2746     {
   2747     case arm_thumb_thumb_stub_long_branch:
   2748     case arm_thumb_arm_v4t_stub_long_branch:
   2749     case arm_thumb_arm_v4t_stub_short_branch:
   2750       return TRUE;
   2751     case arm_stub_none:
   2752       BFD_FAIL ();
   2753       return FALSE;
   2754       break;
   2755     default:
   2756       return FALSE;
   2757     }
   2758 }
   2759 
   2760 /* Determine the type of stub needed, if any, for a call.  */
   2761 
   2762 static enum elf32_arm_stub_type
   2763 arm_type_of_stub (struct bfd_link_info *info,
   2764 		  asection *input_sec,
   2765 		  const Elf_Internal_Rela *rel,
   2766 		  unsigned char st_type,
   2767 		  struct elf32_arm_link_hash_entry *hash,
   2768 		  bfd_vma destination,
   2769 		  asection *sym_sec,
   2770 		  bfd *input_bfd,
   2771 		  const char *name)
   2772 {
   2773   bfd_vma location;
   2774   bfd_signed_vma branch_offset;
   2775   unsigned int r_type;
   2776   struct elf32_arm_link_hash_table * globals;
   2777   int thumb2;
   2778   int thumb_only;
   2779   enum elf32_arm_stub_type stub_type = arm_stub_none;
   2780 
   2781   /* We don't know the actual type of destination in case it is of
   2782      type STT_SECTION: give up.  */
   2783   if (st_type == STT_SECTION)
   2784     return stub_type;
   2785 
   2786   globals = elf32_arm_hash_table (info);
   2787 
   2788   thumb_only = using_thumb_only (globals);
   2789 
   2790   thumb2 = using_thumb2 (globals);
   2791 
   2792   /* Determine where the call point is.  */
   2793   location = (input_sec->output_offset
   2794 	      + input_sec->output_section->vma
   2795 	      + rel->r_offset);
   2796 
   2797   branch_offset = (bfd_signed_vma)(destination - location);
   2798 
   2799   r_type = ELF32_R_TYPE (rel->r_info);
   2800 
   2801   /* If the call will go through a PLT entry then we do not need
   2802      glue.  */
   2803   if (globals->splt != NULL && hash != NULL && hash->root.plt.offset != (bfd_vma) -1)
   2804     return stub_type;
   2805 
   2806   if (r_type == R_ARM_THM_CALL)
   2807     {
   2808       if ((!thumb2
   2809 	    && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
   2810 		|| (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
   2811 	  || (thumb2
   2812 	      && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
   2813 		  || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
   2814 	  || ((st_type != STT_ARM_TFUNC) && !globals->use_blx))
   2815 	{
   2816 	  if (st_type == STT_ARM_TFUNC)
   2817 	    {
   2818 	      /* Thumb to thumb.  */
   2819 	      if (!thumb_only)
   2820 		{
   2821 		  stub_type = (info->shared | globals->pic_veneer)
   2822 		    ? ((globals->use_blx)
   2823 		       ? arm_stub_pic_long_branch
   2824 		       : arm_stub_none)
   2825 		    : (globals->use_blx)
   2826 		    ? arm_stub_long_branch
   2827 		    : arm_stub_none;
   2828 		}
   2829 	      else
   2830 		{
   2831 		  stub_type = (info->shared | globals->pic_veneer)
   2832 		    ? arm_stub_none
   2833 		    : (globals->use_blx)
   2834 		    ? arm_thumb_thumb_stub_long_branch
   2835 		    : arm_stub_none;
   2836 		}
   2837 	    }
   2838 	  else
   2839 	    {
   2840 	      /* Thumb to arm.  */
   2841 	      if (sym_sec != NULL
   2842 		  && sym_sec->owner != NULL
   2843 		  && !INTERWORK_FLAG (sym_sec->owner))
   2844 		{
   2845 		  (*_bfd_error_handler)
   2846 		    (_("%B(%s): warning: interworking not enabled.\n"
   2847 		       "  first occurrence: %B: Thumb call to ARM"),
   2848 		     sym_sec->owner, input_bfd, name);
   2849 		}
   2850 
   2851 	      stub_type = (info->shared | globals->pic_veneer)
   2852 		? ((globals->use_blx)
   2853 		   ? arm_stub_pic_long_branch
   2854 		   : arm_stub_none)
   2855 		: (globals->use_blx)
   2856 		? arm_stub_long_branch
   2857 		: arm_thumb_arm_v4t_stub_long_branch;
   2858 
   2859 	      /* Handle v4t short branches.  */
   2860 	      if ((stub_type == arm_thumb_arm_v4t_stub_long_branch)
   2861 		  && (branch_offset <= THM_MAX_FWD_BRANCH_OFFSET)
   2862 		  && (branch_offset >= THM_MAX_BWD_BRANCH_OFFSET))
   2863 		stub_type = arm_thumb_arm_v4t_stub_short_branch;
   2864 	    }
   2865 	}
   2866     }
   2867   else if (r_type == R_ARM_CALL)
   2868     {
   2869       if (st_type == STT_ARM_TFUNC)
   2870 	{
   2871 	  /* Arm to thumb.  */
   2872 
   2873 	  if (sym_sec != NULL
   2874 	      && sym_sec->owner != NULL
   2875 	      && !INTERWORK_FLAG (sym_sec->owner))
   2876 	    {
   2877 	      (*_bfd_error_handler)
   2878 		(_("%B(%s): warning: interworking not enabled.\n"
   2879 		   "  first occurrence: %B: Thumb call to ARM"),
   2880 		 sym_sec->owner, input_bfd, name);
   2881 	    }
   2882 
   2883 	  /* We have an extra 2-bytes reach because of
   2884 	     the mode change (bit 24 (H) of BLX encoding).  */
   2885 	  if (branch_offset > (ARM_MAX_FWD_BRANCH_OFFSET + 2)
   2886 	      || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET)
   2887 	      || !globals->use_blx)
   2888 	    {
   2889 	      stub_type = (info->shared | globals->pic_veneer)
   2890 		? arm_stub_pic_long_branch
   2891 		: (globals->use_blx)
   2892 		? arm_stub_long_branch
   2893 		: arm_thumb_v4t_stub_long_branch;
   2894 	    }
   2895 	}
   2896       else
   2897 	{
   2898 	  /* Arm to arm.  */
   2899 	  if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
   2900 	      || (branch_offset < ARM_MAX_BWD_BRANCH_OFFSET))
   2901 	    {
   2902 	      stub_type = (info->shared | globals->pic_veneer)
   2903 		? arm_stub_pic_long_branch
   2904 		: arm_stub_long_branch;
   2905 	    }
   2906 	}
   2907     }
   2908 
   2909   return stub_type;
   2910 }
   2911 
   2912 /* Build a name for an entry in the stub hash table.  */
   2913 
   2914 static char *
   2915 elf32_arm_stub_name (const asection *input_section,
   2916 		     const asection *sym_sec,
   2917 		     const struct elf32_arm_link_hash_entry *hash,
   2918 		     const Elf_Internal_Rela *rel)
   2919 {
   2920   char *stub_name;
   2921   bfd_size_type len;
   2922 
   2923   if (hash)
   2924     {
   2925       len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 8 + 1;
   2926       stub_name = bfd_malloc (len);
   2927       if (stub_name != NULL)
   2928 	sprintf (stub_name, "%08x_%s+%x",
   2929 		 input_section->id & 0xffffffff,
   2930 		 hash->root.root.root.string,
   2931 		 (int) rel->r_addend & 0xffffffff);
   2932     }
   2933   else
   2934     {
   2935       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
   2936       stub_name = bfd_malloc (len);
   2937       if (stub_name != NULL)
   2938 	sprintf (stub_name, "%08x_%x:%x+%x",
   2939 		 input_section->id & 0xffffffff,
   2940 		 sym_sec->id & 0xffffffff,
   2941 		 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
   2942 		 (int) rel->r_addend & 0xffffffff);
   2943     }
   2944 
   2945   return stub_name;
   2946 }
   2947 
   2948 /* Look up an entry in the stub hash.  Stub entries are cached because
   2949    creating the stub name takes a bit of time.  */
   2950 
   2951 static struct elf32_arm_stub_hash_entry *
   2952 elf32_arm_get_stub_entry (const asection *input_section,
   2953 			  const asection *sym_sec,
   2954 			  struct elf_link_hash_entry *hash,
   2955 			  const Elf_Internal_Rela *rel,
   2956 			  struct elf32_arm_link_hash_table *htab)
   2957 {
   2958   struct elf32_arm_stub_hash_entry *stub_entry;
   2959   struct elf32_arm_link_hash_entry *h = (struct elf32_arm_link_hash_entry *) hash;
   2960   const asection *id_sec;
   2961 
   2962   if ((input_section->flags & SEC_CODE) == 0)
   2963     return NULL;
   2964 
   2965   /* If this input section is part of a group of sections sharing one
   2966      stub section, then use the id of the first section in the group.
   2967      Stub names need to include a section id, as there may well be
   2968      more than one stub used to reach say, printf, and we need to
   2969      distinguish between them.  */
   2970   id_sec = htab->stub_group[input_section->id].link_sec;
   2971 
   2972   if (h != NULL && h->stub_cache != NULL
   2973       && h->stub_cache->h == h
   2974       && h->stub_cache->id_sec == id_sec)
   2975     {
   2976       stub_entry = h->stub_cache;
   2977     }
   2978   else
   2979     {
   2980       char *stub_name;
   2981 
   2982       stub_name = elf32_arm_stub_name (id_sec, sym_sec, h, rel);
   2983       if (stub_name == NULL)
   2984 	return NULL;
   2985 
   2986       stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
   2987 					stub_name, FALSE, FALSE);
   2988       if (h != NULL)
   2989 	h->stub_cache = stub_entry;
   2990 
   2991       free (stub_name);
   2992     }
   2993 
   2994   return stub_entry;
   2995 }
   2996 
   2997 /* Add a new stub entry to the stub hash.  Not all fields of the new
   2998    stub entry are initialised.  */
   2999 
   3000 static struct elf32_arm_stub_hash_entry *
   3001 elf32_arm_add_stub (const char *stub_name,
   3002 		    asection *section,
   3003 		    struct elf32_arm_link_hash_table *htab)
   3004 {
   3005   asection *link_sec;
   3006   asection *stub_sec;
   3007   struct elf32_arm_stub_hash_entry *stub_entry;
   3008 
   3009   link_sec = htab->stub_group[section->id].link_sec;
   3010   stub_sec = htab->stub_group[section->id].stub_sec;
   3011   if (stub_sec == NULL)
   3012     {
   3013       stub_sec = htab->stub_group[link_sec->id].stub_sec;
   3014       if (stub_sec == NULL)
   3015 	{
   3016 	  size_t namelen;
   3017 	  bfd_size_type len;
   3018 	  char *s_name;
   3019 
   3020 	  namelen = strlen (link_sec->name);
   3021 	  len = namelen + sizeof (STUB_SUFFIX);
   3022 	  s_name = bfd_alloc (htab->stub_bfd, len);
   3023 	  if (s_name == NULL)
   3024 	    return NULL;
   3025 
   3026 	  memcpy (s_name, link_sec->name, namelen);
   3027 	  memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
   3028 	  stub_sec = (*htab->add_stub_section) (s_name, link_sec);
   3029 	  if (stub_sec == NULL)
   3030 	    return NULL;
   3031 	  htab->stub_group[link_sec->id].stub_sec = stub_sec;
   3032 	}
   3033       htab->stub_group[section->id].stub_sec = stub_sec;
   3034     }
   3035 
   3036   /* Enter this entry into the linker stub hash table.  */
   3037   stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table, stub_name,
   3038 				     TRUE, FALSE);
   3039   if (stub_entry == NULL)
   3040     {
   3041       (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
   3042 			     section->owner,
   3043 			     stub_name);
   3044       return NULL;
   3045     }
   3046 
   3047   stub_entry->stub_sec = stub_sec;
   3048   stub_entry->stub_offset = 0;
   3049   stub_entry->id_sec = link_sec;
   3050 
   3051   return stub_entry;
   3052 }
   3053 
   3054 /* Store an Arm insn into an output section not processed by
   3055    elf32_arm_write_section.  */
   3056 
   3057 static void
   3058 put_arm_insn (struct elf32_arm_link_hash_table * htab,
   3059 	      bfd * output_bfd, bfd_vma val, void * ptr)
   3060 {
   3061   if (htab->byteswap_code != bfd_little_endian (output_bfd))
   3062     bfd_putl32 (val, ptr);
   3063   else
   3064     bfd_putb32 (val, ptr);
   3065 }
   3066 
   3067 /* Store a 16-bit Thumb insn into an output section not processed by
   3068    elf32_arm_write_section.  */
   3069 
   3070 static void
   3071 put_thumb_insn (struct elf32_arm_link_hash_table * htab,
   3072 		bfd * output_bfd, bfd_vma val, void * ptr)
   3073 {
   3074   if (htab->byteswap_code != bfd_little_endian (output_bfd))
   3075     bfd_putl16 (val, ptr);
   3076   else
   3077     bfd_putb16 (val, ptr);
   3078 }
   3079 
   3080 static bfd_boolean
   3081 arm_build_one_stub (struct bfd_hash_entry *gen_entry,
   3082 		    void * in_arg)
   3083 {
   3084   struct elf32_arm_stub_hash_entry *stub_entry;
   3085   struct bfd_link_info *info;
   3086   struct elf32_arm_link_hash_table *htab;
   3087   asection *stub_sec;
   3088   bfd *stub_bfd;
   3089   bfd_vma stub_addr;
   3090   bfd_byte *loc;
   3091   bfd_vma sym_value;
   3092   int template_size;
   3093   int size;
   3094   const bfd_vma *template;
   3095   int i;
   3096   struct elf32_arm_link_hash_table * globals;
   3097 
   3098   /* Massage our args to the form they really have.  */
   3099   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
   3100   info = (struct bfd_link_info *) in_arg;
   3101 
   3102   globals = elf32_arm_hash_table (info);
   3103 
   3104   htab = elf32_arm_hash_table (info);
   3105   stub_sec = stub_entry->stub_sec;
   3106 
   3107   /* Make a note of the offset within the stubs for this entry.  */
   3108   stub_entry->stub_offset = stub_sec->size;
   3109   loc = stub_sec->contents + stub_entry->stub_offset;
   3110 
   3111   stub_bfd = stub_sec->owner;
   3112 
   3113   /* This is the address of the start of the stub.  */
   3114   stub_addr = stub_sec->output_section->vma + stub_sec->output_offset
   3115     + stub_entry->stub_offset;
   3116 
   3117   /* This is the address of the stub destination.  */
   3118   sym_value = (stub_entry->target_value
   3119 	       + stub_entry->target_section->output_offset
   3120 	       + stub_entry->target_section->output_section->vma);
   3121 
   3122   switch (stub_entry->stub_type)
   3123     {
   3124     case arm_stub_long_branch:
   3125       template = arm_long_branch_stub;
   3126       template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3127       break;
   3128     case arm_thumb_v4t_stub_long_branch:
   3129       template =  arm_thumb_v4t_long_branch_stub;
   3130       template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3131       break;
   3132     case arm_thumb_thumb_stub_long_branch:
   3133       template =  arm_thumb_thumb_long_branch_stub;
   3134       template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3135       break;
   3136     case arm_thumb_arm_v4t_stub_long_branch:
   3137       template =  arm_thumb_arm_v4t_long_branch_stub;
   3138       template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3139       break;
   3140     case arm_thumb_arm_v4t_stub_short_branch:
   3141       template =  arm_thumb_arm_v4t_short_branch_stub;
   3142       template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4;
   3143       break;
   3144     case arm_stub_pic_long_branch:
   3145       template = arm_pic_long_branch_stub;
   3146       template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3147       break;
   3148     default:
   3149       BFD_FAIL ();
   3150       return FALSE;
   3151     }
   3152 
   3153   size = 0;
   3154   for (i = 0; i < (template_size / 4); i++)
   3155     {
   3156       /* A 0 pattern is a placeholder, every other pattern is an
   3157 	 instruction.  */
   3158       if (template[i] != 0)
   3159 	put_arm_insn (globals, stub_bfd, template[i], loc + size);
   3160       else
   3161 	bfd_put_32 (stub_bfd, template[i], loc + size);
   3162 
   3163       size += 4;
   3164     }
   3165   stub_sec->size += size;
   3166 
   3167   /* Destination is Thumb. Force bit 0 to 1 to reflect this.  */
   3168   if (stub_entry->st_type == STT_ARM_TFUNC)
   3169     sym_value |= 1;
   3170 
   3171   switch (stub_entry->stub_type)
   3172     {
   3173     case arm_stub_long_branch:
   3174       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
   3175 				stub_bfd, stub_sec, stub_sec->contents,
   3176 				stub_entry->stub_offset + 4, sym_value, 0);
   3177       break;
   3178     case arm_thumb_v4t_stub_long_branch:
   3179       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
   3180 				stub_bfd, stub_sec, stub_sec->contents,
   3181 				stub_entry->stub_offset + 8, sym_value, 0);
   3182       break;
   3183     case arm_thumb_thumb_stub_long_branch:
   3184       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
   3185 				stub_bfd, stub_sec, stub_sec->contents,
   3186 				stub_entry->stub_offset + 12, sym_value, 0);
   3187       break;
   3188     case arm_thumb_arm_v4t_stub_long_branch:
   3189       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_ABS32),
   3190 				stub_bfd, stub_sec, stub_sec->contents,
   3191 				stub_entry->stub_offset + 16, sym_value, 0);
   3192       break;
   3193     case arm_thumb_arm_v4t_stub_short_branch:
   3194       {
   3195 	long int rel_offset;
   3196 	static const insn32 t2a3_b_insn = 0xea000000;
   3197 
   3198 	rel_offset = sym_value - (stub_addr + 8 + 4);
   3199 
   3200 	put_arm_insn (globals, stub_bfd,
   3201 		      (bfd_vma) t2a3_b_insn | ((rel_offset >> 2) & 0x00FFFFFF),
   3202 		      loc + 4);
   3203       }
   3204       break;
   3205 
   3206     case arm_stub_pic_long_branch:
   3207       /* We want the value relative to the address 8 bytes from the
   3208 	 start of the stub.  */
   3209       _bfd_final_link_relocate (elf32_arm_howto_from_type (R_ARM_REL32),
   3210 				stub_bfd, stub_sec, stub_sec->contents,
   3211 				stub_entry->stub_offset + 8, sym_value, 0);
   3212       break;
   3213     default:
   3214       break;
   3215     }
   3216 
   3217   return TRUE;
   3218 }
   3219 
   3220 /* As above, but don't actually build the stub.  Just bump offset so
   3221    we know stub section sizes.  */
   3222 
   3223 static bfd_boolean
   3224 arm_size_one_stub (struct bfd_hash_entry *gen_entry,
   3225 		   void * in_arg)
   3226 {
   3227   struct elf32_arm_stub_hash_entry *stub_entry;
   3228   struct elf32_arm_link_hash_table *htab;
   3229   const bfd_vma *template;
   3230   int template_size;
   3231   int size;
   3232   int i;
   3233 
   3234   /* Massage our args to the form they really have.  */
   3235   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
   3236   htab = (struct elf32_arm_link_hash_table *) in_arg;
   3237 
   3238   switch (stub_entry->stub_type)
   3239     {
   3240     case arm_stub_long_branch:
   3241       template =  arm_long_branch_stub;
   3242       template_size = (sizeof (arm_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3243       break;
   3244     case arm_thumb_v4t_stub_long_branch:
   3245       template =  arm_thumb_v4t_long_branch_stub;
   3246       template_size = (sizeof (arm_thumb_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3247       break;
   3248     case arm_thumb_thumb_stub_long_branch:
   3249       template =  arm_thumb_thumb_long_branch_stub;
   3250       template_size = (sizeof (arm_thumb_thumb_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3251       break;
   3252     case arm_thumb_arm_v4t_stub_long_branch:
   3253       template =  arm_thumb_arm_v4t_long_branch_stub;
   3254       template_size = (sizeof (arm_thumb_arm_v4t_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3255       break;
   3256     case arm_thumb_arm_v4t_stub_short_branch:
   3257       template =  arm_thumb_arm_v4t_short_branch_stub;
   3258       template_size = (sizeof(arm_thumb_arm_v4t_short_branch_stub) / sizeof (bfd_vma)) * 4;
   3259       break;
   3260     case arm_stub_pic_long_branch:
   3261       template = arm_pic_long_branch_stub;
   3262       template_size = (sizeof (arm_pic_long_branch_stub) / sizeof (bfd_vma)) * 4;
   3263       break;
   3264     default:
   3265       BFD_FAIL ();
   3266       return FALSE;
   3267       break;
   3268     }
   3269 
   3270   size = 0;
   3271   for (i = 0; i < (template_size / 4); i++)
   3272       size += 4;
   3273   size = (size + 7) & ~7;
   3274   stub_entry->stub_sec->size += size;
   3275   return TRUE;
   3276 }
   3277 
   3278 /* External entry points for sizing and building linker stubs.  */
   3279 
   3280 /* Set up various things so that we can make a list of input sections
   3281    for each output section included in the link.  Returns -1 on error,
   3282    0 when no stubs will be needed, and 1 on success.  */
   3283 
   3284 int
   3285 elf32_arm_setup_section_lists (bfd *output_bfd,
   3286 			       struct bfd_link_info *info)
   3287 {
   3288   bfd *input_bfd;
   3289   unsigned int bfd_count;
   3290   int top_id, top_index;
   3291   asection *section;
   3292   asection **input_list, **list;
   3293   bfd_size_type amt;
   3294   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
   3295 
   3296   if (! is_elf_hash_table (htab))
   3297     return 0;
   3298 
   3299   /* Count the number of input BFDs and find the top input section id.  */
   3300   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
   3301        input_bfd != NULL;
   3302        input_bfd = input_bfd->link_next)
   3303     {
   3304       bfd_count += 1;
   3305       for (section = input_bfd->sections;
   3306 	   section != NULL;
   3307 	   section = section->next)
   3308 	{
   3309 	  if (top_id < section->id)
   3310 	    top_id = section->id;
   3311 	}
   3312     }
   3313   htab->bfd_count = bfd_count;
   3314 
   3315   amt = sizeof (struct map_stub) * (top_id + 1);
   3316   htab->stub_group = bfd_zmalloc (amt);
   3317   if (htab->stub_group == NULL)
   3318     return -1;
   3319 
   3320   /* We can't use output_bfd->section_count here to find the top output
   3321      section index as some sections may have been removed, and
   3322      _bfd_strip_section_from_output doesn't renumber the indices.  */
   3323   for (section = output_bfd->sections, top_index = 0;
   3324        section != NULL;
   3325        section = section->next)
   3326     {
   3327       if (top_index < section->index)
   3328 	top_index = section->index;
   3329     }
   3330 
   3331   htab->top_index = top_index;
   3332   amt = sizeof (asection *) * (top_index + 1);
   3333   input_list = bfd_malloc (amt);
   3334   htab->input_list = input_list;
   3335   if (input_list == NULL)
   3336     return -1;
   3337 
   3338   /* For sections we aren't interested in, mark their entries with a
   3339      value we can check later.  */
   3340   list = input_list + top_index;
   3341   do
   3342     *list = bfd_abs_section_ptr;
   3343   while (list-- != input_list);
   3344 
   3345   for (section = output_bfd->sections;
   3346        section != NULL;
   3347        section = section->next)
   3348     {
   3349       if ((section->flags & SEC_CODE) != 0)
   3350 	input_list[section->index] = NULL;
   3351     }
   3352 
   3353   return 1;
   3354 }
   3355 
   3356 /* The linker repeatedly calls this function for each input section,
   3357    in the order that input sections are linked into output sections.
   3358    Build lists of input sections to determine groupings between which
   3359    we may insert linker stubs.  */
   3360 
   3361 void
   3362 elf32_arm_next_input_section (struct bfd_link_info *info,
   3363 			      asection *isec)
   3364 {
   3365   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
   3366 
   3367   if (isec->output_section->index <= htab->top_index)
   3368     {
   3369       asection **list = htab->input_list + isec->output_section->index;
   3370 
   3371       if (*list != bfd_abs_section_ptr)
   3372 	{
   3373 	  /* Steal the link_sec pointer for our list.  */
   3374 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
   3375 	  /* This happens to make the list in reverse order,
   3376 	     which is what we want.  */
   3377 	  PREV_SEC (isec) = *list;
   3378 	  *list = isec;
   3379 	}
   3380     }
   3381 }
   3382 
   3383 /* See whether we can group stub sections together.  Grouping stub
   3384    sections may result in fewer stubs.  More importantly, we need to
   3385    put all .init* and .fini* stubs at the beginning of the .init or
   3386    .fini output sections respectively, because glibc splits the
   3387    _init and _fini functions into multiple parts.  Putting a stub in
   3388    the middle of a function is not a good idea.  */
   3389 
   3390 static void
   3391 group_sections (struct elf32_arm_link_hash_table *htab,
   3392 		bfd_size_type stub_group_size,
   3393 		bfd_boolean stubs_always_before_branch)
   3394 {
   3395   asection **list = htab->input_list + htab->top_index;
   3396 
   3397   do
   3398     {
   3399       asection *tail = *list;
   3400 
   3401       if (tail == bfd_abs_section_ptr)
   3402 	continue;
   3403 
   3404       while (tail != NULL)
   3405 	{
   3406 	  asection *curr;
   3407 	  asection *prev;
   3408 	  bfd_size_type total;
   3409 
   3410 	  curr = tail;
   3411 	  total = tail->size;
   3412 	  while ((prev = PREV_SEC (curr)) != NULL
   3413 		 && ((total += curr->output_offset - prev->output_offset)
   3414 		     < stub_group_size))
   3415 	    curr = prev;
   3416 
   3417 	  /* OK, the size from the start of CURR to the end is less
   3418 	     than stub_group_size and thus can be handled by one stub
   3419 	     section.  (Or the tail section is itself larger than
   3420 	     stub_group_size, in which case we may be toast.)
   3421 	     We should really be keeping track of the total size of
   3422 	     stubs added here, as stubs contribute to the final output
   3423 	     section size.  */
   3424 	  do
   3425 	    {
   3426 	      prev = PREV_SEC (tail);
   3427 	      /* Set up this stub group.  */
   3428 	      htab->stub_group[tail->id].link_sec = curr;
   3429 	    }
   3430 	  while (tail != curr && (tail = prev) != NULL);
   3431 
   3432 	  /* But wait, there's more!  Input sections up to stub_group_size
   3433 	     bytes before the stub section can be handled by it too.  */
   3434 	  if (!stubs_always_before_branch)
   3435 	    {
   3436 	      total = 0;
   3437 	      while (prev != NULL
   3438 		     && ((total += tail->output_offset - prev->output_offset)
   3439 			 < stub_group_size))
   3440 		{
   3441 		  tail = prev;
   3442 		  prev = PREV_SEC (tail);
   3443 		  htab->stub_group[tail->id].link_sec = curr;
   3444 		}
   3445 	    }
   3446 	  tail = prev;
   3447 	}
   3448     }
   3449   while (list-- != htab->input_list);
   3450 
   3451   free (htab->input_list);
   3452 #undef PREV_SEC
   3453 }
   3454 
   3455 /* Determine and set the size of the stub section for a final link.
   3456 
   3457    The basic idea here is to examine all the relocations looking for
   3458    PC-relative calls to a target that is unreachable with a "bl"
   3459    instruction.  */
   3460 
   3461 bfd_boolean
   3462 elf32_arm_size_stubs (bfd *output_bfd,
   3463 		      bfd *stub_bfd,
   3464 		      struct bfd_link_info *info,
   3465 		      bfd_signed_vma group_size,
   3466 		      asection * (*add_stub_section) (const char *, asection *),
   3467 		      void (*layout_sections_again) (void))
   3468 {
   3469   bfd_size_type stub_group_size;
   3470   bfd_boolean stubs_always_before_branch;
   3471   bfd_boolean stub_changed = 0;
   3472   struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
   3473 
   3474   /* Propagate mach to stub bfd, because it may not have been
   3475      finalized when we created stub_bfd.  */
   3476   bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
   3477 		     bfd_get_mach (output_bfd));
   3478 
   3479   /* Stash our params away.  */
   3480   htab->stub_bfd = stub_bfd;
   3481   htab->add_stub_section = add_stub_section;
   3482   htab->layout_sections_again = layout_sections_again;
   3483   stubs_always_before_branch = group_size < 0;
   3484   if (group_size < 0)
   3485     stub_group_size = -group_size;
   3486   else
   3487     stub_group_size = group_size;
   3488 
   3489   if (stub_group_size == 1)
   3490     {
   3491       /* Default values.  */
   3492       /* Thumb branch range is +-4MB has to be used as the default
   3493 	 maximum size (a given section can contain both ARM and Thumb
   3494 	 code, so the worst case has to be taken into account).
   3495 
   3496 	 This value is 24K less than that, which allows for 2025
   3497 	 12-byte stubs.  If we exceed that, then we will fail to link.
   3498 	 The user will have to relink with an explicit group size
   3499 	 option.  */
   3500       stub_group_size = 4170000;
   3501     }
   3502 
   3503   group_sections (htab, stub_group_size, stubs_always_before_branch);
   3504 
   3505   while (1)
   3506     {
   3507       bfd *input_bfd;
   3508       unsigned int bfd_indx;
   3509       asection *stub_sec;
   3510 
   3511       for (input_bfd = info->input_bfds, bfd_indx = 0;
   3512 	   input_bfd != NULL;
   3513 	   input_bfd = input_bfd->link_next, bfd_indx++)
   3514 	{
   3515 	  Elf_Internal_Shdr *symtab_hdr;
   3516 	  asection *section;
   3517 	  Elf_Internal_Sym *local_syms = NULL;
   3518 
   3519 	  /* We'll need the symbol table in a second.  */
   3520 	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   3521 	  if (symtab_hdr->sh_info == 0)
   3522 	    continue;
   3523 
   3524 	  /* Walk over each section attached to the input bfd.  */
   3525 	  for (section = input_bfd->sections;
   3526 	       section != NULL;
   3527 	       section = section->next)
   3528 	    {
   3529 	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
   3530 
   3531 	      /* If there aren't any relocs, then there's nothing more
   3532 		 to do.  */
   3533 	      if ((section->flags & SEC_RELOC) == 0
   3534 		  || section->reloc_count == 0
   3535 		  || (section->flags & SEC_CODE) == 0)
   3536 		continue;
   3537 
   3538 	      /* If this section is a link-once section that will be
   3539 		 discarded, then don't create any stubs.  */
   3540 	      if (section->output_section == NULL
   3541 		  || section->output_section->owner != output_bfd)
   3542 		continue;
   3543 
   3544 	      /* Get the relocs.  */
   3545 	      internal_relocs
   3546 		= _bfd_elf_link_read_relocs (input_bfd, section, NULL,
   3547 					     NULL, info->keep_memory);
   3548 	      if (internal_relocs == NULL)
   3549 		goto error_ret_free_local;
   3550 
   3551 	      /* Now examine each relocation.  */
   3552 	      irela = internal_relocs;
   3553 	      irelaend = irela + section->reloc_count;
   3554 	      for (; irela < irelaend; irela++)
   3555 		{
   3556 		  unsigned int r_type, r_indx;
   3557 		  enum elf32_arm_stub_type stub_type;
   3558 		  struct elf32_arm_stub_hash_entry *stub_entry;
   3559 		  asection *sym_sec;
   3560 		  bfd_vma sym_value;
   3561 		  bfd_vma destination;
   3562 		  struct elf32_arm_link_hash_entry *hash;
   3563 		  const char *sym_name;
   3564 		  char *stub_name;
   3565 		  const asection *id_sec;
   3566 		  unsigned char st_type;
   3567 
   3568 		  r_type = ELF32_R_TYPE (irela->r_info);
   3569 		  r_indx = ELF32_R_SYM (irela->r_info);
   3570 
   3571 		  if (r_type >= (unsigned int) R_ARM_max)
   3572 		    {
   3573 		      bfd_set_error (bfd_error_bad_value);
   3574 		    error_ret_free_internal:
   3575 		      if (elf_section_data (section)->relocs == NULL)
   3576 			free (internal_relocs);
   3577 		      goto error_ret_free_local;
   3578 		    }
   3579 
   3580 		  /* Only look for stubs on call instructions.  */
   3581 		  if ((r_type != (unsigned int) R_ARM_CALL)
   3582 		      && (r_type != (unsigned int) R_ARM_THM_CALL))
   3583 		    continue;
   3584 
   3585 		  /* Now determine the call target, its name, value,
   3586 		     section.  */
   3587 		  sym_sec = NULL;
   3588 		  sym_value = 0;
   3589 		  destination = 0;
   3590 		  hash = NULL;
   3591 		  sym_name = NULL;
   3592 		  if (r_indx < symtab_hdr->sh_info)
   3593 		    {
   3594 		      /* It's a local symbol.  */
   3595 		      Elf_Internal_Sym *sym;
   3596 		      Elf_Internal_Shdr *hdr;
   3597 
   3598 		      if (local_syms == NULL)
   3599 			{
   3600 			  local_syms
   3601 			    = (Elf_Internal_Sym *) symtab_hdr->contents;
   3602 			  if (local_syms == NULL)
   3603 			    local_syms
   3604 			      = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   3605 						      symtab_hdr->sh_info, 0,
   3606 						      NULL, NULL, NULL);
   3607 			  if (local_syms == NULL)
   3608 			    goto error_ret_free_internal;
   3609 			}
   3610 
   3611 		      sym = local_syms + r_indx;
   3612 		      hdr = elf_elfsections (input_bfd)[sym->st_shndx];
   3613 		      sym_sec = hdr->bfd_section;
   3614 		      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
   3615 			sym_value = sym->st_value;
   3616 		      destination = (sym_value + irela->r_addend
   3617 				     + sym_sec->output_offset
   3618 				     + sym_sec->output_section->vma);
   3619 		      st_type = ELF_ST_TYPE (sym->st_info);
   3620 		      sym_name
   3621 			= bfd_elf_string_from_elf_section (input_bfd,
   3622 							   symtab_hdr->sh_link,
   3623 							   sym->st_name);
   3624 		    }
   3625 		  else
   3626 		    {
   3627 		      /* It's an external symbol.  */
   3628 		      int e_indx;
   3629 
   3630 		      e_indx = r_indx - symtab_hdr->sh_info;
   3631 		      hash = ((struct elf32_arm_link_hash_entry *)
   3632 			      elf_sym_hashes (input_bfd)[e_indx]);
   3633 
   3634 		      while (hash->root.root.type == bfd_link_hash_indirect
   3635 			     || hash->root.root.type == bfd_link_hash_warning)
   3636 			hash = ((struct elf32_arm_link_hash_entry *)
   3637 				hash->root.root.u.i.link);
   3638 
   3639 		      if (hash->root.root.type == bfd_link_hash_defined
   3640 			  || hash->root.root.type == bfd_link_hash_defweak)
   3641 			{
   3642 			  sym_sec = hash->root.root.u.def.section;
   3643 			  sym_value = hash->root.root.u.def.value;
   3644 			  if (sym_sec->output_section != NULL)
   3645 			    destination = (sym_value + irela->r_addend
   3646 					   + sym_sec->output_offset
   3647 					   + sym_sec->output_section->vma);
   3648 			}
   3649 		      else if (hash->root.root.type == bfd_link_hash_undefweak
   3650 			       || hash->root.root.type == bfd_link_hash_undefined)
   3651 			/* For a shared library, these will need a PLT stub,
   3652 			   which is treated separately.
   3653 			   For absolute code, they cannot be handled.  */
   3654 			continue;
   3655 		      else
   3656 			{
   3657 			  bfd_set_error (bfd_error_bad_value);
   3658 			  goto error_ret_free_internal;
   3659 			}
   3660 		      st_type = ELF_ST_TYPE (hash->root.type);
   3661 		      sym_name = hash->root.root.root.string;
   3662 		    }
   3663 
   3664 		  /* Determine what (if any) linker stub is needed.  */
   3665 		  stub_type = arm_type_of_stub (info, section, irela, st_type,
   3666 						hash, destination, sym_sec,
   3667 						input_bfd, sym_name);
   3668 		  if (stub_type == arm_stub_none)
   3669 		    continue;
   3670 
   3671 		  /* Support for grouping stub sections.  */
   3672 		  id_sec = htab->stub_group[section->id].link_sec;
   3673 
   3674 		  /* Get the name of this stub.  */
   3675 		  stub_name = elf32_arm_stub_name (id_sec, sym_sec, hash, irela);
   3676 		  if (!stub_name)
   3677 		    goto error_ret_free_internal;
   3678 
   3679 		  stub_entry = arm_stub_hash_lookup (&htab->stub_hash_table,
   3680 						    stub_name,
   3681 						    FALSE, FALSE);
   3682 		  if (stub_entry != NULL)
   3683 		    {
   3684 		      /* The proper stub has already been created.  */
   3685 		      free (stub_name);
   3686 		      continue;
   3687 		    }
   3688 
   3689 		  stub_entry = elf32_arm_add_stub (stub_name, section, htab);
   3690 		  if (stub_entry == NULL)
   3691 		    {
   3692 		      free (stub_name);
   3693 		      goto error_ret_free_internal;
   3694 		    }
   3695 
   3696 		  stub_entry->target_value = sym_value;
   3697 		  stub_entry->target_section = sym_sec;
   3698 		  stub_entry->stub_type = stub_type;
   3699 		  stub_entry->h = hash;
   3700 		  stub_entry->st_type = st_type;
   3701 
   3702 		  if (sym_name == NULL)
   3703 		    sym_name = "unnamed";
   3704 		  stub_entry->output_name
   3705 		    = bfd_alloc (htab->stub_bfd,
   3706 				 sizeof (THUMB2ARM_GLUE_ENTRY_NAME)
   3707 				 + strlen (sym_name));
   3708 		  if (stub_entry->output_name == NULL)
   3709 		    {
   3710 		      free (stub_name);
   3711 		      goto error_ret_free_internal;
   3712 		    }
   3713 
   3714 		  /* For historical reasons, use the existing names for
   3715 		     ARM-to-Thumb and Thumb-to-ARM stubs.  */
   3716 		  if (r_type == (unsigned int) R_ARM_THM_CALL
   3717 		      && st_type != STT_ARM_TFUNC)
   3718 		    sprintf (stub_entry->output_name, THUMB2ARM_GLUE_ENTRY_NAME,
   3719 			     sym_name);
   3720 		  else if (r_type == (unsigned int) R_ARM_CALL
   3721 			   && st_type == STT_ARM_TFUNC)
   3722 		    sprintf (stub_entry->output_name, ARM2THUMB_GLUE_ENTRY_NAME,
   3723 			     sym_name);
   3724 		  else
   3725 		    sprintf (stub_entry->output_name, STUB_ENTRY_NAME,
   3726 			     sym_name);
   3727 
   3728 		  stub_changed = TRUE;
   3729 		}
   3730 
   3731 	      /* We're done with the internal relocs, free them.  */
   3732 	      if (elf_section_data (section)->relocs == NULL)
   3733 		free (internal_relocs);
   3734 	    }
   3735 	}
   3736 
   3737       if (!stub_changed)
   3738 	break;
   3739 
   3740       /* OK, we've added some stubs.  Find out the new size of the
   3741 	 stub sections.  */
   3742       for (stub_sec = htab->stub_bfd->sections;
   3743 	   stub_sec != NULL;
   3744 	   stub_sec = stub_sec->next)
   3745 	stub_sec->size = 0;
   3746 
   3747       bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
   3748 
   3749       /* Ask the linker to do its stuff.  */
   3750       (*htab->layout_sections_again) ();
   3751       stub_changed = FALSE;
   3752     }
   3753 
   3754   return TRUE;
   3755 
   3756  error_ret_free_local:
   3757   return FALSE;
   3758 }
   3759 
   3760 /* Build all the stubs associated with the current output file.  The
   3761    stubs are kept in a hash table attached to the main linker hash
   3762    table.  We also set up the .plt entries for statically linked PIC
   3763    functions here.  This function is called via arm_elf_finish in the
   3764    linker.  */
   3765 
   3766 bfd_boolean
   3767 elf32_arm_build_stubs (struct bfd_link_info *info)
   3768 {
   3769   asection *stub_sec;
   3770   struct bfd_hash_table *table;
   3771   struct elf32_arm_link_hash_table *htab;
   3772 
   3773   htab = elf32_arm_hash_table (info);
   3774 
   3775   for (stub_sec = htab->stub_bfd->sections;
   3776        stub_sec != NULL;
   3777        stub_sec = stub_sec->next)
   3778     {
   3779       bfd_size_type size;
   3780 
   3781       /* Ignore non-stub sections.  */
   3782       if (!strstr (stub_sec->name, STUB_SUFFIX))
   3783 	continue;
   3784 
   3785       /* Allocate memory to hold the linker stubs.  */
   3786       size = stub_sec->size;
   3787       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
   3788       if (stub_sec->contents == NULL && size != 0)
   3789 	return FALSE;
   3790       stub_sec->size = 0;
   3791     }
   3792 
   3793   /* Build the stubs as directed by the stub hash table.  */
   3794   table = &htab->stub_hash_table;
   3795   bfd_hash_traverse (table, arm_build_one_stub, info);
   3796 
   3797   return TRUE;
   3798 }
   3799 
   3800 /* Locate the Thumb encoded calling stub for NAME.  */
   3801 
   3802 static struct elf_link_hash_entry *
   3803 find_thumb_glue (struct bfd_link_info *link_info,
   3804 		 const char *name,
   3805 		 char **error_message)
   3806 {
   3807   char *tmp_name;
   3808   struct elf_link_hash_entry *hash;
   3809   struct elf32_arm_link_hash_table *hash_table;
   3810 
   3811   /* We need a pointer to the armelf specific hash table.  */
   3812   hash_table = elf32_arm_hash_table (link_info);
   3813 
   3814   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
   3815 			 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
   3816 
   3817   BFD_ASSERT (tmp_name);
   3818 
   3819   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
   3820 
   3821   hash = elf_link_hash_lookup
   3822     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
   3823 
   3824   if (hash == NULL
   3825       && asprintf (error_message, _("unable to find THUMB glue '%s' for '%s'"),
   3826 		   tmp_name, name) == -1)
   3827     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
   3828 
   3829   free (tmp_name);
   3830 
   3831   return hash;
   3832 }
   3833 
   3834 /* Locate the ARM encoded calling stub for NAME.  */
   3835 
   3836 static struct elf_link_hash_entry *
   3837 find_arm_glue (struct bfd_link_info *link_info,
   3838 	       const char *name,
   3839 	       char **error_message)
   3840 {
   3841   char *tmp_name;
   3842   struct elf_link_hash_entry *myh;
   3843   struct elf32_arm_link_hash_table *hash_table;
   3844 
   3845   /* We need a pointer to the elfarm specific hash table.  */
   3846   hash_table = elf32_arm_hash_table (link_info);
   3847 
   3848   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
   3849 			 + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
   3850 
   3851   BFD_ASSERT (tmp_name);
   3852 
   3853   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
   3854 
   3855   myh = elf_link_hash_lookup
   3856     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
   3857 
   3858   if (myh == NULL
   3859       && asprintf (error_message, _("unable to find ARM glue '%s' for '%s'"),
   3860 		   tmp_name, name) == -1)
   3861     *error_message = (char *) bfd_errmsg (bfd_error_system_call);
   3862 
   3863   free (tmp_name);
   3864 
   3865   return myh;
   3866 }
   3867 
   3868 /* ARM->Thumb glue (static images):
   3869 
   3870    .arm
   3871    __func_from_arm:
   3872    ldr r12, __func_addr
   3873    bx  r12
   3874    __func_addr:
   3875    .word func    @ behave as if you saw a ARM_32 reloc.
   3876 
   3877    (v5t static images)
   3878    .arm
   3879    __func_from_arm:
   3880    ldr pc, __func_addr
   3881    __func_addr:
   3882    .word func    @ behave as if you saw a ARM_32 reloc.
   3883 
   3884    (relocatable images)
   3885    .arm
   3886    __func_from_arm:
   3887    ldr r12, __func_offset
   3888    add r12, r12, pc
   3889    bx  r12
   3890    __func_offset:
   3891    .word func - .   */
   3892 
   3893 #define ARM2THUMB_STATIC_GLUE_SIZE 12
   3894 static const insn32 a2t1_ldr_insn = 0xe59fc000;
   3895 static const insn32 a2t2_bx_r12_insn = 0xe12fff1c;
   3896 static const insn32 a2t3_func_addr_insn = 0x00000001;
   3897 
   3898 #define ARM2THUMB_V5_STATIC_GLUE_SIZE 8
   3899 static const insn32 a2t1v5_ldr_insn = 0xe51ff004;
   3900 static const insn32 a2t2v5_func_addr_insn = 0x00000001;
   3901 
   3902 #define ARM2THUMB_PIC_GLUE_SIZE 16
   3903 static const insn32 a2t1p_ldr_insn = 0xe59fc004;
   3904 static const insn32 a2t2p_add_pc_insn = 0xe08cc00f;
   3905 static const insn32 a2t3p_bx_r12_insn = 0xe12fff1c;
   3906 
   3907 /* Thumb->ARM:                          Thumb->(non-interworking aware) ARM
   3908 
   3909      .thumb                             .thumb
   3910      .align 2                           .align 2
   3911  __func_from_thumb:                 __func_from_thumb:
   3912      bx pc                              push {r6, lr}
   3913      nop                                ldr  r6, __func_addr
   3914      .arm                               mov  lr, pc
   3915      b func                             bx   r6
   3916                                         .arm
   3917 		 		    ;; back_to_thumb
   3918                  		        ldmia r13! {r6, lr}
   3919  				        bx    lr
   3920                                     __func_addr:
   3921                                         .word        func  */
   3922 
   3923 #define THUMB2ARM_GLUE_SIZE 8
   3924 static const insn16 t2a1_bx_pc_insn = 0x4778;
   3925 static const insn16 t2a2_noop_insn = 0x46c0;
   3926 static const insn32 t2a3_b_insn = 0xea000000;
   3927 
   3928 #define VFP11_ERRATUM_VENEER_SIZE 8
   3929 
   3930 #define ARM_BX_VENEER_SIZE 12
   3931 static const insn32 armbx1_tst_insn = 0xe3100001;
   3932 static const insn32 armbx2_moveq_insn = 0x01a0f000;
   3933 static const insn32 armbx3_bx_insn = 0xe12fff10;
   3934 
   3935 #ifndef ELFARM_NABI_C_INCLUDED
   3936 static void
   3937 arm_allocate_glue_section_space (bfd * abfd, bfd_size_type size, const char * name)
   3938 {
   3939   asection * s;
   3940   bfd_byte * contents;
   3941 
   3942   if (size == 0)
   3943     return;
   3944 
   3945   BFD_ASSERT (abfd != NULL);
   3946 
   3947   s = bfd_get_section_by_name (abfd, name);
   3948   BFD_ASSERT (s != NULL);
   3949 
   3950   contents = bfd_alloc (abfd, size);
   3951 
   3952   BFD_ASSERT (s->size == size);
   3953   s->contents = contents;
   3954 }
   3955 
   3956 bfd_boolean
   3957 bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info * info)
   3958 {
   3959   struct elf32_arm_link_hash_table * globals;
   3960 
   3961   globals = elf32_arm_hash_table (info);
   3962   BFD_ASSERT (globals != NULL);
   3963 
   3964   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
   3965 				   globals->arm_glue_size,
   3966 				   ARM2THUMB_GLUE_SECTION_NAME);
   3967 
   3968   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
   3969 				   globals->thumb_glue_size,
   3970 				   THUMB2ARM_GLUE_SECTION_NAME);
   3971 
   3972   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
   3973 				   globals->vfp11_erratum_glue_size,
   3974 				   VFP11_ERRATUM_VENEER_SECTION_NAME);
   3975 
   3976   arm_allocate_glue_section_space (globals->bfd_of_glue_owner,
   3977 				   globals->bx_glue_size,
   3978 				   ARM_BX_GLUE_SECTION_NAME);
   3979 
   3980   return TRUE;
   3981 }
   3982 
   3983 /* Allocate space and symbols for calling a Thumb function from Arm mode.
   3984    returns the symbol identifying the stub.  */
   3985 
   3986 static struct elf_link_hash_entry *
   3987 record_arm_to_thumb_glue (struct bfd_link_info * link_info,
   3988 			  struct elf_link_hash_entry * h)
   3989 {
   3990   const char * name = h->root.root.string;
   3991   asection * s;
   3992   char * tmp_name;
   3993   struct elf_link_hash_entry * myh;
   3994   struct bfd_link_hash_entry * bh;
   3995   struct elf32_arm_link_hash_table * globals;
   3996   bfd_vma val;
   3997   bfd_size_type size;
   3998 
   3999   globals = elf32_arm_hash_table (link_info);
   4000 
   4001   BFD_ASSERT (globals != NULL);
   4002   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   4003 
   4004   s = bfd_get_section_by_name
   4005     (globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
   4006 
   4007   BFD_ASSERT (s != NULL);
   4008 
   4009   tmp_name = bfd_malloc ((bfd_size_type) strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME) + 1);
   4010 
   4011   BFD_ASSERT (tmp_name);
   4012 
   4013   sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
   4014 
   4015   myh = elf_link_hash_lookup
   4016     (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
   4017 
   4018   if (myh != NULL)
   4019     {
   4020       /* We've already seen this guy.  */
   4021       free (tmp_name);
   4022       return myh;
   4023     }
   4024 
   4025   /* The only trick here is using hash_table->arm_glue_size as the value.
   4026      Even though the section isn't allocated yet, this is where we will be
   4027      putting it.  The +1 on the value marks that the stub has not been
   4028      output yet - not that it is a Thumb function.  */
   4029   bh = NULL;
   4030   val = globals->arm_glue_size + 1;
   4031   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
   4032 				    tmp_name, BSF_GLOBAL, s, val,
   4033 				    NULL, TRUE, FALSE, &bh);
   4034 
   4035   myh = (struct elf_link_hash_entry *) bh;
   4036   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
   4037   myh->forced_local = 1;
   4038 
   4039   free (tmp_name);
   4040 
   4041   if (link_info->shared || globals->root.is_relocatable_executable
   4042       || globals->pic_veneer)
   4043     size = ARM2THUMB_PIC_GLUE_SIZE;
   4044   else if (globals->use_blx)
   4045     size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
   4046   else
   4047     size = ARM2THUMB_STATIC_GLUE_SIZE;
   4048 
   4049   s->size += size;
   4050   globals->arm_glue_size += size;
   4051 
   4052   return myh;
   4053 }
   4054 
   4055 static void
   4056 record_thumb_to_arm_glue (struct bfd_link_info *link_info,
   4057 			  struct elf_link_hash_entry *h)
   4058 {
   4059   const char *name = h->root.root.string;
   4060   asection *s;
   4061   char *tmp_name;
   4062   struct elf_link_hash_entry *myh;
   4063   struct bfd_link_hash_entry *bh;
   4064   struct elf32_arm_link_hash_table *hash_table;
   4065   bfd_vma val;
   4066 
   4067   hash_table = elf32_arm_hash_table (link_info);
   4068 
   4069   BFD_ASSERT (hash_table != NULL);
   4070   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
   4071 
   4072   s = bfd_get_section_by_name
   4073     (hash_table->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
   4074 
   4075   BFD_ASSERT (s != NULL);
   4076 
   4077   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
   4078 			 + strlen (THUMB2ARM_GLUE_ENTRY_NAME) + 1);
   4079 
   4080   BFD_ASSERT (tmp_name);
   4081 
   4082   sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
   4083 
   4084   myh = elf_link_hash_lookup
   4085     (&(hash_table)->root, tmp_name, FALSE, FALSE, TRUE);
   4086 
   4087   if (myh != NULL)
   4088     {
   4089       /* We've already seen this guy.  */
   4090       free (tmp_name);
   4091       return;
   4092     }
   4093 
   4094   /* The only trick here is using hash_table->thumb_glue_size as the value.
   4095      Even though the section isn't allocated yet, this is where we will be
   4096      putting it.  The +1 on the value marks that the stub has not been
   4097      output yet - not that it is a Thumb function.  */
   4098   bh = NULL;
   4099   val = hash_table->thumb_glue_size + 1;
   4100   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
   4101 				    tmp_name, BSF_GLOBAL, s, val,
   4102 				    NULL, TRUE, FALSE, &bh);
   4103 
   4104   /* If we mark it 'Thumb', the disassembler will do a better job.  */
   4105   myh = (struct elf_link_hash_entry *) bh;
   4106   myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
   4107   myh->forced_local = 1;
   4108 
   4109   free (tmp_name);
   4110 
   4111 #define CHANGE_TO_ARM "__%s_change_to_arm"
   4112 #define BACK_FROM_ARM "__%s_back_from_arm"
   4113 
   4114   /* Allocate another symbol to mark where we switch to Arm mode.  */
   4115   tmp_name = bfd_malloc ((bfd_size_type) strlen (name)
   4116 			 + strlen (CHANGE_TO_ARM) + 1);
   4117 
   4118   BFD_ASSERT (tmp_name);
   4119 
   4120   sprintf (tmp_name, CHANGE_TO_ARM, name);
   4121 
   4122   bh = NULL;
   4123   val = hash_table->thumb_glue_size + 4,
   4124   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
   4125 				    tmp_name, BSF_LOCAL, s, val,
   4126 				    NULL, TRUE, FALSE, &bh);
   4127 
   4128   free (tmp_name);
   4129 
   4130   s->size += THUMB2ARM_GLUE_SIZE;
   4131   hash_table->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
   4132 }
   4133 
   4134 
   4135 /* Allocate space for ARMv4 BX veneers.  */
   4136 
   4137 static void
   4138 record_arm_bx_glue (struct bfd_link_info * link_info, int reg)
   4139 {
   4140   asection * s;
   4141   struct elf32_arm_link_hash_table *globals;
   4142   char *tmp_name;
   4143   struct elf_link_hash_entry *myh;
   4144   struct bfd_link_hash_entry *bh;
   4145   bfd_vma val;
   4146 
   4147   /* BX PC does not need a veneer.  */
   4148   if (reg == 15)
   4149     return;
   4150 
   4151   globals = elf32_arm_hash_table (link_info);
   4152 
   4153   BFD_ASSERT (globals != NULL);
   4154   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   4155 
   4156   /* Check if this veneer has already been allocated.  */
   4157   if (globals->bx_glue_offset[reg])
   4158     return;
   4159 
   4160   s = bfd_get_section_by_name
   4161     (globals->bfd_of_glue_owner, ARM_BX_GLUE_SECTION_NAME);
   4162 
   4163   BFD_ASSERT (s != NULL);
   4164 
   4165   /* Add symbol for veneer.  */
   4166   tmp_name = bfd_malloc ((bfd_size_type) strlen (ARM_BX_GLUE_ENTRY_NAME) + 1);
   4167 
   4168   BFD_ASSERT (tmp_name);
   4169 
   4170   sprintf (tmp_name, ARM_BX_GLUE_ENTRY_NAME, reg);
   4171 
   4172   myh = elf_link_hash_lookup
   4173     (&(globals)->root, tmp_name, FALSE, FALSE, FALSE);
   4174 
   4175   BFD_ASSERT (myh == NULL);
   4176 
   4177   bh = NULL;
   4178   val = globals->bx_glue_size;
   4179   _bfd_generic_link_add_one_symbol (link_info, globals->bfd_of_glue_owner,
   4180                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
   4181                                     NULL, TRUE, FALSE, &bh);
   4182 
   4183   myh = (struct elf_link_hash_entry *) bh;
   4184   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
   4185   myh->forced_local = 1;
   4186 
   4187   s->size += ARM_BX_VENEER_SIZE;
   4188   globals->bx_glue_offset[reg] = globals->bx_glue_size | 2;
   4189   globals->bx_glue_size += ARM_BX_VENEER_SIZE;
   4190 }
   4191 
   4192 
   4193 /* Add an entry to the code/data map for section SEC.  */
   4194 
   4195 static void
   4196 elf32_arm_section_map_add (asection *sec, char type, bfd_vma vma)
   4197 {
   4198   struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
   4199   unsigned int newidx;
   4200 
   4201   if (sec_data->map == NULL)
   4202     {
   4203       sec_data->map = bfd_malloc (sizeof (elf32_arm_section_map));
   4204       sec_data->mapcount = 0;
   4205       sec_data->mapsize = 1;
   4206     }
   4207 
   4208   newidx = sec_data->mapcount++;
   4209 
   4210   if (sec_data->mapcount > sec_data->mapsize)
   4211     {
   4212       sec_data->mapsize *= 2;
   4213       sec_data->map = bfd_realloc_or_free (sec_data->map, sec_data->mapsize
   4214 					   * sizeof (elf32_arm_section_map));
   4215     }
   4216 
   4217   if (sec_data->map)
   4218     {
   4219       sec_data->map[newidx].vma = vma;
   4220       sec_data->map[newidx].type = type;
   4221     }
   4222 }
   4223 
   4224 
   4225 /* Record information about a VFP11 denorm-erratum veneer.  Only ARM-mode
   4226    veneers are handled for now.  */
   4227 
   4228 static bfd_vma
   4229 record_vfp11_erratum_veneer (struct bfd_link_info *link_info,
   4230                              elf32_vfp11_erratum_list *branch,
   4231                              bfd *branch_bfd,
   4232                              asection *branch_sec,
   4233                              unsigned int offset)
   4234 {
   4235   asection *s;
   4236   struct elf32_arm_link_hash_table *hash_table;
   4237   char *tmp_name;
   4238   struct elf_link_hash_entry *myh;
   4239   struct bfd_link_hash_entry *bh;
   4240   bfd_vma val;
   4241   struct _arm_elf_section_data *sec_data;
   4242   int errcount;
   4243   elf32_vfp11_erratum_list *newerr;
   4244 
   4245   hash_table = elf32_arm_hash_table (link_info);
   4246 
   4247   BFD_ASSERT (hash_table != NULL);
   4248   BFD_ASSERT (hash_table->bfd_of_glue_owner != NULL);
   4249 
   4250   s = bfd_get_section_by_name
   4251     (hash_table->bfd_of_glue_owner, VFP11_ERRATUM_VENEER_SECTION_NAME);
   4252 
   4253   sec_data = elf32_arm_section_data (s);
   4254 
   4255   BFD_ASSERT (s != NULL);
   4256 
   4257   tmp_name = bfd_malloc ((bfd_size_type) strlen
   4258 			 (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
   4259 
   4260   BFD_ASSERT (tmp_name);
   4261 
   4262   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
   4263 	   hash_table->num_vfp11_fixes);
   4264 
   4265   myh = elf_link_hash_lookup
   4266     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
   4267 
   4268   BFD_ASSERT (myh == NULL);
   4269 
   4270   bh = NULL;
   4271   val = hash_table->vfp11_erratum_glue_size;
   4272   _bfd_generic_link_add_one_symbol (link_info, hash_table->bfd_of_glue_owner,
   4273                                     tmp_name, BSF_FUNCTION | BSF_LOCAL, s, val,
   4274                                     NULL, TRUE, FALSE, &bh);
   4275 
   4276   myh = (struct elf_link_hash_entry *) bh;
   4277   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
   4278   myh->forced_local = 1;
   4279 
   4280   /* Link veneer back to calling location.  */
   4281   errcount = ++(sec_data->erratumcount);
   4282   newerr = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
   4283 
   4284   newerr->type = VFP11_ERRATUM_ARM_VENEER;
   4285   newerr->vma = -1;
   4286   newerr->u.v.branch = branch;
   4287   newerr->u.v.id = hash_table->num_vfp11_fixes;
   4288   branch->u.b.veneer = newerr;
   4289 
   4290   newerr->next = sec_data->erratumlist;
   4291   sec_data->erratumlist = newerr;
   4292 
   4293   /* A symbol for the return from the veneer.  */
   4294   sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
   4295 	   hash_table->num_vfp11_fixes);
   4296 
   4297   myh = elf_link_hash_lookup
   4298     (&(hash_table)->root, tmp_name, FALSE, FALSE, FALSE);
   4299 
   4300   if (myh != NULL)
   4301     abort ();
   4302 
   4303   bh = NULL;
   4304   val = offset + 4;
   4305   _bfd_generic_link_add_one_symbol (link_info, branch_bfd, tmp_name, BSF_LOCAL,
   4306 				    branch_sec, val, NULL, TRUE, FALSE, &bh);
   4307 
   4308   myh = (struct elf_link_hash_entry *) bh;
   4309   myh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
   4310   myh->forced_local = 1;
   4311 
   4312   free (tmp_name);
   4313 
   4314   /* Generate a mapping symbol for the veneer section, and explicitly add an
   4315      entry for that symbol to the code/data map for the section.  */
   4316   if (hash_table->vfp11_erratum_glue_size == 0)
   4317     {
   4318       bh = NULL;
   4319       /* FIXME: Creates an ARM symbol.  Thumb mode will need attention if it
   4320          ever requires this erratum fix.  */
   4321       _bfd_generic_link_add_one_symbol (link_info,
   4322 					hash_table->bfd_of_glue_owner, "$a",
   4323 					BSF_LOCAL, s, 0, NULL,
   4324                                         TRUE, FALSE, &bh);
   4325 
   4326       myh = (struct elf_link_hash_entry *) bh;
   4327       myh->type = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
   4328       myh->forced_local = 1;
   4329 
   4330       /* The elf32_arm_init_maps function only cares about symbols from input
   4331          BFDs.  We must make a note of this generated mapping symbol
   4332          ourselves so that code byteswapping works properly in
   4333          elf32_arm_write_section.  */
   4334       elf32_arm_section_map_add (s, 'a', 0);
   4335     }
   4336 
   4337   s->size += VFP11_ERRATUM_VENEER_SIZE;
   4338   hash_table->vfp11_erratum_glue_size += VFP11_ERRATUM_VENEER_SIZE;
   4339   hash_table->num_vfp11_fixes++;
   4340 
   4341   /* The offset of the veneer.  */
   4342   return val;
   4343 }
   4344 
   4345 /* Note: we do not include the flag SEC_LINKER_CREATED, as that
   4346    would prevent elf_link_input_bfd() from processing the contents
   4347    of the section.  */
   4348 #define ARM_GLUE_SECTION_FLAGS \
   4349   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_CODE | SEC_READONLY)
   4350 
   4351 /* Create a fake section for use by the ARM backend of the linker.  */
   4352 
   4353 static bfd_boolean
   4354 arm_make_glue_section (bfd * abfd, const char * name)
   4355 {
   4356   asection * sec;
   4357 
   4358   sec = bfd_get_section_by_name (abfd, name);
   4359   if (sec != NULL)
   4360     /* Already made.  */
   4361     return TRUE;
   4362 
   4363   sec = bfd_make_section_with_flags (abfd, name, ARM_GLUE_SECTION_FLAGS);
   4364 
   4365   if (sec == NULL
   4366       || !bfd_set_section_alignment (abfd, sec, 2))
   4367     return FALSE;
   4368 
   4369   /* Set the gc mark to prevent the section from being removed by garbage
   4370      collection, despite the fact that no relocs refer to this section.  */
   4371   sec->gc_mark = 1;
   4372 
   4373   return TRUE;
   4374 }
   4375 
   4376 /* Add the glue sections to ABFD.  This function is called from the
   4377    linker scripts in ld/emultempl/{armelf}.em.  */
   4378 
   4379 bfd_boolean
   4380 bfd_elf32_arm_add_glue_sections_to_bfd (bfd *abfd,
   4381 					struct bfd_link_info *info)
   4382 {
   4383   /* If we are only performing a partial
   4384      link do not bother adding the glue.  */
   4385   if (info->relocatable)
   4386     return TRUE;
   4387 
   4388   /* Linker stubs don't need glue.  */
   4389   if (!strcmp (abfd->filename, "linker stubs"))
   4390     return TRUE;
   4391 
   4392   return arm_make_glue_section (abfd, ARM2THUMB_GLUE_SECTION_NAME)
   4393     && arm_make_glue_section (abfd, THUMB2ARM_GLUE_SECTION_NAME)
   4394     && arm_make_glue_section (abfd, VFP11_ERRATUM_VENEER_SECTION_NAME)
   4395     && arm_make_glue_section (abfd, ARM_BX_GLUE_SECTION_NAME);
   4396 }
   4397 
   4398 /* Select a BFD to be used to hold the sections used by the glue code.
   4399    This function is called from the linker scripts in ld/emultempl/
   4400    {armelf/pe}.em.  */
   4401 
   4402 bfd_boolean
   4403 bfd_elf32_arm_get_bfd_for_interworking (bfd *abfd, struct bfd_link_info *info)
   4404 {
   4405   struct elf32_arm_link_hash_table *globals;
   4406 
   4407   /* If we are only performing a partial link
   4408      do not bother getting a bfd to hold the glue.  */
   4409   if (info->relocatable)
   4410     return TRUE;
   4411 
   4412   /* Make sure we don't attach the glue sections to a dynamic object.  */
   4413   BFD_ASSERT (!(abfd->flags & DYNAMIC));
   4414 
   4415   globals = elf32_arm_hash_table (info);
   4416 
   4417   BFD_ASSERT (globals != NULL);
   4418 
   4419   if (globals->bfd_of_glue_owner != NULL)
   4420     return TRUE;
   4421 
   4422   /* Save the bfd for later use.  */
   4423   globals->bfd_of_glue_owner = abfd;
   4424 
   4425   return TRUE;
   4426 }
   4427 
   4428 static void
   4429 check_use_blx (struct elf32_arm_link_hash_table *globals)
   4430 {
   4431   if (bfd_elf_get_obj_attr_int (globals->obfd, OBJ_ATTR_PROC,
   4432 				Tag_CPU_arch) > 2)
   4433     globals->use_blx = 1;
   4434 }
   4435 
   4436 bfd_boolean
   4437 bfd_elf32_arm_process_before_allocation (bfd *abfd,
   4438 					 struct bfd_link_info *link_info)
   4439 {
   4440   Elf_Internal_Shdr *symtab_hdr;
   4441   Elf_Internal_Rela *internal_relocs = NULL;
   4442   Elf_Internal_Rela *irel, *irelend;
   4443   bfd_byte *contents = NULL;
   4444 
   4445   asection *sec;
   4446   struct elf32_arm_link_hash_table *globals;
   4447 
   4448   /* If we are only performing a partial link do not bother
   4449      to construct any glue.  */
   4450   if (link_info->relocatable)
   4451     return TRUE;
   4452 
   4453   /* Here we have a bfd that is to be included on the link.  We have a
   4454      hook to do reloc rummaging, before section sizes are nailed down.  */
   4455   globals = elf32_arm_hash_table (link_info);
   4456 
   4457   BFD_ASSERT (globals != NULL);
   4458 
   4459   check_use_blx (globals);
   4460 
   4461   if (globals->byteswap_code && !bfd_big_endian (abfd))
   4462     {
   4463       _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."),
   4464 			  abfd);
   4465       return FALSE;
   4466     }
   4467 
   4468   /* PR 5398: If we have not decided to include any loadable sections in
   4469      the output then we will not have a glue owner bfd.  This is OK, it
   4470      just means that there is nothing else for us to do here.  */
   4471   if (globals->bfd_of_glue_owner == NULL)
   4472     return TRUE;
   4473 
   4474   /* Rummage around all the relocs and map the glue vectors.  */
   4475   sec = abfd->sections;
   4476 
   4477   if (sec == NULL)
   4478     return TRUE;
   4479 
   4480   for (; sec != NULL; sec = sec->next)
   4481     {
   4482       if (sec->reloc_count == 0)
   4483 	continue;
   4484 
   4485       if ((sec->flags & SEC_EXCLUDE) != 0)
   4486 	continue;
   4487 
   4488       symtab_hdr = & elf_symtab_hdr (abfd);
   4489 
   4490       /* Load the relocs.  */
   4491       internal_relocs
   4492 	= _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, FALSE);
   4493 
   4494       if (internal_relocs == NULL)
   4495 	goto error_return;
   4496 
   4497       irelend = internal_relocs + sec->reloc_count;
   4498       for (irel = internal_relocs; irel < irelend; irel++)
   4499 	{
   4500 	  long r_type;
   4501 	  unsigned long r_index;
   4502 
   4503 	  struct elf_link_hash_entry *h;
   4504 
   4505 	  r_type = ELF32_R_TYPE (irel->r_info);
   4506 	  r_index = ELF32_R_SYM (irel->r_info);
   4507 
   4508 	  /* These are the only relocation types we care about.  */
   4509 	  if (   r_type != R_ARM_PC24
   4510 	      && r_type != R_ARM_PLT32
   4511 	      && r_type != R_ARM_JUMP24
   4512 	      && r_type != R_ARM_THM_JUMP24
   4513 	      && (r_type != R_ARM_V4BX || globals->fix_v4bx < 2))
   4514 	    continue;
   4515 
   4516 	  /* Get the section contents if we haven't done so already.  */
   4517 	  if (contents == NULL)
   4518 	    {
   4519 	      /* Get cached copy if it exists.  */
   4520 	      if (elf_section_data (sec)->this_hdr.contents != NULL)
   4521 		contents = elf_section_data (sec)->this_hdr.contents;
   4522 	      else
   4523 		{
   4524 		  /* Go get them off disk.  */
   4525 		  if (! bfd_malloc_and_get_section (abfd, sec, &contents))
   4526 		    goto error_return;
   4527 		}
   4528 	    }
   4529 
   4530 	  if (r_type == R_ARM_V4BX)
   4531 	    {
   4532 	      int reg;
   4533 
   4534 	      reg = bfd_get_32 (abfd, contents + irel->r_offset) & 0xf;
   4535 	      record_arm_bx_glue (link_info, reg);
   4536 	      continue;
   4537 	    }
   4538 
   4539 	  /* If the relocation is not against a symbol it cannot concern us.  */
   4540 	  h = NULL;
   4541 
   4542 	  /* We don't care about local symbols.  */
   4543 	  if (r_index < symtab_hdr->sh_info)
   4544 	    continue;
   4545 
   4546 	  /* This is an external symbol.  */
   4547 	  r_index -= symtab_hdr->sh_info;
   4548 	  h = (struct elf_link_hash_entry *)
   4549 	    elf_sym_hashes (abfd)[r_index];
   4550 
   4551 	  /* If the relocation is against a static symbol it must be within
   4552 	     the current section and so cannot be a cross ARM/Thumb relocation.  */
   4553 	  if (h == NULL)
   4554 	    continue;
   4555 
   4556 	  /* If the call will go through a PLT entry then we do not need
   4557 	     glue.  */
   4558 	  if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1)
   4559 	    continue;
   4560 
   4561 	  switch (r_type)
   4562 	    {
   4563 	    case R_ARM_PC24:
   4564 	    case R_ARM_PLT32:
   4565 	    case R_ARM_JUMP24:
   4566 	      /* This one is a call from arm code.  We need to look up
   4567 	         the target of the call.  If it is a thumb target, we
   4568 	         insert glue.  */
   4569 	      if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
   4570 		  && !(r_type == R_ARM_CALL && globals->use_blx))
   4571 		record_arm_to_thumb_glue (link_info, h);
   4572 	      break;
   4573 
   4574 	    case R_ARM_THM_JUMP24:
   4575 	      /* This one is a call from thumb code.  We look
   4576 	         up the target of the call.  If it is not a thumb
   4577                  target, we insert glue.  */
   4578 	      if (ELF_ST_TYPE (h->type) != STT_ARM_TFUNC
   4579 		  && !(globals->use_blx && r_type == R_ARM_THM_CALL)
   4580 		  && h->root.type != bfd_link_hash_undefweak)
   4581 		record_thumb_to_arm_glue (link_info, h);
   4582 	      break;
   4583 
   4584 	    default:
   4585 	      abort ();
   4586 	    }
   4587 	}
   4588 
   4589       if (contents != NULL
   4590 	  && elf_section_data (sec)->this_hdr.contents != contents)
   4591 	free (contents);
   4592       contents = NULL;
   4593 
   4594       if (internal_relocs != NULL
   4595 	  && elf_section_data (sec)->relocs != internal_relocs)
   4596 	free (internal_relocs);
   4597       internal_relocs = NULL;
   4598     }
   4599 
   4600   return TRUE;
   4601 
   4602 error_return:
   4603   if (contents != NULL
   4604       && elf_section_data (sec)->this_hdr.contents != contents)
   4605     free (contents);
   4606   if (internal_relocs != NULL
   4607       && elf_section_data (sec)->relocs != internal_relocs)
   4608     free (internal_relocs);
   4609 
   4610   return FALSE;
   4611 }
   4612 #endif
   4613 
   4614 
   4615 /* Initialise maps of ARM/Thumb/data for input BFDs.  */
   4616 
   4617 void
   4618 bfd_elf32_arm_init_maps (bfd *abfd)
   4619 {
   4620   Elf_Internal_Sym *isymbuf;
   4621   Elf_Internal_Shdr *hdr;
   4622   unsigned int i, localsyms;
   4623 
   4624   if ((abfd->flags & DYNAMIC) != 0)
   4625     return;
   4626 
   4627   hdr = & elf_symtab_hdr (abfd);
   4628   localsyms = hdr->sh_info;
   4629 
   4630   /* Obtain a buffer full of symbols for this BFD. The hdr->sh_info field
   4631      should contain the number of local symbols, which should come before any
   4632      global symbols.  Mapping symbols are always local.  */
   4633   isymbuf = bfd_elf_get_elf_syms (abfd, hdr, localsyms, 0, NULL, NULL,
   4634 				  NULL);
   4635 
   4636   /* No internal symbols read?  Skip this BFD.  */
   4637   if (isymbuf == NULL)
   4638     return;
   4639 
   4640   for (i = 0; i < localsyms; i++)
   4641     {
   4642       Elf_Internal_Sym *isym = &isymbuf[i];
   4643       asection *sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   4644       const char *name;
   4645 
   4646       if (sec != NULL
   4647           && ELF_ST_BIND (isym->st_info) == STB_LOCAL)
   4648         {
   4649           name = bfd_elf_string_from_elf_section (abfd,
   4650             hdr->sh_link, isym->st_name);
   4651 
   4652           if (bfd_is_arm_special_symbol_name (name,
   4653 					      BFD_ARM_SPECIAL_SYM_TYPE_MAP))
   4654             elf32_arm_section_map_add (sec, name[1], isym->st_value);
   4655         }
   4656     }
   4657 }
   4658 
   4659 
   4660 void
   4661 bfd_elf32_arm_set_vfp11_fix (bfd *obfd, struct bfd_link_info *link_info)
   4662 {
   4663   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
   4664   obj_attribute *out_attr = elf_known_obj_attributes_proc (obfd);
   4665 
   4666   /* We assume that ARMv7+ does not need the VFP11 denorm erratum fix.  */
   4667   if (out_attr[Tag_CPU_arch].i >= TAG_CPU_ARCH_V7)
   4668     {
   4669       switch (globals->vfp11_fix)
   4670         {
   4671         case BFD_ARM_VFP11_FIX_DEFAULT:
   4672         case BFD_ARM_VFP11_FIX_NONE:
   4673           globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
   4674           break;
   4675 
   4676         default:
   4677           /* Give a warning, but do as the user requests anyway.  */
   4678           (*_bfd_error_handler) (_("%B: warning: selected VFP11 erratum "
   4679             "workaround is not necessary for target architecture"), obfd);
   4680         }
   4681     }
   4682   else if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_DEFAULT)
   4683     /* For earlier architectures, we might need the workaround, but do not
   4684        enable it by default.  If users is running with broken hardware, they
   4685        must enable the erratum fix explicitly.  */
   4686     globals->vfp11_fix = BFD_ARM_VFP11_FIX_NONE;
   4687 }
   4688 
   4689 
   4690 enum bfd_arm_vfp11_pipe
   4691 {
   4692   VFP11_FMAC,
   4693   VFP11_LS,
   4694   VFP11_DS,
   4695   VFP11_BAD
   4696 };
   4697 
   4698 /* Return a VFP register number.  This is encoded as RX:X for single-precision
   4699    registers, or X:RX for double-precision registers, where RX is the group of
   4700    four bits in the instruction encoding and X is the single extension bit.
   4701    RX and X fields are specified using their lowest (starting) bit.  The return
   4702    value is:
   4703 
   4704      0...31: single-precision registers s0...s31
   4705      32...63: double-precision registers d0...d31.
   4706 
   4707    Although X should be zero for VFP11 (encoding d0...d15 only), we might
   4708    encounter VFP3 instructions, so we allow the full range for DP registers.  */
   4709 
   4710 static unsigned int
   4711 bfd_arm_vfp11_regno (unsigned int insn, bfd_boolean is_double, unsigned int rx,
   4712                      unsigned int x)
   4713 {
   4714   if (is_double)
   4715     return (((insn >> rx) & 0xf) | (((insn >> x) & 1) << 4)) + 32;
   4716   else
   4717     return (((insn >> rx) & 0xf) << 1) | ((insn >> x) & 1);
   4718 }
   4719 
   4720 /* Set bits in *WMASK according to a register number REG as encoded by
   4721    bfd_arm_vfp11_regno().  Ignore d16-d31.  */
   4722 
   4723 static void
   4724 bfd_arm_vfp11_write_mask (unsigned int *wmask, unsigned int reg)
   4725 {
   4726   if (reg < 32)
   4727     *wmask |= 1 << reg;
   4728   else if (reg < 48)
   4729     *wmask |= 3 << ((reg - 32) * 2);
   4730 }
   4731 
   4732 /* Return TRUE if WMASK overwrites anything in REGS.  */
   4733 
   4734 static bfd_boolean
   4735 bfd_arm_vfp11_antidependency (unsigned int wmask, int *regs, int numregs)
   4736 {
   4737   int i;
   4738 
   4739   for (i = 0; i < numregs; i++)
   4740     {
   4741       unsigned int reg = regs[i];
   4742 
   4743       if (reg < 32 && (wmask & (1 << reg)) != 0)
   4744         return TRUE;
   4745 
   4746       reg -= 32;
   4747 
   4748       if (reg >= 16)
   4749         continue;
   4750 
   4751       if ((wmask & (3 << (reg * 2))) != 0)
   4752         return TRUE;
   4753     }
   4754 
   4755   return FALSE;
   4756 }
   4757 
   4758 /* In this function, we're interested in two things: finding input registers
   4759    for VFP data-processing instructions, and finding the set of registers which
   4760    arbitrary VFP instructions may write to.  We use a 32-bit unsigned int to
   4761    hold the written set, so FLDM etc. are easy to deal with (we're only
   4762    interested in 32 SP registers or 16 dp registers, due to the VFP version
   4763    implemented by the chip in question).  DP registers are marked by setting
   4764    both SP registers in the write mask).  */
   4765 
   4766 static enum bfd_arm_vfp11_pipe
   4767 bfd_arm_vfp11_insn_decode (unsigned int insn, unsigned int *destmask, int *regs,
   4768                            int *numregs)
   4769 {
   4770   enum bfd_arm_vfp11_pipe pipe = VFP11_BAD;
   4771   bfd_boolean is_double = ((insn & 0xf00) == 0xb00) ? 1 : 0;
   4772 
   4773   if ((insn & 0x0f000e10) == 0x0e000a00)  /* A data-processing insn.  */
   4774     {
   4775       unsigned int pqrs;
   4776       unsigned int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
   4777       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
   4778 
   4779       pqrs = ((insn & 0x00800000) >> 20)
   4780            | ((insn & 0x00300000) >> 19)
   4781            | ((insn & 0x00000040) >> 6);
   4782 
   4783       switch (pqrs)
   4784         {
   4785         case 0: /* fmac[sd].  */
   4786         case 1: /* fnmac[sd].  */
   4787         case 2: /* fmsc[sd].  */
   4788         case 3: /* fnmsc[sd].  */
   4789           pipe = VFP11_FMAC;
   4790           bfd_arm_vfp11_write_mask (destmask, fd);
   4791           regs[0] = fd;
   4792           regs[1] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);  /* Fn.  */
   4793           regs[2] = fm;
   4794           *numregs = 3;
   4795           break;
   4796 
   4797         case 4: /* fmul[sd].  */
   4798         case 5: /* fnmul[sd].  */
   4799         case 6: /* fadd[sd].  */
   4800         case 7: /* fsub[sd].  */
   4801           pipe = VFP11_FMAC;
   4802           goto vfp_binop;
   4803 
   4804         case 8: /* fdiv[sd].  */
   4805           pipe = VFP11_DS;
   4806           vfp_binop:
   4807           bfd_arm_vfp11_write_mask (destmask, fd);
   4808           regs[0] = bfd_arm_vfp11_regno (insn, is_double, 16, 7);   /* Fn.  */
   4809           regs[1] = fm;
   4810           *numregs = 2;
   4811           break;
   4812 
   4813         case 15: /* extended opcode.  */
   4814           {
   4815             unsigned int extn = ((insn >> 15) & 0x1e)
   4816                               | ((insn >> 7) & 1);
   4817 
   4818             switch (extn)
   4819               {
   4820               case 0: /* fcpy[sd].  */
   4821               case 1: /* fabs[sd].  */
   4822               case 2: /* fneg[sd].  */
   4823               case 8: /* fcmp[sd].  */
   4824               case 9: /* fcmpe[sd].  */
   4825               case 10: /* fcmpz[sd].  */
   4826               case 11: /* fcmpez[sd].  */
   4827               case 16: /* fuito[sd].  */
   4828               case 17: /* fsito[sd].  */
   4829               case 24: /* ftoui[sd].  */
   4830               case 25: /* ftouiz[sd].  */
   4831               case 26: /* ftosi[sd].  */
   4832               case 27: /* ftosiz[sd].  */
   4833                 /* These instructions will not bounce due to underflow.  */
   4834                 *numregs = 0;
   4835                 pipe = VFP11_FMAC;
   4836                 break;
   4837 
   4838               case 3: /* fsqrt[sd].  */
   4839                 /* fsqrt cannot underflow, but it can (perhaps) overwrite
   4840                    registers to cause the erratum in previous instructions.  */
   4841                 bfd_arm_vfp11_write_mask (destmask, fd);
   4842                 pipe = VFP11_DS;
   4843                 break;
   4844 
   4845               case 15: /* fcvt{ds,sd}.  */
   4846                 {
   4847                   int rnum = 0;
   4848 
   4849                   bfd_arm_vfp11_write_mask (destmask, fd);
   4850 
   4851 		  /* Only FCVTSD can underflow.  */
   4852                   if ((insn & 0x100) != 0)
   4853                     regs[rnum++] = fm;
   4854 
   4855                   *numregs = rnum;
   4856 
   4857                   pipe = VFP11_FMAC;
   4858                 }
   4859                 break;
   4860 
   4861               default:
   4862                 return VFP11_BAD;
   4863               }
   4864           }
   4865           break;
   4866 
   4867         default:
   4868           return VFP11_BAD;
   4869         }
   4870     }
   4871   /* Two-register transfer.  */
   4872   else if ((insn & 0x0fe00ed0) == 0x0c400a10)
   4873     {
   4874       unsigned int fm = bfd_arm_vfp11_regno (insn, is_double, 0, 5);
   4875 
   4876       if ((insn & 0x100000) == 0)
   4877 	{
   4878           if (is_double)
   4879             bfd_arm_vfp11_write_mask (destmask, fm);
   4880           else
   4881             {
   4882               bfd_arm_vfp11_write_mask (destmask, fm);
   4883               bfd_arm_vfp11_write_mask (destmask, fm + 1);
   4884             }
   4885 	}
   4886 
   4887       pipe = VFP11_LS;
   4888     }
   4889   else if ((insn & 0x0e100e00) == 0x0c100a00)  /* A load insn.  */
   4890     {
   4891       int fd = bfd_arm_vfp11_regno (insn, is_double, 12, 22);
   4892       unsigned int puw = ((insn >> 21) & 0x1) | (((insn >> 23) & 3) << 1);
   4893 
   4894       switch (puw)
   4895         {
   4896         case 0: /* Two-reg transfer.  We should catch these above.  */
   4897           abort ();
   4898 
   4899         case 2: /* fldm[sdx].  */
   4900         case 3:
   4901         case 5:
   4902           {
   4903             unsigned int i, offset = insn & 0xff;
   4904 
   4905             if (is_double)
   4906               offset >>= 1;
   4907 
   4908             for (i = fd; i < fd + offset; i++)
   4909               bfd_arm_vfp11_write_mask (destmask, i);
   4910           }
   4911           break;
   4912 
   4913         case 4: /* fld[sd].  */
   4914         case 6:
   4915           bfd_arm_vfp11_write_mask (destmask, fd);
   4916           break;
   4917 
   4918         default:
   4919           return VFP11_BAD;
   4920         }
   4921 
   4922       pipe = VFP11_LS;
   4923     }
   4924   /* Single-register transfer. Note L==0.  */
   4925   else if ((insn & 0x0f100e10) == 0x0e000a10)
   4926     {
   4927       unsigned int opcode = (insn >> 21) & 7;
   4928       unsigned int fn = bfd_arm_vfp11_regno (insn, is_double, 16, 7);
   4929 
   4930       switch (opcode)
   4931         {
   4932         case 0: /* fmsr/fmdlr.  */
   4933         case 1: /* fmdhr.  */
   4934           /* Mark fmdhr and fmdlr as writing to the whole of the DP
   4935              destination register.  I don't know if this is exactly right,
   4936              but it is the conservative choice.  */
   4937           bfd_arm_vfp11_write_mask (destmask, fn);
   4938           break;
   4939 
   4940         case 7: /* fmxr.  */
   4941           break;
   4942         }
   4943 
   4944       pipe = VFP11_LS;
   4945     }
   4946 
   4947   return pipe;
   4948 }
   4949 
   4950 
   4951 static int elf32_arm_compare_mapping (const void * a, const void * b);
   4952 
   4953 
   4954 /* Look for potentially-troublesome code sequences which might trigger the
   4955    VFP11 denormal/antidependency erratum.  See, e.g., the ARM1136 errata sheet
   4956    (available from ARM) for details of the erratum.  A short version is
   4957    described in ld.texinfo.  */
   4958 
   4959 bfd_boolean
   4960 bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
   4961 {
   4962   asection *sec;
   4963   bfd_byte *contents = NULL;
   4964   int state = 0;
   4965   int regs[3], numregs = 0;
   4966   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
   4967   int use_vector = (globals->vfp11_fix == BFD_ARM_VFP11_FIX_VECTOR);
   4968 
   4969   /* We use a simple FSM to match troublesome VFP11 instruction sequences.
   4970      The states transition as follows:
   4971 
   4972        0 -> 1 (vector) or 0 -> 2 (scalar)
   4973            A VFP FMAC-pipeline instruction has been seen. Fill
   4974            regs[0]..regs[numregs-1] with its input operands. Remember this
   4975            instruction in 'first_fmac'.
   4976 
   4977        1 -> 2
   4978            Any instruction, except for a VFP instruction which overwrites
   4979            regs[*].
   4980 
   4981        1 -> 3 [ -> 0 ]  or
   4982        2 -> 3 [ -> 0 ]
   4983            A VFP instruction has been seen which overwrites any of regs[*].
   4984            We must make a veneer!  Reset state to 0 before examining next
   4985            instruction.
   4986 
   4987        2 -> 0
   4988            If we fail to match anything in state 2, reset to state 0 and reset
   4989            the instruction pointer to the instruction after 'first_fmac'.
   4990 
   4991      If the VFP11 vector mode is in use, there must be at least two unrelated
   4992      instructions between anti-dependent VFP11 instructions to properly avoid
   4993      triggering the erratum, hence the use of the extra state 1.  */
   4994 
   4995   /* If we are only performing a partial link do not bother
   4996      to construct any glue.  */
   4997   if (link_info->relocatable)
   4998     return TRUE;
   4999 
   5000   /* Skip if this bfd does not correspond to an ELF image.  */
   5001   if (! is_arm_elf (abfd))
   5002     return TRUE;
   5003 
   5004   /* We should have chosen a fix type by the time we get here.  */
   5005   BFD_ASSERT (globals->vfp11_fix != BFD_ARM_VFP11_FIX_DEFAULT);
   5006 
   5007   if (globals->vfp11_fix == BFD_ARM_VFP11_FIX_NONE)
   5008     return TRUE;
   5009 
   5010   for (sec = abfd->sections; sec != NULL; sec = sec->next)
   5011     {
   5012       unsigned int i, span, first_fmac = 0, veneer_of_insn = 0;
   5013       struct _arm_elf_section_data *sec_data;
   5014 
   5015       /* If we don't have executable progbits, we're not interested in this
   5016          section.  Also skip if section is to be excluded.  */
   5017       if (elf_section_type (sec) != SHT_PROGBITS
   5018           || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
   5019           || (sec->flags & SEC_EXCLUDE) != 0
   5020           || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
   5021         continue;
   5022 
   5023       sec_data = elf32_arm_section_data (sec);
   5024 
   5025       if (sec_data->mapcount == 0)
   5026         continue;
   5027 
   5028       if (elf_section_data (sec)->this_hdr.contents != NULL)
   5029 	contents = elf_section_data (sec)->this_hdr.contents;
   5030       else if (! bfd_malloc_and_get_section (abfd, sec, &contents))
   5031 	goto error_return;
   5032 
   5033       qsort (sec_data->map, sec_data->mapcount, sizeof (elf32_arm_section_map),
   5034 	     elf32_arm_compare_mapping);
   5035 
   5036       for (span = 0; span < sec_data->mapcount; span++)
   5037         {
   5038           unsigned int span_start = sec_data->map[span].vma;
   5039           unsigned int span_end = (span == sec_data->mapcount - 1)
   5040 				  ? sec->size : sec_data->map[span + 1].vma;
   5041           char span_type = sec_data->map[span].type;
   5042 
   5043           /* FIXME: Only ARM mode is supported at present.  We may need to
   5044              support Thumb-2 mode also at some point.  */
   5045           if (span_type != 'a')
   5046             continue;
   5047 
   5048           for (i = span_start; i < span_end;)
   5049             {
   5050               unsigned int next_i = i + 4;
   5051               unsigned int insn = bfd_big_endian (abfd)
   5052                 ? (contents[i] << 24)
   5053                   | (contents[i + 1] << 16)
   5054                   | (contents[i + 2] << 8)
   5055                   | contents[i + 3]
   5056                 : (contents[i + 3] << 24)
   5057                   | (contents[i + 2] << 16)
   5058                   | (contents[i + 1] << 8)
   5059                   | contents[i];
   5060               unsigned int writemask = 0;
   5061               enum bfd_arm_vfp11_pipe pipe;
   5062 
   5063               switch (state)
   5064                 {
   5065                 case 0:
   5066                   pipe = bfd_arm_vfp11_insn_decode (insn, &writemask, regs,
   5067                                                     &numregs);
   5068                   /* I'm assuming the VFP11 erratum can trigger with denorm
   5069                      operands on either the FMAC or the DS pipeline. This might
   5070                      lead to slightly overenthusiastic veneer insertion.  */
   5071                   if (pipe == VFP11_FMAC || pipe == VFP11_DS)
   5072                     {
   5073                       state = use_vector ? 1 : 2;
   5074                       first_fmac = i;
   5075                       veneer_of_insn = insn;
   5076                     }
   5077                   break;
   5078 
   5079                 case 1:
   5080                   {
   5081                     int other_regs[3], other_numregs;
   5082                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
   5083 						      other_regs,
   5084                                                       &other_numregs);
   5085                     if (pipe != VFP11_BAD
   5086                         && bfd_arm_vfp11_antidependency (writemask, regs,
   5087 							 numregs))
   5088                       state = 3;
   5089                     else
   5090                       state = 2;
   5091                   }
   5092                   break;
   5093 
   5094                 case 2:
   5095                   {
   5096                     int other_regs[3], other_numregs;
   5097                     pipe = bfd_arm_vfp11_insn_decode (insn, &writemask,
   5098 						      other_regs,
   5099                                                       &other_numregs);
   5100                     if (pipe != VFP11_BAD
   5101                         && bfd_arm_vfp11_antidependency (writemask, regs,
   5102 							 numregs))
   5103                       state = 3;
   5104                     else
   5105                       {
   5106                         state = 0;
   5107                         next_i = first_fmac + 4;
   5108                       }
   5109                   }
   5110                   break;
   5111 
   5112                 case 3:
   5113                   abort ();  /* Should be unreachable.  */
   5114                 }
   5115 
   5116               if (state == 3)
   5117                 {
   5118                   elf32_vfp11_erratum_list *newerr
   5119                     = bfd_zmalloc (sizeof (elf32_vfp11_erratum_list));
   5120                   int errcount;
   5121 
   5122                   errcount = ++(elf32_arm_section_data (sec)->erratumcount);
   5123 
   5124                   newerr->u.b.vfp_insn = veneer_of_insn;
   5125 
   5126                   switch (span_type)
   5127                     {
   5128                     case 'a':
   5129                       newerr->type = VFP11_ERRATUM_BRANCH_TO_ARM_VENEER;
   5130                       break;
   5131 
   5132                     default:
   5133                       abort ();
   5134                     }
   5135 
   5136                   record_vfp11_erratum_veneer (link_info, newerr, abfd, sec,
   5137 					       first_fmac);
   5138 
   5139                   newerr->vma = -1;
   5140 
   5141                   newerr->next = sec_data->erratumlist;
   5142                   sec_data->erratumlist = newerr;
   5143 
   5144                   state = 0;
   5145                 }
   5146 
   5147               i = next_i;
   5148             }
   5149         }
   5150 
   5151       if (contents != NULL
   5152           && elf_section_data (sec)->this_hdr.contents != contents)
   5153         free (contents);
   5154       contents = NULL;
   5155     }
   5156 
   5157   return TRUE;
   5158 
   5159 error_return:
   5160   if (contents != NULL
   5161       && elf_section_data (sec)->this_hdr.contents != contents)
   5162     free (contents);
   5163 
   5164   return FALSE;
   5165 }
   5166 
   5167 /* Find virtual-memory addresses for VFP11 erratum veneers and return locations
   5168    after sections have been laid out, using specially-named symbols.  */
   5169 
   5170 void
   5171 bfd_elf32_arm_vfp11_fix_veneer_locations (bfd *abfd,
   5172 					  struct bfd_link_info *link_info)
   5173 {
   5174   asection *sec;
   5175   struct elf32_arm_link_hash_table *globals;
   5176   char *tmp_name;
   5177 
   5178   if (link_info->relocatable)
   5179     return;
   5180 
   5181   /* Skip if this bfd does not correspond to an ELF image.  */
   5182   if (! is_arm_elf (abfd))
   5183     return;
   5184 
   5185   globals = elf32_arm_hash_table (link_info);
   5186 
   5187   tmp_name = bfd_malloc ((bfd_size_type) strlen
   5188 			   (VFP11_ERRATUM_VENEER_ENTRY_NAME) + 10);
   5189 
   5190   for (sec = abfd->sections; sec != NULL; sec = sec->next)
   5191     {
   5192       struct _arm_elf_section_data *sec_data = elf32_arm_section_data (sec);
   5193       elf32_vfp11_erratum_list *errnode = sec_data->erratumlist;
   5194 
   5195       for (; errnode != NULL; errnode = errnode->next)
   5196         {
   5197           struct elf_link_hash_entry *myh;
   5198           bfd_vma vma;
   5199 
   5200           switch (errnode->type)
   5201             {
   5202             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
   5203             case VFP11_ERRATUM_BRANCH_TO_THUMB_VENEER:
   5204               /* Find veneer symbol.  */
   5205               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME,
   5206 		       errnode->u.b.veneer->u.v.id);
   5207 
   5208               myh = elf_link_hash_lookup
   5209                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
   5210 
   5211               if (myh == NULL)
   5212                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
   5213                 			 "`%s'"), abfd, tmp_name);
   5214 
   5215               vma = myh->root.u.def.section->output_section->vma
   5216                     + myh->root.u.def.section->output_offset
   5217                     + myh->root.u.def.value;
   5218 
   5219               errnode->u.b.veneer->vma = vma;
   5220               break;
   5221 
   5222 	    case VFP11_ERRATUM_ARM_VENEER:
   5223             case VFP11_ERRATUM_THUMB_VENEER:
   5224               /* Find return location.  */
   5225               sprintf (tmp_name, VFP11_ERRATUM_VENEER_ENTRY_NAME "_r",
   5226                        errnode->u.v.id);
   5227 
   5228               myh = elf_link_hash_lookup
   5229                 (&(globals)->root, tmp_name, FALSE, FALSE, TRUE);
   5230 
   5231               if (myh == NULL)
   5232                 (*_bfd_error_handler) (_("%B: unable to find VFP11 veneer "
   5233 					 "`%s'"), abfd, tmp_name);
   5234 
   5235               vma = myh->root.u.def.section->output_section->vma
   5236                     + myh->root.u.def.section->output_offset
   5237                     + myh->root.u.def.value;
   5238 
   5239               errnode->u.v.branch->vma = vma;
   5240               break;
   5241 
   5242             default:
   5243               abort ();
   5244             }
   5245         }
   5246     }
   5247 
   5248   free (tmp_name);
   5249 }
   5250 
   5251 
   5252 /* Set target relocation values needed during linking.  */
   5253 
   5254 void
   5255 bfd_elf32_arm_set_target_relocs (struct bfd *output_bfd,
   5256 				 struct bfd_link_info *link_info,
   5257 				 int target1_is_rel,
   5258 				 char * target2_type,
   5259                                  int fix_v4bx,
   5260 				 int use_blx,
   5261                                  bfd_arm_vfp11_fix vfp11_fix,
   5262 				 int no_enum_warn, int no_wchar_warn,
   5263 				 int pic_veneer)
   5264 {
   5265   struct elf32_arm_link_hash_table *globals;
   5266 
   5267   globals = elf32_arm_hash_table (link_info);
   5268 
   5269   globals->target1_is_rel = target1_is_rel;
   5270   if (strcmp (target2_type, "rel") == 0)
   5271     globals->target2_reloc = R_ARM_REL32;
   5272   else if (strcmp (target2_type, "abs") == 0)
   5273     globals->target2_reloc = R_ARM_ABS32;
   5274   else if (strcmp (target2_type, "got-rel") == 0)
   5275     globals->target2_reloc = R_ARM_GOT_PREL;
   5276   else
   5277     {
   5278       _bfd_error_handler (_("Invalid TARGET2 relocation type '%s'."),
   5279 			  target2_type);
   5280     }
   5281   globals->fix_v4bx = fix_v4bx;
   5282   globals->use_blx |= use_blx;
   5283   globals->vfp11_fix = vfp11_fix;
   5284   globals->pic_veneer = pic_veneer;
   5285 
   5286   BFD_ASSERT (is_arm_elf (output_bfd));
   5287   elf_arm_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
   5288   elf_arm_tdata (output_bfd)->no_wchar_size_warning = no_wchar_warn;
   5289 }
   5290 
   5291 /* Replace the target offset of a Thumb bl or b.w instruction.  */
   5292 
   5293 static void
   5294 insert_thumb_branch (bfd *abfd, long int offset, bfd_byte *insn)
   5295 {
   5296   bfd_vma upper;
   5297   bfd_vma lower;
   5298   int reloc_sign;
   5299 
   5300   BFD_ASSERT ((offset & 1) == 0);
   5301 
   5302   upper = bfd_get_16 (abfd, insn);
   5303   lower = bfd_get_16 (abfd, insn + 2);
   5304   reloc_sign = (offset < 0) ? 1 : 0;
   5305   upper = (upper & ~(bfd_vma) 0x7ff)
   5306 	  | ((offset >> 12) & 0x3ff)
   5307 	  | (reloc_sign << 10);
   5308   lower = (lower & ~(bfd_vma) 0x2fff)
   5309 	  | (((!((offset >> 23) & 1)) ^ reloc_sign) << 13)
   5310 	  | (((!((offset >> 22) & 1)) ^ reloc_sign) << 11)
   5311 	  | ((offset >> 1) & 0x7ff);
   5312   bfd_put_16 (abfd, upper, insn);
   5313   bfd_put_16 (abfd, lower, insn + 2);
   5314 }
   5315 
   5316 /* Thumb code calling an ARM function.  */
   5317 
   5318 static int
   5319 elf32_thumb_to_arm_stub (struct bfd_link_info * info,
   5320 			 const char *           name,
   5321 			 bfd *                  input_bfd,
   5322 			 bfd *                  output_bfd,
   5323 			 asection *             input_section,
   5324 			 bfd_byte *             hit_data,
   5325 			 asection *             sym_sec,
   5326 			 bfd_vma                offset,
   5327 			 bfd_signed_vma         addend,
   5328 			 bfd_vma                val,
   5329 			 char **error_message)
   5330 {
   5331   asection * s = 0;
   5332   bfd_vma my_offset;
   5333   long int ret_offset;
   5334   struct elf_link_hash_entry * myh;
   5335   struct elf32_arm_link_hash_table * globals;
   5336 
   5337   myh = find_thumb_glue (info, name, error_message);
   5338   if (myh == NULL)
   5339     return FALSE;
   5340 
   5341   globals = elf32_arm_hash_table (info);
   5342 
   5343   BFD_ASSERT (globals != NULL);
   5344   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   5345 
   5346   my_offset = myh->root.u.def.value;
   5347 
   5348   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
   5349 			       THUMB2ARM_GLUE_SECTION_NAME);
   5350 
   5351   BFD_ASSERT (s != NULL);
   5352   BFD_ASSERT (s->contents != NULL);
   5353   BFD_ASSERT (s->output_section != NULL);
   5354 
   5355   if ((my_offset & 0x01) == 0x01)
   5356     {
   5357       if (sym_sec != NULL
   5358 	  && sym_sec->owner != NULL
   5359 	  && !INTERWORK_FLAG (sym_sec->owner))
   5360 	{
   5361 	  (*_bfd_error_handler)
   5362 	    (_("%B(%s): warning: interworking not enabled.\n"
   5363 	       "  first occurrence: %B: thumb call to arm"),
   5364 	     sym_sec->owner, input_bfd, name);
   5365 
   5366 	  return FALSE;
   5367 	}
   5368 
   5369       --my_offset;
   5370       myh->root.u.def.value = my_offset;
   5371 
   5372       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a1_bx_pc_insn,
   5373 		      s->contents + my_offset);
   5374 
   5375       put_thumb_insn (globals, output_bfd, (bfd_vma) t2a2_noop_insn,
   5376 		      s->contents + my_offset + 2);
   5377 
   5378       ret_offset =
   5379 	/* Address of destination of the stub.  */
   5380 	((bfd_signed_vma) val)
   5381 	- ((bfd_signed_vma)
   5382 	   /* Offset from the start of the current section
   5383 	      to the start of the stubs.  */
   5384 	   (s->output_offset
   5385 	    /* Offset of the start of this stub from the start of the stubs.  */
   5386 	    + my_offset
   5387 	    /* Address of the start of the current section.  */
   5388 	    + s->output_section->vma)
   5389 	   /* The branch instruction is 4 bytes into the stub.  */
   5390 	   + 4
   5391 	   /* ARM branches work from the pc of the instruction + 8.  */
   5392 	   + 8);
   5393 
   5394       put_arm_insn (globals, output_bfd,
   5395 		    (bfd_vma) t2a3_b_insn | ((ret_offset >> 2) & 0x00FFFFFF),
   5396 		    s->contents + my_offset + 4);
   5397     }
   5398 
   5399   BFD_ASSERT (my_offset <= globals->thumb_glue_size);
   5400 
   5401   /* Now go back and fix up the original BL insn to point to here.  */
   5402   ret_offset =
   5403     /* Address of where the stub is located.  */
   5404     (s->output_section->vma + s->output_offset + my_offset)
   5405      /* Address of where the BL is located.  */
   5406     - (input_section->output_section->vma + input_section->output_offset
   5407        + offset)
   5408     /* Addend in the relocation.  */
   5409     - addend
   5410     /* Biassing for PC-relative addressing.  */
   5411     - 8;
   5412 
   5413   insert_thumb_branch (input_bfd, ret_offset, hit_data - input_section->vma);
   5414 
   5415   return TRUE;
   5416 }
   5417 
   5418 /* Populate an Arm to Thumb stub.  Returns the stub symbol.  */
   5419 
   5420 static struct elf_link_hash_entry *
   5421 elf32_arm_create_thumb_stub (struct bfd_link_info * info,
   5422 			     const char *           name,
   5423 			     bfd *                  input_bfd,
   5424 			     bfd *                  output_bfd,
   5425 			     asection *             sym_sec,
   5426 			     bfd_vma                val,
   5427 			     asection *             s,
   5428 			     char **                error_message)
   5429 {
   5430   bfd_vma my_offset;
   5431   long int ret_offset;
   5432   struct elf_link_hash_entry * myh;
   5433   struct elf32_arm_link_hash_table * globals;
   5434 
   5435   myh = find_arm_glue (info, name, error_message);
   5436   if (myh == NULL)
   5437     return NULL;
   5438 
   5439   globals = elf32_arm_hash_table (info);
   5440 
   5441   BFD_ASSERT (globals != NULL);
   5442   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   5443 
   5444   my_offset = myh->root.u.def.value;
   5445 
   5446   if ((my_offset & 0x01) == 0x01)
   5447     {
   5448       if (sym_sec != NULL
   5449 	  && sym_sec->owner != NULL
   5450 	  && !INTERWORK_FLAG (sym_sec->owner))
   5451 	{
   5452 	  (*_bfd_error_handler)
   5453 	    (_("%B(%s): warning: interworking not enabled.\n"
   5454 	       "  first occurrence: %B: arm call to thumb"),
   5455 	     sym_sec->owner, input_bfd, name);
   5456 	}
   5457 
   5458       --my_offset;
   5459       myh->root.u.def.value = my_offset;
   5460 
   5461       if (info->shared || globals->root.is_relocatable_executable
   5462 	  || globals->pic_veneer)
   5463 	{
   5464 	  /* For relocatable objects we can't use absolute addresses,
   5465 	     so construct the address from a relative offset.  */
   5466 	  /* TODO: If the offset is small it's probably worth
   5467 	     constructing the address with adds.  */
   5468 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t1p_ldr_insn,
   5469 			s->contents + my_offset);
   5470 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t2p_add_pc_insn,
   5471 			s->contents + my_offset + 4);
   5472 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t3p_bx_r12_insn,
   5473 			s->contents + my_offset + 8);
   5474 	  /* Adjust the offset by 4 for the position of the add,
   5475 	     and 8 for the pipeline offset.  */
   5476 	  ret_offset = (val - (s->output_offset
   5477 			       + s->output_section->vma
   5478 			       + my_offset + 12))
   5479 		       | 1;
   5480 	  bfd_put_32 (output_bfd, ret_offset,
   5481 		      s->contents + my_offset + 12);
   5482 	}
   5483       else if (globals->use_blx)
   5484 	{
   5485 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t1v5_ldr_insn,
   5486 			s->contents + my_offset);
   5487 
   5488 	  /* It's a thumb address.  Add the low order bit.  */
   5489 	  bfd_put_32 (output_bfd, val | a2t2v5_func_addr_insn,
   5490 		      s->contents + my_offset + 4);
   5491 	}
   5492       else
   5493 	{
   5494 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t1_ldr_insn,
   5495 			s->contents + my_offset);
   5496 
   5497 	  put_arm_insn (globals, output_bfd, (bfd_vma) a2t2_bx_r12_insn,
   5498 			s->contents + my_offset + 4);
   5499 
   5500 	  /* It's a thumb address.  Add the low order bit.  */
   5501 	  bfd_put_32 (output_bfd, val | a2t3_func_addr_insn,
   5502 		      s->contents + my_offset + 8);
   5503 
   5504 	  my_offset += 12;
   5505 	}
   5506     }
   5507 
   5508   BFD_ASSERT (my_offset <= globals->arm_glue_size);
   5509 
   5510   return myh;
   5511 }
   5512 
   5513 /* Arm code calling a Thumb function.  */
   5514 
   5515 static int
   5516 elf32_arm_to_thumb_stub (struct bfd_link_info * info,
   5517 			 const char *           name,
   5518 			 bfd *                  input_bfd,
   5519 			 bfd *                  output_bfd,
   5520 			 asection *             input_section,
   5521 			 bfd_byte *             hit_data,
   5522 			 asection *             sym_sec,
   5523 			 bfd_vma                offset,
   5524 			 bfd_signed_vma         addend,
   5525 			 bfd_vma                val,
   5526 			 char **error_message)
   5527 {
   5528   unsigned long int tmp;
   5529   bfd_vma my_offset;
   5530   asection * s;
   5531   long int ret_offset;
   5532   struct elf_link_hash_entry * myh;
   5533   struct elf32_arm_link_hash_table * globals;
   5534 
   5535   globals = elf32_arm_hash_table (info);
   5536 
   5537   BFD_ASSERT (globals != NULL);
   5538   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   5539 
   5540   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
   5541 			       ARM2THUMB_GLUE_SECTION_NAME);
   5542   BFD_ASSERT (s != NULL);
   5543   BFD_ASSERT (s->contents != NULL);
   5544   BFD_ASSERT (s->output_section != NULL);
   5545 
   5546   myh = elf32_arm_create_thumb_stub (info, name, input_bfd, output_bfd,
   5547 				     sym_sec, val, s, error_message);
   5548   if (!myh)
   5549     return FALSE;
   5550 
   5551   my_offset = myh->root.u.def.value;
   5552   tmp = bfd_get_32 (input_bfd, hit_data);
   5553   tmp = tmp & 0xFF000000;
   5554 
   5555   /* Somehow these are both 4 too far, so subtract 8.  */
   5556   ret_offset = (s->output_offset
   5557 		+ my_offset
   5558 		+ s->output_section->vma
   5559 		- (input_section->output_offset
   5560 		   + input_section->output_section->vma
   5561 		   + offset + addend)
   5562 		- 8);
   5563 
   5564   tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
   5565 
   5566   bfd_put_32 (output_bfd, (bfd_vma) tmp, hit_data - input_section->vma);
   5567 
   5568   return TRUE;
   5569 }
   5570 
   5571 /* Populate Arm stub for an exported Thumb function.  */
   5572 
   5573 static bfd_boolean
   5574 elf32_arm_to_thumb_export_stub (struct elf_link_hash_entry *h, void * inf)
   5575 {
   5576   struct bfd_link_info * info = (struct bfd_link_info *) inf;
   5577   asection * s;
   5578   struct elf_link_hash_entry * myh;
   5579   struct elf32_arm_link_hash_entry *eh;
   5580   struct elf32_arm_link_hash_table * globals;
   5581   asection *sec;
   5582   bfd_vma val;
   5583   char *error_message;
   5584 
   5585   eh = elf32_arm_hash_entry (h);
   5586   /* Allocate stubs for exported Thumb functions on v4t.  */
   5587   if (eh->export_glue == NULL)
   5588     return TRUE;
   5589 
   5590   globals = elf32_arm_hash_table (info);
   5591 
   5592   BFD_ASSERT (globals != NULL);
   5593   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   5594 
   5595   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
   5596 			       ARM2THUMB_GLUE_SECTION_NAME);
   5597   BFD_ASSERT (s != NULL);
   5598   BFD_ASSERT (s->contents != NULL);
   5599   BFD_ASSERT (s->output_section != NULL);
   5600 
   5601   sec = eh->export_glue->root.u.def.section;
   5602 
   5603   BFD_ASSERT (sec->output_section != NULL);
   5604 
   5605   val = eh->export_glue->root.u.def.value + sec->output_offset
   5606 	+ sec->output_section->vma;
   5607 
   5608   myh = elf32_arm_create_thumb_stub (info, h->root.root.string,
   5609 				     h->root.u.def.section->owner,
   5610 				     globals->obfd, sec, val, s,
   5611 				     &error_message);
   5612   BFD_ASSERT (myh);
   5613   return TRUE;
   5614 }
   5615 
   5616 /* Populate ARMv4 BX veneers.  Returns the absolute adress of the veneer.  */
   5617 
   5618 static bfd_vma
   5619 elf32_arm_bx_glue (struct bfd_link_info * info, int reg)
   5620 {
   5621   bfd_byte *p;
   5622   bfd_vma glue_addr;
   5623   asection *s;
   5624   struct elf32_arm_link_hash_table *globals;
   5625 
   5626   globals = elf32_arm_hash_table (info);
   5627 
   5628   BFD_ASSERT (globals != NULL);
   5629   BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
   5630 
   5631   s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
   5632 			       ARM_BX_GLUE_SECTION_NAME);
   5633   BFD_ASSERT (s != NULL);
   5634   BFD_ASSERT (s->contents != NULL);
   5635   BFD_ASSERT (s->output_section != NULL);
   5636 
   5637   BFD_ASSERT (globals->bx_glue_offset[reg] & 2);
   5638 
   5639   glue_addr = globals->bx_glue_offset[reg] & ~(bfd_vma)3;
   5640 
   5641   if ((globals->bx_glue_offset[reg] & 1) == 0)
   5642     {
   5643       p = s->contents + glue_addr;
   5644       bfd_put_32 (globals->obfd, armbx1_tst_insn + (reg << 16), p);
   5645       bfd_put_32 (globals->obfd, armbx2_moveq_insn + reg, p + 4);
   5646       bfd_put_32 (globals->obfd, armbx3_bx_insn + reg, p + 8);
   5647       globals->bx_glue_offset[reg] |= 1;
   5648     }
   5649 
   5650   return glue_addr + s->output_section->vma + s->output_offset;
   5651 }
   5652 
   5653 /* Generate Arm stubs for exported Thumb symbols.  */
   5654 static void
   5655 elf32_arm_begin_write_processing (bfd *abfd ATTRIBUTE_UNUSED,
   5656 				  struct bfd_link_info *link_info)
   5657 {
   5658   struct elf32_arm_link_hash_table * globals;
   5659 
   5660   if (link_info == NULL)
   5661     /* Ignore this if we are not called by the ELF backend linker.  */
   5662     return;
   5663 
   5664   globals = elf32_arm_hash_table (link_info);
   5665   /* If blx is available then exported Thumb symbols are OK and there is
   5666      nothing to do.  */
   5667   if (globals->use_blx)
   5668     return;
   5669 
   5670   elf_link_hash_traverse (&globals->root, elf32_arm_to_thumb_export_stub,
   5671 			  link_info);
   5672 }
   5673 
   5674 /* Some relocations map to different relocations depending on the
   5675    target.  Return the real relocation.  */
   5676 
   5677 static int
   5678 arm_real_reloc_type (struct elf32_arm_link_hash_table * globals,
   5679 		     int r_type)
   5680 {
   5681   switch (r_type)
   5682     {
   5683     case R_ARM_TARGET1:
   5684       if (globals->target1_is_rel)
   5685 	return R_ARM_REL32;
   5686       else
   5687 	return R_ARM_ABS32;
   5688 
   5689     case R_ARM_TARGET2:
   5690       return globals->target2_reloc;
   5691 
   5692     default:
   5693       return r_type;
   5694     }
   5695 }
   5696 
   5697 /* Return the base VMA address which should be subtracted from real addresses
   5698    when resolving @dtpoff relocation.
   5699    This is PT_TLS segment p_vaddr.  */
   5700 
   5701 static bfd_vma
   5702 dtpoff_base (struct bfd_link_info *info)
   5703 {
   5704   /* If tls_sec is NULL, we should have signalled an error already.  */
   5705   if (elf_hash_table (info)->tls_sec == NULL)
   5706     return 0;
   5707   return elf_hash_table (info)->tls_sec->vma;
   5708 }
   5709 
   5710 /* Return the relocation value for @tpoff relocation
   5711    if STT_TLS virtual address is ADDRESS.  */
   5712 
   5713 static bfd_vma
   5714 tpoff (struct bfd_link_info *info, bfd_vma address)
   5715 {
   5716   struct elf_link_hash_table *htab = elf_hash_table (info);
   5717   bfd_vma base;
   5718 
   5719   /* If tls_sec is NULL, we should have signalled an error already.  */
   5720   if (htab->tls_sec == NULL)
   5721     return 0;
   5722   base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power);
   5723   return address - htab->tls_sec->vma + base;
   5724 }
   5725 
   5726 /* Perform an R_ARM_ABS12 relocation on the field pointed to by DATA.
   5727    VALUE is the relocation value.  */
   5728 
   5729 static bfd_reloc_status_type
   5730 elf32_arm_abs12_reloc (bfd *abfd, void *data, bfd_vma value)
   5731 {
   5732   if (value > 0xfff)
   5733     return bfd_reloc_overflow;
   5734 
   5735   value |= bfd_get_32 (abfd, data) & 0xfffff000;
   5736   bfd_put_32 (abfd, value, data);
   5737   return bfd_reloc_ok;
   5738 }
   5739 
   5740 /* For a given value of n, calculate the value of G_n as required to
   5741    deal with group relocations.  We return it in the form of an
   5742    encoded constant-and-rotation, together with the final residual.  If n is
   5743    specified as less than zero, then final_residual is filled with the
   5744    input value and no further action is performed.  */
   5745 
   5746 static bfd_vma
   5747 calculate_group_reloc_mask (bfd_vma value, int n, bfd_vma *final_residual)
   5748 {
   5749   int current_n;
   5750   bfd_vma g_n;
   5751   bfd_vma encoded_g_n = 0;
   5752   bfd_vma residual = value; /* Also known as Y_n.  */
   5753 
   5754   for (current_n = 0; current_n <= n; current_n++)
   5755     {
   5756       int shift;
   5757 
   5758       /* Calculate which part of the value to mask.  */
   5759       if (residual == 0)
   5760         shift = 0;
   5761       else
   5762         {
   5763           int msb;
   5764 
   5765           /* Determine the most significant bit in the residual and
   5766              align the resulting value to a 2-bit boundary.  */
   5767           for (msb = 30; msb >= 0; msb -= 2)
   5768             if (residual & (3 << msb))
   5769               break;
   5770 
   5771           /* The desired shift is now (msb - 6), or zero, whichever
   5772              is the greater.  */
   5773           shift = msb - 6;
   5774           if (shift < 0)
   5775             shift = 0;
   5776         }
   5777 
   5778       /* Calculate g_n in 32-bit as well as encoded constant+rotation form.  */
   5779       g_n = residual & (0xff << shift);
   5780       encoded_g_n = (g_n >> shift)
   5781                     | ((g_n <= 0xff ? 0 : (32 - shift) / 2) << 8);
   5782 
   5783       /* Calculate the residual for the next time around.  */
   5784       residual &= ~g_n;
   5785     }
   5786 
   5787   *final_residual = residual;
   5788 
   5789   return encoded_g_n;
   5790 }
   5791 
   5792 /* Given an ARM instruction, determine whether it is an ADD or a SUB.
   5793    Returns 1 if it is an ADD, -1 if it is a SUB, and 0 otherwise.  */
   5794 
   5795 static int
   5796 identify_add_or_sub (bfd_vma insn)
   5797 {
   5798   int opcode = insn & 0x1e00000;
   5799 
   5800   if (opcode == 1 << 23) /* ADD */
   5801     return 1;
   5802 
   5803   if (opcode == 1 << 22) /* SUB */
   5804     return -1;
   5805 
   5806   return 0;
   5807 }
   5808 
   5809 /* Perform a relocation as part of a final link.  */
   5810 
   5811 static bfd_reloc_status_type
   5812 elf32_arm_final_link_relocate (reloc_howto_type *           howto,
   5813 			       bfd *                        input_bfd,
   5814 			       bfd *                        output_bfd,
   5815 			       asection *                   input_section,
   5816 			       bfd_byte *                   contents,
   5817 			       Elf_Internal_Rela *          rel,
   5818 			       bfd_vma                      value,
   5819 			       struct bfd_link_info *       info,
   5820 			       asection *                   sym_sec,
   5821 			       const char *                 sym_name,
   5822 			       int		            sym_flags,
   5823 			       struct elf_link_hash_entry * h,
   5824 			       bfd_boolean *                unresolved_reloc_p,
   5825 			       char **                      error_message)
   5826 {
   5827   unsigned long                 r_type = howto->type;
   5828   unsigned long                 r_symndx;
   5829   bfd_byte *                    hit_data = contents + rel->r_offset;
   5830   bfd *                         dynobj = NULL;
   5831   Elf_Internal_Shdr *           symtab_hdr;
   5832   struct elf_link_hash_entry ** sym_hashes;
   5833   bfd_vma *                     local_got_offsets;
   5834   asection *                    sgot = NULL;
   5835   asection *                    splt = NULL;
   5836   asection *                    sreloc = NULL;
   5837   bfd_vma                       addend;
   5838   bfd_signed_vma                signed_addend;
   5839   struct elf32_arm_link_hash_table * globals;
   5840 
   5841   globals = elf32_arm_hash_table (info);
   5842 
   5843   BFD_ASSERT (is_arm_elf (input_bfd));
   5844 
   5845   /* Some relocation types map to different relocations depending on the
   5846      target.  We pick the right one here.  */
   5847   r_type = arm_real_reloc_type (globals, r_type);
   5848   if (r_type != howto->type)
   5849     howto = elf32_arm_howto_from_type (r_type);
   5850 
   5851   /* If the start address has been set, then set the EF_ARM_HASENTRY
   5852      flag.  Setting this more than once is redundant, but the cost is
   5853      not too high, and it keeps the code simple.
   5854 
   5855      The test is done  here, rather than somewhere else, because the
   5856      start address is only set just before the final link commences.
   5857 
   5858      Note - if the user deliberately sets a start address of 0, the
   5859      flag will not be set.  */
   5860   if (bfd_get_start_address (output_bfd) != 0)
   5861     elf_elfheader (output_bfd)->e_flags |= EF_ARM_HASENTRY;
   5862 
   5863   dynobj = elf_hash_table (info)->dynobj;
   5864   if (dynobj)
   5865     {
   5866       sgot = bfd_get_section_by_name (dynobj, ".got");
   5867       splt = bfd_get_section_by_name (dynobj, ".plt");
   5868     }
   5869   symtab_hdr = & elf_symtab_hdr (input_bfd);
   5870   sym_hashes = elf_sym_hashes (input_bfd);
   5871   local_got_offsets = elf_local_got_offsets (input_bfd);
   5872   r_symndx = ELF32_R_SYM (rel->r_info);
   5873 
   5874   if (globals->use_rel)
   5875     {
   5876       addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask;
   5877 
   5878       if (addend & ((howto->src_mask + 1) >> 1))
   5879 	{
   5880 	  signed_addend = -1;
   5881 	  signed_addend &= ~ howto->src_mask;
   5882 	  signed_addend |= addend;
   5883 	}
   5884       else
   5885 	signed_addend = addend;
   5886     }
   5887   else
   5888     addend = signed_addend = rel->r_addend;
   5889 
   5890   switch (r_type)
   5891     {
   5892     case R_ARM_NONE:
   5893       /* We don't need to find a value for this symbol.  It's just a
   5894 	 marker.  */
   5895       *unresolved_reloc_p = FALSE;
   5896       return bfd_reloc_ok;
   5897 
   5898     case R_ARM_ABS12:
   5899       if (!globals->vxworks_p)
   5900 	return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
   5901 
   5902     case R_ARM_PC24:
   5903     case R_ARM_ABS32:
   5904     case R_ARM_ABS32_NOI:
   5905     case R_ARM_REL32:
   5906     case R_ARM_REL32_NOI:
   5907     case R_ARM_CALL:
   5908     case R_ARM_JUMP24:
   5909     case R_ARM_XPC25:
   5910     case R_ARM_PREL31:
   5911     case R_ARM_PLT32:
   5912       /* Handle relocations which should use the PLT entry.  ABS32/REL32
   5913 	 will use the symbol's value, which may point to a PLT entry, but we
   5914 	 don't need to handle that here.  If we created a PLT entry, all
   5915 	 branches in this object should go to it.  */
   5916       if ((r_type != R_ARM_ABS32 && r_type != R_ARM_REL32
   5917            && r_type != R_ARM_ABS32_NOI && r_type != R_ARM_REL32_NOI)
   5918 	  && h != NULL
   5919 	  && splt != NULL
   5920 	  && h->plt.offset != (bfd_vma) -1)
   5921 	{
   5922 	  /* If we've created a .plt section, and assigned a PLT entry to
   5923 	     this function, it should not be known to bind locally.  If
   5924 	     it were, we would have cleared the PLT entry.  */
   5925 	  BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h));
   5926 
   5927 	  value = (splt->output_section->vma
   5928 		   + splt->output_offset
   5929 		   + h->plt.offset);
   5930 	  *unresolved_reloc_p = FALSE;
   5931 	  return _bfd_final_link_relocate (howto, input_bfd, input_section,
   5932 					   contents, rel->r_offset, value,
   5933 					   rel->r_addend);
   5934 	}
   5935 
   5936       /* When generating a shared object or relocatable executable, these
   5937 	 relocations are copied into the output file to be resolved at
   5938 	 run time.  */
   5939       if ((info->shared || globals->root.is_relocatable_executable)
   5940 	  && (input_section->flags & SEC_ALLOC)
   5941 	  && !(elf32_arm_hash_table (info)->vxworks_p
   5942 	       && strcmp (input_section->output_section->name,
   5943 			  ".tls_vars") == 0)
   5944 	  && ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
   5945 	      || !SYMBOL_CALLS_LOCAL (info, h))
   5946 	  && (h == NULL
   5947 	      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   5948 	      || h->root.type != bfd_link_hash_undefweak)
   5949 	  && r_type != R_ARM_PC24
   5950 	  && r_type != R_ARM_CALL
   5951 	  && r_type != R_ARM_JUMP24
   5952 	  && r_type != R_ARM_PREL31
   5953 	  && r_type != R_ARM_PLT32)
   5954 	{
   5955 	  Elf_Internal_Rela outrel;
   5956 	  bfd_byte *loc;
   5957 	  bfd_boolean skip, relocate;
   5958 
   5959 	  *unresolved_reloc_p = FALSE;
   5960 
   5961 	  if (sreloc == NULL)
   5962 	    {
   5963 	      const char * name;
   5964 
   5965 	      name = (bfd_elf_string_from_elf_section
   5966 		      (input_bfd,
   5967 		       elf_elfheader (input_bfd)->e_shstrndx,
   5968 		       elf_section_data (input_section)->rel_hdr.sh_name));
   5969 	      if (name == NULL)
   5970 		return bfd_reloc_notsupported;
   5971 
   5972 	      BFD_ASSERT (reloc_section_p (globals, name, input_section));
   5973 
   5974 	      sreloc = bfd_get_section_by_name (dynobj, name);
   5975 	      BFD_ASSERT (sreloc != NULL);
   5976 	    }
   5977 
   5978 	  skip = FALSE;
   5979 	  relocate = FALSE;
   5980 
   5981 	  outrel.r_addend = addend;
   5982 	  outrel.r_offset =
   5983 	    _bfd_elf_section_offset (output_bfd, info, input_section,
   5984 				     rel->r_offset);
   5985 	  if (outrel.r_offset == (bfd_vma) -1)
   5986 	    skip = TRUE;
   5987 	  else if (outrel.r_offset == (bfd_vma) -2)
   5988 	    skip = TRUE, relocate = TRUE;
   5989 	  outrel.r_offset += (input_section->output_section->vma
   5990 			      + input_section->output_offset);
   5991 
   5992 	  if (skip)
   5993 	    memset (&outrel, 0, sizeof outrel);
   5994 	  else if (h != NULL
   5995 		   && h->dynindx != -1
   5996 		   && (!info->shared
   5997 		       || !info->symbolic
   5998 		       || !h->def_regular))
   5999 	    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   6000 	  else
   6001 	    {
   6002 	      int symbol;
   6003 
   6004 	      /* This symbol is local, or marked to become local.  */
   6005 	      if (sym_flags == STT_ARM_TFUNC)
   6006 		value |= 1;
   6007 	      if (globals->symbian_p)
   6008 		{
   6009 		  asection *osec;
   6010 
   6011 		  /* On Symbian OS, the data segment and text segement
   6012 		     can be relocated independently.  Therefore, we
   6013 		     must indicate the segment to which this
   6014 		     relocation is relative.  The BPABI allows us to
   6015 		     use any symbol in the right segment; we just use
   6016 		     the section symbol as it is convenient.  (We
   6017 		     cannot use the symbol given by "h" directly as it
   6018 		     will not appear in the dynamic symbol table.)
   6019 
   6020 		     Note that the dynamic linker ignores the section
   6021 		     symbol value, so we don't subtract osec->vma
   6022 		     from the emitted reloc addend.  */
   6023 		  if (sym_sec)
   6024 		    osec = sym_sec->output_section;
   6025 		  else
   6026 		    osec = input_section->output_section;
   6027 		  symbol = elf_section_data (osec)->dynindx;
   6028 		  if (symbol == 0)
   6029 		    {
   6030 		      struct elf_link_hash_table *htab = elf_hash_table (info);
   6031 
   6032 		      if ((osec->flags & SEC_READONLY) == 0
   6033 			  && htab->data_index_section != NULL)
   6034 			osec = htab->data_index_section;
   6035 		      else
   6036 			osec = htab->text_index_section;
   6037 		      symbol = elf_section_data (osec)->dynindx;
   6038 		    }
   6039 		  BFD_ASSERT (symbol != 0);
   6040 		}
   6041 	      else
   6042 		/* On SVR4-ish systems, the dynamic loader cannot
   6043 		   relocate the text and data segments independently,
   6044 		   so the symbol does not matter.  */
   6045 		symbol = 0;
   6046 	      outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
   6047 	      if (globals->use_rel)
   6048 		relocate = TRUE;
   6049 	      else
   6050 		outrel.r_addend += value;
   6051 	    }
   6052 
   6053 	  loc = sreloc->contents;
   6054 	  loc += sreloc->reloc_count++ * RELOC_SIZE (globals);
   6055 	  SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   6056 
   6057 	  /* If this reloc is against an external symbol, we do not want to
   6058 	     fiddle with the addend.  Otherwise, we need to include the symbol
   6059 	     value so that it becomes an addend for the dynamic reloc.  */
   6060 	  if (! relocate)
   6061 	    return bfd_reloc_ok;
   6062 
   6063 	  return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6064 					   contents, rel->r_offset, value,
   6065 					   (bfd_vma) 0);
   6066 	}
   6067       else switch (r_type)
   6068 	{
   6069 	case R_ARM_ABS12:
   6070 	  return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
   6071 
   6072 	case R_ARM_XPC25:	  /* Arm BLX instruction.  */
   6073 	case R_ARM_CALL:
   6074 	case R_ARM_JUMP24:
   6075 	case R_ARM_PC24:	  /* Arm B/BL instruction.  */
   6076 	case R_ARM_PLT32:
   6077 	  {
   6078 	  bfd_vma from;
   6079 	  bfd_signed_vma branch_offset;
   6080 	  struct elf32_arm_stub_hash_entry *stub_entry = NULL;
   6081 
   6082 	  from = (input_section->output_section->vma
   6083 		  + input_section->output_offset
   6084 		  + rel->r_offset);
   6085 	  branch_offset = (bfd_signed_vma)(value - from);
   6086 
   6087 	  if (r_type == R_ARM_XPC25)
   6088 	    {
   6089 	      /* Check for Arm calling Arm function.  */
   6090 	      /* FIXME: Should we translate the instruction into a BL
   6091 		 instruction instead ?  */
   6092 	      if (sym_flags != STT_ARM_TFUNC)
   6093 		(*_bfd_error_handler)
   6094 		  (_("\%B: Warning: Arm BLX instruction targets Arm function '%s'."),
   6095 		   input_bfd,
   6096 		   h ? h->root.root.string : "(local)");
   6097 	    }
   6098 	  else if (r_type != R_ARM_CALL)
   6099 	    {
   6100 	      /* Check for Arm calling Thumb function.  */
   6101 	      if (sym_flags == STT_ARM_TFUNC)
   6102 		{
   6103 		  if (elf32_arm_to_thumb_stub (info, sym_name, input_bfd,
   6104 					       output_bfd, input_section,
   6105 					       hit_data, sym_sec, rel->r_offset,
   6106 					       signed_addend, value,
   6107 					       error_message))
   6108 		    return bfd_reloc_ok;
   6109 		  else
   6110 		    return bfd_reloc_dangerous;
   6111 		}
   6112 	    }
   6113 
   6114 	  /* Check if a stub has to be inserted because the
   6115 	     destination is too far or we are changing mode.  */
   6116 	  if (r_type == R_ARM_CALL)
   6117 	    {
   6118 	      if (branch_offset > ARM_MAX_FWD_BRANCH_OFFSET
   6119 		  || branch_offset < ARM_MAX_BWD_BRANCH_OFFSET
   6120 		  || sym_flags == STT_ARM_TFUNC)
   6121 		{
   6122 		  /* The target is out of reach, so redirect the
   6123 		     branch to the local stub for this function.  */
   6124 
   6125 		  stub_entry = elf32_arm_get_stub_entry (input_section,
   6126 							 sym_sec, h,
   6127 							 rel, globals);
   6128 		  if (stub_entry != NULL)
   6129 		    value = (stub_entry->stub_offset
   6130 			     + stub_entry->stub_sec->output_offset
   6131 			     + stub_entry->stub_sec->output_section->vma);
   6132 		}
   6133 	    }
   6134 
   6135 	  /* The ARM ELF ABI says that this reloc is computed as: S - P + A
   6136 	     where:
   6137 	      S is the address of the symbol in the relocation.
   6138 	      P is address of the instruction being relocated.
   6139 	      A is the addend (extracted from the instruction) in bytes.
   6140 
   6141 	     S is held in 'value'.
   6142 	     P is the base address of the section containing the
   6143 	       instruction plus the offset of the reloc into that
   6144 	       section, ie:
   6145 		 (input_section->output_section->vma +
   6146 		  input_section->output_offset +
   6147 		  rel->r_offset).
   6148 	     A is the addend, converted into bytes, ie:
   6149 		 (signed_addend * 4)
   6150 
   6151 	     Note: None of these operations have knowledge of the pipeline
   6152 	     size of the processor, thus it is up to the assembler to
   6153 	     encode this information into the addend.  */
   6154 	  value -= (input_section->output_section->vma
   6155 		    + input_section->output_offset);
   6156 	  value -= rel->r_offset;
   6157 	  if (globals->use_rel)
   6158 	    value += (signed_addend << howto->size);
   6159 	  else
   6160 	    /* RELA addends do not have to be adjusted by howto->size.  */
   6161 	    value += signed_addend;
   6162 
   6163 	  signed_addend = value;
   6164 	  signed_addend >>= howto->rightshift;
   6165 
   6166 	  /* A branch to an undefined weak symbol is turned into a jump to
   6167 	     the next instruction.  */
   6168 	  if (h && h->root.type == bfd_link_hash_undefweak)
   6169 	    {
   6170 	      value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000)
   6171 		      | 0x0affffff;
   6172 	    }
   6173 	  else
   6174 	    {
   6175 	      /* Perform a signed range check.  */
   6176 	      if (   signed_addend >   ((bfd_signed_vma)  (howto->dst_mask >> 1))
   6177 		  || signed_addend < - ((bfd_signed_vma) ((howto->dst_mask + 1) >> 1)))
   6178 		return bfd_reloc_overflow;
   6179 
   6180 	      addend = (value & 2);
   6181 
   6182 	      value = (signed_addend & howto->dst_mask)
   6183 		| (bfd_get_32 (input_bfd, hit_data) & (~ howto->dst_mask));
   6184 
   6185 	      /* Set the H bit in the BLX instruction.  */
   6186 	      if (sym_flags == STT_ARM_TFUNC)
   6187 		{
   6188 		  if (addend)
   6189 		    value |= (1 << 24);
   6190 		  else
   6191 		    value &= ~(bfd_vma)(1 << 24);
   6192 		}
   6193 	      if (r_type == R_ARM_CALL)
   6194 		{
   6195 		  /* Select the correct instruction (BL or BLX).  */
   6196 		  /* Only if we are not handling a BL to a stub. In this
   6197 		     case, mode switching is performed by the stub.  */
   6198 		  if (sym_flags == STT_ARM_TFUNC && !stub_entry)
   6199 		    value |= (1 << 28);
   6200 		  else
   6201 		    {
   6202 		      value &= ~(bfd_vma)(1 << 28);
   6203 		      value |= (1 << 24);
   6204 		    }
   6205 		}
   6206 	    }
   6207 	  }
   6208 	  break;
   6209 
   6210 	case R_ARM_ABS32:
   6211 	  value += addend;
   6212 	  if (sym_flags == STT_ARM_TFUNC)
   6213 	    value |= 1;
   6214 	  break;
   6215 
   6216 	case R_ARM_ABS32_NOI:
   6217 	  value += addend;
   6218 	  break;
   6219 
   6220 	case R_ARM_REL32:
   6221 	  value += addend;
   6222 	  if (sym_flags == STT_ARM_TFUNC)
   6223 	    value |= 1;
   6224 	  value -= (input_section->output_section->vma
   6225 		    + input_section->output_offset + rel->r_offset);
   6226 	  break;
   6227 
   6228 	case R_ARM_REL32_NOI:
   6229 	  value += addend;
   6230 	  value -= (input_section->output_section->vma
   6231 		    + input_section->output_offset + rel->r_offset);
   6232 	  break;
   6233 
   6234 	case R_ARM_PREL31:
   6235 	  value -= (input_section->output_section->vma
   6236 		    + input_section->output_offset + rel->r_offset);
   6237 	  value += signed_addend;
   6238 	  if (! h || h->root.type != bfd_link_hash_undefweak)
   6239 	    {
   6240 	      /* Check for overflow.  */
   6241 	      if ((value ^ (value >> 1)) & (1 << 30))
   6242 		return bfd_reloc_overflow;
   6243 	    }
   6244 	  value &= 0x7fffffff;
   6245 	  value |= (bfd_get_32 (input_bfd, hit_data) & 0x80000000);
   6246 	  if (sym_flags == STT_ARM_TFUNC)
   6247 	    value |= 1;
   6248 	  break;
   6249 	}
   6250 
   6251       bfd_put_32 (input_bfd, value, hit_data);
   6252       return bfd_reloc_ok;
   6253 
   6254     case R_ARM_ABS8:
   6255       value += addend;
   6256       if ((long) value > 0x7f || (long) value < -0x80)
   6257 	return bfd_reloc_overflow;
   6258 
   6259       bfd_put_8 (input_bfd, value, hit_data);
   6260       return bfd_reloc_ok;
   6261 
   6262     case R_ARM_ABS16:
   6263       value += addend;
   6264 
   6265       if ((long) value > 0x7fff || (long) value < -0x8000)
   6266 	return bfd_reloc_overflow;
   6267 
   6268       bfd_put_16 (input_bfd, value, hit_data);
   6269       return bfd_reloc_ok;
   6270 
   6271     case R_ARM_THM_ABS5:
   6272       /* Support ldr and str instructions for the thumb.  */
   6273       if (globals->use_rel)
   6274 	{
   6275 	  /* Need to refetch addend.  */
   6276 	  addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
   6277 	  /* ??? Need to determine shift amount from operand size.  */
   6278 	  addend >>= howto->rightshift;
   6279 	}
   6280       value += addend;
   6281 
   6282       /* ??? Isn't value unsigned?  */
   6283       if ((long) value > 0x1f || (long) value < -0x10)
   6284 	return bfd_reloc_overflow;
   6285 
   6286       /* ??? Value needs to be properly shifted into place first.  */
   6287       value |= bfd_get_16 (input_bfd, hit_data) & 0xf83f;
   6288       bfd_put_16 (input_bfd, value, hit_data);
   6289       return bfd_reloc_ok;
   6290 
   6291     case R_ARM_THM_ALU_PREL_11_0:
   6292       /* Corresponds to: addw.w reg, pc, #offset (and similarly for subw).  */
   6293       {
   6294 	bfd_vma insn;
   6295 	bfd_signed_vma relocation;
   6296 
   6297 	insn = (bfd_get_16 (input_bfd, hit_data) << 16)
   6298              | bfd_get_16 (input_bfd, hit_data + 2);
   6299 
   6300         if (globals->use_rel)
   6301           {
   6302             signed_addend = (insn & 0xff) | ((insn & 0x7000) >> 4)
   6303                           | ((insn & (1 << 26)) >> 15);
   6304             if (insn & 0xf00000)
   6305               signed_addend = -signed_addend;
   6306           }
   6307 
   6308 	relocation = value + signed_addend;
   6309 	relocation -= (input_section->output_section->vma
   6310 		       + input_section->output_offset
   6311 		       + rel->r_offset);
   6312 
   6313         value = abs (relocation);
   6314 
   6315         if (value >= 0x1000)
   6316           return bfd_reloc_overflow;
   6317 
   6318 	insn = (insn & 0xfb0f8f00) | (value & 0xff)
   6319              | ((value & 0x700) << 4)
   6320              | ((value & 0x800) << 15);
   6321         if (relocation < 0)
   6322           insn |= 0xa00000;
   6323 
   6324 	bfd_put_16 (input_bfd, insn >> 16, hit_data);
   6325 	bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
   6326 
   6327         return bfd_reloc_ok;
   6328       }
   6329 
   6330     case R_ARM_THM_PC12:
   6331       /* Corresponds to: ldr.w reg, [pc, #offset].  */
   6332       {
   6333 	bfd_vma insn;
   6334 	bfd_signed_vma relocation;
   6335 
   6336 	insn = (bfd_get_16 (input_bfd, hit_data) << 16)
   6337              | bfd_get_16 (input_bfd, hit_data + 2);
   6338 
   6339         if (globals->use_rel)
   6340           {
   6341             signed_addend = insn & 0xfff;
   6342             if (!(insn & (1 << 23)))
   6343               signed_addend = -signed_addend;
   6344           }
   6345 
   6346 	relocation = value + signed_addend;
   6347 	relocation -= (input_section->output_section->vma
   6348 		       + input_section->output_offset
   6349 		       + rel->r_offset);
   6350 
   6351         value = abs (relocation);
   6352 
   6353         if (value >= 0x1000)
   6354           return bfd_reloc_overflow;
   6355 
   6356 	insn = (insn & 0xff7ff000) | value;
   6357         if (relocation >= 0)
   6358           insn |= (1 << 23);
   6359 
   6360 	bfd_put_16 (input_bfd, insn >> 16, hit_data);
   6361 	bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
   6362 
   6363         return bfd_reloc_ok;
   6364       }
   6365 
   6366     case R_ARM_THM_XPC22:
   6367     case R_ARM_THM_CALL:
   6368     case R_ARM_THM_JUMP24:
   6369       /* Thumb BL (branch long instruction).  */
   6370       {
   6371 	bfd_vma relocation;
   6372         bfd_vma reloc_sign;
   6373 	bfd_boolean overflow = FALSE;
   6374 	bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
   6375 	bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
   6376 	bfd_signed_vma reloc_signed_max;
   6377 	bfd_signed_vma reloc_signed_min;
   6378 	bfd_vma check;
   6379 	bfd_signed_vma signed_check;
   6380 	int bitsize;
   6381 	int thumb2 = using_thumb2 (globals);
   6382 
   6383 	/* A branch to an undefined weak symbol is turned into a jump to
   6384 	   the next instruction unless a PLT entry will be created.  */
   6385 	if (h && h->root.type == bfd_link_hash_undefweak
   6386 	    && !(splt != NULL && h->plt.offset != (bfd_vma) -1))
   6387 	  {
   6388 	    bfd_put_16 (input_bfd, 0xe000, hit_data);
   6389 	    bfd_put_16 (input_bfd, 0xbf00, hit_data + 2);
   6390 	    return bfd_reloc_ok;
   6391 	  }
   6392 
   6393 	/* Fetch the addend.  We use the Thumb-2 encoding (backwards compatible
   6394            with Thumb-1) involving the J1 and J2 bits.  */
   6395 	if (globals->use_rel)
   6396 	  {
   6397             bfd_vma s = (upper_insn & (1 << 10)) >> 10;
   6398             bfd_vma upper = upper_insn & 0x3ff;
   6399             bfd_vma lower = lower_insn & 0x7ff;
   6400 	    bfd_vma j1 = (lower_insn & (1 << 13)) >> 13;
   6401 	    bfd_vma j2 = (lower_insn & (1 << 11)) >> 11;
   6402             bfd_vma i1 = j1 ^ s ? 0 : 1;
   6403             bfd_vma i2 = j2 ^ s ? 0 : 1;
   6404 
   6405             addend = (i1 << 23) | (i2 << 22) | (upper << 12) | (lower << 1);
   6406             /* Sign extend.  */
   6407             addend = (addend | ((s ? 0 : 1) << 24)) - (1 << 24);
   6408 
   6409 	    signed_addend = addend;
   6410 	  }
   6411 
   6412 	if (r_type == R_ARM_THM_XPC22)
   6413 	  {
   6414 	    /* Check for Thumb to Thumb call.  */
   6415 	    /* FIXME: Should we translate the instruction into a BL
   6416 	       instruction instead ?  */
   6417 	    if (sym_flags == STT_ARM_TFUNC)
   6418 	      (*_bfd_error_handler)
   6419 		(_("%B: Warning: Thumb BLX instruction targets thumb function '%s'."),
   6420 		 input_bfd,
   6421 		 h ? h->root.root.string : "(local)");
   6422 	  }
   6423 	else
   6424 	  {
   6425 	    /* If it is not a call to Thumb, assume call to Arm.
   6426 	       If it is a call relative to a section name, then it is not a
   6427 	       function call at all, but rather a long jump.  Calls through
   6428 	       the PLT do not require stubs.  */
   6429 	    if (sym_flags != STT_ARM_TFUNC && sym_flags != STT_SECTION
   6430 		&& (h == NULL || splt == NULL
   6431 		    || h->plt.offset == (bfd_vma) -1))
   6432 	      {
   6433 		if (globals->use_blx && r_type == R_ARM_THM_CALL)
   6434 		  {
   6435 		    /* Convert BL to BLX.  */
   6436 		    lower_insn = (lower_insn & ~0x1000) | 0x0800;
   6437 		  }
   6438 		else if (r_type != R_ARM_THM_CALL)
   6439 		  {
   6440 		    if (elf32_thumb_to_arm_stub
   6441 			(info, sym_name, input_bfd, output_bfd, input_section,
   6442 			 hit_data, sym_sec, rel->r_offset, signed_addend, value,
   6443 			 error_message))
   6444 		      return bfd_reloc_ok;
   6445 		    else
   6446 		      return bfd_reloc_dangerous;
   6447 		  }
   6448 	      }
   6449 	    else if (sym_flags == STT_ARM_TFUNC && globals->use_blx
   6450 		     && r_type == R_ARM_THM_CALL)
   6451 	      {
   6452 		/* Make sure this is a BL.  */
   6453 		lower_insn |= 0x1800;
   6454 	      }
   6455 	  }
   6456 
   6457 	/* Handle calls via the PLT.  */
   6458 	if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
   6459 	  {
   6460 	    value = (splt->output_section->vma
   6461 		     + splt->output_offset
   6462 		     + h->plt.offset);
   6463  	    if (globals->use_blx && r_type == R_ARM_THM_CALL)
   6464  	      {
   6465  		/* If the Thumb BLX instruction is available, convert the
   6466 		   BL to a BLX instruction to call the ARM-mode PLT entry.  */
   6467 		lower_insn = (lower_insn & ~0x1000) | 0x0800;
   6468  	      }
   6469  	    else
   6470  	      /* Target the Thumb stub before the ARM PLT entry.  */
   6471  	      value -= PLT_THUMB_STUB_SIZE;
   6472 	    *unresolved_reloc_p = FALSE;
   6473 	  }
   6474 
   6475 	if (r_type == R_ARM_THM_CALL)
   6476 	  {
   6477 	    /* Check if a stub has to be inserted because the destination
   6478 	       is too far.  */
   6479 	    bfd_vma from;
   6480 	    bfd_signed_vma branch_offset;
   6481 	    struct elf32_arm_stub_hash_entry *stub_entry = NULL;
   6482 
   6483 	    from = (input_section->output_section->vma
   6484 		    + input_section->output_offset
   6485 		    + rel->r_offset);
   6486 	    branch_offset = (bfd_signed_vma)(value - from);
   6487 
   6488 	    if ((!thumb2
   6489 		 && (branch_offset > THM_MAX_FWD_BRANCH_OFFSET
   6490 		     || (branch_offset < THM_MAX_BWD_BRANCH_OFFSET)))
   6491 		||
   6492 		(thumb2
   6493 		 && (branch_offset > THM2_MAX_FWD_BRANCH_OFFSET
   6494 		     || (branch_offset < THM2_MAX_BWD_BRANCH_OFFSET)))
   6495 		|| ((sym_flags != STT_ARM_TFUNC) && !globals->use_blx))
   6496 	      {
   6497 		/* The target is out of reach or we are changing modes, so
   6498 		   redirect the branch to the local stub for this
   6499 		   function.  */
   6500 		stub_entry = elf32_arm_get_stub_entry (input_section,
   6501 						       sym_sec, h,
   6502 						       rel, globals);
   6503 		if (stub_entry != NULL)
   6504 		  value = (stub_entry->stub_offset
   6505 			   + stub_entry->stub_sec->output_offset
   6506 			   + stub_entry->stub_sec->output_section->vma);
   6507 
   6508 		/* If this call becomes a call to Arm, force BLX.  */
   6509 		if (globals->use_blx)
   6510 		  {
   6511 		    if ((stub_entry
   6512 			 && !arm_stub_is_thumb (stub_entry->stub_type))
   6513 			|| (sym_flags != STT_ARM_TFUNC))
   6514 		      lower_insn = (lower_insn & ~0x1000) | 0x0800;
   6515 		  }
   6516 	      }
   6517 	  }
   6518 
   6519 	relocation = value + signed_addend;
   6520 
   6521 	relocation -= (input_section->output_section->vma
   6522 		       + input_section->output_offset
   6523 		       + rel->r_offset);
   6524 
   6525 	check = relocation >> howto->rightshift;
   6526 
   6527 	/* If this is a signed value, the rightshift just dropped
   6528 	   leading 1 bits (assuming twos complement).  */
   6529 	if ((bfd_signed_vma) relocation >= 0)
   6530 	  signed_check = check;
   6531 	else
   6532 	  signed_check = check | ~((bfd_vma) -1 >> howto->rightshift);
   6533 
   6534 	/* Calculate the permissable maximum and minimum values for
   6535 	   this relocation according to whether we're relocating for
   6536 	   Thumb-2 or not.  */
   6537 	bitsize = howto->bitsize;
   6538 	if (!thumb2)
   6539 	  bitsize -= 2;
   6540 	reloc_signed_max = ((1 << (bitsize - 1)) - 1) >> howto->rightshift;
   6541 	reloc_signed_min = ~reloc_signed_max;
   6542 
   6543 	/* Assumes two's complement.  */
   6544 	if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
   6545 	  overflow = TRUE;
   6546 
   6547 	if ((lower_insn & 0x5000) == 0x4000)
   6548 	  /* For a BLX instruction, make sure that the relocation is rounded up
   6549 	     to a word boundary.  This follows the semantics of the instruction
   6550 	     which specifies that bit 1 of the target address will come from bit
   6551 	     1 of the base address.  */
   6552 	  relocation = (relocation + 2) & ~ 3;
   6553 
   6554 	/* Put RELOCATION back into the insn.  Assumes two's complement.
   6555 	   We use the Thumb-2 encoding, which is safe even if dealing with
   6556 	   a Thumb-1 instruction by virtue of our overflow check above.  */
   6557         reloc_sign = (signed_check < 0) ? 1 : 0;
   6558 	upper_insn = (upper_insn & ~(bfd_vma) 0x7ff)
   6559                      | ((relocation >> 12) & 0x3ff)
   6560                      | (reloc_sign << 10);
   6561 	lower_insn = (lower_insn & ~(bfd_vma) 0x2fff)
   6562                      | (((!((relocation >> 23) & 1)) ^ reloc_sign) << 13)
   6563                      | (((!((relocation >> 22) & 1)) ^ reloc_sign) << 11)
   6564                      | ((relocation >> 1) & 0x7ff);
   6565 
   6566 	/* Put the relocated value back in the object file:  */
   6567 	bfd_put_16 (input_bfd, upper_insn, hit_data);
   6568 	bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
   6569 
   6570 	return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
   6571       }
   6572       break;
   6573 
   6574     case R_ARM_THM_JUMP19:
   6575       /* Thumb32 conditional branch instruction.  */
   6576       {
   6577 	bfd_vma relocation;
   6578 	bfd_boolean overflow = FALSE;
   6579 	bfd_vma upper_insn = bfd_get_16 (input_bfd, hit_data);
   6580 	bfd_vma lower_insn = bfd_get_16 (input_bfd, hit_data + 2);
   6581 	bfd_signed_vma reloc_signed_max = 0xffffe;
   6582 	bfd_signed_vma reloc_signed_min = -0x100000;
   6583 	bfd_signed_vma signed_check;
   6584 
   6585 	/* Need to refetch the addend, reconstruct the top three bits,
   6586 	   and squish the two 11 bit pieces together.  */
   6587 	if (globals->use_rel)
   6588 	  {
   6589 	    bfd_vma S     = (upper_insn & 0x0400) >> 10;
   6590 	    bfd_vma upper = (upper_insn & 0x003f);
   6591 	    bfd_vma J1    = (lower_insn & 0x2000) >> 13;
   6592 	    bfd_vma J2    = (lower_insn & 0x0800) >> 11;
   6593 	    bfd_vma lower = (lower_insn & 0x07ff);
   6594 
   6595 	    upper |= J1 << 6;
   6596 	    upper |= J2 << 7;
   6597 	    upper |= (!S) << 8;
   6598 	    upper -= 0x0100; /* Sign extend.  */
   6599 
   6600 	    addend = (upper << 12) | (lower << 1);
   6601 	    signed_addend = addend;
   6602 	  }
   6603 
   6604 	/* Handle calls via the PLT.  */
   6605 	if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1)
   6606 	  {
   6607 	    value = (splt->output_section->vma
   6608 		     + splt->output_offset
   6609 		     + h->plt.offset);
   6610 	    /* Target the Thumb stub before the ARM PLT entry.  */
   6611 	    value -= PLT_THUMB_STUB_SIZE;
   6612 	    *unresolved_reloc_p = FALSE;
   6613 	  }
   6614 
   6615 	/* ??? Should handle interworking?  GCC might someday try to
   6616 	   use this for tail calls.  */
   6617 
   6618       	relocation = value + signed_addend;
   6619 	relocation -= (input_section->output_section->vma
   6620 		       + input_section->output_offset
   6621 		       + rel->r_offset);
   6622 	signed_check = (bfd_signed_vma) relocation;
   6623 
   6624 	if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
   6625 	  overflow = TRUE;
   6626 
   6627 	/* Put RELOCATION back into the insn.  */
   6628 	{
   6629 	  bfd_vma S  = (relocation & 0x00100000) >> 20;
   6630 	  bfd_vma J2 = (relocation & 0x00080000) >> 19;
   6631 	  bfd_vma J1 = (relocation & 0x00040000) >> 18;
   6632 	  bfd_vma hi = (relocation & 0x0003f000) >> 12;
   6633 	  bfd_vma lo = (relocation & 0x00000ffe) >>  1;
   6634 
   6635 	  upper_insn = (upper_insn & 0xfbc0) | (S << 10) | hi;
   6636 	  lower_insn = (lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | lo;
   6637 	}
   6638 
   6639 	/* Put the relocated value back in the object file:  */
   6640 	bfd_put_16 (input_bfd, upper_insn, hit_data);
   6641 	bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
   6642 
   6643 	return (overflow ? bfd_reloc_overflow : bfd_reloc_ok);
   6644       }
   6645 
   6646     case R_ARM_THM_JUMP11:
   6647     case R_ARM_THM_JUMP8:
   6648     case R_ARM_THM_JUMP6:
   6649       /* Thumb B (branch) instruction).  */
   6650       {
   6651 	bfd_signed_vma relocation;
   6652 	bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
   6653 	bfd_signed_vma reloc_signed_min = ~ reloc_signed_max;
   6654 	bfd_signed_vma signed_check;
   6655 
   6656 	/* CZB cannot jump backward.  */
   6657 	if (r_type == R_ARM_THM_JUMP6)
   6658 	  reloc_signed_min = 0;
   6659 
   6660 	if (globals->use_rel)
   6661 	  {
   6662 	    /* Need to refetch addend.  */
   6663 	    addend = bfd_get_16 (input_bfd, hit_data) & howto->src_mask;
   6664 	    if (addend & ((howto->src_mask + 1) >> 1))
   6665 	      {
   6666 		signed_addend = -1;
   6667 		signed_addend &= ~ howto->src_mask;
   6668 		signed_addend |= addend;
   6669 	      }
   6670 	    else
   6671 	      signed_addend = addend;
   6672 	    /* The value in the insn has been right shifted.  We need to
   6673 	       undo this, so that we can perform the address calculation
   6674 	       in terms of bytes.  */
   6675 	    signed_addend <<= howto->rightshift;
   6676 	  }
   6677 	relocation = value + signed_addend;
   6678 
   6679 	relocation -= (input_section->output_section->vma
   6680 		       + input_section->output_offset
   6681 		       + rel->r_offset);
   6682 
   6683 	relocation >>= howto->rightshift;
   6684 	signed_check = relocation;
   6685 
   6686 	if (r_type == R_ARM_THM_JUMP6)
   6687 	  relocation = ((relocation & 0x0020) << 4) | ((relocation & 0x001f) << 3);
   6688 	else
   6689 	  relocation &= howto->dst_mask;
   6690 	relocation |= (bfd_get_16 (input_bfd, hit_data) & (~ howto->dst_mask));
   6691 
   6692 	bfd_put_16 (input_bfd, relocation, hit_data);
   6693 
   6694 	/* Assumes two's complement.  */
   6695 	if (signed_check > reloc_signed_max || signed_check < reloc_signed_min)
   6696 	  return bfd_reloc_overflow;
   6697 
   6698 	return bfd_reloc_ok;
   6699       }
   6700 
   6701     case R_ARM_ALU_PCREL7_0:
   6702     case R_ARM_ALU_PCREL15_8:
   6703     case R_ARM_ALU_PCREL23_15:
   6704       {
   6705 	bfd_vma insn;
   6706 	bfd_vma relocation;
   6707 
   6708 	insn = bfd_get_32 (input_bfd, hit_data);
   6709 	if (globals->use_rel)
   6710 	  {
   6711 	    /* Extract the addend.  */
   6712 	    addend = (insn & 0xff) << ((insn & 0xf00) >> 7);
   6713 	    signed_addend = addend;
   6714 	  }
   6715 	relocation = value + signed_addend;
   6716 
   6717 	relocation -= (input_section->output_section->vma
   6718 		       + input_section->output_offset
   6719 		       + rel->r_offset);
   6720 	insn = (insn & ~0xfff)
   6721 	       | ((howto->bitpos << 7) & 0xf00)
   6722 	       | ((relocation >> howto->bitpos) & 0xff);
   6723 	bfd_put_32 (input_bfd, value, hit_data);
   6724       }
   6725       return bfd_reloc_ok;
   6726 
   6727     case R_ARM_GNU_VTINHERIT:
   6728     case R_ARM_GNU_VTENTRY:
   6729       return bfd_reloc_ok;
   6730 
   6731     case R_ARM_GOTOFF32:
   6732       /* Relocation is relative to the start of the
   6733          global offset table.  */
   6734 
   6735       BFD_ASSERT (sgot != NULL);
   6736       if (sgot == NULL)
   6737         return bfd_reloc_notsupported;
   6738 
   6739       /* If we are addressing a Thumb function, we need to adjust the
   6740 	 address by one, so that attempts to call the function pointer will
   6741 	 correctly interpret it as Thumb code.  */
   6742       if (sym_flags == STT_ARM_TFUNC)
   6743 	value += 1;
   6744 
   6745       /* Note that sgot->output_offset is not involved in this
   6746          calculation.  We always want the start of .got.  If we
   6747          define _GLOBAL_OFFSET_TABLE in a different way, as is
   6748          permitted by the ABI, we might have to change this
   6749          calculation.  */
   6750       value -= sgot->output_section->vma;
   6751       return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6752 				       contents, rel->r_offset, value,
   6753 				       rel->r_addend);
   6754 
   6755     case R_ARM_GOTPC:
   6756       /* Use global offset table as symbol value.  */
   6757       BFD_ASSERT (sgot != NULL);
   6758 
   6759       if (sgot == NULL)
   6760         return bfd_reloc_notsupported;
   6761 
   6762       *unresolved_reloc_p = FALSE;
   6763       value = sgot->output_section->vma;
   6764       return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6765 				       contents, rel->r_offset, value,
   6766 				       rel->r_addend);
   6767 
   6768     case R_ARM_GOT32:
   6769     case R_ARM_GOT_PREL:
   6770       /* Relocation is to the entry for this symbol in the
   6771          global offset table.  */
   6772       if (sgot == NULL)
   6773 	return bfd_reloc_notsupported;
   6774 
   6775       if (h != NULL)
   6776 	{
   6777 	  bfd_vma off;
   6778 	  bfd_boolean dyn;
   6779 
   6780 	  off = h->got.offset;
   6781 	  BFD_ASSERT (off != (bfd_vma) -1);
   6782 	  dyn = globals->root.dynamic_sections_created;
   6783 
   6784 	  if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   6785 	      || (info->shared
   6786 		  && SYMBOL_REFERENCES_LOCAL (info, h))
   6787 	      || (ELF_ST_VISIBILITY (h->other)
   6788 		  && h->root.type == bfd_link_hash_undefweak))
   6789 	    {
   6790 	      /* This is actually a static link, or it is a -Bsymbolic link
   6791 		 and the symbol is defined locally.  We must initialize this
   6792 		 entry in the global offset table.  Since the offset must
   6793 		 always be a multiple of 4, we use the least significant bit
   6794 		 to record whether we have initialized it already.
   6795 
   6796 		 When doing a dynamic link, we create a .rel(a).got relocation
   6797 		 entry to initialize the value.  This is done in the
   6798 		 finish_dynamic_symbol routine.  */
   6799 	      if ((off & 1) != 0)
   6800 		off &= ~1;
   6801 	      else
   6802 		{
   6803 		  /* If we are addressing a Thumb function, we need to
   6804 		     adjust the address by one, so that attempts to
   6805 		     call the function pointer will correctly
   6806 		     interpret it as Thumb code.  */
   6807 		  if (sym_flags == STT_ARM_TFUNC)
   6808 		    value |= 1;
   6809 
   6810 		  bfd_put_32 (output_bfd, value, sgot->contents + off);
   6811 		  h->got.offset |= 1;
   6812 		}
   6813 	    }
   6814 	  else
   6815 	    *unresolved_reloc_p = FALSE;
   6816 
   6817 	  value = sgot->output_offset + off;
   6818 	}
   6819       else
   6820 	{
   6821 	  bfd_vma off;
   6822 
   6823 	  BFD_ASSERT (local_got_offsets != NULL &&
   6824 		      local_got_offsets[r_symndx] != (bfd_vma) -1);
   6825 
   6826 	  off = local_got_offsets[r_symndx];
   6827 
   6828 	  /* The offset must always be a multiple of 4.  We use the
   6829 	     least significant bit to record whether we have already
   6830 	     generated the necessary reloc.  */
   6831 	  if ((off & 1) != 0)
   6832 	    off &= ~1;
   6833 	  else
   6834 	    {
   6835 	      /* If we are addressing a Thumb function, we need to
   6836 		 adjust the address by one, so that attempts to
   6837 		 call the function pointer will correctly
   6838 		 interpret it as Thumb code.  */
   6839 	      if (sym_flags == STT_ARM_TFUNC)
   6840 		value |= 1;
   6841 
   6842 	      if (globals->use_rel)
   6843 		bfd_put_32 (output_bfd, value, sgot->contents + off);
   6844 
   6845 	      if (info->shared)
   6846 		{
   6847 		  asection * srelgot;
   6848 		  Elf_Internal_Rela outrel;
   6849 		  bfd_byte *loc;
   6850 
   6851 		  srelgot = (bfd_get_section_by_name
   6852 			     (dynobj, RELOC_SECTION (globals, ".got")));
   6853 		  BFD_ASSERT (srelgot != NULL);
   6854 
   6855 		  outrel.r_addend = addend + value;
   6856 		  outrel.r_offset = (sgot->output_section->vma
   6857 				     + sgot->output_offset
   6858 				     + off);
   6859 		  outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
   6860 		  loc = srelgot->contents;
   6861 		  loc += srelgot->reloc_count++ * RELOC_SIZE (globals);
   6862 		  SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   6863 		}
   6864 
   6865 	      local_got_offsets[r_symndx] |= 1;
   6866 	    }
   6867 
   6868 	  value = sgot->output_offset + off;
   6869 	}
   6870       if (r_type != R_ARM_GOT32)
   6871 	value += sgot->output_section->vma;
   6872 
   6873       return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6874 				       contents, rel->r_offset, value,
   6875 				       rel->r_addend);
   6876 
   6877     case R_ARM_TLS_LDO32:
   6878       value = value - dtpoff_base (info);
   6879 
   6880       return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6881 				       contents, rel->r_offset, value,
   6882 				       rel->r_addend);
   6883 
   6884     case R_ARM_TLS_LDM32:
   6885       {
   6886 	bfd_vma off;
   6887 
   6888 	if (globals->sgot == NULL)
   6889 	  abort ();
   6890 
   6891 	off = globals->tls_ldm_got.offset;
   6892 
   6893 	if ((off & 1) != 0)
   6894 	  off &= ~1;
   6895 	else
   6896 	  {
   6897 	    /* If we don't know the module number, create a relocation
   6898 	       for it.  */
   6899 	    if (info->shared)
   6900 	      {
   6901 		Elf_Internal_Rela outrel;
   6902 		bfd_byte *loc;
   6903 
   6904 		if (globals->srelgot == NULL)
   6905 		  abort ();
   6906 
   6907 		outrel.r_addend = 0;
   6908 		outrel.r_offset = (globals->sgot->output_section->vma
   6909 				   + globals->sgot->output_offset + off);
   6910 		outrel.r_info = ELF32_R_INFO (0, R_ARM_TLS_DTPMOD32);
   6911 
   6912 		if (globals->use_rel)
   6913 		  bfd_put_32 (output_bfd, outrel.r_addend,
   6914 			      globals->sgot->contents + off);
   6915 
   6916 		loc = globals->srelgot->contents;
   6917 		loc += globals->srelgot->reloc_count++ * RELOC_SIZE (globals);
   6918 		SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   6919 	      }
   6920 	    else
   6921 	      bfd_put_32 (output_bfd, 1, globals->sgot->contents + off);
   6922 
   6923 	    globals->tls_ldm_got.offset |= 1;
   6924 	  }
   6925 
   6926 	value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
   6927 	  - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
   6928 
   6929 	return _bfd_final_link_relocate (howto, input_bfd, input_section,
   6930 					 contents, rel->r_offset, value,
   6931 					 rel->r_addend);
   6932       }
   6933 
   6934     case R_ARM_TLS_GD32:
   6935     case R_ARM_TLS_IE32:
   6936       {
   6937 	bfd_vma off;
   6938 	int indx;
   6939 	char tls_type;
   6940 
   6941 	if (globals->sgot == NULL)
   6942 	  abort ();
   6943 
   6944 	indx = 0;
   6945 	if (h != NULL)
   6946 	  {
   6947 	    bfd_boolean dyn;
   6948 	    dyn = globals->root.dynamic_sections_created;
   6949 	    if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   6950 		&& (!info->shared
   6951 		    || !SYMBOL_REFERENCES_LOCAL (info, h)))
   6952 	      {
   6953 		*unresolved_reloc_p = FALSE;
   6954 		indx = h->dynindx;
   6955 	      }
   6956 	    off = h->got.offset;
   6957 	    tls_type = ((struct elf32_arm_link_hash_entry *) h)->tls_type;
   6958 	  }
   6959 	else
   6960 	  {
   6961 	    if (local_got_offsets == NULL)
   6962 	      abort ();
   6963 	    off = local_got_offsets[r_symndx];
   6964 	    tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
   6965 	  }
   6966 
   6967 	if (tls_type == GOT_UNKNOWN)
   6968 	  abort ();
   6969 
   6970 	if ((off & 1) != 0)
   6971 	  off &= ~1;
   6972 	else
   6973 	  {
   6974 	    bfd_boolean need_relocs = FALSE;
   6975 	    Elf_Internal_Rela outrel;
   6976 	    bfd_byte *loc = NULL;
   6977 	    int cur_off = off;
   6978 
   6979 	    /* The GOT entries have not been initialized yet.  Do it
   6980 	       now, and emit any relocations.  If both an IE GOT and a
   6981 	       GD GOT are necessary, we emit the GD first.  */
   6982 
   6983 	    if ((info->shared || indx != 0)
   6984 		&& (h == NULL
   6985 		    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   6986 		    || h->root.type != bfd_link_hash_undefweak))
   6987 	      {
   6988 		need_relocs = TRUE;
   6989 		if (globals->srelgot == NULL)
   6990 		  abort ();
   6991 		loc = globals->srelgot->contents;
   6992 		loc += globals->srelgot->reloc_count * RELOC_SIZE (globals);
   6993 	      }
   6994 
   6995 	    if (tls_type & GOT_TLS_GD)
   6996 	      {
   6997 		if (need_relocs)
   6998 		  {
   6999 		    outrel.r_addend = 0;
   7000 		    outrel.r_offset = (globals->sgot->output_section->vma
   7001 				       + globals->sgot->output_offset
   7002 				       + cur_off);
   7003 		    outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_DTPMOD32);
   7004 
   7005 		    if (globals->use_rel)
   7006 		      bfd_put_32 (output_bfd, outrel.r_addend,
   7007 				  globals->sgot->contents + cur_off);
   7008 
   7009 		    SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   7010 		    globals->srelgot->reloc_count++;
   7011 		    loc += RELOC_SIZE (globals);
   7012 
   7013 		    if (indx == 0)
   7014 		      bfd_put_32 (output_bfd, value - dtpoff_base (info),
   7015 				  globals->sgot->contents + cur_off + 4);
   7016 		    else
   7017 		      {
   7018 			outrel.r_addend = 0;
   7019 			outrel.r_info = ELF32_R_INFO (indx,
   7020 						      R_ARM_TLS_DTPOFF32);
   7021 			outrel.r_offset += 4;
   7022 
   7023 			if (globals->use_rel)
   7024 			  bfd_put_32 (output_bfd, outrel.r_addend,
   7025 				      globals->sgot->contents + cur_off + 4);
   7026 
   7027 
   7028 			SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   7029 			globals->srelgot->reloc_count++;
   7030 			loc += RELOC_SIZE (globals);
   7031 		      }
   7032 		  }
   7033 		else
   7034 		  {
   7035 		    /* If we are not emitting relocations for a
   7036 		       general dynamic reference, then we must be in a
   7037 		       static link or an executable link with the
   7038 		       symbol binding locally.  Mark it as belonging
   7039 		       to module 1, the executable.  */
   7040 		    bfd_put_32 (output_bfd, 1,
   7041 				globals->sgot->contents + cur_off);
   7042 		    bfd_put_32 (output_bfd, value - dtpoff_base (info),
   7043 				globals->sgot->contents + cur_off + 4);
   7044 		  }
   7045 
   7046 		cur_off += 8;
   7047 	      }
   7048 
   7049 	    if (tls_type & GOT_TLS_IE)
   7050 	      {
   7051 		if (need_relocs)
   7052 		  {
   7053 		    if (indx == 0)
   7054 		      outrel.r_addend = value - dtpoff_base (info);
   7055 		    else
   7056 		      outrel.r_addend = 0;
   7057 		    outrel.r_offset = (globals->sgot->output_section->vma
   7058 				       + globals->sgot->output_offset
   7059 				       + cur_off);
   7060 		    outrel.r_info = ELF32_R_INFO (indx, R_ARM_TLS_TPOFF32);
   7061 
   7062 		    if (globals->use_rel)
   7063 		      bfd_put_32 (output_bfd, outrel.r_addend,
   7064 				  globals->sgot->contents + cur_off);
   7065 
   7066 		    SWAP_RELOC_OUT (globals) (output_bfd, &outrel, loc);
   7067 		    globals->srelgot->reloc_count++;
   7068 		    loc += RELOC_SIZE (globals);
   7069 		  }
   7070 		else
   7071 		  bfd_put_32 (output_bfd, tpoff (info, value),
   7072 			      globals->sgot->contents + cur_off);
   7073 		cur_off += 4;
   7074 	      }
   7075 
   7076 	    if (h != NULL)
   7077 	      h->got.offset |= 1;
   7078 	    else
   7079 	      local_got_offsets[r_symndx] |= 1;
   7080 	  }
   7081 
   7082 	if ((tls_type & GOT_TLS_GD) && r_type != R_ARM_TLS_GD32)
   7083 	  off += 8;
   7084 	value = globals->sgot->output_section->vma + globals->sgot->output_offset + off
   7085 	  - (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
   7086 
   7087 	return _bfd_final_link_relocate (howto, input_bfd, input_section,
   7088 					 contents, rel->r_offset, value,
   7089 					 rel->r_addend);
   7090       }
   7091 
   7092     case R_ARM_TLS_LE32:
   7093       if (info->shared)
   7094 	{
   7095 	  (*_bfd_error_handler)
   7096 	    (_("%B(%A+0x%lx): R_ARM_TLS_LE32 relocation not permitted in shared object"),
   7097 	     input_bfd, input_section,
   7098 	     (long) rel->r_offset, howto->name);
   7099 	  return FALSE;
   7100 	}
   7101       else
   7102 	value = tpoff (info, value);
   7103 
   7104       return _bfd_final_link_relocate (howto, input_bfd, input_section,
   7105 				       contents, rel->r_offset, value,
   7106 				       rel->r_addend);
   7107 
   7108     case R_ARM_V4BX:
   7109       if (globals->fix_v4bx)
   7110 	{
   7111 	  bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7112 
   7113 	  /* Ensure that we have a BX instruction.  */
   7114 	  BFD_ASSERT ((insn & 0x0ffffff0) == 0x012fff10);
   7115 
   7116 	  if (globals->fix_v4bx == 2 && (insn & 0xf) != 0xf)
   7117 	    {
   7118 	      /* Branch to veneer.  */
   7119 	      bfd_vma glue_addr;
   7120 	      glue_addr = elf32_arm_bx_glue (info, insn & 0xf);
   7121 	      glue_addr -= input_section->output_section->vma
   7122 			   + input_section->output_offset
   7123 			   + rel->r_offset + 8;
   7124 	      insn = (insn & 0xf0000000) | 0x0a000000
   7125 		     | ((glue_addr >> 2) & 0x00ffffff);
   7126 	    }
   7127 	  else
   7128 	    {
   7129 	      /* Preserve Rm (lowest four bits) and the condition code
   7130 		 (highest four bits). Other bits encode MOV PC,Rm.  */
   7131 	      insn = (insn & 0xf000000f) | 0x01a0f000;
   7132 	    }
   7133 
   7134 	  bfd_put_32 (input_bfd, insn, hit_data);
   7135 	}
   7136       return bfd_reloc_ok;
   7137 
   7138     case R_ARM_MOVW_ABS_NC:
   7139     case R_ARM_MOVT_ABS:
   7140     case R_ARM_MOVW_PREL_NC:
   7141     case R_ARM_MOVT_PREL:
   7142     /* Until we properly support segment-base-relative addressing then
   7143        we assume the segment base to be zero, as for the group relocations.
   7144        Thus R_ARM_MOVW_BREL_NC has the same semantics as R_ARM_MOVW_ABS_NC
   7145        and R_ARM_MOVT_BREL has the same semantics as R_ARM_MOVT_ABS.  */
   7146     case R_ARM_MOVW_BREL_NC:
   7147     case R_ARM_MOVW_BREL:
   7148     case R_ARM_MOVT_BREL:
   7149       {
   7150 	bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7151 
   7152 	if (globals->use_rel)
   7153 	  {
   7154 	    addend = ((insn >> 4) & 0xf000) | (insn & 0xfff);
   7155 	    signed_addend = (addend ^ 0x8000) - 0x8000;
   7156 	  }
   7157 
   7158 	value += signed_addend;
   7159 
   7160 	if (r_type == R_ARM_MOVW_PREL_NC || r_type == R_ARM_MOVT_PREL)
   7161 	  value -= (input_section->output_section->vma
   7162 		    + input_section->output_offset + rel->r_offset);
   7163 
   7164 	if (r_type == R_ARM_MOVW_BREL && value >= 0x10000)
   7165           return bfd_reloc_overflow;
   7166 
   7167 	if (sym_flags == STT_ARM_TFUNC)
   7168 	  value |= 1;
   7169 
   7170 	if (r_type == R_ARM_MOVT_ABS || r_type == R_ARM_MOVT_PREL
   7171             || r_type == R_ARM_MOVT_BREL)
   7172 	  value >>= 16;
   7173 
   7174 	insn &= 0xfff0f000;
   7175 	insn |= value & 0xfff;
   7176 	insn |= (value & 0xf000) << 4;
   7177 	bfd_put_32 (input_bfd, insn, hit_data);
   7178       }
   7179       return bfd_reloc_ok;
   7180 
   7181     case R_ARM_THM_MOVW_ABS_NC:
   7182     case R_ARM_THM_MOVT_ABS:
   7183     case R_ARM_THM_MOVW_PREL_NC:
   7184     case R_ARM_THM_MOVT_PREL:
   7185     /* Until we properly support segment-base-relative addressing then
   7186        we assume the segment base to be zero, as for the above relocations.
   7187        Thus R_ARM_THM_MOVW_BREL_NC has the same semantics as
   7188        R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_BREL has the same semantics
   7189        as R_ARM_THM_MOVT_ABS.  */
   7190     case R_ARM_THM_MOVW_BREL_NC:
   7191     case R_ARM_THM_MOVW_BREL:
   7192     case R_ARM_THM_MOVT_BREL:
   7193       {
   7194 	bfd_vma insn;
   7195 
   7196 	insn = bfd_get_16 (input_bfd, hit_data) << 16;
   7197 	insn |= bfd_get_16 (input_bfd, hit_data + 2);
   7198 
   7199 	if (globals->use_rel)
   7200 	  {
   7201 	    addend = ((insn >> 4)  & 0xf000)
   7202 		   | ((insn >> 15) & 0x0800)
   7203 		   | ((insn >> 4)  & 0x0700)
   7204 		   | (insn         & 0x00ff);
   7205 	    signed_addend = (addend ^ 0x8000) - 0x8000;
   7206 	  }
   7207 
   7208 	value += signed_addend;
   7209 
   7210 	if (r_type == R_ARM_THM_MOVW_PREL_NC || r_type == R_ARM_THM_MOVT_PREL)
   7211 	  value -= (input_section->output_section->vma
   7212 		    + input_section->output_offset + rel->r_offset);
   7213 
   7214 	if (r_type == R_ARM_THM_MOVW_BREL && value >= 0x10000)
   7215           return bfd_reloc_overflow;
   7216 
   7217 	if (sym_flags == STT_ARM_TFUNC)
   7218 	  value |= 1;
   7219 
   7220 	if (r_type == R_ARM_THM_MOVT_ABS || r_type == R_ARM_THM_MOVT_PREL
   7221             || r_type == R_ARM_THM_MOVT_BREL)
   7222 	  value >>= 16;
   7223 
   7224 	insn &= 0xfbf08f00;
   7225 	insn |= (value & 0xf000) << 4;
   7226 	insn |= (value & 0x0800) << 15;
   7227 	insn |= (value & 0x0700) << 4;
   7228 	insn |= (value & 0x00ff);
   7229 
   7230 	bfd_put_16 (input_bfd, insn >> 16, hit_data);
   7231 	bfd_put_16 (input_bfd, insn & 0xffff, hit_data + 2);
   7232       }
   7233       return bfd_reloc_ok;
   7234 
   7235     case R_ARM_ALU_PC_G0_NC:
   7236     case R_ARM_ALU_PC_G1_NC:
   7237     case R_ARM_ALU_PC_G0:
   7238     case R_ARM_ALU_PC_G1:
   7239     case R_ARM_ALU_PC_G2:
   7240     case R_ARM_ALU_SB_G0_NC:
   7241     case R_ARM_ALU_SB_G1_NC:
   7242     case R_ARM_ALU_SB_G0:
   7243     case R_ARM_ALU_SB_G1:
   7244     case R_ARM_ALU_SB_G2:
   7245       {
   7246 	bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7247         bfd_vma pc = input_section->output_section->vma
   7248 		     + input_section->output_offset + rel->r_offset;
   7249         /* sb should be the origin of the *segment* containing the symbol.
   7250            It is not clear how to obtain this OS-dependent value, so we
   7251            make an arbitrary choice of zero.  */
   7252         bfd_vma sb = 0;
   7253         bfd_vma residual;
   7254         bfd_vma g_n;
   7255 	bfd_signed_vma signed_value;
   7256         int group = 0;
   7257 
   7258         /* Determine which group of bits to select.  */
   7259         switch (r_type)
   7260           {
   7261           case R_ARM_ALU_PC_G0_NC:
   7262           case R_ARM_ALU_PC_G0:
   7263           case R_ARM_ALU_SB_G0_NC:
   7264           case R_ARM_ALU_SB_G0:
   7265             group = 0;
   7266             break;
   7267 
   7268           case R_ARM_ALU_PC_G1_NC:
   7269           case R_ARM_ALU_PC_G1:
   7270           case R_ARM_ALU_SB_G1_NC:
   7271           case R_ARM_ALU_SB_G1:
   7272             group = 1;
   7273             break;
   7274 
   7275           case R_ARM_ALU_PC_G2:
   7276           case R_ARM_ALU_SB_G2:
   7277             group = 2;
   7278             break;
   7279 
   7280           default:
   7281             abort ();
   7282           }
   7283 
   7284         /* If REL, extract the addend from the insn.  If RELA, it will
   7285            have already been fetched for us.  */
   7286 	if (globals->use_rel)
   7287           {
   7288             int negative;
   7289             bfd_vma constant = insn & 0xff;
   7290             bfd_vma rotation = (insn & 0xf00) >> 8;
   7291 
   7292             if (rotation == 0)
   7293               signed_addend = constant;
   7294             else
   7295               {
   7296                 /* Compensate for the fact that in the instruction, the
   7297                    rotation is stored in multiples of 2 bits.  */
   7298                 rotation *= 2;
   7299 
   7300                 /* Rotate "constant" right by "rotation" bits.  */
   7301                 signed_addend = (constant >> rotation) |
   7302                                 (constant << (8 * sizeof (bfd_vma) - rotation));
   7303               }
   7304 
   7305             /* Determine if the instruction is an ADD or a SUB.
   7306                (For REL, this determines the sign of the addend.)  */
   7307             negative = identify_add_or_sub (insn);
   7308             if (negative == 0)
   7309               {
   7310                 (*_bfd_error_handler)
   7311                   (_("%B(%A+0x%lx): Only ADD or SUB instructions are allowed for ALU group relocations"),
   7312                   input_bfd, input_section,
   7313                   (long) rel->r_offset, howto->name);
   7314                 return bfd_reloc_overflow;
   7315     	      }
   7316 
   7317             signed_addend *= negative;
   7318           }
   7319 
   7320 	/* Compute the value (X) to go in the place.  */
   7321         if (r_type == R_ARM_ALU_PC_G0_NC
   7322             || r_type == R_ARM_ALU_PC_G1_NC
   7323             || r_type == R_ARM_ALU_PC_G0
   7324             || r_type == R_ARM_ALU_PC_G1
   7325             || r_type == R_ARM_ALU_PC_G2)
   7326           /* PC relative.  */
   7327           signed_value = value - pc + signed_addend;
   7328         else
   7329           /* Section base relative.  */
   7330           signed_value = value - sb + signed_addend;
   7331 
   7332         /* If the target symbol is a Thumb function, then set the
   7333            Thumb bit in the address.  */
   7334 	if (sym_flags == STT_ARM_TFUNC)
   7335 	  signed_value |= 1;
   7336 
   7337         /* Calculate the value of the relevant G_n, in encoded
   7338            constant-with-rotation format.  */
   7339         g_n = calculate_group_reloc_mask (abs (signed_value), group,
   7340                                           &residual);
   7341 
   7342         /* Check for overflow if required.  */
   7343         if ((r_type == R_ARM_ALU_PC_G0
   7344              || r_type == R_ARM_ALU_PC_G1
   7345              || r_type == R_ARM_ALU_PC_G2
   7346              || r_type == R_ARM_ALU_SB_G0
   7347              || r_type == R_ARM_ALU_SB_G1
   7348              || r_type == R_ARM_ALU_SB_G2) && residual != 0)
   7349           {
   7350             (*_bfd_error_handler)
   7351               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
   7352               input_bfd, input_section,
   7353               (long) rel->r_offset, abs (signed_value), howto->name);
   7354             return bfd_reloc_overflow;
   7355           }
   7356 
   7357         /* Mask out the value and the ADD/SUB part of the opcode; take care
   7358            not to destroy the S bit.  */
   7359         insn &= 0xff1ff000;
   7360 
   7361         /* Set the opcode according to whether the value to go in the
   7362            place is negative.  */
   7363         if (signed_value < 0)
   7364           insn |= 1 << 22;
   7365         else
   7366           insn |= 1 << 23;
   7367 
   7368         /* Encode the offset.  */
   7369         insn |= g_n;
   7370 
   7371 	bfd_put_32 (input_bfd, insn, hit_data);
   7372       }
   7373       return bfd_reloc_ok;
   7374 
   7375     case R_ARM_LDR_PC_G0:
   7376     case R_ARM_LDR_PC_G1:
   7377     case R_ARM_LDR_PC_G2:
   7378     case R_ARM_LDR_SB_G0:
   7379     case R_ARM_LDR_SB_G1:
   7380     case R_ARM_LDR_SB_G2:
   7381       {
   7382 	bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7383         bfd_vma pc = input_section->output_section->vma
   7384 		     + input_section->output_offset + rel->r_offset;
   7385         bfd_vma sb = 0; /* See note above.  */
   7386         bfd_vma residual;
   7387 	bfd_signed_vma signed_value;
   7388         int group = 0;
   7389 
   7390         /* Determine which groups of bits to calculate.  */
   7391         switch (r_type)
   7392           {
   7393           case R_ARM_LDR_PC_G0:
   7394           case R_ARM_LDR_SB_G0:
   7395             group = 0;
   7396             break;
   7397 
   7398           case R_ARM_LDR_PC_G1:
   7399           case R_ARM_LDR_SB_G1:
   7400             group = 1;
   7401             break;
   7402 
   7403           case R_ARM_LDR_PC_G2:
   7404           case R_ARM_LDR_SB_G2:
   7405             group = 2;
   7406             break;
   7407 
   7408           default:
   7409             abort ();
   7410           }
   7411 
   7412         /* If REL, extract the addend from the insn.  If RELA, it will
   7413            have already been fetched for us.  */
   7414 	if (globals->use_rel)
   7415           {
   7416             int negative = (insn & (1 << 23)) ? 1 : -1;
   7417             signed_addend = negative * (insn & 0xfff);
   7418           }
   7419 
   7420 	/* Compute the value (X) to go in the place.  */
   7421         if (r_type == R_ARM_LDR_PC_G0
   7422             || r_type == R_ARM_LDR_PC_G1
   7423             || r_type == R_ARM_LDR_PC_G2)
   7424           /* PC relative.  */
   7425           signed_value = value - pc + signed_addend;
   7426         else
   7427           /* Section base relative.  */
   7428           signed_value = value - sb + signed_addend;
   7429 
   7430         /* Calculate the value of the relevant G_{n-1} to obtain
   7431            the residual at that stage.  */
   7432         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
   7433 
   7434         /* Check for overflow.  */
   7435         if (residual >= 0x1000)
   7436           {
   7437             (*_bfd_error_handler)
   7438               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
   7439               input_bfd, input_section,
   7440               (long) rel->r_offset, abs (signed_value), howto->name);
   7441             return bfd_reloc_overflow;
   7442           }
   7443 
   7444         /* Mask out the value and U bit.  */
   7445         insn &= 0xff7ff000;
   7446 
   7447         /* Set the U bit if the value to go in the place is non-negative.  */
   7448         if (signed_value >= 0)
   7449           insn |= 1 << 23;
   7450 
   7451         /* Encode the offset.  */
   7452         insn |= residual;
   7453 
   7454 	bfd_put_32 (input_bfd, insn, hit_data);
   7455       }
   7456       return bfd_reloc_ok;
   7457 
   7458     case R_ARM_LDRS_PC_G0:
   7459     case R_ARM_LDRS_PC_G1:
   7460     case R_ARM_LDRS_PC_G2:
   7461     case R_ARM_LDRS_SB_G0:
   7462     case R_ARM_LDRS_SB_G1:
   7463     case R_ARM_LDRS_SB_G2:
   7464       {
   7465 	bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7466         bfd_vma pc = input_section->output_section->vma
   7467 		     + input_section->output_offset + rel->r_offset;
   7468         bfd_vma sb = 0; /* See note above.  */
   7469         bfd_vma residual;
   7470 	bfd_signed_vma signed_value;
   7471         int group = 0;
   7472 
   7473         /* Determine which groups of bits to calculate.  */
   7474         switch (r_type)
   7475           {
   7476           case R_ARM_LDRS_PC_G0:
   7477           case R_ARM_LDRS_SB_G0:
   7478             group = 0;
   7479             break;
   7480 
   7481           case R_ARM_LDRS_PC_G1:
   7482           case R_ARM_LDRS_SB_G1:
   7483             group = 1;
   7484             break;
   7485 
   7486           case R_ARM_LDRS_PC_G2:
   7487           case R_ARM_LDRS_SB_G2:
   7488             group = 2;
   7489             break;
   7490 
   7491           default:
   7492             abort ();
   7493           }
   7494 
   7495         /* If REL, extract the addend from the insn.  If RELA, it will
   7496            have already been fetched for us.  */
   7497 	if (globals->use_rel)
   7498           {
   7499             int negative = (insn & (1 << 23)) ? 1 : -1;
   7500             signed_addend = negative * (((insn & 0xf00) >> 4) + (insn & 0xf));
   7501           }
   7502 
   7503 	/* Compute the value (X) to go in the place.  */
   7504         if (r_type == R_ARM_LDRS_PC_G0
   7505             || r_type == R_ARM_LDRS_PC_G1
   7506             || r_type == R_ARM_LDRS_PC_G2)
   7507           /* PC relative.  */
   7508           signed_value = value - pc + signed_addend;
   7509         else
   7510           /* Section base relative.  */
   7511           signed_value = value - sb + signed_addend;
   7512 
   7513         /* Calculate the value of the relevant G_{n-1} to obtain
   7514            the residual at that stage.  */
   7515         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
   7516 
   7517         /* Check for overflow.  */
   7518         if (residual >= 0x100)
   7519           {
   7520             (*_bfd_error_handler)
   7521               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
   7522               input_bfd, input_section,
   7523               (long) rel->r_offset, abs (signed_value), howto->name);
   7524             return bfd_reloc_overflow;
   7525           }
   7526 
   7527         /* Mask out the value and U bit.  */
   7528         insn &= 0xff7ff0f0;
   7529 
   7530         /* Set the U bit if the value to go in the place is non-negative.  */
   7531         if (signed_value >= 0)
   7532           insn |= 1 << 23;
   7533 
   7534         /* Encode the offset.  */
   7535         insn |= ((residual & 0xf0) << 4) | (residual & 0xf);
   7536 
   7537 	bfd_put_32 (input_bfd, insn, hit_data);
   7538       }
   7539       return bfd_reloc_ok;
   7540 
   7541     case R_ARM_LDC_PC_G0:
   7542     case R_ARM_LDC_PC_G1:
   7543     case R_ARM_LDC_PC_G2:
   7544     case R_ARM_LDC_SB_G0:
   7545     case R_ARM_LDC_SB_G1:
   7546     case R_ARM_LDC_SB_G2:
   7547       {
   7548 	bfd_vma insn = bfd_get_32 (input_bfd, hit_data);
   7549         bfd_vma pc = input_section->output_section->vma
   7550 		     + input_section->output_offset + rel->r_offset;
   7551         bfd_vma sb = 0; /* See note above.  */
   7552         bfd_vma residual;
   7553 	bfd_signed_vma signed_value;
   7554         int group = 0;
   7555 
   7556         /* Determine which groups of bits to calculate.  */
   7557         switch (r_type)
   7558           {
   7559           case R_ARM_LDC_PC_G0:
   7560           case R_ARM_LDC_SB_G0:
   7561             group = 0;
   7562             break;
   7563 
   7564           case R_ARM_LDC_PC_G1:
   7565           case R_ARM_LDC_SB_G1:
   7566             group = 1;
   7567             break;
   7568 
   7569           case R_ARM_LDC_PC_G2:
   7570           case R_ARM_LDC_SB_G2:
   7571             group = 2;
   7572             break;
   7573 
   7574           default:
   7575             abort ();
   7576           }
   7577 
   7578         /* If REL, extract the addend from the insn.  If RELA, it will
   7579            have already been fetched for us.  */
   7580 	if (globals->use_rel)
   7581           {
   7582             int negative = (insn & (1 << 23)) ? 1 : -1;
   7583             signed_addend = negative * ((insn & 0xff) << 2);
   7584           }
   7585 
   7586 	/* Compute the value (X) to go in the place.  */
   7587         if (r_type == R_ARM_LDC_PC_G0
   7588             || r_type == R_ARM_LDC_PC_G1
   7589             || r_type == R_ARM_LDC_PC_G2)
   7590           /* PC relative.  */
   7591           signed_value = value - pc + signed_addend;
   7592         else
   7593           /* Section base relative.  */
   7594           signed_value = value - sb + signed_addend;
   7595 
   7596         /* Calculate the value of the relevant G_{n-1} to obtain
   7597            the residual at that stage.  */
   7598         calculate_group_reloc_mask (abs (signed_value), group - 1, &residual);
   7599 
   7600         /* Check for overflow.  (The absolute value to go in the place must be
   7601            divisible by four and, after having been divided by four, must
   7602            fit in eight bits.)  */
   7603         if ((residual & 0x3) != 0 || residual >= 0x400)
   7604           {
   7605             (*_bfd_error_handler)
   7606               (_("%B(%A+0x%lx): Overflow whilst splitting 0x%lx for group relocation %s"),
   7607               input_bfd, input_section,
   7608               (long) rel->r_offset, abs (signed_value), howto->name);
   7609             return bfd_reloc_overflow;
   7610           }
   7611 
   7612         /* Mask out the value and U bit.  */
   7613         insn &= 0xff7fff00;
   7614 
   7615         /* Set the U bit if the value to go in the place is non-negative.  */
   7616         if (signed_value >= 0)
   7617           insn |= 1 << 23;
   7618 
   7619         /* Encode the offset.  */
   7620         insn |= residual >> 2;
   7621 
   7622 	bfd_put_32 (input_bfd, insn, hit_data);
   7623       }
   7624       return bfd_reloc_ok;
   7625 
   7626     default:
   7627       return bfd_reloc_notsupported;
   7628     }
   7629 }
   7630 
   7631 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS.  */
   7632 static void
   7633 arm_add_to_rel (bfd *              abfd,
   7634 		bfd_byte *         address,
   7635 		reloc_howto_type * howto,
   7636 		bfd_signed_vma     increment)
   7637 {
   7638   bfd_signed_vma addend;
   7639 
   7640   if (howto->type == R_ARM_THM_CALL
   7641       || howto->type == R_ARM_THM_JUMP24)
   7642     {
   7643       int upper_insn, lower_insn;
   7644       int upper, lower;
   7645 
   7646       upper_insn = bfd_get_16 (abfd, address);
   7647       lower_insn = bfd_get_16 (abfd, address + 2);
   7648       upper = upper_insn & 0x7ff;
   7649       lower = lower_insn & 0x7ff;
   7650 
   7651       addend = (upper << 12) | (lower << 1);
   7652       addend += increment;
   7653       addend >>= 1;
   7654 
   7655       upper_insn = (upper_insn & 0xf800) | ((addend >> 11) & 0x7ff);
   7656       lower_insn = (lower_insn & 0xf800) | (addend & 0x7ff);
   7657 
   7658       bfd_put_16 (abfd, (bfd_vma) upper_insn, address);
   7659       bfd_put_16 (abfd, (bfd_vma) lower_insn, address + 2);
   7660     }
   7661   else
   7662     {
   7663       bfd_vma        contents;
   7664 
   7665       contents = bfd_get_32 (abfd, address);
   7666 
   7667       /* Get the (signed) value from the instruction.  */
   7668       addend = contents & howto->src_mask;
   7669       if (addend & ((howto->src_mask + 1) >> 1))
   7670 	{
   7671 	  bfd_signed_vma mask;
   7672 
   7673 	  mask = -1;
   7674 	  mask &= ~ howto->src_mask;
   7675 	  addend |= mask;
   7676 	}
   7677 
   7678       /* Add in the increment, (which is a byte value).  */
   7679       switch (howto->type)
   7680 	{
   7681 	default:
   7682 	  addend += increment;
   7683 	  break;
   7684 
   7685 	case R_ARM_PC24:
   7686 	case R_ARM_PLT32:
   7687 	case R_ARM_CALL:
   7688 	case R_ARM_JUMP24:
   7689 	  addend <<= howto->size;
   7690 	  addend += increment;
   7691 
   7692 	  /* Should we check for overflow here ?  */
   7693 
   7694 	  /* Drop any undesired bits.  */
   7695 	  addend >>= howto->rightshift;
   7696 	  break;
   7697 	}
   7698 
   7699       contents = (contents & ~ howto->dst_mask) | (addend & howto->dst_mask);
   7700 
   7701       bfd_put_32 (abfd, contents, address);
   7702     }
   7703 }
   7704 
   7705 #define IS_ARM_TLS_RELOC(R_TYPE)	\
   7706   ((R_TYPE) == R_ARM_TLS_GD32		\
   7707    || (R_TYPE) == R_ARM_TLS_LDO32	\
   7708    || (R_TYPE) == R_ARM_TLS_LDM32	\
   7709    || (R_TYPE) == R_ARM_TLS_DTPOFF32	\
   7710    || (R_TYPE) == R_ARM_TLS_DTPMOD32	\
   7711    || (R_TYPE) == R_ARM_TLS_TPOFF32	\
   7712    || (R_TYPE) == R_ARM_TLS_LE32	\
   7713    || (R_TYPE) == R_ARM_TLS_IE32)
   7714 
   7715 /* Relocate an ARM ELF section.  */
   7716 
   7717 static bfd_boolean
   7718 elf32_arm_relocate_section (bfd *                  output_bfd,
   7719 			    struct bfd_link_info * info,
   7720 			    bfd *                  input_bfd,
   7721 			    asection *             input_section,
   7722 			    bfd_byte *             contents,
   7723 			    Elf_Internal_Rela *    relocs,
   7724 			    Elf_Internal_Sym *     local_syms,
   7725 			    asection **            local_sections)
   7726 {
   7727   Elf_Internal_Shdr *symtab_hdr;
   7728   struct elf_link_hash_entry **sym_hashes;
   7729   Elf_Internal_Rela *rel;
   7730   Elf_Internal_Rela *relend;
   7731   const char *name;
   7732   struct elf32_arm_link_hash_table * globals;
   7733 
   7734   globals = elf32_arm_hash_table (info);
   7735 
   7736   symtab_hdr = & elf_symtab_hdr (input_bfd);
   7737   sym_hashes = elf_sym_hashes (input_bfd);
   7738 
   7739   rel = relocs;
   7740   relend = relocs + input_section->reloc_count;
   7741   for (; rel < relend; rel++)
   7742     {
   7743       int                          r_type;
   7744       reloc_howto_type *           howto;
   7745       unsigned long                r_symndx;
   7746       Elf_Internal_Sym *           sym;
   7747       asection *                   sec;
   7748       struct elf_link_hash_entry * h;
   7749       bfd_vma                      relocation;
   7750       bfd_reloc_status_type        r;
   7751       arelent                      bfd_reloc;
   7752       char                         sym_type;
   7753       bfd_boolean                  unresolved_reloc = FALSE;
   7754       char *error_message = NULL;
   7755 
   7756       r_symndx = ELF32_R_SYM (rel->r_info);
   7757       r_type   = ELF32_R_TYPE (rel->r_info);
   7758       r_type   = arm_real_reloc_type (globals, r_type);
   7759 
   7760       if (   r_type == R_ARM_GNU_VTENTRY
   7761           || r_type == R_ARM_GNU_VTINHERIT)
   7762         continue;
   7763 
   7764       bfd_reloc.howto = elf32_arm_howto_from_type (r_type);
   7765       howto = bfd_reloc.howto;
   7766 
   7767       h = NULL;
   7768       sym = NULL;
   7769       sec = NULL;
   7770 
   7771       if (r_symndx < symtab_hdr->sh_info)
   7772 	{
   7773 	  sym = local_syms + r_symndx;
   7774 	  sym_type = ELF32_ST_TYPE (sym->st_info);
   7775 	  sec = local_sections[r_symndx];
   7776 	  if (globals->use_rel)
   7777 	    {
   7778 	      relocation = (sec->output_section->vma
   7779 			    + sec->output_offset
   7780 			    + sym->st_value);
   7781 	      if (!info->relocatable
   7782 		  && (sec->flags & SEC_MERGE)
   7783 		  && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   7784 		{
   7785 		  asection *msec;
   7786 		  bfd_vma addend, value;
   7787 
   7788 		  switch (r_type)
   7789 		    {
   7790 		    case R_ARM_MOVW_ABS_NC:
   7791 		    case R_ARM_MOVT_ABS:
   7792 		      value = bfd_get_32 (input_bfd, contents + rel->r_offset);
   7793 		      addend = ((value & 0xf0000) >> 4) | (value & 0xfff);
   7794 		      addend = (addend ^ 0x8000) - 0x8000;
   7795 		      break;
   7796 
   7797 		    case R_ARM_THM_MOVW_ABS_NC:
   7798 		    case R_ARM_THM_MOVT_ABS:
   7799 		      value = bfd_get_16 (input_bfd, contents + rel->r_offset)
   7800 			      << 16;
   7801 		      value |= bfd_get_16 (input_bfd,
   7802 					   contents + rel->r_offset + 2);
   7803 		      addend = ((value & 0xf7000) >> 4) | (value & 0xff)
   7804 			       | ((value & 0x04000000) >> 15);
   7805 		      addend = (addend ^ 0x8000) - 0x8000;
   7806 		      break;
   7807 
   7808 		    default:
   7809 		      if (howto->rightshift
   7810 			  || (howto->src_mask & (howto->src_mask + 1)))
   7811 			{
   7812 			  (*_bfd_error_handler)
   7813 			    (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
   7814 			     input_bfd, input_section,
   7815 			     (long) rel->r_offset, howto->name);
   7816 			  return FALSE;
   7817 			}
   7818 
   7819 		      value = bfd_get_32 (input_bfd, contents + rel->r_offset);
   7820 
   7821 		      /* Get the (signed) value from the instruction.  */
   7822 		      addend = value & howto->src_mask;
   7823 		      if (addend & ((howto->src_mask + 1) >> 1))
   7824 			{
   7825 			  bfd_signed_vma mask;
   7826 
   7827 			  mask = -1;
   7828 			  mask &= ~ howto->src_mask;
   7829 			  addend |= mask;
   7830 			}
   7831 		      break;
   7832 		    }
   7833 
   7834 		  msec = sec;
   7835 		  addend =
   7836 		    _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
   7837 		    - relocation;
   7838 		  addend += msec->output_section->vma + msec->output_offset;
   7839 
   7840 		  /* Cases here must match those in the preceeding
   7841 		     switch statement.  */
   7842 		  switch (r_type)
   7843 		    {
   7844 		    case R_ARM_MOVW_ABS_NC:
   7845 		    case R_ARM_MOVT_ABS:
   7846 		      value = (value & 0xfff0f000) | ((addend & 0xf000) << 4)
   7847 			      | (addend & 0xfff);
   7848 		      bfd_put_32 (input_bfd, value, contents + rel->r_offset);
   7849 		      break;
   7850 
   7851 		    case R_ARM_THM_MOVW_ABS_NC:
   7852 		    case R_ARM_THM_MOVT_ABS:
   7853 		      value = (value & 0xfbf08f00) | ((addend & 0xf700) << 4)
   7854 			      | (addend & 0xff) | ((addend & 0x0800) << 15);
   7855 		      bfd_put_16 (input_bfd, value >> 16,
   7856 				  contents + rel->r_offset);
   7857 		      bfd_put_16 (input_bfd, value,
   7858 				  contents + rel->r_offset + 2);
   7859 		      break;
   7860 
   7861 		    default:
   7862 		      value = (value & ~ howto->dst_mask)
   7863 			      | (addend & howto->dst_mask);
   7864 		      bfd_put_32 (input_bfd, value, contents + rel->r_offset);
   7865 		      break;
   7866 		    }
   7867 		}
   7868 	    }
   7869 	  else
   7870 	    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   7871 	}
   7872       else
   7873 	{
   7874 	  bfd_boolean warned;
   7875 
   7876 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   7877 				   r_symndx, symtab_hdr, sym_hashes,
   7878 				   h, sec, relocation,
   7879 				   unresolved_reloc, warned);
   7880 
   7881 	  sym_type = h->type;
   7882 	}
   7883 
   7884       if (sec != NULL && elf_discarded_section (sec))
   7885 	{
   7886 	  /* For relocs against symbols from removed linkonce sections,
   7887 	     or sections discarded by a linker script, we just want the
   7888 	     section contents zeroed.  Avoid any special processing.  */
   7889 	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
   7890 	  rel->r_info = 0;
   7891 	  rel->r_addend = 0;
   7892 	  continue;
   7893 	}
   7894 
   7895       if (info->relocatable)
   7896 	{
   7897 	  /* This is a relocatable link.  We don't have to change
   7898 	     anything, unless the reloc is against a section symbol,
   7899 	     in which case we have to adjust according to where the
   7900 	     section symbol winds up in the output section.  */
   7901 	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   7902 	    {
   7903 	      if (globals->use_rel)
   7904 		arm_add_to_rel (input_bfd, contents + rel->r_offset,
   7905 				howto, (bfd_signed_vma) sec->output_offset);
   7906 	      else
   7907 		rel->r_addend += sec->output_offset;
   7908 	    }
   7909 	  continue;
   7910 	}
   7911 
   7912       if (h != NULL)
   7913 	name = h->root.root.string;
   7914       else
   7915 	{
   7916 	  name = (bfd_elf_string_from_elf_section
   7917 		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
   7918 	  if (name == NULL || *name == '\0')
   7919 	    name = bfd_section_name (input_bfd, sec);
   7920 	}
   7921 
   7922       if (r_symndx != 0
   7923 	  && r_type != R_ARM_NONE
   7924 	  && (h == NULL
   7925 	      || h->root.type == bfd_link_hash_defined
   7926 	      || h->root.type == bfd_link_hash_defweak)
   7927 	  && IS_ARM_TLS_RELOC (r_type) != (sym_type == STT_TLS))
   7928 	{
   7929 	  (*_bfd_error_handler)
   7930 	    ((sym_type == STT_TLS
   7931 	      ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
   7932 	      : _("%B(%A+0x%lx): %s used with non-TLS symbol %s")),
   7933 	     input_bfd,
   7934 	     input_section,
   7935 	     (long) rel->r_offset,
   7936 	     howto->name,
   7937 	     name);
   7938 	}
   7939 
   7940       r = elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
   7941 					 input_section, contents, rel,
   7942 					 relocation, info, sec, name,
   7943 					 (h ? ELF_ST_TYPE (h->type) :
   7944 					  ELF_ST_TYPE (sym->st_info)), h,
   7945 					 &unresolved_reloc, &error_message);
   7946 
   7947       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   7948 	 because such sections are not SEC_ALLOC and thus ld.so will
   7949 	 not process them.  */
   7950       if (unresolved_reloc
   7951           && !((input_section->flags & SEC_DEBUGGING) != 0
   7952                && h->def_dynamic))
   7953 	{
   7954 	  (*_bfd_error_handler)
   7955 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   7956 	     input_bfd,
   7957 	     input_section,
   7958 	     (long) rel->r_offset,
   7959 	     howto->name,
   7960 	     h->root.root.string);
   7961 	  return FALSE;
   7962 	}
   7963 
   7964       if (r != bfd_reloc_ok)
   7965 	{
   7966 	  switch (r)
   7967 	    {
   7968 	    case bfd_reloc_overflow:
   7969 	      /* If the overflowing reloc was to an undefined symbol,
   7970 		 we have already printed one error message and there
   7971 		 is no point complaining again.  */
   7972 	      if ((! h ||
   7973 		   h->root.type != bfd_link_hash_undefined)
   7974 		  && (!((*info->callbacks->reloc_overflow)
   7975 			(info, (h ? &h->root : NULL), name, howto->name,
   7976 			 (bfd_vma) 0, input_bfd, input_section,
   7977 			 rel->r_offset))))
   7978 		  return FALSE;
   7979 	      break;
   7980 
   7981 	    case bfd_reloc_undefined:
   7982 	      if (!((*info->callbacks->undefined_symbol)
   7983 		    (info, name, input_bfd, input_section,
   7984 		     rel->r_offset, TRUE)))
   7985 		return FALSE;
   7986 	      break;
   7987 
   7988 	    case bfd_reloc_outofrange:
   7989 	      error_message = _("out of range");
   7990 	      goto common_error;
   7991 
   7992 	    case bfd_reloc_notsupported:
   7993 	      error_message = _("unsupported relocation");
   7994 	      goto common_error;
   7995 
   7996 	    case bfd_reloc_dangerous:
   7997 	      /* error_message should already be set.  */
   7998 	      goto common_error;
   7999 
   8000 	    default:
   8001 	      error_message = _("unknown error");
   8002 	      /* Fall through.  */
   8003 
   8004 	    common_error:
   8005 	      BFD_ASSERT (error_message != NULL);
   8006 	      if (!((*info->callbacks->reloc_dangerous)
   8007 		    (info, error_message, input_bfd, input_section,
   8008 		     rel->r_offset)))
   8009 		return FALSE;
   8010 	      break;
   8011 	    }
   8012 	}
   8013     }
   8014 
   8015   return TRUE;
   8016 }
   8017 
   8018 /* Set the right machine number.  */
   8019 
   8020 static bfd_boolean
   8021 elf32_arm_object_p (bfd *abfd)
   8022 {
   8023   unsigned int mach;
   8024 
   8025   mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
   8026 
   8027   if (mach != bfd_mach_arm_unknown)
   8028     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
   8029 
   8030   else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
   8031     bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
   8032 
   8033   else
   8034     bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
   8035 
   8036   return TRUE;
   8037 }
   8038 
   8039 /* Function to keep ARM specific flags in the ELF header.  */
   8040 
   8041 static bfd_boolean
   8042 elf32_arm_set_private_flags (bfd *abfd, flagword flags)
   8043 {
   8044   if (elf_flags_init (abfd)
   8045       && elf_elfheader (abfd)->e_flags != flags)
   8046     {
   8047       if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
   8048 	{
   8049 	  if (flags & EF_ARM_INTERWORK)
   8050 	    (*_bfd_error_handler)
   8051 	      (_("Warning: Not setting interworking flag of %B since it has already been specified as non-interworking"),
   8052 	       abfd);
   8053 	  else
   8054 	    _bfd_error_handler
   8055 	      (_("Warning: Clearing the interworking flag of %B due to outside request"),
   8056 	       abfd);
   8057 	}
   8058     }
   8059   else
   8060     {
   8061       elf_elfheader (abfd)->e_flags = flags;
   8062       elf_flags_init (abfd) = TRUE;
   8063     }
   8064 
   8065   return TRUE;
   8066 }
   8067 
   8068 /* Copy backend specific data from one object module to another.  */
   8069 
   8070 static bfd_boolean
   8071 elf32_arm_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
   8072 {
   8073   flagword in_flags;
   8074   flagword out_flags;
   8075 
   8076   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
   8077     return TRUE;
   8078 
   8079   in_flags  = elf_elfheader (ibfd)->e_flags;
   8080   out_flags = elf_elfheader (obfd)->e_flags;
   8081 
   8082   if (elf_flags_init (obfd)
   8083       && EF_ARM_EABI_VERSION (out_flags) == EF_ARM_EABI_UNKNOWN
   8084       && in_flags != out_flags)
   8085     {
   8086       /* Cannot mix APCS26 and APCS32 code.  */
   8087       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
   8088 	return FALSE;
   8089 
   8090       /* Cannot mix float APCS and non-float APCS code.  */
   8091       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
   8092 	return FALSE;
   8093 
   8094       /* If the src and dest have different interworking flags
   8095          then turn off the interworking bit.  */
   8096       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
   8097 	{
   8098 	  if (out_flags & EF_ARM_INTERWORK)
   8099 	    _bfd_error_handler
   8100 	      (_("Warning: Clearing the interworking flag of %B because non-interworking code in %B has been linked with it"),
   8101 	       obfd, ibfd);
   8102 
   8103 	  in_flags &= ~EF_ARM_INTERWORK;
   8104 	}
   8105 
   8106       /* Likewise for PIC, though don't warn for this case.  */
   8107       if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
   8108 	in_flags &= ~EF_ARM_PIC;
   8109     }
   8110 
   8111   elf_elfheader (obfd)->e_flags = in_flags;
   8112   elf_flags_init (obfd) = TRUE;
   8113 
   8114   /* Also copy the EI_OSABI field.  */
   8115   elf_elfheader (obfd)->e_ident[EI_OSABI] =
   8116     elf_elfheader (ibfd)->e_ident[EI_OSABI];
   8117 
   8118   /* Copy object attributes.  */
   8119   _bfd_elf_copy_obj_attributes (ibfd, obfd);
   8120 
   8121   return TRUE;
   8122 }
   8123 
   8124 /* Values for Tag_ABI_PCS_R9_use.  */
   8125 enum
   8126 {
   8127   AEABI_R9_V6,
   8128   AEABI_R9_SB,
   8129   AEABI_R9_TLS,
   8130   AEABI_R9_unused
   8131 };
   8132 
   8133 /* Values for Tag_ABI_PCS_RW_data.  */
   8134 enum
   8135 {
   8136   AEABI_PCS_RW_data_absolute,
   8137   AEABI_PCS_RW_data_PCrel,
   8138   AEABI_PCS_RW_data_SBrel,
   8139   AEABI_PCS_RW_data_unused
   8140 };
   8141 
   8142 /* Values for Tag_ABI_enum_size.  */
   8143 enum
   8144 {
   8145   AEABI_enum_unused,
   8146   AEABI_enum_short,
   8147   AEABI_enum_wide,
   8148   AEABI_enum_forced_wide
   8149 };
   8150 
   8151 /* Determine whether an object attribute tag takes an integer, a
   8152    string or both.  */
   8153 
   8154 static int
   8155 elf32_arm_obj_attrs_arg_type (int tag)
   8156 {
   8157   if (tag == Tag_compatibility)
   8158     return 3;
   8159   else if (tag == 4 || tag == 5)
   8160     return 2;
   8161   else if (tag < 32)
   8162     return 1;
   8163   else
   8164     return (tag & 1) != 0 ? 2 : 1;
   8165 }
   8166 
   8167 /* Merge EABI object attributes from IBFD into OBFD.  Raise an error if there
   8168    are conflicting attributes.  */
   8169 
   8170 static bfd_boolean
   8171 elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
   8172 {
   8173   obj_attribute *in_attr;
   8174   obj_attribute *out_attr;
   8175   obj_attribute_list *in_list;
   8176   /* Some tags have 0 = don't care, 1 = strong requirement,
   8177      2 = weak requirement.  */
   8178   static const int order_312[3] = {3, 1, 2};
   8179   /* For use with Tag_VFP_arch.  */
   8180   static const int order_01243[5] = {0, 1, 2, 4, 3};
   8181   int i;
   8182 
   8183   if (!elf_known_obj_attributes_proc (obfd)[0].i)
   8184     {
   8185       /* This is the first object.  Copy the attributes.  */
   8186       _bfd_elf_copy_obj_attributes (ibfd, obfd);
   8187 
   8188       /* Use the Tag_null value to indicate the attributes have been
   8189 	 initialized.  */
   8190       elf_known_obj_attributes_proc (obfd)[0].i = 1;
   8191 
   8192       return TRUE;
   8193     }
   8194 
   8195   in_attr = elf_known_obj_attributes_proc (ibfd);
   8196   out_attr = elf_known_obj_attributes_proc (obfd);
   8197   /* This needs to happen before Tag_ABI_FP_number_model is merged.  */
   8198   if (in_attr[Tag_ABI_VFP_args].i != out_attr[Tag_ABI_VFP_args].i)
   8199     {
   8200       /* Ignore mismatches if teh object doesn't use floating point.  */
   8201       if (out_attr[Tag_ABI_FP_number_model].i == 0)
   8202 	out_attr[Tag_ABI_VFP_args].i = in_attr[Tag_ABI_VFP_args].i;
   8203       else if (in_attr[Tag_ABI_FP_number_model].i != 0)
   8204 	{
   8205 	  _bfd_error_handler
   8206 	    (_("ERROR: %B uses VFP register arguments, %B does not"),
   8207 	     ibfd, obfd);
   8208 	  return FALSE;
   8209 	}
   8210     }
   8211 
   8212   for (i = 4; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
   8213     {
   8214       /* Merge this attribute with existing attributes.  */
   8215       switch (i)
   8216 	{
   8217 	case Tag_CPU_raw_name:
   8218 	case Tag_CPU_name:
   8219 	  /* Use whichever has the greatest architecture requirements.  We
   8220 	     won't necessarily have both the above tags, so make sure input
   8221 	     name is non-NULL.  */
   8222 	  if (in_attr[Tag_CPU_arch].i > out_attr[Tag_CPU_arch].i
   8223 	      && in_attr[i].s)
   8224 	    out_attr[i].s = _bfd_elf_attr_strdup (obfd, in_attr[i].s);
   8225 	  break;
   8226 
   8227 	case Tag_ABI_optimization_goals:
   8228 	case Tag_ABI_FP_optimization_goals:
   8229 	  /* Use the first value seen.  */
   8230 	  break;
   8231 
   8232 	case Tag_CPU_arch:
   8233 	case Tag_ARM_ISA_use:
   8234 	case Tag_THUMB_ISA_use:
   8235 	case Tag_WMMX_arch:
   8236 	case Tag_NEON_arch:
   8237 	  /* ??? Do NEON and WMMX conflict?  */
   8238 	case Tag_ABI_FP_rounding:
   8239 	case Tag_ABI_FP_denormal:
   8240 	case Tag_ABI_FP_exceptions:
   8241 	case Tag_ABI_FP_user_exceptions:
   8242 	case Tag_ABI_FP_number_model:
   8243 	case Tag_ABI_align8_preserved:
   8244 	case Tag_ABI_HardFP_use:
   8245 	  /* Use the largest value specified.  */
   8246 	  if (in_attr[i].i > out_attr[i].i)
   8247 	    out_attr[i].i = in_attr[i].i;
   8248 	  break;
   8249 
   8250 	case Tag_CPU_arch_profile:
   8251 	  /* Warn if conflicting architecture profiles used.  */
   8252 	  if (out_attr[i].i && in_attr[i].i && in_attr[i].i != out_attr[i].i)
   8253 	    {
   8254 	      _bfd_error_handler
   8255 		(_("ERROR: %B: Conflicting architecture profiles %c/%c"),
   8256 		 ibfd, in_attr[i].i, out_attr[i].i);
   8257 	      return FALSE;
   8258 	    }
   8259 	  if (in_attr[i].i)
   8260 	    out_attr[i].i = in_attr[i].i;
   8261 	  break;
   8262 	case Tag_VFP_arch:
   8263 	  if (in_attr[i].i > 4 || out_attr[i].i > 4
   8264 	      || order_01243[in_attr[i].i] > order_01243[out_attr[i].i])
   8265 	    out_attr[i].i = in_attr[i].i;
   8266 	  break;
   8267 	case Tag_PCS_config:
   8268 	  if (out_attr[i].i == 0)
   8269 	    out_attr[i].i = in_attr[i].i;
   8270 	  else if (in_attr[i].i != 0 && out_attr[i].i != 0)
   8271 	    {
   8272 	      /* It's sometimes ok to mix different configs, so this is only
   8273 	         a warning.  */
   8274 	      _bfd_error_handler
   8275 		(_("Warning: %B: Conflicting platform configuration"), ibfd);
   8276 	    }
   8277 	  break;
   8278 	case Tag_ABI_PCS_R9_use:
   8279 	  if (in_attr[i].i != out_attr[i].i
   8280 	      && out_attr[i].i != AEABI_R9_unused
   8281 	      && in_attr[i].i != AEABI_R9_unused)
   8282 	    {
   8283 	      _bfd_error_handler
   8284 		(_("ERROR: %B: Conflicting use of R9"), ibfd);
   8285 	      return FALSE;
   8286 	    }
   8287 	  if (out_attr[i].i == AEABI_R9_unused)
   8288 	    out_attr[i].i = in_attr[i].i;
   8289 	  break;
   8290 	case Tag_ABI_PCS_RW_data:
   8291 	  if (in_attr[i].i == AEABI_PCS_RW_data_SBrel
   8292 	      && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_SB
   8293 	      && out_attr[Tag_ABI_PCS_R9_use].i != AEABI_R9_unused)
   8294 	    {
   8295 	      _bfd_error_handler
   8296 		(_("ERROR: %B: SB relative addressing conflicts with use of R9"),
   8297 		 ibfd);
   8298 	      return FALSE;
   8299 	    }
   8300 	  /* Use the smallest value specified.  */
   8301 	  if (in_attr[i].i < out_attr[i].i)
   8302 	    out_attr[i].i = in_attr[i].i;
   8303 	  break;
   8304 	case Tag_ABI_PCS_RO_data:
   8305 	  /* Use the smallest value specified.  */
   8306 	  if (in_attr[i].i < out_attr[i].i)
   8307 	    out_attr[i].i = in_attr[i].i;
   8308 	  break;
   8309 	case Tag_ABI_PCS_GOT_use:
   8310 	  if (in_attr[i].i > 2 || out_attr[i].i > 2
   8311 	      || order_312[in_attr[i].i] < order_312[out_attr[i].i])
   8312 	    out_attr[i].i = in_attr[i].i;
   8313 	  break;
   8314 	case Tag_ABI_PCS_wchar_t:
   8315 	  if (out_attr[i].i && in_attr[i].i && out_attr[i].i != in_attr[i].i
   8316 	      && !elf_arm_tdata (obfd)->no_wchar_size_warning)
   8317 	    {
   8318 	      _bfd_error_handler
   8319 		(_("warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"),
   8320 		 ibfd, in_attr[i].i, out_attr[i].i);
   8321 	    }
   8322 	  else if (in_attr[i].i && !out_attr[i].i)
   8323 	    out_attr[i].i = in_attr[i].i;
   8324 	  break;
   8325 	case Tag_ABI_align8_needed:
   8326 	  /* ??? Check against Tag_ABI_align8_preserved.  */
   8327 	  if (in_attr[i].i > 2 || out_attr[i].i > 2
   8328 	      || order_312[in_attr[i].i] < order_312[out_attr[i].i])
   8329 	    out_attr[i].i = in_attr[i].i;
   8330 	  break;
   8331 	case Tag_ABI_enum_size:
   8332 	  if (in_attr[i].i != AEABI_enum_unused)
   8333 	    {
   8334 	      if (out_attr[i].i == AEABI_enum_unused
   8335 		  || out_attr[i].i == AEABI_enum_forced_wide)
   8336 		{
   8337 		  /* The existing object is compatible with anything.
   8338 		     Use whatever requirements the new object has.  */
   8339 		  out_attr[i].i = in_attr[i].i;
   8340 		}
   8341 	      else if (in_attr[i].i != AEABI_enum_forced_wide
   8342 		       && out_attr[i].i != in_attr[i].i
   8343 		       && !elf_arm_tdata (obfd)->no_enum_size_warning)
   8344 		{
   8345 		  const char *aeabi_enum_names[] =
   8346 		    { "", "variable-size", "32-bit", "" };
   8347 		  _bfd_error_handler
   8348 		    (_("warning: %B uses %s enums yet the output is to use %s enums; use of enum values across objects may fail"),
   8349 		     ibfd, aeabi_enum_names[in_attr[i].i],
   8350 		     aeabi_enum_names[out_attr[i].i]);
   8351 		}
   8352 	    }
   8353 	  break;
   8354 	case Tag_ABI_VFP_args:
   8355 	  /* Aready done.  */
   8356 	  break;
   8357 	case Tag_ABI_WMMX_args:
   8358 	  if (in_attr[i].i != out_attr[i].i)
   8359 	    {
   8360 	      _bfd_error_handler
   8361 		(_("ERROR: %B uses iWMMXt register arguments, %B does not"),
   8362 		 ibfd, obfd);
   8363 	      return FALSE;
   8364 	    }
   8365 	  break;
   8366 	default: /* All known attributes should be explicitly covered.   */
   8367 	  abort ();
   8368 	}
   8369 
   8370       if (in_attr[i].type && !out_attr[i].type)
   8371 	switch (in_attr[i].type)
   8372 	  {
   8373 	  case 1:
   8374 	    if (out_attr[i].i)
   8375 	      out_attr[i].type = 1;
   8376 	    break;
   8377 
   8378 	  case 2:
   8379 	    if (out_attr[i].s)
   8380 	      out_attr[i].type = 2;
   8381 	    break;
   8382 
   8383 	  default:
   8384 	    abort ();
   8385 	  }
   8386     }
   8387 
   8388   /* Merge Tag_compatibility attributes and any common GNU ones.  */
   8389   _bfd_elf_merge_object_attributes (ibfd, obfd);
   8390 
   8391   /* Check for any attributes not known on ARM.  */
   8392   in_list = elf_other_obj_attributes_proc (ibfd);
   8393   while (in_list && in_list->tag == Tag_compatibility)
   8394     in_list = in_list->next;
   8395 
   8396   for (; in_list; in_list = in_list->next)
   8397     {
   8398       if ((in_list->tag & 128) < 64)
   8399 	{
   8400 	  _bfd_error_handler
   8401 	    (_("Warning: %B: Unknown EABI object attribute %d"),
   8402 	     ibfd, in_list->tag);
   8403 	  break;
   8404 	}
   8405     }
   8406   return TRUE;
   8407 }
   8408 
   8409 
   8410 /* Return TRUE if the two EABI versions are incompatible.  */
   8411 
   8412 static bfd_boolean
   8413 elf32_arm_versions_compatible (unsigned iver, unsigned over)
   8414 {
   8415   /* v4 and v5 are the same spec before and after it was released,
   8416      so allow mixing them.  */
   8417   if ((iver == EF_ARM_EABI_VER4 && over == EF_ARM_EABI_VER5)
   8418       || (iver == EF_ARM_EABI_VER5 && over == EF_ARM_EABI_VER4))
   8419     return TRUE;
   8420 
   8421   return (iver == over);
   8422 }
   8423 
   8424 /* Merge backend specific data from an object file to the output
   8425    object file when linking.  */
   8426 
   8427 static bfd_boolean
   8428 elf32_arm_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
   8429 {
   8430   flagword out_flags;
   8431   flagword in_flags;
   8432   bfd_boolean flags_compatible = TRUE;
   8433   asection *sec;
   8434 
   8435   /* Check if we have the same endianess.  */
   8436   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
   8437     return FALSE;
   8438 
   8439   if (! is_arm_elf (ibfd) || ! is_arm_elf (obfd))
   8440     return TRUE;
   8441 
   8442   if (!elf32_arm_merge_eabi_attributes (ibfd, obfd))
   8443     return FALSE;
   8444 
   8445   /* The input BFD must have had its flags initialised.  */
   8446   /* The following seems bogus to me -- The flags are initialized in
   8447      the assembler but I don't think an elf_flags_init field is
   8448      written into the object.  */
   8449   /* BFD_ASSERT (elf_flags_init (ibfd)); */
   8450 
   8451   in_flags  = elf_elfheader (ibfd)->e_flags;
   8452   out_flags = elf_elfheader (obfd)->e_flags;
   8453 
   8454   /* In theory there is no reason why we couldn't handle this.  However
   8455      in practice it isn't even close to working and there is no real
   8456      reason to want it.  */
   8457   if (EF_ARM_EABI_VERSION (in_flags) >= EF_ARM_EABI_VER4
   8458       && !(ibfd->flags & DYNAMIC)
   8459       && (in_flags & EF_ARM_BE8))
   8460     {
   8461       _bfd_error_handler (_("ERROR: %B is already in final BE8 format"),
   8462 			  ibfd);
   8463       return FALSE;
   8464     }
   8465 
   8466   if (!elf_flags_init (obfd))
   8467     {
   8468       /* If the input is the default architecture and had the default
   8469 	 flags then do not bother setting the flags for the output
   8470 	 architecture, instead allow future merges to do this.  If no
   8471 	 future merges ever set these flags then they will retain their
   8472          uninitialised values, which surprise surprise, correspond
   8473          to the default values.  */
   8474       if (bfd_get_arch_info (ibfd)->the_default
   8475 	  && elf_elfheader (ibfd)->e_flags == 0)
   8476 	return TRUE;
   8477 
   8478       elf_flags_init (obfd) = TRUE;
   8479       elf_elfheader (obfd)->e_flags = in_flags;
   8480 
   8481       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   8482 	  && bfd_get_arch_info (obfd)->the_default)
   8483 	return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
   8484 
   8485       return TRUE;
   8486     }
   8487 
   8488   /* Determine what should happen if the input ARM architecture
   8489      does not match the output ARM architecture.  */
   8490   if (! bfd_arm_merge_machines (ibfd, obfd))
   8491     return FALSE;
   8492 
   8493   /* Identical flags must be compatible.  */
   8494   if (in_flags == out_flags)
   8495     return TRUE;
   8496 
   8497   /* Check to see if the input BFD actually contains any sections.  If
   8498      not, its flags may not have been initialised either, but it
   8499      cannot actually cause any incompatiblity.  Do not short-circuit
   8500      dynamic objects; their section list may be emptied by
   8501     elf_link_add_object_symbols.
   8502 
   8503     Also check to see if there are no code sections in the input.
   8504     In this case there is no need to check for code specific flags.
   8505     XXX - do we need to worry about floating-point format compatability
   8506     in data sections ?  */
   8507   if (!(ibfd->flags & DYNAMIC))
   8508     {
   8509       bfd_boolean null_input_bfd = TRUE;
   8510       bfd_boolean only_data_sections = TRUE;
   8511 
   8512       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
   8513 	{
   8514 	  /* Ignore synthetic glue sections.  */
   8515 	  if (strcmp (sec->name, ".glue_7")
   8516 	      && strcmp (sec->name, ".glue_7t"))
   8517 	    {
   8518 	      if ((bfd_get_section_flags (ibfd, sec)
   8519 		   & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
   8520 		  == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
   8521 	    	only_data_sections = FALSE;
   8522 
   8523 	      null_input_bfd = FALSE;
   8524 	      break;
   8525 	    }
   8526 	}
   8527 
   8528       if (null_input_bfd || only_data_sections)
   8529 	return TRUE;
   8530     }
   8531 
   8532   /* Complain about various flag mismatches.  */
   8533   if (!elf32_arm_versions_compatible (EF_ARM_EABI_VERSION (in_flags),
   8534 				      EF_ARM_EABI_VERSION (out_flags)))
   8535     {
   8536       _bfd_error_handler
   8537 	(_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
   8538 	 ibfd, obfd,
   8539 	 (in_flags & EF_ARM_EABIMASK) >> 24,
   8540 	 (out_flags & EF_ARM_EABIMASK) >> 24);
   8541       return FALSE;
   8542     }
   8543 
   8544   /* Not sure what needs to be checked for EABI versions >= 1.  */
   8545   /* VxWorks libraries do not use these flags.  */
   8546   if (get_elf_backend_data (obfd) != &elf32_arm_vxworks_bed
   8547       && get_elf_backend_data (ibfd) != &elf32_arm_vxworks_bed
   8548       && EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
   8549     {
   8550       if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
   8551 	{
   8552 	  _bfd_error_handler
   8553 	    (_("ERROR: %B is compiled for APCS-%d, whereas target %B uses APCS-%d"),
   8554 	     ibfd, obfd,
   8555 	     in_flags & EF_ARM_APCS_26 ? 26 : 32,
   8556 	     out_flags & EF_ARM_APCS_26 ? 26 : 32);
   8557 	  flags_compatible = FALSE;
   8558 	}
   8559 
   8560       if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
   8561 	{
   8562 	  if (in_flags & EF_ARM_APCS_FLOAT)
   8563 	    _bfd_error_handler
   8564 	      (_("ERROR: %B passes floats in float registers, whereas %B passes them in integer registers"),
   8565 	       ibfd, obfd);
   8566 	  else
   8567 	    _bfd_error_handler
   8568 	      (_("ERROR: %B passes floats in integer registers, whereas %B passes them in float registers"),
   8569 	       ibfd, obfd);
   8570 
   8571 	  flags_compatible = FALSE;
   8572 	}
   8573 
   8574       if ((in_flags & EF_ARM_VFP_FLOAT) != (out_flags & EF_ARM_VFP_FLOAT))
   8575 	{
   8576 	  if (in_flags & EF_ARM_VFP_FLOAT)
   8577 	    _bfd_error_handler
   8578 	      (_("ERROR: %B uses VFP instructions, whereas %B does not"),
   8579 	       ibfd, obfd);
   8580 	  else
   8581 	    _bfd_error_handler
   8582 	      (_("ERROR: %B uses FPA instructions, whereas %B does not"),
   8583 	       ibfd, obfd);
   8584 
   8585 	  flags_compatible = FALSE;
   8586 	}
   8587 
   8588       if ((in_flags & EF_ARM_MAVERICK_FLOAT) != (out_flags & EF_ARM_MAVERICK_FLOAT))
   8589 	{
   8590 	  if (in_flags & EF_ARM_MAVERICK_FLOAT)
   8591 	    _bfd_error_handler
   8592 	      (_("ERROR: %B uses Maverick instructions, whereas %B does not"),
   8593 	       ibfd, obfd);
   8594 	  else
   8595 	    _bfd_error_handler
   8596 	      (_("ERROR: %B does not use Maverick instructions, whereas %B does"),
   8597 	       ibfd, obfd);
   8598 
   8599 	  flags_compatible = FALSE;
   8600 	}
   8601 
   8602 #ifdef EF_ARM_SOFT_FLOAT
   8603       if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
   8604 	{
   8605 	  /* We can allow interworking between code that is VFP format
   8606 	     layout, and uses either soft float or integer regs for
   8607 	     passing floating point arguments and results.  We already
   8608 	     know that the APCS_FLOAT flags match; similarly for VFP
   8609 	     flags.  */
   8610 	  if ((in_flags & EF_ARM_APCS_FLOAT) != 0
   8611 	      || (in_flags & EF_ARM_VFP_FLOAT) == 0)
   8612 	    {
   8613 	      if (in_flags & EF_ARM_SOFT_FLOAT)
   8614 		_bfd_error_handler
   8615 		  (_("ERROR: %B uses software FP, whereas %B uses hardware FP"),
   8616 		   ibfd, obfd);
   8617 	      else
   8618 		_bfd_error_handler
   8619 		  (_("ERROR: %B uses hardware FP, whereas %B uses software FP"),
   8620 		   ibfd, obfd);
   8621 
   8622 	      flags_compatible = FALSE;
   8623 	    }
   8624 	}
   8625 #endif
   8626 
   8627       /* Interworking mismatch is only a warning.  */
   8628       if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
   8629 	{
   8630 	  if (in_flags & EF_ARM_INTERWORK)
   8631 	    {
   8632 	      _bfd_error_handler
   8633 		(_("Warning: %B supports interworking, whereas %B does not"),
   8634 		 ibfd, obfd);
   8635 	    }
   8636 	  else
   8637 	    {
   8638 	      _bfd_error_handler
   8639 		(_("Warning: %B does not support interworking, whereas %B does"),
   8640 		 ibfd, obfd);
   8641 	    }
   8642 	}
   8643     }
   8644 
   8645   return flags_compatible;
   8646 }
   8647 
   8648 /* Display the flags field.  */
   8649 
   8650 static bfd_boolean
   8651 elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
   8652 {
   8653   FILE * file = (FILE *) ptr;
   8654   unsigned long flags;
   8655 
   8656   BFD_ASSERT (abfd != NULL && ptr != NULL);
   8657 
   8658   /* Print normal ELF private data.  */
   8659   _bfd_elf_print_private_bfd_data (abfd, ptr);
   8660 
   8661   flags = elf_elfheader (abfd)->e_flags;
   8662   /* Ignore init flag - it may not be set, despite the flags field
   8663      containing valid data.  */
   8664 
   8665   /* xgettext:c-format */
   8666   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
   8667 
   8668   switch (EF_ARM_EABI_VERSION (flags))
   8669     {
   8670     case EF_ARM_EABI_UNKNOWN:
   8671       /* The following flag bits are GNU extensions and not part of the
   8672 	 official ARM ELF extended ABI.  Hence they are only decoded if
   8673 	 the EABI version is not set.  */
   8674       if (flags & EF_ARM_INTERWORK)
   8675 	fprintf (file, _(" [interworking enabled]"));
   8676 
   8677       if (flags & EF_ARM_APCS_26)
   8678 	fprintf (file, " [APCS-26]");
   8679       else
   8680 	fprintf (file, " [APCS-32]");
   8681 
   8682       if (flags & EF_ARM_VFP_FLOAT)
   8683 	fprintf (file, _(" [VFP float format]"));
   8684       else if (flags & EF_ARM_MAVERICK_FLOAT)
   8685 	fprintf (file, _(" [Maverick float format]"));
   8686       else
   8687 	fprintf (file, _(" [FPA float format]"));
   8688 
   8689       if (flags & EF_ARM_APCS_FLOAT)
   8690 	fprintf (file, _(" [floats passed in float registers]"));
   8691 
   8692       if (flags & EF_ARM_PIC)
   8693 	fprintf (file, _(" [position independent]"));
   8694 
   8695       if (flags & EF_ARM_NEW_ABI)
   8696 	fprintf (file, _(" [new ABI]"));
   8697 
   8698       if (flags & EF_ARM_OLD_ABI)
   8699 	fprintf (file, _(" [old ABI]"));
   8700 
   8701       if (flags & EF_ARM_SOFT_FLOAT)
   8702 	fprintf (file, _(" [software FP]"));
   8703 
   8704       flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT
   8705 		 | EF_ARM_PIC | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI
   8706 		 | EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT
   8707 		 | EF_ARM_MAVERICK_FLOAT);
   8708       break;
   8709 
   8710     case EF_ARM_EABI_VER1:
   8711       fprintf (file, _(" [Version1 EABI]"));
   8712 
   8713       if (flags & EF_ARM_SYMSARESORTED)
   8714 	fprintf (file, _(" [sorted symbol table]"));
   8715       else
   8716 	fprintf (file, _(" [unsorted symbol table]"));
   8717 
   8718       flags &= ~ EF_ARM_SYMSARESORTED;
   8719       break;
   8720 
   8721     case EF_ARM_EABI_VER2:
   8722       fprintf (file, _(" [Version2 EABI]"));
   8723 
   8724       if (flags & EF_ARM_SYMSARESORTED)
   8725 	fprintf (file, _(" [sorted symbol table]"));
   8726       else
   8727 	fprintf (file, _(" [unsorted symbol table]"));
   8728 
   8729       if (flags & EF_ARM_DYNSYMSUSESEGIDX)
   8730 	fprintf (file, _(" [dynamic symbols use segment index]"));
   8731 
   8732       if (flags & EF_ARM_MAPSYMSFIRST)
   8733 	fprintf (file, _(" [mapping symbols precede others]"));
   8734 
   8735       flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
   8736 		 | EF_ARM_MAPSYMSFIRST);
   8737       break;
   8738 
   8739     case EF_ARM_EABI_VER3:
   8740       fprintf (file, _(" [Version3 EABI]"));
   8741       break;
   8742 
   8743     case EF_ARM_EABI_VER4:
   8744       fprintf (file, _(" [Version4 EABI]"));
   8745       goto eabi;
   8746 
   8747     case EF_ARM_EABI_VER5:
   8748       fprintf (file, _(" [Version5 EABI]"));
   8749     eabi:
   8750       if (flags & EF_ARM_BE8)
   8751 	fprintf (file, _(" [BE8]"));
   8752 
   8753       if (flags & EF_ARM_LE8)
   8754 	fprintf (file, _(" [LE8]"));
   8755 
   8756       flags &= ~(EF_ARM_LE8 | EF_ARM_BE8);
   8757       break;
   8758 
   8759     default:
   8760       fprintf (file, _(" <EABI version unrecognised>"));
   8761       break;
   8762     }
   8763 
   8764   flags &= ~ EF_ARM_EABIMASK;
   8765 
   8766   if (flags & EF_ARM_RELEXEC)
   8767     fprintf (file, _(" [relocatable executable]"));
   8768 
   8769   if (flags & EF_ARM_HASENTRY)
   8770     fprintf (file, _(" [has entry point]"));
   8771 
   8772   flags &= ~ (EF_ARM_RELEXEC | EF_ARM_HASENTRY);
   8773 
   8774   if (flags)
   8775     fprintf (file, _("<Unrecognised flag bits set>"));
   8776 
   8777   fputc ('\n', file);
   8778 
   8779   return TRUE;
   8780 }
   8781 
   8782 static int
   8783 elf32_arm_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
   8784 {
   8785   switch (ELF_ST_TYPE (elf_sym->st_info))
   8786     {
   8787     case STT_ARM_TFUNC:
   8788       return ELF_ST_TYPE (elf_sym->st_info);
   8789 
   8790     case STT_ARM_16BIT:
   8791       /* If the symbol is not an object, return the STT_ARM_16BIT flag.
   8792 	 This allows us to distinguish between data used by Thumb instructions
   8793 	 and non-data (which is probably code) inside Thumb regions of an
   8794 	 executable.  */
   8795       if (type != STT_OBJECT && type != STT_TLS)
   8796 	return ELF_ST_TYPE (elf_sym->st_info);
   8797       break;
   8798 
   8799     default:
   8800       break;
   8801     }
   8802 
   8803   return type;
   8804 }
   8805 
   8806 static asection *
   8807 elf32_arm_gc_mark_hook (asection *sec,
   8808 			struct bfd_link_info *info,
   8809 			Elf_Internal_Rela *rel,
   8810 			struct elf_link_hash_entry *h,
   8811 			Elf_Internal_Sym *sym)
   8812 {
   8813   if (h != NULL)
   8814     switch (ELF32_R_TYPE (rel->r_info))
   8815       {
   8816       case R_ARM_GNU_VTINHERIT:
   8817       case R_ARM_GNU_VTENTRY:
   8818 	return NULL;
   8819       }
   8820 
   8821   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   8822 }
   8823 
   8824 /* Update the got entry reference counts for the section being removed.  */
   8825 
   8826 static bfd_boolean
   8827 elf32_arm_gc_sweep_hook (bfd *                     abfd,
   8828 			 struct bfd_link_info *    info,
   8829 			 asection *                sec,
   8830 			 const Elf_Internal_Rela * relocs)
   8831 {
   8832   Elf_Internal_Shdr *symtab_hdr;
   8833   struct elf_link_hash_entry **sym_hashes;
   8834   bfd_signed_vma *local_got_refcounts;
   8835   const Elf_Internal_Rela *rel, *relend;
   8836   struct elf32_arm_link_hash_table * globals;
   8837 
   8838   if (info->relocatable)
   8839     return TRUE;
   8840 
   8841   globals = elf32_arm_hash_table (info);
   8842 
   8843   elf_section_data (sec)->local_dynrel = NULL;
   8844 
   8845   symtab_hdr = & elf_symtab_hdr (abfd);
   8846   sym_hashes = elf_sym_hashes (abfd);
   8847   local_got_refcounts = elf_local_got_refcounts (abfd);
   8848 
   8849   check_use_blx (globals);
   8850 
   8851   relend = relocs + sec->reloc_count;
   8852   for (rel = relocs; rel < relend; rel++)
   8853     {
   8854       unsigned long r_symndx;
   8855       struct elf_link_hash_entry *h = NULL;
   8856       int r_type;
   8857 
   8858       r_symndx = ELF32_R_SYM (rel->r_info);
   8859       if (r_symndx >= symtab_hdr->sh_info)
   8860 	{
   8861 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   8862 	  while (h->root.type == bfd_link_hash_indirect
   8863 		 || h->root.type == bfd_link_hash_warning)
   8864 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   8865 	}
   8866 
   8867       r_type = ELF32_R_TYPE (rel->r_info);
   8868       r_type = arm_real_reloc_type (globals, r_type);
   8869       switch (r_type)
   8870 	{
   8871 	case R_ARM_GOT32:
   8872 	case R_ARM_GOT_PREL:
   8873 	case R_ARM_TLS_GD32:
   8874 	case R_ARM_TLS_IE32:
   8875 	  if (h != NULL)
   8876 	    {
   8877 	      if (h->got.refcount > 0)
   8878 		h->got.refcount -= 1;
   8879 	    }
   8880 	  else if (local_got_refcounts != NULL)
   8881 	    {
   8882 	      if (local_got_refcounts[r_symndx] > 0)
   8883 		local_got_refcounts[r_symndx] -= 1;
   8884 	    }
   8885 	  break;
   8886 
   8887 	case R_ARM_TLS_LDM32:
   8888 	  elf32_arm_hash_table (info)->tls_ldm_got.refcount -= 1;
   8889 	  break;
   8890 
   8891 	case R_ARM_ABS32:
   8892 	case R_ARM_ABS32_NOI:
   8893 	case R_ARM_REL32:
   8894 	case R_ARM_REL32_NOI:
   8895 	case R_ARM_PC24:
   8896 	case R_ARM_PLT32:
   8897 	case R_ARM_CALL:
   8898 	case R_ARM_JUMP24:
   8899 	case R_ARM_PREL31:
   8900 	case R_ARM_THM_CALL:
   8901 	case R_ARM_THM_JUMP24:
   8902 	case R_ARM_THM_JUMP19:
   8903 	case R_ARM_MOVW_ABS_NC:
   8904 	case R_ARM_MOVT_ABS:
   8905 	case R_ARM_MOVW_PREL_NC:
   8906 	case R_ARM_MOVT_PREL:
   8907 	case R_ARM_THM_MOVW_ABS_NC:
   8908 	case R_ARM_THM_MOVT_ABS:
   8909 	case R_ARM_THM_MOVW_PREL_NC:
   8910 	case R_ARM_THM_MOVT_PREL:
   8911 	  /* Should the interworking branches be here also?  */
   8912 
   8913 	  if (h != NULL)
   8914 	    {
   8915 	      struct elf32_arm_link_hash_entry *eh;
   8916 	      struct elf32_arm_relocs_copied **pp;
   8917 	      struct elf32_arm_relocs_copied *p;
   8918 
   8919 	      eh = (struct elf32_arm_link_hash_entry *) h;
   8920 
   8921 	      if (h->plt.refcount > 0)
   8922 		{
   8923 		  h->plt.refcount -= 1;
   8924 		  if (r_type == R_ARM_THM_CALL)
   8925 		    eh->plt_maybe_thumb_refcount--;
   8926 
   8927 		  if (r_type == R_ARM_THM_JUMP24
   8928 		      || r_type == R_ARM_THM_JUMP19)
   8929 		    eh->plt_thumb_refcount--;
   8930 		}
   8931 
   8932 	      if (r_type == R_ARM_ABS32
   8933 		  || r_type == R_ARM_REL32
   8934                   || r_type == R_ARM_ABS32_NOI
   8935                   || r_type == R_ARM_REL32_NOI)
   8936 		{
   8937 		  for (pp = &eh->relocs_copied; (p = *pp) != NULL;
   8938 		       pp = &p->next)
   8939 		  if (p->section == sec)
   8940 		    {
   8941 		      p->count -= 1;
   8942 		      if (ELF32_R_TYPE (rel->r_info) == R_ARM_REL32
   8943                           || ELF32_R_TYPE (rel->r_info) == R_ARM_REL32_NOI)
   8944 			p->pc_count -= 1;
   8945 		      if (p->count == 0)
   8946 			*pp = p->next;
   8947 		      break;
   8948 		    }
   8949 		}
   8950 	    }
   8951 	  break;
   8952 
   8953 	default:
   8954 	  break;
   8955 	}
   8956     }
   8957 
   8958   return TRUE;
   8959 }
   8960 
   8961 /* Look through the relocs for a section during the first phase.  */
   8962 
   8963 static bfd_boolean
   8964 elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
   8965 			asection *sec, const Elf_Internal_Rela *relocs)
   8966 {
   8967   Elf_Internal_Shdr *symtab_hdr;
   8968   struct elf_link_hash_entry **sym_hashes;
   8969   const Elf_Internal_Rela *rel;
   8970   const Elf_Internal_Rela *rel_end;
   8971   bfd *dynobj;
   8972   asection *sreloc;
   8973   bfd_vma *local_got_offsets;
   8974   struct elf32_arm_link_hash_table *htab;
   8975   bfd_boolean needs_plt;
   8976 
   8977   if (info->relocatable)
   8978     return TRUE;
   8979 
   8980   BFD_ASSERT (is_arm_elf (abfd));
   8981 
   8982   htab = elf32_arm_hash_table (info);
   8983   sreloc = NULL;
   8984 
   8985   /* Create dynamic sections for relocatable executables so that we can
   8986      copy relocations.  */
   8987   if (htab->root.is_relocatable_executable
   8988       && ! htab->root.dynamic_sections_created)
   8989     {
   8990       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
   8991 	return FALSE;
   8992     }
   8993 
   8994   dynobj = elf_hash_table (info)->dynobj;
   8995   local_got_offsets = elf_local_got_offsets (abfd);
   8996 
   8997   symtab_hdr = & elf_symtab_hdr (abfd);
   8998   sym_hashes = elf_sym_hashes (abfd);
   8999 
   9000   rel_end = relocs + sec->reloc_count;
   9001   for (rel = relocs; rel < rel_end; rel++)
   9002     {
   9003       struct elf_link_hash_entry *h;
   9004       struct elf32_arm_link_hash_entry *eh;
   9005       unsigned long r_symndx;
   9006       int r_type;
   9007 
   9008       r_symndx = ELF32_R_SYM (rel->r_info);
   9009       r_type = ELF32_R_TYPE (rel->r_info);
   9010       r_type = arm_real_reloc_type (htab, r_type);
   9011 
   9012       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
   9013 	{
   9014 	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"), abfd,
   9015 				 r_symndx);
   9016 	  return FALSE;
   9017 	}
   9018 
   9019       if (r_symndx < symtab_hdr->sh_info)
   9020         h = NULL;
   9021       else
   9022 	{
   9023 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   9024 	  while (h->root.type == bfd_link_hash_indirect
   9025 		 || h->root.type == bfd_link_hash_warning)
   9026 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   9027 	}
   9028 
   9029       eh = (struct elf32_arm_link_hash_entry *) h;
   9030 
   9031       switch (r_type)
   9032         {
   9033 	  case R_ARM_GOT32:
   9034 	  case R_ARM_GOT_PREL:
   9035 	  case R_ARM_TLS_GD32:
   9036 	  case R_ARM_TLS_IE32:
   9037 	    /* This symbol requires a global offset table entry.  */
   9038 	    {
   9039 	      int tls_type, old_tls_type;
   9040 
   9041 	      switch (r_type)
   9042 		{
   9043 		case R_ARM_TLS_GD32: tls_type = GOT_TLS_GD; break;
   9044 		case R_ARM_TLS_IE32: tls_type = GOT_TLS_IE; break;
   9045 		default: tls_type = GOT_NORMAL; break;
   9046 		}
   9047 
   9048 	      if (h != NULL)
   9049 		{
   9050 		  h->got.refcount++;
   9051 		  old_tls_type = elf32_arm_hash_entry (h)->tls_type;
   9052 		}
   9053 	      else
   9054 		{
   9055 		  bfd_signed_vma *local_got_refcounts;
   9056 
   9057 		  /* This is a global offset table entry for a local symbol.  */
   9058 		  local_got_refcounts = elf_local_got_refcounts (abfd);
   9059 		  if (local_got_refcounts == NULL)
   9060 		    {
   9061 		      bfd_size_type size;
   9062 
   9063 		      size = symtab_hdr->sh_info;
   9064 		      size *= (sizeof (bfd_signed_vma) + sizeof (char));
   9065 		      local_got_refcounts = bfd_zalloc (abfd, size);
   9066 		      if (local_got_refcounts == NULL)
   9067 			return FALSE;
   9068 		      elf_local_got_refcounts (abfd) = local_got_refcounts;
   9069 		      elf32_arm_local_got_tls_type (abfd)
   9070 			= (char *) (local_got_refcounts + symtab_hdr->sh_info);
   9071 		    }
   9072 		  local_got_refcounts[r_symndx] += 1;
   9073 		  old_tls_type = elf32_arm_local_got_tls_type (abfd) [r_symndx];
   9074 		}
   9075 
   9076 	      /* We will already have issued an error message if there is a
   9077 		 TLS / non-TLS mismatch, based on the symbol type.  We don't
   9078 		 support any linker relaxations.  So just combine any TLS
   9079 		 types needed.  */
   9080 	      if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
   9081 		  && tls_type != GOT_NORMAL)
   9082 		tls_type |= old_tls_type;
   9083 
   9084 	      if (old_tls_type != tls_type)
   9085 		{
   9086 		  if (h != NULL)
   9087 		    elf32_arm_hash_entry (h)->tls_type = tls_type;
   9088 		  else
   9089 		    elf32_arm_local_got_tls_type (abfd) [r_symndx] = tls_type;
   9090 		}
   9091 	    }
   9092 	    /* Fall through.  */
   9093 
   9094 	  case R_ARM_TLS_LDM32:
   9095 	    if (r_type == R_ARM_TLS_LDM32)
   9096 		htab->tls_ldm_got.refcount++;
   9097 	    /* Fall through.  */
   9098 
   9099 	  case R_ARM_GOTOFF32:
   9100 	  case R_ARM_GOTPC:
   9101 	    if (htab->sgot == NULL)
   9102 	      {
   9103 		if (htab->root.dynobj == NULL)
   9104 		  htab->root.dynobj = abfd;
   9105 		if (!create_got_section (htab->root.dynobj, info))
   9106 		  return FALSE;
   9107 	      }
   9108 	    break;
   9109 
   9110 	  case R_ARM_ABS12:
   9111 	    /* VxWorks uses dynamic R_ARM_ABS12 relocations for
   9112 	       ldr __GOTT_INDEX__ offsets.  */
   9113 	    if (!htab->vxworks_p)
   9114 	      break;
   9115 	    /* Fall through.  */
   9116 
   9117 	  case R_ARM_PC24:
   9118 	  case R_ARM_PLT32:
   9119 	  case R_ARM_CALL:
   9120 	  case R_ARM_JUMP24:
   9121 	  case R_ARM_PREL31:
   9122 	  case R_ARM_THM_CALL:
   9123 	  case R_ARM_THM_JUMP24:
   9124 	  case R_ARM_THM_JUMP19:
   9125 	    needs_plt = 1;
   9126 	    goto normal_reloc;
   9127 
   9128 	  case R_ARM_ABS32:
   9129 	  case R_ARM_ABS32_NOI:
   9130 	  case R_ARM_REL32:
   9131 	  case R_ARM_REL32_NOI:
   9132 	  case R_ARM_MOVW_ABS_NC:
   9133 	  case R_ARM_MOVT_ABS:
   9134 	  case R_ARM_MOVW_PREL_NC:
   9135 	  case R_ARM_MOVT_PREL:
   9136 	  case R_ARM_THM_MOVW_ABS_NC:
   9137 	  case R_ARM_THM_MOVT_ABS:
   9138 	  case R_ARM_THM_MOVW_PREL_NC:
   9139 	  case R_ARM_THM_MOVT_PREL:
   9140 	    needs_plt = 0;
   9141 	  normal_reloc:
   9142 
   9143 	    /* Should the interworking branches be listed here?  */
   9144 	    if (h != NULL)
   9145 	      {
   9146 		/* If this reloc is in a read-only section, we might
   9147 		   need a copy reloc.  We can't check reliably at this
   9148 		   stage whether the section is read-only, as input
   9149 		   sections have not yet been mapped to output sections.
   9150 		   Tentatively set the flag for now, and correct in
   9151 		   adjust_dynamic_symbol.  */
   9152 		if (!info->shared)
   9153 		  h->non_got_ref = 1;
   9154 
   9155 		/* We may need a .plt entry if the function this reloc
   9156 		   refers to is in a different object.  We can't tell for
   9157 		   sure yet, because something later might force the
   9158 		   symbol local.  */
   9159 		if (needs_plt)
   9160 		  h->needs_plt = 1;
   9161 
   9162 		/* If we create a PLT entry, this relocation will reference
   9163 		   it, even if it's an ABS32 relocation.  */
   9164 		h->plt.refcount += 1;
   9165 
   9166 		/* It's too early to use htab->use_blx here, so we have to
   9167 		   record possible blx references separately from
   9168 		   relocs that definitely need a thumb stub.  */
   9169 
   9170 		if (r_type == R_ARM_THM_CALL)
   9171 		  eh->plt_maybe_thumb_refcount += 1;
   9172 
   9173 		if (r_type == R_ARM_THM_JUMP24
   9174 		    || r_type == R_ARM_THM_JUMP19)
   9175 		  eh->plt_thumb_refcount += 1;
   9176 	      }
   9177 
   9178 	    /* If we are creating a shared library or relocatable executable,
   9179 	       and this is a reloc against a global symbol, or a non PC
   9180 	       relative reloc against a local symbol, then we need to copy
   9181 	       the reloc into the shared library.  However, if we are linking
   9182 	       with -Bsymbolic, we do not need to copy a reloc against a
   9183                global symbol which is defined in an object we are
   9184                including in the link (i.e., DEF_REGULAR is set).  At
   9185                this point we have not seen all the input files, so it is
   9186                possible that DEF_REGULAR is not set now but will be set
   9187                later (it is never cleared).  We account for that
   9188                possibility below by storing information in the
   9189                relocs_copied field of the hash table entry.  */
   9190 	    if ((info->shared || htab->root.is_relocatable_executable)
   9191 		&& (sec->flags & SEC_ALLOC) != 0
   9192 		&& ((r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI)
   9193 		    || (h != NULL && ! h->needs_plt
   9194 			&& (! info->symbolic || ! h->def_regular))))
   9195 	      {
   9196 		struct elf32_arm_relocs_copied *p, **head;
   9197 
   9198 	        /* When creating a shared object, we must copy these
   9199                    reloc types into the output file.  We create a reloc
   9200                    section in dynobj and make room for this reloc.  */
   9201 	        if (sreloc == NULL)
   9202 		  {
   9203 		    const char * name;
   9204 
   9205 		    name = (bfd_elf_string_from_elf_section
   9206 			    (abfd,
   9207 			     elf_elfheader (abfd)->e_shstrndx,
   9208 			     elf_section_data (sec)->rel_hdr.sh_name));
   9209 		    if (name == NULL)
   9210 		      return FALSE;
   9211 
   9212 		    BFD_ASSERT (reloc_section_p (htab, name, sec));
   9213 
   9214 		    sreloc = bfd_get_section_by_name (dynobj, name);
   9215 		    if (sreloc == NULL)
   9216 		      {
   9217 		        flagword flags;
   9218 
   9219 		        flags = (SEC_HAS_CONTENTS | SEC_READONLY
   9220 			         | SEC_IN_MEMORY | SEC_LINKER_CREATED);
   9221 		        if ((sec->flags & SEC_ALLOC) != 0
   9222 			    /* BPABI objects never have dynamic
   9223 			       relocations mapped.  */
   9224 			    && !htab->symbian_p)
   9225 			  flags |= SEC_ALLOC | SEC_LOAD;
   9226 		        sreloc = bfd_make_section_with_flags (dynobj,
   9227 							      name,
   9228 							      flags);
   9229 		        if (sreloc == NULL
   9230 			    || ! bfd_set_section_alignment (dynobj, sreloc, 2))
   9231 			  return FALSE;
   9232 		      }
   9233 
   9234 		    elf_section_data (sec)->sreloc = sreloc;
   9235 		  }
   9236 
   9237 		/* If this is a global symbol, we count the number of
   9238 		   relocations we need for this symbol.  */
   9239 		if (h != NULL)
   9240 		  {
   9241 		    head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied;
   9242 		  }
   9243 		else
   9244 		  {
   9245 		    /* Track dynamic relocs needed for local syms too.
   9246 		       We really need local syms available to do this
   9247 		       easily.  Oh well.  */
   9248 
   9249 		    asection *s;
   9250 		    void *vpp;
   9251 
   9252 		    s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
   9253 						   sec, r_symndx);
   9254 		    if (s == NULL)
   9255 		      return FALSE;
   9256 
   9257 		    vpp = &elf_section_data (s)->local_dynrel;
   9258 		    head = (struct elf32_arm_relocs_copied **) vpp;
   9259 		  }
   9260 
   9261 		p = *head;
   9262 		if (p == NULL || p->section != sec)
   9263 		  {
   9264 		    bfd_size_type amt = sizeof *p;
   9265 
   9266 		    p = bfd_alloc (htab->root.dynobj, amt);
   9267 		    if (p == NULL)
   9268 		      return FALSE;
   9269 		    p->next = *head;
   9270 		    *head = p;
   9271 		    p->section = sec;
   9272 		    p->count = 0;
   9273 		    p->pc_count = 0;
   9274 		  }
   9275 
   9276 		if (r_type == R_ARM_REL32 || r_type == R_ARM_REL32_NOI)
   9277 		  p->pc_count += 1;
   9278 		p->count += 1;
   9279 	      }
   9280 	    break;
   9281 
   9282         /* This relocation describes the C++ object vtable hierarchy.
   9283            Reconstruct it for later use during GC.  */
   9284         case R_ARM_GNU_VTINHERIT:
   9285           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   9286             return FALSE;
   9287           break;
   9288 
   9289         /* This relocation describes which C++ vtable entries are actually
   9290            used.  Record for later use during GC.  */
   9291         case R_ARM_GNU_VTENTRY:
   9292           BFD_ASSERT (h != NULL);
   9293           if (h != NULL
   9294               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
   9295             return FALSE;
   9296           break;
   9297         }
   9298     }
   9299 
   9300   return TRUE;
   9301 }
   9302 
   9303 /* Unwinding tables are not referenced directly.  This pass marks them as
   9304    required if the corresponding code section is marked.  */
   9305 
   9306 static bfd_boolean
   9307 elf32_arm_gc_mark_extra_sections (struct bfd_link_info *info,
   9308 				  elf_gc_mark_hook_fn gc_mark_hook)
   9309 {
   9310   bfd *sub;
   9311   Elf_Internal_Shdr **elf_shdrp;
   9312   bfd_boolean again;
   9313 
   9314   /* Marking EH data may cause additional code sections to be marked,
   9315      requiring multiple passes.  */
   9316   again = TRUE;
   9317   while (again)
   9318     {
   9319       again = FALSE;
   9320       for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
   9321 	{
   9322 	  asection *o;
   9323 
   9324 	  if (! is_arm_elf (sub))
   9325 	    continue;
   9326 
   9327 	  elf_shdrp = elf_elfsections (sub);
   9328 	  for (o = sub->sections; o != NULL; o = o->next)
   9329 	    {
   9330 	      Elf_Internal_Shdr *hdr;
   9331 
   9332 	      hdr = &elf_section_data (o)->this_hdr;
   9333 	      if (hdr->sh_type == SHT_ARM_EXIDX
   9334 		  && hdr->sh_link
   9335 		  && hdr->sh_link < elf_numsections (sub)
   9336 		  && !o->gc_mark
   9337 		  && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
   9338 		{
   9339 		  again = TRUE;
   9340 		  if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
   9341 		    return FALSE;
   9342 		}
   9343 	    }
   9344 	}
   9345     }
   9346 
   9347   return TRUE;
   9348 }
   9349 
   9350 /* Treat mapping symbols as special target symbols.  */
   9351 
   9352 static bfd_boolean
   9353 elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
   9354 {
   9355   return bfd_is_arm_special_symbol_name (sym->name,
   9356 					 BFD_ARM_SPECIAL_SYM_TYPE_ANY);
   9357 }
   9358 
   9359 /* This is a copy of elf_find_function() from elf.c except that
   9360    ARM mapping symbols are ignored when looking for function names
   9361    and STT_ARM_TFUNC is considered to a function type.  */
   9362 
   9363 static bfd_boolean
   9364 arm_elf_find_function (bfd *         abfd ATTRIBUTE_UNUSED,
   9365 		       asection *    section,
   9366 		       asymbol **    symbols,
   9367 		       bfd_vma       offset,
   9368 		       const char ** filename_ptr,
   9369 		       const char ** functionname_ptr)
   9370 {
   9371   const char * filename = NULL;
   9372   asymbol * func = NULL;
   9373   bfd_vma low_func = 0;
   9374   asymbol ** p;
   9375 
   9376   for (p = symbols; *p != NULL; p++)
   9377     {
   9378       elf_symbol_type *q;
   9379 
   9380       q = (elf_symbol_type *) *p;
   9381 
   9382       switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
   9383 	{
   9384 	default:
   9385 	  break;
   9386 	case STT_FILE:
   9387 	  filename = bfd_asymbol_name (&q->symbol);
   9388 	  break;
   9389 	case STT_FUNC:
   9390 	case STT_ARM_TFUNC:
   9391 	case STT_NOTYPE:
   9392 	  /* Skip mapping symbols.  */
   9393 	  if ((q->symbol.flags & BSF_LOCAL)
   9394 	      && bfd_is_arm_special_symbol_name (q->symbol.name,
   9395 		    BFD_ARM_SPECIAL_SYM_TYPE_ANY))
   9396 	    continue;
   9397 	  /* Fall through.  */
   9398 	  if (bfd_get_section (&q->symbol) == section
   9399 	      && q->symbol.value >= low_func
   9400 	      && q->symbol.value <= offset)
   9401 	    {
   9402 	      func = (asymbol *) q;
   9403 	      low_func = q->symbol.value;
   9404 	    }
   9405 	  break;
   9406 	}
   9407     }
   9408 
   9409   if (func == NULL)
   9410     return FALSE;
   9411 
   9412   if (filename_ptr)
   9413     *filename_ptr = filename;
   9414   if (functionname_ptr)
   9415     *functionname_ptr = bfd_asymbol_name (func);
   9416 
   9417   return TRUE;
   9418 }
   9419 
   9420 
   9421 /* Find the nearest line to a particular section and offset, for error
   9422    reporting.   This code is a duplicate of the code in elf.c, except
   9423    that it uses arm_elf_find_function.  */
   9424 
   9425 static bfd_boolean
   9426 elf32_arm_find_nearest_line (bfd *          abfd,
   9427 			     asection *     section,
   9428 			     asymbol **     symbols,
   9429 			     bfd_vma        offset,
   9430 			     const char **  filename_ptr,
   9431 			     const char **  functionname_ptr,
   9432 			     unsigned int * line_ptr)
   9433 {
   9434   bfd_boolean found = FALSE;
   9435 
   9436   /* We skip _bfd_dwarf1_find_nearest_line since no known ARM toolchain uses it.  */
   9437 
   9438   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
   9439 				     filename_ptr, functionname_ptr,
   9440 				     line_ptr, 0,
   9441 				     & elf_tdata (abfd)->dwarf2_find_line_info))
   9442     {
   9443       if (!*functionname_ptr)
   9444 	arm_elf_find_function (abfd, section, symbols, offset,
   9445 			       *filename_ptr ? NULL : filename_ptr,
   9446 			       functionname_ptr);
   9447 
   9448       return TRUE;
   9449     }
   9450 
   9451   if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
   9452 					     & found, filename_ptr,
   9453 					     functionname_ptr, line_ptr,
   9454 					     & elf_tdata (abfd)->line_info))
   9455     return FALSE;
   9456 
   9457   if (found && (*functionname_ptr || *line_ptr))
   9458     return TRUE;
   9459 
   9460   if (symbols == NULL)
   9461     return FALSE;
   9462 
   9463   if (! arm_elf_find_function (abfd, section, symbols, offset,
   9464 			       filename_ptr, functionname_ptr))
   9465     return FALSE;
   9466 
   9467   *line_ptr = 0;
   9468   return TRUE;
   9469 }
   9470 
   9471 static bfd_boolean
   9472 elf32_arm_find_inliner_info (bfd *          abfd,
   9473 			     const char **  filename_ptr,
   9474 			     const char **  functionname_ptr,
   9475 			     unsigned int * line_ptr)
   9476 {
   9477   bfd_boolean found;
   9478   found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
   9479 					 functionname_ptr, line_ptr,
   9480 					 & elf_tdata (abfd)->dwarf2_find_line_info);
   9481   return found;
   9482 }
   9483 
   9484 /* Adjust a symbol defined by a dynamic object and referenced by a
   9485    regular object.  The current definition is in some section of the
   9486    dynamic object, but we're not including those sections.  We have to
   9487    change the definition to something the rest of the link can
   9488    understand.  */
   9489 
   9490 static bfd_boolean
   9491 elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
   9492 				 struct elf_link_hash_entry * h)
   9493 {
   9494   bfd * dynobj;
   9495   asection * s;
   9496   struct elf32_arm_link_hash_entry * eh;
   9497   struct elf32_arm_link_hash_table *globals;
   9498 
   9499   globals = elf32_arm_hash_table (info);
   9500   dynobj = elf_hash_table (info)->dynobj;
   9501 
   9502   /* Make sure we know what is going on here.  */
   9503   BFD_ASSERT (dynobj != NULL
   9504 	      && (h->needs_plt
   9505 		  || h->u.weakdef != NULL
   9506 		  || (h->def_dynamic
   9507 		      && h->ref_regular
   9508 		      && !h->def_regular)));
   9509 
   9510   eh = (struct elf32_arm_link_hash_entry *) h;
   9511 
   9512   /* If this is a function, put it in the procedure linkage table.  We
   9513      will fill in the contents of the procedure linkage table later,
   9514      when we know the address of the .got section.  */
   9515   if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
   9516       || h->needs_plt)
   9517     {
   9518       if (h->plt.refcount <= 0
   9519 	  || SYMBOL_CALLS_LOCAL (info, h)
   9520 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   9521 	      && h->root.type == bfd_link_hash_undefweak))
   9522 	{
   9523 	  /* This case can occur if we saw a PLT32 reloc in an input
   9524 	     file, but the symbol was never referred to by a dynamic
   9525 	     object, or if all references were garbage collected.  In
   9526 	     such a case, we don't actually need to build a procedure
   9527 	     linkage table, and we can just do a PC24 reloc instead.  */
   9528 	  h->plt.offset = (bfd_vma) -1;
   9529 	  eh->plt_thumb_refcount = 0;
   9530 	  eh->plt_maybe_thumb_refcount = 0;
   9531 	  h->needs_plt = 0;
   9532 	}
   9533 
   9534       return TRUE;
   9535     }
   9536   else
   9537     {
   9538       /* It's possible that we incorrectly decided a .plt reloc was
   9539 	 needed for an R_ARM_PC24 or similar reloc to a non-function sym
   9540 	 in check_relocs.  We can't decide accurately between function
   9541 	 and non-function syms in check-relocs; Objects loaded later in
   9542 	 the link may change h->type.  So fix it now.  */
   9543       h->plt.offset = (bfd_vma) -1;
   9544       eh->plt_thumb_refcount = 0;
   9545       eh->plt_maybe_thumb_refcount = 0;
   9546     }
   9547 
   9548   /* If this is a weak symbol, and there is a real definition, the
   9549      processor independent code will have arranged for us to see the
   9550      real definition first, and we can just use the same value.  */
   9551   if (h->u.weakdef != NULL)
   9552     {
   9553       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   9554 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
   9555       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   9556       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   9557       return TRUE;
   9558     }
   9559 
   9560   /* If there are no non-GOT references, we do not need a copy
   9561      relocation.  */
   9562   if (!h->non_got_ref)
   9563     return TRUE;
   9564 
   9565   /* This is a reference to a symbol defined by a dynamic object which
   9566      is not a function.  */
   9567 
   9568   /* If we are creating a shared library, we must presume that the
   9569      only references to the symbol are via the global offset table.
   9570      For such cases we need not do anything here; the relocations will
   9571      be handled correctly by relocate_section.  Relocatable executables
   9572      can reference data in shared objects directly, so we don't need to
   9573      do anything here.  */
   9574   if (info->shared || globals->root.is_relocatable_executable)
   9575     return TRUE;
   9576 
   9577   if (h->size == 0)
   9578     {
   9579       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
   9580 			     h->root.root.string);
   9581       return TRUE;
   9582     }
   9583 
   9584   /* We must allocate the symbol in our .dynbss section, which will
   9585      become part of the .bss section of the executable.  There will be
   9586      an entry for this symbol in the .dynsym section.  The dynamic
   9587      object will contain position independent code, so all references
   9588      from the dynamic object to this symbol will go through the global
   9589      offset table.  The dynamic linker will use the .dynsym entry to
   9590      determine the address it must put in the global offset table, so
   9591      both the dynamic object and the regular object will refer to the
   9592      same memory location for the variable.  */
   9593   s = bfd_get_section_by_name (dynobj, ".dynbss");
   9594   BFD_ASSERT (s != NULL);
   9595 
   9596   /* We must generate a R_ARM_COPY reloc to tell the dynamic linker to
   9597      copy the initial value out of the dynamic object and into the
   9598      runtime process image.  We need to remember the offset into the
   9599      .rel(a).bss section we are going to use.  */
   9600   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
   9601     {
   9602       asection *srel;
   9603 
   9604       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (globals, ".bss"));
   9605       BFD_ASSERT (srel != NULL);
   9606       srel->size += RELOC_SIZE (globals);
   9607       h->needs_copy = 1;
   9608     }
   9609 
   9610   return _bfd_elf_adjust_dynamic_copy (h, s);
   9611 }
   9612 
   9613 /* Allocate space in .plt, .got and associated reloc sections for
   9614    dynamic relocs.  */
   9615 
   9616 static bfd_boolean
   9617 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   9618 {
   9619   struct bfd_link_info *info;
   9620   struct elf32_arm_link_hash_table *htab;
   9621   struct elf32_arm_link_hash_entry *eh;
   9622   struct elf32_arm_relocs_copied *p;
   9623   bfd_signed_vma thumb_refs;
   9624 
   9625   eh = (struct elf32_arm_link_hash_entry *) h;
   9626 
   9627   if (h->root.type == bfd_link_hash_indirect)
   9628     return TRUE;
   9629 
   9630   if (h->root.type == bfd_link_hash_warning)
   9631     /* When warning symbols are created, they **replace** the "real"
   9632        entry in the hash table, thus we never get to see the real
   9633        symbol in a hash traversal.  So look at it now.  */
   9634     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   9635 
   9636   info = (struct bfd_link_info *) inf;
   9637   htab = elf32_arm_hash_table (info);
   9638 
   9639   if (htab->root.dynamic_sections_created
   9640       && h->plt.refcount > 0)
   9641     {
   9642       /* Make sure this symbol is output as a dynamic symbol.
   9643 	 Undefined weak syms won't yet be marked as dynamic.  */
   9644       if (h->dynindx == -1
   9645 	  && !h->forced_local)
   9646 	{
   9647 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   9648 	    return FALSE;
   9649 	}
   9650 
   9651       if (info->shared
   9652 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
   9653 	{
   9654 	  asection *s = htab->splt;
   9655 
   9656 	  /* If this is the first .plt entry, make room for the special
   9657 	     first entry.  */
   9658 	  if (s->size == 0)
   9659 	    s->size += htab->plt_header_size;
   9660 
   9661 	  h->plt.offset = s->size;
   9662 
   9663 	  /* If we will insert a Thumb trampoline before this PLT, leave room
   9664 	     for it.  */
   9665 	  thumb_refs = eh->plt_thumb_refcount;
   9666 	  if (!htab->use_blx)
   9667 	    thumb_refs += eh->plt_maybe_thumb_refcount;
   9668 
   9669 	  if (thumb_refs > 0)
   9670 	    {
   9671 	      h->plt.offset += PLT_THUMB_STUB_SIZE;
   9672 	      s->size += PLT_THUMB_STUB_SIZE;
   9673 	    }
   9674 
   9675 	  /* If this symbol is not defined in a regular file, and we are
   9676 	     not generating a shared library, then set the symbol to this
   9677 	     location in the .plt.  This is required to make function
   9678 	     pointers compare as equal between the normal executable and
   9679 	     the shared library.  */
   9680 	  if (! info->shared
   9681 	      && !h->def_regular)
   9682 	    {
   9683 	      h->root.u.def.section = s;
   9684 	      h->root.u.def.value = h->plt.offset;
   9685 
   9686 	      /* Make sure the function is not marked as Thumb, in case
   9687 		 it is the target of an ABS32 relocation, which will
   9688 		 point to the PLT entry.  */
   9689 	      if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
   9690 		h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
   9691 	    }
   9692 
   9693 	  /* Make room for this entry.  */
   9694 	  s->size += htab->plt_entry_size;
   9695 
   9696 	  if (!htab->symbian_p)
   9697 	    {
   9698 	      /* We also need to make an entry in the .got.plt section, which
   9699 		 will be placed in the .got section by the linker script.  */
   9700 	      eh->plt_got_offset = htab->sgotplt->size;
   9701 	      htab->sgotplt->size += 4;
   9702 	    }
   9703 
   9704 	  /* We also need to make an entry in the .rel(a).plt section.  */
   9705 	  htab->srelplt->size += RELOC_SIZE (htab);
   9706 
   9707 	  /* VxWorks executables have a second set of relocations for
   9708 	     each PLT entry.  They go in a separate relocation section,
   9709 	     which is processed by the kernel loader.  */
   9710 	  if (htab->vxworks_p && !info->shared)
   9711 	    {
   9712 	      /* There is a relocation for the initial PLT entry:
   9713 		 an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_.  */
   9714 	      if (h->plt.offset == htab->plt_header_size)
   9715 		htab->srelplt2->size += RELOC_SIZE (htab);
   9716 
   9717 	      /* There are two extra relocations for each subsequent
   9718 		 PLT entry: an R_ARM_32 relocation for the GOT entry,
   9719 		 and an R_ARM_32 relocation for the PLT entry.  */
   9720 	      htab->srelplt2->size += RELOC_SIZE (htab) * 2;
   9721 	    }
   9722 	}
   9723       else
   9724 	{
   9725 	  h->plt.offset = (bfd_vma) -1;
   9726 	  h->needs_plt = 0;
   9727 	}
   9728     }
   9729   else
   9730     {
   9731       h->plt.offset = (bfd_vma) -1;
   9732       h->needs_plt = 0;
   9733     }
   9734 
   9735   if (h->got.refcount > 0)
   9736     {
   9737       asection *s;
   9738       bfd_boolean dyn;
   9739       int tls_type = elf32_arm_hash_entry (h)->tls_type;
   9740       int indx;
   9741 
   9742       /* Make sure this symbol is output as a dynamic symbol.
   9743 	 Undefined weak syms won't yet be marked as dynamic.  */
   9744       if (h->dynindx == -1
   9745 	  && !h->forced_local)
   9746 	{
   9747 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   9748 	    return FALSE;
   9749 	}
   9750 
   9751       if (!htab->symbian_p)
   9752 	{
   9753 	  s = htab->sgot;
   9754 	  h->got.offset = s->size;
   9755 
   9756 	  if (tls_type == GOT_UNKNOWN)
   9757 	    abort ();
   9758 
   9759 	  if (tls_type == GOT_NORMAL)
   9760 	    /* Non-TLS symbols need one GOT slot.  */
   9761 	    s->size += 4;
   9762 	  else
   9763 	    {
   9764 	      if (tls_type & GOT_TLS_GD)
   9765 		/* R_ARM_TLS_GD32 needs 2 consecutive GOT slots.  */
   9766 		s->size += 8;
   9767 	      if (tls_type & GOT_TLS_IE)
   9768 		/* R_ARM_TLS_IE32 needs one GOT slot.  */
   9769 		s->size += 4;
   9770 	    }
   9771 
   9772 	  dyn = htab->root.dynamic_sections_created;
   9773 
   9774 	  indx = 0;
   9775 	  if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   9776 	      && (!info->shared
   9777 		  || !SYMBOL_REFERENCES_LOCAL (info, h)))
   9778 	    indx = h->dynindx;
   9779 
   9780 	  if (tls_type != GOT_NORMAL
   9781 	      && (info->shared || indx != 0)
   9782 	      && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   9783 		  || h->root.type != bfd_link_hash_undefweak))
   9784 	    {
   9785 	      if (tls_type & GOT_TLS_IE)
   9786 		htab->srelgot->size += RELOC_SIZE (htab);
   9787 
   9788 	      if (tls_type & GOT_TLS_GD)
   9789 		htab->srelgot->size += RELOC_SIZE (htab);
   9790 
   9791 	      if ((tls_type & GOT_TLS_GD) && indx != 0)
   9792 		htab->srelgot->size += RELOC_SIZE (htab);
   9793 	    }
   9794 	  else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   9795 		    || h->root.type != bfd_link_hash_undefweak)
   9796 		   && (info->shared
   9797 	    	   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
   9798 	    htab->srelgot->size += RELOC_SIZE (htab);
   9799 	}
   9800     }
   9801   else
   9802     h->got.offset = (bfd_vma) -1;
   9803 
   9804   /* Allocate stubs for exported Thumb functions on v4t.  */
   9805   if (!htab->use_blx && h->dynindx != -1
   9806       && h->def_regular
   9807       && ELF_ST_TYPE (h->type) == STT_ARM_TFUNC
   9808       && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
   9809     {
   9810       struct elf_link_hash_entry * th;
   9811       struct bfd_link_hash_entry * bh;
   9812       struct elf_link_hash_entry * myh;
   9813       char name[1024];
   9814       asection *s;
   9815       bh = NULL;
   9816       /* Create a new symbol to regist the real location of the function.  */
   9817       s = h->root.u.def.section;
   9818       sprintf (name, "__real_%s", h->root.root.string);
   9819       _bfd_generic_link_add_one_symbol (info, s->owner,
   9820 					name, BSF_GLOBAL, s,
   9821 					h->root.u.def.value,
   9822 					NULL, TRUE, FALSE, &bh);
   9823 
   9824       myh = (struct elf_link_hash_entry *) bh;
   9825       myh->type = ELF_ST_INFO (STB_LOCAL, STT_ARM_TFUNC);
   9826       myh->forced_local = 1;
   9827       eh->export_glue = myh;
   9828       th = record_arm_to_thumb_glue (info, h);
   9829       /* Point the symbol at the stub.  */
   9830       h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
   9831       h->root.u.def.section = th->root.u.def.section;
   9832       h->root.u.def.value = th->root.u.def.value & ~1;
   9833     }
   9834 
   9835   if (eh->relocs_copied == NULL)
   9836     return TRUE;
   9837 
   9838   /* In the shared -Bsymbolic case, discard space allocated for
   9839      dynamic pc-relative relocs against symbols which turn out to be
   9840      defined in regular objects.  For the normal shared case, discard
   9841      space for pc-relative relocs that have become local due to symbol
   9842      visibility changes.  */
   9843 
   9844   if (info->shared || htab->root.is_relocatable_executable)
   9845     {
   9846       /* The only relocs that use pc_count are R_ARM_REL32 and
   9847          R_ARM_REL32_NOI, which will appear on something like
   9848          ".long foo - .".  We want calls to protected symbols to resolve
   9849          directly to the function rather than going via the plt.  If people
   9850          want function pointer comparisons to work as expected then they
   9851          should avoid writing assembly like ".long foo - .".  */
   9852       if (SYMBOL_CALLS_LOCAL (info, h))
   9853 	{
   9854 	  struct elf32_arm_relocs_copied **pp;
   9855 
   9856 	  for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
   9857 	    {
   9858 	      p->count -= p->pc_count;
   9859 	      p->pc_count = 0;
   9860 	      if (p->count == 0)
   9861 		*pp = p->next;
   9862 	      else
   9863 		pp = &p->next;
   9864 	    }
   9865 	}
   9866 
   9867       if (elf32_arm_hash_table (info)->vxworks_p)
   9868 	{
   9869 	  struct elf32_arm_relocs_copied **pp;
   9870 
   9871 	  for (pp = &eh->relocs_copied; (p = *pp) != NULL; )
   9872 	    {
   9873 	      if (strcmp (p->section->output_section->name, ".tls_vars") == 0)
   9874 		*pp = p->next;
   9875 	      else
   9876 		pp = &p->next;
   9877 	    }
   9878 	}
   9879 
   9880       /* Also discard relocs on undefined weak syms with non-default
   9881          visibility.  */
   9882       if (eh->relocs_copied != NULL
   9883 	  && h->root.type == bfd_link_hash_undefweak)
   9884 	{
   9885 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   9886 	    eh->relocs_copied = NULL;
   9887 
   9888 	  /* Make sure undefined weak symbols are output as a dynamic
   9889 	     symbol in PIEs.  */
   9890 	  else if (h->dynindx == -1
   9891 		   && !h->forced_local)
   9892 	    {
   9893 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   9894 		return FALSE;
   9895 	    }
   9896 	}
   9897 
   9898       else if (htab->root.is_relocatable_executable && h->dynindx == -1
   9899 	       && h->root.type == bfd_link_hash_new)
   9900 	{
   9901 	  /* Output absolute symbols so that we can create relocations
   9902 	     against them.  For normal symbols we output a relocation
   9903 	     against the section that contains them.  */
   9904 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   9905 	    return FALSE;
   9906 	}
   9907 
   9908     }
   9909   else
   9910     {
   9911       /* For the non-shared case, discard space for relocs against
   9912 	 symbols which turn out to need copy relocs or are not
   9913 	 dynamic.  */
   9914 
   9915       if (!h->non_got_ref
   9916 	  && ((h->def_dynamic
   9917 	       && !h->def_regular)
   9918 	      || (htab->root.dynamic_sections_created
   9919 		  && (h->root.type == bfd_link_hash_undefweak
   9920 		      || h->root.type == bfd_link_hash_undefined))))
   9921 	{
   9922 	  /* Make sure this symbol is output as a dynamic symbol.
   9923 	     Undefined weak syms won't yet be marked as dynamic.  */
   9924 	  if (h->dynindx == -1
   9925 	      && !h->forced_local)
   9926 	    {
   9927 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   9928 		return FALSE;
   9929 	    }
   9930 
   9931 	  /* If that succeeded, we know we'll be keeping all the
   9932 	     relocs.  */
   9933 	  if (h->dynindx != -1)
   9934 	    goto keep;
   9935 	}
   9936 
   9937       eh->relocs_copied = NULL;
   9938 
   9939     keep: ;
   9940     }
   9941 
   9942   /* Finally, allocate space.  */
   9943   for (p = eh->relocs_copied; p != NULL; p = p->next)
   9944     {
   9945       asection *sreloc = elf_section_data (p->section)->sreloc;
   9946       sreloc->size += p->count * RELOC_SIZE (htab);
   9947     }
   9948 
   9949   return TRUE;
   9950 }
   9951 
   9952 /* Find any dynamic relocs that apply to read-only sections.  */
   9953 
   9954 static bfd_boolean
   9955 elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
   9956 {
   9957   struct elf32_arm_link_hash_entry * eh;
   9958   struct elf32_arm_relocs_copied * p;
   9959 
   9960   if (h->root.type == bfd_link_hash_warning)
   9961     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   9962 
   9963   eh = (struct elf32_arm_link_hash_entry *) h;
   9964   for (p = eh->relocs_copied; p != NULL; p = p->next)
   9965     {
   9966       asection *s = p->section;
   9967 
   9968       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   9969 	{
   9970 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
   9971 
   9972 	  info->flags |= DF_TEXTREL;
   9973 
   9974 	  /* Not an error, just cut short the traversal.  */
   9975 	  return FALSE;
   9976 	}
   9977     }
   9978   return TRUE;
   9979 }
   9980 
   9981 void
   9982 bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
   9983 				 int byteswap_code)
   9984 {
   9985   struct elf32_arm_link_hash_table *globals;
   9986 
   9987   globals = elf32_arm_hash_table (info);
   9988   globals->byteswap_code = byteswap_code;
   9989 }
   9990 
   9991 /* Set the sizes of the dynamic sections.  */
   9992 
   9993 static bfd_boolean
   9994 elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
   9995 				 struct bfd_link_info * info)
   9996 {
   9997   bfd * dynobj;
   9998   asection * s;
   9999   bfd_boolean plt;
   10000   bfd_boolean relocs;
   10001   bfd *ibfd;
   10002   struct elf32_arm_link_hash_table *htab;
   10003 
   10004   htab = elf32_arm_hash_table (info);
   10005   dynobj = elf_hash_table (info)->dynobj;
   10006   BFD_ASSERT (dynobj != NULL);
   10007   check_use_blx (htab);
   10008 
   10009   if (elf_hash_table (info)->dynamic_sections_created)
   10010     {
   10011       /* Set the contents of the .interp section to the interpreter.  */
   10012       if (info->executable)
   10013 	{
   10014 	  s = bfd_get_section_by_name (dynobj, ".interp");
   10015 	  BFD_ASSERT (s != NULL);
   10016 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   10017 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   10018 	}
   10019     }
   10020 
   10021   /* Set up .got offsets for local syms, and space for local dynamic
   10022      relocs.  */
   10023   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   10024     {
   10025       bfd_signed_vma *local_got;
   10026       bfd_signed_vma *end_local_got;
   10027       char *local_tls_type;
   10028       bfd_size_type locsymcount;
   10029       Elf_Internal_Shdr *symtab_hdr;
   10030       asection *srel;
   10031       bfd_boolean is_vxworks = elf32_arm_hash_table (info)->vxworks_p;
   10032 
   10033       if (! is_arm_elf (ibfd))
   10034 	continue;
   10035 
   10036       for (s = ibfd->sections; s != NULL; s = s->next)
   10037 	{
   10038 	  struct elf32_arm_relocs_copied *p;
   10039 
   10040 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   10041 	    {
   10042 	      if (!bfd_is_abs_section (p->section)
   10043 		  && bfd_is_abs_section (p->section->output_section))
   10044 		{
   10045 		  /* Input section has been discarded, either because
   10046 		     it is a copy of a linkonce section or due to
   10047 		     linker script /DISCARD/, so we'll be discarding
   10048 		     the relocs too.  */
   10049 		}
   10050 	      else if (is_vxworks
   10051 		       && strcmp (p->section->output_section->name,
   10052 				  ".tls_vars") == 0)
   10053 		{
   10054 		  /* Relocations in vxworks .tls_vars sections are
   10055 		     handled specially by the loader.  */
   10056 		}
   10057 	      else if (p->count != 0)
   10058 		{
   10059 		  srel = elf_section_data (p->section)->sreloc;
   10060 		  srel->size += p->count * RELOC_SIZE (htab);
   10061 		  if ((p->section->output_section->flags & SEC_READONLY) != 0)
   10062 		    info->flags |= DF_TEXTREL;
   10063 		}
   10064 	    }
   10065 	}
   10066 
   10067       local_got = elf_local_got_refcounts (ibfd);
   10068       if (!local_got)
   10069 	continue;
   10070 
   10071       symtab_hdr = & elf_symtab_hdr (ibfd);
   10072       locsymcount = symtab_hdr->sh_info;
   10073       end_local_got = local_got + locsymcount;
   10074       local_tls_type = elf32_arm_local_got_tls_type (ibfd);
   10075       s = htab->sgot;
   10076       srel = htab->srelgot;
   10077       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   10078 	{
   10079 	  if (*local_got > 0)
   10080 	    {
   10081 	      *local_got = s->size;
   10082 	      if (*local_tls_type & GOT_TLS_GD)
   10083 		/* TLS_GD relocs need an 8-byte structure in the GOT.  */
   10084 		s->size += 8;
   10085 	      if (*local_tls_type & GOT_TLS_IE)
   10086 		s->size += 4;
   10087 	      if (*local_tls_type == GOT_NORMAL)
   10088 		s->size += 4;
   10089 
   10090 	      if (info->shared || *local_tls_type == GOT_TLS_GD)
   10091 		srel->size += RELOC_SIZE (htab);
   10092 	    }
   10093 	  else
   10094 	    *local_got = (bfd_vma) -1;
   10095 	}
   10096     }
   10097 
   10098   if (htab->tls_ldm_got.refcount > 0)
   10099     {
   10100       /* Allocate two GOT entries and one dynamic relocation (if necessary)
   10101 	 for R_ARM_TLS_LDM32 relocations.  */
   10102       htab->tls_ldm_got.offset = htab->sgot->size;
   10103       htab->sgot->size += 8;
   10104       if (info->shared)
   10105 	htab->srelgot->size += RELOC_SIZE (htab);
   10106     }
   10107   else
   10108     htab->tls_ldm_got.offset = -1;
   10109 
   10110   /* Allocate global sym .plt and .got entries, and space for global
   10111      sym dynamic relocs.  */
   10112   elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info);
   10113 
   10114   /* Here we rummage through the found bfds to collect glue information.  */
   10115   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
   10116     {
   10117       if (! is_arm_elf (ibfd))
   10118 	continue;
   10119 
   10120       /* Initialise mapping tables for code/data.  */
   10121       bfd_elf32_arm_init_maps (ibfd);
   10122 
   10123       if (!bfd_elf32_arm_process_before_allocation (ibfd, info)
   10124 	  || !bfd_elf32_arm_vfp11_erratum_scan (ibfd, info))
   10125         /* xgettext:c-format */
   10126         _bfd_error_handler (_("Errors encountered processing file %s"),
   10127 			    ibfd->filename);
   10128     }
   10129 
   10130   /* The check_relocs and adjust_dynamic_symbol entry points have
   10131      determined the sizes of the various dynamic sections.  Allocate
   10132      memory for them.  */
   10133   plt = FALSE;
   10134   relocs = FALSE;
   10135   for (s = dynobj->sections; s != NULL; s = s->next)
   10136     {
   10137       const char * name;
   10138 
   10139       if ((s->flags & SEC_LINKER_CREATED) == 0)
   10140 	continue;
   10141 
   10142       /* It's OK to base decisions on the section name, because none
   10143 	 of the dynobj section names depend upon the input files.  */
   10144       name = bfd_get_section_name (dynobj, s);
   10145 
   10146       if (strcmp (name, ".plt") == 0)
   10147 	{
   10148 	  /* Remember whether there is a PLT.  */
   10149 	  plt = s->size != 0;
   10150 	}
   10151       else if (CONST_STRNEQ (name, ".rel"))
   10152 	{
   10153 	  if (s->size != 0)
   10154 	    {
   10155 	      /* Remember whether there are any reloc sections other
   10156 		 than .rel(a).plt and .rela.plt.unloaded.  */
   10157 	      if (s != htab->srelplt && s != htab->srelplt2)
   10158 		relocs = TRUE;
   10159 
   10160 	      /* We use the reloc_count field as a counter if we need
   10161 		 to copy relocs into the output file.  */
   10162 	      s->reloc_count = 0;
   10163 	    }
   10164 	}
   10165       else if (! CONST_STRNEQ (name, ".got")
   10166 	       && strcmp (name, ".dynbss") != 0)
   10167 	{
   10168 	  /* It's not one of our sections, so don't allocate space.  */
   10169 	  continue;
   10170 	}
   10171 
   10172       if (s->size == 0)
   10173 	{
   10174 	  /* If we don't need this section, strip it from the
   10175 	     output file.  This is mostly to handle .rel(a).bss and
   10176 	     .rel(a).plt.  We must create both sections in
   10177 	     create_dynamic_sections, because they must be created
   10178 	     before the linker maps input sections to output
   10179 	     sections.  The linker does that before
   10180 	     adjust_dynamic_symbol is called, and it is that
   10181 	     function which decides whether anything needs to go
   10182 	     into these sections.  */
   10183 	  s->flags |= SEC_EXCLUDE;
   10184 	  continue;
   10185 	}
   10186 
   10187       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   10188 	continue;
   10189 
   10190       /* Allocate memory for the section contents.  */
   10191       s->contents = bfd_zalloc (dynobj, s->size);
   10192       if (s->contents == NULL)
   10193 	return FALSE;
   10194     }
   10195 
   10196   if (elf_hash_table (info)->dynamic_sections_created)
   10197     {
   10198       /* Add some entries to the .dynamic section.  We fill in the
   10199 	 values later, in elf32_arm_finish_dynamic_sections, but we
   10200 	 must add the entries now so that we get the correct size for
   10201 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   10202 	 dynamic linker and used by the debugger.  */
   10203 #define add_dynamic_entry(TAG, VAL) \
   10204   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   10205 
   10206      if (info->executable)
   10207 	{
   10208 	  if (!add_dynamic_entry (DT_DEBUG, 0))
   10209 	    return FALSE;
   10210 	}
   10211 
   10212       if (plt)
   10213 	{
   10214 	  if (   !add_dynamic_entry (DT_PLTGOT, 0)
   10215 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
   10216 	      || !add_dynamic_entry (DT_PLTREL,
   10217 				     htab->use_rel ? DT_REL : DT_RELA)
   10218 	      || !add_dynamic_entry (DT_JMPREL, 0))
   10219 	    return FALSE;
   10220 	}
   10221 
   10222       if (relocs)
   10223 	{
   10224 	  if (htab->use_rel)
   10225 	    {
   10226 	      if (!add_dynamic_entry (DT_REL, 0)
   10227 		  || !add_dynamic_entry (DT_RELSZ, 0)
   10228 		  || !add_dynamic_entry (DT_RELENT, RELOC_SIZE (htab)))
   10229 		return FALSE;
   10230 	    }
   10231 	  else
   10232 	    {
   10233 	      if (!add_dynamic_entry (DT_RELA, 0)
   10234 		  || !add_dynamic_entry (DT_RELASZ, 0)
   10235 		  || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
   10236 		return FALSE;
   10237 	    }
   10238 	}
   10239 
   10240       /* If any dynamic relocs apply to a read-only section,
   10241 	 then we need a DT_TEXTREL entry.  */
   10242       if ((info->flags & DF_TEXTREL) == 0)
   10243 	elf_link_hash_traverse (& htab->root, elf32_arm_readonly_dynrelocs,
   10244 				info);
   10245 
   10246       if ((info->flags & DF_TEXTREL) != 0)
   10247 	{
   10248 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
   10249 	    return FALSE;
   10250 	}
   10251       if (htab->vxworks_p
   10252 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
   10253 	return FALSE;
   10254     }
   10255 #undef add_dynamic_entry
   10256 
   10257   return TRUE;
   10258 }
   10259 
   10260 /* Finish up dynamic symbol handling.  We set the contents of various
   10261    dynamic sections here.  */
   10262 
   10263 static bfd_boolean
   10264 elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
   10265 				 struct bfd_link_info * info,
   10266 				 struct elf_link_hash_entry * h,
   10267 				 Elf_Internal_Sym * sym)
   10268 {
   10269   bfd * dynobj;
   10270   struct elf32_arm_link_hash_table *htab;
   10271   struct elf32_arm_link_hash_entry *eh;
   10272 
   10273   dynobj = elf_hash_table (info)->dynobj;
   10274   htab = elf32_arm_hash_table (info);
   10275   eh = (struct elf32_arm_link_hash_entry *) h;
   10276 
   10277   if (h->plt.offset != (bfd_vma) -1)
   10278     {
   10279       asection * splt;
   10280       asection * srel;
   10281       bfd_byte *loc;
   10282       bfd_vma plt_index;
   10283       Elf_Internal_Rela rel;
   10284 
   10285       /* This symbol has an entry in the procedure linkage table.  Set
   10286 	 it up.  */
   10287 
   10288       BFD_ASSERT (h->dynindx != -1);
   10289 
   10290       splt = bfd_get_section_by_name (dynobj, ".plt");
   10291       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".plt"));
   10292       BFD_ASSERT (splt != NULL && srel != NULL);
   10293 
   10294       /* Fill in the entry in the procedure linkage table.  */
   10295       if (htab->symbian_p)
   10296 	{
   10297 	  put_arm_insn (htab, output_bfd,
   10298 		      elf32_arm_symbian_plt_entry[0],
   10299 		      splt->contents + h->plt.offset);
   10300 	  bfd_put_32 (output_bfd,
   10301 		      elf32_arm_symbian_plt_entry[1],
   10302 		      splt->contents + h->plt.offset + 4);
   10303 
   10304 	  /* Fill in the entry in the .rel.plt section.  */
   10305 	  rel.r_offset = (splt->output_section->vma
   10306 			  + splt->output_offset
   10307 			  + h->plt.offset + 4);
   10308 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
   10309 
   10310 	  /* Get the index in the procedure linkage table which
   10311 	     corresponds to this symbol.  This is the index of this symbol
   10312 	     in all the symbols for which we are making plt entries.  The
   10313 	     first entry in the procedure linkage table is reserved.  */
   10314 	  plt_index = ((h->plt.offset - htab->plt_header_size)
   10315 		       / htab->plt_entry_size);
   10316 	}
   10317       else
   10318 	{
   10319 	  bfd_vma got_offset, got_address, plt_address;
   10320 	  bfd_vma got_displacement;
   10321 	  asection * sgot;
   10322 	  bfd_byte * ptr;
   10323 
   10324 	  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
   10325 	  BFD_ASSERT (sgot != NULL);
   10326 
   10327 	  /* Get the offset into the .got.plt table of the entry that
   10328 	     corresponds to this function.  */
   10329 	  got_offset = eh->plt_got_offset;
   10330 
   10331 	  /* Get the index in the procedure linkage table which
   10332 	     corresponds to this symbol.  This is the index of this symbol
   10333 	     in all the symbols for which we are making plt entries.  The
   10334 	     first three entries in .got.plt are reserved; after that
   10335 	     symbols appear in the same order as in .plt.  */
   10336 	  plt_index = (got_offset - 12) / 4;
   10337 
   10338 	  /* Calculate the address of the GOT entry.  */
   10339 	  got_address = (sgot->output_section->vma
   10340 			 + sgot->output_offset
   10341 			 + got_offset);
   10342 
   10343 	  /* ...and the address of the PLT entry.  */
   10344 	  plt_address = (splt->output_section->vma
   10345 			 + splt->output_offset
   10346 			 + h->plt.offset);
   10347 
   10348 	  ptr = htab->splt->contents + h->plt.offset;
   10349 	  if (htab->vxworks_p && info->shared)
   10350 	    {
   10351 	      unsigned int i;
   10352 	      bfd_vma val;
   10353 
   10354 	      for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
   10355 		{
   10356 		  val = elf32_arm_vxworks_shared_plt_entry[i];
   10357 		  if (i == 2)
   10358 		    val |= got_address - sgot->output_section->vma;
   10359 		  if (i == 5)
   10360 		    val |= plt_index * RELOC_SIZE (htab);
   10361 		  if (i == 2 || i == 5)
   10362 		    bfd_put_32 (output_bfd, val, ptr);
   10363 		  else
   10364 		    put_arm_insn (htab, output_bfd, val, ptr);
   10365 		}
   10366 	    }
   10367 	  else if (htab->vxworks_p)
   10368 	    {
   10369 	      unsigned int i;
   10370 	      bfd_vma val;
   10371 
   10372 	      for (i = 0; i != htab->plt_entry_size / 4; i++, ptr += 4)
   10373 		{
   10374 		  val = elf32_arm_vxworks_exec_plt_entry[i];
   10375 		  if (i == 2)
   10376 		    val |= got_address;
   10377 		  if (i == 4)
   10378 		    val |= 0xffffff & -((h->plt.offset + i * 4 + 8) >> 2);
   10379 		  if (i == 5)
   10380 		    val |= plt_index * RELOC_SIZE (htab);
   10381 		  if (i == 2 || i == 5)
   10382 		    bfd_put_32 (output_bfd, val, ptr);
   10383 		  else
   10384 		    put_arm_insn (htab, output_bfd, val, ptr);
   10385 		}
   10386 
   10387 	      loc = (htab->srelplt2->contents
   10388 		     + (plt_index * 2 + 1) * RELOC_SIZE (htab));
   10389 
   10390 	      /* Create the .rela.plt.unloaded R_ARM_ABS32 relocation
   10391 		 referencing the GOT for this PLT entry.  */
   10392 	      rel.r_offset = plt_address + 8;
   10393 	      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
   10394 	      rel.r_addend = got_offset;
   10395 	      SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
   10396 	      loc += RELOC_SIZE (htab);
   10397 
   10398 	      /* Create the R_ARM_ABS32 relocation referencing the
   10399 		 beginning of the PLT for this GOT entry.  */
   10400 	      rel.r_offset = got_address;
   10401 	      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
   10402 	      rel.r_addend = 0;
   10403 	      SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
   10404 	    }
   10405 	  else
   10406 	    {
   10407 	      bfd_signed_vma thumb_refs;
   10408 	      /* Calculate the displacement between the PLT slot and the
   10409 		 entry in the GOT.  The eight-byte offset accounts for the
   10410 		 value produced by adding to pc in the first instruction
   10411 		 of the PLT stub.  */
   10412 	      got_displacement = got_address - (plt_address + 8);
   10413 
   10414 	      BFD_ASSERT ((got_displacement & 0xf0000000) == 0);
   10415 
   10416 	      thumb_refs = eh->plt_thumb_refcount;
   10417 	      if (!htab->use_blx)
   10418 		thumb_refs += eh->plt_maybe_thumb_refcount;
   10419 
   10420 	      if (thumb_refs > 0)
   10421 		{
   10422 		  put_thumb_insn (htab, output_bfd,
   10423 				  elf32_arm_plt_thumb_stub[0], ptr - 4);
   10424 		  put_thumb_insn (htab, output_bfd,
   10425 				  elf32_arm_plt_thumb_stub[1], ptr - 2);
   10426 		}
   10427 
   10428 	      put_arm_insn (htab, output_bfd,
   10429 			    elf32_arm_plt_entry[0]
   10430 			    | ((got_displacement & 0x0ff00000) >> 20),
   10431 			    ptr + 0);
   10432 	      put_arm_insn (htab, output_bfd,
   10433 			    elf32_arm_plt_entry[1]
   10434 			    | ((got_displacement & 0x000ff000) >> 12),
   10435 			    ptr+ 4);
   10436 	      put_arm_insn (htab, output_bfd,
   10437 			    elf32_arm_plt_entry[2]
   10438 			    | (got_displacement & 0x00000fff),
   10439 			    ptr + 8);
   10440 #ifdef FOUR_WORD_PLT
   10441 	      bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ptr + 12);
   10442 #endif
   10443 	    }
   10444 
   10445 	  /* Fill in the entry in the global offset table.  */
   10446 	  bfd_put_32 (output_bfd,
   10447 		      (splt->output_section->vma
   10448 		       + splt->output_offset),
   10449 		      sgot->contents + got_offset);
   10450 
   10451 	  /* Fill in the entry in the .rel(a).plt section.  */
   10452 	  rel.r_addend = 0;
   10453 	  rel.r_offset = got_address;
   10454 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_JUMP_SLOT);
   10455 	}
   10456 
   10457       loc = srel->contents + plt_index * RELOC_SIZE (htab);
   10458       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
   10459 
   10460       if (!h->def_regular)
   10461 	{
   10462 	  /* Mark the symbol as undefined, rather than as defined in
   10463 	     the .plt section.  Leave the value alone.  */
   10464 	  sym->st_shndx = SHN_UNDEF;
   10465 	  /* If the symbol is weak, we do need to clear the value.
   10466 	     Otherwise, the PLT entry would provide a definition for
   10467 	     the symbol even if the symbol wasn't defined anywhere,
   10468 	     and so the symbol would never be NULL.  */
   10469 	  if (!h->ref_regular_nonweak)
   10470 	    sym->st_value = 0;
   10471 	}
   10472     }
   10473 
   10474   if (h->got.offset != (bfd_vma) -1
   10475       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_GD) == 0
   10476       && (elf32_arm_hash_entry (h)->tls_type & GOT_TLS_IE) == 0)
   10477     {
   10478       asection * sgot;
   10479       asection * srel;
   10480       Elf_Internal_Rela rel;
   10481       bfd_byte *loc;
   10482       bfd_vma offset;
   10483 
   10484       /* This symbol has an entry in the global offset table.  Set it
   10485 	 up.  */
   10486       sgot = bfd_get_section_by_name (dynobj, ".got");
   10487       srel = bfd_get_section_by_name (dynobj, RELOC_SECTION (htab, ".got"));
   10488       BFD_ASSERT (sgot != NULL && srel != NULL);
   10489 
   10490       offset = (h->got.offset & ~(bfd_vma) 1);
   10491       rel.r_addend = 0;
   10492       rel.r_offset = (sgot->output_section->vma
   10493 		      + sgot->output_offset
   10494 		      + offset);
   10495 
   10496       /* If this is a static link, or it is a -Bsymbolic link and the
   10497 	 symbol is defined locally or was forced to be local because
   10498 	 of a version file, we just want to emit a RELATIVE reloc.
   10499 	 The entry in the global offset table will already have been
   10500 	 initialized in the relocate_section function.  */
   10501       if (info->shared
   10502 	  && SYMBOL_REFERENCES_LOCAL (info, h))
   10503 	{
   10504 	  BFD_ASSERT ((h->got.offset & 1) != 0);
   10505 	  rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
   10506 	  if (!htab->use_rel)
   10507 	    {
   10508 	      rel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
   10509 	      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
   10510 	    }
   10511 	}
   10512       else
   10513 	{
   10514 	  BFD_ASSERT ((h->got.offset & 1) == 0);
   10515 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset);
   10516 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
   10517 	}
   10518 
   10519       loc = srel->contents + srel->reloc_count++ * RELOC_SIZE (htab);
   10520       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
   10521     }
   10522 
   10523   if (h->needs_copy)
   10524     {
   10525       asection * s;
   10526       Elf_Internal_Rela rel;
   10527       bfd_byte *loc;
   10528 
   10529       /* This symbol needs a copy reloc.  Set it up.  */
   10530       BFD_ASSERT (h->dynindx != -1
   10531 		  && (h->root.type == bfd_link_hash_defined
   10532 		      || h->root.type == bfd_link_hash_defweak));
   10533 
   10534       s = bfd_get_section_by_name (h->root.u.def.section->owner,
   10535 				   RELOC_SECTION (htab, ".bss"));
   10536       BFD_ASSERT (s != NULL);
   10537 
   10538       rel.r_addend = 0;
   10539       rel.r_offset = (h->root.u.def.value
   10540 		      + h->root.u.def.section->output_section->vma
   10541 		      + h->root.u.def.section->output_offset);
   10542       rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_COPY);
   10543       loc = s->contents + s->reloc_count++ * RELOC_SIZE (htab);
   10544       SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
   10545     }
   10546 
   10547   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
   10548      the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it is relative
   10549      to the ".got" section.  */
   10550   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
   10551       || (!htab->vxworks_p && h == htab->root.hgot))
   10552     sym->st_shndx = SHN_ABS;
   10553 
   10554   return TRUE;
   10555 }
   10556 
   10557 /* Finish up the dynamic sections.  */
   10558 
   10559 static bfd_boolean
   10560 elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info)
   10561 {
   10562   bfd * dynobj;
   10563   asection * sgot;
   10564   asection * sdyn;
   10565 
   10566   dynobj = elf_hash_table (info)->dynobj;
   10567 
   10568   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
   10569   BFD_ASSERT (elf32_arm_hash_table (info)->symbian_p || sgot != NULL);
   10570   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
   10571 
   10572   if (elf_hash_table (info)->dynamic_sections_created)
   10573     {
   10574       asection *splt;
   10575       Elf32_External_Dyn *dyncon, *dynconend;
   10576       struct elf32_arm_link_hash_table *htab;
   10577 
   10578       htab = elf32_arm_hash_table (info);
   10579       splt = bfd_get_section_by_name (dynobj, ".plt");
   10580       BFD_ASSERT (splt != NULL && sdyn != NULL);
   10581 
   10582       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   10583       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   10584 
   10585       for (; dyncon < dynconend; dyncon++)
   10586 	{
   10587 	  Elf_Internal_Dyn dyn;
   10588 	  const char * name;
   10589 	  asection * s;
   10590 
   10591 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   10592 
   10593 	  switch (dyn.d_tag)
   10594 	    {
   10595 	      unsigned int type;
   10596 
   10597 	    default:
   10598 	      if (htab->vxworks_p
   10599 		  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
   10600 		bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10601 	      break;
   10602 
   10603 	    case DT_HASH:
   10604 	      name = ".hash";
   10605 	      goto get_vma_if_bpabi;
   10606 	    case DT_STRTAB:
   10607 	      name = ".dynstr";
   10608 	      goto get_vma_if_bpabi;
   10609 	    case DT_SYMTAB:
   10610 	      name = ".dynsym";
   10611 	      goto get_vma_if_bpabi;
   10612 	    case DT_VERSYM:
   10613 	      name = ".gnu.version";
   10614 	      goto get_vma_if_bpabi;
   10615 	    case DT_VERDEF:
   10616 	      name = ".gnu.version_d";
   10617 	      goto get_vma_if_bpabi;
   10618 	    case DT_VERNEED:
   10619 	      name = ".gnu.version_r";
   10620 	      goto get_vma_if_bpabi;
   10621 
   10622 	    case DT_PLTGOT:
   10623 	      name = ".got";
   10624 	      goto get_vma;
   10625 	    case DT_JMPREL:
   10626 	      name = RELOC_SECTION (htab, ".plt");
   10627 	    get_vma:
   10628 	      s = bfd_get_section_by_name (output_bfd, name);
   10629 	      BFD_ASSERT (s != NULL);
   10630 	      if (!htab->symbian_p)
   10631 		dyn.d_un.d_ptr = s->vma;
   10632 	      else
   10633 		/* In the BPABI, tags in the PT_DYNAMIC section point
   10634 		   at the file offset, not the memory address, for the
   10635 		   convenience of the post linker.  */
   10636 		dyn.d_un.d_ptr = s->filepos;
   10637 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10638 	      break;
   10639 
   10640 	    get_vma_if_bpabi:
   10641 	      if (htab->symbian_p)
   10642 		goto get_vma;
   10643 	      break;
   10644 
   10645 	    case DT_PLTRELSZ:
   10646 	      s = bfd_get_section_by_name (output_bfd,
   10647 					   RELOC_SECTION (htab, ".plt"));
   10648 	      BFD_ASSERT (s != NULL);
   10649 	      dyn.d_un.d_val = s->size;
   10650 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10651 	      break;
   10652 
   10653 	    case DT_RELSZ:
   10654 	    case DT_RELASZ:
   10655 	      if (!htab->symbian_p)
   10656 		{
   10657 		  /* My reading of the SVR4 ABI indicates that the
   10658 		     procedure linkage table relocs (DT_JMPREL) should be
   10659 		     included in the overall relocs (DT_REL).  This is
   10660 		     what Solaris does.  However, UnixWare can not handle
   10661 		     that case.  Therefore, we override the DT_RELSZ entry
   10662 		     here to make it not include the JMPREL relocs.  Since
   10663 		     the linker script arranges for .rel(a).plt to follow all
   10664 		     other relocation sections, we don't have to worry
   10665 		     about changing the DT_REL entry.  */
   10666 		  s = bfd_get_section_by_name (output_bfd,
   10667 					       RELOC_SECTION (htab, ".plt"));
   10668 		  if (s != NULL)
   10669 		    dyn.d_un.d_val -= s->size;
   10670 		  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10671 		  break;
   10672 		}
   10673 	      /* Fall through.  */
   10674 
   10675 	    case DT_REL:
   10676 	    case DT_RELA:
   10677 	      /* In the BPABI, the DT_REL tag must point at the file
   10678 		 offset, not the VMA, of the first relocation
   10679 		 section.  So, we use code similar to that in
   10680 		 elflink.c, but do not check for SHF_ALLOC on the
   10681 		 relcoation section, since relocations sections are
   10682 		 never allocated under the BPABI.  The comments above
   10683 		 about Unixware notwithstanding, we include all of the
   10684 		 relocations here.  */
   10685 	      if (htab->symbian_p)
   10686 		{
   10687 		  unsigned int i;
   10688 		  type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
   10689 			  ? SHT_REL : SHT_RELA);
   10690 		  dyn.d_un.d_val = 0;
   10691 		  for (i = 1; i < elf_numsections (output_bfd); i++)
   10692 		    {
   10693 		      Elf_Internal_Shdr *hdr
   10694 			= elf_elfsections (output_bfd)[i];
   10695 		      if (hdr->sh_type == type)
   10696 			{
   10697 			  if (dyn.d_tag == DT_RELSZ
   10698 			      || dyn.d_tag == DT_RELASZ)
   10699 			    dyn.d_un.d_val += hdr->sh_size;
   10700 			  else if ((ufile_ptr) hdr->sh_offset
   10701 				   <= dyn.d_un.d_val - 1)
   10702 			    dyn.d_un.d_val = hdr->sh_offset;
   10703 			}
   10704 		    }
   10705 		  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10706 		}
   10707 	      break;
   10708 
   10709 	      /* Set the bottom bit of DT_INIT/FINI if the
   10710 		 corresponding function is Thumb.  */
   10711 	    case DT_INIT:
   10712 	      name = info->init_function;
   10713 	      goto get_sym;
   10714 	    case DT_FINI:
   10715 	      name = info->fini_function;
   10716 	    get_sym:
   10717 	      /* If it wasn't set by elf_bfd_final_link
   10718 		 then there is nothing to adjust.  */
   10719 	      if (dyn.d_un.d_val != 0)
   10720 		{
   10721 		  struct elf_link_hash_entry * eh;
   10722 
   10723 		  eh = elf_link_hash_lookup (elf_hash_table (info), name,
   10724 					     FALSE, FALSE, TRUE);
   10725 		  if (eh != NULL
   10726 		      && ELF_ST_TYPE (eh->type) == STT_ARM_TFUNC)
   10727 		    {
   10728 		      dyn.d_un.d_val |= 1;
   10729 		      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   10730 		    }
   10731 		}
   10732 	      break;
   10733 	    }
   10734 	}
   10735 
   10736       /* Fill in the first entry in the procedure linkage table.  */
   10737       if (splt->size > 0 && elf32_arm_hash_table (info)->plt_header_size)
   10738 	{
   10739 	  const bfd_vma *plt0_entry;
   10740 	  bfd_vma got_address, plt_address, got_displacement;
   10741 
   10742 	  /* Calculate the addresses of the GOT and PLT.  */
   10743 	  got_address = sgot->output_section->vma + sgot->output_offset;
   10744 	  plt_address = splt->output_section->vma + splt->output_offset;
   10745 
   10746 	  if (htab->vxworks_p)
   10747 	    {
   10748 	      /* The VxWorks GOT is relocated by the dynamic linker.
   10749 		 Therefore, we must emit relocations rather than simply
   10750 		 computing the values now.  */
   10751 	      Elf_Internal_Rela rel;
   10752 
   10753 	      plt0_entry = elf32_arm_vxworks_exec_plt0_entry;
   10754 	      put_arm_insn (htab, output_bfd, plt0_entry[0],
   10755 			    splt->contents + 0);
   10756 	      put_arm_insn (htab, output_bfd, plt0_entry[1],
   10757 			    splt->contents + 4);
   10758 	      put_arm_insn (htab, output_bfd, plt0_entry[2],
   10759 			    splt->contents + 8);
   10760 	      bfd_put_32 (output_bfd, got_address, splt->contents + 12);
   10761 
   10762 	      /* Generate a relocation for _GLOBAL_OFFSET_TABLE_.  */
   10763 	      rel.r_offset = plt_address + 12;
   10764 	      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
   10765 	      rel.r_addend = 0;
   10766 	      SWAP_RELOC_OUT (htab) (output_bfd, &rel,
   10767 				     htab->srelplt2->contents);
   10768 	    }
   10769 	  else
   10770 	    {
   10771 	      got_displacement = got_address - (plt_address + 16);
   10772 
   10773 	      plt0_entry = elf32_arm_plt0_entry;
   10774 	      put_arm_insn (htab, output_bfd, plt0_entry[0],
   10775 			    splt->contents + 0);
   10776 	      put_arm_insn (htab, output_bfd, plt0_entry[1],
   10777 			    splt->contents + 4);
   10778 	      put_arm_insn (htab, output_bfd, plt0_entry[2],
   10779 			    splt->contents + 8);
   10780 	      put_arm_insn (htab, output_bfd, plt0_entry[3],
   10781 			    splt->contents + 12);
   10782 
   10783 #ifdef FOUR_WORD_PLT
   10784 	      /* The displacement value goes in the otherwise-unused
   10785 		 last word of the second entry.  */
   10786 	      bfd_put_32 (output_bfd, got_displacement, splt->contents + 28);
   10787 #else
   10788 	      bfd_put_32 (output_bfd, got_displacement, splt->contents + 16);
   10789 #endif
   10790 	    }
   10791 	}
   10792 
   10793       /* UnixWare sets the entsize of .plt to 4, although that doesn't
   10794 	 really seem like the right value.  */
   10795       if (splt->output_section->owner == output_bfd)
   10796 	elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
   10797 
   10798       if (htab->vxworks_p && !info->shared && htab->splt->size > 0)
   10799 	{
   10800 	  /* Correct the .rel(a).plt.unloaded relocations.  They will have
   10801 	     incorrect symbol indexes.  */
   10802 	  int num_plts;
   10803 	  unsigned char *p;
   10804 
   10805 	  num_plts = ((htab->splt->size - htab->plt_header_size)
   10806 		      / htab->plt_entry_size);
   10807 	  p = htab->srelplt2->contents + RELOC_SIZE (htab);
   10808 
   10809 	  for (; num_plts; num_plts--)
   10810 	    {
   10811 	      Elf_Internal_Rela rel;
   10812 
   10813 	      SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
   10814 	      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_ARM_ABS32);
   10815 	      SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
   10816 	      p += RELOC_SIZE (htab);
   10817 
   10818 	      SWAP_RELOC_IN (htab) (output_bfd, p, &rel);
   10819 	      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_ARM_ABS32);
   10820 	      SWAP_RELOC_OUT (htab) (output_bfd, &rel, p);
   10821 	      p += RELOC_SIZE (htab);
   10822 	    }
   10823 	}
   10824     }
   10825 
   10826   /* Fill in the first three entries in the global offset table.  */
   10827   if (sgot)
   10828     {
   10829       if (sgot->size > 0)
   10830 	{
   10831 	  if (sdyn == NULL)
   10832 	    bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
   10833 	  else
   10834 	    bfd_put_32 (output_bfd,
   10835 			sdyn->output_section->vma + sdyn->output_offset,
   10836 			sgot->contents);
   10837 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
   10838 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
   10839 	}
   10840 
   10841       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
   10842     }
   10843 
   10844   return TRUE;
   10845 }
   10846 
   10847 static void
   10848 elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
   10849 {
   10850   Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
   10851   struct elf32_arm_link_hash_table *globals;
   10852 
   10853   i_ehdrp = elf_elfheader (abfd);
   10854 
   10855   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_UNKNOWN)
   10856     i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_ARM;
   10857   else
   10858     i_ehdrp->e_ident[EI_OSABI] = 0;
   10859   i_ehdrp->e_ident[EI_ABIVERSION] = ARM_ELF_ABI_VERSION;
   10860 
   10861   if (link_info)
   10862     {
   10863       globals = elf32_arm_hash_table (link_info);
   10864       if (globals->byteswap_code)
   10865 	i_ehdrp->e_flags |= EF_ARM_BE8;
   10866     }
   10867 }
   10868 
   10869 static enum elf_reloc_type_class
   10870 elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
   10871 {
   10872   switch ((int) ELF32_R_TYPE (rela->r_info))
   10873     {
   10874     case R_ARM_RELATIVE:
   10875       return reloc_class_relative;
   10876     case R_ARM_JUMP_SLOT:
   10877       return reloc_class_plt;
   10878     case R_ARM_COPY:
   10879       return reloc_class_copy;
   10880     default:
   10881       return reloc_class_normal;
   10882     }
   10883 }
   10884 
   10885 /* Set the right machine number for an Arm ELF file.  */
   10886 
   10887 static bfd_boolean
   10888 elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
   10889 {
   10890   if (hdr->sh_type == SHT_NOTE)
   10891     *flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_CONTENTS;
   10892 
   10893   return TRUE;
   10894 }
   10895 
   10896 static void
   10897 elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
   10898 {
   10899   bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
   10900 }
   10901 
   10902 /* Return TRUE if this is an unwinding table entry.  */
   10903 
   10904 static bfd_boolean
   10905 is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
   10906 {
   10907   return (CONST_STRNEQ (name, ELF_STRING_ARM_unwind)
   10908 	  || CONST_STRNEQ (name, ELF_STRING_ARM_unwind_once));
   10909 }
   10910 
   10911 
   10912 /* Set the type and flags for an ARM section.  We do this by
   10913    the section name, which is a hack, but ought to work.  */
   10914 
   10915 static bfd_boolean
   10916 elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
   10917 {
   10918   const char * name;
   10919 
   10920   name = bfd_get_section_name (abfd, sec);
   10921 
   10922   if (is_arm_elf_unwind_section_name (abfd, name))
   10923     {
   10924       hdr->sh_type = SHT_ARM_EXIDX;
   10925       hdr->sh_flags |= SHF_LINK_ORDER;
   10926     }
   10927   return TRUE;
   10928 }
   10929 
   10930 /* Handle an ARM specific section when reading an object file.  This is
   10931    called when bfd_section_from_shdr finds a section with an unknown
   10932    type.  */
   10933 
   10934 static bfd_boolean
   10935 elf32_arm_section_from_shdr (bfd *abfd,
   10936 			     Elf_Internal_Shdr * hdr,
   10937 			     const char *name,
   10938 			     int shindex)
   10939 {
   10940   /* There ought to be a place to keep ELF backend specific flags, but
   10941      at the moment there isn't one.  We just keep track of the
   10942      sections by their name, instead.  Fortunately, the ABI gives
   10943      names for all the ARM specific sections, so we will probably get
   10944      away with this.  */
   10945   switch (hdr->sh_type)
   10946     {
   10947     case SHT_ARM_EXIDX:
   10948     case SHT_ARM_PREEMPTMAP:
   10949     case SHT_ARM_ATTRIBUTES:
   10950       break;
   10951 
   10952     default:
   10953       return FALSE;
   10954     }
   10955 
   10956   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   10957     return FALSE;
   10958 
   10959   return TRUE;
   10960 }
   10961 
   10962 /* A structure used to record a list of sections, independently
   10963    of the next and prev fields in the asection structure.  */
   10964 typedef struct section_list
   10965 {
   10966   asection * sec;
   10967   struct section_list * next;
   10968   struct section_list * prev;
   10969 }
   10970 section_list;
   10971 
   10972 /* Unfortunately we need to keep a list of sections for which
   10973    an _arm_elf_section_data structure has been allocated.  This
   10974    is because it is possible for functions like elf32_arm_write_section
   10975    to be called on a section which has had an elf_data_structure
   10976    allocated for it (and so the used_by_bfd field is valid) but
   10977    for which the ARM extended version of this structure - the
   10978    _arm_elf_section_data structure - has not been allocated.  */
   10979 static section_list * sections_with_arm_elf_section_data = NULL;
   10980 
   10981 static void
   10982 record_section_with_arm_elf_section_data (asection * sec)
   10983 {
   10984   struct section_list * entry;
   10985 
   10986   entry = bfd_malloc (sizeof (* entry));
   10987   if (entry == NULL)
   10988     return;
   10989   entry->sec = sec;
   10990   entry->next = sections_with_arm_elf_section_data;
   10991   entry->prev = NULL;
   10992   if (entry->next != NULL)
   10993     entry->next->prev = entry;
   10994   sections_with_arm_elf_section_data = entry;
   10995 }
   10996 
   10997 static struct section_list *
   10998 find_arm_elf_section_entry (asection * sec)
   10999 {
   11000   struct section_list * entry;
   11001   static struct section_list * last_entry = NULL;
   11002 
   11003   /* This is a short cut for the typical case where the sections are added
   11004      to the sections_with_arm_elf_section_data list in forward order and
   11005      then looked up here in backwards order.  This makes a real difference
   11006      to the ld-srec/sec64k.exp linker test.  */
   11007   entry = sections_with_arm_elf_section_data;
   11008   if (last_entry != NULL)
   11009     {
   11010       if (last_entry->sec == sec)
   11011 	entry = last_entry;
   11012       else if (last_entry->next != NULL
   11013 	       && last_entry->next->sec == sec)
   11014 	entry = last_entry->next;
   11015     }
   11016 
   11017   for (; entry; entry = entry->next)
   11018     if (entry->sec == sec)
   11019       break;
   11020 
   11021   if (entry)
   11022     /* Record the entry prior to this one - it is the entry we are most
   11023        likely to want to locate next time.  Also this way if we have been
   11024        called from unrecord_section_with_arm_elf_section_data() we will not
   11025        be caching a pointer that is about to be freed.  */
   11026     last_entry = entry->prev;
   11027 
   11028   return entry;
   11029 }
   11030 
   11031 static _arm_elf_section_data *
   11032 get_arm_elf_section_data (asection * sec)
   11033 {
   11034   struct section_list * entry;
   11035 
   11036   entry = find_arm_elf_section_entry (sec);
   11037 
   11038   if (entry)
   11039     return elf32_arm_section_data (entry->sec);
   11040   else
   11041     return NULL;
   11042 }
   11043 
   11044 static void
   11045 unrecord_section_with_arm_elf_section_data (asection * sec)
   11046 {
   11047   struct section_list * entry;
   11048 
   11049   entry = find_arm_elf_section_entry (sec);
   11050 
   11051   if (entry)
   11052     {
   11053       if (entry->prev != NULL)
   11054 	entry->prev->next = entry->next;
   11055       if (entry->next != NULL)
   11056 	entry->next->prev = entry->prev;
   11057       if (entry == sections_with_arm_elf_section_data)
   11058 	sections_with_arm_elf_section_data = entry->next;
   11059       free (entry);
   11060     }
   11061 }
   11062 
   11063 
   11064 typedef struct
   11065 {
   11066   void *finfo;
   11067   struct bfd_link_info *info;
   11068   asection *sec;
   11069   int sec_shndx;
   11070   bfd_boolean (*func) (void *, const char *, Elf_Internal_Sym *,
   11071 		       asection *, struct elf_link_hash_entry *);
   11072 } output_arch_syminfo;
   11073 
   11074 enum map_symbol_type
   11075 {
   11076   ARM_MAP_ARM,
   11077   ARM_MAP_THUMB,
   11078   ARM_MAP_DATA
   11079 };
   11080 
   11081 
   11082 /* Output a single mapping symbol.  */
   11083 
   11084 static bfd_boolean
   11085 elf32_arm_output_map_sym (output_arch_syminfo *osi,
   11086 			  enum map_symbol_type type,
   11087 			  bfd_vma offset)
   11088 {
   11089   static const char *names[3] = {"$a", "$t", "$d"};
   11090   struct elf32_arm_link_hash_table *htab;
   11091   Elf_Internal_Sym sym;
   11092 
   11093   htab = elf32_arm_hash_table (osi->info);
   11094   sym.st_value = osi->sec->output_section->vma
   11095 		 + osi->sec->output_offset
   11096 		 + offset;
   11097   sym.st_size = 0;
   11098   sym.st_other = 0;
   11099   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
   11100   sym.st_shndx = osi->sec_shndx;
   11101   if (!osi->func (osi->finfo, names[type], &sym, osi->sec, NULL))
   11102     return FALSE;
   11103   return TRUE;
   11104 }
   11105 
   11106 
   11107 /* Output mapping symbols for PLT entries associated with H.  */
   11108 
   11109 static bfd_boolean
   11110 elf32_arm_output_plt_map (struct elf_link_hash_entry *h, void *inf)
   11111 {
   11112   output_arch_syminfo *osi = (output_arch_syminfo *) inf;
   11113   struct elf32_arm_link_hash_table *htab;
   11114   struct elf32_arm_link_hash_entry *eh;
   11115   bfd_vma addr;
   11116 
   11117   htab = elf32_arm_hash_table (osi->info);
   11118 
   11119   if (h->root.type == bfd_link_hash_indirect)
   11120     return TRUE;
   11121 
   11122   if (h->root.type == bfd_link_hash_warning)
   11123     /* When warning symbols are created, they **replace** the "real"
   11124        entry in the hash table, thus we never get to see the real
   11125        symbol in a hash traversal.  So look at it now.  */
   11126     h = (struct elf_link_hash_entry *) h->root.u.i.link;
   11127 
   11128   if (h->plt.offset == (bfd_vma) -1)
   11129     return TRUE;
   11130 
   11131   eh = (struct elf32_arm_link_hash_entry *) h;
   11132   addr = h->plt.offset;
   11133   if (htab->symbian_p)
   11134     {
   11135       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11136 	return FALSE;
   11137       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
   11138 	return FALSE;
   11139     }
   11140   else if (htab->vxworks_p)
   11141     {
   11142       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11143 	return FALSE;
   11144       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
   11145 	return FALSE;
   11146       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 12))
   11147 	return FALSE;
   11148       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
   11149 	return FALSE;
   11150     }
   11151   else
   11152     {
   11153       bfd_signed_vma thumb_refs;
   11154 
   11155       thumb_refs = eh->plt_thumb_refcount;
   11156       if (!htab->use_blx)
   11157 	thumb_refs += eh->plt_maybe_thumb_refcount;
   11158 
   11159       if (thumb_refs > 0)
   11160 	{
   11161 	  if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr - 4))
   11162 	    return FALSE;
   11163 	}
   11164 #ifdef FOUR_WORD_PLT
   11165       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11166 	return FALSE;
   11167       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
   11168 	return FALSE;
   11169 #else
   11170       /* A three-word PLT with no Thumb thunk contains only Arm code,
   11171 	 so only need to output a mapping symbol for the first PLT entry and
   11172 	 entries with thumb thunks.  */
   11173       if (thumb_refs > 0 || addr == 20)
   11174 	{
   11175 	  if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11176 	    return FALSE;
   11177 	}
   11178 #endif
   11179     }
   11180 
   11181   return TRUE;
   11182 }
   11183 
   11184 /* Output a single local symbol for a generated stub.  */
   11185 
   11186 static bfd_boolean
   11187 elf32_arm_output_stub_sym (output_arch_syminfo *osi, const char *name,
   11188 			   bfd_vma offset, bfd_vma size)
   11189 {
   11190   struct elf32_arm_link_hash_table *htab;
   11191   Elf_Internal_Sym sym;
   11192 
   11193   htab = elf32_arm_hash_table (osi->info);
   11194   sym.st_value = osi->sec->output_section->vma
   11195 		 + osi->sec->output_offset
   11196 		 + offset;
   11197   sym.st_size = size;
   11198   sym.st_other = 0;
   11199   sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
   11200   sym.st_shndx = osi->sec_shndx;
   11201   if (!osi->func (osi->finfo, name, &sym, osi->sec, NULL))
   11202     return FALSE;
   11203   return TRUE;
   11204 }
   11205 
   11206 static bfd_boolean
   11207 arm_map_one_stub (struct bfd_hash_entry * gen_entry,
   11208 		  void * in_arg)
   11209 {
   11210   struct elf32_arm_stub_hash_entry *stub_entry;
   11211   struct bfd_link_info *info;
   11212   struct elf32_arm_link_hash_table *htab;
   11213   asection *stub_sec;
   11214   bfd_vma addr;
   11215   char *stub_name;
   11216   output_arch_syminfo *osi;
   11217 
   11218   /* Massage our args to the form they really have.  */
   11219   stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
   11220   osi = (output_arch_syminfo *) in_arg;
   11221 
   11222   info = osi->info;
   11223 
   11224   htab = elf32_arm_hash_table (info);
   11225   stub_sec = stub_entry->stub_sec;
   11226 
   11227   /* Ensure this stub is attached to the current section being
   11228      processed.  */
   11229   if (stub_sec != osi->sec)
   11230     return TRUE;
   11231 
   11232   addr = (bfd_vma) stub_entry->stub_offset;
   11233   stub_name = stub_entry->output_name;
   11234 
   11235   switch (stub_entry->stub_type)
   11236     {
   11237     case arm_stub_long_branch:
   11238       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 8))
   11239 	return FALSE;
   11240       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11241 	return FALSE;
   11242       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
   11243 	return FALSE;
   11244       break;
   11245     case arm_thumb_v4t_stub_long_branch:
   11246       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
   11247 	return FALSE;
   11248       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11249 	return FALSE;
   11250       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
   11251 	return FALSE;
   11252       break;
   11253     case arm_thumb_thumb_stub_long_branch:
   11254       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 16))
   11255 	return FALSE;
   11256       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
   11257 	return FALSE;
   11258       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 12))
   11259 	return FALSE;
   11260       break;
   11261     case arm_thumb_arm_v4t_stub_long_branch:
   11262       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 20))
   11263 	return FALSE;
   11264       if (!elf32_arm_output_map_sym (osi, ARM_MAP_THUMB, addr))
   11265 	return FALSE;
   11266       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 8))
   11267 	return FALSE;
   11268       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
   11269 	return FALSE;
   11270       break;
   11271     case arm_thumb_arm_v4t_stub_short_branch:
   11272       if (!elf32_arm_output_stub_sym (osi, stub_name, addr | 1, 8))
   11273 	return FALSE;
   11274       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr + 4))
   11275 	return FALSE;
   11276       break;
   11277     case arm_stub_pic_long_branch:
   11278       if (!elf32_arm_output_stub_sym (osi, stub_name, addr, 12))
   11279 	return FALSE;
   11280       if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
   11281 	return FALSE;
   11282       if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 8))
   11283 	return FALSE;
   11284       break;
   11285     default:
   11286       BFD_FAIL ();
   11287     }
   11288 
   11289   return TRUE;
   11290 }
   11291 
   11292 /* Output mapping symbols for linker generated sections.  */
   11293 
   11294 static bfd_boolean
   11295 elf32_arm_output_arch_local_syms (bfd *output_bfd,
   11296 				  struct bfd_link_info *info,
   11297 				  void *finfo,
   11298 				  bfd_boolean (*func) (void *, const char *,
   11299 						       Elf_Internal_Sym *,
   11300 						       asection *,
   11301 						       struct elf_link_hash_entry *))
   11302 {
   11303   output_arch_syminfo osi;
   11304   struct elf32_arm_link_hash_table *htab;
   11305   bfd_vma offset;
   11306   bfd_size_type size;
   11307 
   11308   htab = elf32_arm_hash_table (info);
   11309   check_use_blx (htab);
   11310 
   11311   osi.finfo = finfo;
   11312   osi.info = info;
   11313   osi.func = func;
   11314 
   11315   /* ARM->Thumb glue.  */
   11316   if (htab->arm_glue_size > 0)
   11317     {
   11318       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
   11319 					 ARM2THUMB_GLUE_SECTION_NAME);
   11320 
   11321       osi.sec_shndx = _bfd_elf_section_from_bfd_section
   11322 	  (output_bfd, osi.sec->output_section);
   11323       if (info->shared || htab->root.is_relocatable_executable
   11324 	  || htab->pic_veneer)
   11325 	size = ARM2THUMB_PIC_GLUE_SIZE;
   11326       else if (htab->use_blx)
   11327 	size = ARM2THUMB_V5_STATIC_GLUE_SIZE;
   11328       else
   11329 	size = ARM2THUMB_STATIC_GLUE_SIZE;
   11330 
   11331       for (offset = 0; offset < htab->arm_glue_size; offset += size)
   11332 	{
   11333 	  elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset);
   11334 	  elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, offset + size - 4);
   11335 	}
   11336     }
   11337 
   11338   /* Thumb->ARM glue.  */
   11339   if (htab->thumb_glue_size > 0)
   11340     {
   11341       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
   11342 					 THUMB2ARM_GLUE_SECTION_NAME);
   11343 
   11344       osi.sec_shndx = _bfd_elf_section_from_bfd_section
   11345 	  (output_bfd, osi.sec->output_section);
   11346       size = THUMB2ARM_GLUE_SIZE;
   11347 
   11348       for (offset = 0; offset < htab->thumb_glue_size; offset += size)
   11349 	{
   11350 	  elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, offset);
   11351 	  elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, offset + 4);
   11352 	}
   11353     }
   11354 
   11355   /* ARMv4 BX veneers.  */
   11356   if (htab->bx_glue_size > 0)
   11357     {
   11358       osi.sec = bfd_get_section_by_name (htab->bfd_of_glue_owner,
   11359 					 ARM_BX_GLUE_SECTION_NAME);
   11360 
   11361       osi.sec_shndx = _bfd_elf_section_from_bfd_section
   11362 	  (output_bfd, osi.sec->output_section);
   11363 
   11364       elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0);
   11365     }
   11366 
   11367   /* Long calls stubs.  */
   11368   if (htab->stub_bfd && htab->stub_bfd->sections)
   11369     {
   11370       asection* stub_sec;
   11371 
   11372       for (stub_sec = htab->stub_bfd->sections;
   11373 	   stub_sec != NULL;
   11374 	   stub_sec = stub_sec->next)
   11375 	{
   11376 	  /* Ignore non-stub sections.  */
   11377 	  if (!strstr (stub_sec->name, STUB_SUFFIX))
   11378 	    continue;
   11379 
   11380 	  osi.sec = stub_sec;
   11381 
   11382 	  osi.sec_shndx = _bfd_elf_section_from_bfd_section
   11383 	    (output_bfd, osi.sec->output_section);
   11384 
   11385 	  bfd_hash_traverse (&htab->stub_hash_table, arm_map_one_stub, &osi);
   11386 	}
   11387     }
   11388 
   11389   /* Finally, output mapping symbols for the PLT.  */
   11390   if (!htab->splt || htab->splt->size == 0)
   11391     return TRUE;
   11392 
   11393   osi.sec_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
   11394 						     htab->splt->output_section);
   11395   osi.sec = htab->splt;
   11396   /* Output mapping symbols for the plt header.  SymbianOS does not have a
   11397      plt header.  */
   11398   if (htab->vxworks_p)
   11399     {
   11400       /* VxWorks shared libraries have no PLT header.  */
   11401       if (!info->shared)
   11402 	{
   11403 	  if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
   11404 	    return FALSE;
   11405 	  if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 12))
   11406 	    return FALSE;
   11407 	}
   11408     }
   11409   else if (!htab->symbian_p)
   11410     {
   11411       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
   11412 	return FALSE;
   11413 #ifndef FOUR_WORD_PLT
   11414       if (!elf32_arm_output_map_sym (&osi, ARM_MAP_DATA, 16))
   11415 	return FALSE;
   11416 #endif
   11417     }
   11418 
   11419   elf_link_hash_traverse (&htab->root, elf32_arm_output_plt_map, (void *) &osi);
   11420   return TRUE;
   11421 }
   11422 
   11423 /* Allocate target specific section data.  */
   11424 
   11425 static bfd_boolean
   11426 elf32_arm_new_section_hook (bfd *abfd, asection *sec)
   11427 {
   11428   if (!sec->used_by_bfd)
   11429     {
   11430       _arm_elf_section_data *sdata;
   11431       bfd_size_type amt = sizeof (*sdata);
   11432 
   11433       sdata = bfd_zalloc (abfd, amt);
   11434       if (sdata == NULL)
   11435 	return FALSE;
   11436       sec->used_by_bfd = sdata;
   11437     }
   11438 
   11439   record_section_with_arm_elf_section_data (sec);
   11440 
   11441   return _bfd_elf_new_section_hook (abfd, sec);
   11442 }
   11443 
   11444 
   11445 /* Used to order a list of mapping symbols by address.  */
   11446 
   11447 static int
   11448 elf32_arm_compare_mapping (const void * a, const void * b)
   11449 {
   11450   const elf32_arm_section_map *amap = (const elf32_arm_section_map *) a;
   11451   const elf32_arm_section_map *bmap = (const elf32_arm_section_map *) b;
   11452 
   11453   if (amap->vma > bmap->vma)
   11454     return 1;
   11455   else if (amap->vma < bmap->vma)
   11456     return -1;
   11457   else if (amap->type > bmap->type)
   11458     /* Ensure results do not depend on the host qsort for objects with
   11459        multiple mapping symbols at the same address by sorting on type
   11460        after vma.  */
   11461     return 1;
   11462   else if (amap->type < bmap->type)
   11463     return -1;
   11464   else
   11465     return 0;
   11466 }
   11467 
   11468 
   11469 /* Do code byteswapping.  Return FALSE afterwards so that the section is
   11470    written out as normal.  */
   11471 
   11472 static bfd_boolean
   11473 elf32_arm_write_section (bfd *output_bfd,
   11474 			 struct bfd_link_info *link_info,
   11475 			 asection *sec,
   11476 			 bfd_byte *contents)
   11477 {
   11478   int mapcount, errcount;
   11479   _arm_elf_section_data *arm_data;
   11480   struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (link_info);
   11481   elf32_arm_section_map *map;
   11482   elf32_vfp11_erratum_list *errnode;
   11483   bfd_vma ptr;
   11484   bfd_vma end;
   11485   bfd_vma offset = sec->output_section->vma + sec->output_offset;
   11486   bfd_byte tmp;
   11487   int i;
   11488 
   11489   /* If this section has not been allocated an _arm_elf_section_data
   11490      structure then we cannot record anything.  */
   11491   arm_data = get_arm_elf_section_data (sec);
   11492   if (arm_data == NULL)
   11493     return FALSE;
   11494 
   11495   mapcount = arm_data->mapcount;
   11496   map = arm_data->map;
   11497   errcount = arm_data->erratumcount;
   11498 
   11499   if (errcount != 0)
   11500     {
   11501       unsigned int endianflip = bfd_big_endian (output_bfd) ? 3 : 0;
   11502 
   11503       for (errnode = arm_data->erratumlist; errnode != 0;
   11504            errnode = errnode->next)
   11505         {
   11506           bfd_vma index = errnode->vma - offset;
   11507 
   11508           switch (errnode->type)
   11509             {
   11510             case VFP11_ERRATUM_BRANCH_TO_ARM_VENEER:
   11511               {
   11512                 bfd_vma branch_to_veneer;
   11513                 /* Original condition code of instruction, plus bit mask for
   11514                    ARM B instruction.  */
   11515                 unsigned int insn = (errnode->u.b.vfp_insn & 0xf0000000)
   11516                                   | 0x0a000000;
   11517 
   11518 		/* The instruction is before the label.  */
   11519 		index -= 4;
   11520 
   11521 		/* Above offset included in -4 below.  */
   11522 		branch_to_veneer = errnode->u.b.veneer->vma
   11523                                    - errnode->vma - 4;
   11524 
   11525 		if ((signed) branch_to_veneer < -(1 << 25)
   11526 		    || (signed) branch_to_veneer >= (1 << 25))
   11527 		  (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
   11528 					   "range"), output_bfd);
   11529 
   11530                 insn |= (branch_to_veneer >> 2) & 0xffffff;
   11531                 contents[endianflip ^ index] = insn & 0xff;
   11532                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
   11533                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
   11534                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
   11535               }
   11536               break;
   11537 
   11538 	    case VFP11_ERRATUM_ARM_VENEER:
   11539               {
   11540                 bfd_vma branch_from_veneer;
   11541                 unsigned int insn;
   11542 
   11543                 /* Take size of veneer into account.  */
   11544                 branch_from_veneer = errnode->u.v.branch->vma
   11545                                      - errnode->vma - 12;
   11546 
   11547 		if ((signed) branch_from_veneer < -(1 << 25)
   11548 		    || (signed) branch_from_veneer >= (1 << 25))
   11549 		  (*_bfd_error_handler) (_("%B: error: VFP11 veneer out of "
   11550 					   "range"), output_bfd);
   11551 
   11552                 /* Original instruction.  */
   11553                 insn = errnode->u.v.branch->u.b.vfp_insn;
   11554                 contents[endianflip ^ index] = insn & 0xff;
   11555                 contents[endianflip ^ (index + 1)] = (insn >> 8) & 0xff;
   11556                 contents[endianflip ^ (index + 2)] = (insn >> 16) & 0xff;
   11557                 contents[endianflip ^ (index + 3)] = (insn >> 24) & 0xff;
   11558 
   11559                 /* Branch back to insn after original insn.  */
   11560                 insn = 0xea000000 | ((branch_from_veneer >> 2) & 0xffffff);
   11561                 contents[endianflip ^ (index + 4)] = insn & 0xff;
   11562                 contents[endianflip ^ (index + 5)] = (insn >> 8) & 0xff;
   11563                 contents[endianflip ^ (index + 6)] = (insn >> 16) & 0xff;
   11564                 contents[endianflip ^ (index + 7)] = (insn >> 24) & 0xff;
   11565               }
   11566               break;
   11567 
   11568             default:
   11569               abort ();
   11570             }
   11571         }
   11572     }
   11573 
   11574   if (mapcount == 0)
   11575     return FALSE;
   11576 
   11577   if (globals->byteswap_code)
   11578     {
   11579       qsort (map, mapcount, sizeof (* map), elf32_arm_compare_mapping);
   11580 
   11581       ptr = map[0].vma;
   11582       for (i = 0; i < mapcount; i++)
   11583         {
   11584           if (i == mapcount - 1)
   11585 	    end = sec->size;
   11586           else
   11587             end = map[i + 1].vma;
   11588 
   11589           switch (map[i].type)
   11590 	    {
   11591 	    case 'a':
   11592 	      /* Byte swap code words.  */
   11593 	      while (ptr + 3 < end)
   11594 	        {
   11595 	          tmp = contents[ptr];
   11596 	          contents[ptr] = contents[ptr + 3];
   11597 	          contents[ptr + 3] = tmp;
   11598 	          tmp = contents[ptr + 1];
   11599 	          contents[ptr + 1] = contents[ptr + 2];
   11600 	          contents[ptr + 2] = tmp;
   11601 	          ptr += 4;
   11602 	        }
   11603 	      break;
   11604 
   11605 	    case 't':
   11606 	      /* Byte swap code halfwords.  */
   11607 	      while (ptr + 1 < end)
   11608 	        {
   11609 	          tmp = contents[ptr];
   11610 	          contents[ptr] = contents[ptr + 1];
   11611 	          contents[ptr + 1] = tmp;
   11612 	          ptr += 2;
   11613 	        }
   11614 	      break;
   11615 
   11616 	    case 'd':
   11617 	      /* Leave data alone.  */
   11618 	      break;
   11619 	    }
   11620           ptr = end;
   11621         }
   11622     }
   11623 
   11624   free (map);
   11625   arm_data->mapcount = 0;
   11626   arm_data->mapsize = 0;
   11627   arm_data->map = NULL;
   11628   unrecord_section_with_arm_elf_section_data (sec);
   11629 
   11630   return FALSE;
   11631 }
   11632 
   11633 static void
   11634 unrecord_section_via_map_over_sections (bfd * abfd ATTRIBUTE_UNUSED,
   11635 					asection * sec,
   11636 					void * ignore ATTRIBUTE_UNUSED)
   11637 {
   11638   unrecord_section_with_arm_elf_section_data (sec);
   11639 }
   11640 
   11641 static bfd_boolean
   11642 elf32_arm_close_and_cleanup (bfd * abfd)
   11643 {
   11644   if (abfd->sections)
   11645     bfd_map_over_sections (abfd,
   11646 			   unrecord_section_via_map_over_sections,
   11647 			   NULL);
   11648 
   11649   return _bfd_elf_close_and_cleanup (abfd);
   11650 }
   11651 
   11652 static bfd_boolean
   11653 elf32_arm_bfd_free_cached_info (bfd * abfd)
   11654 {
   11655   if (abfd->sections)
   11656     bfd_map_over_sections (abfd,
   11657 			   unrecord_section_via_map_over_sections,
   11658 			   NULL);
   11659 
   11660   return _bfd_free_cached_info (abfd);
   11661 }
   11662 
   11663 /* Display STT_ARM_TFUNC symbols as functions.  */
   11664 
   11665 static void
   11666 elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
   11667 			     asymbol *asym)
   11668 {
   11669   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
   11670 
   11671   if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_ARM_TFUNC)
   11672     elfsym->symbol.flags |= BSF_FUNCTION;
   11673 }
   11674 
   11675 
   11676 /* Mangle thumb function symbols as we read them in.  */
   11677 
   11678 static bfd_boolean
   11679 elf32_arm_swap_symbol_in (bfd * abfd,
   11680 			  const void *psrc,
   11681 			  const void *pshn,
   11682 			  Elf_Internal_Sym *dst)
   11683 {
   11684   if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst))
   11685     return FALSE;
   11686 
   11687   /* New EABI objects mark thumb function symbols by setting the low bit of
   11688      the address.  Turn these into STT_ARM_TFUNC.  */
   11689   if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
   11690       && (dst->st_value & 1))
   11691     {
   11692       dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
   11693       dst->st_value &= ~(bfd_vma) 1;
   11694     }
   11695   return TRUE;
   11696 }
   11697 
   11698 
   11699 /* Mangle thumb function symbols as we write them out.  */
   11700 
   11701 static void
   11702 elf32_arm_swap_symbol_out (bfd *abfd,
   11703 			   const Elf_Internal_Sym *src,
   11704 			   void *cdst,
   11705 			   void *shndx)
   11706 {
   11707   Elf_Internal_Sym newsym;
   11708 
   11709   /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
   11710      of the address set, as per the new EABI.  We do this unconditionally
   11711      because objcopy does not set the elf header flags until after
   11712      it writes out the symbol table.  */
   11713   if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
   11714     {
   11715       newsym = *src;
   11716       newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
   11717       if (newsym.st_shndx != SHN_UNDEF)
   11718         {
   11719           /* Do this only for defined symbols. At link type, the static
   11720              linker will simulate the work of dynamic linker of resolving
   11721              symbols and will carry over the thumbness of found symbols to
   11722              the output symbol table. It's not clear how it happens, but
   11723              the thumbness of undefined symbols can well be different at
   11724              runtime, and writing '1' for them will be confusing for users
   11725              and possibly for dynamic linker itself.
   11726           */
   11727           newsym.st_value |= 1;
   11728         }
   11729 
   11730       src = &newsym;
   11731     }
   11732   bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
   11733 }
   11734 
   11735 /* Add the PT_ARM_EXIDX program header.  */
   11736 
   11737 static bfd_boolean
   11738 elf32_arm_modify_segment_map (bfd *abfd,
   11739 			      struct bfd_link_info *info ATTRIBUTE_UNUSED)
   11740 {
   11741   struct elf_segment_map *m;
   11742   asection *sec;
   11743 
   11744   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
   11745   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
   11746     {
   11747       /* If there is already a PT_ARM_EXIDX header, then we do not
   11748 	 want to add another one.  This situation arises when running
   11749 	 "strip"; the input binary already has the header.  */
   11750       m = elf_tdata (abfd)->segment_map;
   11751       while (m && m->p_type != PT_ARM_EXIDX)
   11752 	m = m->next;
   11753       if (!m)
   11754 	{
   11755 	  m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
   11756 	  if (m == NULL)
   11757 	    return FALSE;
   11758 	  m->p_type = PT_ARM_EXIDX;
   11759 	  m->count = 1;
   11760 	  m->sections[0] = sec;
   11761 
   11762 	  m->next = elf_tdata (abfd)->segment_map;
   11763 	  elf_tdata (abfd)->segment_map = m;
   11764 	}
   11765     }
   11766 
   11767   return TRUE;
   11768 }
   11769 
   11770 /* We may add a PT_ARM_EXIDX program header.  */
   11771 
   11772 static int
   11773 elf32_arm_additional_program_headers (bfd *abfd,
   11774 				      struct bfd_link_info *info ATTRIBUTE_UNUSED)
   11775 {
   11776   asection *sec;
   11777 
   11778   sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
   11779   if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
   11780     return 1;
   11781   else
   11782     return 0;
   11783 }
   11784 
   11785 /* We have two function types: STT_FUNC and STT_ARM_TFUNC.  */
   11786 
   11787 static bfd_boolean
   11788 elf32_arm_is_function_type (unsigned int type)
   11789 {
   11790   return (type == STT_FUNC) || (type == STT_ARM_TFUNC);
   11791 }
   11792 
   11793 /* We use this to override swap_symbol_in and swap_symbol_out.  */
   11794 const struct elf_size_info elf32_arm_size_info =
   11795 {
   11796   sizeof (Elf32_External_Ehdr),
   11797   sizeof (Elf32_External_Phdr),
   11798   sizeof (Elf32_External_Shdr),
   11799   sizeof (Elf32_External_Rel),
   11800   sizeof (Elf32_External_Rela),
   11801   sizeof (Elf32_External_Sym),
   11802   sizeof (Elf32_External_Dyn),
   11803   sizeof (Elf_External_Note),
   11804   4,
   11805   1,
   11806   32, 2,
   11807   ELFCLASS32, EV_CURRENT,
   11808   bfd_elf32_write_out_phdrs,
   11809   bfd_elf32_write_shdrs_and_ehdr,
   11810   bfd_elf32_checksum_contents,
   11811   bfd_elf32_write_relocs,
   11812   elf32_arm_swap_symbol_in,
   11813   elf32_arm_swap_symbol_out,
   11814   bfd_elf32_slurp_reloc_table,
   11815   bfd_elf32_slurp_symbol_table,
   11816   bfd_elf32_swap_dyn_in,
   11817   bfd_elf32_swap_dyn_out,
   11818   bfd_elf32_swap_reloc_in,
   11819   bfd_elf32_swap_reloc_out,
   11820   bfd_elf32_swap_reloca_in,
   11821   bfd_elf32_swap_reloca_out
   11822 };
   11823 
   11824 #define ELF_ARCH			bfd_arch_arm
   11825 #define ELF_MACHINE_CODE		EM_ARM
   11826 #ifdef __QNXTARGET__
   11827 #define ELF_MAXPAGESIZE			0x1000
   11828 #else
   11829 #define ELF_MAXPAGESIZE			0x8000
   11830 #endif
   11831 #define ELF_MINPAGESIZE			0x1000
   11832 #define ELF_COMMONPAGESIZE		0x1000
   11833 
   11834 #define bfd_elf32_mkobject		        elf32_arm_mkobject
   11835 
   11836 #define bfd_elf32_bfd_copy_private_bfd_data	elf32_arm_copy_private_bfd_data
   11837 #define bfd_elf32_bfd_merge_private_bfd_data	elf32_arm_merge_private_bfd_data
   11838 #define bfd_elf32_bfd_set_private_flags		elf32_arm_set_private_flags
   11839 #define bfd_elf32_bfd_print_private_bfd_data	elf32_arm_print_private_bfd_data
   11840 #define bfd_elf32_bfd_link_hash_table_create    elf32_arm_link_hash_table_create
   11841 #define bfd_elf32_bfd_link_hash_table_free      elf32_arm_hash_table_free
   11842 #define bfd_elf32_bfd_reloc_type_lookup		elf32_arm_reloc_type_lookup
   11843 #define bfd_elf32_bfd_reloc_name_lookup	elf32_arm_reloc_name_lookup
   11844 #define bfd_elf32_find_nearest_line	        elf32_arm_find_nearest_line
   11845 #define bfd_elf32_find_inliner_info	        elf32_arm_find_inliner_info
   11846 #define bfd_elf32_new_section_hook		elf32_arm_new_section_hook
   11847 #define bfd_elf32_bfd_is_target_special_symbol	elf32_arm_is_target_special_symbol
   11848 #define bfd_elf32_close_and_cleanup             elf32_arm_close_and_cleanup
   11849 #define bfd_elf32_bfd_free_cached_info          elf32_arm_bfd_free_cached_info
   11850 
   11851 #define elf_backend_get_symbol_type             elf32_arm_get_symbol_type
   11852 #define elf_backend_gc_mark_hook                elf32_arm_gc_mark_hook
   11853 #define elf_backend_gc_mark_extra_sections	elf32_arm_gc_mark_extra_sections
   11854 #define elf_backend_gc_sweep_hook               elf32_arm_gc_sweep_hook
   11855 #define elf_backend_check_relocs                elf32_arm_check_relocs
   11856 #define elf_backend_relocate_section		elf32_arm_relocate_section
   11857 #define elf_backend_write_section		elf32_arm_write_section
   11858 #define elf_backend_adjust_dynamic_symbol	elf32_arm_adjust_dynamic_symbol
   11859 #define elf_backend_create_dynamic_sections     elf32_arm_create_dynamic_sections
   11860 #define elf_backend_finish_dynamic_symbol	elf32_arm_finish_dynamic_symbol
   11861 #define elf_backend_finish_dynamic_sections	elf32_arm_finish_dynamic_sections
   11862 #define elf_backend_size_dynamic_sections	elf32_arm_size_dynamic_sections
   11863 #define elf_backend_init_index_section		_bfd_elf_init_2_index_sections
   11864 #define elf_backend_post_process_headers	elf32_arm_post_process_headers
   11865 #define elf_backend_reloc_type_class		elf32_arm_reloc_type_class
   11866 #define elf_backend_object_p			elf32_arm_object_p
   11867 #define elf_backend_section_flags		elf32_arm_section_flags
   11868 #define elf_backend_fake_sections  		elf32_arm_fake_sections
   11869 #define elf_backend_section_from_shdr  		elf32_arm_section_from_shdr
   11870 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
   11871 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
   11872 #define elf_backend_symbol_processing		elf32_arm_symbol_processing
   11873 #define elf_backend_size_info			elf32_arm_size_info
   11874 #define elf_backend_modify_segment_map		elf32_arm_modify_segment_map
   11875 #define elf_backend_additional_program_headers  elf32_arm_additional_program_headers
   11876 #define elf_backend_output_arch_local_syms      elf32_arm_output_arch_local_syms
   11877 #define elf_backend_begin_write_processing      elf32_arm_begin_write_processing
   11878 #define elf_backend_is_function_type		elf32_arm_is_function_type
   11879 
   11880 #define elf_backend_can_refcount       1
   11881 #define elf_backend_can_gc_sections    1
   11882 #define elf_backend_plt_readonly       1
   11883 #define elf_backend_want_got_plt       1
   11884 #define elf_backend_want_plt_sym       0
   11885 #define elf_backend_may_use_rel_p      1
   11886 #define elf_backend_may_use_rela_p     0
   11887 #define elf_backend_default_use_rela_p 0
   11888 
   11889 #define elf_backend_got_header_size	12
   11890 
   11891 #undef  elf_backend_obj_attrs_vendor
   11892 #define elf_backend_obj_attrs_vendor		"aeabi"
   11893 #undef  elf_backend_obj_attrs_section
   11894 #define elf_backend_obj_attrs_section		".ARM.attributes"
   11895 #undef  elf_backend_obj_attrs_arg_type
   11896 #define elf_backend_obj_attrs_arg_type		elf32_arm_obj_attrs_arg_type
   11897 #undef  elf_backend_obj_attrs_section_type
   11898 #define elf_backend_obj_attrs_section_type	SHT_ARM_ATTRIBUTES
   11899 
   11900 #include "elf32-target.h"
   11901 
   11902 /* VxWorks Targets.  */
   11903 
   11904 #undef  TARGET_LITTLE_SYM
   11905 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_vxworks_vec
   11906 #undef  TARGET_LITTLE_NAME
   11907 #define TARGET_LITTLE_NAME              "elf32-littlearm-vxworks"
   11908 #undef  TARGET_BIG_SYM
   11909 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_vxworks_vec
   11910 #undef  TARGET_BIG_NAME
   11911 #define TARGET_BIG_NAME                 "elf32-bigarm-vxworks"
   11912 
   11913 /* Like elf32_arm_link_hash_table_create -- but overrides
   11914    appropriately for VxWorks.  */
   11915 
   11916 static struct bfd_link_hash_table *
   11917 elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
   11918 {
   11919   struct bfd_link_hash_table *ret;
   11920 
   11921   ret = elf32_arm_link_hash_table_create (abfd);
   11922   if (ret)
   11923     {
   11924       struct elf32_arm_link_hash_table *htab
   11925 	= (struct elf32_arm_link_hash_table *) ret;
   11926       htab->use_rel = 0;
   11927       htab->vxworks_p = 1;
   11928     }
   11929   return ret;
   11930 }
   11931 
   11932 static void
   11933 elf32_arm_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
   11934 {
   11935   elf32_arm_final_write_processing (abfd, linker);
   11936   elf_vxworks_final_write_processing (abfd, linker);
   11937 }
   11938 
   11939 #undef  elf32_bed
   11940 #define elf32_bed elf32_arm_vxworks_bed
   11941 
   11942 #undef  bfd_elf32_bfd_link_hash_table_create
   11943 #define bfd_elf32_bfd_link_hash_table_create	elf32_arm_vxworks_link_hash_table_create
   11944 #undef  elf_backend_add_symbol_hook
   11945 #define elf_backend_add_symbol_hook		elf_vxworks_add_symbol_hook
   11946 #undef  elf_backend_final_write_processing
   11947 #define elf_backend_final_write_processing	elf32_arm_vxworks_final_write_processing
   11948 #undef  elf_backend_emit_relocs
   11949 #define elf_backend_emit_relocs			elf_vxworks_emit_relocs
   11950 
   11951 #undef  elf_backend_may_use_rel_p
   11952 #define elf_backend_may_use_rel_p	0
   11953 #undef  elf_backend_may_use_rela_p
   11954 #define elf_backend_may_use_rela_p	1
   11955 #undef  elf_backend_default_use_rela_p
   11956 #define elf_backend_default_use_rela_p	1
   11957 #undef  elf_backend_want_plt_sym
   11958 #define elf_backend_want_plt_sym	1
   11959 #undef  ELF_MAXPAGESIZE
   11960 #define ELF_MAXPAGESIZE			0x1000
   11961 
   11962 #include "elf32-target.h"
   11963 
   11964 
   11965 /* Symbian OS Targets.  */
   11966 
   11967 #undef  TARGET_LITTLE_SYM
   11968 #define TARGET_LITTLE_SYM               bfd_elf32_littlearm_symbian_vec
   11969 #undef  TARGET_LITTLE_NAME
   11970 #define TARGET_LITTLE_NAME              "elf32-littlearm-symbian"
   11971 #undef  TARGET_BIG_SYM
   11972 #define TARGET_BIG_SYM                  bfd_elf32_bigarm_symbian_vec
   11973 #undef  TARGET_BIG_NAME
   11974 #define TARGET_BIG_NAME                 "elf32-bigarm-symbian"
   11975 
   11976 /* Like elf32_arm_link_hash_table_create -- but overrides
   11977    appropriately for Symbian OS.  */
   11978 
   11979 static struct bfd_link_hash_table *
   11980 elf32_arm_symbian_link_hash_table_create (bfd *abfd)
   11981 {
   11982   struct bfd_link_hash_table *ret;
   11983 
   11984   ret = elf32_arm_link_hash_table_create (abfd);
   11985   if (ret)
   11986     {
   11987       struct elf32_arm_link_hash_table *htab
   11988 	= (struct elf32_arm_link_hash_table *)ret;
   11989       /* There is no PLT header for Symbian OS.  */
   11990       htab->plt_header_size = 0;
   11991       /* The PLT entries are each one instruction and one word.  */
   11992       htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
   11993       htab->symbian_p = 1;
   11994       /* Symbian uses armv5t or above, so use_blx is always true.  */
   11995       htab->use_blx = 1;
   11996       htab->root.is_relocatable_executable = 1;
   11997     }
   11998   return ret;
   11999 }
   12000 
   12001 static const struct bfd_elf_special_section
   12002 elf32_arm_symbian_special_sections[] =
   12003 {
   12004   /* In a BPABI executable, the dynamic linking sections do not go in
   12005      the loadable read-only segment.  The post-linker may wish to
   12006      refer to these sections, but they are not part of the final
   12007      program image.  */
   12008   { STRING_COMMA_LEN (".dynamic"),       0, SHT_DYNAMIC,  0 },
   12009   { STRING_COMMA_LEN (".dynstr"),        0, SHT_STRTAB,   0 },
   12010   { STRING_COMMA_LEN (".dynsym"),        0, SHT_DYNSYM,   0 },
   12011   { STRING_COMMA_LEN (".got"),           0, SHT_PROGBITS, 0 },
   12012   { STRING_COMMA_LEN (".hash"),          0, SHT_HASH,     0 },
   12013   /* These sections do not need to be writable as the SymbianOS
   12014      postlinker will arrange things so that no dynamic relocation is
   12015      required.  */
   12016   { STRING_COMMA_LEN (".init_array"),    0, SHT_INIT_ARRAY,    SHF_ALLOC },
   12017   { STRING_COMMA_LEN (".fini_array"),    0, SHT_FINI_ARRAY,    SHF_ALLOC },
   12018   { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC },
   12019   { NULL,                             0, 0, 0,                 0 }
   12020 };
   12021 
   12022 static void
   12023 elf32_arm_symbian_begin_write_processing (bfd *abfd,
   12024 					  struct bfd_link_info *link_info)
   12025 {
   12026   /* BPABI objects are never loaded directly by an OS kernel; they are
   12027      processed by a postlinker first, into an OS-specific format.  If
   12028      the D_PAGED bit is set on the file, BFD will align segments on
   12029      page boundaries, so that an OS can directly map the file.  With
   12030      BPABI objects, that just results in wasted space.  In addition,
   12031      because we clear the D_PAGED bit, map_sections_to_segments will
   12032      recognize that the program headers should not be mapped into any
   12033      loadable segment.  */
   12034   abfd->flags &= ~D_PAGED;
   12035   elf32_arm_begin_write_processing (abfd, link_info);
   12036 }
   12037 
   12038 static bfd_boolean
   12039 elf32_arm_symbian_modify_segment_map (bfd *abfd,
   12040 				      struct bfd_link_info *info)
   12041 {
   12042   struct elf_segment_map *m;
   12043   asection *dynsec;
   12044 
   12045   /* BPABI shared libraries and executables should have a PT_DYNAMIC
   12046      segment.  However, because the .dynamic section is not marked
   12047      with SEC_LOAD, the generic ELF code will not create such a
   12048      segment.  */
   12049   dynsec = bfd_get_section_by_name (abfd, ".dynamic");
   12050   if (dynsec)
   12051     {
   12052       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
   12053 	if (m->p_type == PT_DYNAMIC)
   12054 	  break;
   12055 
   12056       if (m == NULL)
   12057 	{
   12058 	  m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
   12059 	  m->next = elf_tdata (abfd)->segment_map;
   12060 	  elf_tdata (abfd)->segment_map = m;
   12061 	}
   12062     }
   12063 
   12064   /* Also call the generic arm routine.  */
   12065   return elf32_arm_modify_segment_map (abfd, info);
   12066 }
   12067 
   12068 /* Return address for Ith PLT stub in section PLT, for relocation REL
   12069    or (bfd_vma) -1 if it should not be included.  */
   12070 
   12071 static bfd_vma
   12072 elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
   12073 			       const arelent *rel ATTRIBUTE_UNUSED)
   12074 {
   12075   return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
   12076 }
   12077 
   12078 
   12079 #undef  elf32_bed
   12080 #define elf32_bed elf32_arm_symbian_bed
   12081 
   12082 /* The dynamic sections are not allocated on SymbianOS; the postlinker
   12083    will process them and then discard them.  */
   12084 #undef  ELF_DYNAMIC_SEC_FLAGS
   12085 #define ELF_DYNAMIC_SEC_FLAGS \
   12086   (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED)
   12087 
   12088 #undef elf_backend_add_symbol_hook
   12089 #undef elf_backend_emit_relocs
   12090 
   12091 #undef  bfd_elf32_bfd_link_hash_table_create
   12092 #define bfd_elf32_bfd_link_hash_table_create	elf32_arm_symbian_link_hash_table_create
   12093 #undef  elf_backend_special_sections
   12094 #define elf_backend_special_sections 		elf32_arm_symbian_special_sections
   12095 #undef  elf_backend_begin_write_processing
   12096 #define elf_backend_begin_write_processing	elf32_arm_symbian_begin_write_processing
   12097 #undef  elf_backend_final_write_processing
   12098 #define elf_backend_final_write_processing	elf32_arm_final_write_processing
   12099 
   12100 #undef  elf_backend_modify_segment_map
   12101 #define elf_backend_modify_segment_map elf32_arm_symbian_modify_segment_map
   12102 
   12103 /* There is no .got section for BPABI objects, and hence no header.  */
   12104 #undef  elf_backend_got_header_size
   12105 #define elf_backend_got_header_size 0
   12106 
   12107 /* Similarly, there is no .got.plt section.  */
   12108 #undef  elf_backend_want_got_plt
   12109 #define elf_backend_want_got_plt 0
   12110 
   12111 #undef  elf_backend_plt_sym_val
   12112 #define elf_backend_plt_sym_val		elf32_arm_symbian_plt_sym_val
   12113 
   12114 #undef  elf_backend_may_use_rel_p
   12115 #define elf_backend_may_use_rel_p	1
   12116 #undef  elf_backend_may_use_rela_p
   12117 #define elf_backend_may_use_rela_p	0
   12118 #undef  elf_backend_default_use_rela_p
   12119 #define elf_backend_default_use_rela_p	0
   12120 #undef  elf_backend_want_plt_sym
   12121 #define elf_backend_want_plt_sym	0
   12122 #undef  ELF_MAXPAGESIZE
   12123 #define ELF_MAXPAGESIZE			0x8000
   12124 
   12125 #include "elf32-target.h"
   12126