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