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