Home | History | Annotate | Line # | Download | only in bfd
      1       1.1     skrll /* IBM S/390-specific support for 64-bit ELF
      2  1.1.1.12  christos    Copyright (C) 2000-2026 Free Software Foundation, Inc.
      3       1.1     skrll    Contributed Martin Schwidefsky (schwidefsky (at) de.ibm.com).
      4       1.1     skrll 
      5       1.1     skrll    This file is part of BFD, the Binary File Descriptor library.
      6       1.1     skrll 
      7       1.1     skrll    This program is free software; you can redistribute it and/or modify
      8       1.1     skrll    it under the terms of the GNU General Public License as published by
      9       1.1     skrll    the Free Software Foundation; either version 3 of the License, or
     10       1.1     skrll    (at your option) any later version.
     11       1.1     skrll 
     12       1.1     skrll    This program is distributed in the hope that it will be useful,
     13       1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14       1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15       1.1     skrll    GNU General Public License for more details.
     16       1.1     skrll 
     17       1.1     skrll    You should have received a copy of the GNU General Public License
     18       1.1     skrll    along with this program; if not, write to the Free Software
     19       1.1     skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     20       1.1     skrll    02110-1301, USA.  */
     21       1.1     skrll 
     22       1.1     skrll #include "sysdep.h"
     23       1.1     skrll #include "bfd.h"
     24       1.1     skrll #include "bfdlink.h"
     25       1.1     skrll #include "libbfd.h"
     26       1.1     skrll #include "elf-bfd.h"
     27       1.1     skrll #include "elf/s390.h"
     28   1.1.1.6  christos #include "elf-s390.h"
     29  1.1.1.11  christos #include "dwarf2.h"
     30  1.1.1.11  christos #include "sframe.h"
     31  1.1.1.11  christos #include "sframe-api.h"
     32   1.1.1.6  christos #include <stdarg.h>
     33       1.1     skrll 
     34       1.1     skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
     35       1.1     skrll    from smaller values.  Start with zero, widen, *then* decrement.  */
     36       1.1     skrll #define MINUS_ONE      (((bfd_vma)0) - 1)
     37       1.1     skrll 
     38   1.1.1.3  christos static bfd_reloc_status_type
     39   1.1.1.3  christos s390_tls_reloc (bfd *, arelent *, asymbol *, void *,
     40   1.1.1.3  christos 		asection *, bfd *, char **);
     41   1.1.1.3  christos static bfd_reloc_status_type
     42   1.1.1.3  christos s390_elf_ldisp_reloc (bfd *, arelent *, asymbol *, void *,
     43   1.1.1.3  christos 		      asection *, bfd *, char **);
     44   1.1.1.3  christos 
     45       1.1     skrll /* The relocation "howto" table.  */
     46       1.1     skrll static reloc_howto_type elf_howto_table[] =
     47       1.1     skrll {
     48       1.1     skrll   HOWTO (R_390_NONE,		/* type */
     49       1.1     skrll 	 0,			/* rightshift */
     50   1.1.1.9  christos 	 0,			/* size */
     51       1.1     skrll 	 0,			/* bitsize */
     52   1.1.1.9  christos 	 false,			/* pc_relative */
     53       1.1     skrll 	 0,			/* bitpos */
     54       1.1     skrll 	 complain_overflow_dont, /* complain_on_overflow */
     55       1.1     skrll 	 bfd_elf_generic_reloc, /* special_function */
     56       1.1     skrll 	 "R_390_NONE",		/* name */
     57   1.1.1.9  christos 	 false,			/* partial_inplace */
     58       1.1     skrll 	 0,			/* src_mask */
     59       1.1     skrll 	 0,			/* dst_mask */
     60   1.1.1.9  christos 	 false),		/* pcrel_offset */
     61       1.1     skrll 
     62   1.1.1.9  christos   HOWTO(R_390_8,	 0, 1,	8, false, 0, complain_overflow_bitfield,
     63   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_8",	 false, 0,0x000000ff, false),
     64   1.1.1.9  christos   HOWTO(R_390_12,	 0, 2, 12, false, 0, complain_overflow_dont,
     65   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_12",	 false, 0,0x00000fff, false),
     66   1.1.1.9  christos   HOWTO(R_390_16,	 0, 2, 16, false, 0, complain_overflow_bitfield,
     67   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_16",	 false, 0,0x0000ffff, false),
     68   1.1.1.9  christos   HOWTO(R_390_32,	 0, 4, 32, false, 0, complain_overflow_bitfield,
     69   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_32",	 false, 0,0xffffffff, false),
     70   1.1.1.9  christos   HOWTO(R_390_PC32,	 0, 4, 32,  true, 0, complain_overflow_bitfield,
     71   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC32",	 false, 0,0xffffffff, true),
     72   1.1.1.9  christos   HOWTO(R_390_GOT12,	 0, 2, 12, false, 0, complain_overflow_bitfield,
     73   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOT12",	 false, 0,0x00000fff, false),
     74   1.1.1.9  christos   HOWTO(R_390_GOT32,	 0, 4, 32, false, 0, complain_overflow_bitfield,
     75   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOT32",	 false, 0,0xffffffff, false),
     76   1.1.1.9  christos   HOWTO(R_390_PLT32,	 0, 4, 32,  true, 0, complain_overflow_bitfield,
     77   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT32",	 false, 0,0xffffffff, true),
     78   1.1.1.9  christos   HOWTO(R_390_COPY,	 0, 8, 64, false, 0, complain_overflow_bitfield,
     79   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_COPY",	 false, 0,MINUS_ONE,  false),
     80   1.1.1.9  christos   HOWTO(R_390_GLOB_DAT,	 0, 8, 64, false, 0, complain_overflow_bitfield,
     81   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GLOB_DAT", false, 0,MINUS_ONE,  false),
     82   1.1.1.9  christos   HOWTO(R_390_JMP_SLOT,	 0, 8, 64, false, 0, complain_overflow_bitfield,
     83   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_JMP_SLOT", false, 0,MINUS_ONE,  false),
     84   1.1.1.9  christos   HOWTO(R_390_RELATIVE,	 0, 8, 64,  true, 0, complain_overflow_bitfield,
     85   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_RELATIVE", false, 0,MINUS_ONE,  false),
     86   1.1.1.9  christos   HOWTO(R_390_GOTOFF32,	 0, 4, 32, false, 0, complain_overflow_bitfield,
     87   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTOFF32", false, 0,MINUS_ONE,  false),
     88   1.1.1.9  christos   HOWTO(R_390_GOTPC,	 0, 8, 64,  true, 0, complain_overflow_bitfield,
     89   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPC",	 false, 0,MINUS_ONE,  true),
     90   1.1.1.9  christos   HOWTO(R_390_GOT16,	 0, 2, 16, false, 0, complain_overflow_bitfield,
     91   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOT16",	 false, 0,0x0000ffff, false),
     92   1.1.1.9  christos   HOWTO(R_390_PC16,	 0, 2, 16,  true, 0, complain_overflow_bitfield,
     93   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC16",	 false, 0,0x0000ffff, true),
     94   1.1.1.9  christos   HOWTO(R_390_PC16DBL,	 1, 2, 16,  true, 0, complain_overflow_bitfield,
     95   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC16DBL",	 false, 0,0x0000ffff, true),
     96   1.1.1.9  christos   HOWTO(R_390_PLT16DBL,	 1, 2, 16,  true, 0, complain_overflow_bitfield,
     97   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true),
     98   1.1.1.9  christos   HOWTO(R_390_PC32DBL,	 1, 4, 32,  true, 0, complain_overflow_bitfield,
     99   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC32DBL",	 false, 0,0xffffffff, true),
    100   1.1.1.9  christos   HOWTO(R_390_PLT32DBL,	 1, 4, 32,  true, 0, complain_overflow_bitfield,
    101   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true),
    102   1.1.1.9  christos   HOWTO(R_390_GOTPCDBL,	 1, 4, 32,  true, 0, complain_overflow_bitfield,
    103   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,MINUS_ONE,  true),
    104   1.1.1.9  christos   HOWTO(R_390_64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    105   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_64",	 false, 0,MINUS_ONE,  false),
    106   1.1.1.9  christos   HOWTO(R_390_PC64,	 0, 8, 64,  true, 0, complain_overflow_bitfield,
    107   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC64",	 false, 0,MINUS_ONE,  true),
    108   1.1.1.9  christos   HOWTO(R_390_GOT64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    109   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOT64",	 false, 0,MINUS_ONE,  false),
    110   1.1.1.9  christos   HOWTO(R_390_PLT64,	 0, 8, 64,  true, 0, complain_overflow_bitfield,
    111   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT64",	 false, 0,MINUS_ONE,  true),
    112   1.1.1.9  christos   HOWTO(R_390_GOTENT,	 1, 4, 32,  true, 0, complain_overflow_bitfield,
    113   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTENT",	 false, 0,MINUS_ONE,  true),
    114   1.1.1.9  christos   HOWTO(R_390_GOTOFF16,	 0, 2, 16, false, 0, complain_overflow_bitfield,
    115   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTOFF16", false, 0,0x0000ffff, false),
    116   1.1.1.9  christos   HOWTO(R_390_GOTOFF64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    117   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTOFF64", false, 0,MINUS_ONE,  false),
    118   1.1.1.9  christos   HOWTO(R_390_GOTPLT12,	 0, 2, 12, false, 0, complain_overflow_dont,
    119   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPLT12", false, 0,0x00000fff, false),
    120   1.1.1.9  christos   HOWTO(R_390_GOTPLT16,	 0, 2, 16, false, 0, complain_overflow_bitfield,
    121   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPLT16", false, 0,0x0000ffff, false),
    122   1.1.1.9  christos   HOWTO(R_390_GOTPLT32,	 0, 4, 32, false, 0, complain_overflow_bitfield,
    123   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPLT32", false, 0,0xffffffff, false),
    124   1.1.1.9  christos   HOWTO(R_390_GOTPLT64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    125   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPLT64", false, 0,MINUS_ONE,  false),
    126   1.1.1.9  christos   HOWTO(R_390_GOTPLTENT, 1, 4, 32,  true, 0, complain_overflow_bitfield,
    127   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_GOTPLTENT",false, 0,MINUS_ONE,  true),
    128   1.1.1.9  christos   HOWTO(R_390_PLTOFF16,	 0, 2, 16, false, 0, complain_overflow_bitfield,
    129   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLTOFF16", false, 0,0x0000ffff, false),
    130   1.1.1.9  christos   HOWTO(R_390_PLTOFF32,	 0, 4, 32, false, 0, complain_overflow_bitfield,
    131   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLTOFF32", false, 0,0xffffffff, false),
    132   1.1.1.9  christos   HOWTO(R_390_PLTOFF64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    133   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLTOFF64", false, 0,MINUS_ONE,  false),
    134   1.1.1.9  christos   HOWTO(R_390_TLS_LOAD, 0, 0, 0, false, 0, complain_overflow_dont,
    135   1.1.1.9  christos 	s390_tls_reloc, "R_390_TLS_LOAD", false, 0, 0, false),
    136   1.1.1.9  christos   HOWTO(R_390_TLS_GDCALL, 0, 0, 0, false, 0, complain_overflow_dont,
    137   1.1.1.9  christos 	s390_tls_reloc, "R_390_TLS_GDCALL", false, 0, 0, false),
    138   1.1.1.9  christos   HOWTO(R_390_TLS_LDCALL, 0, 0, 0, false, 0, complain_overflow_dont,
    139   1.1.1.9  christos 	s390_tls_reloc, "R_390_TLS_LDCALL", false, 0, 0, false),
    140       1.1     skrll   EMPTY_HOWTO (R_390_TLS_GD32),	/* Empty entry for R_390_TLS_GD32.  */
    141   1.1.1.9  christos   HOWTO(R_390_TLS_GD64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    142   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_GD64", false, 0, MINUS_ONE, false),
    143   1.1.1.9  christos   HOWTO(R_390_TLS_GOTIE12, 0, 2, 12, false, 0, complain_overflow_dont,
    144   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_GOTIE12", false, 0, 0x00000fff, false),
    145       1.1     skrll   EMPTY_HOWTO (R_390_TLS_GOTIE32),	/* Empty entry for R_390_TLS_GOTIE32.  */
    146   1.1.1.9  christos   HOWTO(R_390_TLS_GOTIE64, 0, 8, 64, false, 0, complain_overflow_bitfield,
    147   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_GOTIE64", false, 0, MINUS_ONE, false),
    148       1.1     skrll   EMPTY_HOWTO (R_390_TLS_LDM32),	/* Empty entry for R_390_TLS_LDM32.  */
    149   1.1.1.9  christos   HOWTO(R_390_TLS_LDM64, 0, 8, 64, false, 0, complain_overflow_bitfield,
    150   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_LDM64", false, 0, MINUS_ONE, false),
    151       1.1     skrll   EMPTY_HOWTO (R_390_TLS_IE32),	/* Empty entry for R_390_TLS_IE32.  */
    152   1.1.1.9  christos   HOWTO(R_390_TLS_IE64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    153   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_IE64", false, 0, MINUS_ONE, false),
    154   1.1.1.9  christos   HOWTO(R_390_TLS_IEENT, 1, 4, 32, true, 0, complain_overflow_bitfield,
    155   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_IEENT", false, 0, MINUS_ONE, true),
    156       1.1     skrll   EMPTY_HOWTO (R_390_TLS_LE32),	/* Empty entry for R_390_TLS_LE32.  */
    157  1.1.1.12  christos   HOWTO(R_390_TLS_LE64,	 0, 8, 64, false, 0, complain_overflow_bitfield,
    158   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_LE64", false, 0, MINUS_ONE, false),
    159       1.1     skrll   EMPTY_HOWTO (R_390_TLS_LDO32),	/* Empty entry for R_390_TLS_LDO32.  */
    160   1.1.1.9  christos   HOWTO(R_390_TLS_LDO64, 0, 8, 64, false, 0, complain_overflow_bitfield,
    161   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_LDO64", false, 0, MINUS_ONE, false),
    162   1.1.1.9  christos   HOWTO(R_390_TLS_DTPMOD, 0, 8, 64, false, 0, complain_overflow_bitfield,
    163   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_DTPMOD", false, 0, MINUS_ONE, false),
    164   1.1.1.9  christos   HOWTO(R_390_TLS_DTPOFF, 0, 8, 64, false, 0, complain_overflow_bitfield,
    165   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_DTPOFF", false, 0, MINUS_ONE, false),
    166   1.1.1.9  christos   HOWTO(R_390_TLS_TPOFF, 0, 8, 64, false, 0, complain_overflow_bitfield,
    167   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_TLS_TPOFF", false, 0, MINUS_ONE, false),
    168   1.1.1.9  christos   HOWTO(R_390_20,	 0, 4, 20, false, 8, complain_overflow_dont,
    169   1.1.1.9  christos 	s390_elf_ldisp_reloc, "R_390_20",      false, 0,0x0fffff00, false),
    170   1.1.1.9  christos   HOWTO(R_390_GOT20,	 0, 4, 20, false, 8, complain_overflow_dont,
    171   1.1.1.9  christos 	s390_elf_ldisp_reloc, "R_390_GOT20",   false, 0,0x0fffff00, false),
    172   1.1.1.9  christos   HOWTO(R_390_GOTPLT20,	 0, 4, 20, false, 8, complain_overflow_dont,
    173   1.1.1.9  christos 	s390_elf_ldisp_reloc, "R_390_GOTPLT20", false, 0,0x0fffff00, false),
    174   1.1.1.9  christos   HOWTO(R_390_TLS_GOTIE20, 0, 4, 20, false, 8, complain_overflow_dont,
    175   1.1.1.9  christos 	s390_elf_ldisp_reloc, "R_390_TLS_GOTIE20", false, 0,0x0fffff00, false),
    176   1.1.1.9  christos   HOWTO(R_390_IRELATIVE, 0, 8, 64, false, 0, complain_overflow_bitfield,
    177   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_IRELATIVE", false, 0, MINUS_ONE, false),
    178   1.1.1.9  christos   HOWTO(R_390_PC12DBL,	 1, 2, 12,  true, 0, complain_overflow_bitfield,
    179   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC12DBL",	 false, 0,0x00000fff, true),
    180   1.1.1.9  christos   HOWTO(R_390_PLT12DBL,	 1, 2, 12,  true, 0, complain_overflow_bitfield,
    181   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT12DBL", false, 0,0x00000fff, true),
    182   1.1.1.9  christos   HOWTO(R_390_PC24DBL,	 1, 4, 24,  true, 0, complain_overflow_bitfield,
    183   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PC24DBL",	 false, 0,0x00ffffff, true),
    184   1.1.1.9  christos   HOWTO(R_390_PLT24DBL,	 1, 4, 24,  true, 0, complain_overflow_bitfield,
    185   1.1.1.9  christos 	bfd_elf_generic_reloc, "R_390_PLT24DBL", false, 0,0x00ffffff, true),
    186       1.1     skrll };
    187       1.1     skrll 
    188       1.1     skrll /* GNU extension to record C++ vtable hierarchy.  */
    189       1.1     skrll static reloc_howto_type elf64_s390_vtinherit_howto =
    190   1.1.1.9  christos   HOWTO (R_390_GNU_VTINHERIT, 0,8,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false);
    191       1.1     skrll static reloc_howto_type elf64_s390_vtentry_howto =
    192   1.1.1.9  christos   HOWTO (R_390_GNU_VTENTRY, 0,8,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", false,0,0, false);
    193       1.1     skrll 
    194       1.1     skrll static reloc_howto_type *
    195   1.1.1.7  christos elf_s390_reloc_type_lookup (bfd *abfd,
    196   1.1.1.3  christos 			    bfd_reloc_code_real_type code)
    197       1.1     skrll {
    198       1.1     skrll   switch (code)
    199       1.1     skrll     {
    200       1.1     skrll     case BFD_RELOC_NONE:
    201       1.1     skrll       return &elf_howto_table[(int) R_390_NONE];
    202       1.1     skrll     case BFD_RELOC_8:
    203       1.1     skrll       return &elf_howto_table[(int) R_390_8];
    204       1.1     skrll     case BFD_RELOC_390_12:
    205       1.1     skrll       return &elf_howto_table[(int) R_390_12];
    206       1.1     skrll     case BFD_RELOC_16:
    207       1.1     skrll       return &elf_howto_table[(int) R_390_16];
    208       1.1     skrll     case BFD_RELOC_32:
    209       1.1     skrll       return &elf_howto_table[(int) R_390_32];
    210       1.1     skrll     case BFD_RELOC_CTOR:
    211       1.1     skrll       return &elf_howto_table[(int) R_390_32];
    212       1.1     skrll     case BFD_RELOC_32_PCREL:
    213       1.1     skrll       return &elf_howto_table[(int) R_390_PC32];
    214       1.1     skrll     case BFD_RELOC_390_GOT12:
    215       1.1     skrll       return &elf_howto_table[(int) R_390_GOT12];
    216       1.1     skrll     case BFD_RELOC_32_GOT_PCREL:
    217       1.1     skrll       return &elf_howto_table[(int) R_390_GOT32];
    218  1.1.1.12  christos     case BFD_RELOC_32_PLT_PCREL:
    219       1.1     skrll       return &elf_howto_table[(int) R_390_PLT32];
    220  1.1.1.12  christos     case BFD_RELOC_COPY:
    221       1.1     skrll       return &elf_howto_table[(int) R_390_COPY];
    222  1.1.1.12  christos     case BFD_RELOC_GLOB_DAT:
    223       1.1     skrll       return &elf_howto_table[(int) R_390_GLOB_DAT];
    224  1.1.1.12  christos     case BFD_RELOC_JMP_SLOT:
    225       1.1     skrll       return &elf_howto_table[(int) R_390_JMP_SLOT];
    226  1.1.1.12  christos     case BFD_RELOC_RELATIVE:
    227       1.1     skrll       return &elf_howto_table[(int) R_390_RELATIVE];
    228       1.1     skrll     case BFD_RELOC_32_GOTOFF:
    229       1.1     skrll       return &elf_howto_table[(int) R_390_GOTOFF32];
    230       1.1     skrll     case BFD_RELOC_390_GOTPC:
    231       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPC];
    232       1.1     skrll     case BFD_RELOC_390_GOT16:
    233       1.1     skrll       return &elf_howto_table[(int) R_390_GOT16];
    234       1.1     skrll     case BFD_RELOC_16_PCREL:
    235       1.1     skrll       return &elf_howto_table[(int) R_390_PC16];
    236   1.1.1.4  christos     case BFD_RELOC_390_PC12DBL:
    237   1.1.1.4  christos       return &elf_howto_table[(int) R_390_PC12DBL];
    238   1.1.1.4  christos     case BFD_RELOC_390_PLT12DBL:
    239   1.1.1.4  christos       return &elf_howto_table[(int) R_390_PLT12DBL];
    240       1.1     skrll     case BFD_RELOC_390_PC16DBL:
    241       1.1     skrll       return &elf_howto_table[(int) R_390_PC16DBL];
    242       1.1     skrll     case BFD_RELOC_390_PLT16DBL:
    243       1.1     skrll       return &elf_howto_table[(int) R_390_PLT16DBL];
    244   1.1.1.4  christos     case BFD_RELOC_390_PC24DBL:
    245   1.1.1.4  christos       return &elf_howto_table[(int) R_390_PC24DBL];
    246   1.1.1.4  christos     case BFD_RELOC_390_PLT24DBL:
    247   1.1.1.4  christos       return &elf_howto_table[(int) R_390_PLT24DBL];
    248       1.1     skrll     case BFD_RELOC_390_PC32DBL:
    249       1.1     skrll       return &elf_howto_table[(int) R_390_PC32DBL];
    250       1.1     skrll     case BFD_RELOC_390_PLT32DBL:
    251       1.1     skrll       return &elf_howto_table[(int) R_390_PLT32DBL];
    252       1.1     skrll     case BFD_RELOC_390_GOTPCDBL:
    253       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPCDBL];
    254       1.1     skrll     case BFD_RELOC_64:
    255       1.1     skrll       return &elf_howto_table[(int) R_390_64];
    256       1.1     skrll     case BFD_RELOC_64_PCREL:
    257       1.1     skrll       return &elf_howto_table[(int) R_390_PC64];
    258       1.1     skrll     case BFD_RELOC_390_GOT64:
    259       1.1     skrll       return &elf_howto_table[(int) R_390_GOT64];
    260  1.1.1.12  christos     case BFD_RELOC_64_PLT_PCREL:
    261       1.1     skrll       return &elf_howto_table[(int) R_390_PLT64];
    262       1.1     skrll     case BFD_RELOC_390_GOTENT:
    263       1.1     skrll       return &elf_howto_table[(int) R_390_GOTENT];
    264       1.1     skrll     case BFD_RELOC_16_GOTOFF:
    265       1.1     skrll       return &elf_howto_table[(int) R_390_GOTOFF16];
    266       1.1     skrll     case BFD_RELOC_390_GOTOFF64:
    267       1.1     skrll       return &elf_howto_table[(int) R_390_GOTOFF64];
    268       1.1     skrll     case BFD_RELOC_390_GOTPLT12:
    269       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLT12];
    270       1.1     skrll     case BFD_RELOC_390_GOTPLT16:
    271       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLT16];
    272       1.1     skrll     case BFD_RELOC_390_GOTPLT32:
    273       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLT32];
    274       1.1     skrll     case BFD_RELOC_390_GOTPLT64:
    275       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLT64];
    276       1.1     skrll     case BFD_RELOC_390_GOTPLTENT:
    277       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLTENT];
    278       1.1     skrll     case BFD_RELOC_390_PLTOFF16:
    279       1.1     skrll       return &elf_howto_table[(int) R_390_PLTOFF16];
    280       1.1     skrll     case BFD_RELOC_390_PLTOFF32:
    281       1.1     skrll       return &elf_howto_table[(int) R_390_PLTOFF32];
    282       1.1     skrll     case BFD_RELOC_390_PLTOFF64:
    283       1.1     skrll       return &elf_howto_table[(int) R_390_PLTOFF64];
    284       1.1     skrll     case BFD_RELOC_390_TLS_LOAD:
    285       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_LOAD];
    286       1.1     skrll     case BFD_RELOC_390_TLS_GDCALL:
    287       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_GDCALL];
    288       1.1     skrll     case BFD_RELOC_390_TLS_LDCALL:
    289       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_LDCALL];
    290       1.1     skrll     case BFD_RELOC_390_TLS_GD64:
    291       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_GD64];
    292       1.1     skrll     case BFD_RELOC_390_TLS_GOTIE12:
    293       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_GOTIE12];
    294       1.1     skrll     case BFD_RELOC_390_TLS_GOTIE64:
    295       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_GOTIE64];
    296       1.1     skrll     case BFD_RELOC_390_TLS_LDM64:
    297       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_LDM64];
    298       1.1     skrll     case BFD_RELOC_390_TLS_IE64:
    299       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_IE64];
    300       1.1     skrll     case BFD_RELOC_390_TLS_IEENT:
    301       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_IEENT];
    302       1.1     skrll     case BFD_RELOC_390_TLS_LE64:
    303       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_LE64];
    304       1.1     skrll     case BFD_RELOC_390_TLS_LDO64:
    305       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_LDO64];
    306       1.1     skrll     case BFD_RELOC_390_TLS_DTPMOD:
    307       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_DTPMOD];
    308       1.1     skrll     case BFD_RELOC_390_TLS_DTPOFF:
    309       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_DTPOFF];
    310       1.1     skrll     case BFD_RELOC_390_TLS_TPOFF:
    311       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_TPOFF];
    312       1.1     skrll     case BFD_RELOC_390_20:
    313       1.1     skrll       return &elf_howto_table[(int) R_390_20];
    314       1.1     skrll     case BFD_RELOC_390_GOT20:
    315       1.1     skrll       return &elf_howto_table[(int) R_390_GOT20];
    316       1.1     skrll     case BFD_RELOC_390_GOTPLT20:
    317       1.1     skrll       return &elf_howto_table[(int) R_390_GOTPLT20];
    318       1.1     skrll     case BFD_RELOC_390_TLS_GOTIE20:
    319       1.1     skrll       return &elf_howto_table[(int) R_390_TLS_GOTIE20];
    320  1.1.1.12  christos     case BFD_RELOC_IRELATIVE:
    321   1.1.1.3  christos       return &elf_howto_table[(int) R_390_IRELATIVE];
    322       1.1     skrll     case BFD_RELOC_VTABLE_INHERIT:
    323       1.1     skrll       return &elf64_s390_vtinherit_howto;
    324       1.1     skrll     case BFD_RELOC_VTABLE_ENTRY:
    325       1.1     skrll       return &elf64_s390_vtentry_howto;
    326       1.1     skrll     default:
    327       1.1     skrll       break;
    328       1.1     skrll     }
    329   1.1.1.7  christos 
    330   1.1.1.7  christos   /* xgettext:c-format */
    331   1.1.1.7  christos   _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
    332   1.1.1.7  christos   bfd_set_error (bfd_error_bad_value);
    333   1.1.1.7  christos   return NULL;
    334       1.1     skrll }
    335       1.1     skrll 
    336       1.1     skrll static reloc_howto_type *
    337       1.1     skrll elf_s390_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    338       1.1     skrll 			    const char *r_name)
    339       1.1     skrll {
    340       1.1     skrll   unsigned int i;
    341       1.1     skrll 
    342       1.1     skrll   for (i = 0;
    343       1.1     skrll        i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]);
    344       1.1     skrll        i++)
    345       1.1     skrll     if (elf_howto_table[i].name != NULL
    346       1.1     skrll 	&& strcasecmp (elf_howto_table[i].name, r_name) == 0)
    347       1.1     skrll       return &elf_howto_table[i];
    348       1.1     skrll 
    349   1.1.1.5  christos   if (strcasecmp (elf64_s390_vtinherit_howto.name, r_name) == 0)
    350   1.1.1.5  christos     return &elf64_s390_vtinherit_howto;
    351   1.1.1.5  christos   if (strcasecmp (elf64_s390_vtentry_howto.name, r_name) == 0)
    352   1.1.1.5  christos     return &elf64_s390_vtentry_howto;
    353       1.1     skrll 
    354       1.1     skrll   return NULL;
    355       1.1     skrll }
    356       1.1     skrll 
    357       1.1     skrll /* We need to use ELF64_R_TYPE so we have our own copy of this function,
    358       1.1     skrll    and elf64-s390.c has its own copy.  */
    359       1.1     skrll 
    360   1.1.1.9  christos static bool
    361   1.1.1.3  christos elf_s390_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
    362   1.1.1.3  christos 			arelent *cache_ptr,
    363   1.1.1.3  christos 			Elf_Internal_Rela *dst)
    364       1.1     skrll {
    365       1.1     skrll   unsigned int r_type = ELF64_R_TYPE(dst->r_info);
    366   1.1.1.7  christos 
    367       1.1     skrll   switch (r_type)
    368       1.1     skrll     {
    369       1.1     skrll     case R_390_GNU_VTINHERIT:
    370       1.1     skrll       cache_ptr->howto = &elf64_s390_vtinherit_howto;
    371       1.1     skrll       break;
    372       1.1     skrll 
    373       1.1     skrll     case R_390_GNU_VTENTRY:
    374       1.1     skrll       cache_ptr->howto = &elf64_s390_vtentry_howto;
    375       1.1     skrll       break;
    376       1.1     skrll 
    377       1.1     skrll     default:
    378       1.1     skrll       if (r_type >= sizeof (elf_howto_table) / sizeof (elf_howto_table[0]))
    379       1.1     skrll 	{
    380   1.1.1.6  christos 	  /* xgettext:c-format */
    381   1.1.1.7  christos 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    382   1.1.1.7  christos 			      abfd, r_type);
    383   1.1.1.7  christos 	  bfd_set_error (bfd_error_bad_value);
    384   1.1.1.9  christos 	  return false;
    385       1.1     skrll 	}
    386       1.1     skrll       cache_ptr->howto = &elf_howto_table[r_type];
    387       1.1     skrll     }
    388   1.1.1.9  christos   return true;
    389       1.1     skrll }
    390       1.1     skrll 
    391       1.1     skrll /* A relocation function which doesn't do anything.  */
    392       1.1     skrll static bfd_reloc_status_type
    393   1.1.1.3  christos s390_tls_reloc (bfd *abfd ATTRIBUTE_UNUSED,
    394   1.1.1.3  christos 		arelent *reloc_entry,
    395   1.1.1.3  christos 		asymbol *symbol ATTRIBUTE_UNUSED,
    396   1.1.1.3  christos 		void * data ATTRIBUTE_UNUSED,
    397   1.1.1.3  christos 		asection *input_section,
    398   1.1.1.3  christos 		bfd *output_bfd,
    399   1.1.1.3  christos 		char **error_message ATTRIBUTE_UNUSED)
    400       1.1     skrll {
    401       1.1     skrll   if (output_bfd)
    402       1.1     skrll     reloc_entry->address += input_section->output_offset;
    403       1.1     skrll   return bfd_reloc_ok;
    404       1.1     skrll }
    405       1.1     skrll 
    406       1.1     skrll /* Handle the large displacement relocs.  */
    407       1.1     skrll static bfd_reloc_status_type
    408   1.1.1.3  christos s390_elf_ldisp_reloc (bfd *abfd,
    409   1.1.1.3  christos 		      arelent *reloc_entry,
    410   1.1.1.3  christos 		      asymbol *symbol,
    411   1.1.1.3  christos 		      void * data,
    412   1.1.1.3  christos 		      asection *input_section,
    413   1.1.1.3  christos 		      bfd *output_bfd,
    414   1.1.1.3  christos 		      char **error_message ATTRIBUTE_UNUSED)
    415       1.1     skrll {
    416       1.1     skrll   reloc_howto_type *howto = reloc_entry->howto;
    417       1.1     skrll   bfd_vma relocation;
    418       1.1     skrll   bfd_vma insn;
    419       1.1     skrll 
    420       1.1     skrll   if (output_bfd != (bfd *) NULL
    421       1.1     skrll       && (symbol->flags & BSF_SECTION_SYM) == 0
    422       1.1     skrll       && (! howto->partial_inplace
    423       1.1     skrll 	  || reloc_entry->addend == 0))
    424       1.1     skrll     {
    425       1.1     skrll       reloc_entry->address += input_section->output_offset;
    426       1.1     skrll       return bfd_reloc_ok;
    427       1.1     skrll     }
    428       1.1     skrll   if (output_bfd != NULL)
    429       1.1     skrll     return bfd_reloc_continue;
    430       1.1     skrll 
    431       1.1     skrll   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    432       1.1     skrll     return bfd_reloc_outofrange;
    433       1.1     skrll 
    434       1.1     skrll   relocation = (symbol->value
    435       1.1     skrll 		+ symbol->section->output_section->vma
    436       1.1     skrll 		+ symbol->section->output_offset);
    437       1.1     skrll   relocation += reloc_entry->addend;
    438       1.1     skrll   if (howto->pc_relative)
    439       1.1     skrll     {
    440       1.1     skrll       relocation -= (input_section->output_section->vma
    441       1.1     skrll 		     + input_section->output_offset);
    442       1.1     skrll       relocation -= reloc_entry->address;
    443       1.1     skrll     }
    444       1.1     skrll 
    445   1.1.1.4  christos   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
    446       1.1     skrll   insn |= (relocation & 0xfff) << 16 | (relocation & 0xff000) >> 4;
    447       1.1     skrll   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
    448       1.1     skrll 
    449       1.1     skrll   if ((bfd_signed_vma) relocation < - 0x80000
    450       1.1     skrll       || (bfd_signed_vma) relocation > 0x7ffff)
    451       1.1     skrll     return bfd_reloc_overflow;
    452       1.1     skrll   else
    453       1.1     skrll     return bfd_reloc_ok;
    454       1.1     skrll }
    455       1.1     skrll 
    456   1.1.1.9  christos static bool
    457   1.1.1.3  christos elf_s390_is_local_label_name (bfd *abfd, const char *name)
    458       1.1     skrll {
    459       1.1     skrll   if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
    460   1.1.1.9  christos     return true;
    461       1.1     skrll 
    462       1.1     skrll   return _bfd_elf_is_local_label_name (abfd, name);
    463       1.1     skrll }
    464       1.1     skrll 
    465       1.1     skrll /* Functions for the 390 ELF linker.  */
    466       1.1     skrll 
    467       1.1     skrll /* The name of the dynamic interpreter.  This is put in the .interp
    468       1.1     skrll    section.  */
    469       1.1     skrll 
    470   1.1.1.3  christos #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
    471       1.1     skrll 
    472       1.1     skrll /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
    473       1.1     skrll    copying dynamic variables from a shared lib into an app's dynbss
    474       1.1     skrll    section, and instead use a dynamic relocation to point into the
    475       1.1     skrll    shared lib.  */
    476       1.1     skrll #define ELIMINATE_COPY_RELOCS 1
    477       1.1     skrll 
    478       1.1     skrll /* The size in bytes of the first entry in the procedure linkage table.  */
    479       1.1     skrll #define PLT_FIRST_ENTRY_SIZE 32
    480       1.1     skrll /* The size in bytes of an entry in the procedure linkage table.  */
    481       1.1     skrll #define PLT_ENTRY_SIZE 32
    482       1.1     skrll 
    483       1.1     skrll #define GOT_ENTRY_SIZE 8
    484       1.1     skrll 
    485   1.1.1.3  christos #define RELA_ENTRY_SIZE sizeof (Elf64_External_Rela)
    486   1.1.1.3  christos 
    487   1.1.1.8  christos /* The first three entries in a global offset table are reserved,
    488       1.1     skrll    and the initial contents are unimportant (we zero them out).
    489       1.1     skrll    Subsequent entries look like this.  See the SVR4 ABI 386
    490       1.1     skrll    supplement to see how this works.  */
    491       1.1     skrll 
    492       1.1     skrll /* For the s390, simple addr offset can only be 0 - 4096.
    493       1.1     skrll    To use the full 16777216 TB address space, several instructions
    494       1.1     skrll    are needed to load an address in a register and execute
    495       1.1     skrll    a branch( or just saving the address)
    496       1.1     skrll 
    497       1.1     skrll    Furthermore, only r 0 and 1 are free to use!!!  */
    498       1.1     skrll 
    499       1.1     skrll /* The first 3 words in the GOT are then reserved.
    500       1.1     skrll    Word 0 is the address of the dynamic table.
    501       1.1     skrll    Word 1 is a pointer to a structure describing the object
    502       1.1     skrll    Word 2 is used to point to the loader entry address.
    503       1.1     skrll 
    504       1.1     skrll    The code for PLT entries looks like this:
    505       1.1     skrll 
    506       1.1     skrll    The GOT holds the address in the PLT to be executed.
    507       1.1     skrll    The loader then gets:
    508   1.1.1.5  christos    48(15) =  Pointer to the structure describing the object.
    509   1.1.1.5  christos    56(15) =  Offset in symbol table
    510       1.1     skrll    The loader  must  then find the module where the function is
    511       1.1     skrll    and insert the address in the GOT.
    512       1.1     skrll 
    513       1.1     skrll    PLT1: LARL 1,<fn>@GOTENT # 6 bytes  Load address of GOT entry in r1
    514   1.1.1.6  christos 	 LG   1,0(1)	  # 6 bytes  Load address from GOT in r1
    515   1.1.1.6  christos 	 BCR  15,1	  # 2 bytes  Jump to address
    516   1.1.1.6  christos    RET1: BASR 1,0	  # 2 bytes  Return from GOT 1st time
    517   1.1.1.8  christos 	 LGF  1,12(1)	  # 6 bytes  Load rela.plt offset into r1
    518   1.1.1.8  christos 	 BRCL 15,-x	  # 6 bytes  Jump to first PLT entry
    519   1.1.1.6  christos 	 .long ?	  # 4 bytes  offset into .rela.plt
    520       1.1     skrll 
    521       1.1     skrll    Total = 32 bytes per PLT entry
    522       1.1     skrll    Fixup at offset 2: relative address to GOT entry
    523       1.1     skrll    Fixup at offset 22: relative branch to PLT0
    524   1.1.1.3  christos    Fixup at offset 28: 32 bit offset into .rela.plt
    525       1.1     skrll 
    526   1.1.1.3  christos    A 32 bit offset into the symbol table is enough. It allows for
    527   1.1.1.3  christos    .rela.plt sections up to a size of 2 gigabyte.  A single dynamic
    528   1.1.1.3  christos    object (the main program, any shared library) is limited to 4GB in
    529   1.1.1.3  christos    size.  Having a .rela.plt of 2GB would already make the .plt
    530   1.1.1.3  christos    section bigger than 8GB.  */
    531   1.1.1.3  christos 
    532   1.1.1.3  christos static const bfd_byte elf_s390x_plt_entry[PLT_ENTRY_SIZE] =
    533   1.1.1.3  christos   {
    534   1.1.1.6  christos     0xc0, 0x10, 0x00, 0x00, 0x00, 0x00,	    /* larl    %r1,.	   */
    535   1.1.1.6  christos     0xe3, 0x10, 0x10, 0x00, 0x00, 0x04,	    /* lg      %r1,0(%r1)  */
    536   1.1.1.6  christos     0x07, 0xf1,				    /* br      %r1	   */
    537   1.1.1.6  christos     0x0d, 0x10,				    /* basr    %r1,%r0	   */
    538   1.1.1.6  christos     0xe3, 0x10, 0x10, 0x0c, 0x00, 0x14,	    /* lgf     %r1,12(%r1) */
    539   1.1.1.6  christos     0xc0, 0xf4, 0x00, 0x00, 0x00, 0x00,	    /* jg      first plt   */
    540   1.1.1.6  christos     0x00, 0x00, 0x00, 0x00		    /* .long   0x00000000  */
    541   1.1.1.3  christos   };
    542       1.1     skrll 
    543       1.1     skrll /* The first PLT entry pushes the offset into the symbol table
    544   1.1.1.3  christos    from R1 onto the stack at 56(15) and the loader object info
    545   1.1.1.3  christos    at 48(15), loads the loader address in R1 and jumps to it.  */
    546       1.1     skrll 
    547       1.1     skrll /* The first entry in the PLT:
    548       1.1     skrll 
    549       1.1     skrll   PLT0:
    550       1.1     skrll      STG  1,56(15)  # r1 contains the offset into the symbol table
    551       1.1     skrll      LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table
    552       1.1     skrll      MVC  48(8,15),8(1) # move loader ino (object struct address) to stack
    553       1.1     skrll      LG   1,16(1)   # get entry address of loader
    554       1.1     skrll      BCR  15,1      # jump to loader
    555       1.1     skrll 
    556       1.1     skrll      Fixup at offset 8: relative address to start of GOT.  */
    557       1.1     skrll 
    558   1.1.1.3  christos static const bfd_byte elf_s390x_first_plt_entry[PLT_FIRST_ENTRY_SIZE] =
    559   1.1.1.3  christos   {
    560   1.1.1.6  christos     0xe3, 0x10, 0xf0, 0x38, 0x00, 0x24,	    /* stg     %r1,56(%r15)	 */
    561   1.1.1.6  christos     0xc0, 0x10, 0x00, 0x00, 0x00, 0x00,	    /* larl    %r1,.		 */
    562   1.1.1.6  christos     0xd2, 0x07, 0xf0, 0x30, 0x10, 0x08,	    /* mvc     48(8,%r15),8(%r1) */
    563   1.1.1.6  christos     0xe3, 0x10, 0x10, 0x10, 0x00, 0x04,	    /* lg      %r1,16(%r1)	 */
    564   1.1.1.6  christos     0x07, 0xf1,				    /* br      %r1		 */
    565   1.1.1.6  christos     0x07, 0x00,				    /* nopr    %r0		 */
    566   1.1.1.6  christos     0x07, 0x00,				    /* nopr    %r0		 */
    567   1.1.1.6  christos     0x07, 0x00				    /* nopr    %r0		 */
    568   1.1.1.3  christos   };
    569       1.1     skrll 
    570  1.1.1.11  christos /* .eh_frame covering the .plt section.  */
    571  1.1.1.11  christos 
    572  1.1.1.11  christos #define PLT_CIE_SIZE		24
    573  1.1.1.11  christos #define PLT_FDE_SIZE		20
    574  1.1.1.11  christos #define PLT_FDE_START_OFFSET	(PLT_CIE_SIZE + 8)
    575  1.1.1.11  christos #define PLT_FDE_LEN_OFFSET	(PLT_CIE_SIZE + 12)
    576  1.1.1.11  christos 
    577  1.1.1.11  christos static const bfd_byte elf_s390x_eh_frame_plt[] =
    578  1.1.1.11  christos {
    579  1.1.1.11  christos   0, 0, 0, PLT_CIE_SIZE - 4,	/* CIE length */
    580  1.1.1.11  christos   0, 0, 0, 0,			/* CIE ID */
    581  1.1.1.11  christos   1,				/* CIE version */
    582  1.1.1.11  christos   'z', 'R', 0,			/* Augmentation string */
    583  1.1.1.11  christos   1,				/* Code alignment factor */
    584  1.1.1.11  christos   0x78,				/* Data alignment factor */
    585  1.1.1.11  christos   14,				/* Return address column */
    586  1.1.1.11  christos   1,				/* Augmentation size */
    587  1.1.1.11  christos   DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
    588  1.1.1.11  christos   DW_CFA_def_cfa, 15, 0xa0, 0x01, /* DW_CFA_def_cfa: r15 ofs 160 */
    589  1.1.1.11  christos   DW_CFA_nop, DW_CFA_nop, DW_CFA_nop,
    590  1.1.1.11  christos 
    591  1.1.1.11  christos   0, 0, 0, PLT_FDE_SIZE - 4,	/* FDE length */
    592  1.1.1.11  christos   0, 0, 0, PLT_CIE_SIZE + 4,	/* CIE pointer */
    593  1.1.1.11  christos   0, 0, 0, 0,			/* R_S390_PC32 .plt goes here */
    594  1.1.1.11  christos   0, 0, 0, 0,			/* .plt size goes here */
    595  1.1.1.11  christos   0,				/* Augmentation size */
    596  1.1.1.11  christos   DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
    597  1.1.1.11  christos };
    598  1.1.1.11  christos 
    599  1.1.1.11  christos /* .sframe covering the .plt section.  */
    600  1.1.1.11  christos 
    601  1.1.1.11  christos /* This must be the same as sframe_get_hdr_size (sfh).  For s390x, this value
    602  1.1.1.11  christos    is the same as sizeof (sframe_header) because there is no SFrame auxilliary
    603  1.1.1.11  christos    header.  */
    604  1.1.1.11  christos #define PLT_SFRAME_FDE_START_OFFSET	sizeof (sframe_header)
    605  1.1.1.11  christos 
    606  1.1.1.11  christos #define SFRAME_PLT0_MAX_NUM_FRES 1
    607  1.1.1.11  christos #define SFRAME_PLTN_MAX_NUM_FRES 1
    608  1.1.1.11  christos 
    609  1.1.1.11  christos struct elf_s390x_sframe_plt
    610  1.1.1.11  christos {
    611  1.1.1.11  christos   unsigned int plt0_entry_size;
    612  1.1.1.11  christos   unsigned int plt0_num_fres;
    613  1.1.1.11  christos   const sframe_frame_row_entry *plt0_fres[SFRAME_PLT0_MAX_NUM_FRES];
    614  1.1.1.11  christos 
    615  1.1.1.11  christos   unsigned int pltn_entry_size;
    616  1.1.1.11  christos   unsigned int pltn_num_fres;
    617  1.1.1.11  christos   const sframe_frame_row_entry *pltn_fres[SFRAME_PLTN_MAX_NUM_FRES];
    618  1.1.1.11  christos };
    619  1.1.1.11  christos 
    620  1.1.1.11  christos /* .sframe FRE covering the PLT0/PLTn .plt section entry.  */
    621  1.1.1.11  christos static const sframe_frame_row_entry elf_s390x_sframe_plt_fre =
    622  1.1.1.11  christos {
    623  1.1.1.11  christos   0, /* SFrame FRE start address.  */
    624  1.1.1.11  christos   { SFRAME_V2_S390X_CFA_OFFSET_ENCODE (160), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* Offset bytes.  */
    625  1.1.1.11  christos   SFRAME_V1_FRE_INFO (SFRAME_BASE_REG_SP, 1, SFRAME_FRE_OFFSET_1B) /* FRE info.  */
    626  1.1.1.11  christos };
    627  1.1.1.11  christos 
    628  1.1.1.11  christos /* SFrame helper object for PLT.  */
    629  1.1.1.11  christos static const struct elf_s390x_sframe_plt elf_s390x_sframe_plt =
    630  1.1.1.11  christos {
    631  1.1.1.11  christos   PLT_FIRST_ENTRY_SIZE,
    632  1.1.1.11  christos   1, /* Number of FREs for PLT0.  */
    633  1.1.1.11  christos   /* Array of SFrame FREs for PLT0.  */
    634  1.1.1.11  christos   { &elf_s390x_sframe_plt_fre },
    635  1.1.1.11  christos 
    636  1.1.1.11  christos   PLT_ENTRY_SIZE,
    637  1.1.1.11  christos   1, /* Number of FREs for PLTn.  */
    638  1.1.1.11  christos   /* Array of SFrame FREs for PLTn.  */
    639  1.1.1.11  christos   { &elf_s390x_sframe_plt_fre },
    640  1.1.1.11  christos };
    641  1.1.1.11  christos 
    642       1.1     skrll 
    643       1.1     skrll /* s390 ELF linker hash entry.  */
    644       1.1     skrll 
    645       1.1     skrll struct elf_s390_link_hash_entry
    646       1.1     skrll {
    647       1.1     skrll   struct elf_link_hash_entry elf;
    648       1.1     skrll 
    649       1.1     skrll   /* Number of GOTPLT references for a function.  */
    650       1.1     skrll   bfd_signed_vma gotplt_refcount;
    651       1.1     skrll 
    652       1.1     skrll #define GOT_UNKNOWN	0
    653       1.1     skrll #define GOT_NORMAL	1
    654       1.1     skrll #define GOT_TLS_GD	2
    655       1.1     skrll #define GOT_TLS_IE	3
    656  1.1.1.12  christos #define GOT_TLS_IE_NLT	4	/* Initial Exec, no literal pool entry.  */
    657       1.1     skrll   unsigned char tls_type;
    658   1.1.1.3  christos 
    659   1.1.1.3  christos   /* For pointer equality reasons we might need to change the symbol
    660   1.1.1.3  christos      type from STT_GNU_IFUNC to STT_FUNC together with its value and
    661   1.1.1.3  christos      section entry.  So after alloc_dynrelocs only these values should
    662   1.1.1.3  christos      be used.  In order to check whether a symbol is IFUNC use
    663   1.1.1.3  christos      s390_is_ifunc_symbol_p.  */
    664   1.1.1.3  christos   bfd_vma ifunc_resolver_address;
    665   1.1.1.3  christos   asection *ifunc_resolver_section;
    666       1.1     skrll };
    667       1.1     skrll 
    668       1.1     skrll #define elf_s390_hash_entry(ent) \
    669       1.1     skrll   ((struct elf_s390_link_hash_entry *)(ent))
    670       1.1     skrll 
    671   1.1.1.3  christos /* This structure represents an entry in the local PLT list needed for
    672   1.1.1.3  christos    local IFUNC symbols.  */
    673   1.1.1.3  christos struct plt_entry
    674   1.1.1.3  christos {
    675   1.1.1.3  christos   /* The section of the local symbol.
    676   1.1.1.3  christos      Set in relocate_section and used in finish_dynamic_sections.  */
    677   1.1.1.3  christos   asection *sec;
    678   1.1.1.3  christos 
    679   1.1.1.3  christos   union
    680   1.1.1.3  christos     {
    681   1.1.1.3  christos       bfd_signed_vma refcount;
    682   1.1.1.3  christos       bfd_vma offset;
    683   1.1.1.3  christos     } plt;
    684   1.1.1.3  christos };
    685   1.1.1.3  christos 
    686       1.1     skrll /* NOTE: Keep this structure in sync with
    687       1.1     skrll    the one declared in elf32-s390.c.  */
    688       1.1     skrll struct elf_s390_obj_tdata
    689       1.1     skrll {
    690       1.1     skrll   struct elf_obj_tdata root;
    691       1.1     skrll 
    692   1.1.1.3  christos   /* A local PLT is needed for ifunc symbols.  */
    693   1.1.1.3  christos   struct plt_entry *local_plt;
    694   1.1.1.3  christos 
    695       1.1     skrll   /* TLS type for each local got entry.  */
    696       1.1     skrll   char *local_got_tls_type;
    697       1.1     skrll };
    698       1.1     skrll 
    699       1.1     skrll #define elf_s390_tdata(abfd) \
    700       1.1     skrll   ((struct elf_s390_obj_tdata *) (abfd)->tdata.any)
    701       1.1     skrll 
    702   1.1.1.3  christos #define elf_s390_local_plt(abfd) \
    703   1.1.1.3  christos   (elf_s390_tdata (abfd)->local_plt)
    704   1.1.1.3  christos 
    705       1.1     skrll #define elf_s390_local_got_tls_type(abfd) \
    706       1.1     skrll   (elf_s390_tdata (abfd)->local_got_tls_type)
    707       1.1     skrll 
    708       1.1     skrll #define is_s390_elf(bfd)				\
    709       1.1     skrll   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
    710       1.1     skrll    && elf_tdata (bfd) != NULL				\
    711   1.1.1.2  christos    && elf_object_id (bfd) == S390_ELF_DATA)
    712       1.1     skrll 
    713   1.1.1.9  christos static bool
    714       1.1     skrll elf_s390_mkobject (bfd *abfd)
    715       1.1     skrll {
    716  1.1.1.11  christos   return bfd_elf_allocate_object (abfd, sizeof (struct elf_s390_obj_tdata));
    717       1.1     skrll }
    718       1.1     skrll 
    719   1.1.1.9  christos static bool
    720   1.1.1.3  christos elf_s390_object_p (bfd *abfd)
    721       1.1     skrll {
    722       1.1     skrll   /* Set the right machine number for an s390 elf32 file.  */
    723       1.1     skrll   return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
    724       1.1     skrll }
    725       1.1     skrll 
    726       1.1     skrll /* s390 ELF linker hash table.  */
    727       1.1     skrll 
    728       1.1     skrll struct elf_s390_link_hash_table
    729       1.1     skrll {
    730       1.1     skrll   struct elf_link_hash_table elf;
    731       1.1     skrll 
    732       1.1     skrll   /* Short-cuts to get to dynamic linker sections.  */
    733   1.1.1.3  christos   asection *irelifunc;
    734  1.1.1.11  christos   asection *plt_eh_frame;
    735  1.1.1.11  christos 
    736  1.1.1.11  christos   sframe_encoder_ctx *plt_cfe_ctx;
    737  1.1.1.11  christos   asection *plt_sframe;
    738  1.1.1.11  christos   /* The .sframe helper object for .plt section.  */
    739  1.1.1.11  christos   const struct elf_s390x_sframe_plt *sframe_plt;
    740       1.1     skrll 
    741       1.1     skrll   union {
    742       1.1     skrll     bfd_signed_vma refcount;
    743       1.1     skrll     bfd_vma offset;
    744       1.1     skrll   } tls_ldm_got;
    745       1.1     skrll 
    746   1.1.1.6  christos   /* Options passed from the linker.  */
    747   1.1.1.6  christos   struct s390_elf_params *params;
    748       1.1     skrll };
    749       1.1     skrll 
    750       1.1     skrll /* Get the s390 ELF linker hash table from a link_info structure.  */
    751       1.1     skrll 
    752   1.1.1.6  christos #define elf_s390_hash_table(p)						\
    753   1.1.1.9  christos   ((is_elf_hash_table ((p)->hash)					\
    754   1.1.1.9  christos     && elf_hash_table_id (elf_hash_table (p)) == S390_ELF_DATA)		\
    755   1.1.1.9  christos    ? (struct elf_s390_link_hash_table *) (p)->hash : NULL)
    756       1.1     skrll 
    757   1.1.1.3  christos #define ELF64 1
    758   1.1.1.3  christos #include "elf-s390-common.c"
    759   1.1.1.3  christos 
    760       1.1     skrll /* Create an entry in an s390 ELF linker hash table.  */
    761       1.1     skrll 
    762       1.1     skrll static struct bfd_hash_entry *
    763   1.1.1.3  christos link_hash_newfunc (struct bfd_hash_entry *entry,
    764   1.1.1.3  christos 		   struct bfd_hash_table *table,
    765   1.1.1.3  christos 		   const char *string)
    766       1.1     skrll {
    767       1.1     skrll   /* Allocate the structure if it has not already been allocated by a
    768       1.1     skrll      subclass.  */
    769       1.1     skrll   if (entry == NULL)
    770       1.1     skrll     {
    771       1.1     skrll       entry = bfd_hash_allocate (table,
    772       1.1     skrll 				 sizeof (struct elf_s390_link_hash_entry));
    773       1.1     skrll       if (entry == NULL)
    774       1.1     skrll 	return entry;
    775       1.1     skrll     }
    776       1.1     skrll 
    777       1.1     skrll   /* Call the allocation method of the superclass.  */
    778       1.1     skrll   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
    779       1.1     skrll   if (entry != NULL)
    780       1.1     skrll     {
    781       1.1     skrll       struct elf_s390_link_hash_entry *eh;
    782       1.1     skrll 
    783       1.1     skrll       eh = (struct elf_s390_link_hash_entry *) entry;
    784       1.1     skrll       eh->gotplt_refcount = 0;
    785       1.1     skrll       eh->tls_type = GOT_UNKNOWN;
    786   1.1.1.3  christos       eh->ifunc_resolver_address = 0;
    787   1.1.1.3  christos       eh->ifunc_resolver_section = NULL;
    788       1.1     skrll     }
    789       1.1     skrll 
    790       1.1     skrll   return entry;
    791       1.1     skrll }
    792       1.1     skrll 
    793       1.1     skrll /* Create an s390 ELF linker hash table.  */
    794       1.1     skrll 
    795       1.1     skrll static struct bfd_link_hash_table *
    796   1.1.1.3  christos elf_s390_link_hash_table_create (bfd *abfd)
    797       1.1     skrll {
    798       1.1     skrll   struct elf_s390_link_hash_table *ret;
    799   1.1.1.9  christos   size_t amt = sizeof (struct elf_s390_link_hash_table);
    800       1.1     skrll 
    801   1.1.1.4  christos   ret = (struct elf_s390_link_hash_table *) bfd_zmalloc (amt);
    802       1.1     skrll   if (ret == NULL)
    803       1.1     skrll     return NULL;
    804       1.1     skrll 
    805       1.1     skrll   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
    806  1.1.1.11  christos 				      sizeof (struct elf_s390_link_hash_entry)))
    807       1.1     skrll     {
    808       1.1     skrll       free (ret);
    809       1.1     skrll       return NULL;
    810       1.1     skrll     }
    811       1.1     skrll 
    812       1.1     skrll   return &ret->elf.root;
    813       1.1     skrll }
    814       1.1     skrll 
    815       1.1     skrll /* Copy the extra info we tack onto an elf_link_hash_entry.  */
    816       1.1     skrll 
    817       1.1     skrll static void
    818   1.1.1.3  christos elf_s390_copy_indirect_symbol (struct bfd_link_info *info,
    819   1.1.1.3  christos 			       struct elf_link_hash_entry *dir,
    820   1.1.1.3  christos 			       struct elf_link_hash_entry *ind)
    821       1.1     skrll {
    822       1.1     skrll   struct elf_s390_link_hash_entry *edir, *eind;
    823       1.1     skrll 
    824       1.1     skrll   edir = (struct elf_s390_link_hash_entry *) dir;
    825       1.1     skrll   eind = (struct elf_s390_link_hash_entry *) ind;
    826       1.1     skrll 
    827       1.1     skrll   if (ind->root.type == bfd_link_hash_indirect
    828       1.1     skrll       && dir->got.refcount <= 0)
    829       1.1     skrll     {
    830       1.1     skrll       edir->tls_type = eind->tls_type;
    831       1.1     skrll       eind->tls_type = GOT_UNKNOWN;
    832       1.1     skrll     }
    833       1.1     skrll 
    834       1.1     skrll   if (ELIMINATE_COPY_RELOCS
    835       1.1     skrll       && ind->root.type != bfd_link_hash_indirect
    836       1.1     skrll       && dir->dynamic_adjusted)
    837       1.1     skrll     {
    838       1.1     skrll       /* If called to transfer flags for a weakdef during processing
    839       1.1     skrll 	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
    840       1.1     skrll 	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
    841   1.1.1.6  christos       if (dir->versioned != versioned_hidden)
    842   1.1.1.6  christos 	dir->ref_dynamic |= ind->ref_dynamic;
    843       1.1     skrll       dir->ref_regular |= ind->ref_regular;
    844       1.1     skrll       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
    845       1.1     skrll       dir->needs_plt |= ind->needs_plt;
    846       1.1     skrll     }
    847       1.1     skrll   else
    848       1.1     skrll     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
    849       1.1     skrll }
    850       1.1     skrll 
    851       1.1     skrll static int
    852   1.1.1.3  christos elf_s390_tls_transition (struct bfd_link_info *info,
    853   1.1.1.3  christos 			 int r_type,
    854   1.1.1.3  christos 			 int is_local)
    855       1.1     skrll {
    856   1.1.1.9  christos   if (bfd_link_dll (info))
    857       1.1     skrll     return r_type;
    858       1.1     skrll 
    859       1.1     skrll   switch (r_type)
    860       1.1     skrll     {
    861       1.1     skrll     case R_390_TLS_GD64:
    862       1.1     skrll     case R_390_TLS_IE64:
    863       1.1     skrll       if (is_local)
    864       1.1     skrll 	return R_390_TLS_LE64;
    865       1.1     skrll       return R_390_TLS_IE64;
    866       1.1     skrll     case R_390_TLS_GOTIE64:
    867       1.1     skrll       if (is_local)
    868       1.1     skrll 	return R_390_TLS_LE64;
    869       1.1     skrll       return R_390_TLS_GOTIE64;
    870       1.1     skrll     case R_390_TLS_LDM64:
    871       1.1     skrll       return R_390_TLS_LE64;
    872       1.1     skrll     }
    873       1.1     skrll 
    874       1.1     skrll   return r_type;
    875       1.1     skrll }
    876       1.1     skrll 
    877       1.1     skrll /* Look through the relocs for a section during the first phase, and
    878       1.1     skrll    allocate space in the global offset table or procedure linkage
    879       1.1     skrll    table.  */
    880       1.1     skrll 
    881   1.1.1.9  christos static bool
    882   1.1.1.2  christos elf_s390_check_relocs (bfd *abfd,
    883   1.1.1.2  christos 		       struct bfd_link_info *info,
    884   1.1.1.2  christos 		       asection *sec,
    885   1.1.1.2  christos 		       const Elf_Internal_Rela *relocs)
    886       1.1     skrll {
    887       1.1     skrll   struct elf_s390_link_hash_table *htab;
    888       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
    889       1.1     skrll   struct elf_link_hash_entry **sym_hashes;
    890       1.1     skrll   const Elf_Internal_Rela *rel;
    891       1.1     skrll   const Elf_Internal_Rela *rel_end;
    892       1.1     skrll   asection *sreloc;
    893       1.1     skrll   bfd_signed_vma *local_got_refcounts;
    894       1.1     skrll   int tls_type, old_tls_type;
    895       1.1     skrll 
    896   1.1.1.4  christos   if (bfd_link_relocatable (info))
    897   1.1.1.9  christos     return true;
    898       1.1     skrll 
    899       1.1     skrll   BFD_ASSERT (is_s390_elf (abfd));
    900       1.1     skrll 
    901       1.1     skrll   htab = elf_s390_hash_table (info);
    902   1.1.1.2  christos   if (htab == NULL)
    903   1.1.1.9  christos     return false;
    904   1.1.1.2  christos 
    905       1.1     skrll   symtab_hdr = &elf_symtab_hdr (abfd);
    906       1.1     skrll   sym_hashes = elf_sym_hashes (abfd);
    907       1.1     skrll   local_got_refcounts = elf_local_got_refcounts (abfd);
    908       1.1     skrll 
    909       1.1     skrll   sreloc = NULL;
    910       1.1     skrll 
    911       1.1     skrll   rel_end = relocs + sec->reloc_count;
    912       1.1     skrll   for (rel = relocs; rel < rel_end; rel++)
    913       1.1     skrll     {
    914       1.1     skrll       unsigned int r_type;
    915   1.1.1.6  christos       unsigned int r_symndx;
    916       1.1     skrll       struct elf_link_hash_entry *h;
    917   1.1.1.3  christos       Elf_Internal_Sym *isym;
    918       1.1     skrll 
    919       1.1     skrll       r_symndx = ELF64_R_SYM (rel->r_info);
    920       1.1     skrll 
    921       1.1     skrll       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
    922       1.1     skrll 	{
    923   1.1.1.6  christos 	  /* xgettext:c-format */
    924   1.1.1.7  christos 	  _bfd_error_handler (_("%pB: bad symbol index: %d"),
    925   1.1.1.6  christos 			      abfd, r_symndx);
    926   1.1.1.9  christos 	  return false;
    927       1.1     skrll 	}
    928       1.1     skrll 
    929       1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
    930   1.1.1.3  christos 	{
    931   1.1.1.3  christos 	  /* A local symbol.  */
    932   1.1.1.9  christos 	  isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
    933   1.1.1.3  christos 					abfd, r_symndx);
    934   1.1.1.3  christos 	  if (isym == NULL)
    935   1.1.1.9  christos 	    return false;
    936   1.1.1.3  christos 
    937   1.1.1.3  christos 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
    938   1.1.1.3  christos 	    {
    939   1.1.1.3  christos 	      struct plt_entry *plt;
    940   1.1.1.3  christos 
    941   1.1.1.3  christos 	      if (htab->elf.dynobj == NULL)
    942   1.1.1.3  christos 		htab->elf.dynobj = abfd;
    943   1.1.1.3  christos 
    944   1.1.1.3  christos 	      if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
    945   1.1.1.9  christos 		return false;
    946   1.1.1.3  christos 
    947   1.1.1.3  christos 	      if (local_got_refcounts == NULL)
    948   1.1.1.3  christos 		{
    949   1.1.1.3  christos 		  if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
    950   1.1.1.9  christos 		    return false;
    951   1.1.1.3  christos 		  local_got_refcounts = elf_local_got_refcounts (abfd);
    952   1.1.1.3  christos 		}
    953   1.1.1.3  christos 	      plt = elf_s390_local_plt (abfd);
    954   1.1.1.3  christos 	      plt[r_symndx].plt.refcount++;
    955   1.1.1.3  christos 	    }
    956   1.1.1.3  christos 	  h = NULL;
    957   1.1.1.3  christos 	}
    958       1.1     skrll       else
    959       1.1     skrll 	{
    960       1.1     skrll 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    961       1.1     skrll 	  while (h->root.type == bfd_link_hash_indirect
    962       1.1     skrll 		 || h->root.type == bfd_link_hash_warning)
    963       1.1     skrll 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
    964       1.1     skrll 	}
    965       1.1     skrll 
    966       1.1     skrll       /* Create got section and local_got_refcounts array if they
    967       1.1     skrll 	 are needed.  */
    968       1.1     skrll       r_type = elf_s390_tls_transition (info,
    969       1.1     skrll 					ELF64_R_TYPE (rel->r_info),
    970       1.1     skrll 					h == NULL);
    971       1.1     skrll       switch (r_type)
    972       1.1     skrll 	{
    973       1.1     skrll 	case R_390_GOT12:
    974       1.1     skrll 	case R_390_GOT16:
    975       1.1     skrll 	case R_390_GOT20:
    976       1.1     skrll 	case R_390_GOT32:
    977       1.1     skrll 	case R_390_GOT64:
    978       1.1     skrll 	case R_390_GOTENT:
    979       1.1     skrll 	case R_390_GOTPLT12:
    980       1.1     skrll 	case R_390_GOTPLT16:
    981       1.1     skrll 	case R_390_GOTPLT20:
    982       1.1     skrll 	case R_390_GOTPLT32:
    983       1.1     skrll 	case R_390_GOTPLT64:
    984       1.1     skrll 	case R_390_GOTPLTENT:
    985       1.1     skrll 	case R_390_TLS_GD64:
    986       1.1     skrll 	case R_390_TLS_GOTIE12:
    987       1.1     skrll 	case R_390_TLS_GOTIE20:
    988       1.1     skrll 	case R_390_TLS_GOTIE64:
    989       1.1     skrll 	case R_390_TLS_IEENT:
    990       1.1     skrll 	case R_390_TLS_IE64:
    991       1.1     skrll 	case R_390_TLS_LDM64:
    992       1.1     skrll 	  if (h == NULL
    993       1.1     skrll 	      && local_got_refcounts == NULL)
    994       1.1     skrll 	    {
    995   1.1.1.3  christos 	      if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr))
    996   1.1.1.9  christos 		return false;
    997   1.1.1.3  christos 	      local_got_refcounts = elf_local_got_refcounts (abfd);
    998       1.1     skrll 	    }
    999   1.1.1.3  christos 
   1000       1.1     skrll 	  /* Fall through.  */
   1001       1.1     skrll 	case R_390_GOTOFF16:
   1002       1.1     skrll 	case R_390_GOTOFF32:
   1003       1.1     skrll 	case R_390_GOTOFF64:
   1004       1.1     skrll 	case R_390_GOTPC:
   1005       1.1     skrll 	case R_390_GOTPCDBL:
   1006   1.1.1.3  christos 	  if (htab->elf.sgot == NULL)
   1007       1.1     skrll 	    {
   1008       1.1     skrll 	      if (htab->elf.dynobj == NULL)
   1009       1.1     skrll 		htab->elf.dynobj = abfd;
   1010   1.1.1.6  christos 	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
   1011   1.1.1.9  christos 		return false;
   1012       1.1     skrll 	    }
   1013       1.1     skrll 	}
   1014       1.1     skrll 
   1015   1.1.1.3  christos       if (h != NULL)
   1016   1.1.1.3  christos 	{
   1017   1.1.1.3  christos 	  if (htab->elf.dynobj == NULL)
   1018   1.1.1.3  christos 	    htab->elf.dynobj = abfd;
   1019   1.1.1.3  christos 	  if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info))
   1020   1.1.1.9  christos 	    return false;
   1021   1.1.1.3  christos 
   1022   1.1.1.3  christos 	  /* Make sure an IFUNC symbol defined in a non-shared object
   1023   1.1.1.3  christos 	     always gets a PLT slot.  */
   1024   1.1.1.3  christos 	  if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   1025   1.1.1.3  christos 	    {
   1026   1.1.1.3  christos 	      /* The symbol is called by the dynamic loader in order
   1027   1.1.1.3  christos 		 to resolve the relocation.  So it is in fact also
   1028   1.1.1.3  christos 		 referenced.  */
   1029   1.1.1.3  christos 	      h->ref_regular = 1;
   1030   1.1.1.3  christos 	      h->needs_plt = 1;
   1031   1.1.1.3  christos 	    }
   1032   1.1.1.3  christos 	}
   1033   1.1.1.3  christos 
   1034       1.1     skrll       switch (r_type)
   1035       1.1     skrll 	{
   1036       1.1     skrll 	case R_390_GOTPC:
   1037       1.1     skrll 	case R_390_GOTPCDBL:
   1038   1.1.1.3  christos 	  /* These relocs do not need a GOT slot.  They just load the
   1039   1.1.1.3  christos 	     GOT pointer itself or address something else relative to
   1040   1.1.1.3  christos 	     the GOT.  Since the GOT pointer has been set up above we
   1041   1.1.1.3  christos 	     are done.  */
   1042       1.1     skrll 	  break;
   1043   1.1.1.4  christos 	case R_390_GOTOFF16:
   1044   1.1.1.4  christos 	case R_390_GOTOFF32:
   1045   1.1.1.4  christos 	case R_390_GOTOFF64:
   1046   1.1.1.4  christos 	  if (h == NULL || !s390_is_ifunc_symbol_p (h) || !h->def_regular)
   1047   1.1.1.4  christos 	    break;
   1048   1.1.1.6  christos 	  /* Fall through.  */
   1049       1.1     skrll 
   1050   1.1.1.4  christos 	case R_390_PLT12DBL:
   1051       1.1     skrll 	case R_390_PLT16DBL:
   1052   1.1.1.4  christos 	case R_390_PLT24DBL:
   1053       1.1     skrll 	case R_390_PLT32:
   1054       1.1     skrll 	case R_390_PLT32DBL:
   1055       1.1     skrll 	case R_390_PLT64:
   1056       1.1     skrll 	case R_390_PLTOFF16:
   1057       1.1     skrll 	case R_390_PLTOFF32:
   1058       1.1     skrll 	case R_390_PLTOFF64:
   1059       1.1     skrll 	  /* This symbol requires a procedure linkage table entry.  We
   1060       1.1     skrll 	     actually build the entry in adjust_dynamic_symbol,
   1061       1.1     skrll 	     because this might be a case of linking PIC code which is
   1062       1.1     skrll 	     never referenced by a dynamic object, in which case we
   1063       1.1     skrll 	     don't need to generate a procedure linkage table entry
   1064       1.1     skrll 	     after all.  */
   1065       1.1     skrll 
   1066       1.1     skrll 	  /* If this is a local symbol, we resolve it directly without
   1067       1.1     skrll 	     creating a procedure linkage table entry.  */
   1068       1.1     skrll 	  if (h != NULL)
   1069       1.1     skrll 	    {
   1070       1.1     skrll 	      h->needs_plt = 1;
   1071       1.1     skrll 	      h->plt.refcount += 1;
   1072       1.1     skrll 	    }
   1073       1.1     skrll 	  break;
   1074       1.1     skrll 
   1075       1.1     skrll 	case R_390_GOTPLT12:
   1076       1.1     skrll 	case R_390_GOTPLT16:
   1077       1.1     skrll 	case R_390_GOTPLT20:
   1078       1.1     skrll 	case R_390_GOTPLT32:
   1079       1.1     skrll 	case R_390_GOTPLT64:
   1080       1.1     skrll 	case R_390_GOTPLTENT:
   1081       1.1     skrll 	  /* This symbol requires either a procedure linkage table entry
   1082       1.1     skrll 	     or an entry in the local got. We actually build the entry
   1083       1.1     skrll 	     in adjust_dynamic_symbol because whether this is really a
   1084       1.1     skrll 	     global reference can change and with it the fact if we have
   1085       1.1     skrll 	     to create a plt entry or a local got entry. To be able to
   1086       1.1     skrll 	     make a once global symbol a local one we have to keep track
   1087       1.1     skrll 	     of the number of gotplt references that exist for this
   1088       1.1     skrll 	     symbol.  */
   1089       1.1     skrll 	  if (h != NULL)
   1090       1.1     skrll 	    {
   1091       1.1     skrll 	      ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount++;
   1092       1.1     skrll 	      h->needs_plt = 1;
   1093       1.1     skrll 	      h->plt.refcount += 1;
   1094       1.1     skrll 	    }
   1095       1.1     skrll 	  else
   1096       1.1     skrll 	    local_got_refcounts[r_symndx] += 1;
   1097       1.1     skrll 	  break;
   1098       1.1     skrll 
   1099       1.1     skrll 	case R_390_TLS_LDM64:
   1100       1.1     skrll 	  htab->tls_ldm_got.refcount += 1;
   1101       1.1     skrll 	  break;
   1102       1.1     skrll 
   1103       1.1     skrll 	case R_390_TLS_IE64:
   1104       1.1     skrll 	case R_390_TLS_GOTIE12:
   1105       1.1     skrll 	case R_390_TLS_GOTIE20:
   1106       1.1     skrll 	case R_390_TLS_GOTIE64:
   1107       1.1     skrll 	case R_390_TLS_IEENT:
   1108   1.1.1.9  christos 	  if (bfd_link_dll (info))
   1109       1.1     skrll 	    info->flags |= DF_STATIC_TLS;
   1110       1.1     skrll 	  /* Fall through */
   1111       1.1     skrll 
   1112       1.1     skrll 	case R_390_GOT12:
   1113       1.1     skrll 	case R_390_GOT16:
   1114       1.1     skrll 	case R_390_GOT20:
   1115       1.1     skrll 	case R_390_GOT32:
   1116       1.1     skrll 	case R_390_GOT64:
   1117       1.1     skrll 	case R_390_GOTENT:
   1118       1.1     skrll 	case R_390_TLS_GD64:
   1119       1.1     skrll 	  /* This symbol requires a global offset table entry.  */
   1120       1.1     skrll 	  switch (r_type)
   1121       1.1     skrll 	    {
   1122       1.1     skrll 	    default:
   1123       1.1     skrll 	    case R_390_GOT12:
   1124       1.1     skrll 	    case R_390_GOT16:
   1125       1.1     skrll 	    case R_390_GOT20:
   1126       1.1     skrll 	    case R_390_GOT32:
   1127       1.1     skrll 	    case R_390_GOTENT:
   1128       1.1     skrll 	      tls_type = GOT_NORMAL;
   1129       1.1     skrll 	      break;
   1130       1.1     skrll 	    case R_390_TLS_GD64:
   1131       1.1     skrll 	      tls_type = GOT_TLS_GD;
   1132       1.1     skrll 	      break;
   1133       1.1     skrll 	    case R_390_TLS_IE64:
   1134       1.1     skrll 	    case R_390_TLS_GOTIE64:
   1135       1.1     skrll 	      tls_type = GOT_TLS_IE;
   1136       1.1     skrll 	      break;
   1137       1.1     skrll 	    case R_390_TLS_GOTIE12:
   1138       1.1     skrll 	    case R_390_TLS_GOTIE20:
   1139       1.1     skrll 	    case R_390_TLS_IEENT:
   1140       1.1     skrll 	      tls_type = GOT_TLS_IE_NLT;
   1141       1.1     skrll 	      break;
   1142       1.1     skrll 	    }
   1143       1.1     skrll 
   1144       1.1     skrll 	  if (h != NULL)
   1145       1.1     skrll 	    {
   1146       1.1     skrll 	      h->got.refcount += 1;
   1147       1.1     skrll 	      old_tls_type = elf_s390_hash_entry(h)->tls_type;
   1148       1.1     skrll 	    }
   1149       1.1     skrll 	  else
   1150       1.1     skrll 	    {
   1151       1.1     skrll 	      local_got_refcounts[r_symndx] += 1;
   1152       1.1     skrll 	      old_tls_type = elf_s390_local_got_tls_type (abfd) [r_symndx];
   1153       1.1     skrll 	    }
   1154       1.1     skrll 	  /* If a TLS symbol is accessed using IE at least once,
   1155       1.1     skrll 	     there is no point to use dynamic model for it.  */
   1156       1.1     skrll 	  if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN)
   1157       1.1     skrll 	    {
   1158       1.1     skrll 	      if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL)
   1159       1.1     skrll 		{
   1160   1.1.1.6  christos 		  _bfd_error_handler
   1161   1.1.1.6  christos 		    /* xgettext:c-format */
   1162   1.1.1.7  christos 		    (_("%pB: `%s' accessed both as normal and thread local symbol"),
   1163       1.1     skrll 		     abfd, h->root.root.string);
   1164   1.1.1.9  christos 		  return false;
   1165       1.1     skrll 		}
   1166       1.1     skrll 	      if (old_tls_type > tls_type)
   1167       1.1     skrll 		tls_type = old_tls_type;
   1168       1.1     skrll 	    }
   1169       1.1     skrll 
   1170       1.1     skrll 	  if (old_tls_type != tls_type)
   1171       1.1     skrll 	    {
   1172       1.1     skrll 	      if (h != NULL)
   1173       1.1     skrll 		elf_s390_hash_entry (h)->tls_type = tls_type;
   1174       1.1     skrll 	      else
   1175       1.1     skrll 		elf_s390_local_got_tls_type (abfd) [r_symndx] = tls_type;
   1176       1.1     skrll 	    }
   1177       1.1     skrll 
   1178       1.1     skrll 	  if (r_type != R_390_TLS_IE64)
   1179       1.1     skrll 	    break;
   1180       1.1     skrll 	  /* Fall through */
   1181       1.1     skrll 
   1182       1.1     skrll 	case R_390_TLS_LE64:
   1183   1.1.1.4  christos 	  /* For static linking and executables this reloc will be
   1184   1.1.1.4  christos 	     calculated at linktime otherwise a TLS_TPOFF runtime
   1185   1.1.1.4  christos 	     reloc will be generated.  */
   1186   1.1.1.4  christos 	  if (r_type == R_390_TLS_LE64 && bfd_link_pie (info))
   1187   1.1.1.4  christos 	    break;
   1188   1.1.1.4  christos 
   1189   1.1.1.9  christos 	  if (!bfd_link_dll (info))
   1190       1.1     skrll 	    break;
   1191       1.1     skrll 	  info->flags |= DF_STATIC_TLS;
   1192       1.1     skrll 	  /* Fall through */
   1193       1.1     skrll 
   1194       1.1     skrll 	case R_390_8:
   1195       1.1     skrll 	case R_390_16:
   1196       1.1     skrll 	case R_390_32:
   1197       1.1     skrll 	case R_390_64:
   1198   1.1.1.4  christos 	case R_390_PC12DBL:
   1199       1.1     skrll 	case R_390_PC16:
   1200       1.1     skrll 	case R_390_PC16DBL:
   1201   1.1.1.4  christos 	case R_390_PC24DBL:
   1202       1.1     skrll 	case R_390_PC32:
   1203       1.1     skrll 	case R_390_PC32DBL:
   1204       1.1     skrll 	case R_390_PC64:
   1205   1.1.1.4  christos 	  if (h != NULL && bfd_link_executable (info))
   1206       1.1     skrll 	    {
   1207       1.1     skrll 	      /* If this reloc is in a read-only section, we might
   1208       1.1     skrll 		 need a copy reloc.  We can't check reliably at this
   1209       1.1     skrll 		 stage whether the section is read-only, as input
   1210       1.1     skrll 		 sections have not yet been mapped to output sections.
   1211       1.1     skrll 		 Tentatively set the flag for now, and correct in
   1212       1.1     skrll 		 adjust_dynamic_symbol.  */
   1213       1.1     skrll 	      h->non_got_ref = 1;
   1214       1.1     skrll 
   1215   1.1.1.4  christos 	      if (!bfd_link_pic (info))
   1216   1.1.1.3  christos 		{
   1217   1.1.1.3  christos 		  /* We may need a .plt entry if the function this reloc
   1218   1.1.1.3  christos 		     refers to is in a shared lib.  */
   1219   1.1.1.3  christos 		  h->plt.refcount += 1;
   1220   1.1.1.3  christos 		}
   1221       1.1     skrll 	    }
   1222       1.1     skrll 
   1223       1.1     skrll 	  /* If we are creating a shared library, and this is a reloc
   1224       1.1     skrll 	     against a global symbol, or a non PC relative reloc
   1225       1.1     skrll 	     against a local symbol, then we need to copy the reloc
   1226       1.1     skrll 	     into the shared library.  However, if we are linking with
   1227       1.1     skrll 	     -Bsymbolic, we do not need to copy a reloc against a
   1228       1.1     skrll 	     global symbol which is defined in an object we are
   1229       1.1     skrll 	     including in the link (i.e., DEF_REGULAR is set).  At
   1230       1.1     skrll 	     this point we have not seen all the input files, so it is
   1231       1.1     skrll 	     possible that DEF_REGULAR is not set now but will be set
   1232       1.1     skrll 	     later (it is never cleared).  In case of a weak definition,
   1233       1.1     skrll 	     DEF_REGULAR may be cleared later by a strong definition in
   1234       1.1     skrll 	     a shared library. We account for that possibility below by
   1235       1.1     skrll 	     storing information in the relocs_copied field of the hash
   1236       1.1     skrll 	     table entry.  A similar situation occurs when creating
   1237       1.1     skrll 	     shared libraries and symbol visibility changes render the
   1238       1.1     skrll 	     symbol local.
   1239       1.1     skrll 
   1240       1.1     skrll 	     If on the other hand, we are creating an executable, we
   1241       1.1     skrll 	     may need to keep relocations for symbols satisfied by a
   1242       1.1     skrll 	     dynamic library if we manage to avoid copy relocs for the
   1243       1.1     skrll 	     symbol.  */
   1244   1.1.1.4  christos 	  if ((bfd_link_pic (info)
   1245       1.1     skrll 	       && (sec->flags & SEC_ALLOC) != 0
   1246       1.1     skrll 	       && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
   1247   1.1.1.4  christos 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC12DBL
   1248       1.1     skrll 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
   1249   1.1.1.4  christos 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC24DBL
   1250       1.1     skrll 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32
   1251       1.1     skrll 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
   1252       1.1     skrll 		    && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
   1253       1.1     skrll 		   || (h != NULL
   1254   1.1.1.2  christos 		       && (! SYMBOLIC_BIND (info, h)
   1255       1.1     skrll 			   || h->root.type == bfd_link_hash_defweak
   1256       1.1     skrll 			   || !h->def_regular))))
   1257       1.1     skrll 	      || (ELIMINATE_COPY_RELOCS
   1258   1.1.1.4  christos 		  && !bfd_link_pic (info)
   1259       1.1     skrll 		  && (sec->flags & SEC_ALLOC) != 0
   1260       1.1     skrll 		  && h != NULL
   1261       1.1     skrll 		  && (h->root.type == bfd_link_hash_defweak
   1262       1.1     skrll 		      || !h->def_regular)))
   1263       1.1     skrll 	    {
   1264   1.1.1.3  christos 	      struct elf_dyn_relocs *p;
   1265   1.1.1.3  christos 	      struct elf_dyn_relocs **head;
   1266       1.1     skrll 
   1267       1.1     skrll 	      /* We must copy these reloc types into the output file.
   1268       1.1     skrll 		 Create a reloc section in dynobj and make room for
   1269       1.1     skrll 		 this reloc.  */
   1270       1.1     skrll 	      if (sreloc == NULL)
   1271       1.1     skrll 		{
   1272       1.1     skrll 		  if (htab->elf.dynobj == NULL)
   1273       1.1     skrll 		    htab->elf.dynobj = abfd;
   1274       1.1     skrll 
   1275   1.1.1.2  christos 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   1276   1.1.1.9  christos 		    (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ true);
   1277       1.1     skrll 
   1278   1.1.1.2  christos 		  if (sreloc == NULL)
   1279   1.1.1.9  christos 		    return false;
   1280       1.1     skrll 		}
   1281       1.1     skrll 
   1282       1.1     skrll 	      /* If this is a global symbol, we count the number of
   1283       1.1     skrll 		 relocations we need for this symbol.  */
   1284       1.1     skrll 	      if (h != NULL)
   1285       1.1     skrll 		{
   1286   1.1.1.9  christos 		  head = &h->dyn_relocs;
   1287       1.1     skrll 		}
   1288       1.1     skrll 	      else
   1289       1.1     skrll 		{
   1290       1.1     skrll 		  /* Track dynamic relocs needed for local syms too.
   1291       1.1     skrll 		     We really need local syms available to do this
   1292       1.1     skrll 		     easily.  Oh well.  */
   1293       1.1     skrll 		  asection *s;
   1294       1.1     skrll 		  void *vpp;
   1295       1.1     skrll 
   1296   1.1.1.9  christos 		  isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
   1297   1.1.1.2  christos 						abfd, r_symndx);
   1298   1.1.1.2  christos 		  if (isym == NULL)
   1299   1.1.1.9  christos 		    return false;
   1300       1.1     skrll 
   1301   1.1.1.2  christos 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   1302   1.1.1.2  christos 		  if (s == NULL)
   1303   1.1.1.2  christos 		    s = sec;
   1304   1.1.1.2  christos 
   1305       1.1     skrll 		  vpp = &elf_section_data (s)->local_dynrel;
   1306   1.1.1.3  christos 		  head = (struct elf_dyn_relocs **) vpp;
   1307       1.1     skrll 		}
   1308       1.1     skrll 
   1309       1.1     skrll 	      p = *head;
   1310       1.1     skrll 	      if (p == NULL || p->sec != sec)
   1311       1.1     skrll 		{
   1312   1.1.1.9  christos 		  size_t amt = sizeof *p;
   1313   1.1.1.3  christos 		  p = ((struct elf_dyn_relocs *)
   1314       1.1     skrll 		       bfd_alloc (htab->elf.dynobj, amt));
   1315       1.1     skrll 		  if (p == NULL)
   1316   1.1.1.9  christos 		    return false;
   1317       1.1     skrll 		  p->next = *head;
   1318       1.1     skrll 		  *head = p;
   1319       1.1     skrll 		  p->sec = sec;
   1320       1.1     skrll 		  p->count = 0;
   1321       1.1     skrll 		  p->pc_count = 0;
   1322       1.1     skrll 		}
   1323       1.1     skrll 
   1324       1.1     skrll 	      p->count += 1;
   1325       1.1     skrll 	      if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
   1326   1.1.1.4  christos 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC12DBL
   1327   1.1.1.4  christos 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
   1328  1.1.1.12  christos 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC24DBL
   1329       1.1     skrll 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32
   1330       1.1     skrll 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
   1331       1.1     skrll 		  || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
   1332       1.1     skrll 		p->pc_count += 1;
   1333       1.1     skrll 	    }
   1334       1.1     skrll 	  break;
   1335       1.1     skrll 
   1336       1.1     skrll 	  /* This relocation describes the C++ object vtable hierarchy.
   1337       1.1     skrll 	     Reconstruct it for later use during GC.  */
   1338       1.1     skrll 	case R_390_GNU_VTINHERIT:
   1339       1.1     skrll 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   1340   1.1.1.9  christos 	    return false;
   1341       1.1     skrll 	  break;
   1342       1.1     skrll 
   1343       1.1     skrll 	  /* This relocation describes which C++ vtable entries are actually
   1344       1.1     skrll 	     used.  Record for later use during GC.  */
   1345       1.1     skrll 	case R_390_GNU_VTENTRY:
   1346   1.1.1.8  christos 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   1347   1.1.1.9  christos 	    return false;
   1348       1.1     skrll 	  break;
   1349       1.1     skrll 
   1350       1.1     skrll 	default:
   1351       1.1     skrll 	  break;
   1352       1.1     skrll 	}
   1353       1.1     skrll     }
   1354       1.1     skrll 
   1355   1.1.1.9  christos   return true;
   1356       1.1     skrll }
   1357       1.1     skrll 
   1358       1.1     skrll /* Return the section that should be marked against GC for a given
   1359       1.1     skrll    relocation.  */
   1360       1.1     skrll 
   1361       1.1     skrll static asection *
   1362       1.1     skrll elf_s390_gc_mark_hook (asection *sec,
   1363       1.1     skrll 		       struct bfd_link_info *info,
   1364  1.1.1.12  christos 		       struct elf_reloc_cookie *cookie,
   1365       1.1     skrll 		       struct elf_link_hash_entry *h,
   1366  1.1.1.12  christos 		       unsigned int symndx)
   1367       1.1     skrll {
   1368       1.1     skrll   if (h != NULL)
   1369  1.1.1.12  christos     switch (ELF64_R_TYPE (cookie->rel->r_info))
   1370       1.1     skrll       {
   1371       1.1     skrll       case R_390_GNU_VTINHERIT:
   1372       1.1     skrll       case R_390_GNU_VTENTRY:
   1373       1.1     skrll 	return NULL;
   1374       1.1     skrll       }
   1375       1.1     skrll 
   1376  1.1.1.12  christos   return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
   1377       1.1     skrll }
   1378       1.1     skrll 
   1379       1.1     skrll /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
   1380       1.1     skrll    entry but we found we will not create any.  Called when we find we will
   1381       1.1     skrll    not have any PLT for this symbol, by for example
   1382       1.1     skrll    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
   1383  1.1.1.11  christos    or elf_s390_late_size_sections if no dynamic sections will be
   1384       1.1     skrll    created (we're only linking static objects).  */
   1385       1.1     skrll 
   1386       1.1     skrll static void
   1387   1.1.1.3  christos elf_s390_adjust_gotplt (struct elf_s390_link_hash_entry *h)
   1388       1.1     skrll {
   1389       1.1     skrll   if (h->elf.root.type == bfd_link_hash_warning)
   1390       1.1     skrll     h = (struct elf_s390_link_hash_entry *) h->elf.root.u.i.link;
   1391       1.1     skrll 
   1392       1.1     skrll   if (h->gotplt_refcount <= 0)
   1393       1.1     skrll     return;
   1394       1.1     skrll 
   1395       1.1     skrll   /* We simply add the number of gotplt references to the number
   1396       1.1     skrll    * of got references for this symbol.  */
   1397       1.1     skrll   h->elf.got.refcount += h->gotplt_refcount;
   1398       1.1     skrll   h->gotplt_refcount = -1;
   1399       1.1     skrll }
   1400       1.1     skrll 
   1401       1.1     skrll /* Adjust a symbol defined by a dynamic object and referenced by a
   1402       1.1     skrll    regular object.  The current definition is in some section of the
   1403       1.1     skrll    dynamic object, but we're not including those sections.  We have to
   1404       1.1     skrll    change the definition to something the rest of the link can
   1405       1.1     skrll    understand.  */
   1406       1.1     skrll 
   1407   1.1.1.9  christos static bool
   1408   1.1.1.2  christos elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info,
   1409   1.1.1.2  christos 				struct elf_link_hash_entry *h)
   1410       1.1     skrll {
   1411       1.1     skrll   struct elf_s390_link_hash_table *htab;
   1412   1.1.1.6  christos   asection *s, *srel;
   1413       1.1     skrll 
   1414   1.1.1.3  christos   /* STT_GNU_IFUNC symbol must go through PLT. */
   1415   1.1.1.3  christos   if (s390_is_ifunc_symbol_p (h))
   1416   1.1.1.4  christos     {
   1417   1.1.1.4  christos       /* All local STT_GNU_IFUNC references must be treated as local
   1418   1.1.1.4  christos 	 calls via local PLT.  */
   1419   1.1.1.4  christos       if (h->ref_regular && SYMBOL_CALLS_LOCAL (info, h))
   1420   1.1.1.4  christos 	{
   1421   1.1.1.4  christos 	  bfd_size_type pc_count = 0, count = 0;
   1422   1.1.1.4  christos 	  struct elf_dyn_relocs **pp;
   1423   1.1.1.4  christos 	  struct elf_dyn_relocs *p;
   1424   1.1.1.4  christos 
   1425   1.1.1.9  christos 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
   1426   1.1.1.4  christos 	    {
   1427   1.1.1.4  christos 	      pc_count += p->pc_count;
   1428   1.1.1.4  christos 	      p->count -= p->pc_count;
   1429   1.1.1.4  christos 	      p->pc_count = 0;
   1430   1.1.1.4  christos 	      count += p->count;
   1431   1.1.1.4  christos 	      if (p->count == 0)
   1432   1.1.1.4  christos 		*pp = p->next;
   1433   1.1.1.4  christos 	      else
   1434   1.1.1.4  christos 		pp = &p->next;
   1435   1.1.1.4  christos 	    }
   1436   1.1.1.4  christos 
   1437   1.1.1.4  christos 	  if (pc_count || count)
   1438   1.1.1.4  christos 	    {
   1439   1.1.1.4  christos 	      h->needs_plt = 1;
   1440   1.1.1.4  christos 	      h->non_got_ref = 1;
   1441   1.1.1.4  christos 	      if (h->plt.refcount <= 0)
   1442   1.1.1.4  christos 		h->plt.refcount = 1;
   1443   1.1.1.4  christos 	      else
   1444   1.1.1.4  christos 		h->plt.refcount += 1;
   1445   1.1.1.4  christos 	    }
   1446   1.1.1.4  christos 	}
   1447   1.1.1.4  christos 
   1448   1.1.1.4  christos       if (h->plt.refcount <= 0)
   1449   1.1.1.4  christos 	{
   1450   1.1.1.4  christos 	  h->plt.offset = (bfd_vma) -1;
   1451   1.1.1.4  christos 	  h->needs_plt = 0;
   1452   1.1.1.4  christos 	}
   1453   1.1.1.9  christos       return true;
   1454   1.1.1.4  christos     }
   1455   1.1.1.3  christos 
   1456       1.1     skrll   /* If this is a function, put it in the procedure linkage table.  We
   1457       1.1     skrll      will fill in the contents of the procedure linkage table later
   1458       1.1     skrll      (although we could actually do it here).  */
   1459       1.1     skrll   if (h->type == STT_FUNC
   1460       1.1     skrll       || h->needs_plt)
   1461       1.1     skrll     {
   1462       1.1     skrll       if (h->plt.refcount <= 0
   1463   1.1.1.2  christos 	  || SYMBOL_CALLS_LOCAL (info, h)
   1464   1.1.1.6  christos 	  || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
   1465       1.1     skrll 	{
   1466       1.1     skrll 	  /* This case can occur if we saw a PLT32 reloc in an input
   1467       1.1     skrll 	     file, but the symbol was never referred to by a dynamic
   1468       1.1     skrll 	     object, or if all references were garbage collected.  In
   1469       1.1     skrll 	     such a case, we don't actually need to build a procedure
   1470       1.1     skrll 	     linkage table, and we can just do a PC32 reloc instead.  */
   1471       1.1     skrll 	  h->plt.offset = (bfd_vma) -1;
   1472       1.1     skrll 	  h->needs_plt = 0;
   1473       1.1     skrll 	  elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1474       1.1     skrll 	}
   1475       1.1     skrll 
   1476   1.1.1.9  christos       return true;
   1477       1.1     skrll     }
   1478       1.1     skrll   else
   1479       1.1     skrll     /* It's possible that we incorrectly decided a .plt reloc was
   1480       1.1     skrll        needed for an R_390_PC32 reloc to a non-function sym in
   1481       1.1     skrll        check_relocs.  We can't decide accurately between function and
   1482       1.1     skrll        non-function syms in check-relocs;  Objects loaded later in
   1483       1.1     skrll        the link may change h->type.  So fix it now.  */
   1484       1.1     skrll     h->plt.offset = (bfd_vma) -1;
   1485       1.1     skrll 
   1486       1.1     skrll   /* If this is a weak symbol, and there is a real definition, the
   1487       1.1     skrll      processor independent code will have arranged for us to see the
   1488       1.1     skrll      real definition first, and we can just use the same value.  */
   1489   1.1.1.6  christos   if (h->is_weakalias)
   1490       1.1     skrll     {
   1491   1.1.1.6  christos       struct elf_link_hash_entry *def = weakdef (h);
   1492   1.1.1.6  christos       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
   1493   1.1.1.6  christos       h->root.u.def.section = def->root.u.def.section;
   1494   1.1.1.6  christos       h->root.u.def.value = def->root.u.def.value;
   1495       1.1     skrll       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
   1496   1.1.1.6  christos 	h->non_got_ref = def->non_got_ref;
   1497   1.1.1.9  christos       return true;
   1498       1.1     skrll     }
   1499       1.1     skrll 
   1500       1.1     skrll   /* This is a reference to a symbol defined by a dynamic object which
   1501       1.1     skrll      is not a function.  */
   1502       1.1     skrll 
   1503       1.1     skrll   /* If we are creating a shared library, we must presume that the
   1504       1.1     skrll      only references to the symbol are via the global offset table.
   1505       1.1     skrll      For such cases we need not do anything here; the relocations will
   1506       1.1     skrll      be handled correctly by relocate_section.  */
   1507   1.1.1.4  christos   if (bfd_link_pic (info))
   1508   1.1.1.9  christos     return true;
   1509       1.1     skrll 
   1510       1.1     skrll   /* If there are no references to this symbol that do not use the
   1511       1.1     skrll      GOT, we don't need to generate a copy reloc.  */
   1512       1.1     skrll   if (!h->non_got_ref)
   1513   1.1.1.9  christos     return true;
   1514       1.1     skrll 
   1515       1.1     skrll   /* If -z nocopyreloc was given, we won't generate them either.  */
   1516       1.1     skrll   if (info->nocopyreloc)
   1517       1.1     skrll     {
   1518       1.1     skrll       h->non_got_ref = 0;
   1519   1.1.1.9  christos       return true;
   1520       1.1     skrll     }
   1521       1.1     skrll 
   1522   1.1.1.6  christos   /* If we don't find any dynamic relocs in read-only sections, then
   1523   1.1.1.6  christos      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   1524   1.1.1.9  christos   if (ELIMINATE_COPY_RELOCS && !_bfd_elf_readonly_dynrelocs (h))
   1525       1.1     skrll     {
   1526   1.1.1.6  christos       h->non_got_ref = 0;
   1527   1.1.1.9  christos       return true;
   1528       1.1     skrll     }
   1529       1.1     skrll 
   1530       1.1     skrll   /* We must allocate the symbol in our .dynbss section, which will
   1531       1.1     skrll      become part of the .bss section of the executable.  There will be
   1532       1.1     skrll      an entry for this symbol in the .dynsym section.  The dynamic
   1533       1.1     skrll      object will contain position independent code, so all references
   1534       1.1     skrll      from the dynamic object to this symbol will go through the global
   1535       1.1     skrll      offset table.  The dynamic linker will use the .dynsym entry to
   1536       1.1     skrll      determine the address it must put in the global offset table, so
   1537       1.1     skrll      both the dynamic object and the regular object will refer to the
   1538       1.1     skrll      same memory location for the variable.  */
   1539       1.1     skrll 
   1540       1.1     skrll   htab = elf_s390_hash_table (info);
   1541   1.1.1.2  christos   if (htab == NULL)
   1542   1.1.1.9  christos     return false;
   1543       1.1     skrll 
   1544       1.1     skrll   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
   1545       1.1     skrll      copy the initial value out of the dynamic object and into the
   1546       1.1     skrll      runtime process image.  */
   1547   1.1.1.6  christos   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
   1548   1.1.1.6  christos     {
   1549   1.1.1.6  christos       s = htab->elf.sdynrelro;
   1550   1.1.1.6  christos       srel = htab->elf.sreldynrelro;
   1551   1.1.1.6  christos     }
   1552   1.1.1.6  christos   else
   1553   1.1.1.6  christos     {
   1554   1.1.1.6  christos       s = htab->elf.sdynbss;
   1555   1.1.1.6  christos       srel = htab->elf.srelbss;
   1556   1.1.1.6  christos     }
   1557   1.1.1.3  christos   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   1558       1.1     skrll     {
   1559   1.1.1.6  christos       srel->size += sizeof (Elf64_External_Rela);
   1560       1.1     skrll       h->needs_copy = 1;
   1561       1.1     skrll     }
   1562       1.1     skrll 
   1563   1.1.1.4  christos   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   1564       1.1     skrll }
   1565       1.1     skrll 
   1566  1.1.1.11  christos /* Create SFrame stack trace info for the PLT entries in the .plt section.  */
   1567  1.1.1.11  christos 
   1568  1.1.1.11  christos static bool
   1569  1.1.1.11  christos _bfd_s390_elf_create_sframe_plt (struct bfd_link_info *info)
   1570  1.1.1.11  christos {
   1571  1.1.1.11  christos   struct elf_s390_link_hash_table *htab;
   1572  1.1.1.11  christos 
   1573  1.1.1.11  christos   unsigned int plt0_entry_size;
   1574  1.1.1.11  christos   unsigned char func_info;
   1575  1.1.1.11  christos   uint32_t fre_type;
   1576  1.1.1.11  christos   /* The dynamic plt section for which .sframe stack trace information is being
   1577  1.1.1.11  christos      created.  */
   1578  1.1.1.11  christos   asection *dpltsec;
   1579  1.1.1.11  christos 
   1580  1.1.1.11  christos   int err = 0;
   1581  1.1.1.11  christos 
   1582  1.1.1.11  christos   sframe_encoder_ctx **ectx = NULL;
   1583  1.1.1.11  christos   unsigned plt_entry_size = 0;
   1584  1.1.1.11  christos   unsigned int num_pltn_fres = 0;
   1585  1.1.1.11  christos   unsigned int num_pltn_entries = 0;
   1586  1.1.1.11  christos   const sframe_frame_row_entry * const *pltn_fres;
   1587  1.1.1.11  christos 
   1588  1.1.1.11  christos   htab = elf_s390_hash_table (info);
   1589  1.1.1.11  christos   ectx = &htab->plt_cfe_ctx;
   1590  1.1.1.11  christos   dpltsec = htab->elf.splt;
   1591  1.1.1.11  christos 
   1592  1.1.1.11  christos   plt0_entry_size = htab->sframe_plt->plt0_entry_size;
   1593  1.1.1.11  christos   plt_entry_size = htab->sframe_plt->pltn_entry_size;
   1594  1.1.1.11  christos   pltn_fres = htab->sframe_plt->pltn_fres;
   1595  1.1.1.11  christos   num_pltn_fres = htab->sframe_plt->pltn_num_fres;
   1596  1.1.1.11  christos   num_pltn_entries = (dpltsec->size - plt0_entry_size) / plt_entry_size;
   1597  1.1.1.11  christos 
   1598  1.1.1.12  christos   *ectx = sframe_encode (SFRAME_VERSION_3,
   1599  1.1.1.11  christos 			 SFRAME_F_FDE_FUNC_START_PCREL,
   1600  1.1.1.11  christos 			 SFRAME_ABI_S390X_ENDIAN_BIG,
   1601  1.1.1.11  christos 			 SFRAME_CFA_FIXED_FP_INVALID,
   1602  1.1.1.11  christos 			 SFRAME_CFA_FIXED_RA_INVALID,
   1603  1.1.1.11  christos 			 &err);
   1604  1.1.1.11  christos 
   1605  1.1.1.11  christos   /* FRE type is dependent on the size of the function.  */
   1606  1.1.1.11  christos   fre_type = sframe_calc_fre_type (dpltsec->size);
   1607  1.1.1.12  christos   func_info = sframe_fde_create_func_info (fre_type, SFRAME_V3_FDE_PCTYPE_INC);
   1608  1.1.1.11  christos 
   1609  1.1.1.11  christos   /* Add SFrame FDE and the associated FREs for PLT0 if PLT0 has been
   1610  1.1.1.11  christos      generated.  */
   1611  1.1.1.11  christos   if (plt0_entry_size)
   1612  1.1.1.11  christos     {
   1613  1.1.1.11  christos       /* Add SFrame FDE for PLT0, the function start address is updated later
   1614  1.1.1.11  christos 	 at _bfd_elf_merge_section_sframe time.  */
   1615  1.1.1.12  christos       sframe_encoder_add_funcdesc_v3 (*ectx,
   1616  1.1.1.11  christos 				      0, /* func start addr.  */
   1617  1.1.1.11  christos 				      plt0_entry_size,
   1618  1.1.1.11  christos 				      func_info,
   1619  1.1.1.12  christos 				      0, /* func_info2.  */
   1620  1.1.1.11  christos 				      0, /* Rep block size.  */
   1621  1.1.1.11  christos 				      0 /* Num FREs.  */);
   1622  1.1.1.11  christos       sframe_frame_row_entry plt0_fre;
   1623  1.1.1.11  christos       unsigned int num_plt0_fres = htab->sframe_plt->plt0_num_fres;
   1624  1.1.1.11  christos       for (unsigned int j = 0; j < num_plt0_fres; j++)
   1625  1.1.1.11  christos 	{
   1626  1.1.1.11  christos 	  plt0_fre = *(htab->sframe_plt->plt0_fres[j]);
   1627  1.1.1.11  christos 	  sframe_encoder_add_fre (*ectx, 0, &plt0_fre);
   1628  1.1.1.11  christos 	}
   1629  1.1.1.11  christos     }
   1630  1.1.1.11  christos 
   1631  1.1.1.11  christos   if (num_pltn_entries)
   1632  1.1.1.11  christos     {
   1633  1.1.1.11  christos       /* PLTn entries use an SFrame FDE of type
   1634  1.1.1.12  christos 	 SFRAME_V3_FDE_PCTYPE_MASK to exploit the repetitive
   1635  1.1.1.11  christos 	 pattern of the instructions in these entries.  Using this SFrame FDE
   1636  1.1.1.11  christos 	 type helps in keeping the SFrame stack trace info for PLTn entries
   1637  1.1.1.11  christos 	 compact.  */
   1638  1.1.1.12  christos       func_info = sframe_fde_create_func_info (fre_type,
   1639  1.1.1.12  christos 					       SFRAME_V3_FDE_PCTYPE_MASK);
   1640  1.1.1.11  christos       /* Add the SFrame FDE for all PCs starting at the first PLTn entry (hence,
   1641  1.1.1.11  christos 	 function start address = plt0_entry_size.  As usual, this will be
   1642  1.1.1.11  christos 	 updated later at _bfd_elf_merge_section_sframe, by when the
   1643  1.1.1.11  christos 	 sections are relocated.  */
   1644  1.1.1.12  christos       sframe_encoder_add_funcdesc_v3 (*ectx,
   1645  1.1.1.11  christos 				      plt0_entry_size, /* func start addr.  */
   1646  1.1.1.11  christos 				      dpltsec->size - plt0_entry_size,
   1647  1.1.1.11  christos 				      func_info,
   1648  1.1.1.12  christos 				      0, /* func_info2.  */
   1649  1.1.1.11  christos 				      plt_entry_size,
   1650  1.1.1.11  christos 				      0 /* Num FREs.  */);
   1651  1.1.1.11  christos 
   1652  1.1.1.11  christos       sframe_frame_row_entry pltn_fre;
   1653  1.1.1.11  christos       /* Now add the FREs for PLTn.  Simply adding the FREs suffices due
   1654  1.1.1.12  christos 	 to the usage of SFRAME_V3_FDE_PCTYPE_MASK above.  */
   1655  1.1.1.11  christos       for (unsigned int j = 0; j < num_pltn_fres; j++)
   1656  1.1.1.11  christos 	{
   1657  1.1.1.11  christos 	  unsigned int func_idx = plt0_entry_size ? 1 : 0;
   1658  1.1.1.11  christos 	  pltn_fre = *(pltn_fres[j]);
   1659  1.1.1.11  christos 	  sframe_encoder_add_fre (*ectx, func_idx, &pltn_fre);
   1660  1.1.1.11  christos 	}
   1661  1.1.1.11  christos     }
   1662  1.1.1.11  christos 
   1663  1.1.1.11  christos   return true;
   1664  1.1.1.11  christos }
   1665  1.1.1.11  christos 
   1666  1.1.1.11  christos /* Write contents of the .sframe section.  */
   1667  1.1.1.11  christos 
   1668  1.1.1.11  christos static bool
   1669  1.1.1.11  christos _bfd_s390_elf_write_sframe_plt (struct bfd_link_info *info)
   1670  1.1.1.11  christos {
   1671  1.1.1.11  christos   struct elf_s390_link_hash_table *htab;
   1672  1.1.1.11  christos   sframe_encoder_ctx *ectx;
   1673  1.1.1.11  christos   size_t sec_size;
   1674  1.1.1.11  christos   asection *sec;
   1675  1.1.1.11  christos   bfd *dynobj;
   1676  1.1.1.11  christos 
   1677  1.1.1.11  christos   int err = 0;
   1678  1.1.1.11  christos 
   1679  1.1.1.11  christos   htab = elf_s390_hash_table (info);
   1680  1.1.1.11  christos   dynobj = htab->elf.dynobj;
   1681  1.1.1.11  christos 
   1682  1.1.1.11  christos   ectx = htab->plt_cfe_ctx;
   1683  1.1.1.11  christos   sec = htab->plt_sframe;
   1684  1.1.1.11  christos 
   1685  1.1.1.11  christos   BFD_ASSERT (ectx);
   1686  1.1.1.11  christos 
   1687  1.1.1.12  christos   void *contents = sframe_encoder_write (ectx, &sec_size, false, &err);
   1688  1.1.1.11  christos 
   1689  1.1.1.11  christos   sec->size = (bfd_size_type) sec_size;
   1690  1.1.1.11  christos   sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
   1691  1.1.1.11  christos   sec->alloced = 1;
   1692  1.1.1.11  christos   memcpy (sec->contents, contents, sec_size);
   1693  1.1.1.11  christos 
   1694  1.1.1.11  christos   sframe_encoder_free (&ectx);
   1695  1.1.1.11  christos 
   1696  1.1.1.11  christos   return true;
   1697  1.1.1.11  christos }
   1698  1.1.1.11  christos 
   1699       1.1     skrll /* Allocate space in .plt, .got and associated reloc sections for
   1700       1.1     skrll    dynamic relocs.  */
   1701       1.1     skrll 
   1702   1.1.1.9  christos static bool
   1703   1.1.1.2  christos allocate_dynrelocs (struct elf_link_hash_entry *h,
   1704   1.1.1.2  christos 		    void * inf)
   1705       1.1     skrll {
   1706       1.1     skrll   struct bfd_link_info *info;
   1707       1.1     skrll   struct elf_s390_link_hash_table *htab;
   1708   1.1.1.3  christos   struct elf_dyn_relocs *p;
   1709       1.1     skrll 
   1710       1.1     skrll   if (h->root.type == bfd_link_hash_indirect)
   1711   1.1.1.9  christos     return true;
   1712       1.1     skrll 
   1713       1.1     skrll   info = (struct bfd_link_info *) inf;
   1714       1.1     skrll   htab = elf_s390_hash_table (info);
   1715   1.1.1.2  christos   if (htab == NULL)
   1716   1.1.1.9  christos     return false;
   1717       1.1     skrll 
   1718   1.1.1.3  christos   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
   1719   1.1.1.3  christos      here if it is defined and referenced in a non-shared object.  */
   1720   1.1.1.3  christos   if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   1721   1.1.1.4  christos     return s390_elf_allocate_ifunc_dyn_relocs (info, h);
   1722   1.1.1.3  christos   else if (htab->elf.dynamic_sections_created
   1723   1.1.1.3  christos 	   && h->plt.refcount > 0)
   1724       1.1     skrll     {
   1725       1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   1726       1.1     skrll 	 Undefined weak syms won't yet be marked as dynamic.  */
   1727       1.1     skrll       if (h->dynindx == -1
   1728       1.1     skrll 	  && !h->forced_local)
   1729       1.1     skrll 	{
   1730       1.1     skrll 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1731   1.1.1.9  christos 	    return false;
   1732       1.1     skrll 	}
   1733       1.1     skrll 
   1734   1.1.1.4  christos       if (bfd_link_pic (info)
   1735       1.1     skrll 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
   1736       1.1     skrll 	{
   1737   1.1.1.3  christos 	  asection *s = htab->elf.splt;
   1738       1.1     skrll 
   1739       1.1     skrll 	  /* If this is the first .plt entry, make room for the special
   1740       1.1     skrll 	     first entry.  */
   1741       1.1     skrll 	  if (s->size == 0)
   1742       1.1     skrll 	    s->size += PLT_FIRST_ENTRY_SIZE;
   1743       1.1     skrll 
   1744       1.1     skrll 	  h->plt.offset = s->size;
   1745       1.1     skrll 
   1746       1.1     skrll 	  /* If this symbol is not defined in a regular file, and we are
   1747       1.1     skrll 	     not generating a shared library, then set the symbol to this
   1748       1.1     skrll 	     location in the .plt.  This is required to make function
   1749       1.1     skrll 	     pointers compare as equal between the normal executable and
   1750       1.1     skrll 	     the shared library.  */
   1751   1.1.1.4  christos 	  if (! bfd_link_pic (info)
   1752       1.1     skrll 	      && !h->def_regular)
   1753       1.1     skrll 	    {
   1754       1.1     skrll 	      h->root.u.def.section = s;
   1755       1.1     skrll 	      h->root.u.def.value = h->plt.offset;
   1756       1.1     skrll 	    }
   1757       1.1     skrll 
   1758       1.1     skrll 	  /* Make room for this entry.  */
   1759       1.1     skrll 	  s->size += PLT_ENTRY_SIZE;
   1760       1.1     skrll 
   1761   1.1.1.8  christos 	  /* We also need to make an entry in the .got.plt section.  */
   1762   1.1.1.3  christos 	  htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
   1763       1.1     skrll 
   1764       1.1     skrll 	  /* We also need to make an entry in the .rela.plt section.  */
   1765   1.1.1.3  christos 	  htab->elf.srelplt->size += sizeof (Elf64_External_Rela);
   1766       1.1     skrll 	}
   1767       1.1     skrll       else
   1768       1.1     skrll 	{
   1769       1.1     skrll 	  h->plt.offset = (bfd_vma) -1;
   1770       1.1     skrll 	  h->needs_plt = 0;
   1771       1.1     skrll 	  elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1772       1.1     skrll 	}
   1773       1.1     skrll     }
   1774       1.1     skrll   else
   1775       1.1     skrll     {
   1776       1.1     skrll       h->plt.offset = (bfd_vma) -1;
   1777       1.1     skrll       h->needs_plt = 0;
   1778       1.1     skrll       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
   1779       1.1     skrll     }
   1780       1.1     skrll 
   1781  1.1.1.12  christos   /* If R_390_TLS_{IE64,GOTIE64,GOTIE12,GOTIE20,IEENT} symbol is now local to
   1782       1.1     skrll      the binary, we can optimize a bit. IE64 and GOTIE64 get converted
   1783  1.1.1.12  christos      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12, GOTIE20, and IEENT
   1784       1.1     skrll      we can save the dynamic TLS relocation.  */
   1785       1.1     skrll   if (h->got.refcount > 0
   1786   1.1.1.9  christos       && !bfd_link_dll (info)
   1787       1.1     skrll       && h->dynindx == -1
   1788       1.1     skrll       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
   1789       1.1     skrll     {
   1790       1.1     skrll       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
   1791       1.1     skrll 	/* For the GOTIE access without a literal pool entry the offset has
   1792       1.1     skrll 	   to be stored somewhere. The immediate value in the instruction
   1793       1.1     skrll 	   is not bit enough so the value is stored in the got.  */
   1794       1.1     skrll 	{
   1795   1.1.1.3  christos 	  h->got.offset = htab->elf.sgot->size;
   1796   1.1.1.3  christos 	  htab->elf.sgot->size += GOT_ENTRY_SIZE;
   1797       1.1     skrll 	}
   1798       1.1     skrll       else
   1799       1.1     skrll 	h->got.offset = (bfd_vma) -1;
   1800       1.1     skrll     }
   1801       1.1     skrll   else if (h->got.refcount > 0)
   1802       1.1     skrll     {
   1803       1.1     skrll       asection *s;
   1804   1.1.1.9  christos       bool dyn;
   1805       1.1     skrll       int tls_type = elf_s390_hash_entry(h)->tls_type;
   1806       1.1     skrll 
   1807       1.1     skrll       /* Make sure this symbol is output as a dynamic symbol.
   1808       1.1     skrll 	 Undefined weak syms won't yet be marked as dynamic.  */
   1809       1.1     skrll       if (h->dynindx == -1
   1810       1.1     skrll 	  && !h->forced_local)
   1811       1.1     skrll 	{
   1812       1.1     skrll 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1813   1.1.1.9  christos 	    return false;
   1814       1.1     skrll 	}
   1815       1.1     skrll 
   1816   1.1.1.3  christos       s = htab->elf.sgot;
   1817       1.1     skrll       h->got.offset = s->size;
   1818       1.1     skrll       s->size += GOT_ENTRY_SIZE;
   1819       1.1     skrll       /* R_390_TLS_GD64 needs 2 consecutive GOT slots.  */
   1820       1.1     skrll       if (tls_type == GOT_TLS_GD)
   1821       1.1     skrll 	s->size += GOT_ENTRY_SIZE;
   1822       1.1     skrll       dyn = htab->elf.dynamic_sections_created;
   1823       1.1     skrll       /* R_390_TLS_IE64 needs one dynamic relocation,
   1824       1.1     skrll 	 R_390_TLS_GD64 needs one if local symbol and two if global.  */
   1825       1.1     skrll       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
   1826       1.1     skrll 	  || tls_type >= GOT_TLS_IE)
   1827   1.1.1.3  christos 	htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   1828       1.1     skrll       else if (tls_type == GOT_TLS_GD)
   1829   1.1.1.3  christos 	htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela);
   1830   1.1.1.6  christos       else if (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)
   1831   1.1.1.4  christos 	       && (bfd_link_pic (info)
   1832       1.1     skrll 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
   1833   1.1.1.3  christos 	htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   1834       1.1     skrll     }
   1835       1.1     skrll   else
   1836       1.1     skrll     h->got.offset = (bfd_vma) -1;
   1837       1.1     skrll 
   1838   1.1.1.9  christos   if (h->dyn_relocs == NULL)
   1839   1.1.1.9  christos     return true;
   1840       1.1     skrll 
   1841       1.1     skrll   /* In the shared -Bsymbolic case, discard space allocated for
   1842       1.1     skrll      dynamic pc-relative relocs against symbols which turn out to be
   1843       1.1     skrll      defined in regular objects.  For the normal shared case, discard
   1844       1.1     skrll      space for pc-relative relocs that have become local due to symbol
   1845       1.1     skrll      visibility changes.  */
   1846       1.1     skrll 
   1847   1.1.1.4  christos   if (bfd_link_pic (info))
   1848       1.1     skrll     {
   1849   1.1.1.2  christos       if (SYMBOL_CALLS_LOCAL (info, h))
   1850       1.1     skrll 	{
   1851   1.1.1.3  christos 	  struct elf_dyn_relocs **pp;
   1852       1.1     skrll 
   1853   1.1.1.9  christos 	  for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
   1854       1.1     skrll 	    {
   1855       1.1     skrll 	      p->count -= p->pc_count;
   1856       1.1     skrll 	      p->pc_count = 0;
   1857       1.1     skrll 	      if (p->count == 0)
   1858       1.1     skrll 		*pp = p->next;
   1859       1.1     skrll 	      else
   1860       1.1     skrll 		pp = &p->next;
   1861       1.1     skrll 	    }
   1862       1.1     skrll 	}
   1863       1.1     skrll 
   1864       1.1     skrll       /* Also discard relocs on undefined weak syms with non-default
   1865       1.1     skrll 	 visibility.  */
   1866   1.1.1.9  christos       if (h->dyn_relocs != NULL
   1867       1.1     skrll 	  && h->root.type == bfd_link_hash_undefweak)
   1868       1.1     skrll 	{
   1869   1.1.1.6  christos 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   1870   1.1.1.6  christos 	      || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
   1871   1.1.1.9  christos 	    h->dyn_relocs = NULL;
   1872       1.1     skrll 
   1873       1.1     skrll 	  /* Make sure undefined weak symbols are output as a dynamic
   1874       1.1     skrll 	     symbol in PIEs.  */
   1875       1.1     skrll 	  else if (h->dynindx == -1
   1876       1.1     skrll 		   && !h->forced_local)
   1877       1.1     skrll 	    {
   1878       1.1     skrll 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1879   1.1.1.9  christos 		return false;
   1880       1.1     skrll 	    }
   1881       1.1     skrll 	}
   1882       1.1     skrll     }
   1883       1.1     skrll   else if (ELIMINATE_COPY_RELOCS)
   1884       1.1     skrll     {
   1885       1.1     skrll       /* For the non-shared case, discard space for relocs against
   1886       1.1     skrll 	 symbols which turn out to need copy relocs or are not
   1887       1.1     skrll 	 dynamic.  */
   1888       1.1     skrll 
   1889       1.1     skrll       if (!h->non_got_ref
   1890       1.1     skrll 	  && ((h->def_dynamic
   1891       1.1     skrll 	       && !h->def_regular)
   1892       1.1     skrll 	      || (htab->elf.dynamic_sections_created
   1893       1.1     skrll 		  && (h->root.type == bfd_link_hash_undefweak
   1894       1.1     skrll 		      || h->root.type == bfd_link_hash_undefined))))
   1895       1.1     skrll 	{
   1896       1.1     skrll 	  /* Make sure this symbol is output as a dynamic symbol.
   1897       1.1     skrll 	     Undefined weak syms won't yet be marked as dynamic.  */
   1898       1.1     skrll 	  if (h->dynindx == -1
   1899       1.1     skrll 	      && !h->forced_local)
   1900       1.1     skrll 	    {
   1901       1.1     skrll 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   1902   1.1.1.9  christos 		return false;
   1903       1.1     skrll 	    }
   1904       1.1     skrll 
   1905       1.1     skrll 	  /* If that succeeded, we know we'll be keeping all the
   1906       1.1     skrll 	     relocs.  */
   1907       1.1     skrll 	  if (h->dynindx != -1)
   1908       1.1     skrll 	    goto keep;
   1909       1.1     skrll 	}
   1910       1.1     skrll 
   1911   1.1.1.9  christos       h->dyn_relocs = NULL;
   1912       1.1     skrll 
   1913       1.1     skrll     keep: ;
   1914       1.1     skrll     }
   1915       1.1     skrll 
   1916       1.1     skrll   /* Finally, allocate space.  */
   1917   1.1.1.9  christos   for (p = h->dyn_relocs; p != NULL; p = p->next)
   1918       1.1     skrll     {
   1919       1.1     skrll       asection *sreloc = elf_section_data (p->sec)->sreloc;
   1920       1.1     skrll       sreloc->size += p->count * sizeof (Elf64_External_Rela);
   1921       1.1     skrll     }
   1922       1.1     skrll 
   1923   1.1.1.9  christos   return true;
   1924       1.1     skrll }
   1925       1.1     skrll 
   1926       1.1     skrll /* Set the sizes of the dynamic sections.  */
   1927       1.1     skrll 
   1928   1.1.1.9  christos static bool
   1929  1.1.1.11  christos elf_s390_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   1930  1.1.1.11  christos 			     struct bfd_link_info *info)
   1931       1.1     skrll {
   1932       1.1     skrll   struct elf_s390_link_hash_table *htab;
   1933       1.1     skrll   bfd *dynobj;
   1934       1.1     skrll   asection *s;
   1935   1.1.1.9  christos   bool relocs;
   1936       1.1     skrll   bfd *ibfd;
   1937       1.1     skrll 
   1938       1.1     skrll   htab = elf_s390_hash_table (info);
   1939   1.1.1.2  christos   if (htab == NULL)
   1940   1.1.1.9  christos     return false;
   1941   1.1.1.2  christos 
   1942       1.1     skrll   dynobj = htab->elf.dynobj;
   1943       1.1     skrll   if (dynobj == NULL)
   1944  1.1.1.11  christos     return true;
   1945       1.1     skrll 
   1946       1.1     skrll   if (htab->elf.dynamic_sections_created)
   1947       1.1     skrll     {
   1948       1.1     skrll       /* Set the contents of the .interp section to the interpreter.  */
   1949   1.1.1.4  christos       if (bfd_link_executable (info) && !info->nointerp)
   1950       1.1     skrll 	{
   1951  1.1.1.12  christos 	  s = htab->elf.interp;
   1952       1.1     skrll 	  if (s == NULL)
   1953       1.1     skrll 	    abort ();
   1954       1.1     skrll 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   1955       1.1     skrll 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   1956  1.1.1.11  christos 	  s->alloced = 1;
   1957       1.1     skrll 	}
   1958       1.1     skrll     }
   1959       1.1     skrll 
   1960   1.1.1.8  christos   if (htab->elf.sgot && s390_gotplt_after_got_p (info))
   1961   1.1.1.8  christos     {
   1962   1.1.1.8  christos       /* _bfd_elf_create_got_section adds the got header size always
   1963   1.1.1.8  christos 	 to .got.plt but we need it in .got if this section comes
   1964   1.1.1.8  christos 	 first.  */
   1965   1.1.1.8  christos       htab->elf.sgot->size += 3 * GOT_ENTRY_SIZE;
   1966   1.1.1.8  christos       htab->elf.sgotplt->size -= 3 * GOT_ENTRY_SIZE;
   1967   1.1.1.8  christos 
   1968   1.1.1.8  christos       /* Make the _GLOBAL_OFFSET_TABLE_ symbol point to the .got
   1969   1.1.1.8  christos 	 instead of .got.plt.  */
   1970   1.1.1.8  christos       htab->elf.hgot->root.u.def.section = htab->elf.sgot;
   1971   1.1.1.8  christos       htab->elf.hgot->root.u.def.value = 0;
   1972   1.1.1.8  christos     }
   1973   1.1.1.8  christos 
   1974       1.1     skrll   /* Set up .got offsets for local syms, and space for local dynamic
   1975       1.1     skrll      relocs.  */
   1976   1.1.1.4  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   1977       1.1     skrll     {
   1978       1.1     skrll       bfd_signed_vma *local_got;
   1979       1.1     skrll       bfd_signed_vma *end_local_got;
   1980       1.1     skrll       char *local_tls_type;
   1981       1.1     skrll       bfd_size_type locsymcount;
   1982       1.1     skrll       Elf_Internal_Shdr *symtab_hdr;
   1983       1.1     skrll       asection *srela;
   1984   1.1.1.3  christos       struct plt_entry *local_plt;
   1985   1.1.1.3  christos       unsigned int i;
   1986       1.1     skrll 
   1987       1.1     skrll       if (! is_s390_elf (ibfd))
   1988       1.1     skrll 	continue;
   1989       1.1     skrll 
   1990       1.1     skrll       for (s = ibfd->sections; s != NULL; s = s->next)
   1991       1.1     skrll 	{
   1992   1.1.1.3  christos 	  struct elf_dyn_relocs *p;
   1993       1.1     skrll 
   1994       1.1     skrll 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   1995       1.1     skrll 	    {
   1996       1.1     skrll 	      if (!bfd_is_abs_section (p->sec)
   1997       1.1     skrll 		  && bfd_is_abs_section (p->sec->output_section))
   1998       1.1     skrll 		{
   1999       1.1     skrll 		  /* Input section has been discarded, either because
   2000       1.1     skrll 		     it is a copy of a linkonce section or due to
   2001       1.1     skrll 		     linker script /DISCARD/, so we'll be discarding
   2002       1.1     skrll 		     the relocs too.  */
   2003       1.1     skrll 		}
   2004       1.1     skrll 	      else if (p->count != 0)
   2005       1.1     skrll 		{
   2006       1.1     skrll 		  srela = elf_section_data (p->sec)->sreloc;
   2007       1.1     skrll 		  srela->size += p->count * sizeof (Elf64_External_Rela);
   2008       1.1     skrll 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2009       1.1     skrll 		    info->flags |= DF_TEXTREL;
   2010       1.1     skrll 		}
   2011       1.1     skrll 	    }
   2012       1.1     skrll 	}
   2013       1.1     skrll 
   2014       1.1     skrll       local_got = elf_local_got_refcounts (ibfd);
   2015       1.1     skrll       if (!local_got)
   2016       1.1     skrll 	continue;
   2017       1.1     skrll 
   2018       1.1     skrll       symtab_hdr = &elf_symtab_hdr (ibfd);
   2019       1.1     skrll       locsymcount = symtab_hdr->sh_info;
   2020       1.1     skrll       end_local_got = local_got + locsymcount;
   2021       1.1     skrll       local_tls_type = elf_s390_local_got_tls_type (ibfd);
   2022   1.1.1.3  christos       s = htab->elf.sgot;
   2023   1.1.1.3  christos       srela = htab->elf.srelgot;
   2024       1.1     skrll       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   2025       1.1     skrll 	{
   2026       1.1     skrll 	  if (*local_got > 0)
   2027       1.1     skrll 	    {
   2028       1.1     skrll 	      *local_got = s->size;
   2029       1.1     skrll 	      s->size += GOT_ENTRY_SIZE;
   2030       1.1     skrll 	      if (*local_tls_type == GOT_TLS_GD)
   2031       1.1     skrll 		s->size += GOT_ENTRY_SIZE;
   2032   1.1.1.4  christos 	      if (bfd_link_pic (info))
   2033       1.1     skrll 		srela->size += sizeof (Elf64_External_Rela);
   2034       1.1     skrll 	    }
   2035       1.1     skrll 	  else
   2036       1.1     skrll 	    *local_got = (bfd_vma) -1;
   2037       1.1     skrll 	}
   2038   1.1.1.3  christos 
   2039   1.1.1.3  christos       local_plt = elf_s390_local_plt (ibfd);
   2040   1.1.1.3  christos       for (i = 0; i < symtab_hdr->sh_info; i++)
   2041   1.1.1.3  christos 	{
   2042   1.1.1.3  christos 	  if (local_plt[i].plt.refcount > 0)
   2043   1.1.1.3  christos 	    {
   2044   1.1.1.3  christos 	      local_plt[i].plt.offset = htab->elf.iplt->size;
   2045   1.1.1.3  christos 	      htab->elf.iplt->size += PLT_ENTRY_SIZE;
   2046   1.1.1.3  christos 	      htab->elf.igotplt->size += GOT_ENTRY_SIZE;
   2047   1.1.1.3  christos 	      htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
   2048   1.1.1.3  christos 	    }
   2049   1.1.1.3  christos 	  else
   2050   1.1.1.3  christos 	    local_plt[i].plt.offset = (bfd_vma) -1;
   2051   1.1.1.3  christos 	}
   2052       1.1     skrll     }
   2053       1.1     skrll 
   2054       1.1     skrll   if (htab->tls_ldm_got.refcount > 0)
   2055       1.1     skrll     {
   2056       1.1     skrll       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM64
   2057       1.1     skrll 	 relocs.  */
   2058   1.1.1.3  christos       htab->tls_ldm_got.offset = htab->elf.sgot->size;
   2059   1.1.1.3  christos       htab->elf.sgot->size += 2 * GOT_ENTRY_SIZE;
   2060   1.1.1.3  christos       htab->elf.srelgot->size += sizeof (Elf64_External_Rela);
   2061       1.1     skrll     }
   2062       1.1     skrll   else
   2063       1.1     skrll     htab->tls_ldm_got.offset = -1;
   2064       1.1     skrll 
   2065       1.1     skrll   /* Allocate global sym .plt and .got entries, and space for global
   2066       1.1     skrll      sym dynamic relocs.  */
   2067   1.1.1.3  christos   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
   2068       1.1     skrll 
   2069  1.1.1.11  christos   if (_bfd_elf_eh_frame_present (info))
   2070  1.1.1.11  christos     {
   2071  1.1.1.11  christos       if (htab->plt_eh_frame != NULL
   2072  1.1.1.11  christos 	  && htab->elf.splt != NULL
   2073  1.1.1.11  christos 	  && htab->elf.splt->size != 0
   2074  1.1.1.11  christos 	  && !bfd_is_abs_section (htab->elf.splt->output_section))
   2075  1.1.1.11  christos 	htab->plt_eh_frame->size = sizeof (elf_s390x_eh_frame_plt);
   2076  1.1.1.11  christos     }
   2077  1.1.1.11  christos 
   2078  1.1.1.11  christos   /* No need to size the .sframe section explicitly because the write-out
   2079  1.1.1.11  christos      mechanism is different.  Simply prep up the FDE/FRE for the
   2080  1.1.1.11  christos      .plt section.  */
   2081  1.1.1.11  christos   if (_bfd_elf_sframe_present (info))
   2082  1.1.1.11  christos     {
   2083  1.1.1.11  christos       if (htab->plt_sframe != NULL
   2084  1.1.1.11  christos 	  && htab->elf.splt != NULL
   2085  1.1.1.11  christos 	  && htab->elf.splt->size != 0
   2086  1.1.1.11  christos 	  && !bfd_is_abs_section (htab->elf.splt->output_section))
   2087  1.1.1.11  christos 	{
   2088  1.1.1.11  christos 	  _bfd_s390_elf_create_sframe_plt (info);
   2089  1.1.1.11  christos 	  /* FIXME - Dirty Hack.  Set the size to something non-zero for now,
   2090  1.1.1.11  christos 	     so that the section does not get stripped out below.  The precise
   2091  1.1.1.11  christos 	     size of this section is known only when the contents are
   2092  1.1.1.11  christos 	     serialized in _bfd_s390x_elf_write_sframe_plt.  */
   2093  1.1.1.11  christos 	  htab->plt_sframe->size = sizeof (sframe_header) + 1;
   2094  1.1.1.11  christos 	}
   2095  1.1.1.11  christos     }
   2096  1.1.1.11  christos 
   2097       1.1     skrll   /* We now have determined the sizes of the various dynamic sections.
   2098       1.1     skrll      Allocate memory for them.  */
   2099   1.1.1.9  christos   relocs = false;
   2100       1.1     skrll   for (s = dynobj->sections; s != NULL; s = s->next)
   2101       1.1     skrll     {
   2102       1.1     skrll       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2103       1.1     skrll 	continue;
   2104       1.1     skrll 
   2105   1.1.1.3  christos       if (s == htab->elf.splt
   2106   1.1.1.3  christos 	  || s == htab->elf.sgot
   2107   1.1.1.3  christos 	  || s == htab->elf.sgotplt
   2108  1.1.1.11  christos 	  || s == htab->plt_eh_frame
   2109  1.1.1.11  christos 	  || s == htab->plt_sframe
   2110   1.1.1.6  christos 	  || s == htab->elf.sdynbss
   2111   1.1.1.6  christos 	  || s == htab->elf.sdynrelro
   2112   1.1.1.3  christos 	  || s == htab->elf.iplt
   2113   1.1.1.3  christos 	  || s == htab->elf.igotplt
   2114   1.1.1.3  christos 	  || s == htab->irelifunc)
   2115       1.1     skrll 	{
   2116       1.1     skrll 	  /* Strip this section if we don't need it; see the
   2117       1.1     skrll 	     comment below.  */
   2118       1.1     skrll 	}
   2119   1.1.1.9  christos       else if (startswith (bfd_section_name (s), ".rela"))
   2120       1.1     skrll 	{
   2121   1.1.1.3  christos 	  if (s->size != 0 && s != htab->elf.srelplt)
   2122   1.1.1.9  christos 	    {
   2123   1.1.1.9  christos 	      relocs = true;
   2124   1.1.1.9  christos 	      if (s == htab->elf.irelplt)
   2125   1.1.1.9  christos 		{
   2126   1.1.1.9  christos 		  /* In static-pie case, there are IRELATIVE-relocs in
   2127   1.1.1.9  christos 		     .rela.iplt (htab->irelplt), which will later be grouped
   2128   1.1.1.9  christos 		     to .rela.plt.  On s390, the IRELATIVE relocations are
   2129   1.1.1.9  christos 		     always located in .rela.iplt - even for non-static case.
   2130   1.1.1.9  christos 		     Ensure that DT_JMPREL, DT_PLTRELA, DT_PLTRELASZ is added
   2131   1.1.1.9  christos 		     to the dynamic section even if htab->srelplt->size == 0.
   2132   1.1.1.9  christos 		     See _bfd_elf_add_dynamic_tags in bfd/elflink.c.  */
   2133   1.1.1.9  christos 		  htab->elf.dt_jmprel_required = true;
   2134   1.1.1.9  christos 		}
   2135   1.1.1.9  christos 	    }
   2136       1.1     skrll 
   2137       1.1     skrll 	  /* We use the reloc_count field as a counter if we need
   2138       1.1     skrll 	     to copy relocs into the output file.  */
   2139       1.1     skrll 	  s->reloc_count = 0;
   2140       1.1     skrll 	}
   2141       1.1     skrll       else
   2142       1.1     skrll 	{
   2143       1.1     skrll 	  /* It's not one of our sections, so don't allocate space.  */
   2144       1.1     skrll 	  continue;
   2145       1.1     skrll 	}
   2146       1.1     skrll 
   2147       1.1     skrll       if (s->size == 0)
   2148       1.1     skrll 	{
   2149       1.1     skrll 	  /* If we don't need this section, strip it from the
   2150       1.1     skrll 	     output file.  This is to handle .rela.bss and
   2151       1.1     skrll 	     .rela.plt.  We must create it in
   2152       1.1     skrll 	     create_dynamic_sections, because it must be created
   2153       1.1     skrll 	     before the linker maps input sections to output
   2154       1.1     skrll 	     sections.  The linker does that before
   2155       1.1     skrll 	     adjust_dynamic_symbol is called, and it is that
   2156       1.1     skrll 	     function which decides whether anything needs to go
   2157       1.1     skrll 	     into these sections.  */
   2158       1.1     skrll 
   2159       1.1     skrll 	  s->flags |= SEC_EXCLUDE;
   2160       1.1     skrll 	  continue;
   2161       1.1     skrll 	}
   2162       1.1     skrll 
   2163       1.1     skrll       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2164       1.1     skrll 	continue;
   2165       1.1     skrll 
   2166  1.1.1.11  christos       /* Skip allocating contents for .sframe section as it is written
   2167  1.1.1.11  christos 	 out differently.  See below.  */
   2168  1.1.1.11  christos       if (s == htab->plt_sframe)
   2169  1.1.1.11  christos 	continue;
   2170  1.1.1.11  christos 
   2171       1.1     skrll       /* Allocate memory for the section contents.  We use bfd_zalloc
   2172       1.1     skrll 	 here in case unused entries are not reclaimed before the
   2173       1.1     skrll 	 section's contents are written out.  This should not happen,
   2174       1.1     skrll 	 but this way if it does, we get a R_390_NONE reloc instead
   2175       1.1     skrll 	 of garbage.  */
   2176       1.1     skrll       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2177       1.1     skrll       if (s->contents == NULL)
   2178   1.1.1.9  christos 	return false;
   2179  1.1.1.11  christos       s->alloced = 1;
   2180  1.1.1.11  christos     }
   2181  1.1.1.11  christos 
   2182  1.1.1.11  christos   if (htab->plt_eh_frame != NULL
   2183  1.1.1.11  christos       && htab->plt_eh_frame->contents != NULL)
   2184  1.1.1.11  christos     {
   2185  1.1.1.11  christos       memcpy (htab->plt_eh_frame->contents,
   2186  1.1.1.11  christos 	      elf_s390x_eh_frame_plt,
   2187  1.1.1.11  christos 	      htab->plt_eh_frame->size);
   2188  1.1.1.11  christos       bfd_put_32 (dynobj, htab->elf.splt->size,
   2189  1.1.1.11  christos 		  htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
   2190  1.1.1.11  christos     }
   2191  1.1.1.11  christos 
   2192  1.1.1.11  christos   if (_bfd_elf_sframe_present (info))
   2193  1.1.1.11  christos     {
   2194  1.1.1.11  christos       if (htab->plt_sframe != NULL
   2195  1.1.1.11  christos 	  && htab->elf.splt != NULL
   2196  1.1.1.11  christos 	  && htab->elf.splt->size != 0
   2197  1.1.1.11  christos 	  && htab->plt_sframe->contents == NULL)
   2198  1.1.1.11  christos 	_bfd_s390_elf_write_sframe_plt (info);
   2199       1.1     skrll     }
   2200       1.1     skrll 
   2201   1.1.1.9  christos   return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
   2202       1.1     skrll }
   2203       1.1     skrll 
   2204       1.1     skrll /* Return the base VMA address which should be subtracted from real addresses
   2205       1.1     skrll    when resolving @dtpoff relocation.
   2206       1.1     skrll    This is PT_TLS segment p_vaddr.  */
   2207       1.1     skrll 
   2208       1.1     skrll static bfd_vma
   2209   1.1.1.3  christos dtpoff_base (struct bfd_link_info *info)
   2210       1.1     skrll {
   2211       1.1     skrll   /* If tls_sec is NULL, we should have signalled an error already.  */
   2212       1.1     skrll   if (elf_hash_table (info)->tls_sec == NULL)
   2213       1.1     skrll     return 0;
   2214       1.1     skrll   return elf_hash_table (info)->tls_sec->vma;
   2215       1.1     skrll }
   2216       1.1     skrll 
   2217       1.1     skrll /* Return the relocation value for @tpoff relocation
   2218       1.1     skrll    if STT_TLS virtual address is ADDRESS.  */
   2219       1.1     skrll 
   2220       1.1     skrll static bfd_vma
   2221   1.1.1.3  christos tpoff (struct bfd_link_info *info, bfd_vma address)
   2222       1.1     skrll {
   2223       1.1     skrll   struct elf_link_hash_table *htab = elf_hash_table (info);
   2224       1.1     skrll 
   2225       1.1     skrll   /* If tls_sec is NULL, we should have signalled an error already.  */
   2226       1.1     skrll   if (htab->tls_sec == NULL)
   2227       1.1     skrll     return 0;
   2228       1.1     skrll   return htab->tls_size + htab->tls_sec->vma - address;
   2229       1.1     skrll }
   2230       1.1     skrll 
   2231       1.1     skrll /* Complain if TLS instruction relocation is against an invalid
   2232       1.1     skrll    instruction.  */
   2233       1.1     skrll 
   2234       1.1     skrll static void
   2235   1.1.1.3  christos invalid_tls_insn (bfd *input_bfd,
   2236   1.1.1.3  christos 		  asection *input_section,
   2237   1.1.1.3  christos 		  Elf_Internal_Rela *rel)
   2238       1.1     skrll {
   2239       1.1     skrll   reloc_howto_type *howto;
   2240       1.1     skrll 
   2241       1.1     skrll   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
   2242   1.1.1.6  christos   _bfd_error_handler
   2243   1.1.1.6  christos     /* xgettext:c-format */
   2244   1.1.1.7  christos     (_("%pB(%pA+%#" PRIx64 "): invalid instruction for TLS relocation %s"),
   2245       1.1     skrll      input_bfd,
   2246       1.1     skrll      input_section,
   2247   1.1.1.7  christos      (uint64_t) rel->r_offset,
   2248       1.1     skrll      howto->name);
   2249       1.1     skrll   bfd_set_error (bfd_error_bad_value);
   2250       1.1     skrll }
   2251       1.1     skrll 
   2252       1.1     skrll /* Relocate a 390 ELF section.  */
   2253       1.1     skrll 
   2254   1.1.1.9  christos static int
   2255   1.1.1.2  christos elf_s390_relocate_section (bfd *output_bfd,
   2256   1.1.1.2  christos 			   struct bfd_link_info *info,
   2257   1.1.1.2  christos 			   bfd *input_bfd,
   2258   1.1.1.2  christos 			   asection *input_section,
   2259   1.1.1.2  christos 			   bfd_byte *contents,
   2260   1.1.1.2  christos 			   Elf_Internal_Rela *relocs,
   2261   1.1.1.2  christos 			   Elf_Internal_Sym *local_syms,
   2262   1.1.1.2  christos 			   asection **local_sections)
   2263       1.1     skrll {
   2264       1.1     skrll   struct elf_s390_link_hash_table *htab;
   2265       1.1     skrll   Elf_Internal_Shdr *symtab_hdr;
   2266       1.1     skrll   struct elf_link_hash_entry **sym_hashes;
   2267       1.1     skrll   bfd_vma *local_got_offsets;
   2268       1.1     skrll   Elf_Internal_Rela *rel;
   2269       1.1     skrll   Elf_Internal_Rela *relend;
   2270       1.1     skrll 
   2271   1.1.1.8  christos   if (!is_s390_elf (input_bfd))
   2272   1.1.1.8  christos     {
   2273   1.1.1.8  christos       bfd_set_error (bfd_error_wrong_format);
   2274   1.1.1.9  christos       return false;
   2275   1.1.1.8  christos     }
   2276       1.1     skrll 
   2277       1.1     skrll   htab = elf_s390_hash_table (info);
   2278   1.1.1.2  christos   if (htab == NULL)
   2279   1.1.1.9  christos     return false;
   2280   1.1.1.2  christos 
   2281       1.1     skrll   symtab_hdr = &elf_symtab_hdr (input_bfd);
   2282       1.1     skrll   sym_hashes = elf_sym_hashes (input_bfd);
   2283       1.1     skrll   local_got_offsets = elf_local_got_offsets (input_bfd);
   2284       1.1     skrll 
   2285       1.1     skrll   rel = relocs;
   2286       1.1     skrll   relend = relocs + input_section->reloc_count;
   2287       1.1     skrll   for (; rel < relend; rel++)
   2288       1.1     skrll     {
   2289       1.1     skrll       unsigned int r_type;
   2290       1.1     skrll       reloc_howto_type *howto;
   2291       1.1     skrll       unsigned long r_symndx;
   2292       1.1     skrll       struct elf_link_hash_entry *h;
   2293       1.1     skrll       Elf_Internal_Sym *sym;
   2294       1.1     skrll       asection *sec;
   2295       1.1     skrll       bfd_vma off;
   2296       1.1     skrll       bfd_vma relocation;
   2297   1.1.1.9  christos       bool unresolved_reloc;
   2298       1.1     skrll       bfd_reloc_status_type r;
   2299       1.1     skrll       int tls_type;
   2300   1.1.1.9  christos       bool resolved_to_zero;
   2301  1.1.1.12  christos       bool relax;
   2302       1.1     skrll 
   2303       1.1     skrll       r_type = ELF64_R_TYPE (rel->r_info);
   2304       1.1     skrll       if (r_type == (int) R_390_GNU_VTINHERIT
   2305       1.1     skrll 	  || r_type == (int) R_390_GNU_VTENTRY)
   2306       1.1     skrll 	continue;
   2307       1.1     skrll       if (r_type >= (int) R_390_max)
   2308       1.1     skrll 	{
   2309       1.1     skrll 	  bfd_set_error (bfd_error_bad_value);
   2310   1.1.1.9  christos 	  return false;
   2311       1.1     skrll 	}
   2312       1.1     skrll 
   2313       1.1     skrll       howto = elf_howto_table + r_type;
   2314       1.1     skrll       r_symndx = ELF64_R_SYM (rel->r_info);
   2315       1.1     skrll 
   2316       1.1     skrll       h = NULL;
   2317       1.1     skrll       sym = NULL;
   2318       1.1     skrll       sec = NULL;
   2319   1.1.1.9  christos       unresolved_reloc = false;
   2320       1.1     skrll       if (r_symndx < symtab_hdr->sh_info)
   2321       1.1     skrll 	{
   2322       1.1     skrll 	  sym = local_syms + r_symndx;
   2323       1.1     skrll 	  sec = local_sections[r_symndx];
   2324   1.1.1.3  christos 
   2325   1.1.1.3  christos 	  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
   2326   1.1.1.3  christos 	    {
   2327   1.1.1.3  christos 	      struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
   2328   1.1.1.3  christos 	      if (local_plt == NULL)
   2329   1.1.1.9  christos 		return false;
   2330   1.1.1.3  christos 
   2331   1.1.1.3  christos 	      /* Address of the PLT slot.  */
   2332   1.1.1.3  christos 	      relocation = (htab->elf.iplt->output_section->vma
   2333   1.1.1.3  christos 			    + htab->elf.iplt->output_offset
   2334   1.1.1.3  christos 			    + local_plt[r_symndx].plt.offset);
   2335   1.1.1.3  christos 
   2336   1.1.1.3  christos 	      switch (r_type)
   2337   1.1.1.3  christos 		{
   2338   1.1.1.4  christos 		case R_390_PLTOFF16:
   2339   1.1.1.4  christos 		case R_390_PLTOFF32:
   2340   1.1.1.4  christos 		case R_390_PLTOFF64:
   2341   1.1.1.8  christos 		  relocation -= s390_got_pointer (info);
   2342   1.1.1.4  christos 		  break;
   2343   1.1.1.3  christos 		case R_390_GOTPLT12:
   2344   1.1.1.3  christos 		case R_390_GOTPLT16:
   2345   1.1.1.3  christos 		case R_390_GOTPLT20:
   2346   1.1.1.3  christos 		case R_390_GOTPLT32:
   2347   1.1.1.3  christos 		case R_390_GOTPLT64:
   2348   1.1.1.3  christos 		case R_390_GOTPLTENT:
   2349   1.1.1.3  christos 		case R_390_GOT12:
   2350   1.1.1.3  christos 		case R_390_GOT16:
   2351   1.1.1.3  christos 		case R_390_GOT20:
   2352   1.1.1.3  christos 		case R_390_GOT32:
   2353   1.1.1.3  christos 		case R_390_GOT64:
   2354   1.1.1.3  christos 		case R_390_GOTENT:
   2355   1.1.1.3  christos 		  {
   2356   1.1.1.3  christos 		    /* Write the PLT slot address into the GOT slot.  */
   2357   1.1.1.3  christos 		    bfd_put_64 (output_bfd, relocation,
   2358   1.1.1.3  christos 				htab->elf.sgot->contents +
   2359   1.1.1.3  christos 				local_got_offsets[r_symndx]);
   2360   1.1.1.3  christos 		    relocation = (local_got_offsets[r_symndx] +
   2361   1.1.1.8  christos 				  s390_got_offset (info));
   2362   1.1.1.3  christos 
   2363   1.1.1.3  christos 		    if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
   2364   1.1.1.8  christos 		      relocation += s390_got_pointer (info);
   2365   1.1.1.3  christos 		    break;
   2366   1.1.1.3  christos 		  }
   2367   1.1.1.3  christos 		default:
   2368   1.1.1.3  christos 		  break;
   2369   1.1.1.3  christos 		}
   2370   1.1.1.3  christos 	      /* The output section is needed later in
   2371   1.1.1.3  christos 		 finish_dynamic_section when creating the dynamic
   2372   1.1.1.3  christos 		 relocation.  */
   2373   1.1.1.3  christos 	      local_plt[r_symndx].sec = sec;
   2374   1.1.1.3  christos 	      goto do_relocation;
   2375   1.1.1.3  christos 	    }
   2376   1.1.1.3  christos 	  else
   2377   1.1.1.3  christos 	    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   2378       1.1     skrll 	}
   2379       1.1     skrll       else
   2380       1.1     skrll 	{
   2381   1.1.1.9  christos 	  bool warned ATTRIBUTE_UNUSED;
   2382   1.1.1.9  christos 	  bool ignored ATTRIBUTE_UNUSED;
   2383       1.1     skrll 
   2384       1.1     skrll 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   2385       1.1     skrll 				   r_symndx, symtab_hdr, sym_hashes,
   2386       1.1     skrll 				   h, sec, relocation,
   2387   1.1.1.4  christos 				   unresolved_reloc, warned, ignored);
   2388       1.1     skrll 	}
   2389       1.1     skrll 
   2390   1.1.1.3  christos       if (sec != NULL && discarded_section (sec))
   2391   1.1.1.2  christos 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   2392  1.1.1.12  christos 					 rel, 1, relend, R_390_NONE,
   2393  1.1.1.12  christos 					 howto, 0, contents);
   2394       1.1     skrll 
   2395   1.1.1.4  christos       if (bfd_link_relocatable (info))
   2396       1.1     skrll 	continue;
   2397       1.1     skrll 
   2398   1.1.1.6  christos       resolved_to_zero = (h != NULL
   2399   1.1.1.6  christos 			  && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
   2400   1.1.1.6  christos 
   2401  1.1.1.12  christos       /* Rewrite instructions and related relocations if (1) relaxation
   2402  1.1.1.12  christos 	 disabled by default, (2) enabled by target, or (3) enabled by
   2403  1.1.1.12  christos 	 user.  Suppress rewriting if linker option --no-relax is used.  */
   2404  1.1.1.12  christos       relax = info->disable_target_specific_optimizations <= 1;
   2405  1.1.1.12  christos 
   2406       1.1     skrll       switch (r_type)
   2407       1.1     skrll 	{
   2408       1.1     skrll 	case R_390_GOTPLT12:
   2409       1.1     skrll 	case R_390_GOTPLT16:
   2410       1.1     skrll 	case R_390_GOTPLT20:
   2411       1.1     skrll 	case R_390_GOTPLT32:
   2412       1.1     skrll 	case R_390_GOTPLT64:
   2413       1.1     skrll 	case R_390_GOTPLTENT:
   2414       1.1     skrll 	  /* There are three cases for a GOTPLT relocation. 1) The
   2415       1.1     skrll 	     relocation is against the jump slot entry of a plt that
   2416       1.1     skrll 	     will get emitted to the output file. 2) The relocation
   2417       1.1     skrll 	     is against the jump slot of a plt entry that has been
   2418       1.1     skrll 	     removed. elf_s390_adjust_gotplt has created a GOT entry
   2419       1.1     skrll 	     as replacement. 3) The relocation is against a local symbol.
   2420       1.1     skrll 	     Cases 2) and 3) are the same as the GOT relocation code
   2421       1.1     skrll 	     so we just have to test for case 1 and fall through for
   2422       1.1     skrll 	     the other two.  */
   2423       1.1     skrll 	  if (h != NULL && h->plt.offset != (bfd_vma) -1)
   2424       1.1     skrll 	    {
   2425       1.1     skrll 	      bfd_vma plt_index;
   2426       1.1     skrll 
   2427   1.1.1.3  christos 	      if (s390_is_ifunc_symbol_p (h))
   2428   1.1.1.3  christos 		{
   2429   1.1.1.8  christos 		  /* Entry indices of .iplt and .igot.plt match
   2430   1.1.1.8  christos 		     1:1. No magic PLT first entry here.  */
   2431   1.1.1.3  christos 		  plt_index = h->plt.offset / PLT_ENTRY_SIZE;
   2432   1.1.1.8  christos 		  relocation = (plt_index * GOT_ENTRY_SIZE
   2433   1.1.1.8  christos 				+ s390_gotplt_offset (info)
   2434   1.1.1.8  christos 				+ htab->elf.igotplt->output_offset);
   2435   1.1.1.3  christos 		}
   2436   1.1.1.3  christos 	      else
   2437   1.1.1.3  christos 		{
   2438   1.1.1.8  christos 		  plt_index = ((h->plt.offset - PLT_FIRST_ENTRY_SIZE)
   2439   1.1.1.8  christos 			       / PLT_ENTRY_SIZE);
   2440   1.1.1.8  christos 
   2441   1.1.1.8  christos 		  relocation = (plt_index * GOT_ENTRY_SIZE
   2442   1.1.1.8  christos 				+ s390_gotplt_offset (info));
   2443   1.1.1.3  christos 		}
   2444   1.1.1.8  christos 	      if (r_type == R_390_GOTPLTENT)
   2445   1.1.1.8  christos 		relocation += s390_got_pointer (info);
   2446   1.1.1.9  christos 	      unresolved_reloc = false;
   2447       1.1     skrll 	      break;
   2448       1.1     skrll 	    }
   2449       1.1     skrll 	  /* Fall through.  */
   2450       1.1     skrll 
   2451       1.1     skrll 	case R_390_GOT12:
   2452       1.1     skrll 	case R_390_GOT16:
   2453       1.1     skrll 	case R_390_GOT20:
   2454       1.1     skrll 	case R_390_GOT32:
   2455       1.1     skrll 	case R_390_GOT64:
   2456       1.1     skrll 	case R_390_GOTENT:
   2457       1.1     skrll 	  /* Relocation is to the entry for this symbol in the global
   2458       1.1     skrll 	     offset table.  */
   2459   1.1.1.8  christos 	  if (htab->elf.sgot == NULL)
   2460       1.1     skrll 	    abort ();
   2461       1.1     skrll 
   2462       1.1     skrll 	  if (h != NULL)
   2463       1.1     skrll 	    {
   2464   1.1.1.9  christos 	      bool dyn;
   2465       1.1     skrll 
   2466       1.1     skrll 	      off = h->got.offset;
   2467       1.1     skrll 	      dyn = htab->elf.dynamic_sections_created;
   2468   1.1.1.3  christos 
   2469   1.1.1.3  christos 	      if (s390_is_ifunc_symbol_p (h))
   2470   1.1.1.3  christos 		{
   2471   1.1.1.3  christos 		  BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
   2472   1.1.1.3  christos 		  if (off == (bfd_vma)-1)
   2473   1.1.1.3  christos 		    {
   2474   1.1.1.3  christos 		      /* No explicit GOT usage so redirect to the
   2475   1.1.1.3  christos 			 got.iplt slot.  */
   2476   1.1.1.8  christos 		      relocation = (s390_gotplt_offset (info)
   2477   1.1.1.8  christos 				    + htab->elf.igotplt->output_offset
   2478   1.1.1.8  christos 				    + (h->plt.offset / PLT_ENTRY_SIZE
   2479   1.1.1.8  christos 				       * GOT_ENTRY_SIZE));
   2480   1.1.1.8  christos 
   2481   1.1.1.8  christos 		      /* For @GOTENT the relocation is against the offset between
   2482   1.1.1.8  christos 			 the instruction and the symbols entry in the GOT and not
   2483   1.1.1.8  christos 			 between the start of the GOT and the symbols entry. We
   2484   1.1.1.8  christos 			 add the vma of the GOT to get the correct value.  */
   2485   1.1.1.8  christos 		      if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
   2486   1.1.1.8  christos 			relocation += s390_got_pointer (info);
   2487   1.1.1.8  christos 
   2488   1.1.1.8  christos 		      break;
   2489   1.1.1.3  christos 		    }
   2490   1.1.1.3  christos 		  else
   2491   1.1.1.3  christos 		    {
   2492   1.1.1.3  christos 		      /* Explicit GOT slots must contain the address
   2493   1.1.1.3  christos 			 of the PLT slot. This will be handled in
   2494   1.1.1.3  christos 			 finish_dynamic_symbol.  */
   2495   1.1.1.3  christos 		    }
   2496   1.1.1.3  christos 		}
   2497   1.1.1.4  christos 	      else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   2498   1.1.1.4  christos 							  bfd_link_pic (info),
   2499   1.1.1.4  christos 							  h)
   2500  1.1.1.11  christos 		       || SYMBOL_REFERENCES_LOCAL (info, h)
   2501   1.1.1.6  christos 		       || resolved_to_zero)
   2502       1.1     skrll 		{
   2503       1.1     skrll 		  /* This is actually a static link, or it is a
   2504       1.1     skrll 		     -Bsymbolic link and the symbol is defined
   2505       1.1     skrll 		     locally, or the symbol was forced to be local
   2506       1.1     skrll 		     because of a version file.  We must initialize
   2507       1.1     skrll 		     this entry in the global offset table.  Since the
   2508       1.1     skrll 		     offset must always be a multiple of 2, we use the
   2509       1.1     skrll 		     least significant bit to record whether we have
   2510       1.1     skrll 		     initialized it already.
   2511       1.1     skrll 
   2512       1.1     skrll 		     When doing a dynamic link, we create a .rel.got
   2513       1.1     skrll 		     relocation entry to initialize the value.  This
   2514       1.1     skrll 		     is done in the finish_dynamic_symbol routine.  */
   2515       1.1     skrll 		  if ((off & 1) != 0)
   2516       1.1     skrll 		    off &= ~1;
   2517       1.1     skrll 		  else
   2518       1.1     skrll 		    {
   2519       1.1     skrll 		      bfd_put_64 (output_bfd, relocation,
   2520   1.1.1.8  christos 				  htab->elf.sgot->contents + off);
   2521       1.1     skrll 		      h->got.offset |= 1;
   2522       1.1     skrll 		    }
   2523   1.1.1.4  christos 
   2524   1.1.1.8  christos 		  /* When turning a GOT slot dereference into a direct
   2525   1.1.1.8  christos 		     reference using larl we have to make sure that
   2526   1.1.1.8  christos 		     the symbol is 1. properly aligned and 2. it is no
   2527   1.1.1.8  christos 		     ABS symbol or will become one.  */
   2528  1.1.1.12  christos 		  if (relax
   2529  1.1.1.12  christos 		      && h->def_regular
   2530  1.1.1.11  christos 		      && SYMBOL_REFERENCES_LOCAL (info, h)
   2531   1.1.1.4  christos 		      /* lgrl rx,sym@GOTENT -> larl rx, sym */
   2532   1.1.1.4  christos 		      && ((r_type == R_390_GOTENT
   2533   1.1.1.4  christos 			   && (bfd_get_16 (input_bfd,
   2534   1.1.1.4  christos 					   contents + rel->r_offset - 2)
   2535   1.1.1.4  christos 			       & 0xff0f) == 0xc408)
   2536   1.1.1.4  christos 			  /* lg rx, sym@GOT(r12) -> larl rx, sym */
   2537   1.1.1.4  christos 			  || (r_type == R_390_GOT20
   2538   1.1.1.4  christos 			      && (bfd_get_32 (input_bfd,
   2539   1.1.1.4  christos 					      contents + rel->r_offset - 2)
   2540   1.1.1.4  christos 				  & 0xff00f000) == 0xe300c000
   2541   1.1.1.4  christos 			      && bfd_get_8 (input_bfd,
   2542   1.1.1.8  christos 					    contents + rel->r_offset + 3) == 0x04))
   2543  1.1.1.11  christos 		      && !bfd_is_abs_symbol (&h->root)
   2544   1.1.1.8  christos 		      && h != htab->elf.hdynamic
   2545   1.1.1.8  christos 		      && h != htab->elf.hgot
   2546   1.1.1.8  christos 		      && h != htab->elf.hplt
   2547  1.1.1.11  christos 		      && !((h->root.u.def.value
   2548  1.1.1.11  christos 			    + sec->output_section->vma
   2549  1.1.1.11  christos 			    + sec->output_offset) & 1))
   2550   1.1.1.4  christos 		    {
   2551   1.1.1.4  christos 		      unsigned short new_insn =
   2552   1.1.1.4  christos 			(0xc000 | (bfd_get_8 (input_bfd,
   2553   1.1.1.4  christos 					      contents + rel->r_offset - 1) & 0xf0));
   2554   1.1.1.4  christos 		      bfd_put_16 (output_bfd, new_insn,
   2555   1.1.1.4  christos 				  contents + rel->r_offset - 2);
   2556   1.1.1.4  christos 		      r_type = R_390_PC32DBL;
   2557  1.1.1.12  christos 		      rel->r_info = ELF64_R_INFO (r_symndx, r_type);
   2558   1.1.1.4  christos 		      rel->r_addend = 2;
   2559   1.1.1.4  christos 		      howto = elf_howto_table + r_type;
   2560   1.1.1.4  christos 		      relocation = h->root.u.def.value
   2561   1.1.1.4  christos 			+ h->root.u.def.section->output_section->vma
   2562   1.1.1.4  christos 			+ h->root.u.def.section->output_offset;
   2563   1.1.1.4  christos 		      goto do_relocation;
   2564   1.1.1.4  christos 		    }
   2565       1.1     skrll 		}
   2566       1.1     skrll 	      else
   2567   1.1.1.9  christos 		unresolved_reloc = false;
   2568       1.1     skrll 	    }
   2569       1.1     skrll 	  else
   2570       1.1     skrll 	    {
   2571       1.1     skrll 	      if (local_got_offsets == NULL)
   2572       1.1     skrll 		abort ();
   2573       1.1     skrll 
   2574       1.1     skrll 	      off = local_got_offsets[r_symndx];
   2575       1.1     skrll 
   2576       1.1     skrll 	      /* The offset must always be a multiple of 8.  We use
   2577       1.1     skrll 		 the least significant bit to record whether we have
   2578       1.1     skrll 		 already generated the necessary reloc.  */
   2579       1.1     skrll 	      if ((off & 1) != 0)
   2580       1.1     skrll 		off &= ~1;
   2581       1.1     skrll 	      else
   2582       1.1     skrll 		{
   2583       1.1     skrll 		  bfd_put_64 (output_bfd, relocation,
   2584   1.1.1.3  christos 			      htab->elf.sgot->contents + off);
   2585       1.1     skrll 
   2586   1.1.1.4  christos 		  if (bfd_link_pic (info))
   2587       1.1     skrll 		    {
   2588       1.1     skrll 		      asection *s;
   2589       1.1     skrll 		      Elf_Internal_Rela outrel;
   2590       1.1     skrll 		      bfd_byte *loc;
   2591       1.1     skrll 
   2592   1.1.1.3  christos 		      s = htab->elf.srelgot;
   2593       1.1     skrll 		      if (s == NULL)
   2594       1.1     skrll 			abort ();
   2595       1.1     skrll 
   2596   1.1.1.3  christos 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
   2597   1.1.1.3  christos 					 + htab->elf.sgot->output_offset
   2598       1.1     skrll 					 + off);
   2599       1.1     skrll 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   2600       1.1     skrll 		      outrel.r_addend = relocation;
   2601       1.1     skrll 		      loc = s->contents;
   2602       1.1     skrll 		      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
   2603       1.1     skrll 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   2604       1.1     skrll 		    }
   2605       1.1     skrll 
   2606       1.1     skrll 		  local_got_offsets[r_symndx] |= 1;
   2607       1.1     skrll 		}
   2608       1.1     skrll 	    }
   2609       1.1     skrll 
   2610       1.1     skrll 	  if (off >= (bfd_vma) -2)
   2611       1.1     skrll 	    abort ();
   2612       1.1     skrll 
   2613   1.1.1.8  christos 	  relocation = s390_got_offset (info) + off;
   2614       1.1     skrll 
   2615       1.1     skrll 	  /* For @GOTENT the relocation is against the offset between
   2616       1.1     skrll 	     the instruction and the symbols entry in the GOT and not
   2617       1.1     skrll 	     between the start of the GOT and the symbols entry. We
   2618       1.1     skrll 	     add the vma of the GOT to get the correct value.  */
   2619       1.1     skrll 	  if (   r_type == R_390_GOTENT
   2620       1.1     skrll 	      || r_type == R_390_GOTPLTENT)
   2621   1.1.1.8  christos 	    relocation += s390_got_pointer (info);
   2622       1.1     skrll 
   2623       1.1     skrll 	  break;
   2624       1.1     skrll 
   2625       1.1     skrll 	case R_390_GOTOFF16:
   2626       1.1     skrll 	case R_390_GOTOFF32:
   2627       1.1     skrll 	case R_390_GOTOFF64:
   2628       1.1     skrll 	  /* Relocation is relative to the start of the global offset
   2629       1.1     skrll 	     table.  */
   2630       1.1     skrll 
   2631   1.1.1.4  christos 	  if (h != NULL
   2632   1.1.1.4  christos 	      && s390_is_ifunc_symbol_p (h)
   2633   1.1.1.4  christos 	      && h->def_regular
   2634   1.1.1.4  christos 	      && !bfd_link_executable (info))
   2635   1.1.1.4  christos 	    {
   2636   1.1.1.4  christos 	      relocation = (htab->elf.iplt->output_section->vma
   2637   1.1.1.4  christos 			    + htab->elf.iplt->output_offset
   2638   1.1.1.4  christos 			    + h->plt.offset
   2639   1.1.1.8  christos 			    - s390_got_pointer (info));
   2640   1.1.1.4  christos 	      goto do_relocation;
   2641   1.1.1.4  christos 	    }
   2642   1.1.1.4  christos 
   2643   1.1.1.8  christos 	  relocation -= s390_got_pointer (info);
   2644       1.1     skrll 	  break;
   2645       1.1     skrll 
   2646       1.1     skrll 	case R_390_GOTPC:
   2647       1.1     skrll 	case R_390_GOTPCDBL:
   2648       1.1     skrll 	  /* Use global offset table as symbol value.  */
   2649   1.1.1.8  christos 	  relocation = s390_got_pointer (info);
   2650   1.1.1.9  christos 	  unresolved_reloc = false;
   2651       1.1     skrll 	  break;
   2652       1.1     skrll 
   2653   1.1.1.4  christos 	case R_390_PLT12DBL:
   2654       1.1     skrll 	case R_390_PLT16DBL:
   2655   1.1.1.4  christos 	case R_390_PLT24DBL:
   2656       1.1     skrll 	case R_390_PLT32:
   2657       1.1     skrll 	case R_390_PLT32DBL:
   2658       1.1     skrll 	case R_390_PLT64:
   2659       1.1     skrll 	  /* Relocation is to the entry for this symbol in the
   2660       1.1     skrll 	     procedure linkage table.  */
   2661       1.1     skrll 
   2662       1.1     skrll 	  /* Resolve a PLT32 reloc against a local symbol directly,
   2663       1.1     skrll 	     without using the procedure linkage table.  */
   2664       1.1     skrll 	  if (h == NULL)
   2665       1.1     skrll 	    break;
   2666       1.1     skrll 
   2667       1.1     skrll 	  if (h->plt.offset == (bfd_vma) -1
   2668   1.1.1.4  christos 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
   2669       1.1     skrll 	    {
   2670       1.1     skrll 	      /* We didn't make a PLT entry for this symbol.  This
   2671       1.1     skrll 		 happens when statically linking PIC code, or when
   2672       1.1     skrll 		 using -Bsymbolic.  */
   2673  1.1.1.11  christos 
   2674  1.1.1.11  christos 	      /* Replace relative long addressing instructions of weak
   2675  1.1.1.11  christos 		 symbols, which will definitely resolve to zero, with
   2676  1.1.1.11  christos 		 either a load address of 0 or a trapping insn.
   2677  1.1.1.11  christos 		 This prevents the PLT32DBL relocation from overflowing in
   2678  1.1.1.11  christos 		 case the binary will be loaded at 4GB or more.  */
   2679  1.1.1.12  christos 	      if (relax
   2680  1.1.1.12  christos 		  && h->root.type == bfd_link_hash_undefweak
   2681  1.1.1.11  christos 		  && !h->root.linker_def
   2682  1.1.1.11  christos 		  && (bfd_link_executable (info)
   2683  1.1.1.11  christos 		      || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2684  1.1.1.11  christos 		  && r_type == R_390_PLT32DBL
   2685  1.1.1.11  christos 		  && rel->r_offset >= 2)
   2686  1.1.1.11  christos 		{
   2687  1.1.1.11  christos 		  void *insn_start = contents + rel->r_offset - 2;
   2688  1.1.1.11  christos 		  uint16_t op = bfd_get_16 (input_bfd, insn_start) & 0xff0f;
   2689  1.1.1.11  christos 		  uint8_t reg = bfd_get_8 (input_bfd, insn_start + 1) & 0xf0;
   2690  1.1.1.11  christos 
   2691  1.1.1.11  christos 		  /* NOTE: The order of the if's is important!  */
   2692  1.1.1.11  christos 		  /* Replace load address relative long (larl) with load
   2693  1.1.1.11  christos 		     address (lay) */
   2694  1.1.1.11  christos 		  if (op == 0xc000)
   2695  1.1.1.11  christos 		    {
   2696  1.1.1.11  christos 		      /* larl rX,<weak sym> -> lay rX,0(0)  */
   2697  1.1.1.11  christos 		      bfd_put_16 (output_bfd, 0xe300 | reg, insn_start);
   2698  1.1.1.11  christos 		      bfd_put_32 (output_bfd, 0x71, insn_start + 2);
   2699  1.1.1.12  christos 		      rel->r_info = ELF64_R_INFO (0, R_390_NONE);
   2700  1.1.1.12  christos 		      rel->r_addend = 0;
   2701  1.1.1.11  christos 		      continue;
   2702  1.1.1.11  christos 		    }
   2703  1.1.1.11  christos 		  /* Replace branch relative and save long (brasl) with a trap.  */
   2704  1.1.1.11  christos 		  else if (op == 0xc005)
   2705  1.1.1.11  christos 		    {
   2706  1.1.1.11  christos 		      /* brasl rX,<weak sym> -> jg .+2 (6-byte trap)  */
   2707  1.1.1.11  christos 		      bfd_put_16 (output_bfd, 0xc0f4, insn_start);
   2708  1.1.1.11  christos 		      bfd_put_32 (output_bfd, 0x1, insn_start + 2);
   2709  1.1.1.12  christos 		      rel->r_info = ELF64_R_INFO (0, R_390_NONE);
   2710  1.1.1.12  christos 		      rel->r_addend = 0;
   2711  1.1.1.11  christos 		      continue;
   2712  1.1.1.11  christos 		    }
   2713  1.1.1.11  christos 		}
   2714  1.1.1.11  christos 
   2715       1.1     skrll 	      break;
   2716       1.1     skrll 	    }
   2717   1.1.1.3  christos 	  if (s390_is_ifunc_symbol_p (h))
   2718   1.1.1.3  christos 	    relocation = (htab->elf.iplt->output_section->vma
   2719   1.1.1.3  christos 			  + htab->elf.iplt->output_offset
   2720   1.1.1.3  christos 			  + h->plt.offset);
   2721   1.1.1.3  christos 	  else
   2722   1.1.1.3  christos 	    relocation = (htab->elf.splt->output_section->vma
   2723   1.1.1.3  christos 			  + htab->elf.splt->output_offset
   2724   1.1.1.3  christos 			  + h->plt.offset);
   2725   1.1.1.9  christos 	  unresolved_reloc = false;
   2726       1.1     skrll 	  break;
   2727       1.1     skrll 
   2728       1.1     skrll 	case R_390_PLTOFF16:
   2729       1.1     skrll 	case R_390_PLTOFF32:
   2730       1.1     skrll 	case R_390_PLTOFF64:
   2731       1.1     skrll 	  /* Relocation is to the entry for this symbol in the
   2732       1.1     skrll 	     procedure linkage table relative to the start of the GOT.  */
   2733       1.1     skrll 
   2734       1.1     skrll 	  /* For local symbols or if we didn't make a PLT entry for
   2735       1.1     skrll 	     this symbol resolve the symbol directly.  */
   2736   1.1.1.4  christos 	  if (h == NULL
   2737       1.1     skrll 	      || h->plt.offset == (bfd_vma) -1
   2738   1.1.1.4  christos 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
   2739       1.1     skrll 	    {
   2740   1.1.1.8  christos 	      relocation -= s390_got_pointer (info);
   2741       1.1     skrll 	      break;
   2742       1.1     skrll 	    }
   2743       1.1     skrll 
   2744   1.1.1.3  christos 	  if (s390_is_ifunc_symbol_p (h))
   2745   1.1.1.3  christos 	    relocation = (htab->elf.iplt->output_section->vma
   2746   1.1.1.3  christos 			  + htab->elf.iplt->output_offset
   2747   1.1.1.3  christos 			  + h->plt.offset
   2748   1.1.1.8  christos 			  - s390_got_pointer (info));
   2749   1.1.1.3  christos 	  else
   2750   1.1.1.3  christos 	    relocation = (htab->elf.splt->output_section->vma
   2751   1.1.1.3  christos 			  + htab->elf.splt->output_offset
   2752   1.1.1.3  christos 			  + h->plt.offset
   2753   1.1.1.8  christos 			  - s390_got_pointer (info));
   2754   1.1.1.9  christos 	  unresolved_reloc = false;
   2755       1.1     skrll 	  break;
   2756       1.1     skrll 
   2757       1.1     skrll 	case R_390_PC16:
   2758   1.1.1.4  christos 	case R_390_PC12DBL:
   2759       1.1     skrll 	case R_390_PC16DBL:
   2760   1.1.1.4  christos 	case R_390_PC24DBL:
   2761       1.1     skrll 	case R_390_PC32:
   2762       1.1     skrll 	case R_390_PC32DBL:
   2763       1.1     skrll 	case R_390_PC64:
   2764   1.1.1.6  christos 	  if (h != NULL
   2765   1.1.1.6  christos 	      && bfd_link_pie (info)
   2766   1.1.1.6  christos 	      && !h->def_regular)
   2767   1.1.1.6  christos 	    {
   2768   1.1.1.7  christos 	      _bfd_error_handler (_("%pB: `%s' non-PLT reloc for symbol defined "
   2769   1.1.1.6  christos 				    "in shared library and accessed "
   2770   1.1.1.6  christos 				    "from executable "
   2771   1.1.1.6  christos 				    "(rebuild file with -fPIC ?)"),
   2772   1.1.1.6  christos 				  input_bfd, h->root.root.string);
   2773   1.1.1.6  christos 	      bfd_set_error (bfd_error_bad_value);
   2774   1.1.1.9  christos 	      return false;
   2775   1.1.1.6  christos 	    }
   2776   1.1.1.4  christos 	  /* The target of these relocs are instruction operands
   2777   1.1.1.4  christos 	     residing in read-only sections.  We cannot emit a runtime
   2778   1.1.1.4  christos 	     reloc for it.  */
   2779   1.1.1.4  christos 	  if (h != NULL
   2780   1.1.1.4  christos 	      && s390_is_ifunc_symbol_p (h)
   2781   1.1.1.4  christos 	      && h->def_regular
   2782   1.1.1.4  christos 	      && bfd_link_pic (info))
   2783   1.1.1.4  christos 	    {
   2784   1.1.1.4  christos 	      relocation = (htab->elf.iplt->output_section->vma
   2785   1.1.1.4  christos 			    + htab->elf.iplt->output_offset
   2786   1.1.1.4  christos 			    + h->plt.offset);
   2787   1.1.1.4  christos 	      goto do_relocation;
   2788   1.1.1.4  christos 	    }
   2789  1.1.1.11  christos 
   2790  1.1.1.11  christos 	  /* Replace relative long addressing instructions of weak
   2791  1.1.1.11  christos 	     symbols, which will definitely resolve to zero, with
   2792  1.1.1.11  christos 	     either a load address of 0, a NOP, or a trapping insn.
   2793  1.1.1.11  christos 	     This prevents the PC32DBL relocation from overflowing in
   2794  1.1.1.11  christos 	     case the binary will be loaded at 4GB or more.  */
   2795  1.1.1.12  christos 	  if (relax
   2796  1.1.1.12  christos 	      && h != NULL
   2797  1.1.1.11  christos 	      && h->root.type == bfd_link_hash_undefweak
   2798  1.1.1.11  christos 	      && !h->root.linker_def
   2799  1.1.1.11  christos 	      && (bfd_link_executable (info)
   2800  1.1.1.11  christos 		  || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2801  1.1.1.11  christos 	      && r_type == R_390_PC32DBL
   2802  1.1.1.11  christos 	      && rel->r_offset >= 2)
   2803  1.1.1.11  christos 	    {
   2804  1.1.1.11  christos 	      void *insn_start = contents + rel->r_offset - 2;
   2805  1.1.1.11  christos 	      uint16_t op = bfd_get_16 (input_bfd, insn_start) & 0xff0f;
   2806  1.1.1.11  christos 	      uint8_t reg = bfd_get_8 (input_bfd, insn_start + 1) & 0xf0;
   2807  1.1.1.11  christos 
   2808  1.1.1.11  christos 	      /* NOTE: The order of the if's is important!  */
   2809  1.1.1.11  christos 	      /* Replace load address relative long (larl) with load
   2810  1.1.1.11  christos 		 address (lay) */
   2811  1.1.1.11  christos 	      if (op == 0xc000)
   2812  1.1.1.11  christos 		{
   2813  1.1.1.11  christos 		  /* larl rX,<weak sym> -> lay rX,0(0)  */
   2814  1.1.1.11  christos 		  bfd_put_16 (output_bfd, 0xe300 | reg, insn_start);
   2815  1.1.1.11  christos 		  bfd_put_32 (output_bfd, 0x71, insn_start + 2);
   2816  1.1.1.12  christos 		  rel->r_info = ELF64_R_INFO (0, R_390_NONE);
   2817  1.1.1.12  christos 		  rel->r_addend = 0;
   2818  1.1.1.11  christos 		  continue;
   2819  1.1.1.11  christos 		}
   2820  1.1.1.11  christos 	      /* Replace prefetch data relative long (pfdrl) with a NOP  */
   2821  1.1.1.11  christos 	      else if (op == 0xc602)
   2822  1.1.1.11  christos 		{
   2823  1.1.1.11  christos 		  /* Emit a 6-byte NOP: jgnop .  */
   2824  1.1.1.11  christos 		  bfd_put_16 (output_bfd, 0xc004, insn_start);
   2825  1.1.1.11  christos 		  bfd_put_32 (output_bfd, 0x0, insn_start + 2);
   2826  1.1.1.12  christos 		  rel->r_info = ELF64_R_INFO (0, R_390_NONE);
   2827  1.1.1.12  christos 		  rel->r_addend = 0;
   2828  1.1.1.11  christos 		  continue;
   2829  1.1.1.11  christos 		}
   2830  1.1.1.11  christos 	      /* Replace the following instructions with a trap:
   2831  1.1.1.11  christos 		 - branch relative and save long (brasl)
   2832  1.1.1.11  christos 		 - load (logical) relative long (lrl, lgrl, lgfrl, llgfrl)
   2833  1.1.1.11  christos 		 - load (logical) halfword relative long (lhrl, lghrl, llhrl, llghrl)
   2834  1.1.1.11  christos 		 - store relative long (strl, stgrl)
   2835  1.1.1.11  christos 		 - store halfword relative long (sthrl)
   2836  1.1.1.11  christos 		 - execute relative long (exrl)
   2837  1.1.1.11  christos 		 - compare (logical) relative long (crl, clrl, cgrl, clgrl, cgfrl, clgfrl)
   2838  1.1.1.11  christos 		 - compare (logical) halfword relative long (chrl, cghrl, clhrl, clghrl)  */
   2839  1.1.1.11  christos 	      else if (op == 0xc005 || (op & 0xff00) == 0xc400
   2840  1.1.1.11  christos 		       || (op & 0xff00) == 0xc600)
   2841  1.1.1.11  christos 		{
   2842  1.1.1.11  christos 		  /* Emit a 6-byte trap: jg .+2  */
   2843  1.1.1.11  christos 		  bfd_put_16 (output_bfd, 0xc0f4, insn_start);
   2844  1.1.1.11  christos 		  bfd_put_32 (output_bfd, 0x1, insn_start + 2);
   2845  1.1.1.12  christos 		  rel->r_info = ELF64_R_INFO (0, R_390_NONE);
   2846  1.1.1.12  christos 		  rel->r_addend = 0;
   2847  1.1.1.11  christos 		  continue;
   2848  1.1.1.11  christos 		}
   2849  1.1.1.11  christos 	    }
   2850   1.1.1.6  christos 	  /* Fall through.  */
   2851   1.1.1.4  christos 
   2852   1.1.1.4  christos 	case R_390_8:
   2853   1.1.1.4  christos 	case R_390_16:
   2854   1.1.1.4  christos 	case R_390_32:
   2855   1.1.1.4  christos 	case R_390_64:
   2856   1.1.1.3  christos 
   2857   1.1.1.7  christos 	  if ((input_section->flags & SEC_ALLOC) == 0)
   2858   1.1.1.7  christos 	    break;
   2859   1.1.1.7  christos 
   2860   1.1.1.3  christos 	  if (h != NULL
   2861   1.1.1.3  christos 	      && s390_is_ifunc_symbol_p (h)
   2862   1.1.1.3  christos 	      && h->def_regular)
   2863   1.1.1.3  christos 	    {
   2864   1.1.1.6  christos 	      if (!bfd_link_pic (info))
   2865   1.1.1.3  christos 		{
   2866   1.1.1.6  christos 		  /* For a non-shared object the symbol will not
   2867   1.1.1.6  christos 		     change.  Hence we can write the address of the
   2868   1.1.1.6  christos 		     target IPLT slot now.  */
   2869   1.1.1.3  christos 		  relocation = (htab->elf.iplt->output_section->vma
   2870   1.1.1.3  christos 				+ htab->elf.iplt->output_offset
   2871   1.1.1.3  christos 				+ h ->plt.offset);
   2872   1.1.1.3  christos 		  goto do_relocation;
   2873   1.1.1.3  christos 		}
   2874   1.1.1.3  christos 	      else
   2875   1.1.1.3  christos 		{
   2876   1.1.1.3  christos 		  /* For shared objects a runtime relocation is needed.  */
   2877   1.1.1.3  christos 
   2878   1.1.1.3  christos 		  Elf_Internal_Rela outrel;
   2879   1.1.1.3  christos 		  asection *sreloc;
   2880   1.1.1.3  christos 
   2881   1.1.1.3  christos 		  /* Need a dynamic relocation to get the real function
   2882   1.1.1.3  christos 		     address.  */
   2883   1.1.1.3  christos 		  outrel.r_offset = _bfd_elf_section_offset (output_bfd,
   2884   1.1.1.3  christos 							     info,
   2885   1.1.1.3  christos 							     input_section,
   2886   1.1.1.3  christos 							     rel->r_offset);
   2887   1.1.1.3  christos 		  if (outrel.r_offset == (bfd_vma) -1
   2888   1.1.1.3  christos 		      || outrel.r_offset == (bfd_vma) -2)
   2889   1.1.1.3  christos 		    abort ();
   2890   1.1.1.3  christos 
   2891   1.1.1.3  christos 		  outrel.r_offset += (input_section->output_section->vma
   2892   1.1.1.3  christos 				      + input_section->output_offset);
   2893   1.1.1.3  christos 
   2894   1.1.1.3  christos 		  if (h->dynindx == -1
   2895   1.1.1.3  christos 		      || h->forced_local
   2896   1.1.1.4  christos 		      || bfd_link_executable (info))
   2897   1.1.1.3  christos 		    {
   2898   1.1.1.3  christos 		      /* This symbol is resolved locally.  */
   2899   1.1.1.3  christos 		      outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
   2900   1.1.1.3  christos 		      outrel.r_addend = (h->root.u.def.value
   2901   1.1.1.3  christos 					 + h->root.u.def.section->output_section->vma
   2902   1.1.1.3  christos 					 + h->root.u.def.section->output_offset);
   2903   1.1.1.3  christos 		    }
   2904   1.1.1.3  christos 		  else
   2905   1.1.1.3  christos 		    {
   2906   1.1.1.3  christos 		      outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
   2907   1.1.1.3  christos 		      outrel.r_addend = 0;
   2908   1.1.1.3  christos 		    }
   2909   1.1.1.3  christos 
   2910   1.1.1.3  christos 		  sreloc = htab->elf.irelifunc;
   2911  1.1.1.12  christos 		  _bfd_elf_append_rela (output_bfd, sreloc, &outrel);
   2912   1.1.1.3  christos 
   2913   1.1.1.3  christos 		  /* If this reloc is against an external symbol, we
   2914   1.1.1.3  christos 		     do not want to fiddle with the addend.  Otherwise,
   2915   1.1.1.3  christos 		     we need to include the symbol value so that it
   2916   1.1.1.3  christos 		     becomes an addend for the dynamic reloc.  For an
   2917   1.1.1.3  christos 		     internal symbol, we have updated addend.  */
   2918   1.1.1.3  christos 		  continue;
   2919   1.1.1.3  christos 		}
   2920   1.1.1.3  christos 	    }
   2921   1.1.1.3  christos 
   2922   1.1.1.4  christos 	  if ((bfd_link_pic (info)
   2923       1.1     skrll 	       && (h == NULL
   2924   1.1.1.6  christos 		   || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   2925   1.1.1.6  christos 		       && !resolved_to_zero)
   2926       1.1     skrll 		   || h->root.type != bfd_link_hash_undefweak)
   2927       1.1     skrll 	       && ((r_type != R_390_PC16
   2928   1.1.1.4  christos 		    && r_type != R_390_PC12DBL
   2929       1.1     skrll 		    && r_type != R_390_PC16DBL
   2930   1.1.1.4  christos 		    && r_type != R_390_PC24DBL
   2931       1.1     skrll 		    && r_type != R_390_PC32
   2932       1.1     skrll 		    && r_type != R_390_PC32DBL
   2933       1.1     skrll 		    && r_type != R_390_PC64)
   2934   1.1.1.2  christos 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   2935       1.1     skrll 	      || (ELIMINATE_COPY_RELOCS
   2936   1.1.1.4  christos 		  && !bfd_link_pic (info)
   2937       1.1     skrll 		  && h != NULL
   2938       1.1     skrll 		  && h->dynindx != -1
   2939       1.1     skrll 		  && !h->non_got_ref
   2940       1.1     skrll 		  && ((h->def_dynamic
   2941       1.1     skrll 		       && !h->def_regular)
   2942       1.1     skrll 		      || h->root.type == bfd_link_hash_undefweak
   2943       1.1     skrll 		      || h->root.type == bfd_link_hash_undefined)))
   2944       1.1     skrll 	    {
   2945       1.1     skrll 	      Elf_Internal_Rela outrel;
   2946   1.1.1.9  christos 	      bool skip, relocate;
   2947       1.1     skrll 	      asection *sreloc;
   2948       1.1     skrll 	      bfd_byte *loc;
   2949       1.1     skrll 
   2950       1.1     skrll 	      /* When generating a shared object, these relocations
   2951       1.1     skrll 		 are copied into the output file to be resolved at run
   2952       1.1     skrll 		 time.  */
   2953   1.1.1.9  christos 	      skip = false;
   2954   1.1.1.9  christos 	      relocate = false;
   2955       1.1     skrll 
   2956       1.1     skrll 	      outrel.r_offset =
   2957       1.1     skrll 		_bfd_elf_section_offset (output_bfd, info, input_section,
   2958       1.1     skrll 					 rel->r_offset);
   2959       1.1     skrll 	      if (outrel.r_offset == (bfd_vma) -1)
   2960   1.1.1.9  christos 		skip = true;
   2961       1.1     skrll 	      else if (outrel.r_offset == (bfd_vma) -2)
   2962   1.1.1.9  christos 		skip = true, relocate = true;
   2963       1.1     skrll 
   2964       1.1     skrll 	      outrel.r_offset += (input_section->output_section->vma
   2965       1.1     skrll 				  + input_section->output_offset);
   2966       1.1     skrll 
   2967       1.1     skrll 	      if (skip)
   2968       1.1     skrll 		memset (&outrel, 0, sizeof outrel);
   2969       1.1     skrll 	      else if (h != NULL
   2970       1.1     skrll 		       && h->dynindx != -1
   2971       1.1     skrll 		       && (r_type == R_390_PC16
   2972   1.1.1.4  christos 			   || r_type == R_390_PC12DBL
   2973       1.1     skrll 			   || r_type == R_390_PC16DBL
   2974   1.1.1.4  christos 			   || r_type == R_390_PC24DBL
   2975       1.1     skrll 			   || r_type == R_390_PC32
   2976       1.1     skrll 			   || r_type == R_390_PC32DBL
   2977       1.1     skrll 			   || r_type == R_390_PC64
   2978  1.1.1.12  christos 			   || !(bfd_link_executable (info) || SYMBOLIC_BIND (info, h))
   2979       1.1     skrll 			   || !h->def_regular))
   2980       1.1     skrll 		{
   2981       1.1     skrll 		  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
   2982       1.1     skrll 		  outrel.r_addend = rel->r_addend;
   2983       1.1     skrll 		}
   2984       1.1     skrll 	      else
   2985       1.1     skrll 		{
   2986       1.1     skrll 		  /* This symbol is local, or marked to become local.  */
   2987       1.1     skrll 		  outrel.r_addend = relocation + rel->r_addend;
   2988       1.1     skrll 		  if (r_type == R_390_64)
   2989       1.1     skrll 		    {
   2990   1.1.1.9  christos 		      relocate = true;
   2991       1.1     skrll 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   2992       1.1     skrll 		    }
   2993       1.1     skrll 		  else
   2994       1.1     skrll 		    {
   2995       1.1     skrll 		      long sindx;
   2996       1.1     skrll 
   2997       1.1     skrll 		      if (bfd_is_abs_section (sec))
   2998       1.1     skrll 			sindx = 0;
   2999       1.1     skrll 		      else if (sec == NULL || sec->owner == NULL)
   3000       1.1     skrll 			{
   3001       1.1     skrll 			  bfd_set_error(bfd_error_bad_value);
   3002   1.1.1.9  christos 			  return false;
   3003       1.1     skrll 			}
   3004       1.1     skrll 		      else
   3005       1.1     skrll 			{
   3006       1.1     skrll 			  asection *osec;
   3007       1.1     skrll 
   3008       1.1     skrll 			  osec = sec->output_section;
   3009       1.1     skrll 			  sindx = elf_section_data (osec)->dynindx;
   3010       1.1     skrll 
   3011       1.1     skrll 			  if (sindx == 0)
   3012       1.1     skrll 			    {
   3013       1.1     skrll 			      osec = htab->elf.text_index_section;
   3014       1.1     skrll 			      sindx = elf_section_data (osec)->dynindx;
   3015       1.1     skrll 			    }
   3016       1.1     skrll 			  BFD_ASSERT (sindx != 0);
   3017       1.1     skrll 
   3018       1.1     skrll 			  /* We are turning this relocation into one
   3019       1.1     skrll 			     against a section symbol, so subtract out
   3020       1.1     skrll 			     the output section's address but not the
   3021       1.1     skrll 			     offset of the input section in the output
   3022       1.1     skrll 			     section.  */
   3023       1.1     skrll 			  outrel.r_addend -= osec->vma;
   3024       1.1     skrll 			}
   3025       1.1     skrll 		      outrel.r_info = ELF64_R_INFO (sindx, r_type);
   3026       1.1     skrll 		    }
   3027       1.1     skrll 		}
   3028       1.1     skrll 
   3029       1.1     skrll 	      sreloc = elf_section_data (input_section)->sreloc;
   3030       1.1     skrll 	      if (sreloc == NULL)
   3031       1.1     skrll 		abort ();
   3032       1.1     skrll 
   3033       1.1     skrll 	      loc = sreloc->contents;
   3034       1.1     skrll 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   3035       1.1     skrll 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3036       1.1     skrll 
   3037       1.1     skrll 	      /* If this reloc is against an external symbol, we do
   3038       1.1     skrll 		 not want to fiddle with the addend.  Otherwise, we
   3039       1.1     skrll 		 need to include the symbol value so that it becomes
   3040       1.1     skrll 		 an addend for the dynamic reloc.  */
   3041       1.1     skrll 	      if (! relocate)
   3042       1.1     skrll 		continue;
   3043       1.1     skrll 	    }
   3044       1.1     skrll 
   3045       1.1     skrll 	  break;
   3046       1.1     skrll 
   3047       1.1     skrll 	  /* Relocations for tls literal pool entries.  */
   3048       1.1     skrll 	case R_390_TLS_IE64:
   3049   1.1.1.9  christos 	  if (bfd_link_dll (info))
   3050       1.1     skrll 	    {
   3051       1.1     skrll 	      Elf_Internal_Rela outrel;
   3052       1.1     skrll 	      asection *sreloc;
   3053       1.1     skrll 	      bfd_byte *loc;
   3054       1.1     skrll 
   3055       1.1     skrll 	      outrel.r_offset = rel->r_offset
   3056       1.1     skrll 				+ input_section->output_section->vma
   3057       1.1     skrll 				+ input_section->output_offset;
   3058       1.1     skrll 	      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   3059       1.1     skrll 	      sreloc = elf_section_data (input_section)->sreloc;
   3060       1.1     skrll 	      if (sreloc == NULL)
   3061       1.1     skrll 		abort ();
   3062       1.1     skrll 	      loc = sreloc->contents;
   3063       1.1     skrll 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   3064       1.1     skrll 	      bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
   3065       1.1     skrll 	    }
   3066       1.1     skrll 	  /* Fall through.  */
   3067       1.1     skrll 
   3068       1.1     skrll 	case R_390_TLS_GD64:
   3069       1.1     skrll 	case R_390_TLS_GOTIE64:
   3070       1.1     skrll 	  r_type = elf_s390_tls_transition (info, r_type, h == NULL);
   3071       1.1     skrll 	  tls_type = GOT_UNKNOWN;
   3072       1.1     skrll 	  if (h == NULL && local_got_offsets)
   3073       1.1     skrll 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
   3074       1.1     skrll 	  else if (h != NULL)
   3075       1.1     skrll 	    {
   3076       1.1     skrll 	      tls_type = elf_s390_hash_entry(h)->tls_type;
   3077   1.1.1.9  christos 	      if (!bfd_link_dll (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
   3078       1.1     skrll 		r_type = R_390_TLS_LE64;
   3079       1.1     skrll 	    }
   3080       1.1     skrll 	  if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
   3081       1.1     skrll 	    r_type = R_390_TLS_IE64;
   3082       1.1     skrll 
   3083       1.1     skrll 	  if (r_type == R_390_TLS_LE64)
   3084       1.1     skrll 	    {
   3085       1.1     skrll 	      /* This relocation gets optimized away by the local exec
   3086       1.1     skrll 		 access optimization.  */
   3087       1.1     skrll 	      BFD_ASSERT (! unresolved_reloc);
   3088  1.1.1.10  christos 	      bfd_put_64 (output_bfd, -tpoff (info, relocation) + rel->r_addend,
   3089       1.1     skrll 			  contents + rel->r_offset);
   3090       1.1     skrll 	      continue;
   3091       1.1     skrll 	    }
   3092       1.1     skrll 
   3093   1.1.1.3  christos 	  if (htab->elf.sgot == NULL)
   3094       1.1     skrll 	    abort ();
   3095       1.1     skrll 
   3096       1.1     skrll 	  if (h != NULL)
   3097       1.1     skrll 	    off = h->got.offset;
   3098       1.1     skrll 	  else
   3099       1.1     skrll 	    {
   3100       1.1     skrll 	      if (local_got_offsets == NULL)
   3101       1.1     skrll 		abort ();
   3102       1.1     skrll 
   3103       1.1     skrll 	      off = local_got_offsets[r_symndx];
   3104       1.1     skrll 	    }
   3105       1.1     skrll 
   3106       1.1     skrll 	emit_tls_relocs:
   3107       1.1     skrll 
   3108       1.1     skrll 	  if ((off & 1) != 0)
   3109       1.1     skrll 	    off &= ~1;
   3110       1.1     skrll 	  else
   3111       1.1     skrll 	    {
   3112       1.1     skrll 	      Elf_Internal_Rela outrel;
   3113       1.1     skrll 	      bfd_byte *loc;
   3114       1.1     skrll 	      int dr_type, indx;
   3115       1.1     skrll 
   3116   1.1.1.3  christos 	      if (htab->elf.srelgot == NULL)
   3117       1.1     skrll 		abort ();
   3118       1.1     skrll 
   3119   1.1.1.3  christos 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3120   1.1.1.3  christos 				 + htab->elf.sgot->output_offset + off);
   3121       1.1     skrll 
   3122       1.1     skrll 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
   3123       1.1     skrll 	      if (r_type == R_390_TLS_GD64)
   3124       1.1     skrll 		dr_type = R_390_TLS_DTPMOD;
   3125       1.1     skrll 	      else
   3126       1.1     skrll 		dr_type = R_390_TLS_TPOFF;
   3127       1.1     skrll 	      if (dr_type == R_390_TLS_TPOFF && indx == 0)
   3128       1.1     skrll 		outrel.r_addend = relocation - dtpoff_base (info);
   3129       1.1     skrll 	      else
   3130       1.1     skrll 		outrel.r_addend = 0;
   3131       1.1     skrll 	      outrel.r_info = ELF64_R_INFO (indx, dr_type);
   3132   1.1.1.3  christos 	      loc = htab->elf.srelgot->contents;
   3133   1.1.1.3  christos 	      loc += htab->elf.srelgot->reloc_count++
   3134       1.1     skrll 		* sizeof (Elf64_External_Rela);
   3135       1.1     skrll 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3136       1.1     skrll 
   3137       1.1     skrll 	      if (r_type == R_390_TLS_GD64)
   3138       1.1     skrll 		{
   3139       1.1     skrll 		  if (indx == 0)
   3140       1.1     skrll 		    {
   3141   1.1.1.6  christos 		      BFD_ASSERT (! unresolved_reloc);
   3142       1.1     skrll 		      bfd_put_64 (output_bfd,
   3143       1.1     skrll 				  relocation - dtpoff_base (info),
   3144   1.1.1.3  christos 				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
   3145       1.1     skrll 		    }
   3146       1.1     skrll 		  else
   3147       1.1     skrll 		    {
   3148       1.1     skrll 		      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
   3149       1.1     skrll 		      outrel.r_offset += GOT_ENTRY_SIZE;
   3150       1.1     skrll 		      outrel.r_addend = 0;
   3151   1.1.1.3  christos 		      htab->elf.srelgot->reloc_count++;
   3152       1.1     skrll 		      loc += sizeof (Elf64_External_Rela);
   3153       1.1     skrll 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3154       1.1     skrll 		    }
   3155       1.1     skrll 		}
   3156       1.1     skrll 
   3157       1.1     skrll 	      if (h != NULL)
   3158       1.1     skrll 		h->got.offset |= 1;
   3159       1.1     skrll 	      else
   3160       1.1     skrll 		local_got_offsets[r_symndx] |= 1;
   3161       1.1     skrll 	    }
   3162       1.1     skrll 
   3163       1.1     skrll 	  if (off >= (bfd_vma) -2)
   3164       1.1     skrll 	    abort ();
   3165       1.1     skrll 	  if (r_type == ELF64_R_TYPE (rel->r_info))
   3166       1.1     skrll 	    {
   3167   1.1.1.3  christos 	      relocation = htab->elf.sgot->output_offset + off;
   3168       1.1     skrll 	      if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
   3169   1.1.1.3  christos 		relocation += htab->elf.sgot->output_section->vma;
   3170   1.1.1.9  christos 	      unresolved_reloc = false;
   3171       1.1     skrll 	    }
   3172       1.1     skrll 	  else
   3173       1.1     skrll 	    {
   3174   1.1.1.3  christos 	      bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
   3175       1.1     skrll 			  contents + rel->r_offset);
   3176       1.1     skrll 	      continue;
   3177       1.1     skrll 	    }
   3178       1.1     skrll 	  break;
   3179       1.1     skrll 
   3180       1.1     skrll 	case R_390_TLS_GOTIE12:
   3181       1.1     skrll 	case R_390_TLS_GOTIE20:
   3182       1.1     skrll 	case R_390_TLS_IEENT:
   3183       1.1     skrll 	  if (h == NULL)
   3184       1.1     skrll 	    {
   3185       1.1     skrll 	      if (local_got_offsets == NULL)
   3186       1.1     skrll 		abort();
   3187       1.1     skrll 	      off = local_got_offsets[r_symndx];
   3188   1.1.1.9  christos 	      if (bfd_link_dll (info))
   3189       1.1     skrll 		goto emit_tls_relocs;
   3190       1.1     skrll 	    }
   3191       1.1     skrll 	  else
   3192       1.1     skrll 	    {
   3193       1.1     skrll 	      off = h->got.offset;
   3194       1.1     skrll 	      tls_type = elf_s390_hash_entry(h)->tls_type;
   3195   1.1.1.9  christos 	      if (bfd_link_dll (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
   3196       1.1     skrll 		goto emit_tls_relocs;
   3197       1.1     skrll 	    }
   3198       1.1     skrll 
   3199   1.1.1.3  christos 	  if (htab->elf.sgot == NULL)
   3200       1.1     skrll 	    abort ();
   3201       1.1     skrll 
   3202       1.1     skrll 	  BFD_ASSERT (! unresolved_reloc);
   3203       1.1     skrll 	  bfd_put_64 (output_bfd, -tpoff (info, relocation),
   3204   1.1.1.3  christos 		      htab->elf.sgot->contents + off);
   3205   1.1.1.3  christos 	  relocation = htab->elf.sgot->output_offset + off;
   3206       1.1     skrll 	  if (r_type == R_390_TLS_IEENT)
   3207   1.1.1.3  christos 	    relocation += htab->elf.sgot->output_section->vma;
   3208   1.1.1.9  christos 	  unresolved_reloc = false;
   3209       1.1     skrll 	  break;
   3210       1.1     skrll 
   3211       1.1     skrll 	case R_390_TLS_LDM64:
   3212   1.1.1.9  christos 	  if (! bfd_link_dll (info))
   3213       1.1     skrll 	    /* The literal pool entry this relocation refers to gets ignored
   3214       1.1     skrll 	       by the optimized code of the local exec model. Do nothing
   3215       1.1     skrll 	       and the value will turn out zero.  */
   3216       1.1     skrll 	    continue;
   3217       1.1     skrll 
   3218   1.1.1.3  christos 	  if (htab->elf.sgot == NULL)
   3219       1.1     skrll 	    abort ();
   3220       1.1     skrll 
   3221       1.1     skrll 	  off = htab->tls_ldm_got.offset;
   3222       1.1     skrll 	  if (off & 1)
   3223       1.1     skrll 	    off &= ~1;
   3224       1.1     skrll 	  else
   3225       1.1     skrll 	    {
   3226       1.1     skrll 	      Elf_Internal_Rela outrel;
   3227       1.1     skrll 	      bfd_byte *loc;
   3228       1.1     skrll 
   3229   1.1.1.3  christos 	      if (htab->elf.srelgot == NULL)
   3230       1.1     skrll 		abort ();
   3231       1.1     skrll 
   3232   1.1.1.3  christos 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3233   1.1.1.3  christos 				 + htab->elf.sgot->output_offset + off);
   3234       1.1     skrll 
   3235       1.1     skrll 	      bfd_put_64 (output_bfd, 0,
   3236   1.1.1.3  christos 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
   3237       1.1     skrll 	      outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
   3238       1.1     skrll 	      outrel.r_addend = 0;
   3239   1.1.1.3  christos 	      loc = htab->elf.srelgot->contents;
   3240   1.1.1.3  christos 	      loc += htab->elf.srelgot->reloc_count++
   3241       1.1     skrll 		* sizeof (Elf64_External_Rela);
   3242       1.1     skrll 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3243       1.1     skrll 	      htab->tls_ldm_got.offset |= 1;
   3244       1.1     skrll 	    }
   3245   1.1.1.3  christos 	  relocation = htab->elf.sgot->output_offset + off;
   3246   1.1.1.9  christos 	  unresolved_reloc = false;
   3247       1.1     skrll 	  break;
   3248       1.1     skrll 
   3249       1.1     skrll 	case R_390_TLS_LE64:
   3250   1.1.1.4  christos 	  if (bfd_link_dll (info))
   3251       1.1     skrll 	    {
   3252       1.1     skrll 	      /* Linking a shared library with non-fpic code requires
   3253       1.1     skrll 		 a R_390_TLS_TPOFF relocation.  */
   3254       1.1     skrll 	      Elf_Internal_Rela outrel;
   3255       1.1     skrll 	      asection *sreloc;
   3256       1.1     skrll 	      bfd_byte *loc;
   3257       1.1     skrll 	      int indx;
   3258       1.1     skrll 
   3259       1.1     skrll 	      outrel.r_offset = rel->r_offset
   3260       1.1     skrll 				+ input_section->output_section->vma
   3261       1.1     skrll 				+ input_section->output_offset;
   3262       1.1     skrll 	      if (h != NULL && h->dynindx != -1)
   3263       1.1     skrll 		indx = h->dynindx;
   3264       1.1     skrll 	      else
   3265       1.1     skrll 		indx = 0;
   3266       1.1     skrll 	      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
   3267       1.1     skrll 	      if (indx == 0)
   3268       1.1     skrll 		outrel.r_addend = relocation - dtpoff_base (info);
   3269       1.1     skrll 	      else
   3270       1.1     skrll 		outrel.r_addend = 0;
   3271       1.1     skrll 	      sreloc = elf_section_data (input_section)->sreloc;
   3272       1.1     skrll 	      if (sreloc == NULL)
   3273       1.1     skrll 		abort ();
   3274       1.1     skrll 	      loc = sreloc->contents;
   3275       1.1     skrll 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
   3276       1.1     skrll 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
   3277       1.1     skrll 	    }
   3278       1.1     skrll 	  else
   3279       1.1     skrll 	    {
   3280       1.1     skrll 	      BFD_ASSERT (! unresolved_reloc);
   3281  1.1.1.10  christos 	      bfd_put_64 (output_bfd, -tpoff (info, relocation) + rel->r_addend,
   3282       1.1     skrll 			  contents + rel->r_offset);
   3283       1.1     skrll 	    }
   3284       1.1     skrll 	  continue;
   3285       1.1     skrll 
   3286       1.1     skrll 	case R_390_TLS_LDO64:
   3287   1.1.1.9  christos 	  if (bfd_link_dll (info) || (input_section->flags & SEC_DEBUGGING))
   3288       1.1     skrll 	    relocation -= dtpoff_base (info);
   3289       1.1     skrll 	  else
   3290       1.1     skrll 	    /* When converting LDO to LE, we must negate.  */
   3291       1.1     skrll 	    relocation = -tpoff (info, relocation);
   3292       1.1     skrll 	  break;
   3293       1.1     skrll 
   3294       1.1     skrll 	  /* Relocations for tls instructions.  */
   3295       1.1     skrll 	case R_390_TLS_LOAD:
   3296       1.1     skrll 	case R_390_TLS_GDCALL:
   3297       1.1     skrll 	case R_390_TLS_LDCALL:
   3298       1.1     skrll 	  tls_type = GOT_UNKNOWN;
   3299       1.1     skrll 	  if (h == NULL && local_got_offsets)
   3300       1.1     skrll 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
   3301       1.1     skrll 	  else if (h != NULL)
   3302       1.1     skrll 	    tls_type = elf_s390_hash_entry(h)->tls_type;
   3303       1.1     skrll 
   3304       1.1     skrll 	  if (tls_type == GOT_TLS_GD)
   3305       1.1     skrll 	    continue;
   3306       1.1     skrll 
   3307       1.1     skrll 	  if (r_type == R_390_TLS_LOAD)
   3308       1.1     skrll 	    {
   3309   1.1.1.9  christos 	      if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1))
   3310       1.1     skrll 		{
   3311       1.1     skrll 		  /* IE->LE transition. Four valid cases:
   3312       1.1     skrll 		     lg %rx,(0,%ry)    -> sllg %rx,%ry,0
   3313       1.1     skrll 		     lg %rx,(%ry,0)    -> sllg %rx,%ry,0
   3314       1.1     skrll 		     lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
   3315       1.1     skrll 		     lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
   3316       1.1     skrll 		  unsigned int insn0, insn1, ry;
   3317       1.1     skrll 
   3318       1.1     skrll 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3319       1.1     skrll 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3320       1.1     skrll 		  if (insn1 != 0x0004)
   3321   1.1.1.6  christos 		    {
   3322   1.1.1.6  christos 		      invalid_tls_insn (input_bfd, input_section, rel);
   3323   1.1.1.9  christos 		      return false;
   3324   1.1.1.6  christos 		    }
   3325       1.1     skrll 		  if ((insn0 & 0xff00f000) == 0xe3000000)
   3326       1.1     skrll 		    /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
   3327       1.1     skrll 		    ry = (insn0 & 0x000f0000);
   3328       1.1     skrll 		  else if ((insn0 & 0xff0f0000) == 0xe3000000)
   3329       1.1     skrll 		    /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
   3330       1.1     skrll 		    ry = (insn0 & 0x0000f000) << 4;
   3331       1.1     skrll 		  else if ((insn0 & 0xff00f000) == 0xe300c000)
   3332       1.1     skrll 		    /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
   3333       1.1     skrll 		    ry = (insn0 & 0x000f0000);
   3334       1.1     skrll 		  else if ((insn0 & 0xff0f0000) == 0xe30c0000)
   3335       1.1     skrll 		    /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
   3336       1.1     skrll 		    ry = (insn0 & 0x0000f000) << 4;
   3337       1.1     skrll 		  else
   3338   1.1.1.6  christos 		    {
   3339   1.1.1.6  christos 		      invalid_tls_insn (input_bfd, input_section, rel);
   3340   1.1.1.9  christos 		      return false;
   3341   1.1.1.6  christos 		    }
   3342       1.1     skrll 		  insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
   3343       1.1     skrll 		  insn1 = 0x000d;
   3344       1.1     skrll 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3345       1.1     skrll 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3346       1.1     skrll 		}
   3347       1.1     skrll 	    }
   3348       1.1     skrll 	  else if (r_type == R_390_TLS_GDCALL)
   3349       1.1     skrll 	    {
   3350       1.1     skrll 	      unsigned int insn0, insn1;
   3351       1.1     skrll 
   3352       1.1     skrll 	      insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3353       1.1     skrll 	      insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3354       1.1     skrll 	      if ((insn0 & 0xffff0000) != 0xc0e50000)
   3355   1.1.1.6  christos 		{
   3356   1.1.1.6  christos 		  invalid_tls_insn (input_bfd, input_section, rel);
   3357   1.1.1.9  christos 		  return false;
   3358   1.1.1.6  christos 		}
   3359   1.1.1.9  christos 	      if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1))
   3360       1.1     skrll 		{
   3361       1.1     skrll 		  /* GD->LE transition.
   3362       1.1     skrll 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
   3363       1.1     skrll 		  insn0 = 0xc0040000;
   3364       1.1     skrll 		  insn1 = 0x0000;
   3365       1.1     skrll 		}
   3366       1.1     skrll 	      else
   3367       1.1     skrll 		{
   3368       1.1     skrll 		  /* GD->IE transition.
   3369       1.1     skrll 		     brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
   3370       1.1     skrll 		  insn0 = 0xe322c000;
   3371       1.1     skrll 		  insn1 = 0x0004;
   3372       1.1     skrll 		}
   3373       1.1     skrll 	      bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3374       1.1     skrll 	      bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3375       1.1     skrll 	    }
   3376       1.1     skrll 	  else if (r_type == R_390_TLS_LDCALL)
   3377       1.1     skrll 	    {
   3378   1.1.1.9  christos 	      if (!bfd_link_dll (info))
   3379       1.1     skrll 		{
   3380       1.1     skrll 		  unsigned int insn0, insn1;
   3381       1.1     skrll 
   3382       1.1     skrll 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
   3383       1.1     skrll 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
   3384       1.1     skrll 		  if ((insn0 & 0xffff0000) != 0xc0e50000)
   3385   1.1.1.6  christos 		    {
   3386   1.1.1.6  christos 		      invalid_tls_insn (input_bfd, input_section, rel);
   3387   1.1.1.9  christos 		      return false;
   3388   1.1.1.6  christos 		    }
   3389       1.1     skrll 		  /* LD->LE transition.
   3390       1.1     skrll 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
   3391       1.1     skrll 		  insn0 = 0xc0040000;
   3392       1.1     skrll 		  insn1 = 0x0000;
   3393       1.1     skrll 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
   3394       1.1     skrll 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
   3395       1.1     skrll 		}
   3396       1.1     skrll 	    }
   3397       1.1     skrll 	  continue;
   3398       1.1     skrll 
   3399       1.1     skrll 	default:
   3400       1.1     skrll 	  break;
   3401       1.1     skrll 	}
   3402       1.1     skrll 
   3403       1.1     skrll       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   3404       1.1     skrll 	 because such sections are not SEC_ALLOC and thus ld.so will
   3405       1.1     skrll 	 not process them.  */
   3406       1.1     skrll       if (unresolved_reloc
   3407       1.1     skrll 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   3408   1.1.1.3  christos 	       && h->def_dynamic)
   3409   1.1.1.3  christos 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   3410   1.1.1.3  christos 				      rel->r_offset) != (bfd_vma) -1)
   3411   1.1.1.6  christos 	_bfd_error_handler
   3412   1.1.1.6  christos 	  /* xgettext:c-format */
   3413   1.1.1.7  christos 	  (_("%pB(%pA+%#" PRIx64 "): "
   3414   1.1.1.7  christos 	     "unresolvable %s relocation against symbol `%s'"),
   3415       1.1     skrll 	   input_bfd,
   3416       1.1     skrll 	   input_section,
   3417   1.1.1.7  christos 	   (uint64_t) rel->r_offset,
   3418       1.1     skrll 	   howto->name,
   3419       1.1     skrll 	   h->root.root.string);
   3420       1.1     skrll 
   3421   1.1.1.3  christos     do_relocation:
   3422   1.1.1.3  christos 
   3423   1.1.1.4  christos       /* When applying a 24 bit reloc we need to start one byte
   3424   1.1.1.4  christos 	 earlier.  Otherwise the 32 bit get/put bfd operations might
   3425   1.1.1.4  christos 	 access a byte after the actual section.  */
   3426   1.1.1.4  christos       if (r_type == R_390_PC24DBL
   3427   1.1.1.4  christos 	  || r_type == R_390_PLT24DBL)
   3428   1.1.1.4  christos 	rel->r_offset--;
   3429   1.1.1.4  christos 
   3430  1.1.1.10  christos       /* Issue an error if the right shift implied by the relocation
   3431  1.1.1.10  christos 	 would drop bits from the symbol value.  */
   3432  1.1.1.10  christos       if (howto->rightshift
   3433  1.1.1.10  christos 	  && (relocation & (((bfd_vma)1 << howto->rightshift) - 1)))
   3434  1.1.1.10  christos 	{
   3435  1.1.1.10  christos 	  _bfd_error_handler
   3436  1.1.1.10  christos 	    /* xgettext:c-format */
   3437  1.1.1.10  christos 	    (_("%pB(%pA+%#" PRIx64 "): "
   3438  1.1.1.11  christos 	       "relocation %s against misaligned symbol `%s' (%#" PRIx64 ") in %pB"),
   3439  1.1.1.10  christos 	     input_bfd,
   3440  1.1.1.10  christos 	     input_section,
   3441  1.1.1.10  christos 	     (uint64_t) rel->r_offset,
   3442  1.1.1.11  christos 	     howto->name,
   3443  1.1.1.10  christos 	     h->root.root.string,
   3444  1.1.1.10  christos 	     (uint64_t)relocation,
   3445  1.1.1.11  christos 	     sec->owner);
   3446  1.1.1.10  christos 	  return false;
   3447  1.1.1.10  christos 	}
   3448  1.1.1.10  christos 
   3449       1.1     skrll       if (r_type == R_390_20
   3450       1.1     skrll 	  || r_type == R_390_GOT20
   3451       1.1     skrll 	  || r_type == R_390_GOTPLT20
   3452       1.1     skrll 	  || r_type == R_390_TLS_GOTIE20)
   3453       1.1     skrll 	{
   3454       1.1     skrll 	  relocation += rel->r_addend;
   3455       1.1     skrll 	  relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
   3456       1.1     skrll 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3457       1.1     skrll 					contents, rel->r_offset,
   3458       1.1     skrll 					relocation, 0);
   3459       1.1     skrll 	}
   3460       1.1     skrll       else
   3461       1.1     skrll 	r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3462       1.1     skrll 				      contents, rel->r_offset,
   3463       1.1     skrll 				      relocation, rel->r_addend);
   3464       1.1     skrll 
   3465       1.1     skrll       if (r != bfd_reloc_ok)
   3466       1.1     skrll 	{
   3467       1.1     skrll 	  const char *name;
   3468       1.1     skrll 
   3469       1.1     skrll 	  if (h != NULL)
   3470       1.1     skrll 	    name = h->root.root.string;
   3471       1.1     skrll 	  else
   3472       1.1     skrll 	    {
   3473       1.1     skrll 	      name = bfd_elf_string_from_elf_section (input_bfd,
   3474       1.1     skrll 						      symtab_hdr->sh_link,
   3475       1.1     skrll 						      sym->st_name);
   3476       1.1     skrll 	      if (name == NULL)
   3477   1.1.1.9  christos 		return false;
   3478       1.1     skrll 	      if (*name == '\0')
   3479   1.1.1.8  christos 		name = bfd_section_name (sec);
   3480       1.1     skrll 	    }
   3481       1.1     skrll 
   3482       1.1     skrll 	  if (r == bfd_reloc_overflow)
   3483   1.1.1.5  christos 	    (*info->callbacks->reloc_overflow)
   3484   1.1.1.5  christos 	      (info, (h ? &h->root : NULL), name, howto->name,
   3485   1.1.1.5  christos 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   3486       1.1     skrll 	  else
   3487       1.1     skrll 	    {
   3488   1.1.1.6  christos 	      _bfd_error_handler
   3489   1.1.1.6  christos 		/* xgettext:c-format */
   3490   1.1.1.7  christos 		(_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
   3491       1.1     skrll 		 input_bfd, input_section,
   3492   1.1.1.7  christos 		 (uint64_t) rel->r_offset, name, (int) r);
   3493   1.1.1.9  christos 	      return false;
   3494       1.1     skrll 	    }
   3495       1.1     skrll 	}
   3496       1.1     skrll     }
   3497       1.1     skrll 
   3498   1.1.1.9  christos   return true;
   3499       1.1     skrll }
   3500       1.1     skrll 
   3501   1.1.1.3  christos /* Generate the PLT slots together with the dynamic relocations needed
   3502   1.1.1.3  christos    for IFUNC symbols.  */
   3503   1.1.1.3  christos 
   3504   1.1.1.3  christos static void
   3505   1.1.1.3  christos elf_s390_finish_ifunc_symbol (bfd *output_bfd,
   3506   1.1.1.3  christos 			      struct bfd_link_info *info,
   3507   1.1.1.3  christos 			      struct elf_link_hash_entry *h,
   3508   1.1.1.3  christos 			      struct elf_s390_link_hash_table *htab,
   3509   1.1.1.3  christos 			      bfd_vma plt_offset,
   3510   1.1.1.3  christos 			      bfd_vma resolver_address)
   3511   1.1.1.3  christos {
   3512   1.1.1.3  christos   bfd_vma plt_index;
   3513   1.1.1.3  christos   bfd_vma got_offset;
   3514   1.1.1.3  christos   Elf_Internal_Rela rela;
   3515   1.1.1.3  christos   bfd_byte *loc;
   3516   1.1.1.3  christos   asection *plt, *gotplt, *relplt;
   3517   1.1.1.3  christos 
   3518   1.1.1.3  christos   if (htab->elf.iplt == NULL
   3519   1.1.1.3  christos       || htab->elf.igotplt == NULL
   3520   1.1.1.3  christos       || htab->elf.irelplt == NULL)
   3521   1.1.1.3  christos     abort ();
   3522   1.1.1.3  christos 
   3523   1.1.1.3  christos   /* Index of the PLT slot within iplt section.  */
   3524   1.1.1.3  christos   plt_index = plt_offset / PLT_ENTRY_SIZE;
   3525   1.1.1.3  christos   plt = htab->elf.iplt;
   3526   1.1.1.3  christos   /* Offset into the igot.plt section.  */
   3527   1.1.1.3  christos   got_offset = plt_index * GOT_ENTRY_SIZE;
   3528   1.1.1.3  christos   gotplt = htab->elf.igotplt;
   3529   1.1.1.3  christos   relplt = htab->elf.irelplt;
   3530   1.1.1.3  christos 
   3531   1.1.1.3  christos   /* Fill in the blueprint of a PLT.  */
   3532   1.1.1.3  christos   memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
   3533   1.1.1.3  christos 	  PLT_ENTRY_SIZE);
   3534   1.1.1.3  christos 
   3535   1.1.1.3  christos   /* Fixup the relative address to the GOT entry */
   3536   1.1.1.3  christos   bfd_put_32 (output_bfd,
   3537   1.1.1.3  christos 	      (gotplt->output_section->vma +
   3538   1.1.1.3  christos 	       gotplt->output_offset + got_offset
   3539   1.1.1.3  christos 	       - (plt->output_section->vma +
   3540   1.1.1.3  christos 		  plt->output_offset +
   3541   1.1.1.3  christos 		  plt_offset))/2,
   3542   1.1.1.3  christos 	      plt->contents + plt_offset + 2);
   3543   1.1.1.3  christos   /* Fixup the relative branch to PLT 0 */
   3544   1.1.1.3  christos   bfd_put_32 (output_bfd, - (plt->output_offset +
   3545   1.1.1.3  christos 			     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
   3546   1.1.1.3  christos 	      plt->contents + plt_offset + 24);
   3547   1.1.1.3  christos   /* Fixup offset into .rela.plt section.  */
   3548   1.1.1.3  christos   bfd_put_32 (output_bfd, relplt->output_offset +
   3549   1.1.1.3  christos 	      plt_index * sizeof (Elf64_External_Rela),
   3550   1.1.1.3  christos 	      plt->contents + plt_offset + 28);
   3551   1.1.1.3  christos 
   3552   1.1.1.3  christos   /* Fill in the entry in the global offset table.
   3553   1.1.1.3  christos      Points to instruction after GOT offset.  */
   3554   1.1.1.3  christos   bfd_put_64 (output_bfd,
   3555   1.1.1.3  christos 	      (plt->output_section->vma
   3556   1.1.1.3  christos 	       + plt->output_offset
   3557   1.1.1.3  christos 	       + plt_offset
   3558   1.1.1.3  christos 	       + 14),
   3559   1.1.1.3  christos 	      gotplt->contents + got_offset);
   3560   1.1.1.3  christos 
   3561   1.1.1.3  christos   /* Fill in the entry in the .rela.plt section.  */
   3562   1.1.1.3  christos   rela.r_offset = (gotplt->output_section->vma
   3563   1.1.1.3  christos 		   + gotplt->output_offset
   3564   1.1.1.3  christos 		   + got_offset);
   3565   1.1.1.3  christos 
   3566   1.1.1.3  christos   if (!h
   3567   1.1.1.3  christos       || h->dynindx == -1
   3568   1.1.1.4  christos       || ((bfd_link_executable (info)
   3569   1.1.1.3  christos 	   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   3570   1.1.1.3  christos 	  && h->def_regular))
   3571   1.1.1.3  christos     {
   3572   1.1.1.3  christos       /* The symbol can be locally resolved.  */
   3573   1.1.1.3  christos       rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
   3574   1.1.1.3  christos       rela.r_addend = resolver_address;
   3575   1.1.1.3  christos     }
   3576   1.1.1.3  christos   else
   3577   1.1.1.3  christos     {
   3578   1.1.1.3  christos       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
   3579   1.1.1.3  christos       rela.r_addend = 0;
   3580   1.1.1.3  christos     }
   3581   1.1.1.3  christos 
   3582   1.1.1.3  christos   loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
   3583   1.1.1.3  christos   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3584   1.1.1.3  christos }
   3585   1.1.1.3  christos 
   3586   1.1.1.3  christos 
   3587       1.1     skrll /* Finish up dynamic symbol handling.  We set the contents of various
   3588       1.1     skrll    dynamic sections here.  */
   3589       1.1     skrll 
   3590   1.1.1.9  christos static bool
   3591   1.1.1.2  christos elf_s390_finish_dynamic_symbol (bfd *output_bfd,
   3592   1.1.1.2  christos 				struct bfd_link_info *info,
   3593   1.1.1.2  christos 				struct elf_link_hash_entry *h,
   3594   1.1.1.2  christos 				Elf_Internal_Sym *sym)
   3595       1.1     skrll {
   3596       1.1     skrll   struct elf_s390_link_hash_table *htab;
   3597   1.1.1.3  christos   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
   3598       1.1     skrll 
   3599       1.1     skrll   htab = elf_s390_hash_table (info);
   3600       1.1     skrll 
   3601       1.1     skrll   if (h->plt.offset != (bfd_vma) -1)
   3602       1.1     skrll     {
   3603       1.1     skrll       bfd_vma plt_index;
   3604   1.1.1.8  christos       bfd_vma gotplt_offset;
   3605       1.1     skrll       Elf_Internal_Rela rela;
   3606       1.1     skrll       bfd_byte *loc;
   3607       1.1     skrll 
   3608       1.1     skrll       /* This symbol has an entry in the procedure linkage table.  Set
   3609       1.1     skrll 	 it up.  */
   3610   1.1.1.4  christos       if (s390_is_ifunc_symbol_p (h) && h->def_regular)
   3611   1.1.1.3  christos 	{
   3612   1.1.1.4  christos 	  elf_s390_finish_ifunc_symbol (output_bfd, info, h,
   3613   1.1.1.4  christos 	    htab, h->plt.offset,
   3614   1.1.1.4  christos 	    eh->ifunc_resolver_address +
   3615   1.1.1.4  christos 	    eh->ifunc_resolver_section->output_offset +
   3616   1.1.1.4  christos 	    eh->ifunc_resolver_section->output_section->vma);
   3617   1.1.1.4  christos 
   3618   1.1.1.4  christos 	  /* Do not return yet.  Handling of explicit GOT slots of
   3619   1.1.1.4  christos 	     IFUNC symbols is below.  */
   3620   1.1.1.3  christos 	}
   3621   1.1.1.3  christos       else
   3622   1.1.1.3  christos 	{
   3623   1.1.1.3  christos 	  if (h->dynindx == -1
   3624   1.1.1.3  christos 	      || htab->elf.splt == NULL
   3625   1.1.1.3  christos 	      || htab->elf.sgotplt == NULL
   3626   1.1.1.3  christos 	      || htab->elf.srelplt == NULL)
   3627   1.1.1.3  christos 	    abort ();
   3628       1.1     skrll 
   3629   1.1.1.3  christos 	  /* Calc. index no.
   3630   1.1.1.3  christos 	     Current offset - size first entry / entry size.  */
   3631   1.1.1.3  christos 	  plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
   3632   1.1.1.3  christos 
   3633   1.1.1.8  christos 	  /* The slots in the .got.plt correspond to the PLT slots in
   3634   1.1.1.8  christos 	     the same order.  */
   3635   1.1.1.8  christos 	  gotplt_offset = plt_index * GOT_ENTRY_SIZE;
   3636   1.1.1.8  christos 
   3637   1.1.1.8  christos 	  /* If .got.plt comes first it needs to contain the 3 header
   3638   1.1.1.8  christos 	     entries.  */
   3639   1.1.1.8  christos 	  if (!s390_gotplt_after_got_p (info))
   3640   1.1.1.8  christos 	    gotplt_offset += 3 * GOT_ENTRY_SIZE;
   3641   1.1.1.3  christos 
   3642   1.1.1.3  christos 	  /* Fill in the blueprint of a PLT.  */
   3643   1.1.1.3  christos 	  memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
   3644   1.1.1.3  christos 		  PLT_ENTRY_SIZE);
   3645       1.1     skrll 
   3646   1.1.1.8  christos 	  /* The first instruction in the PLT entry is a LARL loading
   3647   1.1.1.8  christos 	     the address of the GOT slot.  We write the 4 byte
   3648   1.1.1.8  christos 	     immediate operand of the LARL instruction here.  */
   3649   1.1.1.3  christos 	  bfd_put_32 (output_bfd,
   3650   1.1.1.3  christos 		      (htab->elf.sgotplt->output_section->vma +
   3651   1.1.1.8  christos 		       htab->elf.sgotplt->output_offset + gotplt_offset
   3652   1.1.1.3  christos 		       - (htab->elf.splt->output_section->vma +
   3653   1.1.1.3  christos 			  htab->elf.splt->output_offset +
   3654   1.1.1.3  christos 			  h->plt.offset))/2,
   3655   1.1.1.3  christos 		      htab->elf.splt->contents + h->plt.offset + 2);
   3656   1.1.1.3  christos 	  /* Fixup the relative branch to PLT 0 */
   3657   1.1.1.3  christos 	  bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
   3658   1.1.1.3  christos 				     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
   3659   1.1.1.3  christos 		      htab->elf.splt->contents + h->plt.offset + 24);
   3660   1.1.1.3  christos 	  /* Fixup offset into .rela.plt section.  */
   3661   1.1.1.3  christos 	  bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
   3662   1.1.1.3  christos 		      htab->elf.splt->contents + h->plt.offset + 28);
   3663       1.1     skrll 
   3664   1.1.1.3  christos 	  /* Fill in the entry in the global offset table.
   3665   1.1.1.3  christos 	     Points to instruction after GOT offset.  */
   3666   1.1.1.3  christos 	  bfd_put_64 (output_bfd,
   3667   1.1.1.3  christos 		      (htab->elf.splt->output_section->vma
   3668   1.1.1.3  christos 		       + htab->elf.splt->output_offset
   3669   1.1.1.3  christos 		       + h->plt.offset
   3670   1.1.1.3  christos 		       + 14),
   3671   1.1.1.8  christos 		      htab->elf.sgotplt->contents + gotplt_offset);
   3672   1.1.1.3  christos 
   3673   1.1.1.3  christos 	  /* Fill in the entry in the .rela.plt section.  */
   3674   1.1.1.3  christos 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
   3675   1.1.1.3  christos 			   + htab->elf.sgotplt->output_offset
   3676   1.1.1.8  christos 			   + gotplt_offset);
   3677   1.1.1.3  christos 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
   3678   1.1.1.3  christos 	  rela.r_addend = 0;
   3679   1.1.1.3  christos 	  loc = htab->elf.srelplt->contents + plt_index *
   3680   1.1.1.3  christos 	    sizeof (Elf64_External_Rela);
   3681   1.1.1.3  christos 	  bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3682   1.1.1.3  christos 
   3683   1.1.1.3  christos 	  if (!h->def_regular)
   3684   1.1.1.3  christos 	    {
   3685   1.1.1.3  christos 	      /* Mark the symbol as undefined, rather than as defined in
   3686   1.1.1.3  christos 		 the .plt section.  Leave the value alone.  This is a clue
   3687   1.1.1.3  christos 		 for the dynamic linker, to make function pointer
   3688   1.1.1.3  christos 		 comparisons work between an application and shared
   3689   1.1.1.3  christos 		 library.  */
   3690   1.1.1.3  christos 	      sym->st_shndx = SHN_UNDEF;
   3691   1.1.1.3  christos 	    }
   3692       1.1     skrll 	}
   3693       1.1     skrll     }
   3694       1.1     skrll 
   3695       1.1     skrll   if (h->got.offset != (bfd_vma) -1
   3696       1.1     skrll       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
   3697       1.1     skrll       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
   3698       1.1     skrll       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
   3699       1.1     skrll     {
   3700       1.1     skrll       Elf_Internal_Rela rela;
   3701       1.1     skrll       bfd_byte *loc;
   3702       1.1     skrll 
   3703       1.1     skrll       /* This symbol has an entry in the global offset table.  Set it
   3704       1.1     skrll 	 up.  */
   3705   1.1.1.3  christos       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
   3706       1.1     skrll 	abort ();
   3707       1.1     skrll 
   3708   1.1.1.3  christos       rela.r_offset = (htab->elf.sgot->output_section->vma
   3709   1.1.1.3  christos 		       + htab->elf.sgot->output_offset
   3710       1.1     skrll 		       + (h->got.offset &~ (bfd_vma) 1));
   3711       1.1     skrll 
   3712   1.1.1.3  christos       if (h->def_regular && s390_is_ifunc_symbol_p (h))
   3713   1.1.1.3  christos 	{
   3714   1.1.1.4  christos 	  if (bfd_link_pic (info))
   3715   1.1.1.3  christos 	    {
   3716   1.1.1.3  christos 	      /* An explicit GOT slot usage needs GLOB_DAT.  If the
   3717   1.1.1.3  christos 		 symbol references local the implicit got.iplt slot
   3718   1.1.1.3  christos 		 will be used and the IRELATIVE reloc has been created
   3719   1.1.1.3  christos 		 above.  */
   3720   1.1.1.3  christos 	      goto do_glob_dat;
   3721   1.1.1.3  christos 	    }
   3722   1.1.1.3  christos 	  else
   3723   1.1.1.3  christos 	    {
   3724   1.1.1.3  christos 	      /* For non-shared objects explicit GOT slots must be
   3725   1.1.1.3  christos 		 filled with the PLT slot address for pointer
   3726   1.1.1.3  christos 		 equality reasons.  */
   3727   1.1.1.3  christos 	      bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
   3728   1.1.1.3  christos 				       + htab->elf.iplt->output_offset
   3729   1.1.1.3  christos 				       + h->plt.offset),
   3730   1.1.1.3  christos 			  htab->elf.sgot->contents + h->got.offset);
   3731   1.1.1.9  christos 	      return true;
   3732   1.1.1.3  christos 	    }
   3733   1.1.1.3  christos 	}
   3734  1.1.1.11  christos       else if (SYMBOL_REFERENCES_LOCAL (info, h))
   3735       1.1     skrll 	{
   3736   1.1.1.6  christos 	  if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
   3737   1.1.1.9  christos 	    return true;
   3738   1.1.1.6  christos 
   3739   1.1.1.3  christos 	  /* If this is a static link, or it is a -Bsymbolic link and
   3740   1.1.1.3  christos 	     the symbol is defined locally or was forced to be local
   3741   1.1.1.3  christos 	     because of a version file, we just want to emit a
   3742   1.1.1.3  christos 	     RELATIVE reloc.  The entry in the global offset table
   3743   1.1.1.3  christos 	     will already have been initialized in the
   3744   1.1.1.3  christos 	     relocate_section function.  */
   3745   1.1.1.6  christos 	  if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
   3746   1.1.1.9  christos 	    return false;
   3747       1.1     skrll 	  BFD_ASSERT((h->got.offset & 1) != 0);
   3748       1.1     skrll 	  rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
   3749       1.1     skrll 	  rela.r_addend = (h->root.u.def.value
   3750       1.1     skrll 			   + h->root.u.def.section->output_section->vma
   3751       1.1     skrll 			   + h->root.u.def.section->output_offset);
   3752       1.1     skrll 	}
   3753       1.1     skrll       else
   3754       1.1     skrll 	{
   3755       1.1     skrll 	  BFD_ASSERT((h->got.offset & 1) == 0);
   3756   1.1.1.6  christos 	do_glob_dat:
   3757   1.1.1.3  christos 	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
   3758       1.1     skrll 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
   3759       1.1     skrll 	  rela.r_addend = 0;
   3760       1.1     skrll 	}
   3761       1.1     skrll 
   3762   1.1.1.3  christos       loc = htab->elf.srelgot->contents;
   3763   1.1.1.3  christos       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
   3764       1.1     skrll       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3765       1.1     skrll     }
   3766       1.1     skrll 
   3767       1.1     skrll   if (h->needs_copy)
   3768       1.1     skrll     {
   3769       1.1     skrll       Elf_Internal_Rela rela;
   3770   1.1.1.6  christos       asection *s;
   3771       1.1     skrll       bfd_byte *loc;
   3772       1.1     skrll 
   3773       1.1     skrll       /* This symbols needs a copy reloc.  Set it up.  */
   3774       1.1     skrll 
   3775       1.1     skrll       if (h->dynindx == -1
   3776       1.1     skrll 	  || (h->root.type != bfd_link_hash_defined
   3777       1.1     skrll 	      && h->root.type != bfd_link_hash_defweak)
   3778  1.1.1.12  christos 	  || htab->elf.srelbss == NULL
   3779  1.1.1.12  christos 	  || htab->elf.sreldynrelro == NULL)
   3780       1.1     skrll 	abort ();
   3781       1.1     skrll 
   3782       1.1     skrll       rela.r_offset = (h->root.u.def.value
   3783       1.1     skrll 		       + h->root.u.def.section->output_section->vma
   3784       1.1     skrll 		       + h->root.u.def.section->output_offset);
   3785       1.1     skrll       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
   3786       1.1     skrll       rela.r_addend = 0;
   3787   1.1.1.6  christos       if (h->root.u.def.section == htab->elf.sdynrelro)
   3788   1.1.1.6  christos 	s = htab->elf.sreldynrelro;
   3789   1.1.1.6  christos       else
   3790   1.1.1.6  christos 	s = htab->elf.srelbss;
   3791   1.1.1.6  christos       loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
   3792       1.1     skrll       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
   3793       1.1     skrll     }
   3794       1.1     skrll 
   3795       1.1     skrll   /* Mark some specially defined symbols as absolute.  */
   3796   1.1.1.4  christos   if (h == htab->elf.hdynamic
   3797       1.1     skrll       || h == htab->elf.hgot
   3798       1.1     skrll       || h == htab->elf.hplt)
   3799       1.1     skrll     sym->st_shndx = SHN_ABS;
   3800       1.1     skrll 
   3801   1.1.1.9  christos   return true;
   3802       1.1     skrll }
   3803       1.1     skrll 
   3804       1.1     skrll /* Used to decide how to sort relocs in an optimal manner for the
   3805       1.1     skrll    dynamic linker, before writing them out.  */
   3806       1.1     skrll 
   3807       1.1     skrll static enum elf_reloc_type_class
   3808   1.1.1.4  christos elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   3809   1.1.1.4  christos 			   const asection *rel_sec ATTRIBUTE_UNUSED,
   3810   1.1.1.4  christos 			   const Elf_Internal_Rela *rela)
   3811   1.1.1.4  christos {
   3812   1.1.1.4  christos   bfd *abfd = info->output_bfd;
   3813  1.1.1.12  christos   elf_backend_data *bed = get_elf_backend_data (abfd);
   3814   1.1.1.4  christos   struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
   3815   1.1.1.4  christos   unsigned long r_symndx = ELF64_R_SYM (rela->r_info);
   3816   1.1.1.4  christos   Elf_Internal_Sym sym;
   3817   1.1.1.4  christos 
   3818   1.1.1.4  christos   if (htab->elf.dynsym == NULL
   3819   1.1.1.4  christos       || !bed->s->swap_symbol_in (abfd,
   3820   1.1.1.4  christos 				  (htab->elf.dynsym->contents
   3821   1.1.1.4  christos 				   + r_symndx * bed->s->sizeof_sym),
   3822   1.1.1.4  christos 				  0, &sym))
   3823   1.1.1.4  christos     abort ();
   3824   1.1.1.4  christos 
   3825   1.1.1.4  christos   /* Check relocation against STT_GNU_IFUNC symbol.  */
   3826   1.1.1.4  christos   if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
   3827   1.1.1.4  christos     return reloc_class_ifunc;
   3828   1.1.1.4  christos 
   3829       1.1     skrll   switch ((int) ELF64_R_TYPE (rela->r_info))
   3830       1.1     skrll     {
   3831       1.1     skrll     case R_390_RELATIVE:
   3832       1.1     skrll       return reloc_class_relative;
   3833       1.1     skrll     case R_390_JMP_SLOT:
   3834       1.1     skrll       return reloc_class_plt;
   3835       1.1     skrll     case R_390_COPY:
   3836       1.1     skrll       return reloc_class_copy;
   3837       1.1     skrll     default:
   3838       1.1     skrll       return reloc_class_normal;
   3839       1.1     skrll     }
   3840       1.1     skrll }
   3841       1.1     skrll 
   3842       1.1     skrll /* Finish up the dynamic sections.  */
   3843       1.1     skrll 
   3844   1.1.1.9  christos static bool
   3845   1.1.1.2  christos elf_s390_finish_dynamic_sections (bfd *output_bfd,
   3846  1.1.1.12  christos 				  struct bfd_link_info *info,
   3847  1.1.1.12  christos 				  bfd_byte *buf)
   3848       1.1     skrll {
   3849       1.1     skrll   struct elf_s390_link_hash_table *htab;
   3850       1.1     skrll   bfd *dynobj;
   3851       1.1     skrll   asection *sdyn;
   3852   1.1.1.3  christos   bfd *ibfd;
   3853   1.1.1.3  christos   unsigned int i;
   3854       1.1     skrll 
   3855       1.1     skrll   htab = elf_s390_hash_table (info);
   3856   1.1.1.2  christos   if (htab == NULL)
   3857   1.1.1.9  christos     return false;
   3858   1.1.1.2  christos 
   3859       1.1     skrll   dynobj = htab->elf.dynobj;
   3860   1.1.1.3  christos   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   3861       1.1     skrll 
   3862       1.1     skrll   if (htab->elf.dynamic_sections_created)
   3863       1.1     skrll     {
   3864       1.1     skrll       Elf64_External_Dyn *dyncon, *dynconend;
   3865       1.1     skrll 
   3866   1.1.1.3  christos       if (sdyn == NULL || htab->elf.sgot == NULL)
   3867       1.1     skrll 	abort ();
   3868       1.1     skrll 
   3869       1.1     skrll       dyncon = (Elf64_External_Dyn *) sdyn->contents;
   3870       1.1     skrll       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
   3871       1.1     skrll       for (; dyncon < dynconend; dyncon++)
   3872       1.1     skrll 	{
   3873       1.1     skrll 	  Elf_Internal_Dyn dyn;
   3874       1.1     skrll 	  asection *s;
   3875       1.1     skrll 
   3876       1.1     skrll 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
   3877       1.1     skrll 
   3878       1.1     skrll 	  switch (dyn.d_tag)
   3879       1.1     skrll 	    {
   3880       1.1     skrll 	    default:
   3881       1.1     skrll 	      continue;
   3882       1.1     skrll 
   3883       1.1     skrll 	    case DT_PLTGOT:
   3884   1.1.1.8  christos 	      /* DT_PLTGOT matches _GLOBAL_OFFSET_TABLE_ */
   3885   1.1.1.8  christos 	      dyn.d_un.d_ptr = s390_got_pointer (info);
   3886       1.1     skrll 	      break;
   3887       1.1     skrll 
   3888       1.1     skrll 	    case DT_JMPREL:
   3889   1.1.1.5  christos 	      s = htab->elf.srelplt;
   3890   1.1.1.5  christos 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   3891       1.1     skrll 	      break;
   3892       1.1     skrll 
   3893       1.1     skrll 	    case DT_PLTRELSZ:
   3894   1.1.1.6  christos 	      dyn.d_un.d_val = htab->elf.srelplt->size;
   3895   1.1.1.6  christos 	      if (htab->elf.irelplt)
   3896   1.1.1.6  christos 		dyn.d_un.d_val += htab->elf.irelplt->size;
   3897       1.1     skrll 	      break;
   3898       1.1     skrll 
   3899       1.1     skrll 	    case DT_RELASZ:
   3900       1.1     skrll 	      /* The procedure linkage table relocs (DT_JMPREL) should
   3901       1.1     skrll 		 not be included in the overall relocs (DT_RELA).
   3902       1.1     skrll 		 Therefore, we override the DT_RELASZ entry here to
   3903       1.1     skrll 		 make it not include the JMPREL relocs.  Since the
   3904       1.1     skrll 		 linker script arranges for .rela.plt to follow all
   3905       1.1     skrll 		 other relocation sections, we don't have to worry
   3906       1.1     skrll 		 about changing the DT_RELA entry.  */
   3907   1.1.1.6  christos 	      dyn.d_un.d_val -= htab->elf.srelplt->size;
   3908   1.1.1.6  christos 	      if (htab->elf.irelplt)
   3909   1.1.1.6  christos 		dyn.d_un.d_val -= htab->elf.irelplt->size;
   3910       1.1     skrll 	      break;
   3911       1.1     skrll 	    }
   3912       1.1     skrll 
   3913       1.1     skrll 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
   3914       1.1     skrll 	}
   3915       1.1     skrll 
   3916       1.1     skrll       /* Fill in the special first entry in the procedure linkage table.  */
   3917   1.1.1.3  christos       if (htab->elf.splt && htab->elf.splt->size > 0)
   3918       1.1     skrll 	{
   3919       1.1     skrll 	  /* fill in blueprint for plt 0 entry */
   3920   1.1.1.3  christos 	  memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
   3921   1.1.1.3  christos 		  PLT_FIRST_ENTRY_SIZE);
   3922   1.1.1.8  christos 	  /* The second instruction in the first PLT entry is a LARL
   3923   1.1.1.8  christos 	     loading the GOT pointer.  Fill in the LARL immediate
   3924   1.1.1.8  christos 	     address.  */
   3925       1.1     skrll 	  bfd_put_32 (output_bfd,
   3926   1.1.1.8  christos 		      (s390_got_pointer (info)
   3927   1.1.1.5  christos 		       - htab->elf.splt->output_section->vma
   3928   1.1.1.5  christos 		       - htab->elf.splt->output_offset - 6)/2,
   3929   1.1.1.3  christos 		      htab->elf.splt->contents + 8);
   3930       1.1     skrll 	}
   3931   1.1.1.4  christos       if (elf_section_data (htab->elf.splt->output_section) != NULL)
   3932   1.1.1.4  christos 	elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
   3933   1.1.1.4  christos 	  = PLT_ENTRY_SIZE;
   3934       1.1     skrll     }
   3935       1.1     skrll 
   3936   1.1.1.8  christos   if (htab->elf.hgot && htab->elf.hgot->root.u.def.section)
   3937       1.1     skrll     {
   3938       1.1     skrll       /* Fill in the first three entries in the global offset table.  */
   3939   1.1.1.8  christos       if (htab->elf.hgot->root.u.def.section->size > 0)
   3940       1.1     skrll 	{
   3941       1.1     skrll 	  bfd_put_64 (output_bfd,
   3942       1.1     skrll 		      (sdyn == NULL ? (bfd_vma) 0
   3943       1.1     skrll 		       : sdyn->output_section->vma + sdyn->output_offset),
   3944   1.1.1.8  christos 		      htab->elf.hgot->root.u.def.section->contents);
   3945       1.1     skrll 	  /* One entry for shared object struct ptr.  */
   3946   1.1.1.8  christos 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
   3947   1.1.1.8  christos 		      htab->elf.hgot->root.u.def.section->contents + 8);
   3948       1.1     skrll 	  /* One entry for _dl_runtime_resolve.  */
   3949   1.1.1.8  christos 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
   3950   1.1.1.8  christos 		      htab->elf.hgot->root.u.def.section->contents + 16);
   3951       1.1     skrll 	}
   3952   1.1.1.9  christos       if (htab->elf.sgot != NULL && htab->elf.sgot->size > 0)
   3953   1.1.1.9  christos 	elf_section_data (htab->elf.sgot->output_section)
   3954   1.1.1.9  christos 	  ->this_hdr.sh_entsize = 8;
   3955       1.1     skrll     }
   3956   1.1.1.3  christos 
   3957   1.1.1.3  christos   /* Finish dynamic symbol for local IFUNC symbols.  */
   3958   1.1.1.4  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   3959   1.1.1.3  christos     {
   3960   1.1.1.3  christos       struct plt_entry *local_plt;
   3961   1.1.1.3  christos       Elf_Internal_Sym *isym;
   3962   1.1.1.3  christos       Elf_Internal_Shdr *symtab_hdr;
   3963   1.1.1.3  christos 
   3964   1.1.1.3  christos       symtab_hdr = &elf_symtab_hdr (ibfd);
   3965   1.1.1.3  christos 
   3966   1.1.1.6  christos       if (!is_s390_elf (ibfd))
   3967   1.1.1.6  christos 	continue;
   3968   1.1.1.6  christos 
   3969   1.1.1.3  christos       local_plt = elf_s390_local_plt (ibfd);
   3970   1.1.1.3  christos       if (local_plt != NULL)
   3971   1.1.1.3  christos 	for (i = 0; i < symtab_hdr->sh_info; i++)
   3972   1.1.1.3  christos 	  {
   3973   1.1.1.3  christos 	    if (local_plt[i].plt.offset != (bfd_vma) -1)
   3974   1.1.1.3  christos 	      {
   3975   1.1.1.3  christos 		asection *sec = local_plt[i].sec;
   3976   1.1.1.9  christos 		isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd, i);
   3977   1.1.1.3  christos 		if (isym == NULL)
   3978   1.1.1.9  christos 		  return false;
   3979   1.1.1.3  christos 
   3980   1.1.1.3  christos 		if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
   3981   1.1.1.3  christos 		  elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
   3982   1.1.1.3  christos 						local_plt[i].plt.offset,
   3983   1.1.1.3  christos 						isym->st_value
   3984   1.1.1.3  christos 						+ sec->output_section->vma
   3985   1.1.1.3  christos 						+ sec->output_offset);
   3986   1.1.1.3  christos 
   3987   1.1.1.3  christos 	      }
   3988   1.1.1.3  christos 	  }
   3989   1.1.1.3  christos     }
   3990   1.1.1.3  christos 
   3991  1.1.1.11  christos   /* Adjust .eh_frame for .plt section.  */
   3992  1.1.1.11  christos   if (htab->plt_eh_frame != NULL
   3993  1.1.1.11  christos       && htab->plt_eh_frame->contents != NULL)
   3994  1.1.1.11  christos     {
   3995  1.1.1.11  christos       if (htab->elf.splt != NULL
   3996  1.1.1.11  christos 	  && htab->elf.splt->size != 0
   3997  1.1.1.11  christos 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
   3998  1.1.1.11  christos 	  && htab->elf.splt->output_section != NULL
   3999  1.1.1.11  christos 	  && htab->plt_eh_frame->output_section != NULL)
   4000  1.1.1.11  christos 	{
   4001  1.1.1.11  christos 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
   4002  1.1.1.11  christos 	  bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
   4003  1.1.1.11  christos 				   + htab->plt_eh_frame->output_offset
   4004  1.1.1.11  christos 				   + PLT_FDE_START_OFFSET;
   4005  1.1.1.11  christos 	  /* Note: Linker may have discarded the FDE, so that store may
   4006  1.1.1.11  christos 	     be beyond current htab->plt_eh_frame->size.  Can be ignored,
   4007  1.1.1.11  christos 	     as htab->plt_eh_frame->contents got allocated with
   4008  1.1.1.11  christos 	     sizeof (elf_s390x_eh_frame_plt).  See PR 12570.  */
   4009  1.1.1.11  christos 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
   4010  1.1.1.11  christos 			     htab->plt_eh_frame->contents
   4011  1.1.1.11  christos 			     + PLT_FDE_START_OFFSET);
   4012  1.1.1.11  christos 	}
   4013  1.1.1.11  christos 
   4014  1.1.1.12  christos       if (htab->plt_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
   4015  1.1.1.12  christos 	  && !_bfd_elf_write_linker_section_eh_frame (output_bfd, info,
   4016  1.1.1.12  christos 						      htab->plt_eh_frame, buf))
   4017  1.1.1.12  christos 	return NULL;
   4018  1.1.1.11  christos     }
   4019  1.1.1.11  christos 
   4020  1.1.1.11  christos   /* Make any adjustment if necessary and merge .sframe section to
   4021  1.1.1.11  christos      create the final .sframe section for output_bfd.  */
   4022  1.1.1.11  christos   if (htab->plt_sframe != NULL
   4023  1.1.1.11  christos       && htab->plt_sframe->contents != NULL)
   4024  1.1.1.11  christos     {
   4025  1.1.1.11  christos       if (htab->elf.splt != NULL
   4026  1.1.1.11  christos 	  && htab->elf.splt->size != 0
   4027  1.1.1.11  christos 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
   4028  1.1.1.11  christos 	  && htab->elf.splt->output_section != NULL
   4029  1.1.1.11  christos 	  && htab->plt_sframe->output_section != NULL)
   4030  1.1.1.11  christos 	{
   4031  1.1.1.11  christos 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
   4032  1.1.1.11  christos 	  bfd_vma sframe_start = htab->plt_sframe->output_section->vma
   4033  1.1.1.11  christos 				   + htab->plt_sframe->output_offset
   4034  1.1.1.11  christos 				   + PLT_SFRAME_FDE_START_OFFSET;
   4035  1.1.1.12  christos 	  bfd_put_signed_64 (dynobj, plt_start - sframe_start,
   4036  1.1.1.11  christos 			     htab->plt_sframe->contents
   4037  1.1.1.11  christos 			     + PLT_SFRAME_FDE_START_OFFSET);
   4038  1.1.1.11  christos 	}
   4039  1.1.1.11  christos       if (htab->plt_sframe->sec_info_type == SEC_INFO_TYPE_SFRAME)
   4040  1.1.1.11  christos 	{
   4041  1.1.1.11  christos 	  if (! _bfd_elf_merge_section_sframe (output_bfd, info,
   4042  1.1.1.11  christos 					       htab->plt_sframe,
   4043  1.1.1.11  christos 					       htab->plt_sframe->contents))
   4044  1.1.1.11  christos 	    return false;
   4045  1.1.1.11  christos 	}
   4046  1.1.1.11  christos     }
   4047  1.1.1.11  christos 
   4048   1.1.1.9  christos   return true;
   4049       1.1     skrll }
   4050   1.1.1.6  christos 
   4051   1.1.1.6  christos /* Support for core dump NOTE sections.  */
   4053   1.1.1.9  christos 
   4054   1.1.1.6  christos static bool
   4055   1.1.1.6  christos elf_s390_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   4056   1.1.1.6  christos {
   4057   1.1.1.6  christos   int offset;
   4058   1.1.1.6  christos   size_t size;
   4059   1.1.1.6  christos 
   4060   1.1.1.6  christos   switch (note->descsz)
   4061   1.1.1.6  christos     {
   4062   1.1.1.9  christos     default:
   4063   1.1.1.6  christos       return false;
   4064   1.1.1.6  christos 
   4065   1.1.1.6  christos     case 336:			/* sizeof(struct elf_prstatus) on s390x */
   4066   1.1.1.6  christos       /* pr_cursig */
   4067   1.1.1.6  christos       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   4068   1.1.1.6  christos 
   4069   1.1.1.6  christos       /* pr_pid */
   4070   1.1.1.6  christos       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
   4071   1.1.1.6  christos 
   4072   1.1.1.6  christos       /* pr_reg */
   4073   1.1.1.6  christos       offset = 112;
   4074   1.1.1.6  christos       size = 216;
   4075   1.1.1.6  christos       break;
   4076   1.1.1.6  christos     }
   4077   1.1.1.6  christos 
   4078   1.1.1.6  christos   /* Make a ".reg/999" section.  */
   4079   1.1.1.6  christos   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   4080   1.1.1.6  christos 					  size, note->descpos + offset);
   4081   1.1.1.6  christos }
   4082   1.1.1.9  christos 
   4083   1.1.1.6  christos static bool
   4084   1.1.1.6  christos elf_s390_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   4085   1.1.1.6  christos {
   4086   1.1.1.6  christos   switch (note->descsz)
   4087   1.1.1.6  christos     {
   4088   1.1.1.9  christos     default:
   4089   1.1.1.6  christos       return false;
   4090   1.1.1.6  christos 
   4091   1.1.1.6  christos     case 136:			/* sizeof(struct elf_prpsinfo) on s390x */
   4092   1.1.1.6  christos       elf_tdata (abfd)->core->pid
   4093   1.1.1.6  christos 	= bfd_get_32 (abfd, note->descdata + 24);
   4094   1.1.1.6  christos       elf_tdata (abfd)->core->program
   4095   1.1.1.6  christos 	= _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
   4096   1.1.1.6  christos       elf_tdata (abfd)->core->command
   4097   1.1.1.6  christos 	= _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
   4098   1.1.1.6  christos     }
   4099   1.1.1.6  christos 
   4100   1.1.1.6  christos   /* Note that for some reason, a spurious space is tacked
   4101   1.1.1.6  christos      onto the end of the args in some (at least one anyway)
   4102   1.1.1.6  christos      implementations, so strip it off if it exists.  */
   4103   1.1.1.6  christos 
   4104   1.1.1.6  christos   {
   4105   1.1.1.6  christos     char *command = elf_tdata (abfd)->core->command;
   4106   1.1.1.6  christos     int n = strlen (command);
   4107   1.1.1.6  christos 
   4108   1.1.1.6  christos     if (0 < n && command[n - 1] == ' ')
   4109   1.1.1.6  christos       command[n - 1] = '\0';
   4110   1.1.1.6  christos   }
   4111   1.1.1.9  christos 
   4112   1.1.1.6  christos   return true;
   4113   1.1.1.6  christos }
   4114   1.1.1.6  christos 
   4115   1.1.1.6  christos static char *
   4116   1.1.1.6  christos elf_s390_write_core_note (bfd *abfd, char *buf, int *bufsiz,
   4117   1.1.1.6  christos 			  int note_type, ...)
   4118   1.1.1.6  christos {
   4119       1.1     skrll   va_list ap;
   4120   1.1.1.6  christos 
   4121   1.1.1.6  christos   switch (note_type)
   4122   1.1.1.6  christos     {
   4123   1.1.1.6  christos     default:
   4124   1.1.1.6  christos       return NULL;
   4125   1.1.1.6  christos 
   4126   1.1.1.6  christos     case NT_PRPSINFO:
   4127   1.1.1.7  christos       {
   4128   1.1.1.6  christos 	char data[136] ATTRIBUTE_NONSTRING = { 0 };
   4129   1.1.1.6  christos 	const char *fname, *psargs;
   4130   1.1.1.6  christos 
   4131   1.1.1.6  christos 	va_start (ap, note_type);
   4132   1.1.1.6  christos 	fname = va_arg (ap, const char *);
   4133   1.1.1.6  christos 	psargs = va_arg (ap, const char *);
   4134   1.1.1.6  christos 	va_end (ap);
   4135   1.1.1.6  christos 
   4136   1.1.1.8  christos 	strncpy (data + 40, fname, 16);
   4137   1.1.1.7  christos #if GCC_VERSION == 8000 || GCC_VERSION == 8001
   4138   1.1.1.8  christos 	DIAGNOSTIC_PUSH;
   4139   1.1.1.7  christos 	/* GCC 8.0 and 8.1 warn about 80 equals destination size with
   4140   1.1.1.7  christos 	   -Wstringop-truncation:
   4141   1.1.1.7  christos 	   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
   4142   1.1.1.7  christos 	 */
   4143   1.1.1.7  christos 	DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
   4144   1.1.1.6  christos #endif
   4145   1.1.1.8  christos 	strncpy (data + 56, psargs, 80);
   4146   1.1.1.7  christos #if GCC_VERSION == 8000 || GCC_VERSION == 8001
   4147   1.1.1.7  christos 	DIAGNOSTIC_POP;
   4148   1.1.1.6  christos #endif
   4149   1.1.1.6  christos 	return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
   4150   1.1.1.6  christos 				   &data, sizeof (data));
   4151   1.1.1.6  christos       }
   4152   1.1.1.6  christos 
   4153   1.1.1.6  christos     case NT_PRSTATUS:
   4154   1.1.1.6  christos       {
   4155   1.1.1.6  christos 	char data[336] = { 0 };
   4156   1.1.1.6  christos 	long pid;
   4157   1.1.1.6  christos 	int cursig;
   4158   1.1.1.6  christos 	const void *gregs;
   4159   1.1.1.6  christos 
   4160   1.1.1.6  christos 	va_start (ap, note_type);
   4161   1.1.1.6  christos 	pid = va_arg (ap, long);
   4162   1.1.1.6  christos 	cursig = va_arg (ap, int);
   4163   1.1.1.6  christos 	gregs = va_arg (ap, const void *);
   4164   1.1.1.6  christos 	va_end (ap);
   4165   1.1.1.6  christos 
   4166   1.1.1.6  christos 	bfd_put_16 (abfd, cursig, data + 12);
   4167   1.1.1.6  christos 	bfd_put_32 (abfd, pid, data + 32);
   4168   1.1.1.6  christos 	memcpy (data + 112, gregs, 216);
   4169   1.1.1.6  christos 	return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
   4170   1.1.1.6  christos 				   &data, sizeof (data));
   4171   1.1.1.6  christos       }
   4172   1.1.1.6  christos     }
   4173   1.1.1.6  christos   /* NOTREACHED */
   4174   1.1.1.6  christos }
   4175       1.1     skrll 
   4176       1.1     skrll /* Return address for Ith PLT stub in section PLT, for relocation REL
   4178       1.1     skrll    or (bfd_vma) -1 if it should not be included.  */
   4179       1.1     skrll 
   4180       1.1     skrll static bfd_vma
   4181       1.1     skrll elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
   4182       1.1     skrll 		      const arelent *rel ATTRIBUTE_UNUSED)
   4183       1.1     skrll {
   4184       1.1     skrll   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
   4185   1.1.1.4  christos }
   4186   1.1.1.4  christos 
   4187   1.1.1.4  christos /* Merge backend specific data from an object file to the output
   4188   1.1.1.9  christos    object file when linking.  */
   4189   1.1.1.6  christos 
   4190   1.1.1.6  christos static bool
   4191  1.1.1.12  christos elf64_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   4192   1.1.1.9  christos {
   4193   1.1.1.6  christos   if (!is_s390_elf (ibfd))
   4194   1.1.1.6  christos     return true;
   4195   1.1.1.6  christos 
   4196   1.1.1.6  christos   return elf_s390_merge_obj_attributes (ibfd, info);
   4197   1.1.1.6  christos }
   4198   1.1.1.6  christos 
   4199   1.1.1.6  christos /* We may add a PT_S390_PGSTE program header.  */
   4200   1.1.1.6  christos 
   4201   1.1.1.6  christos static int
   4202   1.1.1.6  christos elf_s390_additional_program_headers (bfd *abfd ATTRIBUTE_UNUSED,
   4203   1.1.1.6  christos 				     struct bfd_link_info *info)
   4204   1.1.1.6  christos {
   4205   1.1.1.6  christos   struct elf_s390_link_hash_table *htab;
   4206   1.1.1.6  christos 
   4207   1.1.1.6  christos   if (info)
   4208   1.1.1.6  christos     {
   4209   1.1.1.6  christos       htab = elf_s390_hash_table (info);
   4210   1.1.1.6  christos       if (htab)
   4211   1.1.1.6  christos 	return htab->params->pgste;
   4212   1.1.1.6  christos     }
   4213   1.1.1.6  christos   return 0;
   4214   1.1.1.6  christos }
   4215   1.1.1.6  christos 
   4216   1.1.1.6  christos 
   4217   1.1.1.9  christos /* Add the PT_S390_PGSTE program header.  */
   4218   1.1.1.6  christos 
   4219   1.1.1.4  christos static bool
   4220   1.1.1.6  christos elf_s390_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
   4221   1.1.1.6  christos {
   4222   1.1.1.6  christos   struct elf_s390_link_hash_table *htab;
   4223   1.1.1.6  christos   struct elf_segment_map *m, *pm = NULL;
   4224   1.1.1.9  christos 
   4225   1.1.1.6  christos   if (!abfd || !info)
   4226   1.1.1.6  christos     return true;
   4227   1.1.1.6  christos 
   4228   1.1.1.9  christos   htab = elf_s390_hash_table (info);
   4229   1.1.1.6  christos   if (!htab || !htab->params->pgste)
   4230   1.1.1.6  christos     return true;
   4231   1.1.1.6  christos 
   4232   1.1.1.6  christos   /* If there is already a PT_S390_PGSTE header, avoid adding
   4233   1.1.1.6  christos      another.  */
   4234   1.1.1.6  christos   m = elf_seg_map (abfd);
   4235   1.1.1.6  christos   while (m && m->p_type != PT_S390_PGSTE)
   4236   1.1.1.6  christos     {
   4237   1.1.1.6  christos       pm = m;
   4238   1.1.1.6  christos       m = m->next;
   4239   1.1.1.6  christos     }
   4240   1.1.1.9  christos 
   4241   1.1.1.4  christos   if (m)
   4242   1.1.1.6  christos     return true;
   4243   1.1.1.6  christos 
   4244   1.1.1.6  christos   m = (struct elf_segment_map *)
   4245   1.1.1.9  christos     bfd_zalloc (abfd, sizeof (struct elf_segment_map));
   4246   1.1.1.6  christos   if (m == NULL)
   4247   1.1.1.6  christos     return false;
   4248   1.1.1.6  christos   m->p_type = PT_S390_PGSTE;
   4249   1.1.1.6  christos   m->count = 0;
   4250   1.1.1.6  christos   m->next = NULL;
   4251   1.1.1.4  christos   if (pm)
   4252   1.1.1.9  christos     pm->next = m;
   4253   1.1.1.4  christos 
   4254   1.1.1.4  christos   return true;
   4255   1.1.1.9  christos }
   4256   1.1.1.6  christos 
   4257   1.1.1.6  christos bool
   4258   1.1.1.6  christos bfd_elf_s390_set_options (struct bfd_link_info *info,
   4259   1.1.1.6  christos 			  struct s390_elf_params *params)
   4260   1.1.1.6  christos {
   4261   1.1.1.6  christos   struct elf_s390_link_hash_table *htab;
   4262   1.1.1.6  christos 
   4263   1.1.1.6  christos   if (info)
   4264   1.1.1.6  christos     {
   4265   1.1.1.6  christos       htab = elf_s390_hash_table (info);
   4266   1.1.1.6  christos       if (htab)
   4267   1.1.1.6  christos 	htab->params = params;
   4268   1.1.1.9  christos     }
   4269   1.1.1.6  christos 
   4270   1.1.1.6  christos   return true;
   4271  1.1.1.11  christos }
   4272  1.1.1.11  christos 
   4273  1.1.1.11  christos /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
   4274  1.1.1.11  christos    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
   4275  1.1.1.11  christos    hash table.  */
   4276  1.1.1.11  christos 
   4277  1.1.1.11  christos static bool
   4278  1.1.1.11  christos elf_s390_create_dynamic_sections (bfd *dynobj,
   4279  1.1.1.11  christos                                   struct bfd_link_info *info)
   4280  1.1.1.11  christos {
   4281  1.1.1.11  christos   struct elf_s390_link_hash_table *htab;
   4282  1.1.1.11  christos 
   4283  1.1.1.11  christos   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
   4284  1.1.1.11  christos     return false;
   4285  1.1.1.11  christos 
   4286  1.1.1.11  christos   htab = elf_s390_hash_table (info);
   4287  1.1.1.11  christos   if (htab == NULL)
   4288  1.1.1.11  christos     return false;
   4289  1.1.1.11  christos 
   4290  1.1.1.11  christos   htab->sframe_plt = &elf_s390x_sframe_plt;
   4291  1.1.1.11  christos 
   4292  1.1.1.11  christos   if (htab->elf.splt != NULL)
   4293  1.1.1.11  christos     {
   4294  1.1.1.11  christos       /* Create .eh_frame section for .plt section.  */
   4295  1.1.1.11  christos       if (!info->no_ld_generated_unwind_info)
   4296  1.1.1.11  christos         {
   4297  1.1.1.11  christos           flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
   4298  1.1.1.11  christos                             | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   4299  1.1.1.11  christos                             | SEC_LINKER_CREATED);
   4300  1.1.1.11  christos 
   4301  1.1.1.11  christos           if (htab->plt_eh_frame == NULL)
   4302  1.1.1.11  christos             {
   4303  1.1.1.11  christos               htab->plt_eh_frame
   4304  1.1.1.11  christos                 = bfd_make_section_anyway_with_flags (dynobj,
   4305  1.1.1.11  christos                                                       ".eh_frame",
   4306  1.1.1.11  christos                                                       flags);
   4307  1.1.1.11  christos               if (htab->plt_eh_frame == NULL
   4308  1.1.1.11  christos                   || !bfd_set_section_alignment (htab->plt_eh_frame, 3))
   4309  1.1.1.11  christos                 return false;
   4310  1.1.1.11  christos             }
   4311  1.1.1.12  christos         }
   4312  1.1.1.12  christos 
   4313  1.1.1.12  christos       /* Create .sframe section for .plt section.
   4314  1.1.1.12  christos 	 Do not make SFrame sections for dynobj unconditionally.  If there
   4315  1.1.1.12  christos 	 are no SFrame sections for any input files, skip creating the linker
   4316  1.1.1.12  christos 	 created SFrame sections too.  Since SFrame sections are marked KEEP,
   4317  1.1.1.12  christos 	 prohibiting these linker-created SFrame sections when unnecessary,
   4318  1.1.1.12  christos 	 helps avoid creating of empty SFrame sections in the output.  */
   4319  1.1.1.12  christos       bool gen_plt_sframe_p = (_bfd_elf_sframe_present_input_bfds (info)
   4320  1.1.1.11  christos 			       && !info->discard_sframe);
   4321  1.1.1.11  christos       if (gen_plt_sframe_p)
   4322  1.1.1.11  christos 	{
   4323  1.1.1.11  christos 	  flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
   4324  1.1.1.11  christos 			    | SEC_HAS_CONTENTS | SEC_IN_MEMORY
   4325  1.1.1.11  christos 			    | SEC_LINKER_CREATED);
   4326  1.1.1.11  christos 
   4327  1.1.1.11  christos 	  htab->plt_sframe = bfd_make_section_anyway_with_flags (dynobj,
   4328  1.1.1.11  christos 								 ".sframe",
   4329  1.1.1.11  christos 								 flags);
   4330  1.1.1.11  christos 	  if (htab->plt_sframe == NULL)
   4331  1.1.1.11  christos 	    return false;
   4332  1.1.1.11  christos 
   4333  1.1.1.11  christos 	  elf_section_type (htab->plt_sframe) = SHT_GNU_SFRAME;
   4334  1.1.1.11  christos 	}
   4335  1.1.1.11  christos     }
   4336  1.1.1.11  christos 
   4337   1.1.1.6  christos   return true;
   4338       1.1     skrll }
   4339       1.1     skrll 
   4340       1.1     skrll /* Why was the hash table entry size definition changed from
   4341       1.1     skrll    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
   4342  1.1.1.12  christos    this is the only reason for the s390_elf64_size_info structure.  */
   4343       1.1     skrll 
   4344       1.1     skrll static const struct elf_size_info s390_elf64_size_info =
   4345       1.1     skrll {
   4346       1.1     skrll   sizeof (Elf64_External_Ehdr),
   4347       1.1     skrll   sizeof (Elf64_External_Phdr),
   4348       1.1     skrll   sizeof (Elf64_External_Shdr),
   4349       1.1     skrll   sizeof (Elf64_External_Rel),
   4350       1.1     skrll   sizeof (Elf64_External_Rela),
   4351       1.1     skrll   sizeof (Elf64_External_Sym),
   4352       1.1     skrll   sizeof (Elf64_External_Dyn),
   4353       1.1     skrll   sizeof (Elf_External_Note),
   4354       1.1     skrll   8,		/* hash-table entry size.  */
   4355       1.1     skrll   1,		/* internal relocations per external relocations.  */
   4356       1.1     skrll   64,		/* arch_size.  */
   4357       1.1     skrll   3,		/* log_file_align.  */
   4358       1.1     skrll   ELFCLASS64, EV_CURRENT,
   4359       1.1     skrll   bfd_elf64_write_out_phdrs,
   4360       1.1     skrll   bfd_elf64_write_shdrs_and_ehdr,
   4361       1.1     skrll   bfd_elf64_checksum_contents,
   4362       1.1     skrll   bfd_elf64_write_relocs,
   4363       1.1     skrll   bfd_elf64_swap_symbol_in,
   4364       1.1     skrll   bfd_elf64_swap_symbol_out,
   4365       1.1     skrll   bfd_elf64_slurp_reloc_table,
   4366       1.1     skrll   bfd_elf64_slurp_symbol_table,
   4367       1.1     skrll   bfd_elf64_swap_dyn_in,
   4368       1.1     skrll   bfd_elf64_swap_dyn_out,
   4369       1.1     skrll   bfd_elf64_swap_reloc_in,
   4370       1.1     skrll   bfd_elf64_swap_reloc_out,
   4371       1.1     skrll   bfd_elf64_swap_reloca_in,
   4372       1.1     skrll   bfd_elf64_swap_reloca_out
   4373   1.1.1.4  christos };
   4374       1.1     skrll 
   4375       1.1     skrll #define TARGET_BIG_SYM	s390_elf64_vec
   4376   1.1.1.2  christos #define TARGET_BIG_NAME	"elf64-s390"
   4377       1.1     skrll #define ELF_ARCH	bfd_arch_s390
   4378       1.1     skrll #define ELF_TARGET_ID	S390_ELF_DATA
   4379       1.1     skrll #define ELF_MACHINE_CODE EM_S390
   4380       1.1     skrll #define ELF_MACHINE_ALT1 EM_S390_OLD
   4381       1.1     skrll #define ELF_MAXPAGESIZE 0x1000
   4382       1.1     skrll 
   4383       1.1     skrll #define elf_backend_size_info		s390_elf64_size_info
   4384       1.1     skrll 
   4385       1.1     skrll #define elf_backend_can_gc_sections	1
   4386       1.1     skrll #define elf_backend_can_refcount	1
   4387       1.1     skrll #define elf_backend_want_got_plt	1
   4388       1.1     skrll #define elf_backend_plt_readonly	1
   4389   1.1.1.6  christos #define elf_backend_want_plt_sym	0
   4390       1.1     skrll #define elf_backend_got_header_size	24
   4391       1.1     skrll #define elf_backend_want_dynrelro	1
   4392       1.1     skrll #define elf_backend_rela_normal		1
   4393       1.1     skrll 
   4394       1.1     skrll #define elf_info_to_howto		elf_s390_info_to_howto
   4395       1.1     skrll 
   4396       1.1     skrll #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
   4397   1.1.1.6  christos #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
   4398   1.1.1.4  christos #define bfd_elf64_bfd_reloc_type_lookup	      elf_s390_reloc_type_lookup
   4399       1.1     skrll #define bfd_elf64_bfd_reloc_name_lookup	      elf_s390_reloc_name_lookup
   4400       1.1     skrll #define bfd_elf64_bfd_merge_private_bfd_data  elf64_s390_merge_private_bfd_data
   4401       1.1     skrll 
   4402       1.1     skrll #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
   4403  1.1.1.11  christos #define elf_backend_check_relocs	      elf_s390_check_relocs
   4404       1.1     skrll #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
   4405       1.1     skrll #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
   4406       1.1     skrll #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
   4407       1.1     skrll #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
   4408       1.1     skrll #define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
   4409  1.1.1.11  christos #define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
   4410       1.1     skrll #define elf_backend_relocate_section	      elf_s390_relocate_section
   4411   1.1.1.6  christos #define elf_backend_late_size_sections	      elf_s390_late_size_sections
   4412   1.1.1.6  christos #define elf_backend_init_index_section	      _bfd_elf_init_1_index_section
   4413   1.1.1.6  christos #define elf_backend_grok_prstatus	      elf_s390_grok_prstatus
   4414       1.1     skrll #define elf_backend_grok_psinfo		      elf_s390_grok_psinfo
   4415   1.1.1.6  christos #define elf_backend_write_core_note	      elf_s390_write_core_note
   4416   1.1.1.6  christos #define elf_backend_plt_sym_val		      elf_s390_plt_sym_val
   4417   1.1.1.6  christos #define elf_backend_sort_relocs_p	      elf_s390_elf_sort_relocs_p
   4418       1.1     skrll #define elf_backend_additional_program_headers elf_s390_additional_program_headers
   4419       1.1     skrll #define elf_backend_modify_segment_map	      elf_s390_modify_segment_map
   4420       1.1     skrll 
   4421       1.1     skrll #define bfd_elf64_mkobject		elf_s390_mkobject
   4422       1.1     skrll #define elf_backend_object_p		elf_s390_object_p
   4423                     
   4424                     #include "elf64-target.h"
   4425