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