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