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