Home | History | Annotate | Line # | Download | only in bfd
elf32-or1k.c revision 1.1.1.7
      1 /* Or1k-specific support for 32-bit ELF.
      2    Copyright (C) 2001-2022 Free Software Foundation, Inc.
      3    Contributed for OR32 by Johan Rydberg, jrydberg (at) opencores.org
      4 
      5    PIC parts added by Stefan Kristiansson, stefan.kristiansson (at) saunalahti.fi,
      6    largely based on elf32-m32r.c and elf32-microblaze.c.
      7 
      8    This file is part of BFD, the Binary File Descriptor library.
      9 
     10    This program is free software; you can redistribute it and/or modify
     11    it under the terms of the GNU General Public License as published by
     12    the Free Software Foundation; either version 3 of the License, or
     13    (at your option) any later version.
     14 
     15    This program is distributed in the hope that it will be useful,
     16    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18    GNU General Public License for more details.
     19 
     20    You should have received a copy of the GNU General Public License
     21    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
     22 
     23 #include "sysdep.h"
     24 #include "bfd.h"
     25 #include "libbfd.h"
     26 #include "elf-bfd.h"
     27 #include "elf/or1k.h"
     28 #include "libiberty.h"
     29 
     30 #define N_ONES(X)	(((bfd_vma)2 << (X)) - 1)
     31 
     32 #define PLT_ENTRY_SIZE 16
     33 #define PLT_ENTRY_SIZE_LARGE (6*4)
     34 #define PLT_MAX_INSN_COUNT 6
     35 
     36 #define OR1K_MOVHI(D)		(0x18000000 | (D << 21))
     37 #define OR1K_ADRP(D)		(0x08000000 | (D << 21))
     38 #define OR1K_LWZ(D,A)		(0x84000000 | (D << 21) | (A << 16))
     39 #define OR1K_ADD(D,A,B)		(0xE0000000 | (D << 21) | (A << 16) | (B << 11))
     40 #define OR1K_ORI(D,A)		(0xA8000000 | (D << 21) | (A << 16))
     41 #define OR1K_ORI0(D)		(0xA8000000 | (D << 21))
     42 #define OR1K_JR(B)		(0x44000000 | (B << 11))
     43 #define OR1K_NOP		0x15000000
     44 
     45 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
     46 
     47 static reloc_howto_type or1k_elf_howto_table[] =
     48 {
     49   /* This reloc does nothing.  */
     50   HOWTO (R_OR1K_NONE,		/* type */
     51 	 0,			/* rightshift */
     52 	 0,			/* size */
     53 	 0,			/* bitsize */
     54 	 false,			/* pc_relative */
     55 	 0,			/* bitpos */
     56 	 complain_overflow_dont, /* complain_on_overflow */
     57 	 bfd_elf_generic_reloc, /* special_function */
     58 	 "R_OR1K_NONE",		/* name */
     59 	 false,			/* partial_inplace */
     60 	 0,			/* src_mask */
     61 	 0,			/* dst_mask */
     62 	 false),		/* pcrel_offset */
     63 
     64   HOWTO (R_OR1K_32,
     65 	 0,			/* rightshift */
     66 	 4,			/* size */
     67 	 32,			/* bitsize */
     68 	 false,			/* pc_relative */
     69 	 0,			/* bitpos */
     70 	 complain_overflow_unsigned, /* complain_on_overflow */
     71 	 bfd_elf_generic_reloc, /* special_function */
     72 	 "R_OR1K_32",		/* name */
     73 	 false,			/* partial_inplace */
     74 	 0,			/* src_mask */
     75 	 0xffffffff,		/* dst_mask */
     76 	 false),		/* pcrel_offset */
     77 
     78   HOWTO (R_OR1K_16,
     79 	 0,			/* rightshift */
     80 	 2,			/* size */
     81 	 16,			/* bitsize */
     82 	 false,			/* pc_relative */
     83 	 0,			/* bitpos */
     84 	 complain_overflow_unsigned, /* complain_on_overflow */
     85 	 bfd_elf_generic_reloc, /* special_function */
     86 	 "R_OR1K_16",		/* name */
     87 	 false,			/* partial_inplace */
     88 	 0,			/* src_mask */
     89 	 0xffff,		/* dst_mask */
     90 	 false),		/* pcrel_offset */
     91 
     92   HOWTO (R_OR1K_8,
     93 	 0,			/* rightshift */
     94 	 1,			/* size */
     95 	 8,			/* bitsize */
     96 	 false,			/* pc_relative */
     97 	 0,			/* bitpos */
     98 	 complain_overflow_unsigned, /* complain_on_overflow */
     99 	 bfd_elf_generic_reloc, /* special_function */
    100 	 "R_OR1K_8",		/* name */
    101 	 false,			/* partial_inplace */
    102 	 0,			/* src_mask */
    103 	 0xff,			/* dst_mask */
    104 	 false),		/* pcrel_offset */
    105 
    106   HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
    107 	 0,			/* rightshift */
    108 	 4,			/* size */
    109 	 16,			/* bitsize */
    110 	 false,			/* pc_relative */
    111 	 0,			/* bitpos */
    112 	 complain_overflow_dont, /* complain_on_overflow */
    113 	 bfd_elf_generic_reloc, /* special_function */
    114 	 "R_OR1K_LO_16_IN_INSN", /* name */
    115 	 false,			/* partial_inplace */
    116 	 0,			/* src_mask */
    117 	 0x0000ffff,		/* dst_mask */
    118 	 false),		/* pcrel_offset */
    119 
    120   HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
    121 	 16,			/* rightshift */
    122 	 4,			/* size */
    123 	 16,			/* bitsize */
    124 	 false,			/* pc_relative */
    125 	 0,			/* bitpos */
    126 	 complain_overflow_dont, /* complain_on_overflow */
    127 	 bfd_elf_generic_reloc, /* special_function */
    128 	 "R_OR1K_HI_16_IN_INSN", /* name */
    129 	 false,			/* partial_inplace */
    130 	 0,			/* src_mask */
    131 	 0x0000ffff,		/* dst_mask */
    132 	 false),		/* pcrel_offset */
    133 
    134   /* A PC relative 26 bit relocation, right shifted by 2.  */
    135   HOWTO (R_OR1K_INSN_REL_26, /* type */
    136 	 2,			/* rightshift */
    137 	 4,			/* size */
    138 	 26,			/* bitsize */
    139 	 true,			/* pc_relative */
    140 	 0,			/* bitpos */
    141 	 complain_overflow_signed, /* complain_on_overflow */
    142 	 bfd_elf_generic_reloc, /* special_function */
    143 	 "R_OR1K_INSN_REL_26", /* name */
    144 	 false,			/* partial_inplace */
    145 	 0,			/* src_mask */
    146 	 0x03ffffff,		/* dst_mask */
    147 	 true),			/* pcrel_offset */
    148 
    149   /* GNU extension to record C++ vtable hierarchy.  */
    150   HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
    151 	 0,			/* rightshift */
    152 	 4,			/* size */
    153 	 0,			/* bitsize */
    154 	 false,			/* pc_relative */
    155 	 0,			/* bitpos */
    156 	 complain_overflow_dont, /* complain_on_overflow */
    157 	 NULL,			/* special_function */
    158 	 "R_OR1K_GNU_VTINHERIT", /* name */
    159 	 false,			/* partial_inplace */
    160 	 0,			/* src_mask */
    161 	 0,			/* dst_mask */
    162 	 false),		/* pcrel_offset */
    163 
    164   /* GNU extension to record C++ vtable member usage.  */
    165   HOWTO (R_OR1K_GNU_VTENTRY, /* type */
    166 	 0,			/* rightshift */
    167 	 4,			/* size */
    168 	 0,			/* bitsize */
    169 	 false,			/* pc_relative */
    170 	 0,			/* bitpos */
    171 	 complain_overflow_dont, /* complain_on_overflow */
    172 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
    173 	 "R_OR1K_GNU_VTENTRY", /* name */
    174 	 false,			/* partial_inplace */
    175 	 0,			/* src_mask */
    176 	 0,			/* dst_mask */
    177 	 false),		/* pcrel_offset */
    178 
    179   HOWTO (R_OR1K_32_PCREL,
    180 	 0,			/* rightshift */
    181 	 4,			/* size */
    182 	 32,			/* bitsize */
    183 	 true,			/* pc_relative */
    184 	 0,			/* bitpos */
    185 	 complain_overflow_signed, /* complain_on_overflow */
    186 	 bfd_elf_generic_reloc, /* special_function */
    187 	 "R_OR1K_32_PCREL",	/* name */
    188 	 false,			/* partial_inplace */
    189 	 0,			/* src_mask */
    190 	 0xffffffff,		/* dst_mask */
    191 	 true),			/* pcrel_offset */
    192 
    193   HOWTO (R_OR1K_16_PCREL,
    194 	 0,			/* rightshift */
    195 	 2,			/* size */
    196 	 16,			/* bitsize */
    197 	 true,			/* pc_relative */
    198 	 0,			/* bitpos */
    199 	 complain_overflow_signed, /* complain_on_overflow */
    200 	 bfd_elf_generic_reloc, /* special_function */
    201 	 "R_OR1K_16_PCREL",	/* name */
    202 	 false,			/* partial_inplace */
    203 	 0,			/* src_mask */
    204 	 0xffff,		/* dst_mask */
    205 	 true),			/* pcrel_offset */
    206 
    207   HOWTO (R_OR1K_8_PCREL,
    208 	 0,			/* rightshift */
    209 	 1,			/* size */
    210 	 8,			/* bitsize */
    211 	 true,			/* pc_relative */
    212 	 0,			/* bitpos */
    213 	 complain_overflow_signed, /* complain_on_overflow */
    214 	 bfd_elf_generic_reloc, /* special_function */
    215 	 "R_OR1K_8_PCREL",	/* name */
    216 	 false,			/* partial_inplace */
    217 	 0,			/* src_mask */
    218 	 0xff,			/* dst_mask */
    219 	 true),			/* pcrel_offset */
    220 
    221    HOWTO (R_OR1K_GOTPC_HI16,	/* Type.  */
    222 	 16,			/* Rightshift.  */
    223 	 4,			/* Size.  */
    224 	 16,			/* Bitsize.  */
    225 	 true,			/* PC_relative.  */
    226 	 0,			/* Bitpos.  */
    227 	 complain_overflow_dont, /* Complain on overflow.  */
    228 	 bfd_elf_generic_reloc, /* Special Function.  */
    229 	 "R_OR1K_GOTPC_HI16",	/* Name.  */
    230 	 false,		/* Partial Inplace.  */
    231 	 0,			/* Source Mask.  */
    232 	 0xffff,		/* Dest Mask.  */
    233 	 true),			/* PC relative offset?  */
    234 
    235    HOWTO (R_OR1K_GOTPC_LO16,	/* Type.  */
    236 	 0,			/* Rightshift.  */
    237 	 4,			/* Size.  */
    238 	 16,			/* Bitsize.  */
    239 	 true,			/* PC_relative.  */
    240 	 0,			/* Bitpos.  */
    241 	 complain_overflow_dont, /* Complain on overflow.  */
    242 	 bfd_elf_generic_reloc, /* Special Function.  */
    243 	 "R_OR1K_GOTPC_LO16",	/* Name.  */
    244 	 false,		/* Partial Inplace.  */
    245 	 0,			/* Source Mask.  */
    246 	 0xffff,		/* Dest Mask.  */
    247 	 true),			/* PC relative offset?  */
    248 
    249   HOWTO (R_OR1K_GOT16,		/* type */
    250 	 0,			/* rightshift */
    251 	 4,			/* size */
    252 	 16,			/* bitsize */
    253 	 false,			/* pc_relative */
    254 	 0,			/* bitpos */
    255 	 complain_overflow_signed, /* complain_on_overflow */
    256 	 bfd_elf_generic_reloc, /* special_function */
    257 	 "R_OR1K_GOT16",	/* name */
    258 	 false,			/* partial_inplace */
    259 	 0,			/* src_mask */
    260 	 0xffff,		/* dst_mask */
    261 	 false),		/* pcrel_offset */
    262 
    263   /* A 26 bit PLT relocation.  Shifted by 2.  */
    264   HOWTO (R_OR1K_PLT26,		/* Type.  */
    265 	 2,			/* Rightshift.  */
    266 	 4,			/* Size.  */
    267 	 26,			/* Bitsize.  */
    268 	 true,			/* pc_relative.  */
    269 	 0,			/* Bitpos.  */
    270 	 complain_overflow_signed, /* Complain on overflow.  */
    271 	 bfd_elf_generic_reloc, /* Special Function.  */
    272 	 "R_OR1K_PLT26",	/* Name.  */
    273 	 false,			/* Partial Inplace.  */
    274 	 0,			/* Source Mask.  */
    275 	 0x03ffffff,		/* Dest Mask.  */
    276 	 true),			/* PC relative offset?  */
    277 
    278   HOWTO (R_OR1K_GOTOFF_HI16,	/* type */
    279 	 16,			/* rightshift */
    280 	 4,			/* size */
    281 	 16,			/* bitsize */
    282 	 false,			/* pc_relative */
    283 	 0,			/* bitpos */
    284 	 complain_overflow_dont, /* complain_on_overflow */
    285 	 bfd_elf_generic_reloc, /* special_function */
    286 	 "R_OR1K_GOTOFF_HI16",	/* name */
    287 	 false,			/* partial_inplace */
    288 	 0x0,			/* src_mask */
    289 	 0xffff,		/* dst_mask */
    290 	 false),		/* pcrel_offset */
    291 
    292   HOWTO (R_OR1K_GOTOFF_LO16,	/* type */
    293 	 0,			/* rightshift */
    294 	 4,			/* size */
    295 	 16,			/* bitsize */
    296 	 false,			/* pc_relative */
    297 	 0,			/* bitpos */
    298 	 complain_overflow_dont, /* complain_on_overflow */
    299 	 bfd_elf_generic_reloc, /* special_function */
    300 	 "R_OR1K_GOTOFF_LO16",	/* name */
    301 	 false,			/* partial_inplace */
    302 	 0x0,			/* src_mask */
    303 	 0xffff,		/* dst_mask */
    304 	 false),		/* pcrel_offset */
    305 
    306   HOWTO (R_OR1K_COPY,		/* type */
    307 	 0,			/* rightshift */
    308 	 4,			/* size */
    309 	 32,			/* bitsize */
    310 	 false,			/* pc_relative */
    311 	 0,			/* bitpos */
    312 	 complain_overflow_bitfield, /* complain_on_overflow */
    313 	 bfd_elf_generic_reloc, /* special_function */
    314 	 "R_OR1K_COPY",		/* name */
    315 	 false,			/* partial_inplace */
    316 	 0xffffffff,		/* src_mask */
    317 	 0xffffffff,		/* dst_mask */
    318 	 false),		/* pcrel_offset */
    319 
    320   HOWTO (R_OR1K_GLOB_DAT,	/* type */
    321 	 0,			/* rightshift */
    322 	 4,			/* size */
    323 	 32,			/* bitsize */
    324 	 false,			/* pc_relative */
    325 	 0,			/* bitpos */
    326 	 complain_overflow_bitfield, /* complain_on_overflow */
    327 	 bfd_elf_generic_reloc, /* special_function */
    328 	 "R_OR1K_GLOB_DAT",	/* name */
    329 	 false,			/* partial_inplace */
    330 	 0xffffffff,		/* src_mask */
    331 	 0xffffffff,		/* dst_mask */
    332 	 false),		/* pcrel_offset */
    333 
    334   HOWTO (R_OR1K_JMP_SLOT,	/* type */
    335 	 0,			/* rightshift */
    336 	 4,			/* size */
    337 	 32,			/* bitsize */
    338 	 false,			/* pc_relative */
    339 	 0,			/* bitpos */
    340 	 complain_overflow_bitfield, /* complain_on_overflow */
    341 	 bfd_elf_generic_reloc, /* special_function */
    342 	 "R_OR1K_JMP_SLOT",	/* name */
    343 	 false,			/* partial_inplace */
    344 	 0xffffffff,		/* src_mask */
    345 	 0xffffffff,		/* dst_mask */
    346 	 false),		/* pcrel_offset */
    347 
    348   HOWTO (R_OR1K_RELATIVE,	/* type */
    349 	 0,			/* rightshift */
    350 	 4,			/* size */
    351 	 32,			/* bitsize */
    352 	 false,			/* pc_relative */
    353 	 0,			/* bitpos */
    354 	 complain_overflow_bitfield, /* complain_on_overflow */
    355 	 bfd_elf_generic_reloc, /* special_function */
    356 	 "R_OR1K_RELATIVE",	/* name */
    357 	 false,			/* partial_inplace */
    358 	 0xffffffff,		/* src_mask */
    359 	 0xffffffff,		/* dst_mask */
    360 	 false),		/* pcrel_offset */
    361 
    362   HOWTO (R_OR1K_TLS_GD_HI16,	/* type */
    363 	 16,			/* rightshift */
    364 	 4,			/* size */
    365 	 16,			/* bitsize */
    366 	 false,			/* pc_relative */
    367 	 0,			/* bitpos */
    368 	 complain_overflow_dont, /* complain_on_overflow */
    369 	 bfd_elf_generic_reloc, /* special_function */
    370 	 "R_OR1K_TLS_GD_HI16",	/* name */
    371 	 false,			/* partial_inplace */
    372 	 0x0,			/* src_mask */
    373 	 0xffff,		/* dst_mask */
    374 	 false),		/* pcrel_offset */
    375 
    376   HOWTO (R_OR1K_TLS_GD_LO16,	/* type */
    377 	 0,			/* rightshift */
    378 	 4,			/* size */
    379 	 16,			/* bitsize */
    380 	 false,			/* pc_relative */
    381 	 0,			/* bitpos */
    382 	 complain_overflow_dont, /* complain_on_overflow */
    383 	 bfd_elf_generic_reloc, /* special_function */
    384 	 "R_OR1K_TLS_GD_LO16",	/* name */
    385 	 false,			/* partial_inplace */
    386 	 0x0,			/* src_mask */
    387 	 0xffff,		/* dst_mask */
    388 	 false),		/* pcrel_offset */
    389 
    390   HOWTO (R_OR1K_TLS_LDM_HI16,	/* type */
    391 	 16,			/* rightshift */
    392 	 4,			/* size */
    393 	 16,			/* bitsize */
    394 	 false,			/* pc_relative */
    395 	 0,			/* bitpos */
    396 	 complain_overflow_dont, /* complain_on_overflow */
    397 	 bfd_elf_generic_reloc, /* special_function */
    398 	 "R_OR1K_TLS_LDM_HI16", /* name */
    399 	 false,			/* partial_inplace */
    400 	 0x0,			/* src_mask */
    401 	 0xffff,		/* dst_mask */
    402 	 false),		/* pcrel_offset */
    403 
    404   HOWTO (R_OR1K_TLS_LDM_LO16,	/* type */
    405 	 0,			/* rightshift */
    406 	 4,			/* size */
    407 	 16,			/* bitsize */
    408 	 false,			/* pc_relative */
    409 	 0,			/* bitpos */
    410 	 complain_overflow_dont, /* complain_on_overflow */
    411 	 bfd_elf_generic_reloc, /* special_function */
    412 	 "R_OR1K_TLS_LDM_LO16", /* name */
    413 	 false,			/* partial_inplace */
    414 	 0x0,			/* src_mask */
    415 	 0xffff,		/* dst_mask */
    416 	 false),		/* pcrel_offset */
    417 
    418   HOWTO (R_OR1K_TLS_LDO_HI16,	/* type */
    419 	 16,			/* rightshift */
    420 	 4,			/* size */
    421 	 16,			/* bitsize */
    422 	 false,			/* pc_relative */
    423 	 0,			/* bitpos */
    424 	 complain_overflow_dont, /* complain_on_overflow */
    425 	 bfd_elf_generic_reloc, /* special_function */
    426 	 "R_OR1K_TLS_LDO_HI16", /* name */
    427 	 false,			/* partial_inplace */
    428 	 0x0,			/* src_mask */
    429 	 0xffff,		/* dst_mask */
    430 	 false),		/* pcrel_offset */
    431 
    432   HOWTO (R_OR1K_TLS_LDO_LO16,	/* type */
    433 	 0,			/* rightshift */
    434 	 4,			/* size */
    435 	 16,			/* bitsize */
    436 	 false,			/* pc_relative */
    437 	 0,			/* bitpos */
    438 	 complain_overflow_dont, /* complain_on_overflow */
    439 	 bfd_elf_generic_reloc, /* special_function */
    440 	 "R_OR1K_TLS_LDO_LO16", /* name */
    441 	 false,			/* partial_inplace */
    442 	 0x0,			/* src_mask */
    443 	 0xffff,		/* dst_mask */
    444 	 false),		/* pcrel_offset */
    445 
    446   HOWTO (R_OR1K_TLS_IE_HI16,	/* type */
    447 	 16,			/* rightshift */
    448 	 4,			/* size */
    449 	 16,			/* bitsize */
    450 	 false,			/* pc_relative */
    451 	 0,			/* bitpos */
    452 	 complain_overflow_dont, /* complain_on_overflow */
    453 	 bfd_elf_generic_reloc, /* special_function */
    454 	 "R_OR1K_TLS_IE_HI16",	/* name */
    455 	 false,			/* partial_inplace */
    456 	 0x0,			/* src_mask */
    457 	 0xffff,		/* dst_mask */
    458 	 false),		/* pcrel_offset */
    459 
    460   HOWTO (R_OR1K_TLS_IE_LO16,	/* type */
    461 	 0,			/* rightshift */
    462 	 4,			/* size */
    463 	 16,			/* bitsize */
    464 	 false,			/* pc_relative */
    465 	 0,			/* bitpos */
    466 	 complain_overflow_dont, /* complain_on_overflow */
    467 	 bfd_elf_generic_reloc, /* special_function */
    468 	 "R_OR1K_TLS_IE_LO16",	/* name */
    469 	 false,			/* partial_inplace */
    470 	 0x0,			/* src_mask */
    471 	 0xffff,		/* dst_mask */
    472 	 false),		/* pcrel_offset */
    473 
    474   HOWTO (R_OR1K_TLS_LE_HI16,	/* type */
    475 	 16,			/* rightshift */
    476 	 4,			/* size */
    477 	 16,			/* bitsize */
    478 	 false,			/* pc_relative */
    479 	 0,			/* bitpos */
    480 	 complain_overflow_dont, /* complain_on_overflow */
    481 	 bfd_elf_generic_reloc, /* special_function */
    482 	 "R_OR1K_TLS_LE_HI16",	/* name */
    483 	 false,			/* partial_inplace */
    484 	 0x0,			/* src_mask */
    485 	 0xffff,		/* dst_mask */
    486 	 false),		/* pcrel_offset */
    487 
    488   HOWTO (R_OR1K_TLS_LE_LO16,	/* type */
    489 	 0,			/* rightshift */
    490 	 4,			/* size */
    491 	 16,			/* bitsize */
    492 	 false,			/* pc_relative */
    493 	 0,			/* bitpos */
    494 	 complain_overflow_dont, /* complain_on_overflow */
    495 	 bfd_elf_generic_reloc, /* special_function */
    496 	 "R_OR1K_TLS_LE_LO16",	/* name */
    497 	 false,			/* partial_inplace */
    498 	 0x0,			/* src_mask */
    499 	 0xffff,		/* dst_mask */
    500 	 false),		/* pcrel_offset */
    501 
    502   HOWTO (R_OR1K_TLS_TPOFF,	/* type */
    503 	 0,			/* rightshift */
    504 	 4,			/* size */
    505 	 32,			/* bitsize */
    506 	 false,			/* pc_relative */
    507 	 0,			/* bitpos */
    508 	 complain_overflow_bitfield, /* complain_on_overflow */
    509 	 bfd_elf_generic_reloc, /* special_function */
    510 	 "R_OR1K_TLS_TPOFF",    /* name */
    511 	 false,			/* partial_inplace */
    512 	 0xffffffff,		/* src_mask */
    513 	 0xffffffff,		/* dst_mask */
    514 	 false),		/* pcrel_offset */
    515 
    516   HOWTO (R_OR1K_TLS_DTPOFF,	/* type */
    517 	 0,			/* rightshift */
    518 	 4,			/* size */
    519 	 32,			/* bitsize */
    520 	 false,			/* pc_relative */
    521 	 0,			/* bitpos */
    522 	 complain_overflow_bitfield, /* complain_on_overflow */
    523 	 bfd_elf_generic_reloc, /* special_function */
    524 	 "R_OR1K_TLS_DTPOFF",   /* name */
    525 	 false,			/* partial_inplace */
    526 	 0xffffffff,		/* src_mask */
    527 	 0xffffffff,		/* dst_mask */
    528 	 false),		/* pcrel_offset */
    529 
    530   HOWTO (R_OR1K_TLS_DTPMOD,	/* type */
    531 	 0,			/* rightshift */
    532 	 4,			/* size */
    533 	 32,			/* bitsize */
    534 	 false,			/* pc_relative */
    535 	 0,			/* bitpos */
    536 	 complain_overflow_bitfield, /* complain_on_overflow */
    537 	 bfd_elf_generic_reloc, /* special_function */
    538 	 "R_OR1K_TLS_DTPMOD",   /* name */
    539 	 false,			/* partial_inplace */
    540 	 0xffffffff,		/* src_mask */
    541 	 0xffffffff,		/* dst_mask */
    542 	 false),		/* pcrel_offset */
    543 
    544   HOWTO (R_OR1K_AHI16,		/* type */
    545 	 16,			/* rightshift */
    546 	 4,			/* size */
    547 	 16,			/* bitsize */
    548 	 false,			/* pc_relative */
    549 	 0,			/* bitpos */
    550 	 complain_overflow_dont, /* complain_on_overflow */
    551 	 bfd_elf_generic_reloc, /* special_function */
    552 	 "R_OR1K_AHI16",	/* name */
    553 	 false,			/* partial_inplace */
    554 	 0x0,			/* src_mask */
    555 	 0xffff,		/* dst_mask */
    556 	 false),		/* pcrel_offset */
    557 
    558   HOWTO (R_OR1K_GOTOFF_AHI16,	/* type */
    559 	 16,			/* rightshift */
    560 	 4,			/* size */
    561 	 16,			/* bitsize */
    562 	 false,			/* pc_relative */
    563 	 0,			/* bitpos */
    564 	 complain_overflow_dont, /* complain_on_overflow */
    565 	 bfd_elf_generic_reloc, /* special_function */
    566 	 "R_OR1K_GOTOFF_AHI16", /* name */
    567 	 false,			/* partial_inplace */
    568 	 0x0,			/* src_mask */
    569 	 0xffff,		/* dst_mask */
    570 	 false),		/* pcrel_offset */
    571 
    572   HOWTO (R_OR1K_TLS_IE_AHI16,   /* type */
    573 	 16,			/* rightshift */
    574 	 4,			/* size */
    575 	 16,			/* bitsize */
    576 	 false,			/* pc_relative */
    577 	 0,			/* bitpos */
    578 	 complain_overflow_dont, /* complain_on_overflow */
    579 	 bfd_elf_generic_reloc, /* special_function */
    580 	 "R_OR1K_TLS_IE_AHI16", /* name */
    581 	 false,			/* partial_inplace */
    582 	 0x0,			/* src_mask */
    583 	 0xffff,		/* dst_mask */
    584 	 false),		/* pcrel_offset */
    585 
    586   HOWTO (R_OR1K_TLS_LE_AHI16,	/* type */
    587 	 16,			/* rightshift */
    588 	 4,			/* size */
    589 	 16,			/* bitsize */
    590 	 false,			/* pc_relative */
    591 	 0,			/* bitpos */
    592 	 complain_overflow_dont, /* complain_on_overflow */
    593 	 bfd_elf_generic_reloc, /* special_function */
    594 	 "R_OR1K_TLS_LE_AHI16", /* name */
    595 	 false,			/* partial_inplace */
    596 	 0x0,			/* src_mask */
    597 	 0xffff,		/* dst_mask */
    598 	 false),		/* pcrel_offset */
    599 
    600   HOWTO (R_OR1K_SLO16,		/* type */
    601 	 0,			/* rightshift */
    602 	 4,			/* size */
    603 	 16,			/* bitsize */
    604 	 false,			/* pc_relative */
    605 	 0,			/* bitpos */
    606 	 complain_overflow_dont, /* complain_on_overflow */
    607 	 bfd_elf_generic_reloc, /* special_function */
    608 	 "R_OR1K_SLO16",	/* name */
    609 	 false,			/* partial_inplace */
    610 	 0x0,			/* src_mask */
    611 	 0xffff,		/* dst_mask */
    612 	 false),		/* pcrel_offset */
    613 
    614   HOWTO (R_OR1K_GOTOFF_SLO16,	/* type */
    615 	 0,			/* rightshift */
    616 	 4,			/* size */
    617 	 16,			/* bitsize */
    618 	 false,			/* pc_relative */
    619 	 0,			/* bitpos */
    620 	 complain_overflow_dont, /* complain_on_overflow */
    621 	 bfd_elf_generic_reloc, /* special_function */
    622 	 "R_OR1K_GOTOFF_SLO16", /* name */
    623 	 false,			/* partial_inplace */
    624 	 0x0,			/* src_mask */
    625 	 0xffff,		/* dst_mask */
    626 	 false),		/* pcrel_offset */
    627 
    628   HOWTO (R_OR1K_TLS_LE_SLO16,   /* type */
    629 	 0,			/* rightshift */
    630 	 4,			/* size */
    631 	 16,			/* bitsize */
    632 	 false,			/* pc_relative */
    633 	 0,			/* bitpos */
    634 	 complain_overflow_dont, /* complain_on_overflow */
    635 	 bfd_elf_generic_reloc, /* special_function */
    636 	 "R_OR1K_TLS_LE_SLO16", /* name */
    637 	 false,			/* partial_inplace */
    638 	 0x0,			/* src_mask */
    639 	 0xffff,		/* dst_mask */
    640 	 false),		/* pcrel_offset */
    641 
    642   /* A page relative 21 bit relocation, right shifted by 13, aligned.
    643      Note that this is *page* relative, not pc relative.  The idea is
    644      similar, but normally the section alignment is not such that the
    645      assembler can infer a final value, which it attempts to do with
    646      pc-relative relocations to local symbols.  */
    647   HOWTO (R_OR1K_PCREL_PG21,    /* type */
    648 	 13,			/* rightshift */
    649 	 4,			/* size */
    650 	 21,			/* bitsize */
    651 	 false,			/* pc_relative */
    652 	 0,			/* bitpos */
    653 	 complain_overflow_signed, /* complain_on_overflow */
    654 	 bfd_elf_generic_reloc, /* special_function */
    655 	 "R_OR1K_PCREL_PG21",   /* name */
    656 	 false,			/* partial_inplace */
    657 	 0,			/* src_mask */
    658 	 0x001fffff,		/* dst_mask */
    659 	 true),			/* pcrel_offset */
    660 
    661   HOWTO (R_OR1K_GOT_PG21,       /* type */
    662 	 13,			/* rightshift */
    663 	 4,			/* size */
    664 	 21,			/* bitsize */
    665 	 false,			/* pc_relative */
    666 	 0,			/* bitpos */
    667 	 complain_overflow_signed, /* complain_on_overflow */
    668 	 bfd_elf_generic_reloc, /* special_function */
    669 	 "R_OR1K_GOT_PG21",     /* name */
    670 	 false,			/* partial_inplace */
    671 	 0,			/* src_mask */
    672 	 0x001fffff,		/* dst_mask */
    673 	 true),			/* pcrel_offset */
    674 
    675   HOWTO (R_OR1K_TLS_GD_PG21,    /* type */
    676 	 13,			/* rightshift */
    677 	 4,			/* size */
    678 	 21,			/* bitsize */
    679 	 false,			/* pc_relative */
    680 	 0,			/* bitpos */
    681 	 complain_overflow_signed, /* complain_on_overflow */
    682 	 bfd_elf_generic_reloc, /* special_function */
    683 	 "R_OR1K_TLS_GD_PG21",  /* name */
    684 	 false,			/* partial_inplace */
    685 	 0,			/* src_mask */
    686 	 0x001fffff,		/* dst_mask */
    687 	 true),			/* pcrel_offset */
    688 
    689   HOWTO (R_OR1K_TLS_LDM_PG21,   /* type */
    690 	 13,			/* rightshift */
    691 	 4,			/* size */
    692 	 21,			/* bitsize */
    693 	 false,			/* pc_relative */
    694 	 0,			/* bitpos */
    695 	 complain_overflow_signed, /* complain_on_overflow */
    696 	 bfd_elf_generic_reloc, /* special_function */
    697 	 "R_OR1K_TLS_LDM_PG21", /* name */
    698 	 false,			/* partial_inplace */
    699 	 0,			/* src_mask */
    700 	 0x001fffff,		/* dst_mask */
    701 	 true),			/* pcrel_offset */
    702 
    703   HOWTO (R_OR1K_TLS_IE_PG21,    /* type */
    704 	 13,			/* rightshift */
    705 	 4,			/* size */
    706 	 21,			/* bitsize */
    707 	 false,			/* pc_relative */
    708 	 0,			/* bitpos */
    709 	 complain_overflow_signed, /* complain_on_overflow */
    710 	 bfd_elf_generic_reloc, /* special_function */
    711 	 "R_OR1K_TLS_IE_PG21",  /* name */
    712 	 false,			/* partial_inplace */
    713 	 0,			/* src_mask */
    714 	 0x001fffff,		/* dst_mask */
    715 	 true),			/* pcrel_offset */
    716 
    717   HOWTO (R_OR1K_LO13,		/* type */
    718 	 0,			/* rightshift */
    719 	 4,			/* size */
    720 	 16,			/* bitsize */
    721 	 false,			/* pc_relative */
    722 	 0,			/* bitpos */
    723 	 complain_overflow_dont, /* complain_on_overflow */
    724 	 bfd_elf_generic_reloc, /* special_function */
    725 	 "R_OR1K_LO13",		/* name */
    726 	 false,			/* partial_inplace */
    727 	 0x0,			/* src_mask */
    728 	 0xffff,		/* dst_mask */
    729 	 false),		/* pcrel_offset */
    730 
    731   HOWTO (R_OR1K_GOT_LO13,       /* type */
    732 	 0,			/* rightshift */
    733 	 4,			/* size */
    734 	 16,			/* bitsize */
    735 	 false,			/* pc_relative */
    736 	 0,			/* bitpos */
    737 	 complain_overflow_dont, /* complain_on_overflow */
    738 	 bfd_elf_generic_reloc, /* special_function */
    739 	 "R_OR1K_GOT_LO13",     /* name */
    740 	 false,			/* partial_inplace */
    741 	 0x0,			/* src_mask */
    742 	 0xffff,		/* dst_mask */
    743 	 false),		/* pcrel_offset */
    744 
    745   HOWTO (R_OR1K_TLS_GD_LO13,    /* type */
    746 	 0,			/* rightshift */
    747 	 4,			/* size */
    748 	 16,			/* bitsize */
    749 	 false,			/* pc_relative */
    750 	 0,			/* bitpos */
    751 	 complain_overflow_dont, /* complain_on_overflow */
    752 	 bfd_elf_generic_reloc, /* special_function */
    753 	 "R_OR1K_TLS_GD_LO13",  /* name */
    754 	 false,			/* partial_inplace */
    755 	 0x0,			/* src_mask */
    756 	 0xffff,		/* dst_mask */
    757 	 false),		/* pcrel_offset */
    758 
    759   HOWTO (R_OR1K_TLS_LDM_LO13,   /* type */
    760 	 0,			/* rightshift */
    761 	 4,			/* size */
    762 	 16,			/* bitsize */
    763 	 false,			/* pc_relative */
    764 	 0,			/* bitpos */
    765 	 complain_overflow_dont, /* complain_on_overflow */
    766 	 bfd_elf_generic_reloc, /* special_function */
    767 	 "R_OR1K_TLD_LDM_LO13", /* name */
    768 	 false,			/* partial_inplace */
    769 	 0x0,			/* src_mask */
    770 	 0xffff,		/* dst_mask */
    771 	 false),		/* pcrel_offset */
    772 
    773   HOWTO (R_OR1K_TLS_IE_LO13,    /* type */
    774 	 0,			/* rightshift */
    775 	 4,			/* size */
    776 	 16,			/* bitsize */
    777 	 false,			/* pc_relative */
    778 	 0,			/* bitpos */
    779 	 complain_overflow_dont, /* complain_on_overflow */
    780 	 bfd_elf_generic_reloc, /* special_function */
    781 	 "R_OR1K_TLS_IE_LO13",  /* name */
    782 	 false,			/* partial_inplace */
    783 	 0x0,			/* src_mask */
    784 	 0xffff,		/* dst_mask */
    785 	 false),		/* pcrel_offset */
    786 
    787   HOWTO (R_OR1K_SLO13,		/* type */
    788 	 0,			/* rightshift */
    789 	 4,			/* size */
    790 	 16,			/* bitsize */
    791 	 false,			/* pc_relative */
    792 	 0,			/* bitpos */
    793 	 complain_overflow_dont, /* complain_on_overflow */
    794 	 bfd_elf_generic_reloc, /* special_function */
    795 	 "R_OR1K_SLO13",	/* name */
    796 	 false,			/* partial_inplace */
    797 	 0x0,			/* src_mask */
    798 	 0xffff,		/* dst_mask */
    799 	 false),		/* pcrel_offset */
    800 
    801   /* A 26 bit PLT relocation, using ADRP.  Shifted by 2.  */
    802   HOWTO (R_OR1K_PLTA26,		/* Type.  */
    803 	 2,			/* Rightshift.  */
    804 	 4,			/* Size.  */
    805 	 26,			/* Bitsize.  */
    806 	 true,			/* pc_relative.  */
    807 	 0,			/* Bitpos.  */
    808 	 complain_overflow_signed, /* Complain on overflow.  */
    809 	 bfd_elf_generic_reloc,	/* Special Function.  */
    810 	 "R_OR1K_PLTA26",	/* Name.  */
    811 	 false,			/* Partial Inplace.  */
    812 	 0,			/* Source Mask.  */
    813 	 0x03ffffff,		/* Dest Mask.  */
    814 	 true),			/* PC relative offset?  */
    815 
    816   HOWTO (R_OR1K_GOT_AHI16,	/* type */
    817 	 16,			/* rightshift */
    818 	 4,			/* size */
    819 	 16,			/* bitsize */
    820 	 false,			/* pc_relative */
    821 	 0,			/* bitpos */
    822 	 complain_overflow_signed, /* complain_on_overflow */
    823 	 bfd_elf_generic_reloc, /* special_function */
    824 	 "R_OR1K_GOT_AHI16",	/* name */
    825 	 false,			/* partial_inplace */
    826 	 0,			/* src_mask */
    827 	 0xffff,		/* dst_mask */
    828 	 false),		/* pcrel_offset */
    829 };
    830 
    831 /* A copy of the R_OR1K_GOT16 used in the presense of R_OR1K_GOT_AHI16
    832    relocations when we know we can ignore overflows.  */
    833 static reloc_howto_type or1k_elf_got16_no_overflow_howto =
    834   HOWTO (R_OR1K_GOT16,		/* type */
    835 	 0,			/* rightshift */
    836 	 4,			/* size */
    837 	 16,			/* bitsize */
    838 	 false,			/* pc_relative */
    839 	 0,			/* bitpos */
    840 	 complain_overflow_dont, /* complain_on_overflow */
    841 	 bfd_elf_generic_reloc, /* special_function */
    842 	 "R_OR1K_GOT16",	/* name */
    843 	 false,			/* partial_inplace */
    844 	 0,			/* src_mask */
    845 	 0xffff,		/* dst_mask */
    846 	 false);		/* pcrel_offset */
    847 
    848 /* Map BFD reloc types to Or1k ELF reloc types.  */
    849 
    850 struct or1k_reloc_map
    851 {
    852   bfd_reloc_code_real_type bfd_reloc_val;
    853   unsigned int or1k_reloc_val;
    854 };
    855 
    856 static const struct or1k_reloc_map or1k_reloc_map[] =
    857 {
    858   { BFD_RELOC_NONE,		R_OR1K_NONE },
    859   { BFD_RELOC_32,		R_OR1K_32 },
    860   { BFD_RELOC_16,		R_OR1K_16 },
    861   { BFD_RELOC_8,		R_OR1K_8 },
    862   { BFD_RELOC_LO16,		R_OR1K_LO_16_IN_INSN },
    863   { BFD_RELOC_HI16,		R_OR1K_HI_16_IN_INSN },
    864   { BFD_RELOC_HI16_S,		R_OR1K_AHI16 },
    865   { BFD_RELOC_OR1K_REL_26,	R_OR1K_INSN_REL_26 },
    866   { BFD_RELOC_VTABLE_ENTRY,	R_OR1K_GNU_VTENTRY },
    867   { BFD_RELOC_VTABLE_INHERIT,	R_OR1K_GNU_VTINHERIT },
    868   { BFD_RELOC_32_PCREL,		R_OR1K_32_PCREL },
    869   { BFD_RELOC_16_PCREL,		R_OR1K_16_PCREL },
    870   { BFD_RELOC_8_PCREL,		R_OR1K_8_PCREL },
    871   { BFD_RELOC_LO16_GOTOFF,	R_OR1K_GOTOFF_LO16 },
    872   { BFD_RELOC_HI16_GOTOFF,	R_OR1K_GOTOFF_HI16 },
    873   { BFD_RELOC_HI16_S_GOTOFF,	R_OR1K_GOTOFF_AHI16 },
    874   { BFD_RELOC_OR1K_GOTPC_HI16,	R_OR1K_GOTPC_HI16 },
    875   { BFD_RELOC_OR1K_GOTPC_LO16,	R_OR1K_GOTPC_LO16 },
    876   { BFD_RELOC_OR1K_GOT16,	R_OR1K_GOT16 },
    877   { BFD_RELOC_OR1K_PLT26,	R_OR1K_PLT26 },
    878   { BFD_RELOC_OR1K_GLOB_DAT,	R_OR1K_GLOB_DAT },
    879   { BFD_RELOC_OR1K_COPY,	R_OR1K_COPY },
    880   { BFD_RELOC_OR1K_JMP_SLOT,	R_OR1K_JMP_SLOT },
    881   { BFD_RELOC_OR1K_RELATIVE,	R_OR1K_RELATIVE },
    882   { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
    883   { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
    884   { BFD_RELOC_OR1K_TLS_LDM_HI16,	R_OR1K_TLS_LDM_HI16 },
    885   { BFD_RELOC_OR1K_TLS_LDM_LO16,	R_OR1K_TLS_LDM_LO16 },
    886   { BFD_RELOC_OR1K_TLS_LDO_HI16,	R_OR1K_TLS_LDO_HI16 },
    887   { BFD_RELOC_OR1K_TLS_LDO_LO16,	R_OR1K_TLS_LDO_LO16 },
    888   { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
    889   { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
    890   { BFD_RELOC_OR1K_TLS_IE_AHI16, R_OR1K_TLS_IE_AHI16 },
    891   { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
    892   { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
    893   { BFD_RELOC_OR1K_TLS_LE_AHI16, R_OR1K_TLS_LE_AHI16 },
    894   { BFD_RELOC_OR1K_SLO16,	R_OR1K_SLO16 },
    895   { BFD_RELOC_OR1K_GOTOFF_SLO16, R_OR1K_GOTOFF_SLO16 },
    896   { BFD_RELOC_OR1K_TLS_LE_SLO16, R_OR1K_TLS_LE_SLO16 },
    897   { BFD_RELOC_OR1K_PCREL_PG21,	R_OR1K_PCREL_PG21 },
    898   { BFD_RELOC_OR1K_GOT_PG21,	R_OR1K_GOT_PG21 },
    899   { BFD_RELOC_OR1K_TLS_GD_PG21,	R_OR1K_TLS_GD_PG21 },
    900   { BFD_RELOC_OR1K_TLS_LDM_PG21, R_OR1K_TLS_LDM_PG21 },
    901   { BFD_RELOC_OR1K_TLS_IE_PG21,	R_OR1K_TLS_IE_PG21 },
    902   { BFD_RELOC_OR1K_LO13,	R_OR1K_LO13 },
    903   { BFD_RELOC_OR1K_GOT_LO13,	R_OR1K_GOT_LO13 },
    904   { BFD_RELOC_OR1K_TLS_GD_LO13,	R_OR1K_TLS_GD_LO13 },
    905   { BFD_RELOC_OR1K_TLS_LDM_LO13, R_OR1K_TLS_LDM_LO13 },
    906   { BFD_RELOC_OR1K_TLS_IE_LO13,	R_OR1K_TLS_IE_LO13 },
    907   { BFD_RELOC_OR1K_SLO13,	R_OR1K_SLO13 },
    908   { BFD_RELOC_OR1K_PLTA26,	R_OR1K_PLTA26 },
    909   { BFD_RELOC_OR1K_GOT_AHI16,	R_OR1K_GOT_AHI16 },
    910 };
    911 
    912 /* tls_type is a mask used to track how each symbol is accessed,
    913    it may be accessed via multiple types of TLS access methods.
    914    We track this for sizing (allocating got + relocation section space) and
    915    for how to process relocations.  */
    916 #define TLS_UNKNOWN    0
    917 #define TLS_NONE       1
    918 #define TLS_GD	       2
    919 #define TLS_LD	       4
    920 #define TLS_IE	       8
    921 #define TLS_LE	      16
    922 
    923 /* The size of the TLS thread control block, used to offset LE access.  */
    924 #define TCB_SIZE      16
    925 
    926 /* ELF linker hash entry.  */
    927 struct elf_or1k_link_hash_entry
    928 {
    929   struct elf_link_hash_entry root;
    930 
    931   /* For calculating PLT size.  */
    932   bfd_vma plt_index;
    933   /* Track type of TLS access.  */
    934   unsigned char tls_type;
    935 };
    936 
    937 /* ELF object data.  */
    938 struct elf_or1k_obj_tdata
    939 {
    940   struct elf_obj_tdata root;
    941 
    942   /* tls_type for each local got entry.  */
    943   unsigned char *local_tls_type;
    944 };
    945 
    946 #define elf_or1k_tdata(abfd) \
    947   ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
    948 
    949 #define elf_or1k_local_tls_type(abfd) \
    950   (elf_or1k_tdata (abfd)->local_tls_type)
    951 
    952 /* ELF linker hash table.  */
    953 struct elf_or1k_link_hash_table
    954 {
    955   struct elf_link_hash_table root;
    956 
    957   bfd_vma plt_count;
    958   bool saw_plta;
    959 };
    960 
    961 static size_t
    962 elf_or1k_plt_entry_size (bfd_vma plt_index)
    963 {
    964   bfd_vma plt_reloc;
    965 
    966   plt_reloc = plt_index * sizeof (Elf32_External_Rela);
    967 
    968   return (plt_reloc > 0xffff) ? PLT_ENTRY_SIZE_LARGE : PLT_ENTRY_SIZE;
    969 }
    970 
    971 /* Get the ELF linker hash table from a link_info structure.  */
    972 #define or1k_elf_hash_table(p) \
    973   ((is_elf_hash_table ((p)->hash)					\
    974     && elf_hash_table_id (elf_hash_table (p)) == OR1K_ELF_DATA)		\
    975    ? (struct elf_or1k_link_hash_table *) (p)->hash : NULL)
    976 
    977 static bool
    978 elf_or1k_mkobject (bfd *abfd)
    979 {
    980   return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
    981 				  OR1K_ELF_DATA);
    982 }
    983 
    984 /* Create an entry in an or1k ELF linker hash table.  */
    985 
    986 static struct bfd_hash_entry *
    987 or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
    988 			    struct bfd_hash_table *table,
    989 			    const char *string)
    990 {
    991   struct elf_or1k_link_hash_entry *ret =
    992     (struct elf_or1k_link_hash_entry *) entry;
    993 
    994   /* Allocate the structure if it has not already been allocated by a
    995      subclass.  */
    996   if (ret == NULL)
    997     ret = bfd_hash_allocate (table,
    998 			     sizeof (struct elf_or1k_link_hash_entry));
    999   if (ret == NULL)
   1000     return NULL;
   1001 
   1002   /* Call the allocation method of the superclass.  */
   1003   ret = ((struct elf_or1k_link_hash_entry *)
   1004 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
   1005 				     table, string));
   1006   if (ret != NULL)
   1007     {
   1008       struct elf_or1k_link_hash_entry *eh;
   1009 
   1010       eh = (struct elf_or1k_link_hash_entry *) ret;
   1011       eh->tls_type = TLS_UNKNOWN;
   1012     }
   1013 
   1014   return (struct bfd_hash_entry *) ret;
   1015 }
   1016 
   1017 /* Create an or1k ELF linker hash table.  */
   1018 
   1019 static struct bfd_link_hash_table *
   1020 or1k_elf_link_hash_table_create (bfd *abfd)
   1021 {
   1022   struct elf_or1k_link_hash_table *ret;
   1023   size_t amt = sizeof (struct elf_or1k_link_hash_table);
   1024 
   1025   ret = bfd_zmalloc (amt);
   1026   if (ret == NULL)
   1027     return NULL;
   1028 
   1029   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
   1030 				      or1k_elf_link_hash_newfunc,
   1031 				      sizeof (struct elf_or1k_link_hash_entry),
   1032 				      OR1K_ELF_DATA))
   1033     {
   1034       free (ret);
   1035       return NULL;
   1036     }
   1037 
   1038   return &ret->root.root;
   1039 }
   1040 
   1041 static reloc_howto_type *
   1042 or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
   1043 			bfd_reloc_code_real_type bcode)
   1044 {
   1045   unsigned int i;
   1046 
   1047   for (i = 0; i < ARRAY_SIZE (or1k_reloc_map); i++)
   1048     if (or1k_reloc_map[i].bfd_reloc_val == bcode)
   1049       {
   1050 	unsigned int ocode = or1k_reloc_map[i].or1k_reloc_val;
   1051 	if (ocode < (unsigned int) R_OR1K_max)
   1052 	  return &or1k_elf_howto_table[ocode];
   1053 	else
   1054 	  break;
   1055       }
   1056 
   1057   return NULL;
   1058 }
   1059 
   1060 static reloc_howto_type *
   1061 or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1062 			const char *r_name)
   1063 {
   1064   unsigned int i;
   1065 
   1066   for (i = 0; i < R_OR1K_max; i++)
   1067     if (or1k_elf_howto_table[i].name != NULL
   1068 	&& strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
   1069       return &or1k_elf_howto_table[i];
   1070 
   1071   return NULL;
   1072 }
   1073 
   1074 /* Set the howto pointer for an Or1k ELF reloc.  */
   1075 
   1076 static bool
   1077 or1k_info_to_howto_rela (bfd * abfd,
   1078 			 arelent * cache_ptr,
   1079 			 Elf_Internal_Rela * dst)
   1080 {
   1081   unsigned int r_type;
   1082 
   1083   r_type = ELF32_R_TYPE (dst->r_info);
   1084   if (r_type >= (unsigned int) R_OR1K_max)
   1085     {
   1086       /* xgettext:c-format */
   1087       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   1088 			  abfd, r_type);
   1089       bfd_set_error (bfd_error_bad_value);
   1090       return false;
   1091     }
   1092   cache_ptr->howto = & or1k_elf_howto_table[r_type];
   1093   return true;
   1094 }
   1095 
   1096 /* Return the relocation value for @tpoff relocations..  */
   1097 static bfd_vma
   1098 tpoff (struct bfd_link_info *info, bfd_vma address, bool dynamic)
   1099 {
   1100   struct elf_link_hash_table *htab = elf_hash_table (info);
   1101   bfd_vma base;
   1102 
   1103   /* If tls_sec is NULL, we should have signalled an error already.  */
   1104   if (htab->tls_sec == NULL)
   1105     return 0;
   1106 
   1107   if (dynamic)
   1108     return address - htab->tls_sec->vma;
   1109   else
   1110     {
   1111       /* On or1k, the tp points to just after the tcb, if we have an alignment
   1112 	 greater than the tcb size we need to offset by the alignment difference.  */
   1113       base = align_power ((bfd_vma) TCB_SIZE, htab->tls_sec->alignment_power)
   1114 	     - TCB_SIZE;
   1115 
   1116       /* The thread pointer on or1k stores the address after the TCB where
   1117 	 the data is, just compute the difference. No need to compensate
   1118 	 for the size of TCB.  */
   1119       return address - htab->tls_sec->vma + base;
   1120     }
   1121 }
   1122 
   1123 /* If we have both IE and GD accesses to a symbol the IE relocations should be
   1124    offset by 8 bytes because the got contains both GD and IE entries.  */
   1125 static bfd_vma
   1126 or1k_initial_exec_offset (reloc_howto_type *howto, unsigned char tls_type_mask)
   1127 {
   1128    switch (howto->type)
   1129      {
   1130      case R_OR1K_TLS_IE_HI16:
   1131      case R_OR1K_TLS_IE_LO16:
   1132      case R_OR1K_TLS_IE_PG21:
   1133      case R_OR1K_TLS_IE_LO13:
   1134      case R_OR1K_TLS_IE_AHI16:
   1135        return (tls_type_mask & TLS_GD) != 0 ? 8 : 0;
   1136      default:
   1137        return 0;
   1138      }
   1139 }
   1140 
   1141 /* Like _bfd_final_link_relocate, but handles non-contiguous fields.  */
   1142 
   1143 static bfd_reloc_status_type
   1144 or1k_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
   1145 			  asection *input_section, bfd_byte *contents,
   1146 			  bfd_vma offset, bfd_vma value)
   1147 {
   1148   bfd_reloc_status_type status = bfd_reloc_ok;
   1149   int size = bfd_get_reloc_size (howto);
   1150   bfd_vma x, place;
   1151 
   1152   /* Sanity check the address.  */
   1153   if (offset + size > bfd_get_section_limit_octets (input_bfd, input_section))
   1154     return bfd_reloc_outofrange;
   1155 
   1156   place = (input_section->output_section->vma
   1157 	   + input_section->output_offset
   1158 	   + (howto->pcrel_offset ? offset : 0));
   1159 
   1160   switch (howto->type)
   1161     {
   1162     case R_OR1K_AHI16:
   1163     case R_OR1K_GOT_AHI16:
   1164     case R_OR1K_GOTOFF_AHI16:
   1165     case R_OR1K_TLS_IE_AHI16:
   1166     case R_OR1K_TLS_LE_AHI16:
   1167       /* Adjust the operand to match with a signed LO16.  */
   1168       value += 0x8000;
   1169       break;
   1170 
   1171     case R_OR1K_INSN_REL_26:
   1172       value -= place;
   1173       /* Diagnose mis-aligned branch targets.  */
   1174       if (value & 3)
   1175 	status = bfd_reloc_dangerous;
   1176       break;
   1177 
   1178     case R_OR1K_PCREL_PG21:
   1179     case R_OR1K_GOT_PG21:
   1180     case R_OR1K_TLS_GD_PG21:
   1181     case R_OR1K_TLS_LDM_PG21:
   1182     case R_OR1K_TLS_IE_PG21:
   1183       value = (value & -8192) - (place & -8192);
   1184       break;
   1185 
   1186     case R_OR1K_LO13:
   1187     case R_OR1K_GOT_LO13:
   1188     case R_OR1K_TLS_GD_LO13:
   1189     case R_OR1K_TLS_LDM_LO13:
   1190     case R_OR1K_TLS_IE_LO13:
   1191     case R_OR1K_SLO13:
   1192       value &= 8191;
   1193       break;
   1194 
   1195     default:
   1196       if (howto->pc_relative)
   1197 	value -= place;
   1198       break;
   1199     }
   1200 
   1201   status = bfd_check_overflow (howto->complain_on_overflow,
   1202 			       howto->bitsize,
   1203 			       howto->rightshift,
   1204 			       bfd_arch_bits_per_address (input_bfd),
   1205 			       value);
   1206   value >>= howto->rightshift;
   1207 
   1208   /* If we're overwriting the entire destination,
   1209      then no need to read the current contents.  */
   1210   if (size == 0 || howto->dst_mask == N_ONES (size))
   1211     x = 0;
   1212   else
   1213     {
   1214       BFD_ASSERT (size == 4);
   1215       x = bfd_get_32 (input_bfd, contents + offset);
   1216     }
   1217 
   1218   switch (howto->type)
   1219     {
   1220     case R_OR1K_SLO16:
   1221     case R_OR1K_GOTOFF_SLO16:
   1222     case R_OR1K_TLS_LE_SLO16:
   1223     case R_OR1K_SLO13:
   1224       /* The split imm16 field used for stores.  */
   1225       x = (x & ~0x3e007ff) | ((value & 0xf800) << 10) | (value & 0x7ff);
   1226       break;
   1227 
   1228     default:
   1229       {
   1230 	bfd_vma fieldmask = howto->dst_mask;
   1231 	value <<= howto->bitpos;
   1232 	x = (x & ~fieldmask) | (value & fieldmask);
   1233       }
   1234       break;
   1235     }
   1236 
   1237   /* Put the relocated value back in the object file.  */
   1238   switch (size)
   1239     {
   1240     case 0:
   1241       break;
   1242     case 1:
   1243       bfd_put_8 (input_bfd, x, contents + offset);
   1244       break;
   1245     case 2:
   1246       bfd_put_16 (input_bfd, x, contents + offset);
   1247       break;
   1248     case 4:
   1249       bfd_put_32 (input_bfd, x, contents + offset);
   1250       break;
   1251 #ifdef BFD64
   1252     case 8:
   1253       bfd_put_64 (input_bfd, x, contents + offset);
   1254       break;
   1255 #endif
   1256     default:
   1257       _bfd_error_handler
   1258 	(_("%pB: Cannot handle relocation value size of %d"),
   1259 	 input_bfd, size);
   1260       abort ();
   1261     }
   1262   return status;
   1263 }
   1264 
   1265 /* Relocate an Or1k ELF section.
   1266 
   1267    The RELOCATE_SECTION function is called by the new ELF backend linker
   1268    to handle the relocations for a section.
   1269 
   1270    The relocs are always passed as Rela structures; if the section
   1271    actually uses Rel structures, the r_addend field will always be
   1272    zero.
   1273 
   1274    This function is responsible for adjusting the section contents as
   1275    necessary, and (if using Rela relocs and generating a relocatable
   1276    output file) adjusting the reloc addend as necessary.
   1277 
   1278    This function does not have to worry about setting the reloc
   1279    address or the reloc symbol index.
   1280 
   1281    LOCAL_SYMS is a pointer to the swapped in local symbols.
   1282 
   1283    LOCAL_SECTIONS is an array giving the section in the input file
   1284    corresponding to the st_shndx field of each local symbol.
   1285 
   1286    The global hash table entry for the global symbols can be found
   1287    via elf_sym_hashes (input_bfd).
   1288 
   1289    When generating relocatable output, this function must handle
   1290    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   1291    going to be the section symbol corresponding to the output
   1292    section, which means that the addend must be adjusted
   1293    accordingly.  */
   1294 
   1295 static int
   1296 or1k_elf_relocate_section (bfd *output_bfd,
   1297 			   struct bfd_link_info *info,
   1298 			   bfd *input_bfd,
   1299 			   asection *input_section,
   1300 			   bfd_byte *contents,
   1301 			   Elf_Internal_Rela *relocs,
   1302 			   Elf_Internal_Sym *local_syms,
   1303 			   asection **local_sections)
   1304 {
   1305   Elf_Internal_Shdr *symtab_hdr;
   1306   struct elf_link_hash_entry **sym_hashes;
   1307   Elf_Internal_Rela *rel;
   1308   Elf_Internal_Rela *relend;
   1309   struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
   1310   asection *sreloc;
   1311   bfd_vma *local_got_offsets;
   1312   asection *sgot, *splt;
   1313   bfd_vma plt_base, got_base, got_sym_value;
   1314   bool ret_val = true;
   1315   bool saw_gotha = false;
   1316 
   1317   if (htab == NULL)
   1318     return false;
   1319 
   1320   local_got_offsets = elf_local_got_offsets (input_bfd);
   1321 
   1322   sreloc = elf_section_data (input_section)->sreloc;
   1323 
   1324   splt = htab->root.splt;
   1325   plt_base = 0;
   1326   if (splt != NULL)
   1327     plt_base = splt->output_section->vma + splt->output_offset;
   1328 
   1329   sgot = htab->root.sgot;
   1330   got_sym_value = got_base = 0;
   1331   if (sgot != NULL)
   1332     {
   1333       struct elf_link_hash_entry *hgot = htab->root.hgot;
   1334       got_sym_value = (hgot->root.u.def.value
   1335 		       + hgot->root.u.def.section->output_section->vma
   1336 		       + hgot->root.u.def.section->output_offset);
   1337       got_base = sgot->output_section->vma + sgot->output_offset;
   1338     }
   1339 
   1340   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1341   sym_hashes = elf_sym_hashes (input_bfd);
   1342   relend = relocs + input_section->reloc_count;
   1343 
   1344   for (rel = relocs; rel < relend; rel++)
   1345     {
   1346       reloc_howto_type *howto;
   1347       unsigned long r_symndx;
   1348       Elf_Internal_Sym *sym;
   1349       asection *sec;
   1350       struct elf_link_hash_entry *h;
   1351       bfd_vma relocation;
   1352       bfd_reloc_status_type r;
   1353       const char *name = NULL;
   1354       int r_type;
   1355 
   1356       r_type = ELF32_R_TYPE (rel->r_info);
   1357       r_symndx = ELF32_R_SYM (rel->r_info);
   1358 
   1359       if (r_type == R_OR1K_GNU_VTINHERIT
   1360 	  || r_type == R_OR1K_GNU_VTENTRY)
   1361 	continue;
   1362 
   1363       if (r_type < 0 || r_type >= (int) R_OR1K_max)
   1364 	{
   1365 	  _bfd_error_handler
   1366 	    (_("%pB: unknown relocation type %d"),
   1367 	     input_bfd, (int) r_type);
   1368 	  bfd_set_error (bfd_error_bad_value);
   1369 	  ret_val = false;
   1370 	  continue;
   1371 	}
   1372 
   1373       howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
   1374       h = NULL;
   1375       sym = NULL;
   1376       sec = NULL;
   1377 
   1378       if (r_symndx < symtab_hdr->sh_info)
   1379 	{
   1380 	  sym = local_syms + r_symndx;
   1381 	  sec = local_sections[r_symndx];
   1382 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   1383 
   1384 	  name = bfd_elf_string_from_elf_section
   1385 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
   1386 	  name = name == NULL ? bfd_section_name (sec) : name;
   1387 	}
   1388       else
   1389 	{
   1390 	  bool unresolved_reloc, warned, ignored;
   1391 
   1392 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   1393 				   r_symndx, symtab_hdr, sym_hashes,
   1394 				   h, sec, relocation,
   1395 				   unresolved_reloc, warned, ignored);
   1396 	  name = h->root.root.string;
   1397 	}
   1398 
   1399       if (sec != NULL && discarded_section (sec))
   1400 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   1401 					 rel, 1, relend, howto, 0, contents);
   1402 
   1403       if (bfd_link_relocatable (info))
   1404 	continue;
   1405 
   1406       switch (howto->type)
   1407 	{
   1408 	case R_OR1K_PLT26:
   1409 	case R_OR1K_PLTA26:
   1410 	  /* If the call is not local, redirect the branch to the PLT.
   1411 	     Otherwise do nothing to send the branch to the symbol direct.  */
   1412 	  if (!SYMBOL_CALLS_LOCAL (info, h)
   1413 	      && h->plt.offset != (bfd_vma) -1)
   1414 	    relocation = plt_base + h->plt.offset;
   1415 
   1416 	  /* Addend should be zero.  */
   1417 	  if (rel->r_addend != 0)
   1418 	    {
   1419 	      _bfd_error_handler
   1420 		(_("%pB: addend should be zero for plt relocations"),
   1421 		 input_bfd);
   1422 	      bfd_set_error (bfd_error_bad_value);
   1423 	      ret_val = false;
   1424 	    }
   1425 	  break;
   1426 
   1427 	case R_OR1K_GOT_AHI16:
   1428 	case R_OR1K_GOT16:
   1429 	case R_OR1K_GOT_PG21:
   1430 	case R_OR1K_GOT_LO13:
   1431 	  {
   1432 	    bfd_vma off;
   1433 
   1434 	    /* Relocation is to the entry for this symbol
   1435 	       in the global offset table.  */
   1436 	  BFD_ASSERT (sgot != NULL);
   1437 	  if (h != NULL)
   1438 	    {
   1439 	      bool dyn;
   1440 
   1441 	      off = h->got.offset;
   1442 	      BFD_ASSERT (off != (bfd_vma) -1);
   1443 
   1444 	      dyn = htab->root.dynamic_sections_created;
   1445 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   1446 						     bfd_link_pic (info),
   1447 						     h)
   1448 		  || (bfd_link_pic (info)
   1449 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
   1450 		{
   1451 		    /* This is actually a static link, or it is a -Bsymbolic
   1452 		       link and the symbol is defined locally, or the symbol
   1453 		       was forced to be local because of a version file.
   1454 		       We must initialize this entry in the GOT.  Since the
   1455 		       offset must always be a multiple of 4, we use the least
   1456 		       significant bit to record whether we have initialized
   1457 		       it already.
   1458 
   1459 		     When doing a dynamic link, we create a .rela.got
   1460 		     relocation entry to initialize the value.  This
   1461 		     is done in the finish_dynamic_symbol routine.  */
   1462 		  if ((off & 1) != 0)
   1463 		    off &= ~1;
   1464 		  else
   1465 		    {
   1466 		      /* Write entry in GOT.  */
   1467 		      bfd_put_32 (output_bfd, relocation,
   1468 				  sgot->contents + off);
   1469 		      /* Mark GOT entry as having been written.  */
   1470 		      h->got.offset |= 1;
   1471 		    }
   1472 		}
   1473 	    }
   1474 	  else
   1475 	    {
   1476 	      bfd_byte *loc;
   1477 
   1478 	      BFD_ASSERT (local_got_offsets != NULL
   1479 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
   1480 
   1481 	      /* Get offset into GOT table.  */
   1482 	      off = local_got_offsets[r_symndx];
   1483 
   1484 	      /* The offset must always be a multiple of 4.  We use
   1485 		 the least significant bit to record whether we have
   1486 		 already processed this entry.  */
   1487 	      if ((off & 1) != 0)
   1488 		off &= ~1;
   1489 	      else
   1490 		{
   1491 		  /* Write entry in GOT.  */
   1492 		  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
   1493 		  if (bfd_link_pic (info))
   1494 		    {
   1495 		      asection *srelgot;
   1496 		      Elf_Internal_Rela outrel;
   1497 
   1498 		      /* We need to generate a R_OR1K_RELATIVE reloc
   1499 			 for the dynamic linker.  */
   1500 		      srelgot = htab->root.srelgot;
   1501 		      BFD_ASSERT (srelgot != NULL);
   1502 
   1503 		      outrel.r_offset = got_base + off;
   1504 		      outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
   1505 		      outrel.r_addend = relocation;
   1506 		      loc = srelgot->contents;
   1507 		      loc += (srelgot->reloc_count
   1508 			      * sizeof (Elf32_External_Rela));
   1509 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   1510 		      ++srelgot->reloc_count;
   1511 		    }
   1512 		  local_got_offsets[r_symndx] |= 1;
   1513 		}
   1514 	    }
   1515 
   1516 	    /* The GOT_PG21 and GOT_LO13 relocs are pc-relative,
   1517 	       while the GOT16 reloc is GOT relative.  */
   1518 	    relocation = got_base + off;
   1519 	    if (r_type == R_OR1K_GOT16
   1520 		|| r_type == R_OR1K_GOT_AHI16)
   1521 	      relocation -= got_sym_value;
   1522 
   1523 	    if (r_type == R_OR1K_GOT_AHI16)
   1524 	      saw_gotha = true;
   1525 
   1526 	    /* If we have a R_OR1K_GOT16 following a R_OR1K_GOT_AHI16
   1527 	       relocation we assume the code is doing the right thing to avoid
   1528 	       overflows.  */
   1529 	    if (r_type == R_OR1K_GOT16 && saw_gotha)
   1530 	      howto = &or1k_elf_got16_no_overflow_howto;
   1531 
   1532 	  /* Addend should be zero.  */
   1533 	  if (rel->r_addend != 0)
   1534 	    {
   1535 	      _bfd_error_handler
   1536 		(_("%pB: addend should be zero for got relocations"),
   1537 		 input_bfd);
   1538 	      bfd_set_error (bfd_error_bad_value);
   1539 	      ret_val = false;
   1540 	    }
   1541 	  }
   1542 	  break;
   1543 
   1544 	case R_OR1K_GOTOFF_LO16:
   1545 	case R_OR1K_GOTOFF_HI16:
   1546 	case R_OR1K_GOTOFF_AHI16:
   1547 	case R_OR1K_GOTOFF_SLO16:
   1548 	  /* Relocation is offset from GOT.  */
   1549 	  BFD_ASSERT (sgot != NULL);
   1550 	  if (!SYMBOL_REFERENCES_LOCAL (info, h))
   1551 	    {
   1552 	      _bfd_error_handler
   1553 		(_("%pB: gotoff relocation against dynamic symbol %s"),
   1554 		 input_bfd, h->root.root.string);
   1555 	      ret_val = false;
   1556 	      bfd_set_error (bfd_error_bad_value);
   1557 	    }
   1558 	  relocation -= got_sym_value;
   1559 	  break;
   1560 
   1561 	case R_OR1K_INSN_REL_26:
   1562 	  /* For a non-shared link, these will reference plt or call the
   1563 	     version of actual object.  */
   1564 	  if (bfd_link_pic (info) && !SYMBOL_CALLS_LOCAL (info, h))
   1565 	    {
   1566 	      _bfd_error_handler
   1567 		(_("%pB: pc-relative relocation against dynamic symbol %s"),
   1568 		 input_bfd, name);
   1569 	      ret_val = false;
   1570 	      bfd_set_error (bfd_error_bad_value);
   1571 	    }
   1572 	  break;
   1573 
   1574 	case R_OR1K_PCREL_PG21:
   1575 	case R_OR1K_LO13:
   1576 	case R_OR1K_SLO13:
   1577 	  /* For a non-shared link, these will reference either the plt
   1578 	     or a .dynbss copy of the symbol.  */
   1579 	  if (bfd_link_pic (info) && !SYMBOL_REFERENCES_LOCAL (info, h))
   1580 	    {
   1581 	      _bfd_error_handler
   1582 		(_("%pB: pc-relative relocation against dynamic symbol %s"),
   1583 		 input_bfd, name);
   1584 	      ret_val = false;
   1585 	      bfd_set_error (bfd_error_bad_value);
   1586 	    }
   1587 	  break;
   1588 
   1589 	case R_OR1K_HI_16_IN_INSN:
   1590 	case R_OR1K_LO_16_IN_INSN:
   1591 	case R_OR1K_AHI16:
   1592 	case R_OR1K_SLO16:
   1593 	  if (bfd_link_pic (info))
   1594 	    {
   1595 	      _bfd_error_handler
   1596 		(_("%pB: non-pic relocation against symbol %s"),
   1597 		 input_bfd, name);
   1598 	      ret_val = false;
   1599 	      bfd_set_error (bfd_error_bad_value);
   1600 	    }
   1601 	  break;
   1602 
   1603 	case R_OR1K_32:
   1604 	  /* R_OR1K_16? */
   1605 	  {
   1606 	    /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
   1607 	       from removed linkonce sections, or sections discarded by
   1608 	       a linker script.  */
   1609 	    if (r_symndx == STN_UNDEF
   1610 		|| (input_section->flags & SEC_ALLOC) == 0)
   1611 	      break;
   1612 
   1613 	    /* Emit a direct relocation if the symbol is dynamic,
   1614 	       or a RELATIVE reloc for shared objects.  We can omit
   1615 	       RELATIVE relocs to local undefweak symbols.  */
   1616 	    if (bfd_link_pic (info)
   1617 		? (h == NULL
   1618 		     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   1619 		     || h->root.type != bfd_link_hash_undefweak)
   1620 		: (h != NULL
   1621 		    && h->dynindx != -1
   1622 		    && !h->non_got_ref
   1623 		   && ((h->def_dynamic && !h->def_regular)
   1624 			|| h->root.type == bfd_link_hash_undefweak
   1625 			|| h->root.type == bfd_link_hash_undefined)))
   1626 	      {
   1627 		Elf_Internal_Rela outrel;
   1628 		bfd_byte *loc;
   1629 		bool skip;
   1630 
   1631 		/* When generating a shared object, these relocations
   1632 		   are copied into the output file to be resolved at run
   1633 		   time.  */
   1634 
   1635 		BFD_ASSERT (sreloc != NULL);
   1636 
   1637 		skip = false;
   1638 
   1639 		outrel.r_offset =
   1640 		  _bfd_elf_section_offset (output_bfd, info, input_section,
   1641 					   rel->r_offset);
   1642 		if (outrel.r_offset == (bfd_vma) -1)
   1643 		  skip = true;
   1644 		else if (outrel.r_offset == (bfd_vma) -2)
   1645 		  skip = true;
   1646 		outrel.r_offset += (input_section->output_section->vma
   1647 				    + input_section->output_offset);
   1648 
   1649 		if (skip)
   1650 		  memset (&outrel, 0, sizeof outrel);
   1651 		else if (SYMBOL_REFERENCES_LOCAL (info, h))
   1652 		  {
   1653 		    outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
   1654 		    outrel.r_addend = relocation + rel->r_addend;
   1655 		  }
   1656 		else
   1657 		  {
   1658 		    BFD_ASSERT (h->dynindx != -1);
   1659 		    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   1660 		    outrel.r_addend = rel->r_addend;
   1661 		  }
   1662 
   1663 		loc = sreloc->contents;
   1664 		loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   1665 		bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   1666 		break;
   1667 	      }
   1668 	    break;
   1669 	  }
   1670 
   1671 	case R_OR1K_TLS_LDM_HI16:
   1672 	case R_OR1K_TLS_LDM_LO16:
   1673 	case R_OR1K_TLS_LDM_PG21:
   1674 	case R_OR1K_TLS_LDM_LO13:
   1675 	case R_OR1K_TLS_LDO_HI16:
   1676 	case R_OR1K_TLS_LDO_LO16:
   1677 	  /* TODO: implement support for local dynamic.  */
   1678 	  BFD_FAIL ();
   1679 	  _bfd_error_handler
   1680 	    (_("%pB: support for local dynamic not implemented"),
   1681 	     input_bfd);
   1682 	  bfd_set_error (bfd_error_bad_value);
   1683 	  return false;
   1684 
   1685 	case R_OR1K_TLS_GD_HI16:
   1686 	case R_OR1K_TLS_GD_LO16:
   1687 	case R_OR1K_TLS_GD_PG21:
   1688 	case R_OR1K_TLS_GD_LO13:
   1689 	case R_OR1K_TLS_IE_HI16:
   1690 	case R_OR1K_TLS_IE_LO16:
   1691 	case R_OR1K_TLS_IE_PG21:
   1692 	case R_OR1K_TLS_IE_LO13:
   1693 	case R_OR1K_TLS_IE_AHI16:
   1694 	  {
   1695 	    bfd_vma gotoff;
   1696 	    Elf_Internal_Rela rela;
   1697 	    asection *srelgot;
   1698 	    bfd_byte *loc;
   1699 	    bool dynamic;
   1700 	    int indx = 0;
   1701 	    unsigned char tls_type;
   1702 
   1703 	    srelgot = htab->root.srelgot;
   1704 
   1705 	    /* Mark as TLS related GOT entry by setting
   1706 	       bit 2 to indcate TLS and bit 1 to indicate GOT.  */
   1707 	    if (h != NULL)
   1708 	      {
   1709 		gotoff = h->got.offset;
   1710 		tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
   1711 		h->got.offset |= 3;
   1712 	      }
   1713 	    else
   1714 	      {
   1715 		unsigned char *local_tls_type;
   1716 
   1717 		gotoff = local_got_offsets[r_symndx];
   1718 		local_tls_type = (unsigned char *) elf_or1k_local_tls_type (input_bfd);
   1719 		tls_type = local_tls_type == NULL ? TLS_NONE
   1720 						  : local_tls_type[r_symndx];
   1721 		local_got_offsets[r_symndx] |= 3;
   1722 	      }
   1723 
   1724 	    /* Only process the relocation once.  */
   1725 	    if ((gotoff & 1) != 0)
   1726 	      {
   1727 		gotoff += or1k_initial_exec_offset (howto, tls_type);
   1728 
   1729 		/* The PG21 and LO13 relocs are pc-relative, while the
   1730 		   rest are GOT relative.  */
   1731 		relocation = got_base + (gotoff & ~3);
   1732 		if (!(r_type == R_OR1K_TLS_GD_PG21
   1733 		    || r_type == R_OR1K_TLS_GD_LO13
   1734 		    || r_type == R_OR1K_TLS_IE_PG21
   1735 		    || r_type == R_OR1K_TLS_IE_LO13))
   1736 		  relocation -= got_sym_value;
   1737 		break;
   1738 	      }
   1739 
   1740 	    BFD_ASSERT (elf_hash_table (info)->hgot == NULL
   1741 			|| elf_hash_table (info)->hgot->root.u.def.value == 0);
   1742 
   1743 	    if (h != NULL)
   1744 	      {
   1745 		bool dyn = htab->root.dynamic_sections_created;
   1746 		bool pic = bfd_link_pic (info);
   1747 
   1748 		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
   1749 		    && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
   1750 		  indx = h->dynindx;
   1751 	      }
   1752 
   1753 	    /* Dynamic entries will require relocations.  If we do not need
   1754 	       them we will just use the default R_OR1K_NONE and
   1755 	       not set anything.  */
   1756 	    dynamic = (bfd_link_pic (info) || indx != 0)
   1757 		       && (h == NULL
   1758 			   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   1759 			   || h->root.type != bfd_link_hash_undefweak);
   1760 
   1761 	    /* Shared GD.  */
   1762 	    if (dynamic && ((tls_type & TLS_GD) != 0))
   1763 	      {
   1764 		int i;
   1765 
   1766 		/* Add DTPMOD and DTPOFF GOT and rela entries.  */
   1767 		for (i = 0; i < 2; ++i)
   1768 		  {
   1769 		    BFD_ASSERT (srelgot->contents != NULL);
   1770 
   1771 		    rela.r_offset = got_base + gotoff + i*4;
   1772 		    if (h != NULL && h->dynindx != -1)
   1773 		      {
   1774 			rela.r_info = ELF32_R_INFO (h->dynindx,
   1775 			    (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
   1776 			rela.r_addend = 0;
   1777 		      }
   1778 		    else
   1779 		      {
   1780 			rela.r_info = ELF32_R_INFO (0,
   1781 			    (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
   1782 			rela.r_addend =
   1783 			    (i == 0 ? 0 : tpoff (info, relocation, dynamic));
   1784 		      }
   1785 
   1786 		    loc = srelgot->contents;
   1787 		    loc += (srelgot->reloc_count++
   1788 			    * sizeof (Elf32_External_Rela));
   1789 
   1790 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   1791 		    bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
   1792 		  }
   1793 	      }
   1794 	    /* Static GD.  */
   1795 	    else if ((tls_type & TLS_GD) != 0)
   1796 	      {
   1797 		bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
   1798 		bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
   1799 		    sgot->contents + gotoff + 4);
   1800 	      }
   1801 
   1802 	    gotoff += or1k_initial_exec_offset (howto, tls_type);
   1803 
   1804 	    /* Shared IE.  */
   1805 	    if (dynamic && ((tls_type & TLS_IE) != 0))
   1806 	      {
   1807 		BFD_ASSERT (srelgot->contents != NULL);
   1808 
   1809 		/* Add TPOFF GOT and rela entries.  */
   1810 		rela.r_offset = got_base + gotoff;
   1811 		if (h != NULL && h->dynindx != -1)
   1812 		  {
   1813 		    rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
   1814 		    rela.r_addend = 0;
   1815 		  }
   1816 		else
   1817 		  {
   1818 		    rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
   1819 		    rela.r_addend = tpoff (info, relocation, dynamic);
   1820 		  }
   1821 
   1822 		loc = srelgot->contents;
   1823 		loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
   1824 
   1825 		bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   1826 		bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
   1827 	      }
   1828 	    /* Static IE.  */
   1829 	    else if ((tls_type & TLS_IE) != 0)
   1830 	      bfd_put_32 (output_bfd, tpoff (info, relocation, dynamic),
   1831 			  sgot->contents + gotoff);
   1832 
   1833 	    /* The PG21 and LO13 relocs are pc-relative, while the
   1834 	       rest are GOT relative.  */
   1835 	    relocation = got_base + gotoff;
   1836 	    if (!(r_type == R_OR1K_TLS_GD_PG21
   1837 		  || r_type == R_OR1K_TLS_GD_LO13
   1838 		  || r_type == R_OR1K_TLS_IE_PG21
   1839 		  || r_type == R_OR1K_TLS_IE_LO13))
   1840 	      relocation -= got_sym_value;
   1841 	  }
   1842 	  break;
   1843 
   1844 	case R_OR1K_TLS_LE_HI16:
   1845 	case R_OR1K_TLS_LE_LO16:
   1846 	case R_OR1K_TLS_LE_AHI16:
   1847 	case R_OR1K_TLS_LE_SLO16:
   1848 	  /* Relocation is offset from TP.  */
   1849 	  relocation = tpoff (info, relocation, 0);
   1850 	  break;
   1851 
   1852 	case R_OR1K_TLS_DTPMOD:
   1853 	case R_OR1K_TLS_DTPOFF:
   1854 	case R_OR1K_TLS_TPOFF:
   1855 	  /* These are resolved dynamically on load and shouldn't
   1856 	     be used as linker input.  */
   1857 	  BFD_FAIL ();
   1858 	  _bfd_error_handler
   1859 	    (_("%pB: will not resolve runtime TLS relocation"),
   1860 	     input_bfd);
   1861 	  bfd_set_error (bfd_error_bad_value);
   1862 	  return false;
   1863 
   1864 	default:
   1865 	  break;
   1866 	}
   1867 
   1868       r = or1k_final_link_relocate (howto, input_bfd, input_section, contents,
   1869 				    rel->r_offset, relocation + rel->r_addend);
   1870 
   1871       if (r != bfd_reloc_ok)
   1872 	{
   1873 	  const char *msg = NULL;
   1874 
   1875 	  switch (r)
   1876 	    {
   1877 	    case bfd_reloc_overflow:
   1878 	      (*info->callbacks->reloc_overflow)
   1879 		(info, (h ? &h->root : NULL), name, howto->name,
   1880 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   1881 	      break;
   1882 
   1883 	    case bfd_reloc_undefined:
   1884 	      (*info->callbacks->undefined_symbol)
   1885 		(info, name, input_bfd, input_section, rel->r_offset, true);
   1886 	      break;
   1887 
   1888 	    case bfd_reloc_outofrange:
   1889 	      msg = _("internal error: out of range error");
   1890 	      break;
   1891 
   1892 	    case bfd_reloc_notsupported:
   1893 	      msg = _("internal error: unsupported relocation error");
   1894 	      break;
   1895 
   1896 	    case bfd_reloc_dangerous:
   1897 	      msg = _("internal error: dangerous relocation");
   1898 	      break;
   1899 
   1900 	    default:
   1901 	      msg = _("internal error: unknown error");
   1902 	      break;
   1903 	    }
   1904 
   1905 	  if (msg)
   1906 	    (*info->callbacks->warning) (info, msg, name, input_bfd,
   1907 					 input_section, rel->r_offset);
   1908 	}
   1909     }
   1910 
   1911   return ret_val;
   1912 }
   1913 
   1914 /* Return the section that should be marked against GC for a given
   1915    relocation.  */
   1916 
   1917 static asection *
   1918 or1k_elf_gc_mark_hook (asection *sec,
   1919 		       struct bfd_link_info *info,
   1920 		       Elf_Internal_Rela *rel,
   1921 		       struct elf_link_hash_entry *h,
   1922 		       Elf_Internal_Sym *sym)
   1923 {
   1924   if (h != NULL)
   1925     switch (ELF32_R_TYPE (rel->r_info))
   1926       {
   1927       case R_OR1K_GNU_VTINHERIT:
   1928       case R_OR1K_GNU_VTENTRY:
   1929 	return NULL;
   1930       }
   1931 
   1932   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   1933 }
   1934 
   1935 /* Look through the relocs for a section during the first phase.  */
   1936 
   1937 static bool
   1938 or1k_elf_check_relocs (bfd *abfd,
   1939 		       struct bfd_link_info *info,
   1940 		       asection *sec,
   1941 		       const Elf_Internal_Rela *relocs)
   1942 {
   1943   Elf_Internal_Shdr *symtab_hdr;
   1944   struct elf_link_hash_entry **sym_hashes;
   1945   const Elf_Internal_Rela *rel;
   1946 
   1947   const Elf_Internal_Rela *rel_end;
   1948   struct elf_or1k_link_hash_table *htab;
   1949   bfd *dynobj;
   1950   asection *sreloc = NULL;
   1951 
   1952   if (bfd_link_relocatable (info))
   1953     return true;
   1954 
   1955   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1956   sym_hashes = elf_sym_hashes (abfd);
   1957 
   1958   htab = or1k_elf_hash_table (info);
   1959   if (htab == NULL)
   1960     return false;
   1961 
   1962   dynobj = htab->root.dynobj;
   1963 
   1964   rel_end = relocs + sec->reloc_count;
   1965   for (rel = relocs; rel < rel_end; rel++)
   1966     {
   1967       struct elf_link_hash_entry *h;
   1968       unsigned long r_symndx;
   1969       unsigned char tls_type;
   1970       int r_type;
   1971 
   1972       r_symndx = ELF32_R_SYM (rel->r_info);
   1973       if (r_symndx < symtab_hdr->sh_info)
   1974 	h = NULL;
   1975       else
   1976 	{
   1977 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1978 	  while (h->root.type == bfd_link_hash_indirect
   1979 		 || h->root.type == bfd_link_hash_warning)
   1980 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1981 	}
   1982 
   1983       r_type = ELF32_R_TYPE (rel->r_info);
   1984       switch (r_type)
   1985 	{
   1986 	case R_OR1K_TLS_GD_HI16:
   1987 	case R_OR1K_TLS_GD_LO16:
   1988 	case R_OR1K_TLS_GD_PG21:
   1989 	case R_OR1K_TLS_GD_LO13:
   1990 	  tls_type = TLS_GD;
   1991 	  break;
   1992 	case R_OR1K_TLS_LDM_HI16:
   1993 	case R_OR1K_TLS_LDM_LO16:
   1994 	case R_OR1K_TLS_LDM_PG21:
   1995 	case R_OR1K_TLS_LDM_LO13:
   1996 	case R_OR1K_TLS_LDO_HI16:
   1997 	case R_OR1K_TLS_LDO_LO16:
   1998 	  tls_type = TLS_LD;
   1999 	  break;
   2000 	case R_OR1K_TLS_IE_HI16:
   2001 	case R_OR1K_TLS_IE_LO16:
   2002 	case R_OR1K_TLS_IE_PG21:
   2003 	case R_OR1K_TLS_IE_LO13:
   2004 	case R_OR1K_TLS_IE_AHI16:
   2005 	  tls_type = TLS_IE;
   2006 	  break;
   2007 	case R_OR1K_TLS_LE_HI16:
   2008 	case R_OR1K_TLS_LE_LO16:
   2009 	case R_OR1K_TLS_LE_AHI16:
   2010 	case R_OR1K_TLS_LE_SLO16:
   2011 	  tls_type = TLS_LE;
   2012 	  break;
   2013 	default:
   2014 	  tls_type = TLS_NONE;
   2015 	}
   2016 
   2017       /* Record TLS type.  */
   2018       if (h != NULL)
   2019 	  ((struct elf_or1k_link_hash_entry *) h)->tls_type |= tls_type;
   2020       else
   2021 	{
   2022 	  unsigned char *local_tls_type;
   2023 
   2024 	  /* This is a TLS type record for a local symbol.  */
   2025 	  local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
   2026 	  if (local_tls_type == NULL)
   2027 	    {
   2028 	      bfd_size_type size;
   2029 
   2030 	      size = symtab_hdr->sh_info;
   2031 	      local_tls_type = bfd_zalloc (abfd, size);
   2032 	      if (local_tls_type == NULL)
   2033 		return false;
   2034 	      elf_or1k_local_tls_type (abfd) = local_tls_type;
   2035 	    }
   2036 	  local_tls_type[r_symndx] |= tls_type;
   2037 	}
   2038 
   2039       switch (r_type)
   2040 	{
   2041 	  /* This relocation describes the C++ object vtable hierarchy.
   2042 	     Reconstruct it for later use during GC.  */
   2043 	case R_OR1K_GNU_VTINHERIT:
   2044 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   2045 	    return false;
   2046 	  break;
   2047 
   2048 	  /* This relocation describes which C++ vtable entries are actually
   2049 	     used.  Record for later use during GC.  */
   2050 	case R_OR1K_GNU_VTENTRY:
   2051 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   2052 	    return false;
   2053 	  break;
   2054 
   2055 	  /* This relocation requires .plt entry.  */
   2056 	case R_OR1K_PLTA26:
   2057 	  htab->saw_plta = true;
   2058 	  /* FALLTHRU */
   2059 	case R_OR1K_PLT26:
   2060 	  if (h != NULL)
   2061 	    {
   2062 	      h->needs_plt = 1;
   2063 	      h->plt.refcount += 1;
   2064 	    }
   2065 	  break;
   2066 
   2067 	case R_OR1K_GOT_AHI16:
   2068 	case R_OR1K_GOT16:
   2069 	case R_OR1K_GOT_PG21:
   2070 	case R_OR1K_GOT_LO13:
   2071 	case R_OR1K_TLS_GD_HI16:
   2072 	case R_OR1K_TLS_GD_LO16:
   2073 	case R_OR1K_TLS_GD_PG21:
   2074 	case R_OR1K_TLS_GD_LO13:
   2075 	case R_OR1K_TLS_IE_HI16:
   2076 	case R_OR1K_TLS_IE_LO16:
   2077 	case R_OR1K_TLS_IE_PG21:
   2078 	case R_OR1K_TLS_IE_LO13:
   2079 	case R_OR1K_TLS_IE_AHI16:
   2080 	      if (h != NULL)
   2081 		h->got.refcount += 1;
   2082 	      else
   2083 		{
   2084 		  bfd_signed_vma *local_got_refcounts;
   2085 
   2086 		  /* This is a global offset table entry for a local symbol.  */
   2087 		  local_got_refcounts = elf_local_got_refcounts (abfd);
   2088 		  if (local_got_refcounts == NULL)
   2089 		    {
   2090 		      bfd_size_type size;
   2091 
   2092 		      size = symtab_hdr->sh_info;
   2093 		      size *= sizeof (bfd_signed_vma);
   2094 		      local_got_refcounts = bfd_zalloc (abfd, size);
   2095 		      if (local_got_refcounts == NULL)
   2096 			return false;
   2097 		      elf_local_got_refcounts (abfd) = local_got_refcounts;
   2098 		    }
   2099 		  local_got_refcounts[r_symndx] += 1;
   2100 		}
   2101 	  /* FALLTHRU */
   2102 
   2103 	case R_OR1K_GOTOFF_HI16:
   2104 	case R_OR1K_GOTOFF_LO16:
   2105 	case R_OR1K_GOTOFF_AHI16:
   2106 	case R_OR1K_GOTOFF_SLO16:
   2107 	  if (htab->root.sgot == NULL)
   2108 	    {
   2109 	      if (dynobj == NULL)
   2110 		htab->root.dynobj = dynobj = abfd;
   2111 	      if (!_bfd_elf_create_got_section (dynobj, info))
   2112 		return false;
   2113 	    }
   2114 	  break;
   2115 
   2116 	case R_OR1K_INSN_REL_26:
   2117 	case R_OR1K_HI_16_IN_INSN:
   2118 	case R_OR1K_LO_16_IN_INSN:
   2119 	case R_OR1K_AHI16:
   2120 	case R_OR1K_SLO16:
   2121 	case R_OR1K_32:
   2122 	case R_OR1K_PCREL_PG21:
   2123 	case R_OR1K_LO13:
   2124 	case R_OR1K_SLO13:
   2125 	  {
   2126 	    if (h != NULL && !bfd_link_pic (info))
   2127 	      {
   2128 		/* We may need a copy reloc.  */
   2129 		h->non_got_ref = 1;
   2130 
   2131 		/* We may also need a .plt entry.  */
   2132 		h->plt.refcount += 1;
   2133 		if (r_type != R_OR1K_INSN_REL_26)
   2134 		  h->pointer_equality_needed = 1;
   2135 	      }
   2136 
   2137 	    /* If we are creating a shared library, and this is a reloc
   2138 	       against a global symbol, or a non PC relative reloc
   2139 	       against a local symbol, then we need to copy the reloc
   2140 	       into the shared library.  However, if we are linking with
   2141 	       -Bsymbolic, we do not need to copy a reloc against a
   2142 	       global symbol which is defined in an object we are
   2143 	       including in the link (i.e., DEF_REGULAR is set).  At
   2144 	       this point we have not seen all the input files, so it is
   2145 	       possible that DEF_REGULAR is not set now but will be set
   2146 	       later (it is never cleared).  In case of a weak definition,
   2147 	       DEF_REGULAR may be cleared later by a strong definition in
   2148 	       a shared library.  We account for that possibility below by
   2149 	       storing information in the relocs_copied field of the hash
   2150 	       table entry.  A similar situation occurs when creating
   2151 	       shared libraries and symbol visibility changes render the
   2152 	       symbol local.
   2153 
   2154 	       If on the other hand, we are creating an executable, we
   2155 	       may need to keep relocations for symbols satisfied by a
   2156 	       dynamic library if we manage to avoid copy relocs for the
   2157 	       symbol.  */
   2158 
   2159 	    if ((bfd_link_pic (info)
   2160 		 && (sec->flags & SEC_ALLOC) != 0
   2161 		 && (r_type != R_OR1K_INSN_REL_26
   2162 		     || (h != NULL
   2163 			 && (!SYMBOLIC_BIND (info, h)
   2164 			     || h->root.type == bfd_link_hash_defweak
   2165 			     || !h->def_regular))))
   2166 		|| (!bfd_link_pic (info)
   2167 		    && (sec->flags & SEC_ALLOC) != 0
   2168 		    && h != NULL
   2169 		    && (h->root.type == bfd_link_hash_defweak
   2170 			|| !h->def_regular)))
   2171 	      {
   2172 		struct elf_dyn_relocs *sec_relocs;
   2173 		struct elf_dyn_relocs **head;
   2174 
   2175 		/* When creating a shared object, we must copy these
   2176 		   relocs into the output file.  We create a reloc
   2177 		   section in dynobj and make room for the reloc.  */
   2178 		if (sreloc == NULL)
   2179 		  {
   2180 		    const char *name;
   2181 		    unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
   2182 		    unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
   2183 
   2184 		    name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
   2185 		    if (name == NULL)
   2186 		      return false;
   2187 
   2188 		    if (!startswith (name, ".rela")
   2189 			|| strcmp (bfd_section_name (sec), name + 5) != 0)
   2190 		      {
   2191 			_bfd_error_handler
   2192 			  /* xgettext:c-format */
   2193 			  (_("%pB: bad relocation section name `%s\'"),
   2194 			   abfd, name);
   2195 		      }
   2196 
   2197 		    if (htab->root.dynobj == NULL)
   2198 		      htab->root.dynobj = abfd;
   2199 		    dynobj = htab->root.dynobj;
   2200 
   2201 		    sreloc = bfd_get_section_by_name (dynobj, name);
   2202 		    if (sreloc == NULL)
   2203 		      {
   2204 			sreloc = _bfd_elf_make_dynamic_reloc_section
   2205 			  (sec, dynobj, 2, abfd, /*rela?*/ true);
   2206 
   2207 			if (sreloc == NULL)
   2208 			  return false;
   2209 		      }
   2210 		    elf_section_data (sec)->sreloc = sreloc;
   2211 		  }
   2212 
   2213 		/* If this is a global symbol, we count the number of
   2214 		   relocations we need for this symbol.  */
   2215 		if (h != NULL)
   2216 		  head = &h->dyn_relocs;
   2217 		else
   2218 		  {
   2219 		    /* Track dynamic relocs needed for local syms too.
   2220 		       We really need local syms available to do this
   2221 		       easily.  Oh well.  */
   2222 
   2223 		    asection *s;
   2224 		    Elf_Internal_Sym *isym;
   2225 		    void *vpp;
   2226 
   2227 		    isym = bfd_sym_from_r_symndx (&htab->root.sym_cache,
   2228 						  abfd, r_symndx);
   2229 		    if (isym == NULL)
   2230 		      return false;
   2231 
   2232 		    s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   2233 		    if (s == NULL)
   2234 		      return false;
   2235 
   2236 		    vpp = &elf_section_data (s)->local_dynrel;
   2237 		    head = (struct elf_dyn_relocs **) vpp;
   2238 		  }
   2239 
   2240 		sec_relocs = *head;
   2241 		/* Allocate this sections dynamic reolcations structure if this
   2242 		   is a new section.  */
   2243 		if (sec_relocs == NULL || sec_relocs->sec != sec)
   2244 		  {
   2245 		    size_t amt = sizeof *sec_relocs;
   2246 		    sec_relocs = ((struct elf_dyn_relocs *)
   2247 				  bfd_alloc (htab->root.dynobj, amt));
   2248 		    if (sec_relocs == NULL)
   2249 		      return false;
   2250 		    sec_relocs->next = *head;
   2251 		    *head = sec_relocs;
   2252 		    sec_relocs->sec = sec;
   2253 		    sec_relocs->count = 0;
   2254 		    sec_relocs->pc_count = 0;
   2255 		  }
   2256 
   2257 		sec_relocs->count += 1;
   2258 		if (r_type == R_OR1K_INSN_REL_26)
   2259 		  sec_relocs->pc_count += 1;
   2260 	      }
   2261 	  }
   2262 	  break;
   2263 	}
   2264     }
   2265 
   2266   return true;
   2267 }
   2268 
   2269 static void
   2270 or1k_write_plt_entry (bfd *output_bfd, bfd_byte *contents, unsigned insnj,
   2271 		      unsigned insns[], size_t insn_count)
   2272 {
   2273   unsigned nodelay = elf_elfheader (output_bfd)->e_flags & EF_OR1K_NODELAY;
   2274   unsigned output_insns[PLT_MAX_INSN_COUNT];
   2275 
   2276   /* Copy instructions into the output buffer.  */
   2277   for (size_t i = 0; i < insn_count; i++)
   2278     output_insns[i] = insns[i];
   2279 
   2280   /* Honor the no-delay-slot setting.  */
   2281   if (insns[insn_count-1] == OR1K_NOP)
   2282     {
   2283       unsigned slot1, slot2;
   2284 
   2285       if (nodelay)
   2286 	slot1 = insns[insn_count-2], slot2 = insnj;
   2287       else
   2288 	slot1 = insnj, slot2 = insns[insn_count-2];
   2289 
   2290       output_insns[insn_count-2] = slot1;
   2291       output_insns[insn_count-1] = slot2;
   2292       output_insns[insn_count]   = OR1K_NOP;
   2293     }
   2294   else
   2295     {
   2296       unsigned slot1, slot2;
   2297 
   2298       if (nodelay)
   2299 	slot1 = insns[insn_count-1], slot2 = insnj;
   2300       else
   2301 	slot1 = insnj, slot2 = insns[insn_count-1];
   2302 
   2303       output_insns[insn_count-1] = slot1;
   2304       output_insns[insn_count]   = slot2;
   2305     }
   2306 
   2307   /* Write out the output buffer.  */
   2308   for (size_t i = 0; i < (insn_count+1); i++)
   2309     bfd_put_32 (output_bfd, output_insns[i], contents + (i*4));
   2310 }
   2311 
   2312 /* Finish up the dynamic sections.  */
   2313 
   2314 static bool
   2315 or1k_elf_finish_dynamic_sections (bfd *output_bfd,
   2316 				  struct bfd_link_info *info)
   2317 {
   2318   bfd *dynobj;
   2319   asection *sdyn, *sgot;
   2320   struct elf_or1k_link_hash_table *htab;
   2321 
   2322   htab = or1k_elf_hash_table (info);
   2323   if (htab == NULL)
   2324     return false;
   2325 
   2326   dynobj = htab->root.dynobj;
   2327 
   2328   sgot = htab->root.sgotplt;
   2329   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
   2330 
   2331   if (htab->root.dynamic_sections_created)
   2332     {
   2333       asection *splt;
   2334       Elf32_External_Dyn *dyncon, *dynconend;
   2335 
   2336       BFD_ASSERT (sgot != NULL && sdyn != NULL);
   2337 
   2338       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   2339       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   2340 
   2341       for (; dyncon < dynconend; dyncon++)
   2342 	{
   2343 	  Elf_Internal_Dyn dyn;
   2344 	  asection *s;
   2345 
   2346 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   2347 
   2348 	  switch (dyn.d_tag)
   2349 	    {
   2350 	    default:
   2351 	      continue;
   2352 
   2353 	    case DT_PLTGOT:
   2354 	      s = htab->root.sgotplt;
   2355 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   2356 	      break;
   2357 
   2358 	    case DT_JMPREL:
   2359 	      s = htab->root.srelplt;
   2360 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   2361 	      break;
   2362 
   2363 	    case DT_PLTRELSZ:
   2364 	      s = htab->root.srelplt;
   2365 	      dyn.d_un.d_val = s->size;
   2366 	      break;
   2367 	    }
   2368 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   2369 	}
   2370 
   2371 
   2372       /* Fill in the first entry in the procedure linkage table.  */
   2373       splt = htab->root.splt;
   2374       if (splt && splt->size > 0)
   2375 	{
   2376 	  unsigned plt[PLT_MAX_INSN_COUNT];
   2377 	  size_t plt_insn_count = 3;
   2378 	  bfd_vma got_addr = sgot->output_section->vma + sgot->output_offset;
   2379 
   2380 	  /* Note we force 16 byte alignment on the .got, so that
   2381 	     the movhi/adrp can be shared between the two loads.  */
   2382 
   2383 	  if (htab->saw_plta)
   2384 	    {
   2385 	      bfd_vma pc = splt->output_section->vma + splt->output_offset;
   2386 	      unsigned pa = ((got_addr >> 13) - (pc >> 13)) & 0x1fffff;
   2387 	      unsigned po = got_addr & 0x1fff;
   2388 	      plt[0] = OR1K_ADRP(12) | pa;
   2389 	      plt[1] = OR1K_LWZ(15,12) | (po + 8);
   2390 	      plt[2] = OR1K_LWZ(12,12) | (po + 4);
   2391 	    }
   2392 	  else if (bfd_link_pic (info))
   2393 	    {
   2394 	      plt[0] = OR1K_LWZ(15, 16) | 8;	/* .got+8 */
   2395 	      plt[1] = OR1K_LWZ(12, 16) | 4;	/* .got+4 */
   2396 	      plt[2] = OR1K_NOP;
   2397 	    }
   2398 	  else
   2399 	    {
   2400 	      unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
   2401 	      unsigned lo = got_addr & 0xffff;
   2402 	      plt[0] = OR1K_MOVHI(12) | ha;
   2403 	      plt[1] = OR1K_LWZ(15,12) | (lo + 8);
   2404 	      plt[2] = OR1K_LWZ(12,12) | (lo + 4);
   2405 	    }
   2406 
   2407 	  or1k_write_plt_entry (output_bfd, splt->contents, OR1K_JR(15),
   2408 				plt, plt_insn_count);
   2409 
   2410 	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
   2411 	}
   2412     }
   2413 
   2414   /* Set the first entry in the global offset table to the address of
   2415      the dynamic section.  */
   2416   if (sgot && sgot->size > 0)
   2417     {
   2418       if (sdyn == NULL)
   2419 	bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
   2420       else
   2421 	bfd_put_32 (output_bfd,
   2422 		    sdyn->output_section->vma + sdyn->output_offset,
   2423 		    sgot->contents);
   2424       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
   2425     }
   2426 
   2427   if (htab->root.sgot && htab->root.sgot->size > 0)
   2428     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize = 4;
   2429 
   2430   return true;
   2431 }
   2432 
   2433 /* Finish up dynamic symbol handling.  We set the contents of various
   2434    dynamic sections here.  */
   2435 
   2436 static bool
   2437 or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
   2438 				struct bfd_link_info *info,
   2439 				struct elf_link_hash_entry *h,
   2440 				Elf_Internal_Sym *sym)
   2441 {
   2442   struct elf_or1k_link_hash_table *htab;
   2443   bfd_byte *loc;
   2444 
   2445   htab = or1k_elf_hash_table (info);
   2446   if (htab == NULL)
   2447     return false;
   2448 
   2449   if (h->plt.offset != (bfd_vma) -1)
   2450     {
   2451       unsigned int plt[PLT_MAX_INSN_COUNT];
   2452       size_t plt_insn_count = 3;
   2453       asection *splt;
   2454       asection *sgot;
   2455       asection *srela;
   2456       bfd_vma plt_base_addr;
   2457       bfd_vma plt_addr;
   2458       bfd_vma plt_index;
   2459       bfd_vma plt_reloc;
   2460       bfd_vma got_base_addr;
   2461       bfd_vma got_offset;
   2462       bfd_vma got_addr;
   2463       Elf_Internal_Rela rela;
   2464       bool large_plt_entry;
   2465 
   2466       /* This symbol has an entry in the procedure linkage table.  Set
   2467 	 it up.  */
   2468       BFD_ASSERT (h->dynindx != -1);
   2469 
   2470       splt = htab->root.splt;
   2471       sgot = htab->root.sgotplt;
   2472       srela = htab->root.srelplt;
   2473       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
   2474 
   2475       plt_base_addr = splt->output_section->vma + splt->output_offset;
   2476       got_base_addr = sgot->output_section->vma + sgot->output_offset;
   2477 
   2478       /* Get the index in the procedure linkage table which
   2479 	 corresponds to this symbol.  This is the index of this symbol
   2480 	 in all the symbols for which we are making plt entries.  The
   2481 	 first entry in the procedure linkage table is reserved.  */
   2482       plt_index = ((struct elf_or1k_link_hash_entry *) h)->plt_index;
   2483       plt_addr = plt_base_addr + h->plt.offset;
   2484       plt_reloc = plt_index * sizeof (Elf32_External_Rela);
   2485 
   2486       large_plt_entry = (elf_or1k_plt_entry_size (plt_index)
   2487 			 == PLT_ENTRY_SIZE_LARGE);
   2488 
   2489       /* Get the offset into the .got table of the entry that
   2490 	corresponds to this function.  Each .got entry is 4 bytes.
   2491 	The first three are reserved.  */
   2492       got_offset = (plt_index + 3) * 4;
   2493       got_addr = got_base_addr + got_offset;
   2494 
   2495       /* Fill in the entry in the procedure linkage table.  */
   2496       if (htab->saw_plta)
   2497 	{
   2498 	  unsigned pa = ((got_addr >> 13) - (plt_addr >> 13)) & 0x1fffff;
   2499 	  unsigned po = (got_addr & 0x1fff);
   2500 	  plt[0] = OR1K_ADRP(12) | pa;
   2501 	  plt[1] = OR1K_LWZ(12,12) | po;
   2502 	  plt[2] = OR1K_ORI0(11) | plt_reloc;
   2503 	}
   2504       else if (bfd_link_pic (info))
   2505 	{
   2506 	  if (large_plt_entry)
   2507 	    {
   2508 	      unsigned gotha = ((got_offset + 0x8000) >> 16) & 0xffff;
   2509 	      unsigned got = got_offset & 0xffff;
   2510 	      unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
   2511 	      unsigned pltrello = plt_reloc & 0xffff;
   2512 
   2513 	      plt[0] = OR1K_MOVHI(12) | gotha;
   2514 	      plt[1] = OR1K_ADD(12,12,16);
   2515 	      plt[2] = OR1K_LWZ(12,12) | got;
   2516 	      plt[3] = OR1K_MOVHI(11) | pltrelhi;
   2517 	      plt[4] = OR1K_ORI(11,11) | pltrello;
   2518 	      plt_insn_count = 5;
   2519 	    }
   2520 	  else
   2521 	    {
   2522 	      plt[0] = OR1K_LWZ(12,16) | got_offset;
   2523 	      plt[1] = OR1K_ORI0(11) | plt_reloc;
   2524 	      plt[2] = OR1K_NOP;
   2525 	    }
   2526 	}
   2527       else
   2528 	{
   2529 	  unsigned ha = ((got_addr + 0x8000) >> 16) & 0xffff;
   2530 	  unsigned lo = got_addr & 0xffff;
   2531 	  plt[0] = OR1K_MOVHI(12) | ha;
   2532 	  plt[1] = OR1K_LWZ(12,12) | lo;
   2533 	  plt[2] = OR1K_ORI0(11) | plt_reloc;
   2534 	}
   2535 
   2536       /* For large code model we fixup the non-PIC PLT relocation instructions
   2537 	 here.  */
   2538       if (large_plt_entry && !bfd_link_pic (info))
   2539 	{
   2540 	  unsigned pltrelhi = (plt_reloc >> 16) & 0xffff;
   2541 	  unsigned pltrello = plt_reloc & 0xffff;
   2542 
   2543 	  plt[2] = OR1K_MOVHI(11) | pltrelhi;
   2544 	  plt[3] = OR1K_ORI(11,11) | pltrello;
   2545 	  plt[4] = OR1K_NOP;
   2546 	  plt_insn_count = 5;
   2547 	}
   2548 
   2549       or1k_write_plt_entry (output_bfd, splt->contents + h->plt.offset,
   2550 			    OR1K_JR(12), plt, plt_insn_count);
   2551 
   2552       /* Fill in the entry in the global offset table.  We initialize it to
   2553 	 point to the top of the plt.  This is done to lazy lookup the actual
   2554 	 symbol as the first plt entry will be setup by libc to call the
   2555 	 runtime dynamic linker.  */
   2556       bfd_put_32 (output_bfd, plt_base_addr, sgot->contents + got_offset);
   2557 
   2558       /* Fill in the entry in the .rela.plt section.  */
   2559       rela.r_offset = got_addr;
   2560       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
   2561       rela.r_addend = 0;
   2562       loc = srela->contents;
   2563       loc += plt_index * sizeof (Elf32_External_Rela);
   2564       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   2565 
   2566       if (!h->def_regular)
   2567 	{
   2568 	  /* Mark the symbol as undefined, rather than as defined in
   2569 	     the .plt section.  Leave the value alone.  */
   2570 	  sym->st_shndx = SHN_UNDEF;
   2571 	}
   2572     }
   2573 
   2574   if (h->got.offset != (bfd_vma) -1
   2575       && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
   2576     {
   2577       asection *sgot;
   2578       asection *srelgot;
   2579       Elf_Internal_Rela rela;
   2580 
   2581       /* This symbol has an entry in the global offset table.  Set it
   2582 	 up.  */
   2583       sgot = htab->root.sgot;
   2584       srelgot = htab->root.srelgot;
   2585       BFD_ASSERT (sgot != NULL && srelgot != NULL);
   2586 
   2587       rela.r_offset = (sgot->output_section->vma
   2588 		       + sgot->output_offset
   2589 		       + (h->got.offset &~ 1));
   2590 
   2591       /* If this is a -Bsymbolic link, and the symbol is defined
   2592 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
   2593 	 the symbol was forced to be local because of a version file.
   2594 	 The entry in the global offset table will already have been
   2595 	 initialized in the relocate_section function.  */
   2596       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
   2597 	{
   2598 	  rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
   2599 	  rela.r_addend = (h->root.u.def.value
   2600 			   + h->root.u.def.section->output_section->vma
   2601 			   + h->root.u.def.section->output_offset);
   2602 	}
   2603       else
   2604 	{
   2605 	  BFD_ASSERT ((h->got.offset & 1) == 0);
   2606 	  bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
   2607 	  rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
   2608 	  rela.r_addend = 0;
   2609 	}
   2610 
   2611       loc = srelgot->contents;
   2612       loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
   2613       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   2614       ++srelgot->reloc_count;
   2615     }
   2616 
   2617   if (h->needs_copy)
   2618     {
   2619       asection *s;
   2620       Elf_Internal_Rela rela;
   2621 
   2622       /* This symbols needs a copy reloc.  Set it up.  */
   2623       BFD_ASSERT (h->dynindx != -1
   2624 		  && (h->root.type == bfd_link_hash_defined
   2625 		      || h->root.type == bfd_link_hash_defweak));
   2626 
   2627       rela.r_offset = (h->root.u.def.value
   2628 		       + h->root.u.def.section->output_section->vma
   2629 		       + h->root.u.def.section->output_offset);
   2630       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
   2631       rela.r_addend = 0;
   2632       if (h->root.u.def.section == htab->root.sdynrelro)
   2633 	s = htab->root.sreldynrelro;
   2634       else
   2635 	s = htab->root.srelbss;
   2636       loc = s->contents + s->reloc_count * sizeof (Elf32_External_Rela);
   2637       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   2638       ++s->reloc_count;
   2639     }
   2640 
   2641   /* Mark some specially defined symbols as absolute.  */
   2642   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
   2643       || h == htab->root.hgot)
   2644     sym->st_shndx = SHN_ABS;
   2645 
   2646   return true;
   2647 }
   2648 
   2649 static enum elf_reloc_type_class
   2650 or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2651 			   const asection *rel_sec ATTRIBUTE_UNUSED,
   2652 			   const Elf_Internal_Rela *rela)
   2653 {
   2654   switch ((int) ELF32_R_TYPE (rela->r_info))
   2655     {
   2656     case R_OR1K_RELATIVE:  return reloc_class_relative;
   2657     case R_OR1K_JMP_SLOT:  return reloc_class_plt;
   2658     case R_OR1K_COPY:	   return reloc_class_copy;
   2659     default:		   return reloc_class_normal;
   2660     }
   2661 }
   2662 
   2663 /* Adjust a symbol defined by a dynamic object and referenced by a
   2664    regular object.  The current definition is in some section of the
   2665    dynamic object, but we're not including those sections.  We have to
   2666    change the definition to something the rest of the link can
   2667    understand.  */
   2668 
   2669 static bool
   2670 or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   2671 				struct elf_link_hash_entry *h)
   2672 {
   2673   struct elf_or1k_link_hash_table *htab;
   2674   bfd *dynobj;
   2675   asection *s, *srel;
   2676 
   2677   dynobj = elf_hash_table (info)->dynobj;
   2678 
   2679   /* Make sure we know what is going on here.  */
   2680   BFD_ASSERT (dynobj != NULL
   2681 	      && (h->needs_plt
   2682 		  || h->is_weakalias
   2683 		  || (h->def_dynamic
   2684 		      && h->ref_regular
   2685 		      && !h->def_regular)));
   2686 
   2687   /* If this is a function, put it in the procedure linkage table.  We
   2688      will fill in the contents of the procedure linkage table later,
   2689      when we know the address of the .got section.  */
   2690   if (h->type == STT_FUNC
   2691       || h->needs_plt)
   2692     {
   2693       if (h->plt.refcount <= 0
   2694 	  || (SYMBOL_CALLS_LOCAL (info, h)
   2695 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   2696 	      && h->root.type == bfd_link_hash_undefweak)))
   2697 	{
   2698 	  /* This case can occur if we saw a PLT reloc in an input
   2699 	     file, but the symbol was never referred to by a dynamic
   2700 	     object.  In such a case, we don't actually need to build
   2701 	     a procedure linkage table, and we can just do a PCREL
   2702 	     reloc instead.  */
   2703 	  h->plt.offset = (bfd_vma) -1;
   2704 	  h->needs_plt = 0;
   2705 	}
   2706 
   2707       return true;
   2708     }
   2709   else
   2710     h->plt.offset = (bfd_vma) -1;
   2711 
   2712   /* If this is a weak symbol, and there is a real definition, the
   2713      processor independent code will have arranged for us to see the
   2714      real definition first, and we can just use the same value.  */
   2715   if (h->is_weakalias)
   2716     {
   2717       struct elf_link_hash_entry *def = weakdef (h);
   2718       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
   2719       h->root.u.def.section = def->root.u.def.section;
   2720       h->root.u.def.value = def->root.u.def.value;
   2721       return true;
   2722     }
   2723 
   2724   /* This is a reference to a symbol defined by a dynamic object which
   2725      is not a function.  */
   2726 
   2727   /* If we are creating a shared library, we must presume that the
   2728      only references to the symbol are via the global offset table.
   2729      For such cases we need not do anything here; the relocations will
   2730      be handled correctly by relocate_section.  */
   2731   if (bfd_link_pic (info))
   2732     return true;
   2733 
   2734   /* If there are no references to this symbol that do not use the
   2735      GOT, we don't need to generate a copy reloc.  */
   2736   if (!h->non_got_ref)
   2737     return true;
   2738 
   2739   /* If -z nocopyreloc was given, we won't generate them either.  */
   2740   if (info->nocopyreloc)
   2741     {
   2742       h->non_got_ref = 0;
   2743       return true;
   2744     }
   2745 
   2746   /* If we don't find any dynamic relocs in read-only sections, then
   2747      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   2748   if (!_bfd_elf_readonly_dynrelocs (h))
   2749     {
   2750       h->non_got_ref = 0;
   2751       return true;
   2752     }
   2753 
   2754   /* We must allocate the symbol in our .dynbss section, which will
   2755      become part of the .bss section of the executable.  There will be
   2756      an entry for this symbol in the .dynsym section.  The dynamic
   2757      object will contain position independent code, so all references
   2758      from the dynamic object to this symbol will go through the global
   2759      offset table.  The dynamic linker will use the .dynsym entry to
   2760      determine the address it must put in the global offset table, so
   2761      both the dynamic object and the regular object will refer to the
   2762      same memory location for the variable.  */
   2763 
   2764   htab = or1k_elf_hash_table (info);
   2765   if (htab == NULL)
   2766     return false;
   2767 
   2768   /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
   2769      to copy the initial value out of the dynamic object and into the
   2770      runtime process image.  We need to remember the offset into the
   2771      .rela.bss section we are going to use.  */
   2772   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
   2773     {
   2774       s = htab->root.sdynrelro;
   2775       srel = htab->root.sreldynrelro;
   2776     }
   2777   else
   2778     {
   2779       s = htab->root.sdynbss;
   2780       srel = htab->root.srelbss;
   2781     }
   2782   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   2783     {
   2784       srel->size += sizeof (Elf32_External_Rela);
   2785       h->needs_copy = 1;
   2786     }
   2787 
   2788   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   2789 }
   2790 
   2791 /* Caclulate an update the sizes required for a symbol in the GOT and
   2792    RELA relocation section based on the TLS_TYPE and whether or not the symbol
   2793    is DYNAMIC.
   2794 
   2795    Symbols with TLS_GD access require 8 bytes in the GOT and, if dynamic,
   2796    require two relocation entries.  Symbols with TLS_IE access require 4 bytes
   2797    in the GOT and, if dynamic, require one relocation entry.  Symbols may have
   2798    both TLS_GD and TLS_IE access to be accounted for.
   2799 
   2800    Other symbols require 4 bytes in the GOT table and, if dynamic, require one
   2801    relocation entry.  */
   2802 
   2803 static void
   2804 or1k_set_got_and_rela_sizes (const unsigned char tls_type,
   2805 			     const bool dynamic,
   2806 			     bfd_vma *got_size,
   2807 			     bfd_vma *rela_size)
   2808 {
   2809   bool is_tls_entry = false;
   2810 
   2811   /* TLS GD requires two GOT entries and two relocs.  */
   2812   if ((tls_type & TLS_GD) != 0)
   2813     {
   2814       *got_size += 8;
   2815       is_tls_entry = true;
   2816     }
   2817 
   2818   if ((tls_type & TLS_IE) != 0)
   2819     {
   2820       *got_size += 4;
   2821       is_tls_entry = true;
   2822     }
   2823 
   2824   if (!is_tls_entry)
   2825     *got_size += 4;
   2826 
   2827   if (dynamic)
   2828     {
   2829       if ((tls_type & TLS_GD) != 0)
   2830 	*rela_size += 2 * sizeof (Elf32_External_Rela);
   2831 
   2832       if ((tls_type & TLS_IE) != 0)
   2833 	*rela_size += sizeof (Elf32_External_Rela);
   2834 
   2835       if (!is_tls_entry)
   2836 	*rela_size += sizeof (Elf32_External_Rela);
   2837     }
   2838 }
   2839 
   2840 
   2841 /* Allocate space in .plt, .got and associated reloc sections for
   2842    dynamic relocs.  */
   2843 
   2844 static bool
   2845 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   2846 {
   2847   struct bfd_link_info *info;
   2848   struct elf_or1k_link_hash_table *htab;
   2849   struct elf_dyn_relocs *sec_relocs;
   2850 
   2851   if (h->root.type == bfd_link_hash_indirect)
   2852     return true;
   2853 
   2854   info = (struct bfd_link_info *) inf;
   2855   htab = or1k_elf_hash_table (info);
   2856   if (htab == NULL)
   2857     return false;
   2858 
   2859   if (htab->root.dynamic_sections_created
   2860       && h->plt.refcount > 0)
   2861     {
   2862       /* Make sure this symbol is output as a dynamic symbol.
   2863 	 Undefined weak syms won't yet be marked as dynamic.  */
   2864       if (h->dynindx == -1
   2865 	  && !h->forced_local)
   2866 	{
   2867 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2868 	    return false;
   2869 	}
   2870 
   2871       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
   2872 	{
   2873 	  asection *splt = htab->root.splt;
   2874 	  bfd_vma plt_index;
   2875 
   2876 	  /* Track the index of our plt entry for use in calculating size.  */
   2877 	  plt_index = htab->plt_count++;
   2878 	  ((struct elf_or1k_link_hash_entry *) h)->plt_index = plt_index;
   2879 
   2880 	  /* If this is the first .plt entry, make room for the special
   2881 	     first entry.  */
   2882 	  if (splt->size == 0)
   2883 	    splt->size = elf_or1k_plt_entry_size (plt_index);
   2884 
   2885 	  h->plt.offset = splt->size;
   2886 
   2887 	  /* If this symbol is not defined in a regular file, and we are
   2888 	     not generating a shared library, then set the symbol to this
   2889 	     location in the .plt.  This is required to make function
   2890 	     pointers compare as equal between the normal executable and
   2891 	     the shared library.  */
   2892 	  if (! bfd_link_pic (info)
   2893 	      && !h->def_regular)
   2894 	    {
   2895 	      h->root.u.def.section = splt;
   2896 	      h->root.u.def.value = h->plt.offset;
   2897 	    }
   2898 
   2899 	  /* Make room for this entry.  */
   2900 	  splt->size += elf_or1k_plt_entry_size (plt_index);
   2901 
   2902 	  /* We also need to make an entry in the .got.plt section, which
   2903 	     will be placed in the .got section by the linker script.  */
   2904 	  htab->root.sgotplt->size += 4;
   2905 
   2906 	  /* We also need to make an entry in the .rel.plt section.  */
   2907 	  htab->root.srelplt->size += sizeof (Elf32_External_Rela);
   2908 	}
   2909       else
   2910 	{
   2911 	  h->plt.offset = (bfd_vma) -1;
   2912 	  h->needs_plt = 0;
   2913 	}
   2914     }
   2915   else
   2916     {
   2917       h->plt.offset = (bfd_vma) -1;
   2918       h->needs_plt = 0;
   2919     }
   2920 
   2921   if (h->got.refcount > 0)
   2922     {
   2923       asection *sgot;
   2924       bool dyn;
   2925       unsigned char tls_type;
   2926 
   2927       /* Make sure this symbol is output as a dynamic symbol.
   2928 	 Undefined weak syms won't yet be marked as dynamic.  */
   2929       if (h->dynindx == -1
   2930 	  && !h->forced_local)
   2931 	{
   2932 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2933 	    return false;
   2934 	}
   2935 
   2936       sgot = htab->root.sgot;
   2937 
   2938       h->got.offset = sgot->size;
   2939 
   2940       tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
   2941 
   2942       dyn = htab->root.dynamic_sections_created;
   2943       dyn = WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h);
   2944       or1k_set_got_and_rela_sizes (tls_type, dyn,
   2945 				   &sgot->size, &htab->root.srelgot->size);
   2946     }
   2947   else
   2948     h->got.offset = (bfd_vma) -1;
   2949 
   2950   if (h->dyn_relocs == NULL)
   2951     return true;
   2952 
   2953   /* In the shared -Bsymbolic case, discard space allocated for
   2954      dynamic pc-relative relocs against symbols which turn out to be
   2955      defined in regular objects.  For the normal shared case, discard
   2956      space for pc-relative relocs that have become local due to symbol
   2957      visibility changes.  */
   2958 
   2959   if (bfd_link_pic (info))
   2960     {
   2961       if (SYMBOL_CALLS_LOCAL (info, h))
   2962 	{
   2963 	  struct elf_dyn_relocs **pp;
   2964 
   2965 	  for (pp = &h->dyn_relocs; (sec_relocs = *pp) != NULL;)
   2966 	    {
   2967 	      sec_relocs->count -= sec_relocs->pc_count;
   2968 	      sec_relocs->pc_count = 0;
   2969 	      if (sec_relocs->count == 0)
   2970 		*pp = sec_relocs->next;
   2971 	      else
   2972 		pp = &sec_relocs->next;
   2973 	    }
   2974 	}
   2975 
   2976       /* Also discard relocs on undefined weak syms with non-default
   2977 	 visibility.  */
   2978       if (h->dyn_relocs != NULL
   2979 	  && h->root.type == bfd_link_hash_undefweak)
   2980 	{
   2981 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2982 	    h->dyn_relocs = NULL;
   2983 
   2984 	  /* Make sure undefined weak symbols are output as a dynamic
   2985 	     symbol in PIEs.  */
   2986 	  else if (h->dynindx == -1
   2987 		   && !h->forced_local)
   2988 	    {
   2989 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2990 		return false;
   2991 	    }
   2992 	}
   2993     }
   2994   else
   2995     {
   2996       /* For the non-shared case, discard space for relocs against
   2997 	 symbols which turn out to need copy relocs or are not
   2998 	 dynamic.  */
   2999 
   3000       if (!h->non_got_ref
   3001 	  && ((h->def_dynamic
   3002 	       && !h->def_regular)
   3003 	      || (htab->root.dynamic_sections_created
   3004 		  && (h->root.type == bfd_link_hash_undefweak
   3005 		      || h->root.type == bfd_link_hash_undefined))))
   3006 	{
   3007 	  /* Make sure this symbol is output as a dynamic symbol.
   3008 	     Undefined weak syms won't yet be marked as dynamic.  */
   3009 	  if (h->dynindx == -1
   3010 	      && !h->forced_local)
   3011 	    {
   3012 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   3013 		return false;
   3014 	    }
   3015 
   3016 	  /* If that succeeded, we know we'll be keeping all the
   3017 	     relocs.  */
   3018 	  if (h->dynindx != -1)
   3019 	    goto keep;
   3020 	}
   3021 
   3022       h->dyn_relocs = NULL;
   3023 
   3024     keep: ;
   3025     }
   3026 
   3027   /* Finally, allocate space.  */
   3028   for (sec_relocs = h->dyn_relocs;
   3029        sec_relocs != NULL;
   3030        sec_relocs = sec_relocs->next)
   3031     {
   3032       asection *sreloc = elf_section_data (sec_relocs->sec)->sreloc;
   3033       sreloc->size += sec_relocs->count * sizeof (Elf32_External_Rela);
   3034     }
   3035 
   3036   return true;
   3037 }
   3038 
   3039 /* Set the sizes of the dynamic sections.  */
   3040 
   3041 static bool
   3042 or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   3043 				struct bfd_link_info *info)
   3044 {
   3045   struct elf_or1k_link_hash_table *htab;
   3046   bfd *dynobj;
   3047   asection *s;
   3048   bool relocs;
   3049   bfd *ibfd;
   3050 
   3051   htab = or1k_elf_hash_table (info);
   3052   if (htab == NULL)
   3053     return false;
   3054 
   3055   dynobj = htab->root.dynobj;
   3056   BFD_ASSERT (dynobj != NULL);
   3057 
   3058   if (htab->root.dynamic_sections_created)
   3059     {
   3060       /* Set the contents of the .interp section to the interpreter.  */
   3061       if (bfd_link_executable (info) && !info->nointerp)
   3062 	{
   3063 	  s = bfd_get_section_by_name (dynobj, ".interp");
   3064 	  BFD_ASSERT (s != NULL);
   3065 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   3066 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   3067 	}
   3068     }
   3069 
   3070   /* Set up .got offsets for local syms, and space for local dynamic
   3071      relocs.  */
   3072   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   3073     {
   3074       bfd_signed_vma *local_got;
   3075       bfd_signed_vma *end_local_got;
   3076       bfd_size_type locsymcount;
   3077       Elf_Internal_Shdr *symtab_hdr;
   3078       unsigned char *local_tls_type;
   3079       asection *srel;
   3080 
   3081       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
   3082 	continue;
   3083 
   3084       for (s = ibfd->sections; s != NULL; s = s->next)
   3085 	{
   3086 	  struct elf_dyn_relocs *sec_relocs;
   3087 
   3088 	  for (sec_relocs = ((struct elf_dyn_relocs *)
   3089 			     elf_section_data (s)->local_dynrel);
   3090 	       sec_relocs != NULL;
   3091 	       sec_relocs = sec_relocs->next)
   3092 	    {
   3093 	      if (! bfd_is_abs_section (sec_relocs->sec)
   3094 		  && bfd_is_abs_section (sec_relocs->sec->output_section))
   3095 		{
   3096 		  /* Input section has been discarded, either because
   3097 		     it is a copy of a linkonce section or due to
   3098 		     linker script /DISCARD/, so we'll be discarding
   3099 		     the relocs too.  */
   3100 		}
   3101 	      else if (sec_relocs->count != 0)
   3102 		{
   3103 		  srel = elf_section_data (sec_relocs->sec)->sreloc;
   3104 		  srel->size += sec_relocs->count
   3105 				* sizeof (Elf32_External_Rela);
   3106 		  if ((sec_relocs->sec->output_section->flags & SEC_READONLY)
   3107 		      != 0)
   3108 		    info->flags |= DF_TEXTREL;
   3109 		}
   3110 	    }
   3111 	}
   3112 
   3113       local_got = elf_local_got_refcounts (ibfd);
   3114       if (!local_got)
   3115 	continue;
   3116 
   3117       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
   3118       locsymcount = symtab_hdr->sh_info;
   3119       end_local_got = local_got + locsymcount;
   3120       s = htab->root.sgot;
   3121       srel = htab->root.srelgot;
   3122       local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
   3123       for (; local_got < end_local_got; ++local_got)
   3124 	{
   3125 	  if (*local_got > 0)
   3126 	    {
   3127 	      unsigned char tls_type = (local_tls_type == NULL)
   3128 					? TLS_UNKNOWN
   3129 					: *local_tls_type;
   3130 
   3131 	      *local_got = s->size;
   3132 	      or1k_set_got_and_rela_sizes (tls_type, bfd_link_pic (info),
   3133 					   &s->size, &srel->size);
   3134 	    }
   3135 	  else
   3136 
   3137 	    *local_got = (bfd_vma) -1;
   3138 
   3139 	  if (local_tls_type)
   3140 	    ++local_tls_type;
   3141 	}
   3142     }
   3143 
   3144   /* Allocate global sym .plt and .got entries, and space for global
   3145      sym dynamic relocs.  */
   3146   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
   3147 
   3148   /* We now have determined the sizes of the various dynamic sections.
   3149      Allocate memory for them.  */
   3150   relocs = false;
   3151   for (s = dynobj->sections; s != NULL; s = s->next)
   3152     {
   3153       if ((s->flags & SEC_LINKER_CREATED) == 0)
   3154 	continue;
   3155 
   3156       if (s == htab->root.splt
   3157 	  || s == htab->root.sgot
   3158 	  || s == htab->root.sgotplt
   3159 	  || s == htab->root.sdynbss
   3160 	  || s == htab->root.sdynrelro)
   3161 	{
   3162 	  /* Strip this section if we don't need it; see the
   3163 	     comment below.  */
   3164 	}
   3165       else if (startswith (bfd_section_name (s), ".rela"))
   3166 	{
   3167 	  if (s->size != 0 && s != htab->root.srelplt)
   3168 	    relocs = true;
   3169 
   3170 	  /* We use the reloc_count field as a counter if we need
   3171 	     to copy relocs into the output file.  */
   3172 	  s->reloc_count = 0;
   3173 	}
   3174       else
   3175 	/* It's not one of our sections, so don't allocate space.  */
   3176 	continue;
   3177 
   3178       if (s->size == 0)
   3179 	{
   3180 	  /* If we don't need this section, strip it from the
   3181 	     output file.  This is mostly to handle .rela.bss and
   3182 	     .rela.plt.  We must create both sections in
   3183 	     create_dynamic_sections, because they must be created
   3184 	     before the linker maps input sections to output
   3185 	     sections.  The linker does that before
   3186 	     adjust_dynamic_symbol is called, and it is that
   3187 	     function which decides whether anything needs to go
   3188 	     into these sections.  */
   3189 	  s->flags |= SEC_EXCLUDE;
   3190 	  continue;
   3191 	}
   3192 
   3193       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   3194 	continue;
   3195 
   3196       /* Allocate memory for the section contents.  We use bfd_zalloc
   3197 	 here in case unused entries are not reclaimed before the
   3198 	 section's contents are written out.  This should not happen,
   3199 	 but this way if it does, we get a R_OR1K_NONE reloc instead
   3200 	 of garbage.  */
   3201       s->contents = bfd_zalloc (dynobj, s->size);
   3202 
   3203       if (s->contents == NULL)
   3204 	return false;
   3205     }
   3206 
   3207   return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
   3208 }
   3209 
   3210 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   3211 
   3212 static void
   3213 or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
   3214 			       struct elf_link_hash_entry *dir,
   3215 			       struct elf_link_hash_entry *ind)
   3216 {
   3217   struct elf_or1k_link_hash_entry * edir;
   3218   struct elf_or1k_link_hash_entry * eind;
   3219 
   3220   edir = (struct elf_or1k_link_hash_entry *) dir;
   3221   eind = (struct elf_or1k_link_hash_entry *) ind;
   3222 
   3223   if (ind->root.type == bfd_link_hash_indirect)
   3224     {
   3225       if (dir->got.refcount <= 0)
   3226 	{
   3227 	  edir->tls_type = eind->tls_type;
   3228 	  eind->tls_type = TLS_UNKNOWN;
   3229 	}
   3230     }
   3231 
   3232   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   3233 }
   3234 
   3235 /* Set the right machine number.  */
   3236 
   3237 static bool
   3238 or1k_elf_object_p (bfd *abfd)
   3239 {
   3240   unsigned long mach = bfd_mach_or1k;
   3241 
   3242   if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
   3243     mach = bfd_mach_or1knd;
   3244 
   3245   return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
   3246 }
   3247 
   3248 /* Store the machine number in the flags field.  */
   3249 
   3250 static bool
   3251 or1k_elf_final_write_processing (bfd *abfd)
   3252 {
   3253   switch (bfd_get_mach (abfd))
   3254     {
   3255     default:
   3256     case bfd_mach_or1k:
   3257       break;
   3258     case bfd_mach_or1knd:
   3259       elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
   3260       break;
   3261     }
   3262   return _bfd_elf_final_write_processing (abfd);
   3263 }
   3264 
   3265 static bool
   3266 or1k_elf_set_private_flags (bfd *abfd, flagword flags)
   3267 {
   3268   BFD_ASSERT (!elf_flags_init (abfd)
   3269 	      || elf_elfheader (abfd)->e_flags == flags);
   3270 
   3271   elf_elfheader (abfd)->e_flags = flags;
   3272   elf_flags_init (abfd) = true;
   3273   return true;
   3274 }
   3275 
   3276 /* Make sure all input files are consistent with respect to
   3277    EF_OR1K_NODELAY flag setting.  */
   3278 
   3279 static bool
   3280 elf32_or1k_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   3281 {
   3282   bfd *obfd = info->output_bfd;
   3283   flagword out_flags;
   3284   flagword in_flags;
   3285 
   3286   in_flags  = elf_elfheader (ibfd)->e_flags;
   3287   out_flags = elf_elfheader (obfd)->e_flags;
   3288 
   3289   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   3290       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   3291     return true;
   3292 
   3293   if (!elf_flags_init (obfd))
   3294     {
   3295       elf_flags_init (obfd) = true;
   3296       elf_elfheader (obfd)->e_flags = in_flags;
   3297 
   3298       return true;
   3299     }
   3300 
   3301   if (in_flags == out_flags)
   3302     return true;
   3303 
   3304   if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
   3305     {
   3306       _bfd_error_handler
   3307 	(_("%pB: %s flag mismatch with previous modules"),
   3308 	 ibfd, "EF_OR1K_NODELAY");
   3309 
   3310       bfd_set_error (bfd_error_bad_value);
   3311       return false;
   3312     }
   3313 
   3314   return true;
   3315 
   3316 }
   3317 
   3318 /* Implement elf_backend_grok_prstatus:
   3319    Support for core dump NOTE sections.  */
   3320 static bool
   3321 or1k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3322 {
   3323   int offset;
   3324   size_t size;
   3325 
   3326   switch (note->descsz)
   3327     {
   3328     default:
   3329       return false;
   3330 
   3331     case 212:	      /* Linux/OpenRISC */
   3332       /* pr_cursig */
   3333       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   3334 
   3335       /* pr_pid */
   3336       elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
   3337 
   3338       /* pr_reg */
   3339       offset = 72;
   3340       size = 132;
   3341 
   3342       break;
   3343     }
   3344 
   3345   /* Make a ".reg/999" section.  */
   3346   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   3347 					  size, note->descpos + offset);
   3348 }
   3349 
   3350 /* Implement elf_backend_grok_psinfo.  */
   3351 static bool
   3352 or1k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   3353 {
   3354   switch (note->descsz)
   3355     {
   3356     default:
   3357       return false;
   3358 
   3359     case 128:	      /* Linux/OpenRISC elf_prpsinfo */
   3360       elf_tdata (abfd)->core->program
   3361 	= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   3362       elf_tdata (abfd)->core->command
   3363 	= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   3364     }
   3365 
   3366   return true;
   3367 }
   3368 
   3369 
   3370 #define ELF_ARCH			bfd_arch_or1k
   3371 #define ELF_MACHINE_CODE		EM_OR1K
   3372 #define ELF_TARGET_ID			OR1K_ELF_DATA
   3373 #define ELF_MAXPAGESIZE			0x2000
   3374 
   3375 #define TARGET_BIG_SYM			or1k_elf32_vec
   3376 #define TARGET_BIG_NAME			"elf32-or1k"
   3377 
   3378 #define elf_info_to_howto_rel		NULL
   3379 #define elf_info_to_howto		or1k_info_to_howto_rela
   3380 #define elf_backend_relocate_section	or1k_elf_relocate_section
   3381 #define elf_backend_gc_mark_hook	or1k_elf_gc_mark_hook
   3382 #define elf_backend_check_relocs	or1k_elf_check_relocs
   3383 #define elf_backend_reloc_type_class	or1k_elf_reloc_type_class
   3384 #define elf_backend_can_gc_sections	1
   3385 #define elf_backend_rela_normal		1
   3386 
   3387 #define bfd_elf32_mkobject		     elf_or1k_mkobject
   3388 
   3389 #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
   3390 #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
   3391 #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
   3392 #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
   3393 
   3394 #define elf_backend_object_p		    or1k_elf_object_p
   3395 #define elf_backend_final_write_processing  or1k_elf_final_write_processing
   3396 #define elf_backend_can_refcount		1
   3397 
   3398 #define elf_backend_plt_readonly		1
   3399 #define elf_backend_want_got_plt		1
   3400 #define elf_backend_want_plt_sym		0
   3401 #define elf_backend_got_header_size		12
   3402 #define elf_backend_dtrel_excludes_plt		1
   3403 #define elf_backend_want_dynrelro		1
   3404 
   3405 #define bfd_elf32_bfd_link_hash_table_create	or1k_elf_link_hash_table_create
   3406 #define elf_backend_copy_indirect_symbol	or1k_elf_copy_indirect_symbol
   3407 #define elf_backend_create_dynamic_sections	_bfd_elf_create_dynamic_sections
   3408 #define elf_backend_finish_dynamic_sections	or1k_elf_finish_dynamic_sections
   3409 #define elf_backend_size_dynamic_sections	or1k_elf_size_dynamic_sections
   3410 #define elf_backend_adjust_dynamic_symbol	or1k_elf_adjust_dynamic_symbol
   3411 #define elf_backend_finish_dynamic_symbol	or1k_elf_finish_dynamic_symbol
   3412 
   3413 #define elf_backend_grok_prstatus	  or1k_grok_prstatus
   3414 #define elf_backend_grok_psinfo		  or1k_grok_psinfo
   3415 
   3416 #include "elf32-target.h"
   3417