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