elf64-s390.c revision 99461
1/* IBM S/390-specific support for 64-bit ELF
2   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3   Contributed Martin Schwidefsky (schwidefsky@de.ibm.com).
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20   02111-1307, USA.  */
21
22#include "bfd.h"
23#include "sysdep.h"
24#include "bfdlink.h"
25#include "libbfd.h"
26#include "elf-bfd.h"
27
28static reloc_howto_type *elf_s390_reloc_type_lookup
29  PARAMS ((bfd *, bfd_reloc_code_real_type));
30static void elf_s390_info_to_howto
31  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
32static boolean elf_s390_is_local_label_name
33  PARAMS ((bfd *, const char *));
34static struct bfd_hash_entry *link_hash_newfunc
35  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36static struct bfd_link_hash_table *elf_s390_link_hash_table_create
37  PARAMS ((bfd *));
38static boolean create_got_section
39  PARAMS((bfd *, struct bfd_link_info *));
40static boolean elf_s390_create_dynamic_sections
41  PARAMS((bfd *, struct bfd_link_info *));
42static void elf_s390_copy_indirect_symbol
43  PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
44static boolean elf_s390_check_relocs
45  PARAMS ((bfd *, struct bfd_link_info *, asection *,
46	   const Elf_Internal_Rela *));
47static asection *elf_s390_gc_mark_hook
48  PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
49	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
50static boolean elf_s390_gc_sweep_hook
51  PARAMS ((bfd *, struct bfd_link_info *, asection *,
52	   const Elf_Internal_Rela *));
53static boolean elf_s390_adjust_dynamic_symbol
54  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
55static boolean allocate_dynrelocs
56  PARAMS ((struct elf_link_hash_entry *, PTR));
57static boolean readonly_dynrelocs
58  PARAMS ((struct elf_link_hash_entry *, PTR));
59static boolean elf_s390_size_dynamic_sections
60  PARAMS ((bfd *, struct bfd_link_info *));
61static boolean elf_s390_relocate_section
62  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
63	   Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
64static boolean elf_s390_finish_dynamic_symbol
65  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
66	   Elf_Internal_Sym *));
67static enum elf_reloc_type_class elf_s390_reloc_type_class
68  PARAMS ((const Elf_Internal_Rela *));
69static boolean elf_s390_finish_dynamic_sections
70  PARAMS ((bfd *, struct bfd_link_info *));
71static boolean elf_s390_object_p PARAMS ((bfd *));
72
73#define USE_RELA 1		/* We want RELA relocations, not REL.  */
74
75#include "elf/s390.h"
76
77/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
78   from smaller values.  Start with zero, widen, *then* decrement.  */
79#define MINUS_ONE      (((bfd_vma)0) - 1)
80
81/* The relocation "howto" table.  */
82static reloc_howto_type elf_howto_table[] =
83{
84  HOWTO (R_390_NONE,		/* type */
85	 0,			/* rightshift */
86	 0,			/* size (0 = byte, 1 = short, 2 = long) */
87	 0,			/* bitsize */
88	 false,			/* pc_relative */
89	 0,			/* bitpos */
90	 complain_overflow_dont, /* complain_on_overflow */
91	 bfd_elf_generic_reloc, /* special_function */
92	 "R_390_NONE",		/* name */
93	 false,			/* partial_inplace */
94	 0,			/* src_mask */
95	 0,			/* dst_mask */
96	 false),		/* pcrel_offset */
97
98  HOWTO(R_390_8,         0, 0,  8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_8",       false, 0,0x000000ff, false),
99  HOWTO(R_390_12,        0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_12",      false, 0,0x00000fff, false),
100  HOWTO(R_390_16,        0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_16",      false, 0,0x0000ffff, false),
101  HOWTO(R_390_32,        0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_32",      false, 0,0xffffffff, false),
102  HOWTO(R_390_PC32,	 0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32",    false, 0,0xffffffff,  true),
103  HOWTO(R_390_GOT12,	 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_GOT12",   false, 0,0x00000fff, false),
104  HOWTO(R_390_GOT32,	 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT32",   false, 0,0xffffffff, false),
105  HOWTO(R_390_PLT32,	 0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32",   false, 0,0xffffffff,  true),
106  HOWTO(R_390_COPY,      0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_COPY",    false, 0,MINUS_ONE, false),
107  HOWTO(R_390_GLOB_DAT,  0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GLOB_DAT",false, 0,MINUS_ONE, false),
108  HOWTO(R_390_JMP_SLOT,  0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_JMP_SLOT",false, 0,MINUS_ONE, false),
109  HOWTO(R_390_RELATIVE,  0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_RELATIVE",false, 0,MINUS_ONE, false),
110  HOWTO(R_390_GOTOFF,    0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTOFF",  false, 0,MINUS_ONE, false),
111  HOWTO(R_390_GOTPC,     0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPC",   false, 0,MINUS_ONE,  true),
112  HOWTO(R_390_GOT16,     0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT16",   false, 0,0x0000ffff, false),
113  HOWTO(R_390_PC16,      0, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16",    false, 0,0x0000ffff,  true),
114  HOWTO(R_390_PC16DBL,   1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff,  true),
115  HOWTO(R_390_PLT16DBL,  1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff,  true),
116  HOWTO(R_390_PC32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff,  true),
117  HOWTO(R_390_PLT32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff,  true),
118  HOWTO(R_390_GOTPCDBL,  1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,MINUS_ONE,  true),
119  HOWTO(R_390_64,        0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_64",      false, 0,MINUS_ONE, false),
120  HOWTO(R_390_PC64,	 0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC64",    false, 0,MINUS_ONE,  true),
121  HOWTO(R_390_GOT64,	 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT64",   false, 0,MINUS_ONE, false),
122  HOWTO(R_390_PLT64,	 0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT64",   false, 0,MINUS_ONE,  true),
123  HOWTO(R_390_GOTENT,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT",   false, 0,MINUS_ONE,  true),
124};
125
126/* GNU extension to record C++ vtable hierarchy.  */
127static reloc_howto_type elf64_s390_vtinherit_howto =
128  HOWTO (R_390_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false);
129static reloc_howto_type elf64_s390_vtentry_howto =
130  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);
131
132static reloc_howto_type *
133elf_s390_reloc_type_lookup (abfd, code)
134     bfd *abfd ATTRIBUTE_UNUSED;
135     bfd_reloc_code_real_type code;
136{
137  switch (code)
138    {
139    case BFD_RELOC_NONE:
140      return &elf_howto_table[(int) R_390_NONE];
141    case BFD_RELOC_8:
142      return &elf_howto_table[(int) R_390_8];
143    case BFD_RELOC_390_12:
144      return &elf_howto_table[(int) R_390_12];
145    case BFD_RELOC_16:
146      return &elf_howto_table[(int) R_390_16];
147    case BFD_RELOC_32:
148      return &elf_howto_table[(int) R_390_32];
149    case BFD_RELOC_CTOR:
150      return &elf_howto_table[(int) R_390_32];
151    case BFD_RELOC_32_PCREL:
152      return &elf_howto_table[(int) R_390_PC32];
153    case BFD_RELOC_390_GOT12:
154      return &elf_howto_table[(int) R_390_GOT12];
155    case BFD_RELOC_32_GOT_PCREL:
156      return &elf_howto_table[(int) R_390_GOT32];
157    case BFD_RELOC_390_PLT32:
158      return &elf_howto_table[(int) R_390_PLT32];
159    case BFD_RELOC_390_COPY:
160      return &elf_howto_table[(int) R_390_COPY];
161    case BFD_RELOC_390_GLOB_DAT:
162      return &elf_howto_table[(int) R_390_GLOB_DAT];
163    case BFD_RELOC_390_JMP_SLOT:
164      return &elf_howto_table[(int) R_390_JMP_SLOT];
165    case BFD_RELOC_390_RELATIVE:
166      return &elf_howto_table[(int) R_390_RELATIVE];
167    case BFD_RELOC_32_GOTOFF:
168      return &elf_howto_table[(int) R_390_GOTOFF];
169    case BFD_RELOC_390_GOTPC:
170      return &elf_howto_table[(int) R_390_GOTPC];
171    case BFD_RELOC_390_GOT16:
172      return &elf_howto_table[(int) R_390_GOT16];
173    case BFD_RELOC_16_PCREL:
174      return &elf_howto_table[(int) R_390_PC16];
175    case BFD_RELOC_390_PC16DBL:
176      return &elf_howto_table[(int) R_390_PC16DBL];
177    case BFD_RELOC_390_PLT16DBL:
178      return &elf_howto_table[(int) R_390_PLT16DBL];
179    case BFD_RELOC_VTABLE_INHERIT:
180      return &elf64_s390_vtinherit_howto;
181    case BFD_RELOC_VTABLE_ENTRY:
182      return &elf64_s390_vtentry_howto;
183    case BFD_RELOC_390_PC32DBL:
184      return &elf_howto_table[(int) R_390_PC32DBL];
185    case BFD_RELOC_390_PLT32DBL:
186      return &elf_howto_table[(int) R_390_PLT32DBL];
187    case BFD_RELOC_390_GOTPCDBL:
188      return &elf_howto_table[(int) R_390_GOTPCDBL];
189    case BFD_RELOC_64:
190      return &elf_howto_table[(int) R_390_64];
191    case BFD_RELOC_64_PCREL:
192      return &elf_howto_table[(int) R_390_PC64];
193    case BFD_RELOC_390_GOT64:
194      return &elf_howto_table[(int) R_390_GOT64];
195    case BFD_RELOC_390_PLT64:
196      return &elf_howto_table[(int) R_390_PLT64];
197    case BFD_RELOC_390_GOTENT:
198      return &elf_howto_table[(int) R_390_GOTENT];
199    default:
200      break;
201    }
202  return 0;
203}
204
205/* We need to use ELF64_R_TYPE so we have our own copy of this function,
206   and elf64-s390.c has its own copy.  */
207
208static void
209elf_s390_info_to_howto (abfd, cache_ptr, dst)
210     bfd *abfd ATTRIBUTE_UNUSED;
211     arelent *cache_ptr;
212     Elf_Internal_Rela *dst;
213{
214  switch (ELF64_R_TYPE(dst->r_info))
215    {
216    case R_390_GNU_VTINHERIT:
217      cache_ptr->howto = &elf64_s390_vtinherit_howto;
218      break;
219
220    case R_390_GNU_VTENTRY:
221      cache_ptr->howto = &elf64_s390_vtentry_howto;
222      break;
223
224    default:
225      BFD_ASSERT (ELF64_R_TYPE(dst->r_info) < (unsigned int) R_390_max);
226      cache_ptr->howto = &elf_howto_table[ELF64_R_TYPE(dst->r_info)];
227    }
228}
229
230static boolean
231elf_s390_is_local_label_name (abfd, name)
232     bfd *abfd;
233     const char *name;
234{
235  if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
236    return true;
237
238  return _bfd_elf_is_local_label_name (abfd, name);
239}
240
241/* Functions for the 390 ELF linker.  */
242
243/* The name of the dynamic interpreter.  This is put in the .interp
244   section.  */
245
246#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
247
248/* The size in bytes of the first entry in the procedure linkage table.  */
249#define PLT_FIRST_ENTRY_SIZE 32
250/* The size in bytes of an entry in the procedure linkage table.  */
251#define PLT_ENTRY_SIZE 32
252
253#define GOT_ENTRY_SIZE 8
254
255/* The first three entries in a procedure linkage table are reserved,
256   and the initial contents are unimportant (we zero them out).
257   Subsequent entries look like this.  See the SVR4 ABI 386
258   supplement to see how this works.  */
259
260/* For the s390, simple addr offset can only be 0 - 4096.
261   To use the full 16777216 TB address space, several instructions
262   are needed to load an address in a register and execute
263   a branch( or just saving the address)
264
265   Furthermore, only r 0 and 1 are free to use!!!  */
266
267/* The first 3 words in the GOT are then reserved.
268   Word 0 is the address of the dynamic table.
269   Word 1 is a pointer to a structure describing the object
270   Word 2 is used to point to the loader entry address.
271
272   The code for PLT entries looks like this:
273
274   The GOT holds the address in the PLT to be executed.
275   The loader then gets:
276   24(15) =  Pointer to the structure describing the object.
277   28(15) =  Offset in symbol table
278   The loader  must  then find the module where the function is
279   and insert the address in the GOT.
280
281   PLT1: LARL 1,<fn>@GOTENT # 6 bytes  Load address of GOT entry in r1
282         LG   1,0(1)      # 6 bytes  Load address from GOT in r1
283         BCR  15,1        # 2 bytes  Jump to address
284   RET1: BASR 1,0         # 2 bytes  Return from GOT 1st time
285         LGF  1,12(1)     # 6 bytes  Load offset in symbl table in r1
286         BRCL 15,-x       # 6 bytes  Jump to start of PLT
287         .long ?          # 4 bytes  offset into symbol table
288
289   Total = 32 bytes per PLT entry
290   Fixup at offset 2: relative address to GOT entry
291   Fixup at offset 22: relative branch to PLT0
292   Fixup at offset 28: 32 bit offset into symbol table
293
294   A 32 bit offset into the symbol table is enough. It allows for symbol
295   tables up to a size of 2 gigabyte. A single dynamic object (the main
296   program, any shared library) is limited to 4GB in size and I want to see
297   the program that manages to have a symbol table of more than 2 GB with a
298   total size of at max 4 GB.  */
299
300#define PLT_ENTRY_WORD0     (bfd_vma) 0xc0100000
301#define PLT_ENTRY_WORD1     (bfd_vma) 0x0000e310
302#define PLT_ENTRY_WORD2     (bfd_vma) 0x10000004
303#define PLT_ENTRY_WORD3     (bfd_vma) 0x07f10d10
304#define PLT_ENTRY_WORD4     (bfd_vma) 0xe310100c
305#define PLT_ENTRY_WORD5     (bfd_vma) 0x0014c0f4
306#define PLT_ENTRY_WORD6     (bfd_vma) 0x00000000
307#define PLT_ENTRY_WORD7     (bfd_vma) 0x00000000
308
309/* The first PLT entry pushes the offset into the symbol table
310   from R1 onto the stack at 8(15) and the loader object info
311   at 12(15), loads the loader address in R1 and jumps to it.  */
312
313/* The first entry in the PLT:
314
315  PLT0:
316     STG  1,56(15)  # r1 contains the offset into the symbol table
317     LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table
318     MVC  48(8,15),8(1) # move loader ino (object struct address) to stack
319     LG   1,16(1)   # get entry address of loader
320     BCR  15,1      # jump to loader
321
322     Fixup at offset 8: relative address to start of GOT.  */
323
324#define PLT_FIRST_ENTRY_WORD0     (bfd_vma) 0xe310f038
325#define PLT_FIRST_ENTRY_WORD1     (bfd_vma) 0x0024c010
326#define PLT_FIRST_ENTRY_WORD2     (bfd_vma) 0x00000000
327#define PLT_FIRST_ENTRY_WORD3     (bfd_vma) 0xd207f030
328#define PLT_FIRST_ENTRY_WORD4     (bfd_vma) 0x1008e310
329#define PLT_FIRST_ENTRY_WORD5     (bfd_vma) 0x10100004
330#define PLT_FIRST_ENTRY_WORD6     (bfd_vma) 0x07f10700
331#define PLT_FIRST_ENTRY_WORD7     (bfd_vma) 0x07000700
332
333/* The s390 linker needs to keep track of the number of relocs that it
334   decides to copy as dynamic relocs in check_relocs for each symbol.
335   This is so that it can later discard them if they are found to be
336   unnecessary.  We store the information in a field extending the
337   regular ELF linker hash table.  */
338
339struct elf_s390_dyn_relocs
340{
341  struct elf_s390_dyn_relocs *next;
342
343  /* The input section of the reloc.  */
344  asection *sec;
345
346  /* Total number of relocs copied for the input section.  */
347  bfd_size_type count;
348
349  /* Number of pc-relative relocs copied for the input section.  */
350  bfd_size_type pc_count;
351};
352
353/* s390 ELF linker hash entry.  */
354
355struct elf_s390_link_hash_entry
356{
357  struct elf_link_hash_entry elf;
358
359  /* Track dynamic relocs copied for this symbol.  */
360  struct elf_s390_dyn_relocs *dyn_relocs;
361};
362
363/* s390 ELF linker hash table.  */
364
365struct elf_s390_link_hash_table
366{
367  struct elf_link_hash_table elf;
368
369  /* Short-cuts to get to dynamic linker sections.  */
370  asection *sgot;
371  asection *sgotplt;
372  asection *srelgot;
373  asection *splt;
374  asection *srelplt;
375  asection *sdynbss;
376  asection *srelbss;
377
378  /* Small local sym to section mapping cache.  */
379  struct sym_sec_cache sym_sec;
380};
381
382/* Get the s390 ELF linker hash table from a link_info structure.  */
383
384#define elf_s390_hash_table(p) \
385  ((struct elf_s390_link_hash_table *) ((p)->hash))
386
387/* Create an entry in an s390 ELF linker hash table.  */
388
389static struct bfd_hash_entry *
390link_hash_newfunc (entry, table, string)
391     struct bfd_hash_entry *entry;
392     struct bfd_hash_table *table;
393     const char *string;
394{
395  /* Allocate the structure if it has not already been allocated by a
396     subclass.  */
397  if (entry == NULL)
398    {
399      entry = bfd_hash_allocate (table,
400				 sizeof (struct elf_s390_link_hash_entry));
401      if (entry == NULL)
402	return entry;
403    }
404
405  /* Call the allocation method of the superclass.  */
406  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
407  if (entry != NULL)
408    {
409      struct elf_s390_link_hash_entry *eh;
410
411      eh = (struct elf_s390_link_hash_entry *) entry;
412      eh->dyn_relocs = NULL;
413    }
414
415  return entry;
416}
417
418/* Create an s390 ELF linker hash table.  */
419
420static struct bfd_link_hash_table *
421elf_s390_link_hash_table_create (abfd)
422     bfd *abfd;
423{
424  struct elf_s390_link_hash_table *ret;
425  bfd_size_type amt = sizeof (struct elf_s390_link_hash_table);
426
427  ret = (struct elf_s390_link_hash_table *) bfd_alloc (abfd, amt);
428  if (ret == NULL)
429    return NULL;
430
431  if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
432    {
433      bfd_release (abfd, ret);
434      return NULL;
435    }
436
437  ret->sgot = NULL;
438  ret->sgotplt = NULL;
439  ret->srelgot = NULL;
440  ret->splt = NULL;
441  ret->srelplt = NULL;
442  ret->sdynbss = NULL;
443  ret->srelbss = NULL;
444  ret->sym_sec.abfd = NULL;
445
446  return &ret->elf.root;
447}
448
449/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
450   shortcuts to them in our hash table.  */
451
452static boolean
453create_got_section (dynobj, info)
454     bfd *dynobj;
455     struct bfd_link_info *info;
456{
457  struct elf_s390_link_hash_table *htab;
458
459  if (! _bfd_elf_create_got_section (dynobj, info))
460    return false;
461
462  htab = elf_s390_hash_table (info);
463  htab->sgot = bfd_get_section_by_name (dynobj, ".got");
464  htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
465  if (!htab->sgot || !htab->sgotplt)
466    abort ();
467
468  htab->srelgot = bfd_make_section (dynobj, ".rela.got");
469  if (htab->srelgot == NULL
470      || ! bfd_set_section_flags (dynobj, htab->srelgot,
471				  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
472				   | SEC_IN_MEMORY | SEC_LINKER_CREATED
473				   | SEC_READONLY))
474      || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
475    return false;
476  return true;
477}
478
479/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
480   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
481   hash table.  */
482
483static boolean
484elf_s390_create_dynamic_sections (dynobj, info)
485     bfd *dynobj;
486     struct bfd_link_info *info;
487{
488  struct elf_s390_link_hash_table *htab;
489
490  htab = elf_s390_hash_table (info);
491  if (!htab->sgot && !create_got_section (dynobj, info))
492    return false;
493
494  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
495    return false;
496
497  htab->splt = bfd_get_section_by_name (dynobj, ".plt");
498  htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
499  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
500  if (!info->shared)
501    htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
502
503  if (!htab->splt || !htab->srelplt || !htab->sdynbss
504      || (!info->shared && !htab->srelbss))
505    abort ();
506
507  return true;
508}
509
510/* Copy the extra info we tack onto an elf_link_hash_entry.  */
511
512static void
513elf_s390_copy_indirect_symbol (dir, ind)
514     struct elf_link_hash_entry *dir, *ind;
515{
516  struct elf_s390_link_hash_entry *edir, *eind;
517
518  edir = (struct elf_s390_link_hash_entry *) dir;
519  eind = (struct elf_s390_link_hash_entry *) ind;
520
521  if (eind->dyn_relocs != NULL)
522    {
523      if (edir->dyn_relocs != NULL)
524	{
525	  struct elf_s390_dyn_relocs **pp;
526	  struct elf_s390_dyn_relocs *p;
527
528	  if (ind->root.type == bfd_link_hash_indirect)
529	    abort ();
530
531	  /* Add reloc counts against the weak sym to the strong sym
532	     list.  Merge any entries against the same section.  */
533	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
534	    {
535	      struct elf_s390_dyn_relocs *q;
536
537	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
538		if (q->sec == p->sec)
539		  {
540		    q->pc_count += p->pc_count;
541		    q->count += p->count;
542		    *pp = p->next;
543		    break;
544		  }
545	      if (q == NULL)
546		pp = &p->next;
547	    }
548	  *pp = edir->dyn_relocs;
549	}
550
551      edir->dyn_relocs = eind->dyn_relocs;
552      eind->dyn_relocs = NULL;
553    }
554
555  _bfd_elf_link_hash_copy_indirect (dir, ind);
556}
557
558/* Look through the relocs for a section during the first phase, and
559   allocate space in the global offset table or procedure linkage
560   table.  */
561
562static boolean
563elf_s390_check_relocs (abfd, info, sec, relocs)
564     bfd *abfd;
565     struct bfd_link_info *info;
566     asection *sec;
567     const Elf_Internal_Rela *relocs;
568{
569  struct elf_s390_link_hash_table *htab;
570  Elf_Internal_Shdr *symtab_hdr;
571  struct elf_link_hash_entry **sym_hashes;
572  const Elf_Internal_Rela *rel;
573  const Elf_Internal_Rela *rel_end;
574  asection *sreloc;
575
576  if (info->relocateable)
577    return true;
578
579  htab = elf_s390_hash_table (info);
580  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
581  sym_hashes = elf_sym_hashes (abfd);
582
583  sreloc = NULL;
584
585  rel_end = relocs + sec->reloc_count;
586  for (rel = relocs; rel < rel_end; rel++)
587    {
588      unsigned long r_symndx;
589      struct elf_link_hash_entry *h;
590
591      r_symndx = ELF64_R_SYM (rel->r_info);
592
593      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
594	{
595	  (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
596				 bfd_archive_filename (abfd),
597				 r_symndx);
598	  return false;
599	}
600
601      if (r_symndx < symtab_hdr->sh_info)
602	h = NULL;
603      else
604	h = sym_hashes[r_symndx - symtab_hdr->sh_info];
605
606      switch (ELF64_R_TYPE (rel->r_info))
607	{
608	case R_390_GOT12:
609        case R_390_GOT16:
610	case R_390_GOT32:
611	case R_390_GOT64:
612	case R_390_GOTENT:
613	  /* This symbol requires a global offset table entry.  */
614	  if (h != NULL)
615	    {
616	      h->got.refcount += 1;
617	    }
618	  else
619	    {
620	      bfd_signed_vma *local_got_refcounts;
621
622	      /* This is a global offset table entry for a local symbol.  */
623	      local_got_refcounts = elf_local_got_refcounts (abfd);
624	      if (local_got_refcounts == NULL)
625		{
626		  bfd_size_type size;
627
628		  size = symtab_hdr->sh_info;
629		  size *= sizeof (bfd_signed_vma);
630		  local_got_refcounts = ((bfd_signed_vma *)
631					 bfd_zalloc (abfd, size));
632		  if (local_got_refcounts == NULL)
633		    return false;
634		  elf_local_got_refcounts (abfd) = local_got_refcounts;
635		}
636	      local_got_refcounts[r_symndx] += 1;
637	    }
638	  /* Fall through */
639
640	case R_390_GOTOFF:
641	case R_390_GOTPC:
642	case R_390_GOTPCDBL:
643	  if (htab->sgot == NULL)
644	    {
645	      if (htab->elf.dynobj == NULL)
646		htab->elf.dynobj = abfd;
647	      if (!create_got_section (htab->elf.dynobj, info))
648		return false;
649	    }
650	  break;
651
652        case R_390_PLT16DBL:
653	case R_390_PLT32:
654	case R_390_PLT32DBL:
655	case R_390_PLT64:
656	  /* This symbol requires a procedure linkage table entry.  We
657             actually build the entry in adjust_dynamic_symbol,
658             because this might be a case of linking PIC code which is
659             never referenced by a dynamic object, in which case we
660             don't need to generate a procedure linkage table entry
661             after all.  */
662
663	  /* If this is a local symbol, we resolve it directly without
664             creating a procedure linkage table entry.  */
665	  if (h == NULL)
666	    continue;
667
668	  h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
669	  h->plt.refcount += 1;
670	  break;
671
672        case R_390_8:
673        case R_390_16:
674	case R_390_32:
675	case R_390_64:
676        case R_390_PC16:
677        case R_390_PC16DBL:
678	case R_390_PC32:
679	case R_390_PC32DBL:
680	case R_390_PC64:
681	  if (h != NULL && !info->shared)
682	    {
683	      /* If this reloc is in a read-only section, we might
684		 need a copy reloc.  We can't check reliably at this
685		 stage whether the section is read-only, as input
686		 sections have not yet been mapped to output sections.
687		 Tentatively set the flag for now, and correct in
688		 adjust_dynamic_symbol.  */
689	      h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
690
691	      /* We may need a .plt entry if the function this reloc
692		 refers to is in a shared lib.  */
693	      h->plt.refcount += 1;
694	    }
695
696	  /* If we are creating a shared library, and this is a reloc
697	     against a global symbol, or a non PC relative reloc
698	     against a local symbol, then we need to copy the reloc
699	     into the shared library.  However, if we are linking with
700	     -Bsymbolic, we do not need to copy a reloc against a
701	     global symbol which is defined in an object we are
702	     including in the link (i.e., DEF_REGULAR is set).  At
703	     this point we have not seen all the input files, so it is
704	     possible that DEF_REGULAR is not set now but will be set
705	     later (it is never cleared).  In case of a weak definition,
706	     DEF_REGULAR may be cleared later by a strong definition in
707	     a shared library. We account for that possibility below by
708	     storing information in the relocs_copied field of the hash
709	     table entry.  A similar situation occurs when creating
710	     shared libraries and symbol visibility changes render the
711	     symbol local.
712
713	     If on the other hand, we are creating an executable, we
714	     may need to keep relocations for symbols satisfied by a
715	     dynamic library if we manage to avoid copy relocs for the
716	     symbol.  */
717	  if ((info->shared
718	       && (sec->flags & SEC_ALLOC) != 0
719	       && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
720		    && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
721		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32
722		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
723		    && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
724		   || (h != NULL
725		       && (! info->symbolic
726			   || h->root.type == bfd_link_hash_defweak
727			   || (h->elf_link_hash_flags
728			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
729	      || (!info->shared
730		  && (sec->flags & SEC_ALLOC) != 0
731		  && h != NULL
732		  && (h->root.type == bfd_link_hash_defweak
733		      || (h->elf_link_hash_flags
734			  & ELF_LINK_HASH_DEF_REGULAR) == 0)))
735	    {
736	      struct elf_s390_dyn_relocs *p;
737	      struct elf_s390_dyn_relocs **head;
738
739	      /* We must copy these reloc types into the output file.
740		 Create a reloc section in dynobj and make room for
741		 this reloc.  */
742	      if (sreloc == NULL)
743		{
744		  const char *name;
745		  bfd *dynobj;
746
747		  name = (bfd_elf_string_from_elf_section
748			  (abfd,
749			   elf_elfheader (abfd)->e_shstrndx,
750			   elf_section_data (sec)->rel_hdr.sh_name));
751		  if (name == NULL)
752		    return false;
753
754		  if (strncmp (name, ".rela", 5) != 0
755		      || strcmp (bfd_get_section_name (abfd, sec),
756				 name + 5) != 0)
757		    {
758		      (*_bfd_error_handler)
759			(_("%s: bad relocation section name `%s\'"),
760			 bfd_archive_filename (abfd), name);
761		    }
762
763		  if (htab->elf.dynobj == NULL)
764		    htab->elf.dynobj = abfd;
765
766		  dynobj = htab->elf.dynobj;
767		  sreloc = bfd_get_section_by_name (dynobj, name);
768		  if (sreloc == NULL)
769		    {
770		      flagword flags;
771
772		      sreloc = bfd_make_section (dynobj, name);
773		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
774			       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
775		      if ((sec->flags & SEC_ALLOC) != 0)
776			flags |= SEC_ALLOC | SEC_LOAD;
777		      if (sreloc == NULL
778			  || ! bfd_set_section_flags (dynobj, sreloc, flags)
779			  || ! bfd_set_section_alignment (dynobj, sreloc, 2))
780			return false;
781		    }
782		  elf_section_data (sec)->sreloc = sreloc;
783		}
784
785	      /* If this is a global symbol, we count the number of
786		 relocations we need for this symbol.  */
787	      if (h != NULL)
788		{
789		  head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
790		}
791	      else
792		{
793		  /* Track dynamic relocs needed for local syms too.
794		     We really need local syms available to do this
795		     easily.  Oh well.  */
796
797		  asection *s;
798		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
799						 sec, r_symndx);
800		  if (s == NULL)
801		    return false;
802
803		  head = ((struct elf_s390_dyn_relocs **)
804			  &elf_section_data (s)->local_dynrel);
805		}
806
807	      p = *head;
808	      if (p == NULL || p->sec != sec)
809		{
810		  bfd_size_type amt = sizeof *p;
811		  p = ((struct elf_s390_dyn_relocs *)
812		       bfd_alloc (htab->elf.dynobj, amt));
813		  if (p == NULL)
814		    return false;
815		  p->next = *head;
816		  *head = p;
817		  p->sec = sec;
818		  p->count = 0;
819		  p->pc_count = 0;
820		}
821
822	      p->count += 1;
823	      if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
824		  || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
825		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32
826		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
827		  || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
828		p->pc_count += 1;
829	    }
830	  break;
831
832	  /* This relocation describes the C++ object vtable hierarchy.
833	     Reconstruct it for later use during GC.  */
834        case R_390_GNU_VTINHERIT:
835          if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
836            return false;
837          break;
838
839	  /* This relocation describes which C++ vtable entries are actually
840	     used.  Record for later use during GC.  */
841        case R_390_GNU_VTENTRY:
842          if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
843            return false;
844          break;
845
846	default:
847	  break;
848	}
849    }
850
851  return true;
852}
853
854/* Return the section that should be marked against GC for a given
855   relocation.  */
856
857static asection *
858elf_s390_gc_mark_hook (abfd, info, rel, h, sym)
859     bfd *abfd;
860     struct bfd_link_info *info ATTRIBUTE_UNUSED;
861     Elf_Internal_Rela *rel;
862     struct elf_link_hash_entry *h;
863     Elf_Internal_Sym *sym;
864{
865  if (h != NULL)
866    {
867      switch (ELF64_R_TYPE (rel->r_info))
868	{
869	case R_390_GNU_VTINHERIT:
870	case R_390_GNU_VTENTRY:
871	  break;
872
873	default:
874	  switch (h->root.type)
875	    {
876	    case bfd_link_hash_defined:
877	    case bfd_link_hash_defweak:
878	      return h->root.u.def.section;
879
880	    case bfd_link_hash_common:
881	      return h->root.u.c.p->section;
882
883	    default:
884	      break;
885	    }
886	}
887    }
888  else
889    {
890      return bfd_section_from_elf_index (abfd, sym->st_shndx);
891    }
892
893  return NULL;
894}
895
896/* Update the got entry reference counts for the section being removed.  */
897
898static boolean
899elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
900     bfd *abfd;
901     struct bfd_link_info *info;
902     asection *sec;
903     const Elf_Internal_Rela *relocs;
904{
905  Elf_Internal_Shdr *symtab_hdr;
906  struct elf_link_hash_entry **sym_hashes;
907  bfd_signed_vma *local_got_refcounts;
908  const Elf_Internal_Rela *rel, *relend;
909  unsigned long r_symndx;
910  struct elf_link_hash_entry *h;
911
912  elf_section_data (sec)->local_dynrel = NULL;
913
914  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
915  sym_hashes = elf_sym_hashes (abfd);
916  local_got_refcounts = elf_local_got_refcounts (abfd);
917
918  relend = relocs + sec->reloc_count;
919  for (rel = relocs; rel < relend; rel++)
920    switch (ELF64_R_TYPE (rel->r_info))
921      {
922      case R_390_GOT12:
923      case R_390_GOT16:
924      case R_390_GOT32:
925      case R_390_GOT64:
926      case R_390_GOTOFF:
927      case R_390_GOTPC:
928      case R_390_GOTPCDBL:
929      case R_390_GOTENT:
930	r_symndx = ELF64_R_SYM (rel->r_info);
931	if (r_symndx >= symtab_hdr->sh_info)
932	  {
933	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
934	    if (h->got.refcount > 0)
935	      h->got.refcount -= 1;
936	  }
937	else if (local_got_refcounts != NULL)
938	  {
939	    if (local_got_refcounts[r_symndx] > 0)
940	      local_got_refcounts[r_symndx] -= 1;
941	  }
942	break;
943
944      case R_390_8:
945      case R_390_12:
946      case R_390_16:
947      case R_390_32:
948      case R_390_64:
949      case R_390_PC16:
950      case R_390_PC16DBL:
951      case R_390_PC32:
952      case R_390_PC32DBL:
953      case R_390_PC64:
954	r_symndx = ELF64_R_SYM (rel->r_info);
955	if (r_symndx >= symtab_hdr->sh_info)
956	  {
957	    struct elf_s390_link_hash_entry *eh;
958	    struct elf_s390_dyn_relocs **pp;
959	    struct elf_s390_dyn_relocs *p;
960
961	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
962
963	    if (!info->shared && h->plt.refcount > 0)
964	      h->plt.refcount -= 1;
965
966	    eh = (struct elf_s390_link_hash_entry *) h;
967
968	    for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
969	      if (p->sec == sec)
970		{
971		  if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
972		      || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
973		      || ELF64_R_TYPE (rel->r_info) == R_390_PC32)
974		    p->pc_count -= 1;
975		  p->count -= 1;
976		  if (p->count == 0)
977		    *pp = p->next;
978		  break;
979		}
980	  }
981	break;
982
983      case R_390_PLT16DBL:
984      case R_390_PLT32:
985      case R_390_PLT32DBL:
986      case R_390_PLT64:
987	r_symndx = ELF64_R_SYM (rel->r_info);
988	if (r_symndx >= symtab_hdr->sh_info)
989	  {
990	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
991	    if (h->plt.refcount > 0)
992	      h->plt.refcount -= 1;
993	  }
994	break;
995
996      default:
997	break;
998      }
999
1000  return true;
1001}
1002
1003/* Adjust a symbol defined by a dynamic object and referenced by a
1004   regular object.  The current definition is in some section of the
1005   dynamic object, but we're not including those sections.  We have to
1006   change the definition to something the rest of the link can
1007   understand.  */
1008
1009static boolean
1010elf_s390_adjust_dynamic_symbol (info, h)
1011     struct bfd_link_info *info;
1012     struct elf_link_hash_entry *h;
1013{
1014  struct elf_s390_link_hash_table *htab;
1015  struct elf_s390_link_hash_entry * eh;
1016  struct elf_s390_dyn_relocs *p;
1017  asection *s;
1018  unsigned int power_of_two;
1019
1020  /* If this is a function, put it in the procedure linkage table.  We
1021     will fill in the contents of the procedure linkage table later
1022     (although we could actually do it here). */
1023  if (h->type == STT_FUNC
1024      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1025    {
1026      if (h->plt.refcount <= 0
1027	  || (! info->shared
1028	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1029	      && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1030	      && h->root.type != bfd_link_hash_undefweak
1031	      && h->root.type != bfd_link_hash_undefined))
1032	{
1033	  /* This case can occur if we saw a PLT32 reloc in an input
1034             file, but the symbol was never referred to by a dynamic
1035             object, or if all references were garbage collected.  In
1036	     such a case, we don't actually need to build a procedure
1037	     linkage table, and we can just do a PC32 reloc instead.  */
1038	  h->plt.offset = (bfd_vma) -1;
1039	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1040	}
1041
1042      return true;
1043    }
1044  else
1045    /* It's possible that we incorrectly decided a .plt reloc was
1046       needed for an R_390_PC32 reloc to a non-function sym in
1047       check_relocs.  We can't decide accurately between function and
1048       non-function syms in check-relocs;  Objects loaded later in
1049       the link may change h->type.  So fix it now.  */
1050    h->plt.offset = (bfd_vma) -1;
1051
1052  /* If this is a weak symbol, and there is a real definition, the
1053     processor independent code will have arranged for us to see the
1054     real definition first, and we can just use the same value.  */
1055  if (h->weakdef != NULL)
1056    {
1057      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1058		  || h->weakdef->root.type == bfd_link_hash_defweak);
1059      h->root.u.def.section = h->weakdef->root.u.def.section;
1060      h->root.u.def.value = h->weakdef->root.u.def.value;
1061      return true;
1062    }
1063
1064  /* This is a reference to a symbol defined by a dynamic object which
1065     is not a function.  */
1066
1067  /* If we are creating a shared library, we must presume that the
1068     only references to the symbol are via the global offset table.
1069     For such cases we need not do anything here; the relocations will
1070     be handled correctly by relocate_section.  */
1071  if (info->shared)
1072    return true;
1073
1074  /* If there are no references to this symbol that do not use the
1075     GOT, we don't need to generate a copy reloc.  */
1076  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1077    return true;
1078
1079  /* If -z nocopyreloc was given, we won't generate them either.  */
1080  if (info->nocopyreloc)
1081    {
1082      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1083      return true;
1084    }
1085
1086  eh = (struct elf_s390_link_hash_entry *) h;
1087  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1088    {
1089      s = p->sec->output_section;
1090      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1091	break;
1092    }
1093
1094  /* If we didn't find any dynamic relocs in read-only sections, then
1095     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1096  if (p == NULL)
1097    {
1098      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1099      return true;
1100    }
1101
1102  /* We must allocate the symbol in our .dynbss section, which will
1103     become part of the .bss section of the executable.  There will be
1104     an entry for this symbol in the .dynsym section.  The dynamic
1105     object will contain position independent code, so all references
1106     from the dynamic object to this symbol will go through the global
1107     offset table.  The dynamic linker will use the .dynsym entry to
1108     determine the address it must put in the global offset table, so
1109     both the dynamic object and the regular object will refer to the
1110     same memory location for the variable.  */
1111
1112  htab = elf_s390_hash_table (info);
1113
1114  /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1115     copy the initial value out of the dynamic object and into the
1116     runtime process image.  */
1117  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1118    {
1119      htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
1120      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1121    }
1122
1123  /* We need to figure out the alignment required for this symbol.  I
1124     have no idea how ELF linkers handle this.  */
1125  power_of_two = bfd_log2 (h->size);
1126  if (power_of_two > 3)
1127    power_of_two = 3;
1128
1129  /* Apply the required alignment.  */
1130  s = htab->sdynbss;
1131  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1132  if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1133    {
1134      if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1135	return false;
1136    }
1137
1138  /* Define the symbol as being at this point in the section.  */
1139  h->root.u.def.section = s;
1140  h->root.u.def.value = s->_raw_size;
1141
1142  /* Increment the section size to make room for the symbol.  */
1143  s->_raw_size += h->size;
1144
1145  return true;
1146}
1147
1148/* This is the condition under which elf_s390_finish_dynamic_symbol
1149   will be called from elflink.h.  If elflink.h doesn't call our
1150   finish_dynamic_symbol routine, we'll need to do something about
1151   initializing any .plt and .got entries in elf_s390_relocate_section.  */
1152#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1153  ((DYN)								\
1154   && ((INFO)->shared							\
1155       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)	\
1156   && ((H)->dynindx != -1						\
1157       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1158
1159/* Allocate space in .plt, .got and associated reloc sections for
1160   dynamic relocs.  */
1161
1162static boolean
1163allocate_dynrelocs (h, inf)
1164     struct elf_link_hash_entry *h;
1165     PTR inf;
1166{
1167  struct bfd_link_info *info;
1168  struct elf_s390_link_hash_table *htab;
1169  struct elf_s390_link_hash_entry *eh;
1170  struct elf_s390_dyn_relocs *p;
1171
1172  if (h->root.type == bfd_link_hash_indirect)
1173    return true;
1174
1175  if (h->root.type == bfd_link_hash_warning)
1176    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1177
1178  info = (struct bfd_link_info *) inf;
1179  htab = elf_s390_hash_table (info);
1180
1181  if (htab->elf.dynamic_sections_created
1182      && h->plt.refcount > 0)
1183    {
1184      /* Make sure this symbol is output as a dynamic symbol.
1185	 Undefined weak syms won't yet be marked as dynamic.  */
1186      if (h->dynindx == -1
1187	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1188	{
1189	  if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1190	    return false;
1191	}
1192
1193      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1194	{
1195	  asection *s = htab->splt;
1196
1197	  /* If this is the first .plt entry, make room for the special
1198	     first entry.  */
1199	  if (s->_raw_size == 0)
1200	    s->_raw_size += PLT_FIRST_ENTRY_SIZE;
1201
1202	  h->plt.offset = s->_raw_size;
1203
1204	  /* If this symbol is not defined in a regular file, and we are
1205	     not generating a shared library, then set the symbol to this
1206	     location in the .plt.  This is required to make function
1207	     pointers compare as equal between the normal executable and
1208	     the shared library.  */
1209	  if (! info->shared
1210	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1211	    {
1212	      h->root.u.def.section = s;
1213	      h->root.u.def.value = h->plt.offset;
1214	    }
1215
1216	  /* Make room for this entry.  */
1217	  s->_raw_size += PLT_ENTRY_SIZE;
1218
1219	  /* We also need to make an entry in the .got.plt section, which
1220	     will be placed in the .got section by the linker script.  */
1221	  htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
1222
1223	  /* We also need to make an entry in the .rela.plt section.  */
1224	  htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
1225	}
1226      else
1227	{
1228	  h->plt.offset = (bfd_vma) -1;
1229	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1230	}
1231    }
1232  else
1233    {
1234      h->plt.offset = (bfd_vma) -1;
1235      h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1236    }
1237
1238  if (h->got.refcount > 0)
1239    {
1240      asection *s;
1241      boolean dyn;
1242
1243      /* Make sure this symbol is output as a dynamic symbol.
1244	 Undefined weak syms won't yet be marked as dynamic.  */
1245      if (h->dynindx == -1
1246	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1247	{
1248	  if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1249	    return false;
1250	}
1251
1252      s = htab->sgot;
1253      h->got.offset = s->_raw_size;
1254      s->_raw_size += GOT_ENTRY_SIZE;
1255      dyn = htab->elf.dynamic_sections_created;
1256      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1257	htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1258    }
1259  else
1260    h->got.offset = (bfd_vma) -1;
1261
1262  eh = (struct elf_s390_link_hash_entry *) h;
1263  if (eh->dyn_relocs == NULL)
1264    return true;
1265
1266  /* In the shared -Bsymbolic case, discard space allocated for
1267     dynamic pc-relative relocs against symbols which turn out to be
1268     defined in regular objects.  For the normal shared case, discard
1269     space for pc-relative relocs that have become local due to symbol
1270     visibility changes.  */
1271
1272  if (info->shared)
1273    {
1274      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1275	  && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1276	      || info->symbolic))
1277	{
1278	  struct elf_s390_dyn_relocs **pp;
1279
1280	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1281	    {
1282	      p->count -= p->pc_count;
1283	      p->pc_count = 0;
1284	      if (p->count == 0)
1285		*pp = p->next;
1286	      else
1287		pp = &p->next;
1288	    }
1289	}
1290    }
1291  else
1292    {
1293      /* For the non-shared case, discard space for relocs against
1294	 symbols which turn out to need copy relocs or are not
1295	 dynamic.  */
1296
1297      if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1298	  && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1299	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1300	      || (htab->elf.dynamic_sections_created
1301		  && (h->root.type == bfd_link_hash_undefweak
1302		      || h->root.type == bfd_link_hash_undefined))))
1303	{
1304	  /* Make sure this symbol is output as a dynamic symbol.
1305	     Undefined weak syms won't yet be marked as dynamic.  */
1306	  if (h->dynindx == -1
1307	      && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1308	    {
1309	      if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1310		return false;
1311	    }
1312
1313	  /* If that succeeded, we know we'll be keeping all the
1314	     relocs.  */
1315	  if (h->dynindx != -1)
1316	    goto keep;
1317	}
1318
1319      eh->dyn_relocs = NULL;
1320
1321    keep: ;
1322    }
1323
1324  /* Finally, allocate space.  */
1325  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1326    {
1327      asection *sreloc = elf_section_data (p->sec)->sreloc;
1328      sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
1329    }
1330
1331  return true;
1332}
1333
1334/* Find any dynamic relocs that apply to read-only sections.  */
1335
1336static boolean
1337readonly_dynrelocs (h, inf)
1338     struct elf_link_hash_entry *h;
1339     PTR inf;
1340{
1341  struct elf_s390_link_hash_entry *eh;
1342  struct elf_s390_dyn_relocs *p;
1343
1344  if (h->root.type == bfd_link_hash_warning)
1345    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1346
1347  eh = (struct elf_s390_link_hash_entry *) h;
1348  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1349    {
1350      asection *s = p->sec->output_section;
1351
1352      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1353	{
1354	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
1355
1356	  info->flags |= DF_TEXTREL;
1357
1358	  /* Not an error, just cut short the traversal.  */
1359	  return false;
1360	}
1361    }
1362  return true;
1363}
1364
1365/* Set the sizes of the dynamic sections.  */
1366
1367static boolean
1368elf_s390_size_dynamic_sections (output_bfd, info)
1369     bfd *output_bfd ATTRIBUTE_UNUSED;
1370     struct bfd_link_info *info;
1371{
1372  struct elf_s390_link_hash_table *htab;
1373  bfd *dynobj;
1374  asection *s;
1375  boolean relocs;
1376  bfd *ibfd;
1377
1378  htab = elf_s390_hash_table (info);
1379  dynobj = htab->elf.dynobj;
1380  if (dynobj == NULL)
1381    abort ();
1382
1383  if (htab->elf.dynamic_sections_created)
1384    {
1385      /* Set the contents of the .interp section to the interpreter.  */
1386      if (! info->shared)
1387	{
1388	  s = bfd_get_section_by_name (dynobj, ".interp");
1389	  if (s == NULL)
1390	    abort ();
1391	  s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1392	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1393	}
1394    }
1395
1396  /* Set up .got offsets for local syms, and space for local dynamic
1397     relocs.  */
1398  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1399    {
1400      bfd_signed_vma *local_got;
1401      bfd_signed_vma *end_local_got;
1402      bfd_size_type locsymcount;
1403      Elf_Internal_Shdr *symtab_hdr;
1404      asection *srela;
1405
1406      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1407	continue;
1408
1409      for (s = ibfd->sections; s != NULL; s = s->next)
1410	{
1411	  struct elf_s390_dyn_relocs *p;
1412
1413	  for (p = *((struct elf_s390_dyn_relocs **)
1414		     &elf_section_data (s)->local_dynrel);
1415	       p != NULL;
1416	       p = p->next)
1417	    {
1418	      if (!bfd_is_abs_section (p->sec)
1419		  && bfd_is_abs_section (p->sec->output_section))
1420		{
1421		  /* Input section has been discarded, either because
1422		     it is a copy of a linkonce section or due to
1423		     linker script /DISCARD/, so we'll be discarding
1424		     the relocs too.  */
1425		}
1426	      else if (p->count != 0)
1427		{
1428		  srela = elf_section_data (p->sec)->sreloc;
1429		  srela->_raw_size += p->count * sizeof (Elf64_External_Rela);
1430		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1431		    info->flags |= DF_TEXTREL;
1432		}
1433	    }
1434	}
1435
1436      local_got = elf_local_got_refcounts (ibfd);
1437      if (!local_got)
1438	continue;
1439
1440      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1441      locsymcount = symtab_hdr->sh_info;
1442      end_local_got = local_got + locsymcount;
1443      s = htab->sgot;
1444      srela = htab->srelgot;
1445      for (; local_got < end_local_got; ++local_got)
1446	{
1447	  if (*local_got > 0)
1448	    {
1449	      *local_got = s->_raw_size;
1450	      s->_raw_size += GOT_ENTRY_SIZE;
1451	      if (info->shared)
1452		srela->_raw_size += sizeof (Elf64_External_Rela);
1453	    }
1454	  else
1455	    *local_got = (bfd_vma) -1;
1456	}
1457    }
1458
1459  /* Allocate global sym .plt and .got entries, and space for global
1460     sym dynamic relocs.  */
1461  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1462
1463  /* We now have determined the sizes of the various dynamic sections.
1464     Allocate memory for them.  */
1465  relocs = false;
1466  for (s = dynobj->sections; s != NULL; s = s->next)
1467    {
1468      if ((s->flags & SEC_LINKER_CREATED) == 0)
1469	continue;
1470
1471      if (s == htab->splt
1472	  || s == htab->sgot
1473	  || s == htab->sgotplt)
1474	{
1475	  /* Strip this section if we don't need it; see the
1476	     comment below.  */
1477	}
1478      else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1479	{
1480	  if (s->_raw_size != 0 && s != htab->srelplt)
1481	    relocs = true;
1482
1483	  /* We use the reloc_count field as a counter if we need
1484	     to copy relocs into the output file.  */
1485	  s->reloc_count = 0;
1486	}
1487      else
1488	{
1489	  /* It's not one of our sections, so don't allocate space.  */
1490	  continue;
1491	}
1492
1493      if (s->_raw_size == 0)
1494	{
1495	  /* If we don't need this section, strip it from the
1496	     output file.  This is to handle .rela.bss and
1497	     .rela.plt.  We must create it in
1498	     create_dynamic_sections, because it must be created
1499	     before the linker maps input sections to output
1500	     sections.  The linker does that before
1501	     adjust_dynamic_symbol is called, and it is that
1502	     function which decides whether anything needs to go
1503	     into these sections.  */
1504
1505	  _bfd_strip_section_from_output (info, s);
1506	  continue;
1507	}
1508
1509      /* Allocate memory for the section contents.  We use bfd_zalloc
1510	 here in case unused entries are not reclaimed before the
1511	 section's contents are written out.  This should not happen,
1512	 but this way if it does, we get a R_390_NONE reloc instead
1513	 of garbage.  */
1514      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1515      if (s->contents == NULL)
1516	return false;
1517    }
1518
1519  if (htab->elf.dynamic_sections_created)
1520    {
1521      /* Add some entries to the .dynamic section.  We fill in the
1522	 values later, in elf_s390_finish_dynamic_sections, but we
1523	 must add the entries now so that we get the correct size for
1524	 the .dynamic section.  The DT_DEBUG entry is filled in by the
1525	 dynamic linker and used by the debugger.  */
1526#define add_dynamic_entry(TAG, VAL) \
1527  bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1528
1529      if (! info->shared)
1530	{
1531	  if (!add_dynamic_entry (DT_DEBUG, 0))
1532	    return false;
1533	}
1534
1535      if (htab->splt->_raw_size != 0)
1536	{
1537	  if (!add_dynamic_entry (DT_PLTGOT, 0)
1538	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
1539	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1540	      || !add_dynamic_entry (DT_JMPREL, 0))
1541	    return false;
1542	}
1543
1544      if (relocs)
1545        {
1546          if (!add_dynamic_entry (DT_RELA, 0)
1547              || !add_dynamic_entry (DT_RELASZ, 0)
1548              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1549	    return false;
1550
1551	  /* If any dynamic relocs apply to a read-only section,
1552	     then we need a DT_TEXTREL entry.  */
1553	  if ((info->flags & DF_TEXTREL) == 0)
1554	    elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1555				    (PTR) info);
1556
1557	  if ((info->flags & DF_TEXTREL) != 0)
1558	    {
1559	      if (!add_dynamic_entry (DT_TEXTREL, 0))
1560		return false;
1561	    }
1562	}
1563    }
1564#undef add_dynamic_entry
1565
1566  return true;
1567}
1568
1569/* Relocate a 390 ELF section.  */
1570
1571static boolean
1572elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
1573			      contents, relocs, local_syms, local_sections)
1574     bfd *output_bfd;
1575     struct bfd_link_info *info;
1576     bfd *input_bfd;
1577     asection *input_section;
1578     bfd_byte *contents;
1579     Elf_Internal_Rela *relocs;
1580     Elf_Internal_Sym *local_syms;
1581     asection **local_sections;
1582{
1583  struct elf_s390_link_hash_table *htab;
1584  Elf_Internal_Shdr *symtab_hdr;
1585  struct elf_link_hash_entry **sym_hashes;
1586  bfd_vma *local_got_offsets;
1587  Elf_Internal_Rela *rel;
1588  Elf_Internal_Rela *relend;
1589
1590  if (info->relocateable)
1591    return true;
1592
1593  htab = elf_s390_hash_table (info);
1594  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1595  sym_hashes = elf_sym_hashes (input_bfd);
1596  local_got_offsets = elf_local_got_offsets (input_bfd);
1597
1598  rel = relocs;
1599  relend = relocs + input_section->reloc_count;
1600  for (; rel < relend; rel++)
1601    {
1602      int r_type;
1603      reloc_howto_type *howto;
1604      unsigned long r_symndx;
1605      struct elf_link_hash_entry *h;
1606      Elf_Internal_Sym *sym;
1607      asection *sec;
1608      bfd_vma off;
1609      bfd_vma relocation;
1610      boolean unresolved_reloc;
1611      bfd_reloc_status_type r;
1612
1613      r_type = ELF64_R_TYPE (rel->r_info);
1614      if (r_type == (int) R_390_GNU_VTINHERIT
1615          || r_type == (int) R_390_GNU_VTENTRY)
1616        continue;
1617      if (r_type < 0 || r_type >= (int) R_390_max)
1618	{
1619	  bfd_set_error (bfd_error_bad_value);
1620	  return false;
1621	}
1622
1623      howto = elf_howto_table + r_type;
1624      r_symndx = ELF64_R_SYM (rel->r_info);
1625      h = NULL;
1626      sym = NULL;
1627      sec = NULL;
1628      unresolved_reloc = false;
1629      if (r_symndx < symtab_hdr->sh_info)
1630	{
1631	  sym = local_syms + r_symndx;
1632	  sec = local_sections[r_symndx];
1633	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1634	}
1635      else
1636	{
1637	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1638	  while (h->root.type == bfd_link_hash_indirect
1639		 || h->root.type == bfd_link_hash_warning)
1640	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1641
1642	  if (h->root.type == bfd_link_hash_defined
1643	      || h->root.type == bfd_link_hash_defweak)
1644	    {
1645	      sec = h->root.u.def.section;
1646	      if (sec->output_section == NULL)
1647		{
1648		  /* Set a flag that will be cleared later if we find a
1649		     relocation value for this symbol.  output_section
1650		     is typically NULL for symbols satisfied by a shared
1651		     library.  */
1652		  unresolved_reloc = true;
1653		  relocation = 0;
1654		}
1655	      else
1656		relocation = (h->root.u.def.value
1657			      + sec->output_section->vma
1658			      + sec->output_offset);
1659	    }
1660	  else if (h->root.type == bfd_link_hash_undefweak)
1661	    relocation = 0;
1662	  else if (info->shared
1663		   && (!info->symbolic || info->allow_shlib_undefined)
1664		   && !info->no_undefined
1665		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1666	    relocation = 0;
1667	  else
1668	    {
1669	      if (! ((*info->callbacks->undefined_symbol)
1670		     (info, h->root.root.string, input_bfd,
1671          	      input_section, rel->r_offset,
1672		      (!info->shared || info->no_undefined
1673		       || ELF_ST_VISIBILITY (h->other)))))
1674		return false;
1675	      relocation = 0;
1676	    }
1677	}
1678
1679      switch (r_type)
1680	{
1681        case R_390_GOT12:
1682        case R_390_GOT16:
1683        case R_390_GOT32:
1684        case R_390_GOT64:
1685        case R_390_GOTENT:
1686          /* Relocation is to the entry for this symbol in the global
1687             offset table.  */
1688	  if (htab->sgot == NULL)
1689	    abort ();
1690
1691          if (h != NULL)
1692            {
1693	      boolean dyn;
1694
1695              off = h->got.offset;
1696	      dyn = htab->elf.dynamic_sections_created;
1697              if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1698                  || (info->shared
1699                      && (info->symbolic
1700			  || h->dynindx == -1
1701			  || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1702                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1703                {
1704                  /* This is actually a static link, or it is a
1705                     -Bsymbolic link and the symbol is defined
1706                     locally, or the symbol was forced to be local
1707                     because of a version file.  We must initialize
1708                     this entry in the global offset table.  Since the
1709                     offset must always be a multiple of 2, we use the
1710                     least significant bit to record whether we have
1711                     initialized it already.
1712
1713                     When doing a dynamic link, we create a .rel.got
1714                     relocation entry to initialize the value.  This
1715                     is done in the finish_dynamic_symbol routine.  */
1716                  if ((off & 1) != 0)
1717                    off &= ~1;
1718                  else
1719                    {
1720		      bfd_put_64 (output_bfd, relocation,
1721				  htab->sgot->contents + off);
1722                      h->got.offset |= 1;
1723                    }
1724                }
1725	      else
1726		unresolved_reloc = false;
1727            }
1728          else
1729            {
1730	      if (local_got_offsets == NULL)
1731		abort ();
1732
1733              off = local_got_offsets[r_symndx];
1734
1735              /* The offset must always be a multiple of 8.  We use
1736                 the least significant bit to record whether we have
1737                 already generated the necessary reloc.  */
1738              if ((off & 1) != 0)
1739                off &= ~1;
1740              else
1741                {
1742                  bfd_put_64 (output_bfd, relocation,
1743			      htab->sgot->contents + off);
1744
1745                  if (info->shared)
1746                    {
1747                      asection *srelgot;
1748                      Elf_Internal_Rela outrel;
1749		      Elf64_External_Rela *loc;
1750
1751                      srelgot = htab->srelgot;
1752		      if (srelgot == NULL)
1753			abort ();
1754
1755                      outrel.r_offset = (htab->sgot->output_section->vma
1756                                         + htab->sgot->output_offset
1757                                         + off);
1758                      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1759		      outrel.r_addend = relocation;
1760		      loc = (Elf64_External_Rela *) srelgot->contents;
1761		      loc += srelgot->reloc_count++;
1762                      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1763                    }
1764
1765                  local_got_offsets[r_symndx] |= 1;
1766                }
1767            }
1768
1769	  if (off >= (bfd_vma) -2)
1770	    abort ();
1771
1772	  relocation = htab->sgot->output_offset + off;
1773
1774	  /*
1775	   * For @GOTENT the relocation is against the offset between
1776	   * the instruction and the symbols entry in the GOT and not
1777	   * between the start of the GOT and the symbols entry. We
1778	   * add the vma of the GOT to get the correct value.
1779	   */
1780	  if (r_type == R_390_GOTENT)
1781	    relocation += htab->sgot->output_section->vma;
1782
1783          break;
1784
1785        case R_390_GOTOFF:
1786          /* Relocation is relative to the start of the global offset
1787             table.  */
1788
1789          /* Note that sgot->output_offset is not involved in this
1790             calculation.  We always want the start of .got.  If we
1791             defined _GLOBAL_OFFSET_TABLE in a different way, as is
1792             permitted by the ABI, we might have to change this
1793             calculation.  */
1794          relocation -= htab->sgot->output_section->vma;
1795
1796          break;
1797
1798        case R_390_GOTPC:
1799	case R_390_GOTPCDBL:
1800          /* Use global offset table as symbol value.  */
1801          relocation = htab->sgot->output_section->vma;
1802	  unresolved_reloc = false;
1803         break;
1804
1805        case R_390_PLT16DBL:
1806        case R_390_PLT32:
1807        case R_390_PLT32DBL:
1808        case R_390_PLT64:
1809          /* Relocation is to the entry for this symbol in the
1810             procedure linkage table.  */
1811
1812          /* Resolve a PLT32 reloc against a local symbol directly,
1813             without using the procedure linkage table.  */
1814          if (h == NULL)
1815            break;
1816
1817          if (h->plt.offset == (bfd_vma) -1
1818	      || htab->splt == NULL)
1819            {
1820              /* We didn't make a PLT entry for this symbol.  This
1821                 happens when statically linking PIC code, or when
1822                 using -Bsymbolic.  */
1823              break;
1824            }
1825
1826          relocation = (htab->splt->output_section->vma
1827                        + htab->splt->output_offset
1828                        + h->plt.offset);
1829	  unresolved_reloc = false;
1830          break;
1831
1832        case R_390_8:
1833        case R_390_16:
1834        case R_390_32:
1835        case R_390_64:
1836        case R_390_PC16:
1837        case R_390_PC16DBL:
1838        case R_390_PC32:
1839	case R_390_PC32DBL:
1840        case R_390_PC64:
1841	  /* r_symndx will be zero only for relocs against symbols
1842	     from removed linkonce sections, or sections discarded by
1843	     a linker script.  */
1844          if (r_symndx == 0
1845              || (input_section->flags & SEC_ALLOC) == 0)
1846	    break;
1847
1848          if ((info->shared
1849	       && ((r_type != R_390_PC16
1850		    && r_type != R_390_PC16DBL
1851		    && r_type != R_390_PC32
1852		    && r_type != R_390_PC32DBL
1853		    && r_type != R_390_PC64)
1854		   || (h != NULL
1855		       && h->dynindx != -1
1856		       && (! info->symbolic
1857			   || (h->elf_link_hash_flags
1858			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1859	      || (!info->shared
1860		  && h != NULL
1861		  && h->dynindx != -1
1862		  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1863		  && (((h->elf_link_hash_flags
1864			& ELF_LINK_HASH_DEF_DYNAMIC) != 0
1865		       && (h->elf_link_hash_flags
1866			   & ELF_LINK_HASH_DEF_REGULAR) == 0)
1867		      || h->root.type == bfd_link_hash_undefweak
1868		      || h->root.type == bfd_link_hash_undefined)))
1869            {
1870              Elf_Internal_Rela outrel;
1871              boolean skip, relocate;
1872	      asection *sreloc;
1873	      Elf64_External_Rela *loc;
1874
1875              /* When generating a shared object, these relocations
1876                 are copied into the output file to be resolved at run
1877                 time.  */
1878
1879              skip = false;
1880              relocate = false;
1881
1882	      outrel.r_offset =
1883		_bfd_elf_section_offset (output_bfd, info, input_section,
1884					 rel->r_offset);
1885	      if (outrel.r_offset == (bfd_vma) -1)
1886		skip = true;
1887	      else if (outrel.r_offset == (bfd_vma) -2)
1888		skip = true, relocate = true;
1889
1890              outrel.r_offset += (input_section->output_section->vma
1891                                  + input_section->output_offset);
1892
1893              if (skip)
1894		memset (&outrel, 0, sizeof outrel);
1895              else if (h != NULL
1896		       && h->dynindx != -1
1897		       && (r_type == R_390_PC16
1898			   || r_type == R_390_PC16DBL
1899			   || r_type == R_390_PC32
1900			   || r_type == R_390_PC32DBL
1901			   || r_type == R_390_PC64
1902			   || !info->shared
1903			   || !info->symbolic
1904			   || (h->elf_link_hash_flags
1905			       & ELF_LINK_HASH_DEF_REGULAR) == 0))
1906                {
1907                  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
1908		  outrel.r_addend = rel->r_addend;
1909                }
1910              else
1911                {
1912		  /* This symbol is local, or marked to become local.  */
1913		  relocate = true;
1914		  outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1915		  outrel.r_addend = relocation + rel->r_addend;
1916		}
1917
1918	      sreloc = elf_section_data (input_section)->sreloc;
1919	      if (sreloc == NULL)
1920		abort ();
1921
1922	      loc = (Elf64_External_Rela *) sreloc->contents;
1923	      loc += sreloc->reloc_count++;
1924              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1925
1926              /* If this reloc is against an external symbol, we do
1927                 not want to fiddle with the addend.  Otherwise, we
1928                 need to include the symbol value so that it becomes
1929                 an addend for the dynamic reloc.  */
1930              if (! relocate)
1931                continue;
1932            }
1933
1934          break;
1935
1936        default:
1937          break;
1938        }
1939
1940      if (unresolved_reloc
1941	  && !(info->shared
1942	       && (input_section->flags & SEC_DEBUGGING) != 0
1943	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1944	(*_bfd_error_handler)
1945	  (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1946	   bfd_archive_filename (input_bfd),
1947	   bfd_get_section_name (input_bfd, input_section),
1948	   (long) rel->r_offset,
1949	   h->root.root.string);
1950
1951      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1952				      contents, rel->r_offset,
1953				      relocation, rel->r_addend);
1954
1955      if (r != bfd_reloc_ok)
1956	{
1957	  const char *name;
1958
1959	  if (h != NULL)
1960	    name = h->root.root.string;
1961	  else
1962	    {
1963	      name = bfd_elf_string_from_elf_section (input_bfd,
1964						      symtab_hdr->sh_link,
1965						      sym->st_name);
1966	      if (name == NULL)
1967		return false;
1968	      if (*name == '\0')
1969		name = bfd_section_name (input_bfd, sec);
1970	    }
1971
1972	  if (r == bfd_reloc_overflow)
1973	    {
1974
1975	      if (! ((*info->callbacks->reloc_overflow)
1976		     (info, name, howto->name, (bfd_vma) 0,
1977		      input_bfd, input_section, rel->r_offset)))
1978		return false;
1979	    }
1980	  else
1981	    {
1982	      (*_bfd_error_handler)
1983		(_("%s(%s+0x%lx): reloc against `%s': error %d"),
1984		 bfd_archive_filename (input_bfd),
1985		 bfd_get_section_name (input_bfd, input_section),
1986		 (long) rel->r_offset, name, (int) r);
1987	      return false;
1988	    }
1989	}
1990    }
1991
1992  return true;
1993}
1994
1995/* Finish up dynamic symbol handling.  We set the contents of various
1996   dynamic sections here.  */
1997
1998static boolean
1999elf_s390_finish_dynamic_symbol (output_bfd, info, h, sym)
2000     bfd *output_bfd;
2001     struct bfd_link_info *info;
2002     struct elf_link_hash_entry *h;
2003     Elf_Internal_Sym *sym;
2004{
2005  struct elf_s390_link_hash_table *htab;
2006
2007  htab = elf_s390_hash_table (info);
2008
2009  if (h->plt.offset != (bfd_vma) -1)
2010    {
2011      bfd_vma plt_index;
2012      bfd_vma got_offset;
2013      Elf_Internal_Rela rela;
2014      Elf64_External_Rela *loc;
2015
2016      /* This symbol has an entry in the procedure linkage table.  Set
2017         it up.  */
2018
2019      if (h->dynindx == -1
2020	  || htab->splt == NULL
2021	  || htab->sgotplt == NULL
2022	  || htab->srelplt == NULL)
2023	abort ();
2024
2025      /* Calc. index no.
2026         Current offset - size first entry / entry size.  */
2027      plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
2028
2029      /* Offset in GOT is PLT index plus GOT headers(3) times 8,
2030         addr & GOT addr.  */
2031      got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
2032
2033      /* Fill in the blueprint of a PLT.  */
2034      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD0,
2035		  htab->splt->contents + h->plt.offset);
2036      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD1,
2037		  htab->splt->contents + h->plt.offset + 4);
2038      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
2039		  htab->splt->contents + h->plt.offset + 8);
2040      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
2041		  htab->splt->contents + h->plt.offset + 12);
2042      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD4,
2043		  htab->splt->contents + h->plt.offset + 16);
2044      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD5,
2045		  htab->splt->contents + h->plt.offset + 20);
2046      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD6,
2047		  htab->splt->contents + h->plt.offset + 24);
2048      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD7,
2049		  htab->splt->contents + h->plt.offset + 28);
2050      /* Fixup the relative address to the GOT entry */
2051      bfd_put_32 (output_bfd,
2052		  (htab->sgotplt->output_section->vma +
2053		   htab->sgotplt->output_offset + got_offset
2054		   - (htab->splt->output_section->vma + h->plt.offset))/2,
2055		  htab->splt->contents + h->plt.offset + 2);
2056      /* Fixup the relative branch to PLT 0 */
2057      bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
2058				 (PLT_ENTRY_SIZE * plt_index) + 22)/2,
2059		  htab->splt->contents + h->plt.offset + 24);
2060      /* Fixup offset into symbol table */
2061      bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
2062		  htab->splt->contents + h->plt.offset + 28);
2063
2064      /* Fill in the entry in the global offset table.
2065         Points to instruction after GOT offset.  */
2066      bfd_put_64 (output_bfd,
2067		  (htab->splt->output_section->vma
2068		   + htab->splt->output_offset
2069		   + h->plt.offset
2070		   + 14),
2071		  htab->sgotplt->contents + got_offset);
2072
2073      /* Fill in the entry in the .rela.plt section.  */
2074      rela.r_offset = (htab->sgotplt->output_section->vma
2075		       + htab->sgotplt->output_offset
2076		       + got_offset);
2077      rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
2078      rela.r_addend = 0;
2079      loc = (Elf64_External_Rela *) htab->srelplt->contents + plt_index;
2080      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2081
2082      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2083	{
2084	  /* Mark the symbol as undefined, rather than as defined in
2085	     the .plt section.  Leave the value alone.  This is a clue
2086	     for the dynamic linker, to make function pointer
2087	     comparisons work between an application and shared
2088	     library.  */
2089	  sym->st_shndx = SHN_UNDEF;
2090	}
2091    }
2092
2093  if (h->got.offset != (bfd_vma) -1)
2094    {
2095      Elf_Internal_Rela rela;
2096      Elf64_External_Rela *loc;
2097
2098      /* This symbol has an entry in the global offset table.  Set it
2099         up.  */
2100
2101      if (htab->sgot == NULL || htab->srelgot == NULL)
2102	abort ();
2103
2104      rela.r_offset = (htab->sgot->output_section->vma
2105		       + htab->sgot->output_offset
2106		       + (h->got.offset &~ (bfd_vma) 1));
2107
2108      /* If this is a static link, or it is a -Bsymbolic link and the
2109	 symbol is defined locally or was forced to be local because
2110	 of a version file, we just want to emit a RELATIVE reloc.
2111	 The entry in the global offset table will already have been
2112	 initialized in the relocate_section function.  */
2113      if (info->shared
2114	  && (info->symbolic
2115	      || h->dynindx == -1
2116	      || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2117	  && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2118        {
2119	  BFD_ASSERT((h->got.offset & 1) != 0);
2120          rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2121          rela.r_addend = (h->root.u.def.value
2122                           + h->root.u.def.section->output_section->vma
2123                           + h->root.u.def.section->output_offset);
2124        }
2125      else
2126	{
2127	  BFD_ASSERT((h->got.offset & 1) == 0);
2128	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgot->contents + h->got.offset);
2129	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
2130          rela.r_addend = 0;
2131        }
2132
2133      loc = (Elf64_External_Rela *) htab->srelgot->contents;
2134      loc += htab->srelgot->reloc_count++;
2135      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2136    }
2137
2138  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2139    {
2140      Elf_Internal_Rela rela;
2141      Elf64_External_Rela *loc;
2142
2143      /* This symbols needs a copy reloc.  Set it up.  */
2144
2145      if (h->dynindx == -1
2146	  || (h->root.type != bfd_link_hash_defined
2147	      && h->root.type != bfd_link_hash_defweak)
2148	  || htab->srelbss == NULL)
2149	abort ();
2150
2151      rela.r_offset = (h->root.u.def.value
2152		       + h->root.u.def.section->output_section->vma
2153		       + h->root.u.def.section->output_offset);
2154      rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
2155      rela.r_addend = 0;
2156      loc = (Elf64_External_Rela *) htab->srelbss->contents;
2157      loc += htab->srelbss->reloc_count++;
2158      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2159    }
2160
2161  /* Mark some specially defined symbols as absolute.  */
2162  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2163      || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
2164      || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
2165    sym->st_shndx = SHN_ABS;
2166
2167  return true;
2168}
2169
2170/* Used to decide how to sort relocs in an optimal manner for the
2171   dynamic linker, before writing them out.  */
2172
2173static enum elf_reloc_type_class
2174elf_s390_reloc_type_class (rela)
2175     const Elf_Internal_Rela *rela;
2176{
2177  switch ((int) ELF64_R_TYPE (rela->r_info))
2178    {
2179    case R_390_RELATIVE:
2180      return reloc_class_relative;
2181    case R_390_JMP_SLOT:
2182      return reloc_class_plt;
2183    case R_390_COPY:
2184      return reloc_class_copy;
2185    default:
2186      return reloc_class_normal;
2187    }
2188}
2189
2190/* Finish up the dynamic sections.  */
2191
2192static boolean
2193elf_s390_finish_dynamic_sections (output_bfd, info)
2194     bfd *output_bfd;
2195     struct bfd_link_info *info;
2196{
2197  struct elf_s390_link_hash_table *htab;
2198  bfd *dynobj;
2199  asection *sdyn;
2200
2201  htab = elf_s390_hash_table (info);
2202  dynobj = htab->elf.dynobj;
2203  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2204
2205  if (htab->elf.dynamic_sections_created)
2206    {
2207      Elf64_External_Dyn *dyncon, *dynconend;
2208
2209      if (sdyn == NULL || htab->sgot == NULL)
2210	abort ();
2211
2212      dyncon = (Elf64_External_Dyn *) sdyn->contents;
2213      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2214      for (; dyncon < dynconend; dyncon++)
2215	{
2216	  Elf_Internal_Dyn dyn;
2217	  asection *s;
2218
2219	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2220
2221	  switch (dyn.d_tag)
2222	    {
2223	    default:
2224	      continue;
2225
2226	    case DT_PLTGOT:
2227	      dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2228	      break;
2229
2230	    case DT_JMPREL:
2231	      dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2232	      break;
2233
2234	    case DT_PLTRELSZ:
2235	      s = htab->srelplt->output_section;
2236	      if (s->_cooked_size != 0)
2237		dyn.d_un.d_val = s->_cooked_size;
2238	      else
2239		dyn.d_un.d_val = s->_raw_size;
2240	      break;
2241
2242	    case DT_RELASZ:
2243	      /* The procedure linkage table relocs (DT_JMPREL) should
2244		 not be included in the overall relocs (DT_RELA).
2245		 Therefore, we override the DT_RELASZ entry here to
2246		 make it not include the JMPREL relocs.  Since the
2247		 linker script arranges for .rela.plt to follow all
2248		 other relocation sections, we don't have to worry
2249		 about changing the DT_RELA entry.  */
2250	      s = htab->srelplt->output_section;
2251	      if (s->_cooked_size != 0)
2252		dyn.d_un.d_val -= s->_cooked_size;
2253	      else
2254		dyn.d_un.d_val -= s->_raw_size;
2255	      break;
2256	    }
2257
2258	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2259	}
2260
2261      /* Fill in the special first entry in the procedure linkage table.  */
2262      if (htab->splt && htab->splt->_raw_size > 0)
2263	{
2264	  /* fill in blueprint for plt 0 entry */
2265	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD0,
2266		      htab->splt->contents );
2267	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD1,
2268		      htab->splt->contents +4 );
2269	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD3,
2270		      htab->splt->contents +12 );
2271	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD4,
2272		      htab->splt->contents +16 );
2273	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD5,
2274		      htab->splt->contents +20 );
2275	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD6,
2276		      htab->splt->contents + 24);
2277	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD7,
2278		      htab->splt->contents + 28 );
2279	  /* Fixup relative address to start of GOT */
2280	  bfd_put_32 (output_bfd,
2281		      (htab->sgotplt->output_section->vma +
2282		       htab->sgotplt->output_offset
2283		       - htab->splt->output_section->vma - 6)/2,
2284		      htab->splt->contents + 8);
2285	}
2286      elf_section_data (htab->splt->output_section)
2287	->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
2288    }
2289
2290  if (htab->sgotplt)
2291    {
2292      /* Fill in the first three entries in the global offset table.  */
2293      if (htab->sgotplt->_raw_size > 0)
2294	{
2295	  bfd_put_64 (output_bfd,
2296		      (sdyn == NULL ? (bfd_vma) 0
2297		       : sdyn->output_section->vma + sdyn->output_offset),
2298		      htab->sgotplt->contents);
2299	  /* One entry for shared object struct ptr.  */
2300	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2301	  /* One entry for _dl_runtime_resolve.  */
2302	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 12);
2303	}
2304
2305      elf_section_data (htab->sgot->output_section)
2306	->this_hdr.sh_entsize = 8;
2307    }
2308  return true;
2309}
2310
2311static boolean
2312elf_s390_object_p (abfd)
2313     bfd *abfd;
2314{
2315  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
2316}
2317
2318/*
2319 * Why was the hash table entry size definition changed from
2320 * ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
2321 * this is the only reason for the s390_elf64_size_info structure.
2322 */
2323
2324const struct elf_size_info s390_elf64_size_info =
2325{
2326  sizeof (Elf64_External_Ehdr),
2327  sizeof (Elf64_External_Phdr),
2328  sizeof (Elf64_External_Shdr),
2329  sizeof (Elf64_External_Rel),
2330  sizeof (Elf64_External_Rela),
2331  sizeof (Elf64_External_Sym),
2332  sizeof (Elf64_External_Dyn),
2333  sizeof (Elf_External_Note),
2334  8,            /* hash-table entry size */
2335  1,            /* internal relocations per external relocations */
2336  64,		/* arch_size */
2337  8,		/* file_align */
2338  ELFCLASS64, EV_CURRENT,
2339  bfd_elf64_write_out_phdrs,
2340  bfd_elf64_write_shdrs_and_ehdr,
2341  bfd_elf64_write_relocs,
2342  bfd_elf64_swap_symbol_out,
2343  bfd_elf64_slurp_reloc_table,
2344  bfd_elf64_slurp_symbol_table,
2345  bfd_elf64_swap_dyn_in,
2346  bfd_elf64_swap_dyn_out,
2347  NULL,
2348  NULL,
2349  NULL,
2350  NULL
2351};
2352
2353#define TARGET_BIG_SYM	bfd_elf64_s390_vec
2354#define TARGET_BIG_NAME	"elf64-s390"
2355#define ELF_ARCH	bfd_arch_s390
2356#define ELF_MACHINE_CODE EM_S390
2357#define ELF_MACHINE_ALT1 EM_S390_OLD
2358#define ELF_MAXPAGESIZE 0x1000
2359
2360#define elf_backend_size_info		s390_elf64_size_info
2361
2362#define elf_backend_can_gc_sections	1
2363#define elf_backend_can_refcount	1
2364#define elf_backend_want_got_plt	1
2365#define elf_backend_plt_readonly	1
2366#define elf_backend_want_plt_sym	0
2367#define elf_backend_got_header_size	24
2368#define elf_backend_plt_header_size	PLT_ENTRY_SIZE
2369#define elf_backend_rela_normal		1
2370
2371#define elf_info_to_howto		elf_s390_info_to_howto
2372
2373#define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
2374#define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
2375#define bfd_elf64_bfd_reloc_type_lookup	      elf_s390_reloc_type_lookup
2376
2377#define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
2378#define elf_backend_check_relocs	      elf_s390_check_relocs
2379#define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
2380#define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
2381#define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
2382#define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
2383#define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
2384#define elf_backend_gc_sweep_hook	      elf_s390_gc_sweep_hook
2385#define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
2386#define elf_backend_relocate_section	      elf_s390_relocate_section
2387#define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
2388#define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
2389
2390#define elf_backend_object_p                  elf_s390_object_p
2391
2392#include "elf64-target.h"
2393