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