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