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