58048be78a93939cd8ab7b9828acef33912810f9
[platform/upstream/binutils.git] / bfd / elf32-s390.c
1 /* IBM S/390-specific support for 32-bit ELF
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3    2011, 2012 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 3 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 static const bfd_byte elf_s390_plt_entry[PLT_ENTRY_SIZE] =
573   {
574     0x0d, 0x10,                             /* basr    %r1,%r0     */
575     0x58, 0x10, 0x10, 0x16,                 /* l       %r1,22(%r1) */
576     0x58, 0x10, 0x10, 0x00,                 /* l       %r1,0(%r1)  */
577     0x07, 0xf1,                             /* br      %r1         */
578     0x0d, 0x10,                             /* basr    %r1,%r0     */
579     0x58, 0x10, 0x10, 0x0e,                 /* l       %r1,14(%r1) */
580     0xa7, 0xf4, 0x00, 0x00,                 /* j       first plt   */
581     0x00, 0x00,                             /* padding             */
582     0x00, 0x00, 0x00, 0x00,                 /* GOT offset          */
583     0x00, 0x00, 0x00, 0x00                  /* rela.plt offset     */
584   };
585
586 /* Generic PLT pic entry.  */
587 static const bfd_byte elf_s390_plt_pic_entry[PLT_ENTRY_SIZE] =
588   {
589     0x0d, 0x10,                             /* basr    %r1,%r0         */
590     0x58, 0x10, 0x10, 0x16,                 /* l       %r1,22(%r1)     */
591     0x58, 0x11, 0xc0, 0x00,                 /* l       %r1,0(%r1,%r12) */
592     0x07, 0xf1,                             /* br      %r1             */
593     0x0d, 0x10,                             /* basr    %r1,%r0         */
594     0x58, 0x10, 0x10, 0x0e,                 /* l       %r1,14(%r1)     */
595     0xa7, 0xf4, 0x00, 0x00,                 /* j       first plt       */
596     0x00, 0x00,                             /* padding                 */
597     0x00, 0x00, 0x00, 0x00,                 /* GOT offset              */
598     0x00, 0x00, 0x00, 0x00                  /* rela.plt offset         */
599   };
600
601 /* Optimized PLT pic entry for GOT offset < 4k.  xx will be replaced
602    when generating the PLT slot with the GOT offset.  */
603 static const bfd_byte elf_s390_plt_pic12_entry[PLT_ENTRY_SIZE] =
604   {
605     0x58, 0x10, 0xc0, 0x00,                 /* l       %r1,xx(%r12) */
606     0x07, 0xf1,                             /* br      %r1          */
607     0x00, 0x00, 0x00, 0x00,                 /* padding              */
608     0x00, 0x00,
609     0x0d, 0x10,                             /* basr    %r1,%r0      */
610     0x58, 0x10, 0x10, 0x0e,                 /* l       %r1,14(%r1)  */
611     0xa7, 0xf4, 0x00, 0x00,                 /* j       first plt    */
612     0x00, 0x00, 0x00, 0x00,
613     0x00, 0x00, 0x00, 0x00
614   };
615
616 /* Optimized PLT pic entry for GOT offset < 32k.  xx will be replaced
617    when generating the PLT slot with the GOT offset.  */
618 static const bfd_byte elf_s390_plt_pic16_entry[PLT_ENTRY_SIZE] =
619   {
620     0xa7, 0x18, 0x00, 0x00,                 /* lhi     %r1,xx          */
621     0x58, 0x11, 0xc0, 0x00,                 /* l       %r1,0(%r1,%r12) */
622     0x07, 0xf1,                             /* br      %r1             */
623     0x00, 0x00,
624     0x0d, 0x10,                             /* basr    %r1,%r0         */
625     0x58, 0x10, 0x10, 0x0e,                 /* l       %r1,14(%r1)     */
626     0xa7, 0xf4, 0x00, 0x00,                 /* j       first plt       */
627     0x00, 0x00, 0x00, 0x00,
628     0x00, 0x00, 0x00, 0x00,
629     0x00, 0x00
630   };
631
632 /* The first PLT entry pushes the offset into the symbol table
633    from R1 onto the stack at 8(15) and the loader object info
634    at 12(15), loads the loader address in R1 and jumps to it.  */
635
636 /* The first entry in the PLT for PIC code:
637
638 PLT0:
639    ST   1,28(15)  # R1 has offset into symbol table
640    L    1,4(12)   # Get loader ino(object struct address)
641    ST   1,24(15)  # Store address
642    L    1,8(12)   # Entry address of loader in R1
643    BR   1         # Jump to loader
644
645    The first entry in the PLT for static code:
646
647 PLT0:
648    ST   1,28(15)      # R1 has offset into symbol table
649    BASR 1,0
650    L    1,18(0,1)     # Get address of GOT
651    MVC  24(4,15),4(1) # Move loader ino to stack
652    L    1,8(1)        # Get address of loader
653    BR   1             # Jump to loader
654    .word 0            # filler
655    .long got          # address of GOT  */
656
657 static const bfd_byte elf_s390_plt_first_entry[PLT_FIRST_ENTRY_SIZE] =
658   {
659     0x50, 0x10, 0xf0, 0x1c,                   /* st      %r1,28(%r15)      */
660     0x0d, 0x10,                               /* basr    %r1,%r0           */
661     0x58, 0x10, 0x10, 0x12,                   /* l       %r1,18(%r1)       */
662     0xd2, 0x03, 0xf0, 0x18, 0x10, 0x04,       /* mvc     24(4,%r15),4(%r1) */
663     0x58, 0x10, 0x10, 0x08,                   /* l       %r1,8(%r1)        */
664     0x07, 0xf1,                               /* br      %r1               */
665     0x00, 0x00, 0x00, 0x00,
666     0x00, 0x00, 0x00, 0x00,
667     0x00, 0x00
668   };
669
670 static const bfd_byte elf_s390_plt_pic_first_entry[PLT_FIRST_ENTRY_SIZE] =
671   {
672     0x50, 0x10, 0xf0, 0x1c,                     /* st      %r1,28(%r15)  */
673     0x58, 0x10, 0xc0, 0x04,                     /* l       %r1,4(%r12)   */
674     0x50, 0x10, 0xf0, 0x18,                     /* st      %r1,24(%r15)  */
675     0x58, 0x10, 0xc0, 0x08,                     /* l       %r1,8(%r12)   */
676     0x07, 0xf1,                                 /* br      %r1           */
677     0x00, 0x00, 0x00, 0x00,
678     0x00, 0x00, 0x00, 0x00,
679     0x00, 0x00, 0x00, 0x00,
680     0x00, 0x00
681   };
682
683
684 /* s390 ELF linker hash entry.  */
685
686 struct elf_s390_link_hash_entry
687 {
688   struct elf_link_hash_entry elf;
689
690   /* Track dynamic relocs copied for this symbol.  */
691   struct elf_dyn_relocs *dyn_relocs;
692
693   /* Number of GOTPLT references for a function.  */
694   bfd_signed_vma gotplt_refcount;
695
696 #define GOT_UNKNOWN     0
697 #define GOT_NORMAL      1
698 #define GOT_TLS_GD      2
699 #define GOT_TLS_IE      3
700 #define GOT_TLS_IE_NLT  4
701   unsigned char tls_type;
702 };
703
704 #define elf_s390_hash_entry(ent) \
705   ((struct elf_s390_link_hash_entry *)(ent))
706
707 /* NOTE: Keep this structure in sync with
708    the one declared in elf64-s390.c.  */
709 struct elf_s390_obj_tdata
710 {
711   struct elf_obj_tdata root;
712
713   /* TLS type for each local got entry.  */
714   char *local_got_tls_type;
715 };
716
717 #define elf_s390_tdata(abfd) \
718   ((struct elf_s390_obj_tdata *) (abfd)->tdata.any)
719
720 #define elf_s390_local_got_tls_type(abfd) \
721   (elf_s390_tdata (abfd)->local_got_tls_type)
722
723 #define is_s390_elf(bfd) \
724   (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
725    && elf_tdata (bfd) != NULL \
726    && elf_object_id (bfd) == S390_ELF_DATA)
727
728 static bfd_boolean
729 elf_s390_mkobject (bfd *abfd)
730 {
731   return bfd_elf_allocate_object (abfd, sizeof (struct elf_s390_obj_tdata),
732                                   S390_ELF_DATA);
733 }
734
735 static bfd_boolean
736 elf_s390_object_p (abfd)
737      bfd *abfd;
738 {
739   /* Set the right machine number for an s390 elf32 file.  */
740   return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_31);
741 }
742
743 /* s390 ELF linker hash table.  */
744
745 struct elf_s390_link_hash_table
746 {
747   struct elf_link_hash_table elf;
748
749   /* Short-cuts to get to dynamic linker sections.  */
750   asection *sgot;
751   asection *sgotplt;
752   asection *srelgot;
753   asection *splt;
754   asection *srelplt;
755   asection *sdynbss;
756   asection *srelbss;
757
758   union {
759     bfd_signed_vma refcount;
760     bfd_vma offset;
761   } tls_ldm_got;
762
763   /* Small local sym cache.  */
764   struct sym_cache sym_cache;
765 };
766
767 /* Get the s390 ELF linker hash table from a link_info structure.  */
768
769 #define elf_s390_hash_table(p) \
770   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
771   == S390_ELF_DATA ? ((struct elf_s390_link_hash_table *) ((p)->hash)) : NULL)
772
773 /* Create an entry in an s390 ELF linker hash table.  */
774
775 static struct bfd_hash_entry *
776 link_hash_newfunc (entry, table, string)
777      struct bfd_hash_entry *entry;
778      struct bfd_hash_table *table;
779      const char *string;
780 {
781   /* Allocate the structure if it has not already been allocated by a
782      subclass.  */
783   if (entry == NULL)
784     {
785       entry = bfd_hash_allocate (table,
786                                  sizeof (struct elf_s390_link_hash_entry));
787       if (entry == NULL)
788         return entry;
789     }
790
791   /* Call the allocation method of the superclass.  */
792   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
793   if (entry != NULL)
794     {
795       struct elf_s390_link_hash_entry *eh;
796
797       eh = (struct elf_s390_link_hash_entry *) entry;
798       eh->dyn_relocs = NULL;
799       eh->gotplt_refcount = 0;
800       eh->tls_type = GOT_UNKNOWN;
801     }
802
803   return entry;
804 }
805
806 /* Create an s390 ELF linker hash table.  */
807
808 static struct bfd_link_hash_table *
809 elf_s390_link_hash_table_create (abfd)
810      bfd *abfd;
811 {
812   struct elf_s390_link_hash_table *ret;
813   bfd_size_type amt = sizeof (struct elf_s390_link_hash_table);
814
815   ret = (struct elf_s390_link_hash_table *) bfd_malloc (amt);
816   if (ret == NULL)
817     return NULL;
818
819   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
820                                       sizeof (struct elf_s390_link_hash_entry),
821                                       S390_ELF_DATA))
822     {
823       free (ret);
824       return NULL;
825     }
826
827   ret->sgot = NULL;
828   ret->sgotplt = NULL;
829   ret->srelgot = NULL;
830   ret->splt = NULL;
831   ret->srelplt = NULL;
832   ret->sdynbss = NULL;
833   ret->srelbss = NULL;
834   ret->tls_ldm_got.refcount = 0;
835   ret->sym_cache.abfd = NULL;
836
837   return &ret->elf.root;
838 }
839
840 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
841    shortcuts to them in our hash table.  */
842
843 static bfd_boolean
844 create_got_section (dynobj, info)
845      bfd *dynobj;
846      struct bfd_link_info *info;
847 {
848   struct elf_s390_link_hash_table *htab;
849
850   if (! _bfd_elf_create_got_section (dynobj, info))
851     return FALSE;
852
853   htab = elf_s390_hash_table (info);
854   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
855   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
856   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
857   if (!htab->sgot || !htab->sgotplt || !htab->srelgot)
858     abort ();
859
860   return TRUE;
861 }
862
863 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
864    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
865    hash table.  */
866
867 static bfd_boolean
868 elf_s390_create_dynamic_sections (dynobj, info)
869      bfd *dynobj;
870      struct bfd_link_info *info;
871 {
872   struct elf_s390_link_hash_table *htab;
873
874   htab = elf_s390_hash_table (info);
875   if (!htab->sgot && !create_got_section (dynobj, info))
876     return FALSE;
877
878   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
879     return FALSE;
880
881   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
882   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
883   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
884   if (!info->shared)
885     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
886
887   if (!htab->splt || !htab->srelplt || !htab->sdynbss
888       || (!info->shared && !htab->srelbss))
889     abort ();
890
891   return TRUE;
892 }
893
894 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
895
896 static void
897 elf_s390_copy_indirect_symbol (info, dir, ind)
898      struct bfd_link_info *info;
899      struct elf_link_hash_entry *dir, *ind;
900 {
901   struct elf_s390_link_hash_entry *edir, *eind;
902
903   edir = (struct elf_s390_link_hash_entry *) dir;
904   eind = (struct elf_s390_link_hash_entry *) ind;
905
906   if (eind->dyn_relocs != NULL)
907     {
908       if (edir->dyn_relocs != NULL)
909         {
910           struct elf_dyn_relocs **pp;
911           struct elf_dyn_relocs *p;
912
913           /* Add reloc counts against the indirect sym to the direct sym
914              list.  Merge any entries against the same section.  */
915           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
916             {
917               struct elf_dyn_relocs *q;
918
919               for (q = edir->dyn_relocs; q != NULL; q = q->next)
920                 if (q->sec == p->sec)
921                   {
922                     q->pc_count += p->pc_count;
923                     q->count += p->count;
924                     *pp = p->next;
925                     break;
926                   }
927               if (q == NULL)
928                 pp = &p->next;
929             }
930           *pp = edir->dyn_relocs;
931         }
932
933       edir->dyn_relocs = eind->dyn_relocs;
934       eind->dyn_relocs = NULL;
935     }
936
937   if (ind->root.type == bfd_link_hash_indirect
938       && dir->got.refcount <= 0)
939     {
940       edir->tls_type = eind->tls_type;
941       eind->tls_type = GOT_UNKNOWN;
942     }
943
944   if (ELIMINATE_COPY_RELOCS
945       && ind->root.type != bfd_link_hash_indirect
946       && dir->dynamic_adjusted)
947     {
948       /* If called to transfer flags for a weakdef during processing
949          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
950          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
951       dir->ref_dynamic |= ind->ref_dynamic;
952       dir->ref_regular |= ind->ref_regular;
953       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
954       dir->needs_plt |= ind->needs_plt;
955     }
956   else
957     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
958 }
959
960 static int
961 elf_s390_tls_transition (info, r_type, is_local)
962      struct bfd_link_info *info;
963      int r_type;
964      int is_local;
965 {
966   if (info->shared)
967     return r_type;
968
969   switch (r_type)
970     {
971     case R_390_TLS_GD32:
972     case R_390_TLS_IE32:
973       if (is_local)
974         return R_390_TLS_LE32;
975       return R_390_TLS_IE32;
976     case R_390_TLS_GOTIE32:
977       if (is_local)
978         return R_390_TLS_LE32;
979       return R_390_TLS_GOTIE32;
980     case R_390_TLS_LDM32:
981       return R_390_TLS_LE32;
982     }
983
984   return r_type;
985 }
986
987 /* Look through the relocs for a section during the first phase, and
988    allocate space in the global offset table or procedure linkage
989    table.  */
990
991 static bfd_boolean
992 elf_s390_check_relocs (abfd, info, sec, relocs)
993      bfd *abfd;
994      struct bfd_link_info *info;
995      asection *sec;
996      const Elf_Internal_Rela *relocs;
997 {
998   struct elf_s390_link_hash_table *htab;
999   Elf_Internal_Shdr *symtab_hdr;
1000   struct elf_link_hash_entry **sym_hashes;
1001   const Elf_Internal_Rela *rel;
1002   const Elf_Internal_Rela *rel_end;
1003   asection *sreloc;
1004   bfd_signed_vma *local_got_refcounts;
1005   int tls_type, old_tls_type;
1006
1007   if (info->relocatable)
1008     return TRUE;
1009
1010   BFD_ASSERT (is_s390_elf (abfd));
1011
1012   htab = elf_s390_hash_table (info);
1013   symtab_hdr = &elf_symtab_hdr (abfd);
1014   sym_hashes = elf_sym_hashes (abfd);
1015   local_got_refcounts = elf_local_got_refcounts (abfd);
1016
1017   sreloc = NULL;
1018
1019   rel_end = relocs + sec->reloc_count;
1020   for (rel = relocs; rel < rel_end; rel++)
1021     {
1022       unsigned int r_type;
1023       unsigned long r_symndx;
1024       struct elf_link_hash_entry *h;
1025
1026       r_symndx = ELF32_R_SYM (rel->r_info);
1027
1028       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1029         {
1030           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1031                                  abfd, r_symndx);
1032           return FALSE;
1033         }
1034
1035       if (r_symndx < symtab_hdr->sh_info)
1036         h = NULL;
1037       else
1038         {
1039           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1040           while (h->root.type == bfd_link_hash_indirect
1041                  || h->root.type == bfd_link_hash_warning)
1042             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1043         }
1044
1045       /* Create got section and local_got_refcounts array if they
1046          are needed.  */
1047       r_type = elf_s390_tls_transition (info,
1048                                         ELF32_R_TYPE (rel->r_info),
1049                                         h == NULL);
1050       switch (r_type)
1051         {
1052         case R_390_GOT12:
1053         case R_390_GOT16:
1054         case R_390_GOT20:
1055         case R_390_GOT32:
1056         case R_390_GOTENT:
1057         case R_390_GOTPLT12:
1058         case R_390_GOTPLT16:
1059         case R_390_GOTPLT20:
1060         case R_390_GOTPLT32:
1061         case R_390_GOTPLTENT:
1062         case R_390_TLS_GD32:
1063         case R_390_TLS_GOTIE12:
1064         case R_390_TLS_GOTIE20:
1065         case R_390_TLS_GOTIE32:
1066         case R_390_TLS_IEENT:
1067         case R_390_TLS_IE32:
1068         case R_390_TLS_LDM32:
1069           if (h == NULL
1070               && local_got_refcounts == NULL)
1071             {
1072               bfd_size_type size;
1073
1074               size = symtab_hdr->sh_info;
1075               size *= (sizeof (bfd_signed_vma) + sizeof(char));
1076               local_got_refcounts = ((bfd_signed_vma *)
1077                                      bfd_zalloc (abfd, size));
1078               if (local_got_refcounts == NULL)
1079                 return FALSE;
1080               elf_local_got_refcounts (abfd) = local_got_refcounts;
1081               elf_s390_local_got_tls_type (abfd)
1082                 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1083             }
1084           /* Fall through.  */
1085         case R_390_GOTOFF16:
1086         case R_390_GOTOFF32:
1087         case R_390_GOTPC:
1088         case R_390_GOTPCDBL:
1089           if (htab->sgot == NULL)
1090             {
1091               if (htab->elf.dynobj == NULL)
1092                 htab->elf.dynobj = abfd;
1093               if (!create_got_section (htab->elf.dynobj, info))
1094                 return FALSE;
1095             }
1096         }
1097
1098       switch (r_type)
1099         {
1100         case R_390_GOTOFF16:
1101         case R_390_GOTOFF32:
1102         case R_390_GOTPC:
1103         case R_390_GOTPCDBL:
1104           /* Got is created, nothing to be done.  */
1105           break;
1106
1107         case R_390_PLT16DBL:
1108         case R_390_PLT32DBL:
1109         case R_390_PLT32:
1110         case R_390_PLTOFF16:
1111         case R_390_PLTOFF32:
1112           /* This symbol requires a procedure linkage table entry.  We
1113              actually build the entry in adjust_dynamic_symbol,
1114              because this might be a case of linking PIC code which is
1115              never referenced by a dynamic object, in which case we
1116              don't need to generate a procedure linkage table entry
1117              after all.  */
1118
1119           /* If this is a local symbol, we resolve it directly without
1120              creating a procedure linkage table entry.  */
1121           if (h != NULL)
1122             {
1123               h->needs_plt = 1;
1124               h->plt.refcount += 1;
1125             }
1126           break;
1127
1128         case R_390_GOTPLT12:
1129         case R_390_GOTPLT16:
1130         case R_390_GOTPLT20:
1131         case R_390_GOTPLT32:
1132         case R_390_GOTPLTENT:
1133           /* This symbol requires either a procedure linkage table entry
1134              or an entry in the local got. We actually build the entry
1135              in adjust_dynamic_symbol because whether this is really a
1136              global reference can change and with it the fact if we have
1137              to create a plt entry or a local got entry. To be able to
1138              make a once global symbol a local one we have to keep track
1139              of the number of gotplt references that exist for this
1140              symbol.  */
1141           if (h != NULL)
1142             {
1143               ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount++;
1144               h->needs_plt = 1;
1145               h->plt.refcount += 1;
1146             }
1147           else
1148             local_got_refcounts[r_symndx] += 1;
1149           break;
1150
1151         case R_390_TLS_LDM32:
1152           htab->tls_ldm_got.refcount += 1;
1153           break;
1154
1155         case R_390_TLS_IE32:
1156         case R_390_TLS_GOTIE12:
1157         case R_390_TLS_GOTIE20:
1158         case R_390_TLS_GOTIE32:
1159         case R_390_TLS_IEENT:
1160           if (info->shared)
1161             info->flags |= DF_STATIC_TLS;
1162           /* Fall through.  */
1163
1164         case R_390_GOT12:
1165         case R_390_GOT16:
1166         case R_390_GOT20:
1167         case R_390_GOT32:
1168         case R_390_GOTENT:
1169         case R_390_TLS_GD32:
1170           /* This symbol requires a global offset table entry.  */
1171           switch (r_type)
1172             {
1173             default:
1174             case R_390_GOT12:
1175             case R_390_GOT16:
1176             case R_390_GOT20:
1177             case R_390_GOT32:
1178             case R_390_GOTENT:
1179               tls_type = GOT_NORMAL;
1180               break;
1181             case R_390_TLS_GD32:
1182               tls_type = GOT_TLS_GD;
1183               break;
1184             case R_390_TLS_IE32:
1185             case R_390_TLS_GOTIE32:
1186               tls_type = GOT_TLS_IE;
1187               break;
1188             case R_390_TLS_GOTIE12:
1189             case R_390_TLS_GOTIE20:
1190             case R_390_TLS_IEENT:
1191               tls_type = GOT_TLS_IE_NLT;
1192               break;
1193             }
1194
1195           if (h != NULL)
1196             {
1197               h->got.refcount += 1;
1198               old_tls_type = elf_s390_hash_entry(h)->tls_type;
1199             }
1200           else
1201             {
1202               local_got_refcounts[r_symndx] += 1;
1203               old_tls_type = elf_s390_local_got_tls_type (abfd) [r_symndx];
1204             }
1205           /* If a TLS symbol is accessed using IE at least once,
1206              there is no point to use dynamic model for it.  */
1207           if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN)
1208             {
1209               if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL)
1210                 {
1211                   (*_bfd_error_handler)
1212                     (_("%B: `%s' accessed both as normal and thread local symbol"),
1213                      abfd, h->root.root.string);
1214                   return FALSE;
1215                 }
1216               if (old_tls_type > tls_type)
1217                 tls_type = old_tls_type;
1218             }
1219
1220           if (old_tls_type != tls_type)
1221             {
1222               if (h != NULL)
1223                 elf_s390_hash_entry (h)->tls_type = tls_type;
1224               else
1225                 elf_s390_local_got_tls_type (abfd) [r_symndx] = tls_type;
1226             }
1227
1228           if (r_type != R_390_TLS_IE32)
1229             break;
1230           /* Fall through.  */
1231
1232         case R_390_TLS_LE32:
1233           if (!info->shared)
1234             break;
1235           info->flags |= DF_STATIC_TLS;
1236           /* Fall through.  */
1237
1238         case R_390_8:
1239         case R_390_16:
1240         case R_390_32:
1241         case R_390_PC16:
1242         case R_390_PC16DBL:
1243         case R_390_PC32DBL:
1244         case R_390_PC32:
1245           if (h != NULL && !info->shared)
1246             {
1247               /* If this reloc is in a read-only section, we might
1248                  need a copy reloc.  We can't check reliably at this
1249                  stage whether the section is read-only, as input
1250                  sections have not yet been mapped to output sections.
1251                  Tentatively set the flag for now, and correct in
1252                  adjust_dynamic_symbol.  */
1253               h->non_got_ref = 1;
1254
1255               /* We may need a .plt entry if the function this reloc
1256                  refers to is in a shared lib.  */
1257               h->plt.refcount += 1;
1258             }
1259
1260           /* If we are creating a shared library, and this is a reloc
1261              against a global symbol, or a non PC relative reloc
1262              against a local symbol, then we need to copy the reloc
1263              into the shared library.  However, if we are linking with
1264              -Bsymbolic, we do not need to copy a reloc against a
1265              global symbol which is defined in an object we are
1266              including in the link (i.e., DEF_REGULAR is set).  At
1267              this point we have not seen all the input files, so it is
1268              possible that DEF_REGULAR is not set now but will be set
1269              later (it is never cleared).  In case of a weak definition,
1270              DEF_REGULAR may be cleared later by a strong definition in
1271              a shared library. We account for that possibility below by
1272              storing information in the relocs_copied field of the hash
1273              table entry.  A similar situation occurs when creating
1274              shared libraries and symbol visibility changes render the
1275              symbol local.
1276
1277              If on the other hand, we are creating an executable, we
1278              may need to keep relocations for symbols satisfied by a
1279              dynamic library if we manage to avoid copy relocs for the
1280              symbol.  */
1281           if ((info->shared
1282                && (sec->flags & SEC_ALLOC) != 0
1283                && ((ELF32_R_TYPE (rel->r_info) != R_390_PC16
1284                     && ELF32_R_TYPE (rel->r_info) != R_390_PC16DBL
1285                     && ELF32_R_TYPE (rel->r_info) != R_390_PC32DBL
1286                     && ELF32_R_TYPE (rel->r_info) != R_390_PC32)
1287                    || (h != NULL
1288                        && (! SYMBOLIC_BIND (info, h)
1289                            || h->root.type == bfd_link_hash_defweak
1290                            || !h->def_regular))))
1291               || (ELIMINATE_COPY_RELOCS
1292                   && !info->shared
1293                   && (sec->flags & SEC_ALLOC) != 0
1294                   && h != NULL
1295                   && (h->root.type == bfd_link_hash_defweak
1296                       || !h->def_regular)))
1297             {
1298               struct elf_dyn_relocs *p;
1299               struct elf_dyn_relocs **head;
1300
1301               /* We must copy these reloc types into the output file.
1302                  Create a reloc section in dynobj and make room for
1303                  this reloc.  */
1304               if (sreloc == NULL)
1305                 {
1306                   if (htab->elf.dynobj == NULL)
1307                     htab->elf.dynobj = abfd;
1308
1309                   sreloc = _bfd_elf_make_dynamic_reloc_section
1310                     (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
1311
1312                   if (sreloc == NULL)
1313                     return FALSE;
1314                 }
1315
1316               /* If this is a global symbol, we count the number of
1317                  relocations we need for this symbol.  */
1318               if (h != NULL)
1319                 {
1320                   head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
1321                 }
1322               else
1323                 {
1324                   /* Track dynamic relocs needed for local syms too.
1325                      We really need local syms available to do this
1326                      easily.  Oh well.  */
1327                   asection *s;
1328                   void *vpp;
1329                   Elf_Internal_Sym *isym;
1330
1331                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1332                                                 abfd, r_symndx);
1333                   if (isym == NULL)
1334                     return FALSE;
1335
1336                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1337                   if (s == NULL)
1338                     s = sec;
1339
1340                   vpp = &elf_section_data (s)->local_dynrel;
1341                   head = (struct elf_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_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           BFD_ASSERT (h != NULL);
1380           if (h != NULL
1381               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1382             return FALSE;
1383           break;
1384
1385         default:
1386           break;
1387         }
1388     }
1389
1390   return TRUE;
1391 }
1392
1393 /* Return the section that should be marked against GC for a given
1394    relocation.  */
1395
1396 static asection *
1397 elf_s390_gc_mark_hook (asection *sec,
1398                        struct bfd_link_info *info,
1399                        Elf_Internal_Rela *rel,
1400                        struct elf_link_hash_entry *h,
1401                        Elf_Internal_Sym *sym)
1402 {
1403   if (h != NULL)
1404     switch (ELF32_R_TYPE (rel->r_info))
1405       {
1406       case R_390_GNU_VTINHERIT:
1407       case R_390_GNU_VTENTRY:
1408         return NULL;
1409       }
1410   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1411
1412 }
1413
1414 /* Update the got entry reference counts for the section being removed.  */
1415
1416 static bfd_boolean
1417 elf_s390_gc_sweep_hook (bfd *abfd,
1418                         struct bfd_link_info *info,
1419                         asection *sec,
1420                         const Elf_Internal_Rela *relocs)
1421 {
1422   Elf_Internal_Shdr *symtab_hdr;
1423   struct elf_link_hash_entry **sym_hashes;
1424   bfd_signed_vma *local_got_refcounts;
1425   const Elf_Internal_Rela *rel, *relend;
1426
1427   if (info->relocatable)
1428     return TRUE;
1429
1430   elf_section_data (sec)->local_dynrel = NULL;
1431
1432   symtab_hdr = &elf_symtab_hdr (abfd);
1433   sym_hashes = elf_sym_hashes (abfd);
1434   local_got_refcounts = elf_local_got_refcounts (abfd);
1435
1436   relend = relocs + sec->reloc_count;
1437   for (rel = relocs; rel < relend; rel++)
1438     {
1439       unsigned long r_symndx;
1440       unsigned int r_type;
1441       struct elf_link_hash_entry *h = NULL;
1442
1443       r_symndx = ELF32_R_SYM (rel->r_info);
1444       if (r_symndx >= symtab_hdr->sh_info)
1445         {
1446           struct elf_s390_link_hash_entry *eh;
1447           struct elf_dyn_relocs **pp;
1448           struct elf_dyn_relocs *p;
1449
1450           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1451           while (h->root.type == bfd_link_hash_indirect
1452                  || h->root.type == bfd_link_hash_warning)
1453             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1454           eh = (struct elf_s390_link_hash_entry *) h;
1455
1456           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1457             if (p->sec == sec)
1458               {
1459                 /* Everything must go for SEC.  */
1460                 *pp = p->next;
1461                 break;
1462               }
1463         }
1464
1465       r_type = ELF32_R_TYPE (rel->r_info);
1466       r_type = elf_s390_tls_transition (info, r_type, h != NULL);
1467       switch (r_type)
1468         {
1469         case R_390_TLS_LDM32:
1470           if (elf_s390_hash_table (info)->tls_ldm_got.refcount > 0)
1471             elf_s390_hash_table (info)->tls_ldm_got.refcount -= 1;
1472           break;
1473
1474         case R_390_TLS_GD32:
1475         case R_390_TLS_IE32:
1476         case R_390_TLS_GOTIE12:
1477         case R_390_TLS_GOTIE20:
1478         case R_390_TLS_GOTIE32:
1479         case R_390_TLS_IEENT:
1480         case R_390_GOT12:
1481         case R_390_GOT16:
1482         case R_390_GOT20:
1483         case R_390_GOT32:
1484         case R_390_GOTOFF16:
1485         case R_390_GOTOFF32:
1486         case R_390_GOTPC:
1487         case R_390_GOTPCDBL:
1488         case R_390_GOTENT:
1489           if (h != NULL)
1490             {
1491               if (h->got.refcount > 0)
1492                 h->got.refcount -= 1;
1493             }
1494           else if (local_got_refcounts != NULL)
1495             {
1496               if (local_got_refcounts[r_symndx] > 0)
1497                 local_got_refcounts[r_symndx] -= 1;
1498             }
1499           break;
1500
1501         case R_390_8:
1502         case R_390_12:
1503         case R_390_16:
1504         case R_390_20:
1505         case R_390_32:
1506         case R_390_PC16:
1507         case R_390_PC16DBL:
1508         case R_390_PC32DBL:
1509         case R_390_PC32:
1510           if (info->shared)
1511             break;
1512           /* Fall through.  */
1513
1514         case R_390_PLT16DBL:
1515         case R_390_PLT32DBL:
1516         case R_390_PLT32:
1517         case R_390_PLTOFF16:
1518         case R_390_PLTOFF32:
1519           if (h != NULL)
1520             {
1521               if (h->plt.refcount > 0)
1522                 h->plt.refcount -= 1;
1523             }
1524           break;
1525
1526         case R_390_GOTPLT12:
1527         case R_390_GOTPLT16:
1528         case R_390_GOTPLT20:
1529         case R_390_GOTPLT32:
1530         case R_390_GOTPLTENT:
1531           if (h != NULL)
1532             {
1533               if (h->plt.refcount > 0)
1534                 {
1535                   ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount--;
1536                   h->plt.refcount -= 1;
1537                 }
1538             }
1539           else if (local_got_refcounts != NULL)
1540             {
1541               if (local_got_refcounts[r_symndx] > 0)
1542                 local_got_refcounts[r_symndx] -= 1;
1543             }
1544           break;
1545
1546         default:
1547           break;
1548         }
1549     }
1550
1551   return TRUE;
1552 }
1553
1554 /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT
1555    entry but we found we will not create any.  Called when we find we will
1556    not have any PLT for this symbol, by for example
1557    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
1558    or elf_s390_size_dynamic_sections if no dynamic sections will be
1559    created (we're only linking static objects).  */
1560
1561 static void
1562 elf_s390_adjust_gotplt (h)
1563      struct elf_s390_link_hash_entry *h;
1564 {
1565   if (h->elf.root.type == bfd_link_hash_warning)
1566     h = (struct elf_s390_link_hash_entry *) h->elf.root.u.i.link;
1567
1568   if (h->gotplt_refcount <= 0)
1569     return;
1570
1571   /* We simply add the number of gotplt references to the number
1572    * of got references for this symbol.  */
1573   h->elf.got.refcount += h->gotplt_refcount;
1574   h->gotplt_refcount = -1;
1575 }
1576
1577 /* Adjust a symbol defined by a dynamic object and referenced by a
1578    regular object.  The current definition is in some section of the
1579    dynamic object, but we're not including those sections.  We have to
1580    change the definition to something the rest of the link can
1581    understand.  */
1582
1583 static bfd_boolean
1584 elf_s390_adjust_dynamic_symbol (info, h)
1585      struct bfd_link_info *info;
1586      struct elf_link_hash_entry *h;
1587 {
1588   struct elf_s390_link_hash_table *htab;
1589   asection *s;
1590
1591   /* If this is a function, put it in the procedure linkage table.  We
1592      will fill in the contents of the procedure linkage table later
1593      (although we could actually do it here).  */
1594   if (h->type == STT_FUNC
1595       || h->needs_plt)
1596     {
1597       if (h->plt.refcount <= 0
1598           || SYMBOL_CALLS_LOCAL (info, h)
1599           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1600               && h->root.type != bfd_link_hash_undefweak))
1601         {
1602           /* This case can occur if we saw a PLT32 reloc in an input
1603              file, but the symbol was never referred to by a dynamic
1604              object, or if all references were garbage collected.  In
1605              such a case, we don't actually need to build a procedure
1606              linkage table, and we can just do a PC32 reloc instead.  */
1607           h->plt.offset = (bfd_vma) -1;
1608           h->needs_plt = 0;
1609           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1610         }
1611
1612       return TRUE;
1613     }
1614   else
1615     /* It's possible that we incorrectly decided a .plt reloc was
1616        needed for an R_390_PC32 reloc to a non-function sym in
1617        check_relocs.  We can't decide accurately between function and
1618        non-function syms in check-relocs;  Objects loaded later in
1619        the link may change h->type.  So fix it now.  */
1620     h->plt.offset = (bfd_vma) -1;
1621
1622   /* If this is a weak symbol, and there is a real definition, the
1623      processor independent code will have arranged for us to see the
1624      real definition first, and we can just use the same value.  */
1625   if (h->u.weakdef != NULL)
1626     {
1627       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1628                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1629       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1630       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1631       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1632         h->non_got_ref = h->u.weakdef->non_got_ref;
1633       return TRUE;
1634     }
1635
1636   /* This is a reference to a symbol defined by a dynamic object which
1637      is not a function.  */
1638
1639   /* If we are creating a shared library, we must presume that the
1640      only references to the symbol are via the global offset table.
1641      For such cases we need not do anything here; the relocations will
1642      be handled correctly by relocate_section.  */
1643   if (info->shared)
1644     return TRUE;
1645
1646   /* If there are no references to this symbol that do not use the
1647      GOT, we don't need to generate a copy reloc.  */
1648   if (!h->non_got_ref)
1649     return TRUE;
1650
1651   /* If -z nocopyreloc was given, we won't generate them either.  */
1652   if (info->nocopyreloc)
1653     {
1654       h->non_got_ref = 0;
1655       return TRUE;
1656     }
1657
1658   if (ELIMINATE_COPY_RELOCS)
1659     {
1660       struct elf_s390_link_hash_entry * eh;
1661       struct elf_dyn_relocs *p;
1662
1663       eh = (struct elf_s390_link_hash_entry *) h;
1664       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1665         {
1666           s = p->sec->output_section;
1667           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1668             break;
1669         }
1670
1671       /* If we didn't find any dynamic relocs in read-only sections, then
1672          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1673       if (p == NULL)
1674         {
1675           h->non_got_ref = 0;
1676           return TRUE;
1677         }
1678     }
1679
1680   /* We must allocate the symbol in our .dynbss section, which will
1681      become part of the .bss section of the executable.  There will be
1682      an entry for this symbol in the .dynsym section.  The dynamic
1683      object will contain position independent code, so all references
1684      from the dynamic object to this symbol will go through the global
1685      offset table.  The dynamic linker will use the .dynsym entry to
1686      determine the address it must put in the global offset table, so
1687      both the dynamic object and the regular object will refer to the
1688      same memory location for the variable.  */
1689
1690   htab = elf_s390_hash_table (info);
1691
1692   /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1693      copy the initial value out of the dynamic object and into the
1694      runtime process image.  */
1695   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
1696     {
1697       htab->srelbss->size += sizeof (Elf32_External_Rela);
1698       h->needs_copy = 1;
1699     }
1700
1701   s = htab->sdynbss;
1702
1703   return _bfd_elf_adjust_dynamic_copy (h, s);
1704 }
1705
1706 /* Allocate space in .plt, .got and associated reloc sections for
1707    dynamic relocs.  */
1708
1709 static bfd_boolean
1710 allocate_dynrelocs (h, inf)
1711      struct elf_link_hash_entry *h;
1712      PTR inf;
1713 {
1714   struct bfd_link_info *info;
1715   struct elf_s390_link_hash_table *htab;
1716   struct elf_s390_link_hash_entry *eh;
1717   struct elf_dyn_relocs *p;
1718
1719   if (h->root.type == bfd_link_hash_indirect)
1720     return TRUE;
1721
1722   info = (struct bfd_link_info *) inf;
1723   htab = elf_s390_hash_table (info);
1724
1725   if (htab->elf.dynamic_sections_created
1726       && h->plt.refcount > 0)
1727     {
1728       /* Make sure this symbol is output as a dynamic symbol.
1729          Undefined weak syms won't yet be marked as dynamic.  */
1730       if (h->dynindx == -1
1731           && !h->forced_local)
1732         {
1733           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1734             return FALSE;
1735         }
1736
1737       if (info->shared
1738           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1739         {
1740           asection *s = htab->splt;
1741
1742           /* If this is the first .plt entry, make room for the special
1743              first entry.  */
1744           if (s->size == 0)
1745             s->size += PLT_FIRST_ENTRY_SIZE;
1746
1747           h->plt.offset = s->size;
1748
1749           /* If this symbol is not defined in a regular file, and we are
1750              not generating a shared library, then set the symbol to this
1751              location in the .plt.  This is required to make function
1752              pointers compare as equal between the normal executable and
1753              the shared library.  */
1754           if (! info->shared
1755               && !h->def_regular)
1756             {
1757               h->root.u.def.section = s;
1758               h->root.u.def.value = h->plt.offset;
1759             }
1760
1761           /* Make room for this entry.  */
1762           s->size += PLT_ENTRY_SIZE;
1763
1764           /* We also need to make an entry in the .got.plt section, which
1765              will be placed in the .got section by the linker script.  */
1766           htab->sgotplt->size += GOT_ENTRY_SIZE;
1767
1768           /* We also need to make an entry in the .rela.plt section.  */
1769           htab->srelplt->size += sizeof (Elf32_External_Rela);
1770         }
1771       else
1772         {
1773           h->plt.offset = (bfd_vma) -1;
1774           h->needs_plt = 0;
1775           elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1776         }
1777     }
1778   else
1779     {
1780       h->plt.offset = (bfd_vma) -1;
1781       h->needs_plt = 0;
1782       elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h);
1783     }
1784
1785   /* If R_390_TLS_{IE32,GOTIE32,GOTIE12,IEENT} symbol is now local to
1786      the binary, we can optimize a bit. IE32 and GOTIE32 get converted
1787      to R_390_TLS_LE32 requiring no TLS entry. For GOTIE12 and IEENT
1788      we can save the dynamic TLS relocation.  */
1789   if (h->got.refcount > 0
1790       && !info->shared
1791       && h->dynindx == -1
1792       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
1793     {
1794       if (elf_s390_hash_entry(h)->tls_type == GOT_TLS_IE_NLT)
1795         /* For the GOTIE access without a literal pool entry the offset has
1796            to be stored somewhere. The immediate value in the instruction
1797            is not bit enough so the value is stored in the got.  */
1798         {
1799           h->got.offset = htab->sgot->size;
1800           htab->sgot->size += GOT_ENTRY_SIZE;
1801         }
1802       else
1803         h->got.offset = (bfd_vma) -1;
1804     }
1805   else if (h->got.refcount > 0)
1806    {
1807       asection *s;
1808       bfd_boolean dyn;
1809       int tls_type = elf_s390_hash_entry(h)->tls_type;
1810
1811       /* Make sure this symbol is output as a dynamic symbol.
1812          Undefined weak syms won't yet be marked as dynamic.  */
1813       if (h->dynindx == -1
1814           && !h->forced_local)
1815         {
1816           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1817             return FALSE;
1818         }
1819
1820       s = htab->sgot;
1821       h->got.offset = s->size;
1822       s->size += GOT_ENTRY_SIZE;
1823       /* R_390_TLS_GD32 needs 2 consecutive GOT slots.  */
1824       if (tls_type == GOT_TLS_GD)
1825         s->size += GOT_ENTRY_SIZE;
1826       dyn = htab->elf.dynamic_sections_created;
1827       /* R_390_TLS_IE32 needs one dynamic relocation,
1828          R_390_TLS_GD32 needs one if local symbol and two if global.  */
1829       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1830           || tls_type >= GOT_TLS_IE)
1831         htab->srelgot->size += sizeof (Elf32_External_Rela);
1832       else if (tls_type == GOT_TLS_GD)
1833         htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
1834       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1835                 || h->root.type != bfd_link_hash_undefweak)
1836                && (info->shared
1837                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1838         htab->srelgot->size += sizeof (Elf32_External_Rela);
1839     }
1840   else
1841     h->got.offset = (bfd_vma) -1;
1842
1843   eh = (struct elf_s390_link_hash_entry *) h;
1844   if (eh->dyn_relocs == NULL)
1845     return TRUE;
1846
1847   /* In the shared -Bsymbolic case, discard space allocated for
1848      dynamic pc-relative relocs against symbols which turn out to be
1849      defined in regular objects.  For the normal shared case, discard
1850      space for pc-relative relocs that have become local due to symbol
1851      visibility changes.  */
1852
1853   if (info->shared)
1854     {
1855       if (SYMBOL_CALLS_LOCAL (info, h))
1856         {
1857           struct elf_dyn_relocs **pp;
1858
1859           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1860             {
1861               p->count -= p->pc_count;
1862               p->pc_count = 0;
1863               if (p->count == 0)
1864                 *pp = p->next;
1865               else
1866                 pp = &p->next;
1867             }
1868         }
1869
1870       /* Also discard relocs on undefined weak syms with non-default
1871          visibility.  */
1872       if (eh->dyn_relocs != NULL
1873           && h->root.type == bfd_link_hash_undefweak)
1874         {
1875           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1876             eh->dyn_relocs = NULL;
1877
1878           /* Make sure undefined weak symbols are output as a dynamic
1879              symbol in PIEs.  */
1880           else if (h->dynindx == -1
1881                    && !h->forced_local)
1882             {
1883               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1884                 return FALSE;
1885             }
1886         }
1887     }
1888   else if (ELIMINATE_COPY_RELOCS)
1889     {
1890       /* For the non-shared case, discard space for relocs against
1891          symbols which turn out to need copy relocs or are not
1892          dynamic.  */
1893
1894       if (!h->non_got_ref
1895           && ((h->def_dynamic
1896                && !h->def_regular)
1897               || (htab->elf.dynamic_sections_created
1898                   && (h->root.type == bfd_link_hash_undefweak
1899                       || h->root.type == bfd_link_hash_undefined))))
1900         {
1901           /* Make sure this symbol is output as a dynamic symbol.
1902              Undefined weak syms won't yet be marked as dynamic.  */
1903           if (h->dynindx == -1
1904               && !h->forced_local)
1905             {
1906               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1907                 return FALSE;
1908             }
1909
1910           /* If that succeeded, we know we'll be keeping all the
1911              relocs.  */
1912           if (h->dynindx != -1)
1913             goto keep;
1914         }
1915
1916       eh->dyn_relocs = NULL;
1917
1918     keep: ;
1919     }
1920
1921   /* Finally, allocate space.  */
1922   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1923     {
1924       asection *sreloc = elf_section_data (p->sec)->sreloc;
1925
1926       sreloc->size += p->count * sizeof (Elf32_External_Rela);
1927     }
1928
1929   return TRUE;
1930 }
1931
1932 /* Find any dynamic relocs that apply to read-only sections.  */
1933
1934 static bfd_boolean
1935 readonly_dynrelocs (h, inf)
1936      struct elf_link_hash_entry *h;
1937      PTR inf;
1938 {
1939   struct elf_s390_link_hash_entry *eh;
1940   struct elf_dyn_relocs *p;
1941
1942   eh = (struct elf_s390_link_hash_entry *) h;
1943   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1944     {
1945       asection *s = p->sec->output_section;
1946
1947       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1948         {
1949           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1950
1951           info->flags |= DF_TEXTREL;
1952
1953           /* Not an error, just cut short the traversal.  */
1954           return FALSE;
1955         }
1956     }
1957   return TRUE;
1958 }
1959
1960 /* Set the sizes of the dynamic sections.  */
1961
1962 static bfd_boolean
1963 elf_s390_size_dynamic_sections (output_bfd, info)
1964      bfd *output_bfd ATTRIBUTE_UNUSED;
1965      struct bfd_link_info *info;
1966 {
1967   struct elf_s390_link_hash_table *htab;
1968   bfd *dynobj;
1969   asection *s;
1970   bfd_boolean relocs;
1971   bfd *ibfd;
1972
1973   htab = elf_s390_hash_table (info);
1974   dynobj = htab->elf.dynobj;
1975   if (dynobj == NULL)
1976     abort ();
1977
1978   if (htab->elf.dynamic_sections_created)
1979     {
1980       /* Set the contents of the .interp section to the interpreter.  */
1981       if (info->executable)
1982         {
1983           s = bfd_get_section_by_name (dynobj, ".interp");
1984           if (s == NULL)
1985             abort ();
1986           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1987           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1988         }
1989     }
1990
1991   /* Set up .got offsets for local syms, and space for local dynamic
1992      relocs.  */
1993   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1994     {
1995       bfd_signed_vma *local_got;
1996       bfd_signed_vma *end_local_got;
1997       char *local_tls_type;
1998       bfd_size_type locsymcount;
1999       Elf_Internal_Shdr *symtab_hdr;
2000       asection *srela;
2001
2002       if (! is_s390_elf (ibfd))
2003         continue;
2004
2005       for (s = ibfd->sections; s != NULL; s = s->next)
2006         {
2007           struct elf_dyn_relocs *p;
2008
2009           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2010             {
2011               if (!bfd_is_abs_section (p->sec)
2012                   && bfd_is_abs_section (p->sec->output_section))
2013                 {
2014                   /* Input section has been discarded, either because
2015                      it is a copy of a linkonce section or due to
2016                      linker script /DISCARD/, so we'll be discarding
2017                      the relocs too.  */
2018                 }
2019               else if (p->count != 0)
2020                 {
2021                   srela = elf_section_data (p->sec)->sreloc;
2022                   srela->size += p->count * sizeof (Elf32_External_Rela);
2023                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2024                     info->flags |= DF_TEXTREL;
2025                 }
2026             }
2027         }
2028
2029       local_got = elf_local_got_refcounts (ibfd);
2030       if (!local_got)
2031         continue;
2032
2033       symtab_hdr = &elf_symtab_hdr (ibfd);
2034       locsymcount = symtab_hdr->sh_info;
2035       end_local_got = local_got + locsymcount;
2036       local_tls_type = elf_s390_local_got_tls_type (ibfd);
2037       s = htab->sgot;
2038       srela = htab->srelgot;
2039       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2040         {
2041           if (*local_got > 0)
2042             {
2043               *local_got = s->size;
2044               s->size += GOT_ENTRY_SIZE;
2045               if (*local_tls_type == GOT_TLS_GD)
2046                 s->size += GOT_ENTRY_SIZE;
2047               if (info->shared)
2048                 srela->size += sizeof (Elf32_External_Rela);
2049             }
2050           else
2051             *local_got = (bfd_vma) -1;
2052         }
2053     }
2054
2055   if (htab->tls_ldm_got.refcount > 0)
2056     {
2057       /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM32
2058          relocs.  */
2059       htab->tls_ldm_got.offset = htab->sgot->size;
2060       htab->sgot->size += 2 * GOT_ENTRY_SIZE;
2061       htab->srelgot->size += sizeof (Elf32_External_Rela);
2062     }
2063   else
2064     htab->tls_ldm_got.offset = -1;
2065
2066   /* Allocate global sym .plt and .got entries, and space for global
2067      sym dynamic relocs.  */
2068   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
2069
2070   /* We now have determined the sizes of the various dynamic sections.
2071      Allocate memory for them.  */
2072   relocs = FALSE;
2073   for (s = dynobj->sections; s != NULL; s = s->next)
2074     {
2075       if ((s->flags & SEC_LINKER_CREATED) == 0)
2076         continue;
2077
2078       if (s == htab->splt
2079           || s == htab->sgot
2080           || s == htab->sgotplt
2081           || s == htab->sdynbss)
2082         {
2083           /* Strip this section if we don't need it; see the
2084              comment below.  */
2085         }
2086       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
2087         {
2088           if (s->size != 0)
2089             relocs = TRUE;
2090
2091           /* We use the reloc_count field as a counter if we need
2092              to copy relocs into the output file.  */
2093           s->reloc_count = 0;
2094         }
2095       else
2096         {
2097           /* It's not one of our sections, so don't allocate space.  */
2098           continue;
2099         }
2100
2101       if (s->size == 0)
2102         {
2103           /* If we don't need this section, strip it from the
2104              output file.  This is to handle .rela.bss and
2105              .rela.plt.  We must create it in
2106              create_dynamic_sections, because it must be created
2107              before the linker maps input sections to output
2108              sections.  The linker does that before
2109              adjust_dynamic_symbol is called, and it is that
2110              function which decides whether anything needs to go
2111              into these sections.  */
2112
2113           s->flags |= SEC_EXCLUDE;
2114           continue;
2115         }
2116
2117       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2118         continue;
2119
2120       /* Allocate memory for the section contents.  We use bfd_zalloc
2121          here in case unused entries are not reclaimed before the
2122          section's contents are written out.  This should not happen,
2123          but this way if it does, we get a R_390_NONE reloc instead
2124          of garbage.  */
2125       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2126       if (s->contents == NULL)
2127         return FALSE;
2128     }
2129
2130   if (htab->elf.dynamic_sections_created)
2131     {
2132       /* Add some entries to the .dynamic section.  We fill in the
2133          values later, in elf_s390_finish_dynamic_sections, but we
2134          must add the entries now so that we get the correct size for
2135          the .dynamic section.  The DT_DEBUG entry is filled in by the
2136          dynamic linker and used by the debugger.  */
2137 #define add_dynamic_entry(TAG, VAL) \
2138   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2139
2140       if (info->executable)
2141         {
2142           if (!add_dynamic_entry (DT_DEBUG, 0))
2143             return FALSE;
2144         }
2145
2146       if (htab->splt->size != 0)
2147         {
2148           if (!add_dynamic_entry (DT_PLTGOT, 0)
2149               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2150               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2151               || !add_dynamic_entry (DT_JMPREL, 0))
2152             return FALSE;
2153         }
2154
2155       if (relocs)
2156         {
2157           if (!add_dynamic_entry (DT_RELA, 0)
2158               || !add_dynamic_entry (DT_RELASZ, 0)
2159               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2160             return FALSE;
2161
2162           /* If any dynamic relocs apply to a read-only section,
2163              then we need a DT_TEXTREL entry.  */
2164           if ((info->flags & DF_TEXTREL) == 0)
2165             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2166                                     (PTR) info);
2167
2168           if ((info->flags & DF_TEXTREL) != 0)
2169             {
2170               if (!add_dynamic_entry (DT_TEXTREL, 0))
2171                 return FALSE;
2172             }
2173         }
2174     }
2175 #undef add_dynamic_entry
2176
2177   return TRUE;
2178 }
2179
2180 /* Return the base VMA address which should be subtracted from real addresses
2181    when resolving @dtpoff relocation.
2182    This is PT_TLS segment p_vaddr.  */
2183
2184 static bfd_vma
2185 dtpoff_base (info)
2186      struct bfd_link_info *info;
2187 {
2188   /* If tls_sec is NULL, we should have signalled an error already.  */
2189   if (elf_hash_table (info)->tls_sec == NULL)
2190     return 0;
2191   return elf_hash_table (info)->tls_sec->vma;
2192 }
2193
2194 /* Return the relocation value for @tpoff relocation
2195    if STT_TLS virtual address is ADDRESS.  */
2196
2197 static bfd_vma
2198 tpoff (info, address)
2199      struct bfd_link_info *info;
2200      bfd_vma address;
2201 {
2202   struct elf_link_hash_table *htab = elf_hash_table (info);
2203
2204   /* If tls_sec is NULL, we should have signalled an error already.  */
2205   if (htab->tls_sec == NULL)
2206     return 0;
2207   return htab->tls_size + htab->tls_sec->vma - address;
2208 }
2209
2210 /* Complain if TLS instruction relocation is against an invalid
2211    instruction.  */
2212
2213 static void
2214 invalid_tls_insn (input_bfd, input_section, rel)
2215      bfd *input_bfd;
2216      asection *input_section;
2217      Elf_Internal_Rela *rel;
2218 {
2219   reloc_howto_type *howto;
2220
2221   howto = elf_howto_table + ELF32_R_TYPE (rel->r_info);
2222   (*_bfd_error_handler)
2223     (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"),
2224      input_bfd,
2225      input_section,
2226      (long) rel->r_offset,
2227      howto->name);
2228   bfd_set_error (bfd_error_bad_value);
2229 }
2230
2231 /* Relocate a 390 ELF section.  */
2232
2233 static bfd_boolean
2234 elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
2235                               contents, relocs, local_syms, local_sections)
2236      bfd *output_bfd;
2237      struct bfd_link_info *info;
2238      bfd *input_bfd;
2239      asection *input_section;
2240      bfd_byte *contents;
2241      Elf_Internal_Rela *relocs;
2242      Elf_Internal_Sym *local_syms;
2243      asection **local_sections;
2244 {
2245   struct elf_s390_link_hash_table *htab;
2246   Elf_Internal_Shdr *symtab_hdr;
2247   struct elf_link_hash_entry **sym_hashes;
2248   bfd_vma *local_got_offsets;
2249   Elf_Internal_Rela *rel;
2250   Elf_Internal_Rela *relend;
2251
2252   BFD_ASSERT (is_s390_elf (input_bfd));
2253
2254   htab = elf_s390_hash_table (info);
2255   symtab_hdr = &elf_symtab_hdr (input_bfd);
2256   sym_hashes = elf_sym_hashes (input_bfd);
2257   local_got_offsets = elf_local_got_offsets (input_bfd);
2258
2259   rel = relocs;
2260   relend = relocs + input_section->reloc_count;
2261   for (; rel < relend; rel++)
2262     {
2263       unsigned int r_type;
2264       reloc_howto_type *howto;
2265       unsigned long r_symndx;
2266       struct elf_link_hash_entry *h;
2267       Elf_Internal_Sym *sym;
2268       asection *sec;
2269       bfd_vma off;
2270       bfd_vma relocation;
2271       bfd_boolean unresolved_reloc;
2272       bfd_reloc_status_type r;
2273       int tls_type;
2274
2275       r_type = ELF32_R_TYPE (rel->r_info);
2276       if (r_type == (int) R_390_GNU_VTINHERIT
2277           || r_type == (int) R_390_GNU_VTENTRY)
2278         continue;
2279       if (r_type >= (int) R_390_max)
2280         {
2281           bfd_set_error (bfd_error_bad_value);
2282           return FALSE;
2283         }
2284
2285       howto = elf_howto_table + r_type;
2286       r_symndx = ELF32_R_SYM (rel->r_info);
2287
2288       h = NULL;
2289       sym = NULL;
2290       sec = NULL;
2291       unresolved_reloc = FALSE;
2292       if (r_symndx < symtab_hdr->sh_info)
2293         {
2294           sym = local_syms + r_symndx;
2295           sec = local_sections[r_symndx];
2296           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2297         }
2298       else
2299         {
2300           bfd_boolean warned ATTRIBUTE_UNUSED;
2301
2302           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2303                                    r_symndx, symtab_hdr, sym_hashes,
2304                                    h, sec, relocation,
2305                                    unresolved_reloc, warned);
2306         }
2307
2308       if (sec != NULL && elf_discarded_section (sec))
2309         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2310                                          rel, relend, howto, contents);
2311
2312       if (info->relocatable)
2313         continue;
2314
2315       switch (r_type)
2316         {
2317         case R_390_GOTPLT12:
2318         case R_390_GOTPLT16:
2319         case R_390_GOTPLT20:
2320         case R_390_GOTPLT32:
2321         case R_390_GOTPLTENT:
2322           /* There are three cases for a GOTPLT relocation. 1) The
2323              relocation is against the jump slot entry of a plt that
2324              will get emitted to the output file. 2) The relocation
2325              is against the jump slot of a plt entry that has been
2326              removed. elf_s390_adjust_gotplt has created a GOT entry
2327              as replacement. 3) The relocation is against a local symbol.
2328              Cases 2) and 3) are the same as the GOT relocation code
2329              so we just have to test for case 1 and fall through for
2330              the other two.  */
2331           if (h != NULL && h->plt.offset != (bfd_vma) -1)
2332             {
2333               bfd_vma plt_index;
2334
2335               /* Calc. index no.
2336                  Current offset - size first entry / entry size.  */
2337               plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
2338                 PLT_ENTRY_SIZE;
2339
2340               /* Offset in GOT is PLT index plus GOT headers(3) times 4,
2341                  addr & GOT addr.  */
2342               relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
2343               unresolved_reloc = FALSE;
2344
2345               if (r_type == R_390_GOTPLTENT)
2346                 relocation += htab->sgot->output_section->vma;
2347               break;
2348             }
2349           /* Fall through.  */
2350
2351         case R_390_GOT12:
2352         case R_390_GOT16:
2353         case R_390_GOT20:
2354         case R_390_GOT32:
2355         case R_390_GOTENT:
2356           /* Relocation is to the entry for this symbol in the global
2357              offset table.  */
2358           if (htab->sgot == NULL)
2359             abort ();
2360
2361           if (h != NULL)
2362             {
2363               bfd_boolean dyn;
2364
2365               off = h->got.offset;
2366               dyn = htab->elf.dynamic_sections_created;
2367               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2368                   || (info->shared
2369                       && SYMBOL_REFERENCES_LOCAL (info, h))
2370                   || (ELF_ST_VISIBILITY (h->other)
2371                       && h->root.type == bfd_link_hash_undefweak))
2372                 {
2373                   /* This is actually a static link, or it is a
2374                      -Bsymbolic link and the symbol is defined
2375                      locally, or the symbol was forced to be local
2376                      because of a version file.  We must initialize
2377                      this entry in the global offset table.  Since the
2378                      offset must always be a multiple of 2, we use the
2379                      least significant bit to record whether we have
2380                      initialized it already.
2381
2382                      When doing a dynamic link, we create a .rel.got
2383                      relocation entry to initialize the value.  This
2384                      is done in the finish_dynamic_symbol routine.  */
2385                   if ((off & 1) != 0)
2386                     off &= ~1;
2387                   else
2388                     {
2389                       bfd_put_32 (output_bfd, relocation,
2390                                   htab->sgot->contents + off);
2391                       h->got.offset |= 1;
2392                     }
2393                 }
2394               else
2395                 unresolved_reloc = FALSE;
2396             }
2397           else
2398             {
2399               if (local_got_offsets == NULL)
2400                 abort ();
2401
2402               off = local_got_offsets[r_symndx];
2403
2404               /* The offset must always be a multiple of 4.  We use
2405                  the least significant bit to record whether we have
2406                  already generated the necessary reloc.  */
2407               if ((off & 1) != 0)
2408                 off &= ~1;
2409               else
2410                 {
2411                   bfd_put_32 (output_bfd, relocation,
2412                               htab->sgot->contents + off);
2413
2414                   if (info->shared)
2415                     {
2416                       asection *srelgot;
2417                       Elf_Internal_Rela outrel;
2418                       bfd_byte *loc;
2419
2420                       srelgot = htab->srelgot;
2421                       if (srelgot == NULL)
2422                         abort ();
2423
2424                       outrel.r_offset = (htab->sgot->output_section->vma
2425                                          + htab->sgot->output_offset
2426                                          + off);
2427                       outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
2428                       outrel.r_addend = relocation;
2429                       loc = srelgot->contents;
2430                       loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
2431                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2432                     }
2433
2434                   local_got_offsets[r_symndx] |= 1;
2435                 }
2436             }
2437
2438           if (off >= (bfd_vma) -2)
2439             abort ();
2440
2441           relocation = htab->sgot->output_offset + off;
2442
2443           /* For @GOTENT the relocation is against the offset between
2444              the instruction and the symbols entry in the GOT and not
2445              between the start of the GOT and the symbols entry. We
2446              add the vma of the GOT to get the correct value.  */
2447           if (   r_type == R_390_GOTENT
2448               || r_type == R_390_GOTPLTENT)
2449             relocation += htab->sgot->output_section->vma;
2450
2451           break;
2452
2453         case R_390_GOTOFF16:
2454         case R_390_GOTOFF32:
2455           /* Relocation is relative to the start of the global offset
2456              table.  */
2457
2458           /* Note that sgot->output_offset is not involved in this
2459              calculation.  We always want the start of .got.  If we
2460              defined _GLOBAL_OFFSET_TABLE in a different way, as is
2461              permitted by the ABI, we might have to change this
2462              calculation.  */
2463           relocation -= htab->sgot->output_section->vma;
2464           break;
2465
2466         case R_390_GOTPC:
2467         case R_390_GOTPCDBL:
2468           /* Use global offset table as symbol value.  */
2469           relocation = htab->sgot->output_section->vma;
2470           unresolved_reloc = FALSE;
2471           break;
2472
2473         case R_390_PLT16DBL:
2474         case R_390_PLT32DBL:
2475         case R_390_PLT32:
2476           /* Relocation is to the entry for this symbol in the
2477              procedure linkage table.  */
2478
2479           /* Resolve a PLT32 reloc against a local symbol directly,
2480              without using the procedure linkage table.  */
2481           if (h == NULL)
2482             break;
2483
2484           if (h->plt.offset == (bfd_vma) -1
2485               || htab->splt == NULL)
2486             {
2487               /* We didn't make a PLT entry for this symbol.  This
2488                  happens when statically linking PIC code, or when
2489                  using -Bsymbolic.  */
2490               break;
2491             }
2492
2493           relocation = (htab->splt->output_section->vma
2494                         + htab->splt->output_offset
2495                         + h->plt.offset);
2496           unresolved_reloc = FALSE;
2497           break;
2498
2499         case R_390_PLTOFF16:
2500         case R_390_PLTOFF32:
2501           /* Relocation is to the entry for this symbol in the
2502              procedure linkage table relative to the start of the GOT.  */
2503
2504           /* For local symbols or if we didn't make a PLT entry for
2505              this symbol resolve the symbol directly.  */
2506           if (   h == NULL
2507               || h->plt.offset == (bfd_vma) -1
2508               || htab->splt == NULL)
2509             {
2510               relocation -= htab->sgot->output_section->vma;
2511               break;
2512             }
2513
2514           relocation = (htab->splt->output_section->vma
2515                         + htab->splt->output_offset
2516                         + h->plt.offset
2517                         - htab->sgot->output_section->vma);
2518           unresolved_reloc = FALSE;
2519           break;
2520
2521         case R_390_8:
2522         case R_390_16:
2523         case R_390_32:
2524         case R_390_PC16:
2525         case R_390_PC16DBL:
2526         case R_390_PC32DBL:
2527         case R_390_PC32:
2528           if ((input_section->flags & SEC_ALLOC) == 0)
2529             break;
2530
2531           if ((info->shared
2532                && (h == NULL
2533                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2534                    || h->root.type != bfd_link_hash_undefweak)
2535                && ((r_type != R_390_PC16
2536                     && r_type != R_390_PC16DBL
2537                     && r_type != R_390_PC32DBL
2538                     && r_type != R_390_PC32)
2539                    || !SYMBOL_CALLS_LOCAL (info, h)))
2540               || (ELIMINATE_COPY_RELOCS
2541                   && !info->shared
2542                   && h != NULL
2543                   && h->dynindx != -1
2544                   && !h->non_got_ref
2545                   && ((h->def_dynamic
2546                        && !h->def_regular)
2547                       || h->root.type == bfd_link_hash_undefweak
2548                       || h->root.type == bfd_link_hash_undefined)))
2549             {
2550               Elf_Internal_Rela outrel;
2551               bfd_boolean skip, relocate;
2552               asection *sreloc;
2553               bfd_byte *loc;
2554
2555               /* When generating a shared object, these relocations
2556                  are copied into the output file to be resolved at run
2557                  time.  */
2558
2559               skip = FALSE;
2560               relocate = FALSE;
2561
2562               outrel.r_offset =
2563                 _bfd_elf_section_offset (output_bfd, info, input_section,
2564                                          rel->r_offset);
2565               if (outrel.r_offset == (bfd_vma) -1)
2566                 skip = TRUE;
2567               else if (outrel.r_offset == (bfd_vma) -2)
2568                 skip = TRUE, relocate = TRUE;
2569               outrel.r_offset += (input_section->output_section->vma
2570                                   + input_section->output_offset);
2571
2572               if (skip)
2573                 memset (&outrel, 0, sizeof outrel);
2574               else if (h != NULL
2575                        && h->dynindx != -1
2576                        && (r_type == R_390_PC16
2577                            || r_type == R_390_PC16DBL
2578                            || r_type == R_390_PC32DBL
2579                            || r_type == R_390_PC32
2580                            || !info->shared
2581                            || !SYMBOLIC_BIND (info, h)
2582                            || !h->def_regular))
2583                 {
2584                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2585                   outrel.r_addend = rel->r_addend;
2586                 }
2587               else
2588                 {
2589                   /* This symbol is local, or marked to become local.  */
2590                   outrel.r_addend = relocation + rel->r_addend;
2591                   if (r_type == R_390_32)
2592                     {
2593                       relocate = TRUE;
2594                       outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
2595                     }
2596                   else
2597                     {
2598                       long sindx;
2599
2600                       if (bfd_is_abs_section (sec))
2601                         sindx = 0;
2602                       else if (sec == NULL || sec->owner == NULL)
2603                         {
2604                           bfd_set_error(bfd_error_bad_value);
2605                           return FALSE;
2606                         }
2607                       else
2608                         {
2609                           asection *osec;
2610
2611                           osec = sec->output_section;
2612                           sindx = elf_section_data (osec)->dynindx;
2613                           if (sindx == 0)
2614                             {
2615                               osec = htab->elf.text_index_section;
2616                               sindx = elf_section_data (osec)->dynindx;
2617                             }
2618                           BFD_ASSERT (sindx != 0);
2619
2620                           /* We are turning this relocation into one
2621                              against a section symbol, so subtract out
2622                              the output section's address but not the
2623                              offset of the input section in the output
2624                              section.  */
2625                           outrel.r_addend -= osec->vma;
2626                         }
2627                       outrel.r_info = ELF32_R_INFO (sindx, r_type);
2628                     }
2629                 }
2630
2631               sreloc = elf_section_data (input_section)->sreloc;
2632               if (sreloc == NULL)
2633                 abort ();
2634
2635               loc = sreloc->contents;
2636               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2637               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2638
2639               /* If this reloc is against an external symbol, we do
2640                  not want to fiddle with the addend.  Otherwise, we
2641                  need to include the symbol value so that it becomes
2642                  an addend for the dynamic reloc.  */
2643               if (! relocate)
2644                 continue;
2645             }
2646           break;
2647
2648           /* Relocations for tls literal pool entries.  */
2649         case R_390_TLS_IE32:
2650           if (info->shared)
2651             {
2652               Elf_Internal_Rela outrel;
2653               asection *sreloc;
2654               bfd_byte *loc;
2655
2656               outrel.r_offset = rel->r_offset
2657                                 + input_section->output_section->vma
2658                                 + input_section->output_offset;
2659               outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
2660               sreloc = elf_section_data (input_section)->sreloc;
2661               if (sreloc == NULL)
2662                 abort ();
2663               loc = sreloc->contents;
2664               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2665               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2666             }
2667           /* Fall through.  */
2668
2669         case R_390_TLS_GD32:
2670         case R_390_TLS_GOTIE32:
2671           r_type = elf_s390_tls_transition (info, r_type, h == NULL);
2672           tls_type = GOT_UNKNOWN;
2673           if (h == NULL && local_got_offsets)
2674             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2675           else if (h != NULL)
2676             {
2677               tls_type = elf_s390_hash_entry(h)->tls_type;
2678               if (!info->shared && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
2679                 r_type = R_390_TLS_LE32;
2680             }
2681           if (r_type == R_390_TLS_GD32 && tls_type >= GOT_TLS_IE)
2682             r_type = R_390_TLS_IE32;
2683
2684           if (r_type == R_390_TLS_LE32)
2685             {
2686               /* This relocation gets optimized away by the local exec
2687                  access optimization.  */
2688               BFD_ASSERT (! unresolved_reloc);
2689               bfd_put_32 (output_bfd, -tpoff (info, relocation),
2690                           contents + rel->r_offset);
2691               continue;
2692             }
2693
2694           if (htab->sgot == NULL)
2695             abort ();
2696
2697           if (h != NULL)
2698             off = h->got.offset;
2699           else
2700             {
2701               if (local_got_offsets == NULL)
2702                 abort ();
2703
2704               off = local_got_offsets[r_symndx];
2705             }
2706
2707         emit_tls_relocs:
2708
2709           if ((off & 1) != 0)
2710             off &= ~1;
2711           else
2712             {
2713               Elf_Internal_Rela outrel;
2714               bfd_byte *loc;
2715               int dr_type, indx;
2716
2717               if (htab->srelgot == NULL)
2718                 abort ();
2719
2720               outrel.r_offset = (htab->sgot->output_section->vma
2721                                  + htab->sgot->output_offset + off);
2722
2723               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2724               if (r_type == R_390_TLS_GD32)
2725                 dr_type = R_390_TLS_DTPMOD;
2726               else
2727                 dr_type = R_390_TLS_TPOFF;
2728               if (dr_type == R_390_TLS_TPOFF && indx == 0)
2729                 outrel.r_addend = relocation - dtpoff_base (info);
2730               else
2731                 outrel.r_addend = 0;
2732               outrel.r_info = ELF32_R_INFO (indx, dr_type);
2733               loc = htab->srelgot->contents;
2734               loc += htab->srelgot->reloc_count++
2735                 * sizeof (Elf32_External_Rela);
2736               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2737
2738               if (r_type == R_390_TLS_GD32)
2739                 {
2740                   if (indx == 0)
2741                     {
2742                       BFD_ASSERT (! unresolved_reloc);
2743                       bfd_put_32 (output_bfd,
2744                                   relocation - dtpoff_base (info),
2745                                   htab->sgot->contents + off + GOT_ENTRY_SIZE);
2746                     }
2747                   else
2748                     {
2749                       outrel.r_info = ELF32_R_INFO (indx, R_390_TLS_DTPOFF);
2750                       outrel.r_offset += GOT_ENTRY_SIZE;
2751                       outrel.r_addend = 0;
2752                       htab->srelgot->reloc_count++;
2753                       loc += sizeof (Elf32_External_Rela);
2754                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2755                     }
2756                 }
2757
2758               if (h != NULL)
2759                 h->got.offset |= 1;
2760               else
2761                 local_got_offsets[r_symndx] |= 1;
2762             }
2763
2764           if (off >= (bfd_vma) -2)
2765             abort ();
2766           if (r_type == ELF32_R_TYPE (rel->r_info))
2767             {
2768               relocation = htab->sgot->output_offset + off;
2769               if (r_type == R_390_TLS_IE32 || r_type == R_390_TLS_IEENT)
2770                 relocation += htab->sgot->output_section->vma;
2771               unresolved_reloc = FALSE;
2772             }
2773           else
2774             {
2775               bfd_put_32 (output_bfd, htab->sgot->output_offset + off,
2776                           contents + rel->r_offset);
2777               continue;
2778             }
2779           break;
2780
2781         case R_390_TLS_GOTIE12:
2782         case R_390_TLS_GOTIE20:
2783         case R_390_TLS_IEENT:
2784           if (h == NULL)
2785             {
2786               if (local_got_offsets == NULL)
2787                 abort();
2788               off = local_got_offsets[r_symndx];
2789               if (info->shared)
2790                 goto emit_tls_relocs;
2791             }
2792           else
2793             {
2794               off = h->got.offset;
2795               tls_type = elf_s390_hash_entry(h)->tls_type;
2796               if (info->shared || h->dynindx != -1 || tls_type < GOT_TLS_IE)
2797                 goto emit_tls_relocs;
2798             }
2799
2800           if (htab->sgot == NULL)
2801             abort ();
2802
2803           BFD_ASSERT (! unresolved_reloc);
2804           bfd_put_32 (output_bfd, -tpoff (info, relocation),
2805                       htab->sgot->contents + off);
2806           relocation = htab->sgot->output_offset + off;
2807           if (r_type == R_390_TLS_IEENT)
2808             relocation += htab->sgot->output_section->vma;
2809           unresolved_reloc = FALSE;
2810           break;
2811
2812         case R_390_TLS_LDM32:
2813           if (! info->shared)
2814             /* The literal pool entry this relocation refers to gets ignored
2815                by the optimized code of the local exec model. Do nothing
2816                and the value will turn out zero.  */
2817             continue;
2818
2819           if (htab->sgot == NULL)
2820             abort ();
2821
2822           off = htab->tls_ldm_got.offset;
2823           if (off & 1)
2824             off &= ~1;
2825           else
2826             {
2827               Elf_Internal_Rela outrel;
2828               bfd_byte *loc;
2829
2830               if (htab->srelgot == NULL)
2831                 abort ();
2832
2833               outrel.r_offset = (htab->sgot->output_section->vma
2834                                  + htab->sgot->output_offset + off);
2835
2836               bfd_put_32 (output_bfd, 0,
2837                           htab->sgot->contents + off + GOT_ENTRY_SIZE);
2838               outrel.r_info = ELF32_R_INFO (0, R_390_TLS_DTPMOD);
2839               outrel.r_addend = 0;
2840               loc = htab->srelgot->contents;
2841               loc += htab->srelgot->reloc_count++
2842                 * sizeof (Elf32_External_Rela);
2843               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2844               htab->tls_ldm_got.offset |= 1;
2845             }
2846           relocation = htab->sgot->output_offset + off;
2847           unresolved_reloc = FALSE;
2848           break;
2849
2850         case R_390_TLS_LE32:
2851           if (info->shared)
2852             {
2853               /* Linking a shared library with non-fpic code requires
2854                  a R_390_TLS_TPOFF relocation.  */
2855               Elf_Internal_Rela outrel;
2856               asection *sreloc;
2857               bfd_byte *loc;
2858               int indx;
2859
2860               outrel.r_offset = rel->r_offset
2861                                 + input_section->output_section->vma
2862                                 + input_section->output_offset;
2863               if (h != NULL && h->dynindx != -1)
2864                 indx = h->dynindx;
2865               else
2866                 indx = 0;
2867               outrel.r_info = ELF32_R_INFO (indx, R_390_TLS_TPOFF);
2868               if (indx == 0)
2869                 outrel.r_addend = relocation - dtpoff_base (info);
2870               else
2871                 outrel.r_addend = 0;
2872               sreloc = elf_section_data (input_section)->sreloc;
2873               if (sreloc == NULL)
2874                 abort ();
2875               loc = sreloc->contents;
2876               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2877               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2878             }
2879           else
2880             {
2881               BFD_ASSERT (! unresolved_reloc);
2882               bfd_put_32 (output_bfd, -tpoff (info, relocation),
2883                           contents + rel->r_offset);
2884             }
2885           continue;
2886
2887         case R_390_TLS_LDO32:
2888           if (info->shared || (input_section->flags & SEC_DEBUGGING))
2889             relocation -= dtpoff_base (info);
2890           else
2891             /* When converting LDO to LE, we must negate.  */
2892             relocation = -tpoff (info, relocation);
2893           break;
2894
2895           /* Relocations for tls instructions.  */
2896         case R_390_TLS_LOAD:
2897         case R_390_TLS_GDCALL:
2898         case R_390_TLS_LDCALL:
2899           tls_type = GOT_UNKNOWN;
2900           if (h == NULL && local_got_offsets)
2901             tls_type = elf_s390_local_got_tls_type (input_bfd) [r_symndx];
2902           else if (h != NULL)
2903             tls_type = elf_s390_hash_entry(h)->tls_type;
2904
2905           if (tls_type == GOT_TLS_GD)
2906             continue;
2907
2908           if (r_type == R_390_TLS_LOAD)
2909             {
2910               if (!info->shared && (h == NULL || h->dynindx == -1))
2911                 {
2912                   /* IE->LE transition. Four valid cases:
2913                      l %rx,0(0,%ry)    -> lr %rx,%ry + bcr 0,0
2914                      l %rx,0(%ry,0)    -> lr %rx,%ry + bcr 0,0
2915                      l %rx,0(%ry,%r12) -> lr %rx,%ry + bcr 0,0
2916                      l %rx,0(%r12,%ry) -> lr %rx,%ry + bcr 0,0 */
2917                   unsigned int insn, ry;
2918
2919                   insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2920                   ry = 0;
2921                   if ((insn & 0xff00f000) == 0x58000000)
2922                     /* l %rx,0(%ry,0) -> lr %rx,%ry + bcr 0,0  */
2923                     ry = (insn & 0x000f0000);
2924                   else if ((insn & 0xff0f0000) == 0x58000000)
2925                     /* l %rx,0(0,%ry) -> lr %rx,%ry + bcr 0,0  */
2926                     ry = (insn & 0x0000f000) << 4;
2927                   else if ((insn & 0xff00f000) == 0x5800c000)
2928                     /* l %rx,0(%ry,%r12) -> lr %rx,%ry + bcr 0,0  */
2929                     ry = (insn & 0x000f0000);
2930                   else if ((insn & 0xff0f0000) == 0x580c0000)
2931                     /* l %rx,0(%r12,%ry) -> lr %rx,%ry + bcr 0,0  */
2932                     ry = (insn & 0x0000f000) << 4;
2933                   else
2934                     invalid_tls_insn (input_bfd, input_section, rel);
2935                   insn = 0x18000700 | (insn & 0x00f00000) | ry;
2936                   bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
2937                 }
2938             }
2939           else if (r_type == R_390_TLS_GDCALL)
2940             {
2941               unsigned int insn;
2942
2943               insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2944               if ((insn & 0xff000fff) != 0x4d000000 &&
2945                   (insn & 0xffff0000) != 0xc0e50000 &&
2946                   (insn & 0xff000000) != 0x0d000000)
2947                 invalid_tls_insn (input_bfd, input_section, rel);
2948               if (!info->shared && (h == NULL || h->dynindx == -1))
2949                 {
2950                   if ((insn & 0xff000000) == 0x0d000000)
2951                     {
2952                       /* GD->LE transition.
2953                          basr rx, ry -> nopr r7 */
2954                       insn = 0x07070000 | (insn & 0xffff);
2955                     }
2956                   else if ((insn & 0xff000000) == 0x4d000000)
2957                     {
2958                       /* GD->LE transition.
2959                          bas %r14,0(%rx,%r13) -> bc 0,0  */
2960                       insn = 0x47000000;
2961                     }
2962                   else
2963                     {
2964                       /* GD->LE transition.
2965                          brasl %r14,_tls_get_offset@plt -> brcl 0,.  */
2966                       insn = 0xc0040000;
2967                       bfd_put_16 (output_bfd, 0x0000,
2968                                   contents + rel->r_offset + 4);
2969                     }
2970                 }
2971               else
2972                 {
2973                   /* If basr is used in the pic case to invoke
2974                      _tls_get_offset, something went wrong before.  */
2975                   if ((insn & 0xff000000) == 0x0d000000)
2976                     invalid_tls_insn (input_bfd, input_section, rel);
2977
2978                   if ((insn & 0xff000000) == 0x4d000000)
2979                     {
2980                       /* GD->IE transition.
2981                          bas %r14,0(%rx,%r13) -> l %r2,0(%r2,%r12)  */
2982                       insn = 0x5822c000;
2983                     }
2984                   else
2985                     {
2986                       /* GD->IE transition.
2987                          brasl %r14,__tls_get_addr@plt ->
2988                                 l %r2,0(%r2,%r12) ; bcr 0,0 */
2989                       insn = 0x5822c000;
2990                       bfd_put_16 (output_bfd, 0x0700,
2991                                   contents + rel->r_offset + 4);
2992                     }
2993                 }
2994               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
2995             }
2996           else if (r_type == R_390_TLS_LDCALL)
2997             {
2998               if (!info->shared)
2999                 {
3000                   unsigned int insn;
3001
3002                   insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3003                   if ((insn & 0xff000fff) != 0x4d000000 &&
3004                       (insn & 0xffff0000) != 0xc0e50000 &&
3005                       (insn & 0xff000000) != 0x0d000000)
3006                     invalid_tls_insn (input_bfd, input_section, rel);
3007
3008                   if ((insn & 0xff000000) == 0x0d000000)
3009                     {
3010                       /* LD->LE transition.
3011                          basr rx, ry -> nopr r7 */
3012                       insn = 0x07070000 | (insn & 0xffff);
3013                     }
3014                   else if ((insn & 0xff000000) == 0x4d000000)
3015                     {
3016                       /* LD->LE transition.
3017                          bas %r14,0(%rx,%r13) -> bc 0,0  */
3018                       insn = 0x47000000;
3019                     }
3020                   else
3021                     {
3022                       /* LD->LE transition.
3023                          brasl %r14,__tls_get_offset@plt -> brcl 0,. */
3024                       insn = 0xc0040000;
3025                       bfd_put_16 (output_bfd, 0x0000,
3026                                   contents + rel->r_offset + 4);
3027                     }
3028                   bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3029                 }
3030             }
3031           continue;
3032
3033         default:
3034           break;
3035         }
3036
3037       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3038          because such sections are not SEC_ALLOC and thus ld.so will
3039          not process them.  */
3040       if (unresolved_reloc
3041           && !((input_section->flags & SEC_DEBUGGING) != 0
3042                && h->def_dynamic)
3043           && _bfd_elf_section_offset (output_bfd, info, input_section,
3044                                       rel->r_offset) != (bfd_vma) -1)
3045         (*_bfd_error_handler)
3046           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3047            input_bfd,
3048            input_section,
3049            (long) rel->r_offset,
3050            howto->name,
3051            h->root.root.string);
3052
3053       if (r_type == R_390_20
3054           || r_type == R_390_GOT20
3055           || r_type == R_390_GOTPLT20
3056           || r_type == R_390_TLS_GOTIE20)
3057         {
3058           relocation += rel->r_addend;
3059           relocation = (relocation&0xfff) << 8 | (relocation&0xff000) >> 12;
3060           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3061                                         contents, rel->r_offset,
3062                                         relocation, 0);
3063         }
3064       else
3065         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3066                                       contents, rel->r_offset,
3067                                       relocation, rel->r_addend);
3068
3069       if (r != bfd_reloc_ok)
3070         {
3071           const char *name;
3072
3073           if (h != NULL)
3074             name = h->root.root.string;
3075           else
3076             {
3077               name = bfd_elf_string_from_elf_section (input_bfd,
3078                                                       symtab_hdr->sh_link,
3079                                                       sym->st_name);
3080               if (name == NULL)
3081                 return FALSE;
3082               if (*name == '\0')
3083                 name = bfd_section_name (input_bfd, sec);
3084             }
3085
3086           if (r == bfd_reloc_overflow)
3087             {
3088
3089               if (! ((*info->callbacks->reloc_overflow)
3090                      (info, (h ? &h->root : NULL), name, howto->name,
3091                       (bfd_vma) 0, input_bfd, input_section,
3092                       rel->r_offset)))
3093                 return FALSE;
3094             }
3095           else
3096             {
3097               (*_bfd_error_handler)
3098                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3099                  input_bfd, input_section,
3100                  (long) rel->r_offset, name, (int) r);
3101               return FALSE;
3102             }
3103         }
3104     }
3105
3106   return TRUE;
3107 }
3108
3109 /* Finish up dynamic symbol handling.  We set the contents of various
3110    dynamic sections here.  */
3111
3112 static bfd_boolean
3113 elf_s390_finish_dynamic_symbol (output_bfd, info, h, sym)
3114      bfd *output_bfd;
3115      struct bfd_link_info *info;
3116      struct elf_link_hash_entry *h;
3117      Elf_Internal_Sym *sym;
3118 {
3119   struct elf_s390_link_hash_table *htab;
3120
3121   htab = elf_s390_hash_table (info);
3122
3123   if (h->plt.offset != (bfd_vma) -1)
3124     {
3125       bfd_vma plt_index;
3126       bfd_vma got_offset;
3127       Elf_Internal_Rela rela;
3128       bfd_byte *loc;
3129       bfd_vma relative_offset;
3130
3131       /* This symbol has an entry in the procedure linkage table.  Set
3132          it up.  */
3133       if (h->dynindx == -1
3134           || htab->splt == NULL
3135           || htab->sgotplt == NULL
3136           || htab->srelplt == NULL)
3137         abort ();
3138
3139       /* Calc. index no.
3140          Current offset - size first entry / entry size.  */
3141       plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3142
3143       /* Offset in GOT is PLT index plus GOT headers(3) times 4,
3144          addr & GOT addr.  */
3145       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
3146
3147       /* S390 uses halfwords for relative branch calc!  */
3148       relative_offset = - ((PLT_FIRST_ENTRY_SIZE +
3149                             (PLT_ENTRY_SIZE * plt_index) + 18) / 2);
3150       /* If offset is > 32768, branch to a previous branch
3151          390 can only handle +-64 K jumps.  */
3152       if ( -32768 > (int) relative_offset )
3153         relative_offset
3154           = -(unsigned) (((65536 / PLT_ENTRY_SIZE - 1) * PLT_ENTRY_SIZE) / 2);
3155
3156       /* Fill in the entry in the procedure linkage table.  */
3157       if (!info->shared)
3158         {
3159           memcpy (htab->splt->contents + h->plt.offset, elf_s390_plt_entry,
3160                   PLT_ENTRY_SIZE);
3161
3162           /* Adjust jump to the first plt entry.  */
3163           bfd_put_32 (output_bfd, (bfd_vma) 0+(relative_offset << 16),
3164                       htab->splt->contents + h->plt.offset + 20);
3165
3166           /* Push the GOT offset field.  */
3167           bfd_put_32 (output_bfd,
3168                       (htab->sgotplt->output_section->vma
3169                        + htab->sgotplt->output_offset
3170                        + got_offset),
3171                       htab->splt->contents + h->plt.offset + 24);
3172         }
3173       else if (got_offset < 4096)
3174         {
3175           /* The GOT offset is small enough to be used directly as
3176              displacement.  */
3177           memcpy (htab->splt->contents + h->plt.offset,
3178                   elf_s390_plt_pic12_entry,
3179                   PLT_ENTRY_SIZE);
3180
3181           /* Put in the GOT offset as displacement value.  The 0xc000
3182              value comes from the first word of the plt entry.  Look
3183              at the elf_s390_plt_pic16_entry content.  */
3184           bfd_put_16 (output_bfd, (bfd_vma)0xc000 | got_offset,
3185                       htab->splt->contents + h->plt.offset + 2);
3186
3187           /* Adjust the jump to the first plt entry.  */
3188           bfd_put_32 (output_bfd, (bfd_vma) 0+(relative_offset << 16),
3189                       htab->splt->contents + h->plt.offset + 20);
3190         }
3191       else if (got_offset < 32768)
3192         {
3193           /* The GOT offset is too big for a displacement but small
3194              enough to be a signed 16 bit immediate value as it can be
3195              used in an lhi instruction.  */
3196           memcpy (htab->splt->contents + h->plt.offset,
3197                   elf_s390_plt_pic16_entry,
3198                   PLT_ENTRY_SIZE);
3199
3200           /* Put in the GOT offset for the lhi instruction.  */
3201           bfd_put_16 (output_bfd, (bfd_vma)got_offset,
3202                       htab->splt->contents + h->plt.offset + 2);
3203
3204           /* Adjust the jump to the first plt entry.  */
3205           bfd_put_32 (output_bfd, (bfd_vma) 0+(relative_offset << 16),
3206                       htab->splt->contents + h->plt.offset + 20);
3207         }
3208       else
3209         {
3210           memcpy (htab->splt->contents + h->plt.offset,
3211                   elf_s390_plt_pic_entry,
3212                   PLT_ENTRY_SIZE);
3213
3214           /* Adjust the jump to the first plt entry.  */
3215           bfd_put_32 (output_bfd, (bfd_vma) 0+(relative_offset << 16),
3216                       htab->splt->contents + h->plt.offset + 20);
3217
3218           /* Push the GOT offset field.  */
3219           bfd_put_32 (output_bfd, got_offset,
3220                       htab->splt->contents + h->plt.offset + 24);
3221         }
3222       /* Insert offset into  reloc. table here.  */
3223       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
3224                   htab->splt->contents + h->plt.offset + 28);
3225
3226       /* Fill in the entry in the global offset table.
3227          Points to instruction after GOT offset.  */
3228       bfd_put_32 (output_bfd,
3229                   (htab->splt->output_section->vma
3230                    + htab->splt->output_offset
3231                    + h->plt.offset
3232                    + 12),
3233                   htab->sgotplt->contents + got_offset);
3234
3235       /* Fill in the entry in the .rela.plt section.  */
3236       rela.r_offset = (htab->sgotplt->output_section->vma
3237                        + htab->sgotplt->output_offset
3238                        + got_offset);
3239       rela.r_info = ELF32_R_INFO (h->dynindx, R_390_JMP_SLOT);
3240       rela.r_addend = 0;
3241       loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
3242       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3243
3244       if (!h->def_regular)
3245         {
3246           /* Mark the symbol as undefined, rather than as defined in
3247              the .plt section.  Leave the value alone.  This is a clue
3248              for the dynamic linker, to make function pointer
3249              comparisons work between an application and shared
3250              library.  */
3251           sym->st_shndx = SHN_UNDEF;
3252         }
3253     }
3254
3255   if (h->got.offset != (bfd_vma) -1
3256       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_GD
3257       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE
3258       && elf_s390_hash_entry(h)->tls_type != GOT_TLS_IE_NLT)
3259     {
3260       Elf_Internal_Rela rela;
3261       bfd_byte *loc;
3262
3263       /* This symbol has an entry in the global offset table.  Set it
3264          up.  */
3265
3266       if (htab->sgot == NULL || htab->srelgot == NULL)
3267         abort ();
3268
3269       rela.r_offset = (htab->sgot->output_section->vma
3270                        + htab->sgot->output_offset
3271                        + (h->got.offset &~ (bfd_vma) 1));
3272
3273       /* If this is a static link, or it is a -Bsymbolic link and the
3274          symbol is defined locally or was forced to be local because
3275          of a version file, we just want to emit a RELATIVE reloc.
3276          The entry in the global offset table will already have been
3277          initialized in the relocate_section function.  */
3278       if (info->shared
3279           && SYMBOL_REFERENCES_LOCAL (info, h))
3280         {
3281           if (!h->def_regular)
3282             return FALSE;
3283           BFD_ASSERT((h->got.offset & 1) != 0);
3284           rela.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
3285           rela.r_addend = (h->root.u.def.value
3286                            + h->root.u.def.section->output_section->vma
3287                            + h->root.u.def.section->output_offset);
3288         }
3289       else
3290         {
3291           BFD_ASSERT((h->got.offset & 1) == 0);
3292           bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgot->contents + h->got.offset);
3293           rela.r_info = ELF32_R_INFO (h->dynindx, R_390_GLOB_DAT);
3294           rela.r_addend = 0;
3295         }
3296
3297       loc = htab->srelgot->contents;
3298       loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
3299       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3300     }
3301
3302   if (h->needs_copy)
3303     {
3304       Elf_Internal_Rela rela;
3305       bfd_byte *loc;
3306
3307       /* This symbols needs a copy reloc.  Set it up.  */
3308
3309       if (h->dynindx == -1
3310           || (h->root.type != bfd_link_hash_defined
3311               && h->root.type != bfd_link_hash_defweak)
3312           || htab->srelbss == NULL)
3313         abort ();
3314
3315       rela.r_offset = (h->root.u.def.value
3316                        + h->root.u.def.section->output_section->vma
3317                        + h->root.u.def.section->output_offset);
3318       rela.r_info = ELF32_R_INFO (h->dynindx, R_390_COPY);
3319       rela.r_addend = 0;
3320       loc = htab->srelbss->contents;
3321       loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rela);
3322       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3323     }
3324
3325   /* Mark some specially defined symbols as absolute.  */
3326   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3327       || h == htab->elf.hgot
3328       || h == htab->elf.hplt)
3329     sym->st_shndx = SHN_ABS;
3330
3331   return TRUE;
3332 }
3333
3334 /* Used to decide how to sort relocs in an optimal manner for the
3335    dynamic linker, before writing them out.  */
3336
3337 static enum elf_reloc_type_class
3338 elf_s390_reloc_type_class (rela)
3339      const Elf_Internal_Rela *rela;
3340 {
3341   switch ((int) ELF32_R_TYPE (rela->r_info))
3342     {
3343     case R_390_RELATIVE:
3344       return reloc_class_relative;
3345     case R_390_JMP_SLOT:
3346       return reloc_class_plt;
3347     case R_390_COPY:
3348       return reloc_class_copy;
3349     default:
3350       return reloc_class_normal;
3351     }
3352 }
3353
3354 /* Finish up the dynamic sections.  */
3355
3356 static bfd_boolean
3357 elf_s390_finish_dynamic_sections (output_bfd, info)
3358      bfd *output_bfd;
3359      struct bfd_link_info *info;
3360 {
3361   struct elf_s390_link_hash_table *htab;
3362   bfd *dynobj;
3363   asection *sdyn;
3364
3365   htab = elf_s390_hash_table (info);
3366   dynobj = htab->elf.dynobj;
3367   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3368
3369   if (htab->elf.dynamic_sections_created)
3370     {
3371       Elf32_External_Dyn *dyncon, *dynconend;
3372
3373       if (sdyn == NULL || htab->sgot == NULL)
3374         abort ();
3375
3376       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3377       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3378       for (; dyncon < dynconend; dyncon++)
3379         {
3380           Elf_Internal_Dyn dyn;
3381           asection *s;
3382
3383           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3384
3385           switch (dyn.d_tag)
3386             {
3387             default:
3388               continue;
3389
3390             case DT_PLTGOT:
3391               dyn.d_un.d_ptr = htab->sgot->output_section->vma;
3392               break;
3393
3394             case DT_JMPREL:
3395               dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
3396               break;
3397
3398             case DT_PLTRELSZ:
3399               s = htab->srelplt->output_section;
3400               dyn.d_un.d_val = s->size;
3401               break;
3402             }
3403
3404           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3405         }
3406
3407       /* Fill in the special first entry in the procedure linkage table.  */
3408       if (htab->splt && htab->splt->size > 0)
3409         {
3410           memset (htab->splt->contents, 0, PLT_FIRST_ENTRY_SIZE);
3411           if (info->shared)
3412             {
3413               memcpy (htab->splt->contents, elf_s390_plt_pic_first_entry,
3414                       PLT_FIRST_ENTRY_SIZE);
3415             }
3416           else
3417             {
3418               memcpy (htab->splt->contents, elf_s390_plt_first_entry,
3419                       PLT_FIRST_ENTRY_SIZE);
3420               bfd_put_32 (output_bfd,
3421                           htab->sgotplt->output_section->vma
3422                           + htab->sgotplt->output_offset,
3423                           htab->splt->contents + 24);
3424            }
3425           elf_section_data (htab->splt->output_section)
3426             ->this_hdr.sh_entsize = 4;
3427         }
3428
3429     }
3430
3431   if (htab->sgotplt)
3432     {
3433       /* Fill in the first three entries in the global offset table.  */
3434       if (htab->sgotplt->size > 0)
3435         {
3436           bfd_put_32 (output_bfd,
3437                       (sdyn == NULL ? (bfd_vma) 0
3438                        : sdyn->output_section->vma + sdyn->output_offset),
3439                       htab->sgotplt->contents);
3440           /* One entry for shared object struct ptr.  */
3441           bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
3442           /* One entry for _dl_runtime_resolve.  */
3443           bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
3444         }
3445
3446       elf_section_data (htab->sgotplt->output_section)
3447         ->this_hdr.sh_entsize = 4;
3448     }
3449   return TRUE;
3450 }
3451
3452 static bfd_boolean
3453 elf_s390_grok_prstatus (abfd, note)
3454      bfd * abfd;
3455      Elf_Internal_Note * note;
3456 {
3457   int offset;
3458   unsigned int size;
3459
3460   switch (note->descsz)
3461     {
3462       default:
3463         return FALSE;
3464
3465       case 224:         /* S/390 Linux.  */
3466         /* pr_cursig */
3467         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3468
3469         /* pr_pid */
3470         elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
3471
3472         /* pr_reg */
3473         offset = 72;
3474         size = 144;
3475         break;
3476     }
3477
3478   /* Make a ".reg/999" section.  */
3479   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3480                                           size, note->descpos + offset);
3481 }
3482
3483 /* Return address for Ith PLT stub in section PLT, for relocation REL
3484    or (bfd_vma) -1 if it should not be included.  */
3485
3486 static bfd_vma
3487 elf_s390_plt_sym_val (bfd_vma i, const asection *plt,
3488                       const arelent *rel ATTRIBUTE_UNUSED)
3489 {
3490   return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE;
3491 }
3492
3493 static bfd_boolean
3494 elf32_s390_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3495 {
3496   elf_elfheader (obfd)->e_flags |= elf_elfheader (ibfd)->e_flags;
3497   return TRUE;
3498 }
3499
3500
3501 #define TARGET_BIG_SYM  bfd_elf32_s390_vec
3502 #define TARGET_BIG_NAME "elf32-s390"
3503 #define ELF_ARCH        bfd_arch_s390
3504 #define ELF_TARGET_ID   S390_ELF_DATA
3505 #define ELF_MACHINE_CODE EM_S390
3506 #define ELF_MACHINE_ALT1 EM_S390_OLD
3507 #define ELF_MAXPAGESIZE 0x1000
3508
3509 #define elf_backend_can_gc_sections     1
3510 #define elf_backend_can_refcount        1
3511 #define elf_backend_want_got_plt        1
3512 #define elf_backend_plt_readonly        1
3513 #define elf_backend_want_plt_sym        0
3514 #define elf_backend_got_header_size     12
3515 #define elf_backend_rela_normal         1
3516
3517 #define elf_info_to_howto                     elf_s390_info_to_howto
3518
3519 #define bfd_elf32_bfd_is_local_label_name     elf_s390_is_local_label_name
3520 #define bfd_elf32_bfd_link_hash_table_create  elf_s390_link_hash_table_create
3521 #define bfd_elf32_bfd_reloc_type_lookup       elf_s390_reloc_type_lookup
3522 #define bfd_elf32_bfd_reloc_name_lookup elf_s390_reloc_name_lookup
3523
3524 #define bfd_elf32_bfd_merge_private_bfd_data  elf32_s390_merge_private_bfd_data
3525
3526 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
3527 #define elf_backend_check_relocs              elf_s390_check_relocs
3528 #define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
3529 #define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
3530 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
3531 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
3532 #define elf_backend_gc_mark_hook              elf_s390_gc_mark_hook
3533 #define elf_backend_gc_sweep_hook             elf_s390_gc_sweep_hook
3534 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3535 #define elf_backend_relocate_section          elf_s390_relocate_section
3536 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
3537 #define elf_backend_init_index_section        _bfd_elf_init_1_index_section
3538 #define elf_backend_reloc_type_class          elf_s390_reloc_type_class
3539 #define elf_backend_grok_prstatus             elf_s390_grok_prstatus
3540 #define elf_backend_plt_sym_val               elf_s390_plt_sym_val
3541
3542 #define bfd_elf32_mkobject              elf_s390_mkobject
3543 #define elf_backend_object_p            elf_s390_object_p
3544
3545 #include "elf32-target.h"