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