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