1 /* IBM S/390-specific support for 64-bit ELF
2    Copyright (C) 2000-2021 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 	 3,			/* size (0 = byte, 1 = 2 byte, 2 = 4 byte) */
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, 0,	8, false, 0, complain_overflow_bitfield,
60 	bfd_elf_generic_reloc, "R_390_8",	 false, 0,0x000000ff, false),
61   HOWTO(R_390_12,	 0, 1, 12, false, 0, complain_overflow_dont,
62 	bfd_elf_generic_reloc, "R_390_12",	 false, 0,0x00000fff, false),
63   HOWTO(R_390_16,	 0, 1, 16, false, 0, complain_overflow_bitfield,
64 	bfd_elf_generic_reloc, "R_390_16",	 false, 0,0x0000ffff, false),
65   HOWTO(R_390_32,	 0, 2, 32, false, 0, complain_overflow_bitfield,
66 	bfd_elf_generic_reloc, "R_390_32",	 false, 0,0xffffffff, false),
67   HOWTO(R_390_PC32,	 0, 2, 32,  true, 0, complain_overflow_bitfield,
68 	bfd_elf_generic_reloc, "R_390_PC32",	 false, 0,0xffffffff, true),
69   HOWTO(R_390_GOT12,	 0, 1, 12, false, 0, complain_overflow_bitfield,
70 	bfd_elf_generic_reloc, "R_390_GOT12",	 false, 0,0x00000fff, false),
71   HOWTO(R_390_GOT32,	 0, 2, 32, false, 0, complain_overflow_bitfield,
72 	bfd_elf_generic_reloc, "R_390_GOT32",	 false, 0,0xffffffff, false),
73   HOWTO(R_390_PLT32,	 0, 2, 32,  true, 0, complain_overflow_bitfield,
74 	bfd_elf_generic_reloc, "R_390_PLT32",	 false, 0,0xffffffff, true),
75   HOWTO(R_390_COPY,	 0, 4, 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, 4, 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, 4, 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, 4, 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, 2, 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, 4, 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, 1, 16, false, 0, complain_overflow_bitfield,
88 	bfd_elf_generic_reloc, "R_390_GOT16",	 false, 0,0x0000ffff, false),
89   HOWTO(R_390_PC16,	 0, 1, 16,  true, 0, complain_overflow_bitfield,
90 	bfd_elf_generic_reloc, "R_390_PC16",	 false, 0,0x0000ffff, true),
91   HOWTO(R_390_PC16DBL,	 1, 1, 16,  true, 0, complain_overflow_bitfield,
92 	bfd_elf_generic_reloc, "R_390_PC16DBL",	 false, 0,0x0000ffff, true),
93   HOWTO(R_390_PLT16DBL,	 1, 1, 16,  true, 0, complain_overflow_bitfield,
94 	bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true),
95   HOWTO(R_390_PC32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield,
96 	bfd_elf_generic_reloc, "R_390_PC32DBL",	 false, 0,0xffffffff, true),
97   HOWTO(R_390_PLT32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield,
98 	bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true),
99   HOWTO(R_390_GOTPCDBL,	 1, 2, 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, 4, 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, 4, 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, 4, 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, 4, 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, 2, 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, 1, 16, false, 0, complain_overflow_bitfield,
112 	bfd_elf_generic_reloc, "R_390_GOTOFF16", false, 0,0x0000ffff, false),
113   HOWTO(R_390_GOTOFF64,	 0, 4, 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, 1, 12, false, 0, complain_overflow_dont,
116 	bfd_elf_generic_reloc, "R_390_GOTPLT12", false, 0,0x00000fff, false),
117   HOWTO(R_390_GOTPLT16,	 0, 1, 16, false, 0, complain_overflow_bitfield,
118 	bfd_elf_generic_reloc, "R_390_GOTPLT16", false, 0,0x0000ffff, false),
119   HOWTO(R_390_GOTPLT32,	 0, 2, 32, false, 0, complain_overflow_bitfield,
120 	bfd_elf_generic_reloc, "R_390_GOTPLT32", false, 0,0xffffffff, false),
121   HOWTO(R_390_GOTPLT64,	 0, 4, 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, 2, 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, 1, 16, false, 0, complain_overflow_bitfield,
126 	bfd_elf_generic_reloc, "R_390_PLTOFF16", false, 0,0x0000ffff, false),
127   HOWTO(R_390_PLTOFF32,	 0, 2, 32, false, 0, complain_overflow_bitfield,
128 	bfd_elf_generic_reloc, "R_390_PLTOFF32", false, 0,0xffffffff, false),
129   HOWTO(R_390_PLTOFF64,	 0, 4, 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, 4, 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, 1, 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, 4, 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, 4, 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, 4, 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, 2, 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, 2, 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, 4, 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, 4, 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, 4, 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, 4, 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, 2, 20, false, 8, complain_overflow_dont,
166 	s390_elf_ldisp_reloc, "R_390_20",      false, 0,0x0fffff00, false),
167   HOWTO(R_390_GOT20,	 0, 2, 20, false, 8, complain_overflow_dont,
168 	s390_elf_ldisp_reloc, "R_390_GOT20",   false, 0,0x0fffff00, false),
169   HOWTO(R_390_GOTPLT20,	 0, 2, 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, 2, 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, 4, 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, 1, 12,  true, 0, complain_overflow_bitfield,
176 	bfd_elf_generic_reloc, "R_390_PC12DBL",	 false, 0,0x00000fff, true),
177   HOWTO(R_390_PLT12DBL,	 1, 1, 12,  true, 0, complain_overflow_bitfield,
178 	bfd_elf_generic_reloc, "R_390_PLT12DBL", false, 0,0x00000fff, true),
179   HOWTO(R_390_PC24DBL,	 1, 2, 24,  true, 0, complain_overflow_bitfield,
180 	bfd_elf_generic_reloc, "R_390_PC24DBL",	 false, 0,0x00ffffff, true),
181   HOWTO(R_390_PLT24DBL,	 1, 2, 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,4,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,4,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_pic (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_pic (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_pic (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_pic (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 	    relocs = true;
1880 
1881 	  /* We use the reloc_count field as a counter if we need
1882 	     to copy relocs into the output file.  */
1883 	  s->reloc_count = 0;
1884 	}
1885       else
1886 	{
1887 	  /* It's not one of our sections, so don't allocate space.  */
1888 	  continue;
1889 	}
1890 
1891       if (s->size == 0)
1892 	{
1893 	  /* If we don't need this section, strip it from the
1894 	     output file.  This is to handle .rela.bss and
1895 	     .rela.plt.  We must create it in
1896 	     create_dynamic_sections, because it must be created
1897 	     before the linker maps input sections to output
1898 	     sections.  The linker does that before
1899 	     adjust_dynamic_symbol is called, and it is that
1900 	     function which decides whether anything needs to go
1901 	     into these sections.  */
1902 
1903 	  s->flags |= SEC_EXCLUDE;
1904 	  continue;
1905 	}
1906 
1907       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1908 	continue;
1909 
1910       /* Allocate memory for the section contents.  We use bfd_zalloc
1911 	 here in case unused entries are not reclaimed before the
1912 	 section's contents are written out.  This should not happen,
1913 	 but this way if it does, we get a R_390_NONE reloc instead
1914 	 of garbage.  */
1915       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1916       if (s->contents == NULL)
1917 	return false;
1918     }
1919 
1920   return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs);
1921 }
1922 
1923 /* Return the base VMA address which should be subtracted from real addresses
1924    when resolving @dtpoff relocation.
1925    This is PT_TLS segment p_vaddr.  */
1926 
1927 static bfd_vma
dtpoff_base(struct bfd_link_info * info)1928 dtpoff_base (struct bfd_link_info *info)
1929 {
1930   /* If tls_sec is NULL, we should have signalled an error already.  */
1931   if (elf_hash_table (info)->tls_sec == NULL)
1932     return 0;
1933   return elf_hash_table (info)->tls_sec->vma;
1934 }
1935 
1936 /* Return the relocation value for @tpoff relocation
1937    if STT_TLS virtual address is ADDRESS.  */
1938 
1939 static bfd_vma
tpoff(struct bfd_link_info * info,bfd_vma address)1940 tpoff (struct bfd_link_info *info, bfd_vma address)
1941 {
1942   struct elf_link_hash_table *htab = elf_hash_table (info);
1943 
1944   /* If tls_sec is NULL, we should have signalled an error already.  */
1945   if (htab->tls_sec == NULL)
1946     return 0;
1947   return htab->tls_size + htab->tls_sec->vma - address;
1948 }
1949 
1950 /* Complain if TLS instruction relocation is against an invalid
1951    instruction.  */
1952 
1953 static void
invalid_tls_insn(bfd * input_bfd,asection * input_section,Elf_Internal_Rela * rel)1954 invalid_tls_insn (bfd *input_bfd,
1955 		  asection *input_section,
1956 		  Elf_Internal_Rela *rel)
1957 {
1958   reloc_howto_type *howto;
1959 
1960   howto = elf_howto_table + ELF64_R_TYPE (rel->r_info);
1961   _bfd_error_handler
1962     /* xgettext:c-format */
1963     (_("%pB(%pA+%#" PRIx64 "): invalid instruction for TLS relocation %s"),
1964      input_bfd,
1965      input_section,
1966      (uint64_t) rel->r_offset,
1967      howto->name);
1968   bfd_set_error (bfd_error_bad_value);
1969 }
1970 
1971 /* Relocate a 390 ELF section.  */
1972 
1973 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)1974 elf_s390_relocate_section (bfd *output_bfd,
1975 			   struct bfd_link_info *info,
1976 			   bfd *input_bfd,
1977 			   asection *input_section,
1978 			   bfd_byte *contents,
1979 			   Elf_Internal_Rela *relocs,
1980 			   Elf_Internal_Sym *local_syms,
1981 			   asection **local_sections)
1982 {
1983   struct elf_s390_link_hash_table *htab;
1984   Elf_Internal_Shdr *symtab_hdr;
1985   struct elf_link_hash_entry **sym_hashes;
1986   bfd_vma *local_got_offsets;
1987   Elf_Internal_Rela *rel;
1988   Elf_Internal_Rela *relend;
1989 
1990   if (!is_s390_elf (input_bfd))
1991     {
1992       bfd_set_error (bfd_error_wrong_format);
1993       return false;
1994     }
1995 
1996   htab = elf_s390_hash_table (info);
1997   if (htab == NULL)
1998     return false;
1999 
2000   symtab_hdr = &elf_symtab_hdr (input_bfd);
2001   sym_hashes = elf_sym_hashes (input_bfd);
2002   local_got_offsets = elf_local_got_offsets (input_bfd);
2003 
2004   rel = relocs;
2005   relend = relocs + input_section->reloc_count;
2006   for (; rel < relend; rel++)
2007     {
2008       unsigned int r_type;
2009       reloc_howto_type *howto;
2010       unsigned long r_symndx;
2011       struct elf_link_hash_entry *h;
2012       Elf_Internal_Sym *sym;
2013       asection *sec;
2014       bfd_vma off;
2015       bfd_vma relocation;
2016       bool unresolved_reloc;
2017       bfd_reloc_status_type r;
2018       int tls_type;
2019       bool resolved_to_zero;
2020 
2021       r_type = ELF64_R_TYPE (rel->r_info);
2022       if (r_type == (int) R_390_GNU_VTINHERIT
2023 	  || r_type == (int) R_390_GNU_VTENTRY)
2024 	continue;
2025       if (r_type >= (int) R_390_max)
2026 	{
2027 	  bfd_set_error (bfd_error_bad_value);
2028 	  return false;
2029 	}
2030 
2031       howto = elf_howto_table + r_type;
2032       r_symndx = ELF64_R_SYM (rel->r_info);
2033 
2034       h = NULL;
2035       sym = NULL;
2036       sec = NULL;
2037       unresolved_reloc = false;
2038       if (r_symndx < symtab_hdr->sh_info)
2039 	{
2040 	  sym = local_syms + r_symndx;
2041 	  sec = local_sections[r_symndx];
2042 
2043 	  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2044 	    {
2045 	      struct plt_entry *local_plt = elf_s390_local_plt (input_bfd);
2046 	      if (local_plt == NULL)
2047 		return false;
2048 
2049 	      /* Address of the PLT slot.  */
2050 	      relocation = (htab->elf.iplt->output_section->vma
2051 			    + htab->elf.iplt->output_offset
2052 			    + local_plt[r_symndx].plt.offset);
2053 
2054 	      switch (r_type)
2055 		{
2056 		case R_390_PLTOFF16:
2057 		case R_390_PLTOFF32:
2058 		case R_390_PLTOFF64:
2059 		  relocation -= s390_got_pointer (info);
2060 		  break;
2061 		case R_390_GOTPLT12:
2062 		case R_390_GOTPLT16:
2063 		case R_390_GOTPLT20:
2064 		case R_390_GOTPLT32:
2065 		case R_390_GOTPLT64:
2066 		case R_390_GOTPLTENT:
2067 		case R_390_GOT12:
2068 		case R_390_GOT16:
2069 		case R_390_GOT20:
2070 		case R_390_GOT32:
2071 		case R_390_GOT64:
2072 		case R_390_GOTENT:
2073 		  {
2074 		    /* Write the PLT slot address into the GOT slot.  */
2075 		    bfd_put_64 (output_bfd, relocation,
2076 				htab->elf.sgot->contents +
2077 				local_got_offsets[r_symndx]);
2078 		    relocation = (local_got_offsets[r_symndx] +
2079 				  s390_got_offset (info));
2080 
2081 		    if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
2082 		      relocation += s390_got_pointer (info);
2083 		    break;
2084 		  }
2085 		default:
2086 		  break;
2087 		}
2088 	      /* The output section is needed later in
2089 		 finish_dynamic_section when creating the dynamic
2090 		 relocation.  */
2091 	      local_plt[r_symndx].sec = sec;
2092 	      goto do_relocation;
2093 	    }
2094 	  else
2095 	    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2096 	}
2097       else
2098 	{
2099 	  bool warned ATTRIBUTE_UNUSED;
2100 	  bool ignored ATTRIBUTE_UNUSED;
2101 
2102 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2103 				   r_symndx, symtab_hdr, sym_hashes,
2104 				   h, sec, relocation,
2105 				   unresolved_reloc, warned, ignored);
2106 	}
2107 
2108       if (sec != NULL && discarded_section (sec))
2109 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2110 					 rel, 1, relend, howto, 0, contents);
2111 
2112       if (bfd_link_relocatable (info))
2113 	continue;
2114 
2115       resolved_to_zero = (h != NULL
2116 			  && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
2117 
2118       switch (r_type)
2119 	{
2120 	case R_390_GOTPLT12:
2121 	case R_390_GOTPLT16:
2122 	case R_390_GOTPLT20:
2123 	case R_390_GOTPLT32:
2124 	case R_390_GOTPLT64:
2125 	case R_390_GOTPLTENT:
2126 	  /* There are three cases for a GOTPLT relocation. 1) The
2127 	     relocation is against the jump slot entry of a plt that
2128 	     will get emitted to the output file. 2) The relocation
2129 	     is against the jump slot of a plt entry that has been
2130 	     removed. elf_s390_adjust_gotplt has created a GOT entry
2131 	     as replacement. 3) The relocation is against a local symbol.
2132 	     Cases 2) and 3) are the same as the GOT relocation code
2133 	     so we just have to test for case 1 and fall through for
2134 	     the other two.  */
2135 	  if (h != NULL && h->plt.offset != (bfd_vma) -1)
2136 	    {
2137 	      bfd_vma plt_index;
2138 
2139 	      if (s390_is_ifunc_symbol_p (h))
2140 		{
2141 		  /* Entry indices of .iplt and .igot.plt match
2142 		     1:1. No magic PLT first entry here.  */
2143 		  plt_index = h->plt.offset / PLT_ENTRY_SIZE;
2144 		  relocation = (plt_index * GOT_ENTRY_SIZE
2145 				+ s390_gotplt_offset (info)
2146 				+ htab->elf.igotplt->output_offset);
2147 		}
2148 	      else
2149 		{
2150 		  plt_index = ((h->plt.offset - PLT_FIRST_ENTRY_SIZE)
2151 			       / PLT_ENTRY_SIZE);
2152 
2153 		  relocation = (plt_index * GOT_ENTRY_SIZE
2154 				+ s390_gotplt_offset (info));
2155 		}
2156 	      if (r_type == R_390_GOTPLTENT)
2157 		relocation += s390_got_pointer (info);
2158 	      unresolved_reloc = false;
2159 	      break;
2160 	    }
2161 	  /* Fall through.  */
2162 
2163 	case R_390_GOT12:
2164 	case R_390_GOT16:
2165 	case R_390_GOT20:
2166 	case R_390_GOT32:
2167 	case R_390_GOT64:
2168 	case R_390_GOTENT:
2169 	  /* Relocation is to the entry for this symbol in the global
2170 	     offset table.  */
2171 	  if (htab->elf.sgot == NULL)
2172 	    abort ();
2173 
2174 	  if (h != NULL)
2175 	    {
2176 	      bool dyn;
2177 
2178 	      off = h->got.offset;
2179 	      dyn = htab->elf.dynamic_sections_created;
2180 
2181 	      if (s390_is_ifunc_symbol_p (h))
2182 		{
2183 		  BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2184 		  if (off == (bfd_vma)-1)
2185 		    {
2186 		      /* No explicit GOT usage so redirect to the
2187 			 got.iplt slot.  */
2188 		      relocation = (s390_gotplt_offset (info)
2189 				    + htab->elf.igotplt->output_offset
2190 				    + (h->plt.offset / PLT_ENTRY_SIZE
2191 				       * GOT_ENTRY_SIZE));
2192 
2193 		      /* For @GOTENT the relocation is against the offset between
2194 			 the instruction and the symbols entry in the GOT and not
2195 			 between the start of the GOT and the symbols entry. We
2196 			 add the vma of the GOT to get the correct value.  */
2197 		      if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
2198 			relocation += s390_got_pointer (info);
2199 
2200 		      break;
2201 		    }
2202 		  else
2203 		    {
2204 		      /* Explicit GOT slots must contain the address
2205 			 of the PLT slot. This will be handled in
2206 			 finish_dynamic_symbol.  */
2207 		    }
2208 		}
2209 	      else if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2210 							  bfd_link_pic (info),
2211 							  h)
2212 		       || (bfd_link_pic (info)
2213 			   && SYMBOL_REFERENCES_LOCAL (info, h))
2214 		       || resolved_to_zero)
2215 		{
2216 		  Elf_Internal_Sym *isym;
2217 		  asection *sym_sec;
2218 
2219 		  /* This is actually a static link, or it is a
2220 		     -Bsymbolic link and the symbol is defined
2221 		     locally, or the symbol was forced to be local
2222 		     because of a version file.  We must initialize
2223 		     this entry in the global offset table.  Since the
2224 		     offset must always be a multiple of 2, we use the
2225 		     least significant bit to record whether we have
2226 		     initialized it already.
2227 
2228 		     When doing a dynamic link, we create a .rel.got
2229 		     relocation entry to initialize the value.  This
2230 		     is done in the finish_dynamic_symbol routine.  */
2231 		  if ((off & 1) != 0)
2232 		    off &= ~1;
2233 		  else
2234 		    {
2235 		      bfd_put_64 (output_bfd, relocation,
2236 				  htab->elf.sgot->contents + off);
2237 		      h->got.offset |= 1;
2238 		    }
2239 
2240 		  /* When turning a GOT slot dereference into a direct
2241 		     reference using larl we have to make sure that
2242 		     the symbol is 1. properly aligned and 2. it is no
2243 		     ABS symbol or will become one.  */
2244 		  if ((h->def_regular
2245 		       && bfd_link_pic (info)
2246 		       && SYMBOL_REFERENCES_LOCAL (info, h))
2247 		      /* lgrl rx,sym@GOTENT -> larl rx, sym */
2248 		      && ((r_type == R_390_GOTENT
2249 			   && (bfd_get_16 (input_bfd,
2250 					   contents + rel->r_offset - 2)
2251 			       & 0xff0f) == 0xc408)
2252 			  /* lg rx, sym@GOT(r12) -> larl rx, sym */
2253 			  || (r_type == R_390_GOT20
2254 			      && (bfd_get_32 (input_bfd,
2255 					      contents + rel->r_offset - 2)
2256 				  & 0xff00f000) == 0xe300c000
2257 			      && bfd_get_8 (input_bfd,
2258 					    contents + rel->r_offset + 3) == 0x04))
2259 		      && (isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
2260 							input_bfd, r_symndx))
2261 		      && isym->st_shndx != SHN_ABS
2262 		      && h != htab->elf.hdynamic
2263 		      && h != htab->elf.hgot
2264 		      && h != htab->elf.hplt
2265 		      && !(isym->st_value & 1)
2266 		      && (sym_sec = bfd_section_from_elf_index (input_bfd,
2267 								isym->st_shndx))
2268 		      && sym_sec->alignment_power)
2269 		    {
2270 		      unsigned short new_insn =
2271 			(0xc000 | (bfd_get_8 (input_bfd,
2272 					      contents + rel->r_offset - 1) & 0xf0));
2273 		      bfd_put_16 (output_bfd, new_insn,
2274 				  contents + rel->r_offset - 2);
2275 		      r_type = R_390_PC32DBL;
2276 		      rel->r_addend = 2;
2277 		      howto = elf_howto_table + r_type;
2278 		      relocation = h->root.u.def.value
2279 			+ h->root.u.def.section->output_section->vma
2280 			+ h->root.u.def.section->output_offset;
2281 		      goto do_relocation;
2282 		    }
2283 		}
2284 	      else
2285 		unresolved_reloc = false;
2286 	    }
2287 	  else
2288 	    {
2289 	      if (local_got_offsets == NULL)
2290 		abort ();
2291 
2292 	      off = local_got_offsets[r_symndx];
2293 
2294 	      /* The offset must always be a multiple of 8.  We use
2295 		 the least significant bit to record whether we have
2296 		 already generated the necessary reloc.  */
2297 	      if ((off & 1) != 0)
2298 		off &= ~1;
2299 	      else
2300 		{
2301 		  bfd_put_64 (output_bfd, relocation,
2302 			      htab->elf.sgot->contents + off);
2303 
2304 		  if (bfd_link_pic (info))
2305 		    {
2306 		      asection *s;
2307 		      Elf_Internal_Rela outrel;
2308 		      bfd_byte *loc;
2309 
2310 		      s = htab->elf.srelgot;
2311 		      if (s == NULL)
2312 			abort ();
2313 
2314 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
2315 					 + htab->elf.sgot->output_offset
2316 					 + off);
2317 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2318 		      outrel.r_addend = relocation;
2319 		      loc = s->contents;
2320 		      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2321 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2322 		    }
2323 
2324 		  local_got_offsets[r_symndx] |= 1;
2325 		}
2326 	    }
2327 
2328 	  if (off >= (bfd_vma) -2)
2329 	    abort ();
2330 
2331 	  relocation = s390_got_offset (info) + off;
2332 
2333 	  /* For @GOTENT the relocation is against the offset between
2334 	     the instruction and the symbols entry in the GOT and not
2335 	     between the start of the GOT and the symbols entry. We
2336 	     add the vma of the GOT to get the correct value.  */
2337 	  if (   r_type == R_390_GOTENT
2338 	      || r_type == R_390_GOTPLTENT)
2339 	    relocation += s390_got_pointer (info);
2340 
2341 	  break;
2342 
2343 	case R_390_GOTOFF16:
2344 	case R_390_GOTOFF32:
2345 	case R_390_GOTOFF64:
2346 	  /* Relocation is relative to the start of the global offset
2347 	     table.  */
2348 
2349 	  if (h != NULL
2350 	      && s390_is_ifunc_symbol_p (h)
2351 	      && h->def_regular
2352 	      && !bfd_link_executable (info))
2353 	    {
2354 	      relocation = (htab->elf.iplt->output_section->vma
2355 			    + htab->elf.iplt->output_offset
2356 			    + h->plt.offset
2357 			    - s390_got_pointer (info));
2358 	      goto do_relocation;
2359 	    }
2360 
2361 	  relocation -= s390_got_pointer (info);
2362 	  break;
2363 
2364 	case R_390_GOTPC:
2365 	case R_390_GOTPCDBL:
2366 	  /* Use global offset table as symbol value.  */
2367 	  relocation = s390_got_pointer (info);
2368 	  unresolved_reloc = false;
2369 	  break;
2370 
2371 	case R_390_PLT12DBL:
2372 	case R_390_PLT16DBL:
2373 	case R_390_PLT24DBL:
2374 	case R_390_PLT32:
2375 	case R_390_PLT32DBL:
2376 	case R_390_PLT64:
2377 	  /* Relocation is to the entry for this symbol in the
2378 	     procedure linkage table.  */
2379 
2380 	  /* Resolve a PLT32 reloc against a local symbol directly,
2381 	     without using the procedure linkage table.  */
2382 	  if (h == NULL)
2383 	    break;
2384 
2385 	  if (h->plt.offset == (bfd_vma) -1
2386 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2387 	    {
2388 	      /* We didn't make a PLT entry for this symbol.  This
2389 		 happens when statically linking PIC code, or when
2390 		 using -Bsymbolic.  */
2391 	      break;
2392 	    }
2393 	  if (s390_is_ifunc_symbol_p (h))
2394 	    relocation = (htab->elf.iplt->output_section->vma
2395 			  + htab->elf.iplt->output_offset
2396 			  + h->plt.offset);
2397 	  else
2398 	    relocation = (htab->elf.splt->output_section->vma
2399 			  + htab->elf.splt->output_offset
2400 			  + h->plt.offset);
2401 	  unresolved_reloc = false;
2402 	  break;
2403 
2404 	case R_390_PLTOFF16:
2405 	case R_390_PLTOFF32:
2406 	case R_390_PLTOFF64:
2407 	  /* Relocation is to the entry for this symbol in the
2408 	     procedure linkage table relative to the start of the GOT.  */
2409 
2410 	  /* For local symbols or if we didn't make a PLT entry for
2411 	     this symbol resolve the symbol directly.  */
2412 	  if (h == NULL
2413 	      || h->plt.offset == (bfd_vma) -1
2414 	      || (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
2415 	    {
2416 	      relocation -= s390_got_pointer (info);
2417 	      break;
2418 	    }
2419 
2420 	  if (s390_is_ifunc_symbol_p (h))
2421 	    relocation = (htab->elf.iplt->output_section->vma
2422 			  + htab->elf.iplt->output_offset
2423 			  + h->plt.offset
2424 			  - s390_got_pointer (info));
2425 	  else
2426 	    relocation = (htab->elf.splt->output_section->vma
2427 			  + htab->elf.splt->output_offset
2428 			  + h->plt.offset
2429 			  - s390_got_pointer (info));
2430 	  unresolved_reloc = false;
2431 	  break;
2432 
2433 	case R_390_PC16:
2434 	case R_390_PC12DBL:
2435 	case R_390_PC16DBL:
2436 	case R_390_PC24DBL:
2437 	case R_390_PC32:
2438 	case R_390_PC32DBL:
2439 	case R_390_PC64:
2440 	  if (h != NULL
2441 	      && bfd_link_pie (info)
2442 	      && !h->def_regular)
2443 	    {
2444 	      _bfd_error_handler (_("%pB: `%s' non-PLT reloc for symbol defined "
2445 				    "in shared library and accessed "
2446 				    "from executable "
2447 				    "(rebuild file with -fPIC ?)"),
2448 				  input_bfd, h->root.root.string);
2449 	      bfd_set_error (bfd_error_bad_value);
2450 	      return false;
2451 	    }
2452 	  /* The target of these relocs are instruction operands
2453 	     residing in read-only sections.  We cannot emit a runtime
2454 	     reloc for it.  */
2455 	  if (h != NULL
2456 	      && s390_is_ifunc_symbol_p (h)
2457 	      && h->def_regular
2458 	      && bfd_link_pic (info))
2459 	    {
2460 	      relocation = (htab->elf.iplt->output_section->vma
2461 			    + htab->elf.iplt->output_offset
2462 			    + h->plt.offset);
2463 	      goto do_relocation;
2464 	    }
2465 	  /* Fall through.  */
2466 
2467 	case R_390_8:
2468 	case R_390_16:
2469 	case R_390_32:
2470 	case R_390_64:
2471 
2472 	  if ((input_section->flags & SEC_ALLOC) == 0)
2473 	    break;
2474 
2475 	  if (h != NULL
2476 	      && s390_is_ifunc_symbol_p (h)
2477 	      && h->def_regular)
2478 	    {
2479 	      if (!bfd_link_pic (info))
2480 		{
2481 		  /* For a non-shared object the symbol will not
2482 		     change.  Hence we can write the address of the
2483 		     target IPLT slot now.  */
2484 		  relocation = (htab->elf.iplt->output_section->vma
2485 				+ htab->elf.iplt->output_offset
2486 				+ h ->plt.offset);
2487 		  goto do_relocation;
2488 		}
2489 	      else
2490 		{
2491 		  /* For shared objects a runtime relocation is needed.  */
2492 
2493 		  Elf_Internal_Rela outrel;
2494 		  asection *sreloc;
2495 
2496 		  /* Need a dynamic relocation to get the real function
2497 		     address.  */
2498 		  outrel.r_offset = _bfd_elf_section_offset (output_bfd,
2499 							     info,
2500 							     input_section,
2501 							     rel->r_offset);
2502 		  if (outrel.r_offset == (bfd_vma) -1
2503 		      || outrel.r_offset == (bfd_vma) -2)
2504 		    abort ();
2505 
2506 		  outrel.r_offset += (input_section->output_section->vma
2507 				      + input_section->output_offset);
2508 
2509 		  if (h->dynindx == -1
2510 		      || h->forced_local
2511 		      || bfd_link_executable (info))
2512 		    {
2513 		      /* This symbol is resolved locally.  */
2514 		      outrel.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
2515 		      outrel.r_addend = (h->root.u.def.value
2516 					 + h->root.u.def.section->output_section->vma
2517 					 + h->root.u.def.section->output_offset);
2518 		    }
2519 		  else
2520 		    {
2521 		      outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2522 		      outrel.r_addend = 0;
2523 		    }
2524 
2525 		  sreloc = htab->elf.irelifunc;
2526 		  elf_append_rela (output_bfd, sreloc, &outrel);
2527 
2528 		  /* If this reloc is against an external symbol, we
2529 		     do not want to fiddle with the addend.  Otherwise,
2530 		     we need to include the symbol value so that it
2531 		     becomes an addend for the dynamic reloc.  For an
2532 		     internal symbol, we have updated addend.  */
2533 		  continue;
2534 		}
2535 	    }
2536 
2537 	  if ((bfd_link_pic (info)
2538 	       && (h == NULL
2539 		   || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2540 		       && !resolved_to_zero)
2541 		   || h->root.type != bfd_link_hash_undefweak)
2542 	       && ((r_type != R_390_PC16
2543 		    && r_type != R_390_PC12DBL
2544 		    && r_type != R_390_PC16DBL
2545 		    && r_type != R_390_PC24DBL
2546 		    && r_type != R_390_PC32
2547 		    && r_type != R_390_PC32DBL
2548 		    && r_type != R_390_PC64)
2549 		   || !SYMBOL_CALLS_LOCAL (info, h)))
2550 	      || (ELIMINATE_COPY_RELOCS
2551 		  && !bfd_link_pic (info)
2552 		  && h != NULL
2553 		  && h->dynindx != -1
2554 		  && !h->non_got_ref
2555 		  && ((h->def_dynamic
2556 		       && !h->def_regular)
2557 		      || h->root.type == bfd_link_hash_undefweak
2558 		      || h->root.type == bfd_link_hash_undefined)))
2559 	    {
2560 	      Elf_Internal_Rela outrel;
2561 	      bool skip, relocate;
2562 	      asection *sreloc;
2563 	      bfd_byte *loc;
2564 
2565 	      /* When generating a shared object, these relocations
2566 		 are copied into the output file to be resolved at run
2567 		 time.  */
2568 	      skip = false;
2569 	      relocate = false;
2570 
2571 	      outrel.r_offset =
2572 		_bfd_elf_section_offset (output_bfd, info, input_section,
2573 					 rel->r_offset);
2574 	      if (outrel.r_offset == (bfd_vma) -1)
2575 		skip = true;
2576 	      else if (outrel.r_offset == (bfd_vma) -2)
2577 		skip = true, relocate = true;
2578 
2579 	      outrel.r_offset += (input_section->output_section->vma
2580 				  + input_section->output_offset);
2581 
2582 	      if (skip)
2583 		memset (&outrel, 0, sizeof outrel);
2584 	      else if (h != NULL
2585 		       && h->dynindx != -1
2586 		       && (r_type == R_390_PC16
2587 			   || r_type == R_390_PC12DBL
2588 			   || r_type == R_390_PC16DBL
2589 			   || r_type == R_390_PC24DBL
2590 			   || r_type == R_390_PC32
2591 			   || r_type == R_390_PC32DBL
2592 			   || r_type == R_390_PC64
2593 			   || !bfd_link_pic (info)
2594 			   || !SYMBOLIC_BIND (info, h)
2595 			   || !h->def_regular))
2596 		{
2597 		  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
2598 		  outrel.r_addend = rel->r_addend;
2599 		}
2600 	      else
2601 		{
2602 		  /* This symbol is local, or marked to become local.  */
2603 		  outrel.r_addend = relocation + rel->r_addend;
2604 		  if (r_type == R_390_64)
2605 		    {
2606 		      relocate = true;
2607 		      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2608 		    }
2609 		  else
2610 		    {
2611 		      long sindx;
2612 
2613 		      if (bfd_is_abs_section (sec))
2614 			sindx = 0;
2615 		      else if (sec == NULL || sec->owner == NULL)
2616 			{
2617 			  bfd_set_error(bfd_error_bad_value);
2618 			  return false;
2619 			}
2620 		      else
2621 			{
2622 			  asection *osec;
2623 
2624 			  osec = sec->output_section;
2625 			  sindx = elf_section_data (osec)->dynindx;
2626 
2627 			  if (sindx == 0)
2628 			    {
2629 			      osec = htab->elf.text_index_section;
2630 			      sindx = elf_section_data (osec)->dynindx;
2631 			    }
2632 			  BFD_ASSERT (sindx != 0);
2633 
2634 			  /* We are turning this relocation into one
2635 			     against a section symbol, so subtract out
2636 			     the output section's address but not the
2637 			     offset of the input section in the output
2638 			     section.  */
2639 			  outrel.r_addend -= osec->vma;
2640 			}
2641 		      outrel.r_info = ELF64_R_INFO (sindx, r_type);
2642 		    }
2643 		}
2644 
2645 	      sreloc = elf_section_data (input_section)->sreloc;
2646 	      if (sreloc == NULL)
2647 		abort ();
2648 
2649 	      loc = sreloc->contents;
2650 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2651 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2652 
2653 	      /* If this reloc is against an external symbol, we do
2654 		 not want to fiddle with the addend.  Otherwise, we
2655 		 need to include the symbol value so that it becomes
2656 		 an addend for the dynamic reloc.  */
2657 	      if (! relocate)
2658 		continue;
2659 	    }
2660 
2661 	  break;
2662 
2663 	  /* Relocations for tls literal pool entries.  */
2664 	case R_390_TLS_IE64:
2665 	  if (bfd_link_pic (info))
2666 	    {
2667 	      Elf_Internal_Rela outrel;
2668 	      asection *sreloc;
2669 	      bfd_byte *loc;
2670 
2671 	      outrel.r_offset = rel->r_offset
2672 				+ input_section->output_section->vma
2673 				+ input_section->output_offset;
2674 	      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2675 	      sreloc = elf_section_data (input_section)->sreloc;
2676 	      if (sreloc == NULL)
2677 		abort ();
2678 	      loc = sreloc->contents;
2679 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2680 	      bfd_elf64_swap_reloc_out (output_bfd, &outrel, loc);
2681 	    }
2682 	  /* Fall through.  */
2683 
2684 	case R_390_TLS_GD64:
2685 	case R_390_TLS_GOTIE64:
2686 	  r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2687 	  tls_type = GOT_UNKNOWN;
2688 	  if (h == NULL && local_got_offsets)
2689 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2690 	  else if (h != NULL)
2691 	    {
2692 	      tls_type = elf_s390_hash_entry(h)->tls_type;
2693 	      if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
2694 		r_type = R_390_TLS_LE64;
2695 	    }
2696 	  if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
2697 	    r_type = R_390_TLS_IE64;
2698 
2699 	  if (r_type == R_390_TLS_LE64)
2700 	    {
2701 	      /* This relocation gets optimized away by the local exec
2702 		 access optimization.  */
2703 	      BFD_ASSERT (! unresolved_reloc);
2704 	      bfd_put_64 (output_bfd, -tpoff (info, relocation),
2705 			  contents + rel->r_offset);
2706 	      continue;
2707 	    }
2708 
2709 	  if (htab->elf.sgot == NULL)
2710 	    abort ();
2711 
2712 	  if (h != NULL)
2713 	    off = h->got.offset;
2714 	  else
2715 	    {
2716 	      if (local_got_offsets == NULL)
2717 		abort ();
2718 
2719 	      off = local_got_offsets[r_symndx];
2720 	    }
2721 
2722 	emit_tls_relocs:
2723 
2724 	  if ((off & 1) != 0)
2725 	    off &= ~1;
2726 	  else
2727 	    {
2728 	      Elf_Internal_Rela outrel;
2729 	      bfd_byte *loc;
2730 	      int dr_type, indx;
2731 
2732 	      if (htab->elf.srelgot == NULL)
2733 		abort ();
2734 
2735 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
2736 				 + htab->elf.sgot->output_offset + off);
2737 
2738 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
2739 	      if (r_type == R_390_TLS_GD64)
2740 		dr_type = R_390_TLS_DTPMOD;
2741 	      else
2742 		dr_type = R_390_TLS_TPOFF;
2743 	      if (dr_type == R_390_TLS_TPOFF && indx == 0)
2744 		outrel.r_addend = relocation - dtpoff_base (info);
2745 	      else
2746 		outrel.r_addend = 0;
2747 	      outrel.r_info = ELF64_R_INFO (indx, dr_type);
2748 	      loc = htab->elf.srelgot->contents;
2749 	      loc += htab->elf.srelgot->reloc_count++
2750 		* sizeof (Elf64_External_Rela);
2751 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2752 
2753 	      if (r_type == R_390_TLS_GD64)
2754 		{
2755 		  if (indx == 0)
2756 		    {
2757 		      BFD_ASSERT (! unresolved_reloc);
2758 		      bfd_put_64 (output_bfd,
2759 				  relocation - dtpoff_base (info),
2760 				  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
2761 		    }
2762 		  else
2763 		    {
2764 		      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_DTPOFF);
2765 		      outrel.r_offset += GOT_ENTRY_SIZE;
2766 		      outrel.r_addend = 0;
2767 		      htab->elf.srelgot->reloc_count++;
2768 		      loc += sizeof (Elf64_External_Rela);
2769 		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2770 		    }
2771 		}
2772 
2773 	      if (h != NULL)
2774 		h->got.offset |= 1;
2775 	      else
2776 		local_got_offsets[r_symndx] |= 1;
2777 	    }
2778 
2779 	  if (off >= (bfd_vma) -2)
2780 	    abort ();
2781 	  if (r_type == ELF64_R_TYPE (rel->r_info))
2782 	    {
2783 	      relocation = htab->elf.sgot->output_offset + off;
2784 	      if (r_type == R_390_TLS_IE64 || r_type == R_390_TLS_IEENT)
2785 		relocation += htab->elf.sgot->output_section->vma;
2786 	      unresolved_reloc = false;
2787 	    }
2788 	  else
2789 	    {
2790 	      bfd_put_64 (output_bfd, htab->elf.sgot->output_offset + off,
2791 			  contents + rel->r_offset);
2792 	      continue;
2793 	    }
2794 	  break;
2795 
2796 	case R_390_TLS_GOTIE12:
2797 	case R_390_TLS_GOTIE20:
2798 	case R_390_TLS_IEENT:
2799 	  if (h == NULL)
2800 	    {
2801 	      if (local_got_offsets == NULL)
2802 		abort();
2803 	      off = local_got_offsets[r_symndx];
2804 	      if (bfd_link_pic (info))
2805 		goto emit_tls_relocs;
2806 	    }
2807 	  else
2808 	    {
2809 	      off = h->got.offset;
2810 	      tls_type = elf_s390_hash_entry(h)->tls_type;
2811 	      if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
2812 		goto emit_tls_relocs;
2813 	    }
2814 
2815 	  if (htab->elf.sgot == NULL)
2816 	    abort ();
2817 
2818 	  BFD_ASSERT (! unresolved_reloc);
2819 	  bfd_put_64 (output_bfd, -tpoff (info, relocation),
2820 		      htab->elf.sgot->contents + off);
2821 	  relocation = htab->elf.sgot->output_offset + off;
2822 	  if (r_type == R_390_TLS_IEENT)
2823 	    relocation += htab->elf.sgot->output_section->vma;
2824 	  unresolved_reloc = false;
2825 	  break;
2826 
2827 	case R_390_TLS_LDM64:
2828 	  if (! bfd_link_pic (info))
2829 	    /* The literal pool entry this relocation refers to gets ignored
2830 	       by the optimized code of the local exec model. Do nothing
2831 	       and the value will turn out zero.  */
2832 	    continue;
2833 
2834 	  if (htab->elf.sgot == NULL)
2835 	    abort ();
2836 
2837 	  off = htab->tls_ldm_got.offset;
2838 	  if (off & 1)
2839 	    off &= ~1;
2840 	  else
2841 	    {
2842 	      Elf_Internal_Rela outrel;
2843 	      bfd_byte *loc;
2844 
2845 	      if (htab->elf.srelgot == NULL)
2846 		abort ();
2847 
2848 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
2849 				 + htab->elf.sgot->output_offset + off);
2850 
2851 	      bfd_put_64 (output_bfd, 0,
2852 			  htab->elf.sgot->contents + off + GOT_ENTRY_SIZE);
2853 	      outrel.r_info = ELF64_R_INFO (0, R_390_TLS_DTPMOD);
2854 	      outrel.r_addend = 0;
2855 	      loc = htab->elf.srelgot->contents;
2856 	      loc += htab->elf.srelgot->reloc_count++
2857 		* sizeof (Elf64_External_Rela);
2858 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2859 	      htab->tls_ldm_got.offset |= 1;
2860 	    }
2861 	  relocation = htab->elf.sgot->output_offset + off;
2862 	  unresolved_reloc = false;
2863 	  break;
2864 
2865 	case R_390_TLS_LE64:
2866 	  if (bfd_link_dll (info))
2867 	    {
2868 	      /* Linking a shared library with non-fpic code requires
2869 		 a R_390_TLS_TPOFF relocation.  */
2870 	      Elf_Internal_Rela outrel;
2871 	      asection *sreloc;
2872 	      bfd_byte *loc;
2873 	      int indx;
2874 
2875 	      outrel.r_offset = rel->r_offset
2876 				+ input_section->output_section->vma
2877 				+ input_section->output_offset;
2878 	      if (h != NULL && h->dynindx != -1)
2879 		indx = h->dynindx;
2880 	      else
2881 		indx = 0;
2882 	      outrel.r_info = ELF64_R_INFO (indx, R_390_TLS_TPOFF);
2883 	      if (indx == 0)
2884 		outrel.r_addend = relocation - dtpoff_base (info);
2885 	      else
2886 		outrel.r_addend = 0;
2887 	      sreloc = elf_section_data (input_section)->sreloc;
2888 	      if (sreloc == NULL)
2889 		abort ();
2890 	      loc = sreloc->contents;
2891 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2892 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2893 	    }
2894 	  else
2895 	    {
2896 	      BFD_ASSERT (! unresolved_reloc);
2897 	      bfd_put_64 (output_bfd, -tpoff (info, relocation),
2898 			  contents + rel->r_offset);
2899 	    }
2900 	  continue;
2901 
2902 	case R_390_TLS_LDO64:
2903 	  if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING))
2904 	    relocation -= dtpoff_base (info);
2905 	  else
2906 	    /* When converting LDO to LE, we must negate.  */
2907 	    relocation = -tpoff (info, relocation);
2908 	  break;
2909 
2910 	  /* Relocations for tls instructions.  */
2911 	case R_390_TLS_LOAD:
2912 	case R_390_TLS_GDCALL:
2913 	case R_390_TLS_LDCALL:
2914 	  tls_type = GOT_UNKNOWN;
2915 	  if (h == NULL && local_got_offsets)
2916 	    tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2917 	  else if (h != NULL)
2918 	    tls_type = elf_s390_hash_entry(h)->tls_type;
2919 
2920 	  if (tls_type == GOT_TLS_GD)
2921 	    continue;
2922 
2923 	  if (r_type == R_390_TLS_LOAD)
2924 	    {
2925 	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
2926 		{
2927 		  /* IE->LE transition. Four valid cases:
2928 		     lg %rx,(0,%ry)    -> sllg %rx,%ry,0
2929 		     lg %rx,(%ry,0)    -> sllg %rx,%ry,0
2930 		     lg %rx,(%ry,%r12) -> sllg %rx,%ry,0
2931 		     lg %rx,(%r12,%ry) -> sllg %rx,%ry,0  */
2932 		  unsigned int insn0, insn1, ry;
2933 
2934 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2935 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2936 		  if (insn1 != 0x0004)
2937 		    {
2938 		      invalid_tls_insn (input_bfd, input_section, rel);
2939 		      return false;
2940 		    }
2941 		  if ((insn0 & 0xff00f000) == 0xe3000000)
2942 		    /* lg %rx,0(%ry,0) -> sllg %rx,%ry,0  */
2943 		    ry = (insn0 & 0x000f0000);
2944 		  else if ((insn0 & 0xff0f0000) == 0xe3000000)
2945 		    /* lg %rx,0(0,%ry) -> sllg %rx,%ry,0  */
2946 		    ry = (insn0 & 0x0000f000) << 4;
2947 		  else if ((insn0 & 0xff00f000) == 0xe300c000)
2948 		    /* lg %rx,0(%ry,%r12) -> sllg %rx,%ry,0  */
2949 		    ry = (insn0 & 0x000f0000);
2950 		  else if ((insn0 & 0xff0f0000) == 0xe30c0000)
2951 		    /* lg %rx,0(%r12,%ry) -> sllg %rx,%ry,0  */
2952 		    ry = (insn0 & 0x0000f000) << 4;
2953 		  else
2954 		    {
2955 		      invalid_tls_insn (input_bfd, input_section, rel);
2956 		      return false;
2957 		    }
2958 		  insn0 = 0xeb000000 | (insn0 & 0x00f00000) | ry;
2959 		  insn1 = 0x000d;
2960 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2961 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2962 		}
2963 	    }
2964 	  else if (r_type == R_390_TLS_GDCALL)
2965 	    {
2966 	      unsigned int insn0, insn1;
2967 
2968 	      insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2969 	      insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
2970 	      if ((insn0 & 0xffff0000) != 0xc0e50000)
2971 		{
2972 		  invalid_tls_insn (input_bfd, input_section, rel);
2973 		  return false;
2974 		}
2975 	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
2976 		{
2977 		  /* GD->LE transition.
2978 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
2979 		  insn0 = 0xc0040000;
2980 		  insn1 = 0x0000;
2981 		}
2982 	      else
2983 		{
2984 		  /* GD->IE transition.
2985 		     brasl %r14,__tls_get_addr@plt -> lg %r2,0(%r2,%r12)  */
2986 		  insn0 = 0xe322c000;
2987 		  insn1 = 0x0004;
2988 		}
2989 	      bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
2990 	      bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
2991 	    }
2992 	  else if (r_type == R_390_TLS_LDCALL)
2993 	    {
2994 	      if (!bfd_link_pic (info))
2995 		{
2996 		  unsigned int insn0, insn1;
2997 
2998 		  insn0 = bfd_get_32 (input_bfd, contents + rel->r_offset);
2999 		  insn1 = bfd_get_16 (input_bfd, contents + rel->r_offset + 4);
3000 		  if ((insn0 & 0xffff0000) != 0xc0e50000)
3001 		    {
3002 		      invalid_tls_insn (input_bfd, input_section, rel);
3003 		      return false;
3004 		    }
3005 		  /* LD->LE transition.
3006 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
3007 		  insn0 = 0xc0040000;
3008 		  insn1 = 0x0000;
3009 		  bfd_put_32 (output_bfd, insn0, contents + rel->r_offset);
3010 		  bfd_put_16 (output_bfd, insn1, contents + rel->r_offset + 4);
3011 		}
3012 	    }
3013 	  continue;
3014 
3015 	default:
3016 	  break;
3017 	}
3018 
3019       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3020 	 because such sections are not SEC_ALLOC and thus ld.so will
3021 	 not process them.  */
3022       if (unresolved_reloc
3023 	  && !((input_section->flags & SEC_DEBUGGING) != 0
3024 	       && h->def_dynamic)
3025 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
3026 				      rel->r_offset) != (bfd_vma) -1)
3027 	_bfd_error_handler
3028 	  /* xgettext:c-format */
3029 	  (_("%pB(%pA+%#" PRIx64 "): "
3030 	     "unresolvable %s relocation against symbol `%s'"),
3031 	   input_bfd,
3032 	   input_section,
3033 	   (uint64_t) rel->r_offset,
3034 	   howto->name,
3035 	   h->root.root.string);
3036 
3037     do_relocation:
3038 
3039       /* When applying a 24 bit reloc we need to start one byte
3040 	 earlier.  Otherwise the 32 bit get/put bfd operations might
3041 	 access a byte after the actual section.  */
3042       if (r_type == R_390_PC24DBL
3043 	  || r_type == R_390_PLT24DBL)
3044 	rel->r_offset--;
3045 
3046       if (r_type == R_390_20
3047 	  || r_type == R_390_GOT20
3048 	  || r_type == R_390_GOTPLT20
3049 	  || r_type == R_390_TLS_GOTIE20)
3050 	{
3051 	  relocation += rel->r_addend;
3052 	  relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
3053 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3054 					contents, rel->r_offset,
3055 					relocation, 0);
3056 	}
3057       else
3058 	r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3059 				      contents, rel->r_offset,
3060 				      relocation, rel->r_addend);
3061 
3062       if (r != bfd_reloc_ok)
3063 	{
3064 	  const char *name;
3065 
3066 	  if (h != NULL)
3067 	    name = h->root.root.string;
3068 	  else
3069 	    {
3070 	      name = bfd_elf_string_from_elf_section (input_bfd,
3071 						      symtab_hdr->sh_link,
3072 						      sym->st_name);
3073 	      if (name == NULL)
3074 		return false;
3075 	      if (*name == '\0')
3076 		name = bfd_section_name (sec);
3077 	    }
3078 
3079 	  if (r == bfd_reloc_overflow)
3080 	    (*info->callbacks->reloc_overflow)
3081 	      (info, (h ? &h->root : NULL), name, howto->name,
3082 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3083 	  else
3084 	    {
3085 	      _bfd_error_handler
3086 		/* xgettext:c-format */
3087 		(_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
3088 		 input_bfd, input_section,
3089 		 (uint64_t) rel->r_offset, name, (int) r);
3090 	      return false;
3091 	    }
3092 	}
3093     }
3094 
3095   return true;
3096 }
3097 
3098 /* Generate the PLT slots together with the dynamic relocations needed
3099    for IFUNC symbols.  */
3100 
3101 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)3102 elf_s390_finish_ifunc_symbol (bfd *output_bfd,
3103 			      struct bfd_link_info *info,
3104 			      struct elf_link_hash_entry *h,
3105 			      struct elf_s390_link_hash_table *htab,
3106 			      bfd_vma plt_offset,
3107 			      bfd_vma resolver_address)
3108 {
3109   bfd_vma plt_index;
3110   bfd_vma got_offset;
3111   Elf_Internal_Rela rela;
3112   bfd_byte *loc;
3113   asection *plt, *gotplt, *relplt;
3114 
3115   if (htab->elf.iplt == NULL
3116       || htab->elf.igotplt == NULL
3117       || htab->elf.irelplt == NULL)
3118     abort ();
3119 
3120   /* Index of the PLT slot within iplt section.  */
3121   plt_index = plt_offset / PLT_ENTRY_SIZE;
3122   plt = htab->elf.iplt;
3123   /* Offset into the igot.plt section.  */
3124   got_offset = plt_index * GOT_ENTRY_SIZE;
3125   gotplt = htab->elf.igotplt;
3126   relplt = htab->elf.irelplt;
3127 
3128   /* Fill in the blueprint of a PLT.  */
3129   memcpy (plt->contents + plt_offset, elf_s390x_plt_entry,
3130 	  PLT_ENTRY_SIZE);
3131 
3132   /* Fixup the relative address to the GOT entry */
3133   bfd_put_32 (output_bfd,
3134 	      (gotplt->output_section->vma +
3135 	       gotplt->output_offset + got_offset
3136 	       - (plt->output_section->vma +
3137 		  plt->output_offset +
3138 		  plt_offset))/2,
3139 	      plt->contents + plt_offset + 2);
3140   /* Fixup the relative branch to PLT 0 */
3141   bfd_put_32 (output_bfd, - (plt->output_offset +
3142 			     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3143 	      plt->contents + plt_offset + 24);
3144   /* Fixup offset into .rela.plt section.  */
3145   bfd_put_32 (output_bfd, relplt->output_offset +
3146 	      plt_index * sizeof (Elf64_External_Rela),
3147 	      plt->contents + plt_offset + 28);
3148 
3149   /* Fill in the entry in the global offset table.
3150      Points to instruction after GOT offset.  */
3151   bfd_put_64 (output_bfd,
3152 	      (plt->output_section->vma
3153 	       + plt->output_offset
3154 	       + plt_offset
3155 	       + 14),
3156 	      gotplt->contents + got_offset);
3157 
3158   /* Fill in the entry in the .rela.plt section.  */
3159   rela.r_offset = (gotplt->output_section->vma
3160 		   + gotplt->output_offset
3161 		   + got_offset);
3162 
3163   if (!h
3164       || h->dynindx == -1
3165       || ((bfd_link_executable (info)
3166 	   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3167 	  && h->def_regular))
3168     {
3169       /* The symbol can be locally resolved.  */
3170       rela.r_info = ELF64_R_INFO (0, R_390_IRELATIVE);
3171       rela.r_addend = resolver_address;
3172     }
3173   else
3174     {
3175       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3176       rela.r_addend = 0;
3177     }
3178 
3179   loc = relplt->contents + plt_index * sizeof (Elf64_External_Rela);
3180   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3181 }
3182 
3183 
3184 /* Finish up dynamic symbol handling.  We set the contents of various
3185    dynamic sections here.  */
3186 
3187 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)3188 elf_s390_finish_dynamic_symbol (bfd *output_bfd,
3189 				struct bfd_link_info *info,
3190 				struct elf_link_hash_entry *h,
3191 				Elf_Internal_Sym *sym)
3192 {
3193   struct elf_s390_link_hash_table *htab;
3194   struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
3195 
3196   htab = elf_s390_hash_table (info);
3197   if (htab == NULL)
3198     return false;
3199 
3200   if (h->plt.offset != (bfd_vma) -1)
3201     {
3202       bfd_vma plt_index;
3203       bfd_vma gotplt_offset;
3204       Elf_Internal_Rela rela;
3205       bfd_byte *loc;
3206 
3207       /* This symbol has an entry in the procedure linkage table.  Set
3208 	 it up.  */
3209       if (s390_is_ifunc_symbol_p (h) && h->def_regular)
3210 	{
3211 	  elf_s390_finish_ifunc_symbol (output_bfd, info, h,
3212 	    htab, h->plt.offset,
3213 	    eh->ifunc_resolver_address +
3214 	    eh->ifunc_resolver_section->output_offset +
3215 	    eh->ifunc_resolver_section->output_section->vma);
3216 
3217 	  /* Do not return yet.  Handling of explicit GOT slots of
3218 	     IFUNC symbols is below.  */
3219 	}
3220       else
3221 	{
3222 	  if (h->dynindx == -1
3223 	      || htab->elf.splt == NULL
3224 	      || htab->elf.sgotplt == NULL
3225 	      || htab->elf.srelplt == NULL)
3226 	    abort ();
3227 
3228 	  /* Calc. index no.
3229 	     Current offset - size first entry / entry size.  */
3230 	  plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3231 
3232 	  /* The slots in the .got.plt correspond to the PLT slots in
3233 	     the same order.  */
3234 	  gotplt_offset = plt_index * GOT_ENTRY_SIZE;
3235 
3236 	  /* If .got.plt comes first it needs to contain the 3 header
3237 	     entries.  */
3238 	  if (!s390_gotplt_after_got_p (info))
3239 	    gotplt_offset += 3 * GOT_ENTRY_SIZE;
3240 
3241 	  /* Fill in the blueprint of a PLT.  */
3242 	  memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
3243 		  PLT_ENTRY_SIZE);
3244 
3245 	  /* The first instruction in the PLT entry is a LARL loading
3246 	     the address of the GOT slot.  We write the 4 byte
3247 	     immediate operand of the LARL instruction here.  */
3248 	  bfd_put_32 (output_bfd,
3249 		      (htab->elf.sgotplt->output_section->vma +
3250 		       htab->elf.sgotplt->output_offset + gotplt_offset
3251 		       - (htab->elf.splt->output_section->vma +
3252 			  htab->elf.splt->output_offset +
3253 			  h->plt.offset))/2,
3254 		      htab->elf.splt->contents + h->plt.offset + 2);
3255 	  /* Fixup the relative branch to PLT 0 */
3256 	  bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
3257 				     (PLT_ENTRY_SIZE * plt_index) + 22)/2,
3258 		      htab->elf.splt->contents + h->plt.offset + 24);
3259 	  /* Fixup offset into .rela.plt section.  */
3260 	  bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
3261 		      htab->elf.splt->contents + h->plt.offset + 28);
3262 
3263 	  /* Fill in the entry in the global offset table.
3264 	     Points to instruction after GOT offset.  */
3265 	  bfd_put_64 (output_bfd,
3266 		      (htab->elf.splt->output_section->vma
3267 		       + htab->elf.splt->output_offset
3268 		       + h->plt.offset
3269 		       + 14),
3270 		      htab->elf.sgotplt->contents + gotplt_offset);
3271 
3272 	  /* Fill in the entry in the .rela.plt section.  */
3273 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
3274 			   + htab->elf.sgotplt->output_offset
3275 			   + gotplt_offset);
3276 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
3277 	  rela.r_addend = 0;
3278 	  loc = htab->elf.srelplt->contents + plt_index *
3279 	    sizeof (Elf64_External_Rela);
3280 	  bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3281 
3282 	  if (!h->def_regular)
3283 	    {
3284 	      /* Mark the symbol as undefined, rather than as defined in
3285 		 the .plt section.  Leave the value alone.  This is a clue
3286 		 for the dynamic linker, to make function pointer
3287 		 comparisons work between an application and shared
3288 		 library.  */
3289 	      sym->st_shndx = SHN_UNDEF;
3290 	    }
3291 	}
3292     }
3293 
3294   if (h->got.offset != (bfd_vma) -1
3295       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3296       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3297       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
3298     {
3299       Elf_Internal_Rela rela;
3300       bfd_byte *loc;
3301 
3302       /* This symbol has an entry in the global offset table.  Set it
3303 	 up.  */
3304       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
3305 	abort ();
3306 
3307       rela.r_offset = (htab->elf.sgot->output_section->vma
3308 		       + htab->elf.sgot->output_offset
3309 		       + (h->got.offset &~ (bfd_vma) 1));
3310 
3311       if (h->def_regular && s390_is_ifunc_symbol_p (h))
3312 	{
3313 	  if (bfd_link_pic (info))
3314 	    {
3315 	      /* An explicit GOT slot usage needs GLOB_DAT.  If the
3316 		 symbol references local the implicit got.iplt slot
3317 		 will be used and the IRELATIVE reloc has been created
3318 		 above.  */
3319 	      goto do_glob_dat;
3320 	    }
3321 	  else
3322 	    {
3323 	      /* For non-shared objects explicit GOT slots must be
3324 		 filled with the PLT slot address for pointer
3325 		 equality reasons.  */
3326 	      bfd_put_64 (output_bfd, (htab->elf.iplt->output_section->vma
3327 				       + htab->elf.iplt->output_offset
3328 				       + h->plt.offset),
3329 			  htab->elf.sgot->contents + h->got.offset);
3330 	      return true;
3331 	    }
3332 	}
3333       else if (bfd_link_pic (info)
3334 	       && SYMBOL_REFERENCES_LOCAL (info, h))
3335 	{
3336 	  if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
3337 	    return true;
3338 
3339 	  /* If this is a static link, or it is a -Bsymbolic link and
3340 	     the symbol is defined locally or was forced to be local
3341 	     because of a version file, we just want to emit a
3342 	     RELATIVE reloc.  The entry in the global offset table
3343 	     will already have been initialized in the
3344 	     relocate_section function.  */
3345 	  if (!(h->def_regular || ELF_COMMON_DEF_P (h)))
3346 	    return false;
3347 	  BFD_ASSERT((h->got.offset & 1) != 0);
3348 	  rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
3349 	  rela.r_addend = (h->root.u.def.value
3350 			   + h->root.u.def.section->output_section->vma
3351 			   + h->root.u.def.section->output_offset);
3352 	}
3353       else
3354 	{
3355 	  BFD_ASSERT((h->got.offset & 1) == 0);
3356 	do_glob_dat:
3357 	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgot->contents + h->got.offset);
3358 	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
3359 	  rela.r_addend = 0;
3360 	}
3361 
3362       loc = htab->elf.srelgot->contents;
3363       loc += htab->elf.srelgot->reloc_count++ * sizeof (Elf64_External_Rela);
3364       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3365     }
3366 
3367   if (h->needs_copy)
3368     {
3369       Elf_Internal_Rela rela;
3370       asection *s;
3371       bfd_byte *loc;
3372 
3373       /* This symbols needs a copy reloc.  Set it up.  */
3374 
3375       if (h->dynindx == -1
3376 	  || (h->root.type != bfd_link_hash_defined
3377 	      && h->root.type != bfd_link_hash_defweak)
3378 	  || htab->elf.srelbss == NULL)
3379 	abort ();
3380 
3381       rela.r_offset = (h->root.u.def.value
3382 		       + h->root.u.def.section->output_section->vma
3383 		       + h->root.u.def.section->output_offset);
3384       rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
3385       rela.r_addend = 0;
3386       if (h->root.u.def.section == htab->elf.sdynrelro)
3387 	s = htab->elf.sreldynrelro;
3388       else
3389 	s = htab->elf.srelbss;
3390       loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
3391       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3392     }
3393 
3394   /* Mark some specially defined symbols as absolute.  */
3395   if (h == htab->elf.hdynamic
3396       || h == htab->elf.hgot
3397       || h == htab->elf.hplt)
3398     sym->st_shndx = SHN_ABS;
3399 
3400   return true;
3401 }
3402 
3403 /* Used to decide how to sort relocs in an optimal manner for the
3404    dynamic linker, before writing them out.  */
3405 
3406 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)3407 elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3408 			   const asection *rel_sec ATTRIBUTE_UNUSED,
3409 			   const Elf_Internal_Rela *rela)
3410 {
3411   bfd *abfd = info->output_bfd;
3412   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3413   struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
3414   unsigned long r_symndx = ELF64_R_SYM (rela->r_info);
3415   Elf_Internal_Sym sym;
3416 
3417   if (htab->elf.dynsym == NULL
3418       || !bed->s->swap_symbol_in (abfd,
3419 				  (htab->elf.dynsym->contents
3420 				   + r_symndx * bed->s->sizeof_sym),
3421 				  0, &sym))
3422     abort ();
3423 
3424   /* Check relocation against STT_GNU_IFUNC symbol.  */
3425   if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
3426     return reloc_class_ifunc;
3427 
3428   switch ((int) ELF64_R_TYPE (rela->r_info))
3429     {
3430     case R_390_RELATIVE:
3431       return reloc_class_relative;
3432     case R_390_JMP_SLOT:
3433       return reloc_class_plt;
3434     case R_390_COPY:
3435       return reloc_class_copy;
3436     default:
3437       return reloc_class_normal;
3438     }
3439 }
3440 
3441 /* Finish up the dynamic sections.  */
3442 
3443 static bool
elf_s390_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)3444 elf_s390_finish_dynamic_sections (bfd *output_bfd,
3445 				  struct bfd_link_info *info)
3446 {
3447   struct elf_s390_link_hash_table *htab;
3448   bfd *dynobj;
3449   asection *sdyn;
3450   bfd *ibfd;
3451   unsigned int i;
3452 
3453   htab = elf_s390_hash_table (info);
3454   if (htab == NULL)
3455     return false;
3456 
3457   dynobj = htab->elf.dynobj;
3458   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3459 
3460   if (htab->elf.dynamic_sections_created)
3461     {
3462       Elf64_External_Dyn *dyncon, *dynconend;
3463 
3464       if (sdyn == NULL || htab->elf.sgot == NULL)
3465 	abort ();
3466 
3467       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3468       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3469       for (; dyncon < dynconend; dyncon++)
3470 	{
3471 	  Elf_Internal_Dyn dyn;
3472 	  asection *s;
3473 
3474 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3475 
3476 	  switch (dyn.d_tag)
3477 	    {
3478 	    default:
3479 	      continue;
3480 
3481 	    case DT_PLTGOT:
3482 	      /* DT_PLTGOT matches _GLOBAL_OFFSET_TABLE_ */
3483 	      dyn.d_un.d_ptr = s390_got_pointer (info);
3484 	      break;
3485 
3486 	    case DT_JMPREL:
3487 	      s = htab->elf.srelplt;
3488 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3489 	      break;
3490 
3491 	    case DT_PLTRELSZ:
3492 	      dyn.d_un.d_val = htab->elf.srelplt->size;
3493 	      if (htab->elf.irelplt)
3494 		dyn.d_un.d_val += htab->elf.irelplt->size;
3495 	      break;
3496 
3497 	    case DT_RELASZ:
3498 	      /* The procedure linkage table relocs (DT_JMPREL) should
3499 		 not be included in the overall relocs (DT_RELA).
3500 		 Therefore, we override the DT_RELASZ entry here to
3501 		 make it not include the JMPREL relocs.  Since the
3502 		 linker script arranges for .rela.plt to follow all
3503 		 other relocation sections, we don't have to worry
3504 		 about changing the DT_RELA entry.  */
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 
3511 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3512 	}
3513 
3514       /* Fill in the special first entry in the procedure linkage table.  */
3515       if (htab->elf.splt && htab->elf.splt->size > 0)
3516 	{
3517 	  /* fill in blueprint for plt 0 entry */
3518 	  memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
3519 		  PLT_FIRST_ENTRY_SIZE);
3520 	  /* The second instruction in the first PLT entry is a LARL
3521 	     loading the GOT pointer.  Fill in the LARL immediate
3522 	     address.  */
3523 	  bfd_put_32 (output_bfd,
3524 		      (s390_got_pointer (info)
3525 		       - htab->elf.splt->output_section->vma
3526 		       - htab->elf.splt->output_offset - 6)/2,
3527 		      htab->elf.splt->contents + 8);
3528 	}
3529       if (elf_section_data (htab->elf.splt->output_section) != NULL)
3530 	elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
3531 	  = PLT_ENTRY_SIZE;
3532     }
3533 
3534   if (htab->elf.hgot && htab->elf.hgot->root.u.def.section)
3535     {
3536       /* Fill in the first three entries in the global offset table.  */
3537       if (htab->elf.hgot->root.u.def.section->size > 0)
3538 	{
3539 	  bfd_put_64 (output_bfd,
3540 		      (sdyn == NULL ? (bfd_vma) 0
3541 		       : sdyn->output_section->vma + sdyn->output_offset),
3542 		      htab->elf.hgot->root.u.def.section->contents);
3543 	  /* One entry for shared object struct ptr.  */
3544 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
3545 		      htab->elf.hgot->root.u.def.section->contents + 8);
3546 	  /* One entry for _dl_runtime_resolve.  */
3547 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
3548 		      htab->elf.hgot->root.u.def.section->contents + 16);
3549 	}
3550       if (htab->elf.sgot != NULL && htab->elf.sgot->size > 0)
3551 	elf_section_data (htab->elf.sgot->output_section)
3552 	  ->this_hdr.sh_entsize = 8;
3553     }
3554 
3555   /* Finish dynamic symbol for local IFUNC symbols.  */
3556   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3557     {
3558       struct plt_entry *local_plt;
3559       Elf_Internal_Sym *isym;
3560       Elf_Internal_Shdr *symtab_hdr;
3561 
3562       symtab_hdr = &elf_symtab_hdr (ibfd);
3563 
3564       if (!is_s390_elf (ibfd))
3565 	continue;
3566 
3567       local_plt = elf_s390_local_plt (ibfd);
3568       if (local_plt != NULL)
3569 	for (i = 0; i < symtab_hdr->sh_info; i++)
3570 	  {
3571 	    if (local_plt[i].plt.offset != (bfd_vma) -1)
3572 	      {
3573 		asection *sec = local_plt[i].sec;
3574 		isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd, i);
3575 		if (isym == NULL)
3576 		  return false;
3577 
3578 		if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
3579 		  elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab,
3580 						local_plt[i].plt.offset,
3581 						isym->st_value
3582 						+ sec->output_section->vma
3583 						+ sec->output_offset);
3584 
3585 	      }
3586 	  }
3587     }
3588 
3589   return true;
3590 }
3591 
3592 /* Support for core dump NOTE sections.  */
3593 
3594 static bool
elf_s390_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)3595 elf_s390_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3596 {
3597   int offset;
3598   size_t size;
3599 
3600   switch (note->descsz)
3601     {
3602     default:
3603       return false;
3604 
3605     case 336:			/* sizeof(struct elf_prstatus) on s390x */
3606       /* pr_cursig */
3607       elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3608 
3609       /* pr_pid */
3610       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
3611 
3612       /* pr_reg */
3613       offset = 112;
3614       size = 216;
3615       break;
3616     }
3617 
3618   /* Make a ".reg/999" section.  */
3619   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3620 					  size, note->descpos + offset);
3621 }
3622 
3623 static bool
elf_s390_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)3624 elf_s390_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3625 {
3626   switch (note->descsz)
3627     {
3628     default:
3629       return false;
3630 
3631     case 136:			/* sizeof(struct elf_prpsinfo) on s390x */
3632       elf_tdata (abfd)->core->pid
3633 	= bfd_get_32 (abfd, note->descdata + 24);
3634       elf_tdata (abfd)->core->program
3635 	= _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3636       elf_tdata (abfd)->core->command
3637 	= _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3638     }
3639 
3640   /* Note that for some reason, a spurious space is tacked
3641      onto the end of the args in some (at least one anyway)
3642      implementations, so strip it off if it exists.  */
3643 
3644   {
3645     char *command = elf_tdata (abfd)->core->command;
3646     int n = strlen (command);
3647 
3648     if (0 < n && command[n - 1] == ' ')
3649       command[n - 1] = '\0';
3650   }
3651 
3652   return true;
3653 }
3654 
3655 static char *
elf_s390_write_core_note(bfd * abfd,char * buf,int * bufsiz,int note_type,...)3656 elf_s390_write_core_note (bfd *abfd, char *buf, int *bufsiz,
3657 			  int note_type, ...)
3658 {
3659   va_list ap;
3660 
3661   switch (note_type)
3662     {
3663     default:
3664       return NULL;
3665 
3666     case NT_PRPSINFO:
3667       {
3668 	char data[136] ATTRIBUTE_NONSTRING = { 0 };
3669 	const char *fname, *psargs;
3670 
3671 	va_start (ap, note_type);
3672 	fname = va_arg (ap, const char *);
3673 	psargs = va_arg (ap, const char *);
3674 	va_end (ap);
3675 
3676 	strncpy (data + 40, fname, 16);
3677 #if GCC_VERSION == 8000 || GCC_VERSION == 8001
3678 	DIAGNOSTIC_PUSH;
3679 	/* GCC 8.0 and 8.1 warn about 80 equals destination size with
3680 	   -Wstringop-truncation:
3681 	   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
3682 	 */
3683 	DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
3684 #endif
3685 	strncpy (data + 56, psargs, 80);
3686 #if GCC_VERSION == 8000 || GCC_VERSION == 8001
3687 	DIAGNOSTIC_POP;
3688 #endif
3689 	return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
3690 				   &data, sizeof (data));
3691       }
3692 
3693     case NT_PRSTATUS:
3694       {
3695 	char data[336] = { 0 };
3696 	long pid;
3697 	int cursig;
3698 	const void *gregs;
3699 
3700 	va_start (ap, note_type);
3701 	pid = va_arg (ap, long);
3702 	cursig = va_arg (ap, int);
3703 	gregs = va_arg (ap, const void *);
3704 	va_end (ap);
3705 
3706 	bfd_put_16 (abfd, cursig, data + 12);
3707 	bfd_put_32 (abfd, pid, data + 32);
3708 	memcpy (data + 112, gregs, 216);
3709 	return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
3710 				   &data, sizeof (data));
3711       }
3712     }
3713   /* NOTREACHED */
3714 }
3715 
3716 /* Return address for Ith PLT stub in section PLT, for relocation REL
3717    or (bfd_vma) -1 if it should not be included.  */
3718 
3719 static bfd_vma
elf_s390_plt_sym_val(bfd_vma i,const asection * plt,const arelent * rel ATTRIBUTE_UNUSED)3720 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3721 		      const arelent *rel ATTRIBUTE_UNUSED)
3722 {
3723   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3724 }
3725 
3726 /* Merge backend specific data from an object file to the output
3727    object file when linking.  */
3728 
3729 static bool
elf64_s390_merge_private_bfd_data(bfd * ibfd,struct bfd_link_info * info)3730 elf64_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3731 {
3732   if (!is_s390_elf (ibfd) || !is_s390_elf (info->output_bfd))
3733     return true;
3734 
3735   return elf_s390_merge_obj_attributes (ibfd, info);
3736 }
3737 
3738 /* We may add a PT_S390_PGSTE program header.  */
3739 
3740 static int
elf_s390_additional_program_headers(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)3741 elf_s390_additional_program_headers (bfd *abfd ATTRIBUTE_UNUSED,
3742 				     struct bfd_link_info *info)
3743 {
3744   struct elf_s390_link_hash_table *htab;
3745 
3746   if (info)
3747     {
3748       htab = elf_s390_hash_table (info);
3749       if (htab)
3750 	return htab->params->pgste;
3751     }
3752   return 0;
3753 }
3754 
3755 
3756 /* Add the PT_S390_PGSTE program header.  */
3757 
3758 static bool
elf_s390_modify_segment_map(bfd * abfd,struct bfd_link_info * info)3759 elf_s390_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
3760 {
3761   struct elf_s390_link_hash_table *htab;
3762   struct elf_segment_map *m, *pm = NULL;
3763 
3764   if (!abfd || !info)
3765     return true;
3766 
3767   htab = elf_s390_hash_table (info);
3768   if (!htab || !htab->params->pgste)
3769     return true;
3770 
3771   /* If there is already a PT_S390_PGSTE header, avoid adding
3772      another.  */
3773   m = elf_seg_map (abfd);
3774   while (m && m->p_type != PT_S390_PGSTE)
3775     {
3776       pm = m;
3777       m = m->next;
3778     }
3779 
3780   if (m)
3781     return true;
3782 
3783   m = (struct elf_segment_map *)
3784     bfd_zalloc (abfd, sizeof (struct elf_segment_map));
3785   if (m == NULL)
3786     return false;
3787   m->p_type = PT_S390_PGSTE;
3788   m->count = 0;
3789   m->next = NULL;
3790   if (pm)
3791     pm->next = m;
3792 
3793   return true;
3794 }
3795 
3796 bool
bfd_elf_s390_set_options(struct bfd_link_info * info,struct s390_elf_params * params)3797 bfd_elf_s390_set_options (struct bfd_link_info *info,
3798 			  struct s390_elf_params *params)
3799 {
3800   struct elf_s390_link_hash_table *htab;
3801 
3802   if (info)
3803     {
3804       htab = elf_s390_hash_table (info);
3805       if (htab)
3806 	htab->params = params;
3807     }
3808 
3809   return true;
3810 }
3811 
3812 
3813 /* Why was the hash table entry size definition changed from
3814    ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
3815    this is the only reason for the s390_elf64_size_info structure.  */
3816 
3817 const struct elf_size_info s390_elf64_size_info =
3818 {
3819   sizeof (Elf64_External_Ehdr),
3820   sizeof (Elf64_External_Phdr),
3821   sizeof (Elf64_External_Shdr),
3822   sizeof (Elf64_External_Rel),
3823   sizeof (Elf64_External_Rela),
3824   sizeof (Elf64_External_Sym),
3825   sizeof (Elf64_External_Dyn),
3826   sizeof (Elf_External_Note),
3827   8,		/* hash-table entry size.  */
3828   1,		/* internal relocations per external relocations.  */
3829   64,		/* arch_size.  */
3830   3,		/* log_file_align.  */
3831   ELFCLASS64, EV_CURRENT,
3832   bfd_elf64_write_out_phdrs,
3833   bfd_elf64_write_shdrs_and_ehdr,
3834   bfd_elf64_checksum_contents,
3835   bfd_elf64_write_relocs,
3836   bfd_elf64_swap_symbol_in,
3837   bfd_elf64_swap_symbol_out,
3838   bfd_elf64_slurp_reloc_table,
3839   bfd_elf64_slurp_symbol_table,
3840   bfd_elf64_swap_dyn_in,
3841   bfd_elf64_swap_dyn_out,
3842   bfd_elf64_swap_reloc_in,
3843   bfd_elf64_swap_reloc_out,
3844   bfd_elf64_swap_reloca_in,
3845   bfd_elf64_swap_reloca_out
3846 };
3847 
3848 #define TARGET_BIG_SYM	s390_elf64_vec
3849 #define TARGET_BIG_NAME	"elf64-s390"
3850 #define ELF_ARCH	bfd_arch_s390
3851 #define ELF_TARGET_ID	S390_ELF_DATA
3852 #define ELF_MACHINE_CODE EM_S390
3853 #define ELF_MACHINE_ALT1 EM_S390_OLD
3854 #define ELF_MAXPAGESIZE 0x1000
3855 
3856 #define elf_backend_size_info		s390_elf64_size_info
3857 
3858 #define elf_backend_can_gc_sections	1
3859 #define elf_backend_can_refcount	1
3860 #define elf_backend_want_got_plt	1
3861 #define elf_backend_plt_readonly	1
3862 #define elf_backend_want_plt_sym	0
3863 #define elf_backend_got_header_size	24
3864 #define elf_backend_want_dynrelro	1
3865 #define elf_backend_rela_normal		1
3866 
3867 #define elf_info_to_howto		elf_s390_info_to_howto
3868 
3869 #define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
3870 #define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
3871 #define bfd_elf64_bfd_reloc_type_lookup	      elf_s390_reloc_type_lookup
3872 #define bfd_elf64_bfd_reloc_name_lookup	      elf_s390_reloc_name_lookup
3873 #define bfd_elf64_bfd_merge_private_bfd_data  elf64_s390_merge_private_bfd_data
3874 
3875 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
3876 #define elf_backend_check_relocs	      elf_s390_check_relocs
3877 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
3878 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
3879 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
3880 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
3881 #define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
3882 #define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
3883 #define elf_backend_relocate_section	      elf_s390_relocate_section
3884 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
3885 #define elf_backend_init_index_section	      _bfd_elf_init_1_index_section
3886 #define elf_backend_grok_prstatus	      elf_s390_grok_prstatus
3887 #define elf_backend_grok_psinfo		      elf_s390_grok_psinfo
3888 #define elf_backend_write_core_note	      elf_s390_write_core_note
3889 #define elf_backend_plt_sym_val		      elf_s390_plt_sym_val
3890 #define elf_backend_sort_relocs_p	      elf_s390_elf_sort_relocs_p
3891 #define elf_backend_additional_program_headers elf_s390_additional_program_headers
3892 #define elf_backend_modify_segment_map	      elf_s390_modify_segment_map
3893 
3894 #define bfd_elf64_mkobject		elf_s390_mkobject
3895 #define elf_backend_object_p		elf_s390_object_p
3896 
3897 #include "elf64-target.h"
3898