elf64-s390.c revision 107492
1250661Sdavidcs/* IBM S/390-specific support for 64-bit ELF
2250661Sdavidcs   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3250661Sdavidcs   Contributed Martin Schwidefsky (schwidefsky@de.ibm.com).
4250661Sdavidcs
5250661Sdavidcs   This file is part of BFD, the Binary File Descriptor library.
6250661Sdavidcs
7250661Sdavidcs   This program is free software; you can redistribute it and/or modify
8250661Sdavidcs   it under the terms of the GNU General Public License as published by
9250661Sdavidcs   the Free Software Foundation; either version 2 of the License, or
10250661Sdavidcs   (at your option) any later version.
11250661Sdavidcs
12250661Sdavidcs   This program is distributed in the hope that it will be useful,
13250661Sdavidcs   but WITHOUT ANY WARRANTY; without even the implied warranty of
14250661Sdavidcs   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15250661Sdavidcs   GNU General Public License for more details.
16250661Sdavidcs
17250661Sdavidcs   You should have received a copy of the GNU General Public License
18250661Sdavidcs   along with this program; if not, write to the Free Software
19250661Sdavidcs   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20250661Sdavidcs   02111-1307, USA.  */
21250661Sdavidcs
22250661Sdavidcs#include "bfd.h"
23250661Sdavidcs#include "sysdep.h"
24250661Sdavidcs#include "bfdlink.h"
25250661Sdavidcs#include "libbfd.h"
26250661Sdavidcs#include "elf-bfd.h"
27250661Sdavidcs
28250661Sdavidcsstatic reloc_howto_type *elf_s390_reloc_type_lookup
29250661Sdavidcs  PARAMS ((bfd *, bfd_reloc_code_real_type));
30250661Sdavidcsstatic void elf_s390_info_to_howto
31250661Sdavidcs  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
32250661Sdavidcsstatic boolean elf_s390_is_local_label_name
33250661Sdavidcs  PARAMS ((bfd *, const char *));
34250661Sdavidcsstatic struct bfd_hash_entry *link_hash_newfunc
35250661Sdavidcs  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36250661Sdavidcsstatic struct bfd_link_hash_table *elf_s390_link_hash_table_create
37250661Sdavidcs  PARAMS ((bfd *));
38250661Sdavidcsstatic boolean create_got_section
39250661Sdavidcs  PARAMS((bfd *, struct bfd_link_info *));
40250661Sdavidcsstatic boolean elf_s390_create_dynamic_sections
41250661Sdavidcs  PARAMS((bfd *, struct bfd_link_info *));
42250661Sdavidcsstatic void elf_s390_copy_indirect_symbol
43250661Sdavidcs  PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
44250661Sdavidcs	   struct elf_link_hash_entry *));
45250661Sdavidcsstatic boolean elf_s390_check_relocs
46250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *, asection *,
47250661Sdavidcs	   const Elf_Internal_Rela *));
48250661Sdavidcsstatic asection *elf_s390_gc_mark_hook
49250661Sdavidcs  PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
50250661Sdavidcs	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
51250661Sdavidcsstatic boolean elf_s390_gc_sweep_hook
52250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *, asection *,
53250661Sdavidcs	   const Elf_Internal_Rela *));
54250661Sdavidcsstatic boolean elf_s390_adjust_dynamic_symbol
55250661Sdavidcs  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
56250661Sdavidcsstatic boolean allocate_dynrelocs
57250661Sdavidcs  PARAMS ((struct elf_link_hash_entry *, PTR));
58250661Sdavidcsstatic boolean readonly_dynrelocs
59250661Sdavidcs  PARAMS ((struct elf_link_hash_entry *, PTR));
60250661Sdavidcsstatic boolean elf_s390_size_dynamic_sections
61250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *));
62250661Sdavidcsstatic boolean elf_s390_relocate_section
63250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
64250661Sdavidcs	   Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
65250661Sdavidcsstatic boolean elf_s390_finish_dynamic_symbol
66250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
67250661Sdavidcs	   Elf_Internal_Sym *));
68250661Sdavidcsstatic enum elf_reloc_type_class elf_s390_reloc_type_class
69250661Sdavidcs  PARAMS ((const Elf_Internal_Rela *));
70250661Sdavidcsstatic boolean elf_s390_finish_dynamic_sections
71250661Sdavidcs  PARAMS ((bfd *, struct bfd_link_info *));
72250661Sdavidcsstatic boolean elf_s390_object_p PARAMS ((bfd *));
73250661Sdavidcs
74250661Sdavidcs#define USE_RELA 1		/* We want RELA relocations, not REL.  */
75250661Sdavidcs
76250661Sdavidcs#include "elf/s390.h"
77250661Sdavidcs
78250661Sdavidcs/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
79250661Sdavidcs   from smaller values.  Start with zero, widen, *then* decrement.  */
80250661Sdavidcs#define MINUS_ONE      (((bfd_vma)0) - 1)
81250661Sdavidcs
82250661Sdavidcs/* The relocation "howto" table.  */
83250661Sdavidcsstatic reloc_howto_type elf_howto_table[] =
84250661Sdavidcs{
85250661Sdavidcs  HOWTO (R_390_NONE,		/* type */
86250661Sdavidcs	 0,			/* rightshift */
87250661Sdavidcs	 0,			/* size (0 = byte, 1 = short, 2 = long) */
88250661Sdavidcs	 0,			/* bitsize */
89250661Sdavidcs	 false,			/* pc_relative */
90250661Sdavidcs	 0,			/* bitpos */
91250661Sdavidcs	 complain_overflow_dont, /* complain_on_overflow */
92250661Sdavidcs	 bfd_elf_generic_reloc, /* special_function */
93250661Sdavidcs	 "R_390_NONE",		/* name */
94250661Sdavidcs	 false,			/* partial_inplace */
95250661Sdavidcs	 0,			/* src_mask */
96250661Sdavidcs	 0,			/* dst_mask */
97250661Sdavidcs	 false),		/* pcrel_offset */
98250661Sdavidcs
99250661Sdavidcs  HOWTO(R_390_8,         0, 0,  8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_8",       false, 0,0x000000ff, false),
100250661Sdavidcs  HOWTO(R_390_12,        0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_12",      false, 0,0x00000fff, false),
101250661Sdavidcs  HOWTO(R_390_16,        0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_16",      false, 0,0x0000ffff, false),
102250661Sdavidcs  HOWTO(R_390_32,        0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_32",      false, 0,0xffffffff, false),
103250661Sdavidcs  HOWTO(R_390_PC32,	 0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32",    false, 0,0xffffffff,  true),
104250661Sdavidcs  HOWTO(R_390_GOT12,	 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_GOT12",   false, 0,0x00000fff, false),
105250661Sdavidcs  HOWTO(R_390_GOT32,	 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT32",   false, 0,0xffffffff, false),
106250661Sdavidcs  HOWTO(R_390_PLT32,	 0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32",   false, 0,0xffffffff,  true),
107250661Sdavidcs  HOWTO(R_390_COPY,      0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_COPY",    false, 0,MINUS_ONE, false),
108250661Sdavidcs  HOWTO(R_390_GLOB_DAT,  0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GLOB_DAT",false, 0,MINUS_ONE, false),
109250661Sdavidcs  HOWTO(R_390_JMP_SLOT,  0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_JMP_SLOT",false, 0,MINUS_ONE, false),
110250661Sdavidcs  HOWTO(R_390_RELATIVE,  0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_RELATIVE",false, 0,MINUS_ONE, false),
111250661Sdavidcs  HOWTO(R_390_GOTOFF,    0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTOFF",  false, 0,MINUS_ONE, false),
112250661Sdavidcs  HOWTO(R_390_GOTPC,     0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPC",   false, 0,MINUS_ONE,  true),
113250661Sdavidcs  HOWTO(R_390_GOT16,     0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT16",   false, 0,0x0000ffff, false),
114250661Sdavidcs  HOWTO(R_390_PC16,      0, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16",    false, 0,0x0000ffff,  true),
115250661Sdavidcs  HOWTO(R_390_PC16DBL,   1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff,  true),
116250661Sdavidcs  HOWTO(R_390_PLT16DBL,  1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff,  true),
117250661Sdavidcs  HOWTO(R_390_PC32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff,  true),
118250661Sdavidcs  HOWTO(R_390_PLT32DBL,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff,  true),
119250661Sdavidcs  HOWTO(R_390_GOTPCDBL,  1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,MINUS_ONE,  true),
120250661Sdavidcs  HOWTO(R_390_64,        0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_64",      false, 0,MINUS_ONE, false),
121250661Sdavidcs  HOWTO(R_390_PC64,	 0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC64",    false, 0,MINUS_ONE,  true),
122250661Sdavidcs  HOWTO(R_390_GOT64,	 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT64",   false, 0,MINUS_ONE, false),
123250661Sdavidcs  HOWTO(R_390_PLT64,	 0, 4, 64,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT64",   false, 0,MINUS_ONE,  true),
124250661Sdavidcs  HOWTO(R_390_GOTENT,	 1, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT",   false, 0,MINUS_ONE,  true),
125250661Sdavidcs};
126250661Sdavidcs
127250661Sdavidcs/* GNU extension to record C++ vtable hierarchy.  */
128250661Sdavidcsstatic reloc_howto_type elf64_s390_vtinherit_howto =
129250661Sdavidcs  HOWTO (R_390_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false);
130250661Sdavidcsstatic reloc_howto_type elf64_s390_vtentry_howto =
131250661Sdavidcs  HOWTO (R_390_GNU_VTENTRY, 0,4,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", false,0,0, false);
132250661Sdavidcs
133250661Sdavidcsstatic reloc_howto_type *
134250661Sdavidcself_s390_reloc_type_lookup (abfd, code)
135250661Sdavidcs     bfd *abfd ATTRIBUTE_UNUSED;
136250661Sdavidcs     bfd_reloc_code_real_type code;
137250661Sdavidcs{
138250661Sdavidcs  switch (code)
139250661Sdavidcs    {
140250661Sdavidcs    case BFD_RELOC_NONE:
141250661Sdavidcs      return &elf_howto_table[(int) R_390_NONE];
142250661Sdavidcs    case BFD_RELOC_8:
143250661Sdavidcs      return &elf_howto_table[(int) R_390_8];
144250661Sdavidcs    case BFD_RELOC_390_12:
145250661Sdavidcs      return &elf_howto_table[(int) R_390_12];
146250661Sdavidcs    case BFD_RELOC_16:
147250661Sdavidcs      return &elf_howto_table[(int) R_390_16];
148250661Sdavidcs    case BFD_RELOC_32:
149250661Sdavidcs      return &elf_howto_table[(int) R_390_32];
150250661Sdavidcs    case BFD_RELOC_CTOR:
151250661Sdavidcs      return &elf_howto_table[(int) R_390_32];
152250661Sdavidcs    case BFD_RELOC_32_PCREL:
153250661Sdavidcs      return &elf_howto_table[(int) R_390_PC32];
154250661Sdavidcs    case BFD_RELOC_390_GOT12:
155250661Sdavidcs      return &elf_howto_table[(int) R_390_GOT12];
156250661Sdavidcs    case BFD_RELOC_32_GOT_PCREL:
157250661Sdavidcs      return &elf_howto_table[(int) R_390_GOT32];
158250661Sdavidcs    case BFD_RELOC_390_PLT32:
159250661Sdavidcs      return &elf_howto_table[(int) R_390_PLT32];
160250661Sdavidcs    case BFD_RELOC_390_COPY:
161250661Sdavidcs      return &elf_howto_table[(int) R_390_COPY];
162250661Sdavidcs    case BFD_RELOC_390_GLOB_DAT:
163250661Sdavidcs      return &elf_howto_table[(int) R_390_GLOB_DAT];
164250661Sdavidcs    case BFD_RELOC_390_JMP_SLOT:
165250661Sdavidcs      return &elf_howto_table[(int) R_390_JMP_SLOT];
166250661Sdavidcs    case BFD_RELOC_390_RELATIVE:
167250661Sdavidcs      return &elf_howto_table[(int) R_390_RELATIVE];
168250661Sdavidcs    case BFD_RELOC_32_GOTOFF:
169250661Sdavidcs      return &elf_howto_table[(int) R_390_GOTOFF];
170250661Sdavidcs    case BFD_RELOC_390_GOTPC:
171250661Sdavidcs      return &elf_howto_table[(int) R_390_GOTPC];
172250661Sdavidcs    case BFD_RELOC_390_GOT16:
173250661Sdavidcs      return &elf_howto_table[(int) R_390_GOT16];
174250661Sdavidcs    case BFD_RELOC_16_PCREL:
175250661Sdavidcs      return &elf_howto_table[(int) R_390_PC16];
176250661Sdavidcs    case BFD_RELOC_390_PC16DBL:
177250661Sdavidcs      return &elf_howto_table[(int) R_390_PC16DBL];
178250661Sdavidcs    case BFD_RELOC_390_PLT16DBL:
179250661Sdavidcs      return &elf_howto_table[(int) R_390_PLT16DBL];
180250661Sdavidcs    case BFD_RELOC_VTABLE_INHERIT:
181250661Sdavidcs      return &elf64_s390_vtinherit_howto;
182250661Sdavidcs    case BFD_RELOC_VTABLE_ENTRY:
183250661Sdavidcs      return &elf64_s390_vtentry_howto;
184250661Sdavidcs    case BFD_RELOC_390_PC32DBL:
185250661Sdavidcs      return &elf_howto_table[(int) R_390_PC32DBL];
186250661Sdavidcs    case BFD_RELOC_390_PLT32DBL:
187250661Sdavidcs      return &elf_howto_table[(int) R_390_PLT32DBL];
188250661Sdavidcs    case BFD_RELOC_390_GOTPCDBL:
189250661Sdavidcs      return &elf_howto_table[(int) R_390_GOTPCDBL];
190250661Sdavidcs    case BFD_RELOC_64:
191250661Sdavidcs      return &elf_howto_table[(int) R_390_64];
192250661Sdavidcs    case BFD_RELOC_64_PCREL:
193250661Sdavidcs      return &elf_howto_table[(int) R_390_PC64];
194250661Sdavidcs    case BFD_RELOC_390_GOT64:
195250661Sdavidcs      return &elf_howto_table[(int) R_390_GOT64];
196250661Sdavidcs    case BFD_RELOC_390_PLT64:
197250661Sdavidcs      return &elf_howto_table[(int) R_390_PLT64];
198250661Sdavidcs    case BFD_RELOC_390_GOTENT:
199250661Sdavidcs      return &elf_howto_table[(int) R_390_GOTENT];
200250661Sdavidcs    default:
201250661Sdavidcs      break;
202250661Sdavidcs    }
203250661Sdavidcs  return 0;
204250661Sdavidcs}
205250661Sdavidcs
206250661Sdavidcs/* We need to use ELF64_R_TYPE so we have our own copy of this function,
207250661Sdavidcs   and elf64-s390.c has its own copy.  */
208250661Sdavidcs
209250661Sdavidcsstatic void
210250661Sdavidcself_s390_info_to_howto (abfd, cache_ptr, dst)
211250661Sdavidcs     bfd *abfd ATTRIBUTE_UNUSED;
212250661Sdavidcs     arelent *cache_ptr;
213250661Sdavidcs     Elf_Internal_Rela *dst;
214250661Sdavidcs{
215258898Sdavidcs  switch (ELF64_R_TYPE(dst->r_info))
216258898Sdavidcs    {
217258898Sdavidcs    case R_390_GNU_VTINHERIT:
218258898Sdavidcs      cache_ptr->howto = &elf64_s390_vtinherit_howto;
219258898Sdavidcs      break;
220258898Sdavidcs
221250661Sdavidcs    case R_390_GNU_VTENTRY:
222250661Sdavidcs      cache_ptr->howto = &elf64_s390_vtentry_howto;
223250661Sdavidcs      break;
224250661Sdavidcs
225250661Sdavidcs    default:
226250661Sdavidcs      BFD_ASSERT (ELF64_R_TYPE(dst->r_info) < (unsigned int) R_390_max);
227250661Sdavidcs      cache_ptr->howto = &elf_howto_table[ELF64_R_TYPE(dst->r_info)];
228250661Sdavidcs    }
229250661Sdavidcs}
230250661Sdavidcs
231250661Sdavidcsstatic boolean
232250661Sdavidcself_s390_is_local_label_name (abfd, name)
233250661Sdavidcs     bfd *abfd;
234250661Sdavidcs     const char *name;
235250661Sdavidcs{
236250661Sdavidcs  if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
237250661Sdavidcs    return true;
238250661Sdavidcs
239250661Sdavidcs  return _bfd_elf_is_local_label_name (abfd, name);
240250661Sdavidcs}
241250661Sdavidcs
242250661Sdavidcs/* Functions for the 390 ELF linker.  */
243250661Sdavidcs
244250661Sdavidcs/* The name of the dynamic interpreter.  This is put in the .interp
245250661Sdavidcs   section.  */
246250661Sdavidcs
247250661Sdavidcs#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
248250661Sdavidcs
249250661Sdavidcs/* The size in bytes of the first entry in the procedure linkage table.  */
250250661Sdavidcs#define PLT_FIRST_ENTRY_SIZE 32
251250661Sdavidcs/* The size in bytes of an entry in the procedure linkage table.  */
252250661Sdavidcs#define PLT_ENTRY_SIZE 32
253250661Sdavidcs
254250661Sdavidcs#define GOT_ENTRY_SIZE 8
255250661Sdavidcs
256250661Sdavidcs/* The first three entries in a procedure linkage table are reserved,
257250661Sdavidcs   and the initial contents are unimportant (we zero them out).
258250661Sdavidcs   Subsequent entries look like this.  See the SVR4 ABI 386
259250661Sdavidcs   supplement to see how this works.  */
260250661Sdavidcs
261250661Sdavidcs/* For the s390, simple addr offset can only be 0 - 4096.
262250661Sdavidcs   To use the full 16777216 TB address space, several instructions
263250661Sdavidcs   are needed to load an address in a register and execute
264250661Sdavidcs   a branch( or just saving the address)
265250661Sdavidcs
266250661Sdavidcs   Furthermore, only r 0 and 1 are free to use!!!  */
267250661Sdavidcs
268250661Sdavidcs/* The first 3 words in the GOT are then reserved.
269250661Sdavidcs   Word 0 is the address of the dynamic table.
270250661Sdavidcs   Word 1 is a pointer to a structure describing the object
271250661Sdavidcs   Word 2 is used to point to the loader entry address.
272250661Sdavidcs
273250661Sdavidcs   The code for PLT entries looks like this:
274250661Sdavidcs
275250661Sdavidcs   The GOT holds the address in the PLT to be executed.
276250661Sdavidcs   The loader then gets:
277250661Sdavidcs   24(15) =  Pointer to the structure describing the object.
278250661Sdavidcs   28(15) =  Offset in symbol table
279250661Sdavidcs   The loader  must  then find the module where the function is
280250661Sdavidcs   and insert the address in the GOT.
281250661Sdavidcs
282250661Sdavidcs   PLT1: LARL 1,<fn>@GOTENT # 6 bytes  Load address of GOT entry in r1
283250661Sdavidcs         LG   1,0(1)      # 6 bytes  Load address from GOT in r1
284250661Sdavidcs         BCR  15,1        # 2 bytes  Jump to address
285250661Sdavidcs   RET1: BASR 1,0         # 2 bytes  Return from GOT 1st time
286250661Sdavidcs         LGF  1,12(1)     # 6 bytes  Load offset in symbl table in r1
287250661Sdavidcs         BRCL 15,-x       # 6 bytes  Jump to start of PLT
288250661Sdavidcs         .long ?          # 4 bytes  offset into symbol table
289250661Sdavidcs
290250661Sdavidcs   Total = 32 bytes per PLT entry
291250661Sdavidcs   Fixup at offset 2: relative address to GOT entry
292250661Sdavidcs   Fixup at offset 22: relative branch to PLT0
293250661Sdavidcs   Fixup at offset 28: 32 bit offset into symbol table
294250661Sdavidcs
295250661Sdavidcs   A 32 bit offset into the symbol table is enough. It allows for symbol
296250661Sdavidcs   tables up to a size of 2 gigabyte. A single dynamic object (the main
297250661Sdavidcs   program, any shared library) is limited to 4GB in size and I want to see
298250661Sdavidcs   the program that manages to have a symbol table of more than 2 GB with a
299250661Sdavidcs   total size of at max 4 GB.  */
300250661Sdavidcs
301250661Sdavidcs#define PLT_ENTRY_WORD0     (bfd_vma) 0xc0100000
302250661Sdavidcs#define PLT_ENTRY_WORD1     (bfd_vma) 0x0000e310
303250661Sdavidcs#define PLT_ENTRY_WORD2     (bfd_vma) 0x10000004
304250661Sdavidcs#define PLT_ENTRY_WORD3     (bfd_vma) 0x07f10d10
305250661Sdavidcs#define PLT_ENTRY_WORD4     (bfd_vma) 0xe310100c
306250661Sdavidcs#define PLT_ENTRY_WORD5     (bfd_vma) 0x0014c0f4
307250661Sdavidcs#define PLT_ENTRY_WORD6     (bfd_vma) 0x00000000
308250661Sdavidcs#define PLT_ENTRY_WORD7     (bfd_vma) 0x00000000
309250661Sdavidcs
310250661Sdavidcs/* The first PLT entry pushes the offset into the symbol table
311250661Sdavidcs   from R1 onto the stack at 8(15) and the loader object info
312250661Sdavidcs   at 12(15), loads the loader address in R1 and jumps to it.  */
313250661Sdavidcs
314250661Sdavidcs/* The first entry in the PLT:
315250661Sdavidcs
316250661Sdavidcs  PLT0:
317250661Sdavidcs     STG  1,56(15)  # r1 contains the offset into the symbol table
318250661Sdavidcs     LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table
319250661Sdavidcs     MVC  48(8,15),8(1) # move loader ino (object struct address) to stack
320250661Sdavidcs     LG   1,16(1)   # get entry address of loader
321250661Sdavidcs     BCR  15,1      # jump to loader
322250661Sdavidcs
323250661Sdavidcs     Fixup at offset 8: relative address to start of GOT.  */
324250661Sdavidcs
325250661Sdavidcs#define PLT_FIRST_ENTRY_WORD0     (bfd_vma) 0xe310f038
326250661Sdavidcs#define PLT_FIRST_ENTRY_WORD1     (bfd_vma) 0x0024c010
327250661Sdavidcs#define PLT_FIRST_ENTRY_WORD2     (bfd_vma) 0x00000000
328250661Sdavidcs#define PLT_FIRST_ENTRY_WORD3     (bfd_vma) 0xd207f030
329250661Sdavidcs#define PLT_FIRST_ENTRY_WORD4     (bfd_vma) 0x1008e310
330250661Sdavidcs#define PLT_FIRST_ENTRY_WORD5     (bfd_vma) 0x10100004
331250661Sdavidcs#define PLT_FIRST_ENTRY_WORD6     (bfd_vma) 0x07f10700
332250661Sdavidcs#define PLT_FIRST_ENTRY_WORD7     (bfd_vma) 0x07000700
333250661Sdavidcs
334250661Sdavidcs/* The s390 linker needs to keep track of the number of relocs that it
335250661Sdavidcs   decides to copy as dynamic relocs in check_relocs for each symbol.
336250661Sdavidcs   This is so that it can later discard them if they are found to be
337250661Sdavidcs   unnecessary.  We store the information in a field extending the
338250661Sdavidcs   regular ELF linker hash table.  */
339250661Sdavidcs
340250661Sdavidcsstruct elf_s390_dyn_relocs
341250661Sdavidcs{
342250661Sdavidcs  struct elf_s390_dyn_relocs *next;
343250661Sdavidcs
344250661Sdavidcs  /* The input section of the reloc.  */
345250661Sdavidcs  asection *sec;
346250661Sdavidcs
347250661Sdavidcs  /* Total number of relocs copied for the input section.  */
348250661Sdavidcs  bfd_size_type count;
349250661Sdavidcs
350250661Sdavidcs  /* Number of pc-relative relocs copied for the input section.  */
351250661Sdavidcs  bfd_size_type pc_count;
352250661Sdavidcs};
353250661Sdavidcs
354250661Sdavidcs/* s390 ELF linker hash entry.  */
355250661Sdavidcs
356250661Sdavidcsstruct elf_s390_link_hash_entry
357250661Sdavidcs{
358250661Sdavidcs  struct elf_link_hash_entry elf;
359250661Sdavidcs
360250661Sdavidcs  /* Track dynamic relocs copied for this symbol.  */
361250661Sdavidcs  struct elf_s390_dyn_relocs *dyn_relocs;
362250661Sdavidcs};
363250661Sdavidcs
364250661Sdavidcs/* s390 ELF linker hash table.  */
365250661Sdavidcs
366250661Sdavidcsstruct elf_s390_link_hash_table
367250661Sdavidcs{
368250661Sdavidcs  struct elf_link_hash_table elf;
369250661Sdavidcs
370250661Sdavidcs  /* Short-cuts to get to dynamic linker sections.  */
371250661Sdavidcs  asection *sgot;
372250661Sdavidcs  asection *sgotplt;
373250661Sdavidcs  asection *srelgot;
374250661Sdavidcs  asection *splt;
375250661Sdavidcs  asection *srelplt;
376250661Sdavidcs  asection *sdynbss;
377250661Sdavidcs  asection *srelbss;
378250661Sdavidcs
379250661Sdavidcs  /* Small local sym to section mapping cache.  */
380250661Sdavidcs  struct sym_sec_cache sym_sec;
381250661Sdavidcs};
382250661Sdavidcs
383250661Sdavidcs/* Get the s390 ELF linker hash table from a link_info structure.  */
384250661Sdavidcs
385250661Sdavidcs#define elf_s390_hash_table(p) \
386250661Sdavidcs  ((struct elf_s390_link_hash_table *) ((p)->hash))
387250661Sdavidcs
388250661Sdavidcs/* Create an entry in an s390 ELF linker hash table.  */
389250661Sdavidcs
390250661Sdavidcsstatic struct bfd_hash_entry *
391250661Sdavidcslink_hash_newfunc (entry, table, string)
392250661Sdavidcs     struct bfd_hash_entry *entry;
393250661Sdavidcs     struct bfd_hash_table *table;
394250661Sdavidcs     const char *string;
395250661Sdavidcs{
396250661Sdavidcs  /* Allocate the structure if it has not already been allocated by a
397250661Sdavidcs     subclass.  */
398250661Sdavidcs  if (entry == NULL)
399250661Sdavidcs    {
400250661Sdavidcs      entry = bfd_hash_allocate (table,
401250661Sdavidcs				 sizeof (struct elf_s390_link_hash_entry));
402250661Sdavidcs      if (entry == NULL)
403250661Sdavidcs	return entry;
404250661Sdavidcs    }
405250661Sdavidcs
406250661Sdavidcs  /* Call the allocation method of the superclass.  */
407250661Sdavidcs  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
408250661Sdavidcs  if (entry != NULL)
409250661Sdavidcs    {
410250661Sdavidcs      struct elf_s390_link_hash_entry *eh;
411250661Sdavidcs
412250661Sdavidcs      eh = (struct elf_s390_link_hash_entry *) entry;
413250661Sdavidcs      eh->dyn_relocs = NULL;
414250661Sdavidcs    }
415250661Sdavidcs
416250661Sdavidcs  return entry;
417250661Sdavidcs}
418250661Sdavidcs
419250661Sdavidcs/* Create an s390 ELF linker hash table.  */
420250661Sdavidcs
421250661Sdavidcsstatic struct bfd_link_hash_table *
422250661Sdavidcself_s390_link_hash_table_create (abfd)
423250661Sdavidcs     bfd *abfd;
424250661Sdavidcs{
425250661Sdavidcs  struct elf_s390_link_hash_table *ret;
426250661Sdavidcs  bfd_size_type amt = sizeof (struct elf_s390_link_hash_table);
427250661Sdavidcs
428250661Sdavidcs  ret = (struct elf_s390_link_hash_table *) bfd_malloc (amt);
429250661Sdavidcs  if (ret == NULL)
430250661Sdavidcs    return NULL;
431250661Sdavidcs
432250661Sdavidcs  if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
433250661Sdavidcs    {
434250661Sdavidcs      free (ret);
435250661Sdavidcs      return NULL;
436250661Sdavidcs    }
437250661Sdavidcs
438250661Sdavidcs  ret->sgot = NULL;
439250661Sdavidcs  ret->sgotplt = NULL;
440250661Sdavidcs  ret->srelgot = NULL;
441250661Sdavidcs  ret->splt = NULL;
442250661Sdavidcs  ret->srelplt = NULL;
443250661Sdavidcs  ret->sdynbss = NULL;
444250661Sdavidcs  ret->srelbss = NULL;
445250661Sdavidcs  ret->sym_sec.abfd = NULL;
446250661Sdavidcs
447250661Sdavidcs  return &ret->elf.root;
448250661Sdavidcs}
449250661Sdavidcs
450250661Sdavidcs/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
451250661Sdavidcs   shortcuts to them in our hash table.  */
452250661Sdavidcs
453250661Sdavidcsstatic boolean
454250661Sdavidcscreate_got_section (dynobj, info)
455250661Sdavidcs     bfd *dynobj;
456250661Sdavidcs     struct bfd_link_info *info;
457250661Sdavidcs{
458250661Sdavidcs  struct elf_s390_link_hash_table *htab;
459250661Sdavidcs
460250661Sdavidcs  if (! _bfd_elf_create_got_section (dynobj, info))
461250661Sdavidcs    return false;
462250661Sdavidcs
463250661Sdavidcs  htab = elf_s390_hash_table (info);
464250661Sdavidcs  htab->sgot = bfd_get_section_by_name (dynobj, ".got");
465250661Sdavidcs  htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
466250661Sdavidcs  if (!htab->sgot || !htab->sgotplt)
467250661Sdavidcs    abort ();
468250661Sdavidcs
469250661Sdavidcs  htab->srelgot = bfd_make_section (dynobj, ".rela.got");
470250661Sdavidcs  if (htab->srelgot == NULL
471250661Sdavidcs      || ! bfd_set_section_flags (dynobj, htab->srelgot,
472250661Sdavidcs				  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
473250661Sdavidcs				   | SEC_IN_MEMORY | SEC_LINKER_CREATED
474250661Sdavidcs				   | SEC_READONLY))
475250661Sdavidcs      || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
476250661Sdavidcs    return false;
477250661Sdavidcs  return true;
478250661Sdavidcs}
479250661Sdavidcs
480250661Sdavidcs/* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
481250661Sdavidcs   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
482250661Sdavidcs   hash table.  */
483250661Sdavidcs
484250661Sdavidcsstatic boolean
485250661Sdavidcself_s390_create_dynamic_sections (dynobj, info)
486250661Sdavidcs     bfd *dynobj;
487250661Sdavidcs     struct bfd_link_info *info;
488250661Sdavidcs{
489250661Sdavidcs  struct elf_s390_link_hash_table *htab;
490250661Sdavidcs
491250661Sdavidcs  htab = elf_s390_hash_table (info);
492250661Sdavidcs  if (!htab->sgot && !create_got_section (dynobj, info))
493250661Sdavidcs    return false;
494250661Sdavidcs
495250661Sdavidcs  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
496250661Sdavidcs    return false;
497250661Sdavidcs
498250661Sdavidcs  htab->splt = bfd_get_section_by_name (dynobj, ".plt");
499250661Sdavidcs  htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
500250661Sdavidcs  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
501250661Sdavidcs  if (!info->shared)
502250661Sdavidcs    htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
503250661Sdavidcs
504250661Sdavidcs  if (!htab->splt || !htab->srelplt || !htab->sdynbss
505250661Sdavidcs      || (!info->shared && !htab->srelbss))
506250661Sdavidcs    abort ();
507250661Sdavidcs
508250661Sdavidcs  return true;
509250661Sdavidcs}
510250661Sdavidcs
511250661Sdavidcs/* Copy the extra info we tack onto an elf_link_hash_entry.  */
512250661Sdavidcs
513250661Sdavidcsstatic void
514250661Sdavidcself_s390_copy_indirect_symbol (bed, dir, ind)
515250661Sdavidcs     struct elf_backend_data *bed;
516250661Sdavidcs     struct elf_link_hash_entry *dir, *ind;
517250661Sdavidcs{
518250661Sdavidcs  struct elf_s390_link_hash_entry *edir, *eind;
519250661Sdavidcs
520250661Sdavidcs  edir = (struct elf_s390_link_hash_entry *) dir;
521250661Sdavidcs  eind = (struct elf_s390_link_hash_entry *) ind;
522250661Sdavidcs
523250661Sdavidcs  if (eind->dyn_relocs != NULL)
524250661Sdavidcs    {
525250661Sdavidcs      if (edir->dyn_relocs != NULL)
526250661Sdavidcs	{
527250661Sdavidcs	  struct elf_s390_dyn_relocs **pp;
528250661Sdavidcs	  struct elf_s390_dyn_relocs *p;
529250661Sdavidcs
530250661Sdavidcs	  if (ind->root.type == bfd_link_hash_indirect)
531250661Sdavidcs	    abort ();
532250661Sdavidcs
533250661Sdavidcs	  /* Add reloc counts against the weak sym to the strong sym
534250661Sdavidcs	     list.  Merge any entries against the same section.  */
535250661Sdavidcs	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
536250661Sdavidcs	    {
537250661Sdavidcs	      struct elf_s390_dyn_relocs *q;
538250661Sdavidcs
539250661Sdavidcs	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
540250661Sdavidcs		if (q->sec == p->sec)
541250661Sdavidcs		  {
542250661Sdavidcs		    q->pc_count += p->pc_count;
543250661Sdavidcs		    q->count += p->count;
544250661Sdavidcs		    *pp = p->next;
545250661Sdavidcs		    break;
546250661Sdavidcs		  }
547250661Sdavidcs	      if (q == NULL)
548250661Sdavidcs		pp = &p->next;
549250661Sdavidcs	    }
550250661Sdavidcs	  *pp = edir->dyn_relocs;
551250661Sdavidcs	}
552250661Sdavidcs
553250661Sdavidcs      edir->dyn_relocs = eind->dyn_relocs;
554250661Sdavidcs      eind->dyn_relocs = NULL;
555250661Sdavidcs    }
556250661Sdavidcs
557250661Sdavidcs  _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
558250661Sdavidcs}
559250661Sdavidcs
560250661Sdavidcs/* Look through the relocs for a section during the first phase, and
561250661Sdavidcs   allocate space in the global offset table or procedure linkage
562250661Sdavidcs   table.  */
563250661Sdavidcs
564250661Sdavidcsstatic boolean
565250661Sdavidcself_s390_check_relocs (abfd, info, sec, relocs)
566250661Sdavidcs     bfd *abfd;
567250661Sdavidcs     struct bfd_link_info *info;
568250661Sdavidcs     asection *sec;
569250661Sdavidcs     const Elf_Internal_Rela *relocs;
570250661Sdavidcs{
571250661Sdavidcs  struct elf_s390_link_hash_table *htab;
572250661Sdavidcs  Elf_Internal_Shdr *symtab_hdr;
573250661Sdavidcs  struct elf_link_hash_entry **sym_hashes;
574250661Sdavidcs  const Elf_Internal_Rela *rel;
575250661Sdavidcs  const Elf_Internal_Rela *rel_end;
576250661Sdavidcs  asection *sreloc;
577250661Sdavidcs
578250661Sdavidcs  if (info->relocateable)
579250661Sdavidcs    return true;
580250661Sdavidcs
581250661Sdavidcs  htab = elf_s390_hash_table (info);
582250661Sdavidcs  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
583250661Sdavidcs  sym_hashes = elf_sym_hashes (abfd);
584250661Sdavidcs
585250661Sdavidcs  sreloc = NULL;
586250661Sdavidcs
587250661Sdavidcs  rel_end = relocs + sec->reloc_count;
588250661Sdavidcs  for (rel = relocs; rel < rel_end; rel++)
589250661Sdavidcs    {
590250661Sdavidcs      unsigned long r_symndx;
591250661Sdavidcs      struct elf_link_hash_entry *h;
592250661Sdavidcs
593250661Sdavidcs      r_symndx = ELF64_R_SYM (rel->r_info);
594250661Sdavidcs
595250661Sdavidcs      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
596250661Sdavidcs	{
597250661Sdavidcs	  (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
598250661Sdavidcs				 bfd_archive_filename (abfd),
599250661Sdavidcs				 r_symndx);
600250661Sdavidcs	  return false;
601250661Sdavidcs	}
602250661Sdavidcs
603250661Sdavidcs      if (r_symndx < symtab_hdr->sh_info)
604250661Sdavidcs	h = NULL;
605250661Sdavidcs      else
606250661Sdavidcs	h = sym_hashes[r_symndx - symtab_hdr->sh_info];
607250661Sdavidcs
608250661Sdavidcs      switch (ELF64_R_TYPE (rel->r_info))
609250661Sdavidcs	{
610250661Sdavidcs	case R_390_GOT12:
611250661Sdavidcs        case R_390_GOT16:
612250661Sdavidcs	case R_390_GOT32:
613250661Sdavidcs	case R_390_GOT64:
614250661Sdavidcs	case R_390_GOTENT:
615250661Sdavidcs	  /* This symbol requires a global offset table entry.  */
616250661Sdavidcs	  if (h != NULL)
617250661Sdavidcs	    {
618250661Sdavidcs	      h->got.refcount += 1;
619250661Sdavidcs	    }
620250661Sdavidcs	  else
621250661Sdavidcs	    {
622250661Sdavidcs	      bfd_signed_vma *local_got_refcounts;
623250661Sdavidcs
624250661Sdavidcs	      /* This is a global offset table entry for a local symbol.  */
625250661Sdavidcs	      local_got_refcounts = elf_local_got_refcounts (abfd);
626250661Sdavidcs	      if (local_got_refcounts == NULL)
627250661Sdavidcs		{
628250661Sdavidcs		  bfd_size_type size;
629250661Sdavidcs
630250661Sdavidcs		  size = symtab_hdr->sh_info;
631250661Sdavidcs		  size *= sizeof (bfd_signed_vma);
632250661Sdavidcs		  local_got_refcounts = ((bfd_signed_vma *)
633250661Sdavidcs					 bfd_zalloc (abfd, size));
634250661Sdavidcs		  if (local_got_refcounts == NULL)
635250661Sdavidcs		    return false;
636250661Sdavidcs		  elf_local_got_refcounts (abfd) = local_got_refcounts;
637250661Sdavidcs		}
638250661Sdavidcs	      local_got_refcounts[r_symndx] += 1;
639250661Sdavidcs	    }
640250661Sdavidcs	  /* Fall through */
641250661Sdavidcs
642250661Sdavidcs	case R_390_GOTOFF:
643250661Sdavidcs	case R_390_GOTPC:
644250661Sdavidcs	case R_390_GOTPCDBL:
645250661Sdavidcs	  if (htab->sgot == NULL)
646250661Sdavidcs	    {
647250661Sdavidcs	      if (htab->elf.dynobj == NULL)
648250661Sdavidcs		htab->elf.dynobj = abfd;
649250661Sdavidcs	      if (!create_got_section (htab->elf.dynobj, info))
650250661Sdavidcs		return false;
651250661Sdavidcs	    }
652250661Sdavidcs	  break;
653250661Sdavidcs
654250661Sdavidcs        case R_390_PLT16DBL:
655250661Sdavidcs	case R_390_PLT32:
656250661Sdavidcs	case R_390_PLT32DBL:
657250661Sdavidcs	case R_390_PLT64:
658250661Sdavidcs	  /* This symbol requires a procedure linkage table entry.  We
659250661Sdavidcs             actually build the entry in adjust_dynamic_symbol,
660250661Sdavidcs             because this might be a case of linking PIC code which is
661250661Sdavidcs             never referenced by a dynamic object, in which case we
662250661Sdavidcs             don't need to generate a procedure linkage table entry
663250661Sdavidcs             after all.  */
664250661Sdavidcs
665250661Sdavidcs	  /* If this is a local symbol, we resolve it directly without
666250661Sdavidcs             creating a procedure linkage table entry.  */
667250661Sdavidcs	  if (h == NULL)
668250661Sdavidcs	    continue;
669250661Sdavidcs
670250661Sdavidcs	  h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
671250661Sdavidcs	  h->plt.refcount += 1;
672250661Sdavidcs	  break;
673250661Sdavidcs
674250661Sdavidcs        case R_390_8:
675250661Sdavidcs        case R_390_16:
676250661Sdavidcs	case R_390_32:
677250661Sdavidcs	case R_390_64:
678250661Sdavidcs        case R_390_PC16:
679250661Sdavidcs        case R_390_PC16DBL:
680250661Sdavidcs	case R_390_PC32:
681250661Sdavidcs	case R_390_PC32DBL:
682250661Sdavidcs	case R_390_PC64:
683250661Sdavidcs	  if (h != NULL && !info->shared)
684250661Sdavidcs	    {
685250661Sdavidcs	      /* If this reloc is in a read-only section, we might
686250661Sdavidcs		 need a copy reloc.  We can't check reliably at this
687250661Sdavidcs		 stage whether the section is read-only, as input
688250661Sdavidcs		 sections have not yet been mapped to output sections.
689250661Sdavidcs		 Tentatively set the flag for now, and correct in
690250661Sdavidcs		 adjust_dynamic_symbol.  */
691250661Sdavidcs	      h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
692250661Sdavidcs
693250661Sdavidcs	      /* We may need a .plt entry if the function this reloc
694250661Sdavidcs		 refers to is in a shared lib.  */
695250661Sdavidcs	      h->plt.refcount += 1;
696250661Sdavidcs	    }
697250661Sdavidcs
698250661Sdavidcs	  /* If we are creating a shared library, and this is a reloc
699250661Sdavidcs	     against a global symbol, or a non PC relative reloc
700250661Sdavidcs	     against a local symbol, then we need to copy the reloc
701250661Sdavidcs	     into the shared library.  However, if we are linking with
702250661Sdavidcs	     -Bsymbolic, we do not need to copy a reloc against a
703250661Sdavidcs	     global symbol which is defined in an object we are
704250661Sdavidcs	     including in the link (i.e., DEF_REGULAR is set).  At
705250661Sdavidcs	     this point we have not seen all the input files, so it is
706250661Sdavidcs	     possible that DEF_REGULAR is not set now but will be set
707250661Sdavidcs	     later (it is never cleared).  In case of a weak definition,
708250661Sdavidcs	     DEF_REGULAR may be cleared later by a strong definition in
709250661Sdavidcs	     a shared library. We account for that possibility below by
710250661Sdavidcs	     storing information in the relocs_copied field of the hash
711250661Sdavidcs	     table entry.  A similar situation occurs when creating
712250661Sdavidcs	     shared libraries and symbol visibility changes render the
713250661Sdavidcs	     symbol local.
714250661Sdavidcs
715250661Sdavidcs	     If on the other hand, we are creating an executable, we
716250661Sdavidcs	     may need to keep relocations for symbols satisfied by a
717250661Sdavidcs	     dynamic library if we manage to avoid copy relocs for the
718250661Sdavidcs	     symbol.  */
719250661Sdavidcs	  if ((info->shared
720250661Sdavidcs	       && (sec->flags & SEC_ALLOC) != 0
721250661Sdavidcs	       && ((ELF64_R_TYPE (rel->r_info) != R_390_PC16
722250661Sdavidcs		    && ELF64_R_TYPE (rel->r_info) != R_390_PC16DBL
723250661Sdavidcs		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32
724250661Sdavidcs		    && ELF64_R_TYPE (rel->r_info) != R_390_PC32DBL
725250661Sdavidcs		    && ELF64_R_TYPE (rel->r_info) != R_390_PC64)
726250661Sdavidcs		   || (h != NULL
727250661Sdavidcs		       && (! info->symbolic
728250661Sdavidcs			   || h->root.type == bfd_link_hash_defweak
729250661Sdavidcs			   || (h->elf_link_hash_flags
730250661Sdavidcs			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
731250661Sdavidcs	      || (!info->shared
732250661Sdavidcs		  && (sec->flags & SEC_ALLOC) != 0
733250661Sdavidcs		  && h != NULL
734250661Sdavidcs		  && (h->root.type == bfd_link_hash_defweak
735250661Sdavidcs		      || (h->elf_link_hash_flags
736250661Sdavidcs			  & ELF_LINK_HASH_DEF_REGULAR) == 0)))
737250661Sdavidcs	    {
738250661Sdavidcs	      struct elf_s390_dyn_relocs *p;
739250661Sdavidcs	      struct elf_s390_dyn_relocs **head;
740250661Sdavidcs
741250661Sdavidcs	      /* We must copy these reloc types into the output file.
742250661Sdavidcs		 Create a reloc section in dynobj and make room for
743250661Sdavidcs		 this reloc.  */
744250661Sdavidcs	      if (sreloc == NULL)
745250661Sdavidcs		{
746250661Sdavidcs		  const char *name;
747250661Sdavidcs		  bfd *dynobj;
748250661Sdavidcs
749250661Sdavidcs		  name = (bfd_elf_string_from_elf_section
750250661Sdavidcs			  (abfd,
751250661Sdavidcs			   elf_elfheader (abfd)->e_shstrndx,
752250661Sdavidcs			   elf_section_data (sec)->rel_hdr.sh_name));
753250661Sdavidcs		  if (name == NULL)
754250661Sdavidcs		    return false;
755250661Sdavidcs
756250661Sdavidcs		  if (strncmp (name, ".rela", 5) != 0
757250661Sdavidcs		      || strcmp (bfd_get_section_name (abfd, sec),
758250661Sdavidcs				 name + 5) != 0)
759250661Sdavidcs		    {
760250661Sdavidcs		      (*_bfd_error_handler)
761250661Sdavidcs			(_("%s: bad relocation section name `%s\'"),
762250661Sdavidcs			 bfd_archive_filename (abfd), name);
763250661Sdavidcs		    }
764250661Sdavidcs
765250661Sdavidcs		  if (htab->elf.dynobj == NULL)
766250661Sdavidcs		    htab->elf.dynobj = abfd;
767250661Sdavidcs
768250661Sdavidcs		  dynobj = htab->elf.dynobj;
769250661Sdavidcs		  sreloc = bfd_get_section_by_name (dynobj, name);
770250661Sdavidcs		  if (sreloc == NULL)
771250661Sdavidcs		    {
772250661Sdavidcs		      flagword flags;
773250661Sdavidcs
774250661Sdavidcs		      sreloc = bfd_make_section (dynobj, name);
775250661Sdavidcs		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
776250661Sdavidcs			       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
777250661Sdavidcs		      if ((sec->flags & SEC_ALLOC) != 0)
778250661Sdavidcs			flags |= SEC_ALLOC | SEC_LOAD;
779250661Sdavidcs		      if (sreloc == NULL
780250661Sdavidcs			  || ! bfd_set_section_flags (dynobj, sreloc, flags)
781250661Sdavidcs			  || ! bfd_set_section_alignment (dynobj, sreloc, 3))
782250661Sdavidcs			return false;
783250661Sdavidcs		    }
784250661Sdavidcs		  elf_section_data (sec)->sreloc = sreloc;
785250661Sdavidcs		}
786250661Sdavidcs
787250661Sdavidcs	      /* If this is a global symbol, we count the number of
788250661Sdavidcs		 relocations we need for this symbol.  */
789250661Sdavidcs	      if (h != NULL)
790250661Sdavidcs		{
791250661Sdavidcs		  head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs;
792250661Sdavidcs		}
793250661Sdavidcs	      else
794250661Sdavidcs		{
795250661Sdavidcs		  /* Track dynamic relocs needed for local syms too.
796250661Sdavidcs		     We really need local syms available to do this
797250661Sdavidcs		     easily.  Oh well.  */
798250661Sdavidcs
799250661Sdavidcs		  asection *s;
800250661Sdavidcs		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
801250661Sdavidcs						 sec, r_symndx);
802250661Sdavidcs		  if (s == NULL)
803250661Sdavidcs		    return false;
804250661Sdavidcs
805250661Sdavidcs		  head = ((struct elf_s390_dyn_relocs **)
806250661Sdavidcs			  &elf_section_data (s)->local_dynrel);
807250661Sdavidcs		}
808250661Sdavidcs
809250661Sdavidcs	      p = *head;
810250661Sdavidcs	      if (p == NULL || p->sec != sec)
811250661Sdavidcs		{
812250661Sdavidcs		  bfd_size_type amt = sizeof *p;
813250661Sdavidcs		  p = ((struct elf_s390_dyn_relocs *)
814250661Sdavidcs		       bfd_alloc (htab->elf.dynobj, amt));
815250661Sdavidcs		  if (p == NULL)
816250661Sdavidcs		    return false;
817250661Sdavidcs		  p->next = *head;
818250661Sdavidcs		  *head = p;
819250661Sdavidcs		  p->sec = sec;
820250661Sdavidcs		  p->count = 0;
821250661Sdavidcs		  p->pc_count = 0;
822250661Sdavidcs		}
823250661Sdavidcs
824250661Sdavidcs	      p->count += 1;
825250661Sdavidcs	      if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
826250661Sdavidcs		  || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
827250661Sdavidcs		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32
828250661Sdavidcs		  || ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL
829250661Sdavidcs		  || ELF64_R_TYPE (rel->r_info) == R_390_PC64)
830250661Sdavidcs		p->pc_count += 1;
831250661Sdavidcs	    }
832250661Sdavidcs	  break;
833250661Sdavidcs
834250661Sdavidcs	  /* This relocation describes the C++ object vtable hierarchy.
835250661Sdavidcs	     Reconstruct it for later use during GC.  */
836250661Sdavidcs        case R_390_GNU_VTINHERIT:
837250661Sdavidcs          if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
838250661Sdavidcs            return false;
839250661Sdavidcs          break;
840250661Sdavidcs
841250661Sdavidcs	  /* This relocation describes which C++ vtable entries are actually
842250661Sdavidcs	     used.  Record for later use during GC.  */
843250661Sdavidcs        case R_390_GNU_VTENTRY:
844250661Sdavidcs          if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
845250661Sdavidcs            return false;
846250661Sdavidcs          break;
847250661Sdavidcs
848250661Sdavidcs	default:
849250661Sdavidcs	  break;
850250661Sdavidcs	}
851250661Sdavidcs    }
852250661Sdavidcs
853250661Sdavidcs  return true;
854250661Sdavidcs}
855250661Sdavidcs
856250661Sdavidcs/* Return the section that should be marked against GC for a given
857250661Sdavidcs   relocation.  */
858250661Sdavidcs
859250661Sdavidcsstatic asection *
860250661Sdavidcself_s390_gc_mark_hook (sec, info, rel, h, sym)
861250661Sdavidcs     asection *sec;
862250661Sdavidcs     struct bfd_link_info *info ATTRIBUTE_UNUSED;
863250661Sdavidcs     Elf_Internal_Rela *rel;
864250661Sdavidcs     struct elf_link_hash_entry *h;
865250661Sdavidcs     Elf_Internal_Sym *sym;
866250661Sdavidcs{
867250661Sdavidcs  if (h != NULL)
868250661Sdavidcs    {
869250661Sdavidcs      switch (ELF64_R_TYPE (rel->r_info))
870250661Sdavidcs	{
871250661Sdavidcs	case R_390_GNU_VTINHERIT:
872250661Sdavidcs	case R_390_GNU_VTENTRY:
873250661Sdavidcs	  break;
874250661Sdavidcs
875250661Sdavidcs	default:
876250661Sdavidcs	  switch (h->root.type)
877250661Sdavidcs	    {
878250661Sdavidcs	    case bfd_link_hash_defined:
879250661Sdavidcs	    case bfd_link_hash_defweak:
880250661Sdavidcs	      return h->root.u.def.section;
881250661Sdavidcs
882250661Sdavidcs	    case bfd_link_hash_common:
883250661Sdavidcs	      return h->root.u.c.p->section;
884250661Sdavidcs
885250661Sdavidcs	    default:
886250661Sdavidcs	      break;
887250661Sdavidcs	    }
888250661Sdavidcs	}
889250661Sdavidcs    }
890250661Sdavidcs  else
891250661Sdavidcs    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
892250661Sdavidcs
893250661Sdavidcs  return NULL;
894250661Sdavidcs}
895250661Sdavidcs
896250661Sdavidcs/* Update the got entry reference counts for the section being removed.  */
897250661Sdavidcs
898250661Sdavidcsstatic boolean
899250661Sdavidcself_s390_gc_sweep_hook (abfd, info, sec, relocs)
900250661Sdavidcs     bfd *abfd;
901250661Sdavidcs     struct bfd_link_info *info;
902250661Sdavidcs     asection *sec;
903250661Sdavidcs     const Elf_Internal_Rela *relocs;
904250661Sdavidcs{
905250661Sdavidcs  Elf_Internal_Shdr *symtab_hdr;
906250661Sdavidcs  struct elf_link_hash_entry **sym_hashes;
907250661Sdavidcs  bfd_signed_vma *local_got_refcounts;
908250661Sdavidcs  const Elf_Internal_Rela *rel, *relend;
909250661Sdavidcs  unsigned long r_symndx;
910250661Sdavidcs  struct elf_link_hash_entry *h;
911250661Sdavidcs
912250661Sdavidcs  elf_section_data (sec)->local_dynrel = NULL;
913250661Sdavidcs
914250661Sdavidcs  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
915250661Sdavidcs  sym_hashes = elf_sym_hashes (abfd);
916250661Sdavidcs  local_got_refcounts = elf_local_got_refcounts (abfd);
917250661Sdavidcs
918250661Sdavidcs  relend = relocs + sec->reloc_count;
919250661Sdavidcs  for (rel = relocs; rel < relend; rel++)
920250661Sdavidcs    switch (ELF64_R_TYPE (rel->r_info))
921250661Sdavidcs      {
922250661Sdavidcs      case R_390_GOT12:
923250661Sdavidcs      case R_390_GOT16:
924250661Sdavidcs      case R_390_GOT32:
925250661Sdavidcs      case R_390_GOT64:
926250661Sdavidcs      case R_390_GOTOFF:
927250661Sdavidcs      case R_390_GOTPC:
928250661Sdavidcs      case R_390_GOTPCDBL:
929250661Sdavidcs      case R_390_GOTENT:
930250661Sdavidcs	r_symndx = ELF64_R_SYM (rel->r_info);
931250661Sdavidcs	if (r_symndx >= symtab_hdr->sh_info)
932250661Sdavidcs	  {
933250661Sdavidcs	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
934250661Sdavidcs	    if (h->got.refcount > 0)
935250661Sdavidcs	      h->got.refcount -= 1;
936250661Sdavidcs	  }
937250661Sdavidcs	else if (local_got_refcounts != NULL)
938250661Sdavidcs	  {
939250661Sdavidcs	    if (local_got_refcounts[r_symndx] > 0)
940250661Sdavidcs	      local_got_refcounts[r_symndx] -= 1;
941250661Sdavidcs	  }
942250661Sdavidcs	break;
943250661Sdavidcs
944250661Sdavidcs      case R_390_8:
945250661Sdavidcs      case R_390_12:
946250661Sdavidcs      case R_390_16:
947250661Sdavidcs      case R_390_32:
948250661Sdavidcs      case R_390_64:
949250661Sdavidcs      case R_390_PC16:
950250661Sdavidcs      case R_390_PC16DBL:
951250661Sdavidcs      case R_390_PC32:
952250661Sdavidcs      case R_390_PC32DBL:
953250661Sdavidcs      case R_390_PC64:
954250661Sdavidcs	r_symndx = ELF64_R_SYM (rel->r_info);
955250661Sdavidcs	if (r_symndx >= symtab_hdr->sh_info)
956250661Sdavidcs	  {
957250661Sdavidcs	    struct elf_s390_link_hash_entry *eh;
958250661Sdavidcs	    struct elf_s390_dyn_relocs **pp;
959250661Sdavidcs	    struct elf_s390_dyn_relocs *p;
960250661Sdavidcs
961250661Sdavidcs	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
962250661Sdavidcs
963250661Sdavidcs	    if (!info->shared && h->plt.refcount > 0)
964250661Sdavidcs	      h->plt.refcount -= 1;
965250661Sdavidcs
966250661Sdavidcs	    eh = (struct elf_s390_link_hash_entry *) h;
967250661Sdavidcs
968250661Sdavidcs	    for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
969250661Sdavidcs	      if (p->sec == sec)
970250661Sdavidcs		{
971250661Sdavidcs		  if (ELF64_R_TYPE (rel->r_info) == R_390_PC16
972250661Sdavidcs		      || ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL
973250661Sdavidcs		      || ELF64_R_TYPE (rel->r_info) == R_390_PC32)
974250661Sdavidcs		    p->pc_count -= 1;
975250661Sdavidcs		  p->count -= 1;
976250661Sdavidcs		  if (p->count == 0)
977250661Sdavidcs		    *pp = p->next;
978250661Sdavidcs		  break;
979250661Sdavidcs		}
980250661Sdavidcs	  }
981250661Sdavidcs	break;
982250661Sdavidcs
983250661Sdavidcs      case R_390_PLT16DBL:
984250661Sdavidcs      case R_390_PLT32:
985250661Sdavidcs      case R_390_PLT32DBL:
986250661Sdavidcs      case R_390_PLT64:
987250661Sdavidcs	r_symndx = ELF64_R_SYM (rel->r_info);
988250661Sdavidcs	if (r_symndx >= symtab_hdr->sh_info)
989250661Sdavidcs	  {
990250661Sdavidcs	    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
991250661Sdavidcs	    if (h->plt.refcount > 0)
992250661Sdavidcs	      h->plt.refcount -= 1;
993250661Sdavidcs	  }
994250661Sdavidcs	break;
995250661Sdavidcs
996250661Sdavidcs      default:
997250661Sdavidcs	break;
998250661Sdavidcs      }
999250661Sdavidcs
1000250661Sdavidcs  return true;
1001250661Sdavidcs}
1002250661Sdavidcs
1003250661Sdavidcs/* Adjust a symbol defined by a dynamic object and referenced by a
1004250661Sdavidcs   regular object.  The current definition is in some section of the
1005250661Sdavidcs   dynamic object, but we're not including those sections.  We have to
1006250661Sdavidcs   change the definition to something the rest of the link can
1007250661Sdavidcs   understand.  */
1008250661Sdavidcs
1009250661Sdavidcsstatic boolean
1010250661Sdavidcself_s390_adjust_dynamic_symbol (info, h)
1011250661Sdavidcs     struct bfd_link_info *info;
1012250661Sdavidcs     struct elf_link_hash_entry *h;
1013250661Sdavidcs{
1014250661Sdavidcs  struct elf_s390_link_hash_table *htab;
1015250661Sdavidcs  struct elf_s390_link_hash_entry * eh;
1016250661Sdavidcs  struct elf_s390_dyn_relocs *p;
1017250661Sdavidcs  asection *s;
1018250661Sdavidcs  unsigned int power_of_two;
1019250661Sdavidcs
1020250661Sdavidcs  /* If this is a function, put it in the procedure linkage table.  We
1021250661Sdavidcs     will fill in the contents of the procedure linkage table later
1022250661Sdavidcs     (although we could actually do it here).  */
1023250661Sdavidcs  if (h->type == STT_FUNC
1024250661Sdavidcs      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1025250661Sdavidcs    {
1026250661Sdavidcs      if (h->plt.refcount <= 0
1027250661Sdavidcs	  || (! info->shared
1028250661Sdavidcs	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1029250661Sdavidcs	      && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1030250661Sdavidcs	      && h->root.type != bfd_link_hash_undefweak
1031250661Sdavidcs	      && h->root.type != bfd_link_hash_undefined))
1032250661Sdavidcs	{
1033250661Sdavidcs	  /* This case can occur if we saw a PLT32 reloc in an input
1034250661Sdavidcs             file, but the symbol was never referred to by a dynamic
1035250661Sdavidcs             object, or if all references were garbage collected.  In
1036250661Sdavidcs	     such a case, we don't actually need to build a procedure
1037250661Sdavidcs	     linkage table, and we can just do a PC32 reloc instead.  */
1038250661Sdavidcs	  h->plt.offset = (bfd_vma) -1;
1039250661Sdavidcs	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1040250661Sdavidcs	}
1041250661Sdavidcs
1042250661Sdavidcs      return true;
1043250661Sdavidcs    }
1044250661Sdavidcs  else
1045250661Sdavidcs    /* It's possible that we incorrectly decided a .plt reloc was
1046250661Sdavidcs       needed for an R_390_PC32 reloc to a non-function sym in
1047250661Sdavidcs       check_relocs.  We can't decide accurately between function and
1048250661Sdavidcs       non-function syms in check-relocs;  Objects loaded later in
1049250661Sdavidcs       the link may change h->type.  So fix it now.  */
1050250661Sdavidcs    h->plt.offset = (bfd_vma) -1;
1051250661Sdavidcs
1052250661Sdavidcs  /* If this is a weak symbol, and there is a real definition, the
1053250661Sdavidcs     processor independent code will have arranged for us to see the
1054250661Sdavidcs     real definition first, and we can just use the same value.  */
1055250661Sdavidcs  if (h->weakdef != NULL)
1056250661Sdavidcs    {
1057250661Sdavidcs      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1058250661Sdavidcs		  || h->weakdef->root.type == bfd_link_hash_defweak);
1059250661Sdavidcs      h->root.u.def.section = h->weakdef->root.u.def.section;
1060250661Sdavidcs      h->root.u.def.value = h->weakdef->root.u.def.value;
1061250661Sdavidcs      return true;
1062250661Sdavidcs    }
1063250661Sdavidcs
1064250661Sdavidcs  /* This is a reference to a symbol defined by a dynamic object which
1065250661Sdavidcs     is not a function.  */
1066250661Sdavidcs
1067250661Sdavidcs  /* If we are creating a shared library, we must presume that the
1068250661Sdavidcs     only references to the symbol are via the global offset table.
1069250661Sdavidcs     For such cases we need not do anything here; the relocations will
1070250661Sdavidcs     be handled correctly by relocate_section.  */
1071250661Sdavidcs  if (info->shared)
1072250661Sdavidcs    return true;
1073250661Sdavidcs
1074250661Sdavidcs  /* If there are no references to this symbol that do not use the
1075250661Sdavidcs     GOT, we don't need to generate a copy reloc.  */
1076250661Sdavidcs  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1077250661Sdavidcs    return true;
1078258898Sdavidcs
1079258898Sdavidcs  /* If -z nocopyreloc was given, we won't generate them either.  */
1080258898Sdavidcs  if (info->nocopyreloc)
1081258898Sdavidcs    {
1082258898Sdavidcs      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1083250661Sdavidcs      return true;
1084250661Sdavidcs    }
1085250661Sdavidcs
1086250661Sdavidcs  eh = (struct elf_s390_link_hash_entry *) h;
1087250661Sdavidcs  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1088250661Sdavidcs    {
1089250661Sdavidcs      s = p->sec->output_section;
1090250661Sdavidcs      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1091250661Sdavidcs	break;
1092250661Sdavidcs    }
1093250661Sdavidcs
1094250661Sdavidcs  /* If we didn't find any dynamic relocs in read-only sections, then
1095250661Sdavidcs     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1096250661Sdavidcs  if (p == NULL)
1097250661Sdavidcs    {
1098250661Sdavidcs      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1099250661Sdavidcs      return true;
1100250661Sdavidcs    }
1101250661Sdavidcs
1102250661Sdavidcs  /* We must allocate the symbol in our .dynbss section, which will
1103250661Sdavidcs     become part of the .bss section of the executable.  There will be
1104250661Sdavidcs     an entry for this symbol in the .dynsym section.  The dynamic
1105250661Sdavidcs     object will contain position independent code, so all references
1106250661Sdavidcs     from the dynamic object to this symbol will go through the global
1107250661Sdavidcs     offset table.  The dynamic linker will use the .dynsym entry to
1108250661Sdavidcs     determine the address it must put in the global offset table, so
1109250661Sdavidcs     both the dynamic object and the regular object will refer to the
1110250661Sdavidcs     same memory location for the variable.  */
1111250661Sdavidcs
1112250661Sdavidcs  htab = elf_s390_hash_table (info);
1113250661Sdavidcs
1114250661Sdavidcs  /* We must generate a R_390_COPY reloc to tell the dynamic linker to
1115250661Sdavidcs     copy the initial value out of the dynamic object and into the
1116250661Sdavidcs     runtime process image.  */
1117250661Sdavidcs  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1118250661Sdavidcs    {
1119250661Sdavidcs      htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
1120250661Sdavidcs      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1121250661Sdavidcs    }
1122250661Sdavidcs
1123250661Sdavidcs  /* We need to figure out the alignment required for this symbol.  I
1124250661Sdavidcs     have no idea how ELF linkers handle this.  */
1125250661Sdavidcs  power_of_two = bfd_log2 (h->size);
1126250661Sdavidcs  if (power_of_two > 3)
1127250661Sdavidcs    power_of_two = 3;
1128250661Sdavidcs
1129250661Sdavidcs  /* Apply the required alignment.  */
1130250661Sdavidcs  s = htab->sdynbss;
1131250661Sdavidcs  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1132250661Sdavidcs  if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1133250661Sdavidcs    {
1134250661Sdavidcs      if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1135250661Sdavidcs	return false;
1136250661Sdavidcs    }
1137250661Sdavidcs
1138250661Sdavidcs  /* Define the symbol as being at this point in the section.  */
1139250661Sdavidcs  h->root.u.def.section = s;
1140250661Sdavidcs  h->root.u.def.value = s->_raw_size;
1141250661Sdavidcs
1142250661Sdavidcs  /* Increment the section size to make room for the symbol.  */
1143250661Sdavidcs  s->_raw_size += h->size;
1144250661Sdavidcs
1145250661Sdavidcs  return true;
1146250661Sdavidcs}
1147250661Sdavidcs
1148250661Sdavidcs/* This is the condition under which elf_s390_finish_dynamic_symbol
1149250661Sdavidcs   will be called from elflink.h.  If elflink.h doesn't call our
1150250661Sdavidcs   finish_dynamic_symbol routine, we'll need to do something about
1151250661Sdavidcs   initializing any .plt and .got entries in elf_s390_relocate_section.  */
1152250661Sdavidcs#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1153250661Sdavidcs  ((DYN)								\
1154250661Sdavidcs   && ((INFO)->shared							\
1155250661Sdavidcs       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)	\
1156250661Sdavidcs   && ((H)->dynindx != -1						\
1157250661Sdavidcs       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1158250661Sdavidcs
1159250661Sdavidcs/* Allocate space in .plt, .got and associated reloc sections for
1160250661Sdavidcs   dynamic relocs.  */
1161250661Sdavidcs
1162250661Sdavidcsstatic boolean
1163250661Sdavidcsallocate_dynrelocs (h, inf)
1164250661Sdavidcs     struct elf_link_hash_entry *h;
1165250661Sdavidcs     PTR inf;
1166250661Sdavidcs{
1167250661Sdavidcs  struct bfd_link_info *info;
1168250661Sdavidcs  struct elf_s390_link_hash_table *htab;
1169250661Sdavidcs  struct elf_s390_link_hash_entry *eh;
1170250661Sdavidcs  struct elf_s390_dyn_relocs *p;
1171250661Sdavidcs
1172250661Sdavidcs  if (h->root.type == bfd_link_hash_indirect)
1173250661Sdavidcs    return true;
1174250661Sdavidcs
1175250661Sdavidcs  if (h->root.type == bfd_link_hash_warning)
1176250661Sdavidcs    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1177250661Sdavidcs
1178250661Sdavidcs  info = (struct bfd_link_info *) inf;
1179250661Sdavidcs  htab = elf_s390_hash_table (info);
1180250661Sdavidcs
1181250661Sdavidcs  if (htab->elf.dynamic_sections_created
1182250661Sdavidcs      && h->plt.refcount > 0)
1183250661Sdavidcs    {
1184250661Sdavidcs      /* Make sure this symbol is output as a dynamic symbol.
1185250661Sdavidcs	 Undefined weak syms won't yet be marked as dynamic.  */
1186250661Sdavidcs      if (h->dynindx == -1
1187250661Sdavidcs	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1188250661Sdavidcs	{
1189250661Sdavidcs	  if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1190250661Sdavidcs	    return false;
1191250661Sdavidcs	}
1192250661Sdavidcs
1193250661Sdavidcs      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1194250661Sdavidcs	{
1195250661Sdavidcs	  asection *s = htab->splt;
1196250661Sdavidcs
1197250661Sdavidcs	  /* If this is the first .plt entry, make room for the special
1198250661Sdavidcs	     first entry.  */
1199250661Sdavidcs	  if (s->_raw_size == 0)
1200250661Sdavidcs	    s->_raw_size += PLT_FIRST_ENTRY_SIZE;
1201250661Sdavidcs
1202250661Sdavidcs	  h->plt.offset = s->_raw_size;
1203250661Sdavidcs
1204250661Sdavidcs	  /* If this symbol is not defined in a regular file, and we are
1205250661Sdavidcs	     not generating a shared library, then set the symbol to this
1206250661Sdavidcs	     location in the .plt.  This is required to make function
1207250661Sdavidcs	     pointers compare as equal between the normal executable and
1208250661Sdavidcs	     the shared library.  */
1209250661Sdavidcs	  if (! info->shared
1210250661Sdavidcs	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1211250661Sdavidcs	    {
1212250661Sdavidcs	      h->root.u.def.section = s;
1213250661Sdavidcs	      h->root.u.def.value = h->plt.offset;
1214250661Sdavidcs	    }
1215250661Sdavidcs
1216250661Sdavidcs	  /* Make room for this entry.  */
1217250661Sdavidcs	  s->_raw_size += PLT_ENTRY_SIZE;
1218250661Sdavidcs
1219250661Sdavidcs	  /* We also need to make an entry in the .got.plt section, which
1220250661Sdavidcs	     will be placed in the .got section by the linker script.  */
1221250661Sdavidcs	  htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
1222250661Sdavidcs
1223250661Sdavidcs	  /* We also need to make an entry in the .rela.plt section.  */
1224250661Sdavidcs	  htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
1225250661Sdavidcs	}
1226250661Sdavidcs      else
1227250661Sdavidcs	{
1228250661Sdavidcs	  h->plt.offset = (bfd_vma) -1;
1229250661Sdavidcs	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1230250661Sdavidcs	}
1231250661Sdavidcs    }
1232250661Sdavidcs  else
1233250661Sdavidcs    {
1234250661Sdavidcs      h->plt.offset = (bfd_vma) -1;
1235250661Sdavidcs      h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1236250661Sdavidcs    }
1237250661Sdavidcs
1238250661Sdavidcs  if (h->got.refcount > 0)
1239250661Sdavidcs    {
1240250661Sdavidcs      asection *s;
1241250661Sdavidcs      boolean dyn;
1242250661Sdavidcs
1243250661Sdavidcs      /* Make sure this symbol is output as a dynamic symbol.
1244250661Sdavidcs	 Undefined weak syms won't yet be marked as dynamic.  */
1245250661Sdavidcs      if (h->dynindx == -1
1246250661Sdavidcs	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1247250661Sdavidcs	{
1248250661Sdavidcs	  if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1249250661Sdavidcs	    return false;
1250250661Sdavidcs	}
1251250661Sdavidcs
1252250661Sdavidcs      s = htab->sgot;
1253250661Sdavidcs      h->got.offset = s->_raw_size;
1254250661Sdavidcs      s->_raw_size += GOT_ENTRY_SIZE;
1255250661Sdavidcs      dyn = htab->elf.dynamic_sections_created;
1256250661Sdavidcs      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1257250661Sdavidcs	htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1258250661Sdavidcs    }
1259250661Sdavidcs  else
1260250661Sdavidcs    h->got.offset = (bfd_vma) -1;
1261250661Sdavidcs
1262250661Sdavidcs  eh = (struct elf_s390_link_hash_entry *) h;
1263250661Sdavidcs  if (eh->dyn_relocs == NULL)
1264250661Sdavidcs    return true;
1265250661Sdavidcs
1266250661Sdavidcs  /* In the shared -Bsymbolic case, discard space allocated for
1267250661Sdavidcs     dynamic pc-relative relocs against symbols which turn out to be
1268250661Sdavidcs     defined in regular objects.  For the normal shared case, discard
1269250661Sdavidcs     space for pc-relative relocs that have become local due to symbol
1270250661Sdavidcs     visibility changes.  */
1271250661Sdavidcs
1272250661Sdavidcs  if (info->shared)
1273250661Sdavidcs    {
1274250661Sdavidcs      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1275250661Sdavidcs	  && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1276250661Sdavidcs	      || info->symbolic))
1277250661Sdavidcs	{
1278250661Sdavidcs	  struct elf_s390_dyn_relocs **pp;
1279250661Sdavidcs
1280250661Sdavidcs	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1281250661Sdavidcs	    {
1282250661Sdavidcs	      p->count -= p->pc_count;
1283250661Sdavidcs	      p->pc_count = 0;
1284250661Sdavidcs	      if (p->count == 0)
1285250661Sdavidcs		*pp = p->next;
1286250661Sdavidcs	      else
1287250661Sdavidcs		pp = &p->next;
1288250661Sdavidcs	    }
1289250661Sdavidcs	}
1290250661Sdavidcs    }
1291250661Sdavidcs  else
1292250661Sdavidcs    {
1293250661Sdavidcs      /* For the non-shared case, discard space for relocs against
1294250661Sdavidcs	 symbols which turn out to need copy relocs or are not
1295250661Sdavidcs	 dynamic.  */
1296250661Sdavidcs
1297250661Sdavidcs      if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1298250661Sdavidcs	  && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1299250661Sdavidcs	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1300250661Sdavidcs	      || (htab->elf.dynamic_sections_created
1301250661Sdavidcs		  && (h->root.type == bfd_link_hash_undefweak
1302250661Sdavidcs		      || h->root.type == bfd_link_hash_undefined))))
1303250661Sdavidcs	{
1304250661Sdavidcs	  /* Make sure this symbol is output as a dynamic symbol.
1305250661Sdavidcs	     Undefined weak syms won't yet be marked as dynamic.  */
1306250661Sdavidcs	  if (h->dynindx == -1
1307250661Sdavidcs	      && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1308250661Sdavidcs	    {
1309250661Sdavidcs	      if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1310250661Sdavidcs		return false;
1311250661Sdavidcs	    }
1312250661Sdavidcs
1313250661Sdavidcs	  /* If that succeeded, we know we'll be keeping all the
1314250661Sdavidcs	     relocs.  */
1315250661Sdavidcs	  if (h->dynindx != -1)
1316250661Sdavidcs	    goto keep;
1317250661Sdavidcs	}
1318250661Sdavidcs
1319250661Sdavidcs      eh->dyn_relocs = NULL;
1320250661Sdavidcs
1321250661Sdavidcs    keep: ;
1322250661Sdavidcs    }
1323250661Sdavidcs
1324250661Sdavidcs  /* Finally, allocate space.  */
1325250661Sdavidcs  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1326250661Sdavidcs    {
1327250661Sdavidcs      asection *sreloc = elf_section_data (p->sec)->sreloc;
1328250661Sdavidcs      sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
1329250661Sdavidcs    }
1330250661Sdavidcs
1331250661Sdavidcs  return true;
1332250661Sdavidcs}
1333250661Sdavidcs
1334250661Sdavidcs/* Find any dynamic relocs that apply to read-only sections.  */
1335250661Sdavidcs
1336250661Sdavidcsstatic boolean
1337250661Sdavidcsreadonly_dynrelocs (h, inf)
1338250661Sdavidcs     struct elf_link_hash_entry *h;
1339250661Sdavidcs     PTR inf;
1340250661Sdavidcs{
1341250661Sdavidcs  struct elf_s390_link_hash_entry *eh;
1342250661Sdavidcs  struct elf_s390_dyn_relocs *p;
1343250661Sdavidcs
1344250661Sdavidcs  if (h->root.type == bfd_link_hash_warning)
1345250661Sdavidcs    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1346250661Sdavidcs
1347250661Sdavidcs  eh = (struct elf_s390_link_hash_entry *) h;
1348250661Sdavidcs  for (p = eh->dyn_relocs; p != NULL; p = p->next)
1349250661Sdavidcs    {
1350250661Sdavidcs      asection *s = p->sec->output_section;
1351250661Sdavidcs
1352250661Sdavidcs      if (s != NULL && (s->flags & SEC_READONLY) != 0)
1353250661Sdavidcs	{
1354250661Sdavidcs	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
1355250661Sdavidcs
1356250661Sdavidcs	  info->flags |= DF_TEXTREL;
1357250661Sdavidcs
1358250661Sdavidcs	  /* Not an error, just cut short the traversal.  */
1359250661Sdavidcs	  return false;
1360250661Sdavidcs	}
1361250661Sdavidcs    }
1362250661Sdavidcs  return true;
1363250661Sdavidcs}
1364250661Sdavidcs
1365250661Sdavidcs/* Set the sizes of the dynamic sections.  */
1366250661Sdavidcs
1367250661Sdavidcsstatic boolean
1368250661Sdavidcself_s390_size_dynamic_sections (output_bfd, info)
1369250661Sdavidcs     bfd *output_bfd ATTRIBUTE_UNUSED;
1370250661Sdavidcs     struct bfd_link_info *info;
1371250661Sdavidcs{
1372250661Sdavidcs  struct elf_s390_link_hash_table *htab;
1373250661Sdavidcs  bfd *dynobj;
1374250661Sdavidcs  asection *s;
1375250661Sdavidcs  boolean relocs;
1376250661Sdavidcs  bfd *ibfd;
1377250661Sdavidcs
1378250661Sdavidcs  htab = elf_s390_hash_table (info);
1379250661Sdavidcs  dynobj = htab->elf.dynobj;
1380250661Sdavidcs  if (dynobj == NULL)
1381250661Sdavidcs    abort ();
1382250661Sdavidcs
1383250661Sdavidcs  if (htab->elf.dynamic_sections_created)
1384250661Sdavidcs    {
1385250661Sdavidcs      /* Set the contents of the .interp section to the interpreter.  */
1386250661Sdavidcs      if (! info->shared)
1387250661Sdavidcs	{
1388250661Sdavidcs	  s = bfd_get_section_by_name (dynobj, ".interp");
1389250661Sdavidcs	  if (s == NULL)
1390250661Sdavidcs	    abort ();
1391250661Sdavidcs	  s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1392250661Sdavidcs	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1393250661Sdavidcs	}
1394250661Sdavidcs    }
1395250661Sdavidcs
1396250661Sdavidcs  /* Set up .got offsets for local syms, and space for local dynamic
1397250661Sdavidcs     relocs.  */
1398250661Sdavidcs  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1399250661Sdavidcs    {
1400250661Sdavidcs      bfd_signed_vma *local_got;
1401250661Sdavidcs      bfd_signed_vma *end_local_got;
1402250661Sdavidcs      bfd_size_type locsymcount;
1403250661Sdavidcs      Elf_Internal_Shdr *symtab_hdr;
1404250661Sdavidcs      asection *srela;
1405250661Sdavidcs
1406250661Sdavidcs      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1407250661Sdavidcs	continue;
1408250661Sdavidcs
1409250661Sdavidcs      for (s = ibfd->sections; s != NULL; s = s->next)
1410250661Sdavidcs	{
1411250661Sdavidcs	  struct elf_s390_dyn_relocs *p;
1412250661Sdavidcs
1413250661Sdavidcs	  for (p = *((struct elf_s390_dyn_relocs **)
1414250661Sdavidcs		     &elf_section_data (s)->local_dynrel);
1415250661Sdavidcs	       p != NULL;
1416250661Sdavidcs	       p = p->next)
1417250661Sdavidcs	    {
1418250661Sdavidcs	      if (!bfd_is_abs_section (p->sec)
1419250661Sdavidcs		  && bfd_is_abs_section (p->sec->output_section))
1420250661Sdavidcs		{
1421250661Sdavidcs		  /* Input section has been discarded, either because
1422250661Sdavidcs		     it is a copy of a linkonce section or due to
1423250661Sdavidcs		     linker script /DISCARD/, so we'll be discarding
1424250661Sdavidcs		     the relocs too.  */
1425250661Sdavidcs		}
1426250661Sdavidcs	      else if (p->count != 0)
1427250661Sdavidcs		{
1428250661Sdavidcs		  srela = elf_section_data (p->sec)->sreloc;
1429250661Sdavidcs		  srela->_raw_size += p->count * sizeof (Elf64_External_Rela);
1430250661Sdavidcs		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1431250661Sdavidcs		    info->flags |= DF_TEXTREL;
1432250661Sdavidcs		}
1433250661Sdavidcs	    }
1434250661Sdavidcs	}
1435250661Sdavidcs
1436250661Sdavidcs      local_got = elf_local_got_refcounts (ibfd);
1437250661Sdavidcs      if (!local_got)
1438250661Sdavidcs	continue;
1439250661Sdavidcs
1440250661Sdavidcs      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1441250661Sdavidcs      locsymcount = symtab_hdr->sh_info;
1442250661Sdavidcs      end_local_got = local_got + locsymcount;
1443250661Sdavidcs      s = htab->sgot;
1444250661Sdavidcs      srela = htab->srelgot;
1445250661Sdavidcs      for (; local_got < end_local_got; ++local_got)
1446250661Sdavidcs	{
1447250661Sdavidcs	  if (*local_got > 0)
1448250661Sdavidcs	    {
1449250661Sdavidcs	      *local_got = s->_raw_size;
1450250661Sdavidcs	      s->_raw_size += GOT_ENTRY_SIZE;
1451250661Sdavidcs	      if (info->shared)
1452250661Sdavidcs		srela->_raw_size += sizeof (Elf64_External_Rela);
1453250661Sdavidcs	    }
1454250661Sdavidcs	  else
1455250661Sdavidcs	    *local_got = (bfd_vma) -1;
1456250661Sdavidcs	}
1457250661Sdavidcs    }
1458250661Sdavidcs
1459250661Sdavidcs  /* Allocate global sym .plt and .got entries, and space for global
1460250661Sdavidcs     sym dynamic relocs.  */
1461250661Sdavidcs  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1462250661Sdavidcs
1463250661Sdavidcs  /* We now have determined the sizes of the various dynamic sections.
1464250661Sdavidcs     Allocate memory for them.  */
1465250661Sdavidcs  relocs = false;
1466250661Sdavidcs  for (s = dynobj->sections; s != NULL; s = s->next)
1467250661Sdavidcs    {
1468250661Sdavidcs      if ((s->flags & SEC_LINKER_CREATED) == 0)
1469250661Sdavidcs	continue;
1470250661Sdavidcs
1471250661Sdavidcs      if (s == htab->splt
1472250661Sdavidcs	  || s == htab->sgot
1473250661Sdavidcs	  || s == htab->sgotplt)
1474250661Sdavidcs	{
1475250661Sdavidcs	  /* Strip this section if we don't need it; see the
1476250661Sdavidcs	     comment below.  */
1477250661Sdavidcs	}
1478250661Sdavidcs      else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1479250661Sdavidcs	{
1480250661Sdavidcs	  if (s->_raw_size != 0 && s != htab->srelplt)
1481250661Sdavidcs	    relocs = true;
1482250661Sdavidcs
1483250661Sdavidcs	  /* We use the reloc_count field as a counter if we need
1484250661Sdavidcs	     to copy relocs into the output file.  */
1485250661Sdavidcs	  s->reloc_count = 0;
1486250661Sdavidcs	}
1487250661Sdavidcs      else
1488250661Sdavidcs	{
1489250661Sdavidcs	  /* It's not one of our sections, so don't allocate space.  */
1490250661Sdavidcs	  continue;
1491250661Sdavidcs	}
1492250661Sdavidcs
1493250661Sdavidcs      if (s->_raw_size == 0)
1494250661Sdavidcs	{
1495250661Sdavidcs	  /* If we don't need this section, strip it from the
1496250661Sdavidcs	     output file.  This is to handle .rela.bss and
1497250661Sdavidcs	     .rela.plt.  We must create it in
1498250661Sdavidcs	     create_dynamic_sections, because it must be created
1499250661Sdavidcs	     before the linker maps input sections to output
1500250661Sdavidcs	     sections.  The linker does that before
1501250661Sdavidcs	     adjust_dynamic_symbol is called, and it is that
1502250661Sdavidcs	     function which decides whether anything needs to go
1503250661Sdavidcs	     into these sections.  */
1504250661Sdavidcs
1505250661Sdavidcs	  _bfd_strip_section_from_output (info, s);
1506250661Sdavidcs	  continue;
1507250661Sdavidcs	}
1508250661Sdavidcs
1509250661Sdavidcs      /* Allocate memory for the section contents.  We use bfd_zalloc
1510250661Sdavidcs	 here in case unused entries are not reclaimed before the
1511250661Sdavidcs	 section's contents are written out.  This should not happen,
1512250661Sdavidcs	 but this way if it does, we get a R_390_NONE reloc instead
1513250661Sdavidcs	 of garbage.  */
1514250661Sdavidcs      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1515250661Sdavidcs      if (s->contents == NULL)
1516250661Sdavidcs	return false;
1517250661Sdavidcs    }
1518250661Sdavidcs
1519250661Sdavidcs  if (htab->elf.dynamic_sections_created)
1520250661Sdavidcs    {
1521250661Sdavidcs      /* Add some entries to the .dynamic section.  We fill in the
1522250661Sdavidcs	 values later, in elf_s390_finish_dynamic_sections, but we
1523250661Sdavidcs	 must add the entries now so that we get the correct size for
1524250661Sdavidcs	 the .dynamic section.  The DT_DEBUG entry is filled in by the
1525250661Sdavidcs	 dynamic linker and used by the debugger.  */
1526250661Sdavidcs#define add_dynamic_entry(TAG, VAL) \
1527250661Sdavidcs  bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1528250661Sdavidcs
1529250661Sdavidcs      if (! info->shared)
1530250661Sdavidcs	{
1531250661Sdavidcs	  if (!add_dynamic_entry (DT_DEBUG, 0))
1532250661Sdavidcs	    return false;
1533250661Sdavidcs	}
1534250661Sdavidcs
1535250661Sdavidcs      if (htab->splt->_raw_size != 0)
1536250661Sdavidcs	{
1537250661Sdavidcs	  if (!add_dynamic_entry (DT_PLTGOT, 0)
1538250661Sdavidcs	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
1539250661Sdavidcs	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1540250661Sdavidcs	      || !add_dynamic_entry (DT_JMPREL, 0))
1541250661Sdavidcs	    return false;
1542250661Sdavidcs	}
1543250661Sdavidcs
1544250661Sdavidcs      if (relocs)
1545250661Sdavidcs        {
1546250661Sdavidcs          if (!add_dynamic_entry (DT_RELA, 0)
1547250661Sdavidcs              || !add_dynamic_entry (DT_RELASZ, 0)
1548250661Sdavidcs              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1549250661Sdavidcs	    return false;
1550250661Sdavidcs
1551250661Sdavidcs	  /* If any dynamic relocs apply to a read-only section,
1552250661Sdavidcs	     then we need a DT_TEXTREL entry.  */
1553250661Sdavidcs	  if ((info->flags & DF_TEXTREL) == 0)
1554250661Sdavidcs	    elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1555250661Sdavidcs				    (PTR) info);
1556250661Sdavidcs
1557250661Sdavidcs	  if ((info->flags & DF_TEXTREL) != 0)
1558250661Sdavidcs	    {
1559250661Sdavidcs	      if (!add_dynamic_entry (DT_TEXTREL, 0))
1560250661Sdavidcs		return false;
1561250661Sdavidcs	    }
1562250661Sdavidcs	}
1563250661Sdavidcs    }
1564250661Sdavidcs#undef add_dynamic_entry
1565250661Sdavidcs
1566250661Sdavidcs  return true;
1567250661Sdavidcs}
1568250661Sdavidcs
1569250661Sdavidcs/* Relocate a 390 ELF section.  */
1570250661Sdavidcs
1571250661Sdavidcsstatic boolean
1572250661Sdavidcself_s390_relocate_section (output_bfd, info, input_bfd, input_section,
1573250661Sdavidcs			      contents, relocs, local_syms, local_sections)
1574250661Sdavidcs     bfd *output_bfd;
1575250661Sdavidcs     struct bfd_link_info *info;
1576250661Sdavidcs     bfd *input_bfd;
1577250661Sdavidcs     asection *input_section;
1578250661Sdavidcs     bfd_byte *contents;
1579250661Sdavidcs     Elf_Internal_Rela *relocs;
1580250661Sdavidcs     Elf_Internal_Sym *local_syms;
1581250661Sdavidcs     asection **local_sections;
1582250661Sdavidcs{
1583250661Sdavidcs  struct elf_s390_link_hash_table *htab;
1584250661Sdavidcs  Elf_Internal_Shdr *symtab_hdr;
1585250661Sdavidcs  struct elf_link_hash_entry **sym_hashes;
1586250661Sdavidcs  bfd_vma *local_got_offsets;
1587250661Sdavidcs  Elf_Internal_Rela *rel;
1588250661Sdavidcs  Elf_Internal_Rela *relend;
1589250661Sdavidcs
1590250661Sdavidcs  if (info->relocateable)
1591250661Sdavidcs    return true;
1592250661Sdavidcs
1593250661Sdavidcs  htab = elf_s390_hash_table (info);
1594250661Sdavidcs  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1595250661Sdavidcs  sym_hashes = elf_sym_hashes (input_bfd);
1596250661Sdavidcs  local_got_offsets = elf_local_got_offsets (input_bfd);
1597250661Sdavidcs
1598250661Sdavidcs  rel = relocs;
1599250661Sdavidcs  relend = relocs + input_section->reloc_count;
1600250661Sdavidcs  for (; rel < relend; rel++)
1601250661Sdavidcs    {
1602250661Sdavidcs      int r_type;
1603250661Sdavidcs      reloc_howto_type *howto;
1604250661Sdavidcs      unsigned long r_symndx;
1605250661Sdavidcs      struct elf_link_hash_entry *h;
1606250661Sdavidcs      Elf_Internal_Sym *sym;
1607250661Sdavidcs      asection *sec;
1608250661Sdavidcs      bfd_vma off;
1609250661Sdavidcs      bfd_vma relocation;
1610250661Sdavidcs      boolean unresolved_reloc;
1611250661Sdavidcs      bfd_reloc_status_type r;
1612250661Sdavidcs
1613250661Sdavidcs      r_type = ELF64_R_TYPE (rel->r_info);
1614250661Sdavidcs      if (r_type == (int) R_390_GNU_VTINHERIT
1615250661Sdavidcs          || r_type == (int) R_390_GNU_VTENTRY)
1616250661Sdavidcs        continue;
1617250661Sdavidcs      if (r_type < 0 || r_type >= (int) R_390_max)
1618250661Sdavidcs	{
1619250661Sdavidcs	  bfd_set_error (bfd_error_bad_value);
1620250661Sdavidcs	  return false;
1621250661Sdavidcs	}
1622250661Sdavidcs
1623250661Sdavidcs      howto = elf_howto_table + r_type;
1624250661Sdavidcs      r_symndx = ELF64_R_SYM (rel->r_info);
1625250661Sdavidcs      h = NULL;
1626250661Sdavidcs      sym = NULL;
1627250661Sdavidcs      sec = NULL;
1628250661Sdavidcs      unresolved_reloc = false;
1629250661Sdavidcs      if (r_symndx < symtab_hdr->sh_info)
1630250661Sdavidcs	{
1631250661Sdavidcs	  sym = local_syms + r_symndx;
1632250661Sdavidcs	  sec = local_sections[r_symndx];
1633250661Sdavidcs	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1634250661Sdavidcs	}
1635250661Sdavidcs      else
1636250661Sdavidcs	{
1637250661Sdavidcs	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1638250661Sdavidcs	  while (h->root.type == bfd_link_hash_indirect
1639250661Sdavidcs		 || h->root.type == bfd_link_hash_warning)
1640250661Sdavidcs	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1641250661Sdavidcs
1642250661Sdavidcs	  if (h->root.type == bfd_link_hash_defined
1643250661Sdavidcs	      || h->root.type == bfd_link_hash_defweak)
1644250661Sdavidcs	    {
1645250661Sdavidcs	      sec = h->root.u.def.section;
1646250661Sdavidcs	      if (sec->output_section == NULL)
1647250661Sdavidcs		{
1648250661Sdavidcs		  /* Set a flag that will be cleared later if we find a
1649250661Sdavidcs		     relocation value for this symbol.  output_section
1650250661Sdavidcs		     is typically NULL for symbols satisfied by a shared
1651250661Sdavidcs		     library.  */
1652250661Sdavidcs		  unresolved_reloc = true;
1653250661Sdavidcs		  relocation = 0;
1654250661Sdavidcs		}
1655250661Sdavidcs	      else
1656250661Sdavidcs		relocation = (h->root.u.def.value
1657250661Sdavidcs			      + sec->output_section->vma
1658250661Sdavidcs			      + sec->output_offset);
1659250661Sdavidcs	    }
1660250661Sdavidcs	  else if (h->root.type == bfd_link_hash_undefweak)
1661250661Sdavidcs	    relocation = 0;
1662250661Sdavidcs	  else if (info->shared
1663250661Sdavidcs		   && (!info->symbolic || info->allow_shlib_undefined)
1664250661Sdavidcs		   && !info->no_undefined
1665250661Sdavidcs		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1666250661Sdavidcs	    relocation = 0;
1667250661Sdavidcs	  else
1668250661Sdavidcs	    {
1669250661Sdavidcs	      if (! ((*info->callbacks->undefined_symbol)
1670250661Sdavidcs		     (info, h->root.root.string, input_bfd,
1671250661Sdavidcs          	      input_section, rel->r_offset,
1672250661Sdavidcs		      (!info->shared || info->no_undefined
1673250661Sdavidcs		       || ELF_ST_VISIBILITY (h->other)))))
1674250661Sdavidcs		return false;
1675250661Sdavidcs	      relocation = 0;
1676250661Sdavidcs	    }
1677250661Sdavidcs	}
1678250661Sdavidcs
1679250661Sdavidcs      switch (r_type)
1680250661Sdavidcs	{
1681250661Sdavidcs        case R_390_GOT12:
1682250661Sdavidcs        case R_390_GOT16:
1683250661Sdavidcs        case R_390_GOT32:
1684250661Sdavidcs        case R_390_GOT64:
1685250661Sdavidcs        case R_390_GOTENT:
1686250661Sdavidcs          /* Relocation is to the entry for this symbol in the global
1687250661Sdavidcs             offset table.  */
1688250661Sdavidcs	  if (htab->sgot == NULL)
1689250661Sdavidcs	    abort ();
1690250661Sdavidcs
1691250661Sdavidcs          if (h != NULL)
1692250661Sdavidcs            {
1693250661Sdavidcs	      boolean dyn;
1694250661Sdavidcs
1695250661Sdavidcs              off = h->got.offset;
1696250661Sdavidcs	      dyn = htab->elf.dynamic_sections_created;
1697250661Sdavidcs              if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1698250661Sdavidcs                  || (info->shared
1699250661Sdavidcs                      && (info->symbolic
1700250661Sdavidcs			  || h->dynindx == -1
1701250661Sdavidcs			  || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1702250661Sdavidcs                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1703250661Sdavidcs                {
1704250661Sdavidcs                  /* This is actually a static link, or it is a
1705250661Sdavidcs                     -Bsymbolic link and the symbol is defined
1706250661Sdavidcs                     locally, or the symbol was forced to be local
1707250661Sdavidcs                     because of a version file.  We must initialize
1708250661Sdavidcs                     this entry in the global offset table.  Since the
1709250661Sdavidcs                     offset must always be a multiple of 2, we use the
1710250661Sdavidcs                     least significant bit to record whether we have
1711250661Sdavidcs                     initialized it already.
1712250661Sdavidcs
1713250661Sdavidcs                     When doing a dynamic link, we create a .rel.got
1714250661Sdavidcs                     relocation entry to initialize the value.  This
1715250661Sdavidcs                     is done in the finish_dynamic_symbol routine.  */
1716250661Sdavidcs                  if ((off & 1) != 0)
1717250661Sdavidcs                    off &= ~1;
1718250661Sdavidcs                  else
1719250661Sdavidcs                    {
1720250661Sdavidcs		      bfd_put_64 (output_bfd, relocation,
1721250661Sdavidcs				  htab->sgot->contents + off);
1722250661Sdavidcs                      h->got.offset |= 1;
1723250661Sdavidcs                    }
1724250661Sdavidcs                }
1725250661Sdavidcs	      else
1726250661Sdavidcs		unresolved_reloc = false;
1727250661Sdavidcs            }
1728250661Sdavidcs          else
1729250661Sdavidcs            {
1730250661Sdavidcs	      if (local_got_offsets == NULL)
1731250661Sdavidcs		abort ();
1732250661Sdavidcs
1733250661Sdavidcs              off = local_got_offsets[r_symndx];
1734250661Sdavidcs
1735250661Sdavidcs              /* The offset must always be a multiple of 8.  We use
1736250661Sdavidcs                 the least significant bit to record whether we have
1737250661Sdavidcs                 already generated the necessary reloc.  */
1738250661Sdavidcs              if ((off & 1) != 0)
1739250661Sdavidcs                off &= ~1;
1740250661Sdavidcs              else
1741250661Sdavidcs                {
1742250661Sdavidcs                  bfd_put_64 (output_bfd, relocation,
1743250661Sdavidcs			      htab->sgot->contents + off);
1744250661Sdavidcs
1745250661Sdavidcs                  if (info->shared)
1746250661Sdavidcs                    {
1747250661Sdavidcs                      asection *srelgot;
1748250661Sdavidcs                      Elf_Internal_Rela outrel;
1749250661Sdavidcs		      Elf64_External_Rela *loc;
1750250661Sdavidcs
1751250661Sdavidcs                      srelgot = htab->srelgot;
1752250661Sdavidcs		      if (srelgot == NULL)
1753250661Sdavidcs			abort ();
1754250661Sdavidcs
1755250661Sdavidcs                      outrel.r_offset = (htab->sgot->output_section->vma
1756250661Sdavidcs                                         + htab->sgot->output_offset
1757250661Sdavidcs                                         + off);
1758250661Sdavidcs                      outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1759250661Sdavidcs		      outrel.r_addend = relocation;
1760250661Sdavidcs		      loc = (Elf64_External_Rela *) srelgot->contents;
1761250661Sdavidcs		      loc += srelgot->reloc_count++;
1762250661Sdavidcs                      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1763250661Sdavidcs                    }
1764250661Sdavidcs
1765250661Sdavidcs                  local_got_offsets[r_symndx] |= 1;
1766250661Sdavidcs                }
1767250661Sdavidcs            }
1768250661Sdavidcs
1769250661Sdavidcs	  if (off >= (bfd_vma) -2)
1770250661Sdavidcs	    abort ();
1771250661Sdavidcs
1772250661Sdavidcs	  relocation = htab->sgot->output_offset + off;
1773250661Sdavidcs
1774250661Sdavidcs	  /*
1775250661Sdavidcs	   * For @GOTENT the relocation is against the offset between
1776250661Sdavidcs	   * the instruction and the symbols entry in the GOT and not
1777250661Sdavidcs	   * between the start of the GOT and the symbols entry. We
1778250661Sdavidcs	   * add the vma of the GOT to get the correct value.
1779250661Sdavidcs	   */
1780250661Sdavidcs	  if (r_type == R_390_GOTENT)
1781250661Sdavidcs	    relocation += htab->sgot->output_section->vma;
1782250661Sdavidcs
1783250661Sdavidcs          break;
1784250661Sdavidcs
1785250661Sdavidcs        case R_390_GOTOFF:
1786250661Sdavidcs          /* Relocation is relative to the start of the global offset
1787250661Sdavidcs             table.  */
1788250661Sdavidcs
1789250661Sdavidcs          /* Note that sgot->output_offset is not involved in this
1790250661Sdavidcs             calculation.  We always want the start of .got.  If we
1791250661Sdavidcs             defined _GLOBAL_OFFSET_TABLE in a different way, as is
1792250661Sdavidcs             permitted by the ABI, we might have to change this
1793250661Sdavidcs             calculation.  */
1794250661Sdavidcs          relocation -= htab->sgot->output_section->vma;
1795250661Sdavidcs
1796250661Sdavidcs          break;
1797250661Sdavidcs
1798250661Sdavidcs        case R_390_GOTPC:
1799250661Sdavidcs	case R_390_GOTPCDBL:
1800250661Sdavidcs          /* Use global offset table as symbol value.  */
1801250661Sdavidcs          relocation = htab->sgot->output_section->vma;
1802250661Sdavidcs	  unresolved_reloc = false;
1803250661Sdavidcs         break;
1804250661Sdavidcs
1805250661Sdavidcs        case R_390_PLT16DBL:
1806250661Sdavidcs        case R_390_PLT32:
1807250661Sdavidcs        case R_390_PLT32DBL:
1808250661Sdavidcs        case R_390_PLT64:
1809250661Sdavidcs          /* Relocation is to the entry for this symbol in the
1810250661Sdavidcs             procedure linkage table.  */
1811250661Sdavidcs
1812250661Sdavidcs          /* Resolve a PLT32 reloc against a local symbol directly,
1813250661Sdavidcs             without using the procedure linkage table.  */
1814250661Sdavidcs          if (h == NULL)
1815250661Sdavidcs            break;
1816250661Sdavidcs
1817250661Sdavidcs          if (h->plt.offset == (bfd_vma) -1
1818250661Sdavidcs	      || htab->splt == NULL)
1819250661Sdavidcs            {
1820250661Sdavidcs              /* We didn't make a PLT entry for this symbol.  This
1821250661Sdavidcs                 happens when statically linking PIC code, or when
1822250661Sdavidcs                 using -Bsymbolic.  */
1823250661Sdavidcs              break;
1824250661Sdavidcs            }
1825250661Sdavidcs
1826250661Sdavidcs          relocation = (htab->splt->output_section->vma
1827250661Sdavidcs                        + htab->splt->output_offset
1828250661Sdavidcs                        + h->plt.offset);
1829250661Sdavidcs	  unresolved_reloc = false;
1830250661Sdavidcs          break;
1831250661Sdavidcs
1832250661Sdavidcs        case R_390_8:
1833250661Sdavidcs        case R_390_16:
1834250661Sdavidcs        case R_390_32:
1835250661Sdavidcs        case R_390_64:
1836250661Sdavidcs        case R_390_PC16:
1837250661Sdavidcs        case R_390_PC16DBL:
1838250661Sdavidcs        case R_390_PC32:
1839250661Sdavidcs	case R_390_PC32DBL:
1840250661Sdavidcs        case R_390_PC64:
1841250661Sdavidcs	  /* r_symndx will be zero only for relocs against symbols
1842250661Sdavidcs	     from removed linkonce sections, or sections discarded by
1843250661Sdavidcs	     a linker script.  */
1844250661Sdavidcs          if (r_symndx == 0
1845250661Sdavidcs              || (input_section->flags & SEC_ALLOC) == 0)
1846250661Sdavidcs	    break;
1847250661Sdavidcs
1848250661Sdavidcs          if ((info->shared
1849250661Sdavidcs	       && ((r_type != R_390_PC16
1850250661Sdavidcs		    && r_type != R_390_PC16DBL
1851250661Sdavidcs		    && r_type != R_390_PC32
1852250661Sdavidcs		    && r_type != R_390_PC32DBL
1853250661Sdavidcs		    && r_type != R_390_PC64)
1854250661Sdavidcs		   || (h != NULL
1855250661Sdavidcs		       && h->dynindx != -1
1856250661Sdavidcs		       && (! info->symbolic
1857250661Sdavidcs			   || (h->elf_link_hash_flags
1858250661Sdavidcs			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1859250661Sdavidcs	      || (!info->shared
1860250661Sdavidcs		  && h != NULL
1861250661Sdavidcs		  && h->dynindx != -1
1862250661Sdavidcs		  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1863250661Sdavidcs		  && (((h->elf_link_hash_flags
1864250661Sdavidcs			& ELF_LINK_HASH_DEF_DYNAMIC) != 0
1865250661Sdavidcs		       && (h->elf_link_hash_flags
1866250661Sdavidcs			   & ELF_LINK_HASH_DEF_REGULAR) == 0)
1867250661Sdavidcs		      || h->root.type == bfd_link_hash_undefweak
1868250661Sdavidcs		      || h->root.type == bfd_link_hash_undefined)))
1869250661Sdavidcs            {
1870250661Sdavidcs              Elf_Internal_Rela outrel;
1871250661Sdavidcs              boolean skip, relocate;
1872250661Sdavidcs	      asection *sreloc;
1873250661Sdavidcs	      Elf64_External_Rela *loc;
1874250661Sdavidcs
1875250661Sdavidcs              /* When generating a shared object, these relocations
1876250661Sdavidcs                 are copied into the output file to be resolved at run
1877250661Sdavidcs                 time.  */
1878250661Sdavidcs
1879250661Sdavidcs              skip = false;
1880250661Sdavidcs              relocate = false;
1881250661Sdavidcs
1882250661Sdavidcs	      outrel.r_offset =
1883250661Sdavidcs		_bfd_elf_section_offset (output_bfd, info, input_section,
1884250661Sdavidcs					 rel->r_offset);
1885250661Sdavidcs	      if (outrel.r_offset == (bfd_vma) -1)
1886250661Sdavidcs		skip = true;
1887250661Sdavidcs	      else if (outrel.r_offset == (bfd_vma) -2)
1888250661Sdavidcs		skip = true, relocate = true;
1889250661Sdavidcs
1890250661Sdavidcs              outrel.r_offset += (input_section->output_section->vma
1891250661Sdavidcs                                  + input_section->output_offset);
1892250661Sdavidcs
1893250661Sdavidcs              if (skip)
1894250661Sdavidcs		memset (&outrel, 0, sizeof outrel);
1895250661Sdavidcs              else if (h != NULL
1896250661Sdavidcs		       && h->dynindx != -1
1897250661Sdavidcs		       && (r_type == R_390_PC16
1898250661Sdavidcs			   || r_type == R_390_PC16DBL
1899250661Sdavidcs			   || r_type == R_390_PC32
1900250661Sdavidcs			   || r_type == R_390_PC32DBL
1901250661Sdavidcs			   || r_type == R_390_PC64
1902250661Sdavidcs			   || !info->shared
1903250661Sdavidcs			   || !info->symbolic
1904250661Sdavidcs			   || (h->elf_link_hash_flags
1905250661Sdavidcs			       & ELF_LINK_HASH_DEF_REGULAR) == 0))
1906250661Sdavidcs                {
1907250661Sdavidcs                  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
1908250661Sdavidcs		  outrel.r_addend = rel->r_addend;
1909250661Sdavidcs                }
1910250661Sdavidcs              else
1911250661Sdavidcs                {
1912250661Sdavidcs		  /* This symbol is local, or marked to become local.  */
1913250661Sdavidcs		  relocate = true;
1914250661Sdavidcs		  outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1915250661Sdavidcs		  outrel.r_addend = relocation + rel->r_addend;
1916250661Sdavidcs		}
1917250661Sdavidcs
1918250661Sdavidcs	      sreloc = elf_section_data (input_section)->sreloc;
1919250661Sdavidcs	      if (sreloc == NULL)
1920250661Sdavidcs		abort ();
1921250661Sdavidcs
1922250661Sdavidcs	      loc = (Elf64_External_Rela *) sreloc->contents;
1923250661Sdavidcs	      loc += sreloc->reloc_count++;
1924250661Sdavidcs              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1925250661Sdavidcs
1926250661Sdavidcs              /* If this reloc is against an external symbol, we do
1927250661Sdavidcs                 not want to fiddle with the addend.  Otherwise, we
1928250661Sdavidcs                 need to include the symbol value so that it becomes
1929250661Sdavidcs                 an addend for the dynamic reloc.  */
1930250661Sdavidcs              if (! relocate)
1931250661Sdavidcs                continue;
1932250661Sdavidcs            }
1933250661Sdavidcs
1934250661Sdavidcs          break;
1935250661Sdavidcs
1936250661Sdavidcs        default:
1937250661Sdavidcs          break;
1938250661Sdavidcs        }
1939250661Sdavidcs
1940250661Sdavidcs      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
1941250661Sdavidcs	 because such sections are not SEC_ALLOC and thus ld.so will
1942250661Sdavidcs	 not process them.  */
1943250661Sdavidcs      if (unresolved_reloc
1944250661Sdavidcs	  && !((input_section->flags & SEC_DEBUGGING) != 0
1945250661Sdavidcs	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1946250661Sdavidcs	(*_bfd_error_handler)
1947250661Sdavidcs	  (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1948250661Sdavidcs	   bfd_archive_filename (input_bfd),
1949250661Sdavidcs	   bfd_get_section_name (input_bfd, input_section),
1950250661Sdavidcs	   (long) rel->r_offset,
1951250661Sdavidcs	   h->root.root.string);
1952250661Sdavidcs
1953250661Sdavidcs      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1954250661Sdavidcs				      contents, rel->r_offset,
1955250661Sdavidcs				      relocation, rel->r_addend);
1956250661Sdavidcs
1957250661Sdavidcs      if (r != bfd_reloc_ok)
1958250661Sdavidcs	{
1959250661Sdavidcs	  const char *name;
1960250661Sdavidcs
1961250661Sdavidcs	  if (h != NULL)
1962250661Sdavidcs	    name = h->root.root.string;
1963250661Sdavidcs	  else
1964250661Sdavidcs	    {
1965250661Sdavidcs	      name = bfd_elf_string_from_elf_section (input_bfd,
1966250661Sdavidcs						      symtab_hdr->sh_link,
1967250661Sdavidcs						      sym->st_name);
1968250661Sdavidcs	      if (name == NULL)
1969250661Sdavidcs		return false;
1970250661Sdavidcs	      if (*name == '\0')
1971250661Sdavidcs		name = bfd_section_name (input_bfd, sec);
1972250661Sdavidcs	    }
1973250661Sdavidcs
1974250661Sdavidcs	  if (r == bfd_reloc_overflow)
1975250661Sdavidcs	    {
1976250661Sdavidcs
1977250661Sdavidcs	      if (! ((*info->callbacks->reloc_overflow)
1978250661Sdavidcs		     (info, name, howto->name, (bfd_vma) 0,
1979250661Sdavidcs		      input_bfd, input_section, rel->r_offset)))
1980250661Sdavidcs		return false;
1981250661Sdavidcs	    }
1982250661Sdavidcs	  else
1983250661Sdavidcs	    {
1984250661Sdavidcs	      (*_bfd_error_handler)
1985250661Sdavidcs		(_("%s(%s+0x%lx): reloc against `%s': error %d"),
1986250661Sdavidcs		 bfd_archive_filename (input_bfd),
1987250661Sdavidcs		 bfd_get_section_name (input_bfd, input_section),
1988250661Sdavidcs		 (long) rel->r_offset, name, (int) r);
1989250661Sdavidcs	      return false;
1990250661Sdavidcs	    }
1991250661Sdavidcs	}
1992250661Sdavidcs    }
1993250661Sdavidcs
1994250661Sdavidcs  return true;
1995250661Sdavidcs}
1996250661Sdavidcs
1997250661Sdavidcs/* Finish up dynamic symbol handling.  We set the contents of various
1998250661Sdavidcs   dynamic sections here.  */
1999250661Sdavidcs
2000250661Sdavidcsstatic boolean
2001250661Sdavidcself_s390_finish_dynamic_symbol (output_bfd, info, h, sym)
2002250661Sdavidcs     bfd *output_bfd;
2003250661Sdavidcs     struct bfd_link_info *info;
2004250661Sdavidcs     struct elf_link_hash_entry *h;
2005250661Sdavidcs     Elf_Internal_Sym *sym;
2006250661Sdavidcs{
2007250661Sdavidcs  struct elf_s390_link_hash_table *htab;
2008250661Sdavidcs
2009250661Sdavidcs  htab = elf_s390_hash_table (info);
2010250661Sdavidcs
2011250661Sdavidcs  if (h->plt.offset != (bfd_vma) -1)
2012250661Sdavidcs    {
2013250661Sdavidcs      bfd_vma plt_index;
2014250661Sdavidcs      bfd_vma got_offset;
2015250661Sdavidcs      Elf_Internal_Rela rela;
2016250661Sdavidcs      Elf64_External_Rela *loc;
2017250661Sdavidcs
2018250661Sdavidcs      /* This symbol has an entry in the procedure linkage table.  Set
2019250661Sdavidcs         it up.  */
2020250661Sdavidcs
2021250661Sdavidcs      if (h->dynindx == -1
2022250661Sdavidcs	  || htab->splt == NULL
2023250661Sdavidcs	  || htab->sgotplt == NULL
2024250661Sdavidcs	  || htab->srelplt == NULL)
2025250661Sdavidcs	abort ();
2026250661Sdavidcs
2027250661Sdavidcs      /* Calc. index no.
2028250661Sdavidcs         Current offset - size first entry / entry size.  */
2029250661Sdavidcs      plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
2030250661Sdavidcs
2031250661Sdavidcs      /* Offset in GOT is PLT index plus GOT headers(3) times 8,
2032250661Sdavidcs         addr & GOT addr.  */
2033250661Sdavidcs      got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
2034250661Sdavidcs
2035250661Sdavidcs      /* Fill in the blueprint of a PLT.  */
2036250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD0,
2037250661Sdavidcs		  htab->splt->contents + h->plt.offset);
2038250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD1,
2039250661Sdavidcs		  htab->splt->contents + h->plt.offset + 4);
2040250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
2041250661Sdavidcs		  htab->splt->contents + h->plt.offset + 8);
2042250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
2043250661Sdavidcs		  htab->splt->contents + h->plt.offset + 12);
2044250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD4,
2045250661Sdavidcs		  htab->splt->contents + h->plt.offset + 16);
2046250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD5,
2047250661Sdavidcs		  htab->splt->contents + h->plt.offset + 20);
2048250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD6,
2049250661Sdavidcs		  htab->splt->contents + h->plt.offset + 24);
2050250661Sdavidcs      bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD7,
2051250661Sdavidcs		  htab->splt->contents + h->plt.offset + 28);
2052250661Sdavidcs      /* Fixup the relative address to the GOT entry */
2053250661Sdavidcs      bfd_put_32 (output_bfd,
2054250661Sdavidcs		  (htab->sgotplt->output_section->vma +
2055250661Sdavidcs		   htab->sgotplt->output_offset + got_offset
2056250661Sdavidcs		   - (htab->splt->output_section->vma + h->plt.offset))/2,
2057250661Sdavidcs		  htab->splt->contents + h->plt.offset + 2);
2058250661Sdavidcs      /* Fixup the relative branch to PLT 0 */
2059250661Sdavidcs      bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
2060250661Sdavidcs				 (PLT_ENTRY_SIZE * plt_index) + 22)/2,
2061250661Sdavidcs		  htab->splt->contents + h->plt.offset + 24);
2062250661Sdavidcs      /* Fixup offset into symbol table */
2063250661Sdavidcs      bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
2064250661Sdavidcs		  htab->splt->contents + h->plt.offset + 28);
2065250661Sdavidcs
2066250661Sdavidcs      /* Fill in the entry in the global offset table.
2067250661Sdavidcs         Points to instruction after GOT offset.  */
2068250661Sdavidcs      bfd_put_64 (output_bfd,
2069250661Sdavidcs		  (htab->splt->output_section->vma
2070250661Sdavidcs		   + htab->splt->output_offset
2071250661Sdavidcs		   + h->plt.offset
2072250661Sdavidcs		   + 14),
2073250661Sdavidcs		  htab->sgotplt->contents + got_offset);
2074250661Sdavidcs
2075250661Sdavidcs      /* Fill in the entry in the .rela.plt section.  */
2076250661Sdavidcs      rela.r_offset = (htab->sgotplt->output_section->vma
2077250661Sdavidcs		       + htab->sgotplt->output_offset
2078250661Sdavidcs		       + got_offset);
2079250661Sdavidcs      rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
2080250661Sdavidcs      rela.r_addend = 0;
2081250661Sdavidcs      loc = (Elf64_External_Rela *) htab->srelplt->contents + plt_index;
2082250661Sdavidcs      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2083250661Sdavidcs
2084250661Sdavidcs      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2085250661Sdavidcs	{
2086250661Sdavidcs	  /* Mark the symbol as undefined, rather than as defined in
2087250661Sdavidcs	     the .plt section.  Leave the value alone.  This is a clue
2088250661Sdavidcs	     for the dynamic linker, to make function pointer
2089250661Sdavidcs	     comparisons work between an application and shared
2090250661Sdavidcs	     library.  */
2091250661Sdavidcs	  sym->st_shndx = SHN_UNDEF;
2092250661Sdavidcs	}
2093250661Sdavidcs    }
2094250661Sdavidcs
2095250661Sdavidcs  if (h->got.offset != (bfd_vma) -1)
2096250661Sdavidcs    {
2097250661Sdavidcs      Elf_Internal_Rela rela;
2098250661Sdavidcs      Elf64_External_Rela *loc;
2099250661Sdavidcs
2100250661Sdavidcs      /* This symbol has an entry in the global offset table.  Set it
2101250661Sdavidcs         up.  */
2102250661Sdavidcs
2103250661Sdavidcs      if (htab->sgot == NULL || htab->srelgot == NULL)
2104250661Sdavidcs	abort ();
2105250661Sdavidcs
2106250661Sdavidcs      rela.r_offset = (htab->sgot->output_section->vma
2107250661Sdavidcs		       + htab->sgot->output_offset
2108250661Sdavidcs		       + (h->got.offset &~ (bfd_vma) 1));
2109250661Sdavidcs
2110250661Sdavidcs      /* If this is a static link, or it is a -Bsymbolic link and the
2111250661Sdavidcs	 symbol is defined locally or was forced to be local because
2112250661Sdavidcs	 of a version file, we just want to emit a RELATIVE reloc.
2113250661Sdavidcs	 The entry in the global offset table will already have been
2114250661Sdavidcs	 initialized in the relocate_section function.  */
2115250661Sdavidcs      if (info->shared
2116250661Sdavidcs	  && (info->symbolic
2117250661Sdavidcs	      || h->dynindx == -1
2118250661Sdavidcs	      || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2119250661Sdavidcs	  && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2120250661Sdavidcs        {
2121250661Sdavidcs	  BFD_ASSERT((h->got.offset & 1) != 0);
2122250661Sdavidcs          rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
2123250661Sdavidcs          rela.r_addend = (h->root.u.def.value
2124250661Sdavidcs                           + h->root.u.def.section->output_section->vma
2125250661Sdavidcs                           + h->root.u.def.section->output_offset);
2126250661Sdavidcs        }
2127250661Sdavidcs      else
2128250661Sdavidcs	{
2129250661Sdavidcs	  BFD_ASSERT((h->got.offset & 1) == 0);
2130250661Sdavidcs	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgot->contents + h->got.offset);
2131250661Sdavidcs	  rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
2132250661Sdavidcs          rela.r_addend = 0;
2133250661Sdavidcs        }
2134250661Sdavidcs
2135250661Sdavidcs      loc = (Elf64_External_Rela *) htab->srelgot->contents;
2136250661Sdavidcs      loc += htab->srelgot->reloc_count++;
2137250661Sdavidcs      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2138250661Sdavidcs    }
2139250661Sdavidcs
2140250661Sdavidcs  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2141250661Sdavidcs    {
2142250661Sdavidcs      Elf_Internal_Rela rela;
2143250661Sdavidcs      Elf64_External_Rela *loc;
2144250661Sdavidcs
2145250661Sdavidcs      /* This symbols needs a copy reloc.  Set it up.  */
2146250661Sdavidcs
2147250661Sdavidcs      if (h->dynindx == -1
2148250661Sdavidcs	  || (h->root.type != bfd_link_hash_defined
2149250661Sdavidcs	      && h->root.type != bfd_link_hash_defweak)
2150250661Sdavidcs	  || htab->srelbss == NULL)
2151250661Sdavidcs	abort ();
2152250661Sdavidcs
2153250661Sdavidcs      rela.r_offset = (h->root.u.def.value
2154250661Sdavidcs		       + h->root.u.def.section->output_section->vma
2155250661Sdavidcs		       + h->root.u.def.section->output_offset);
2156250661Sdavidcs      rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
2157250661Sdavidcs      rela.r_addend = 0;
2158250661Sdavidcs      loc = (Elf64_External_Rela *) htab->srelbss->contents;
2159250661Sdavidcs      loc += htab->srelbss->reloc_count++;
2160250661Sdavidcs      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2161250661Sdavidcs    }
2162250661Sdavidcs
2163250661Sdavidcs  /* Mark some specially defined symbols as absolute.  */
2164250661Sdavidcs  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2165250661Sdavidcs      || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
2166250661Sdavidcs      || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
2167250661Sdavidcs    sym->st_shndx = SHN_ABS;
2168250661Sdavidcs
2169250661Sdavidcs  return true;
2170250661Sdavidcs}
2171250661Sdavidcs
2172250661Sdavidcs/* Used to decide how to sort relocs in an optimal manner for the
2173250661Sdavidcs   dynamic linker, before writing them out.  */
2174250661Sdavidcs
2175250661Sdavidcsstatic enum elf_reloc_type_class
2176250661Sdavidcself_s390_reloc_type_class (rela)
2177250661Sdavidcs     const Elf_Internal_Rela *rela;
2178250661Sdavidcs{
2179250661Sdavidcs  switch ((int) ELF64_R_TYPE (rela->r_info))
2180250661Sdavidcs    {
2181250661Sdavidcs    case R_390_RELATIVE:
2182250661Sdavidcs      return reloc_class_relative;
2183250661Sdavidcs    case R_390_JMP_SLOT:
2184250661Sdavidcs      return reloc_class_plt;
2185250661Sdavidcs    case R_390_COPY:
2186250661Sdavidcs      return reloc_class_copy;
2187250661Sdavidcs    default:
2188250661Sdavidcs      return reloc_class_normal;
2189250661Sdavidcs    }
2190250661Sdavidcs}
2191250661Sdavidcs
2192250661Sdavidcs/* Finish up the dynamic sections.  */
2193250661Sdavidcs
2194250661Sdavidcsstatic boolean
2195250661Sdavidcself_s390_finish_dynamic_sections (output_bfd, info)
2196250661Sdavidcs     bfd *output_bfd;
2197250661Sdavidcs     struct bfd_link_info *info;
2198250661Sdavidcs{
2199250661Sdavidcs  struct elf_s390_link_hash_table *htab;
2200250661Sdavidcs  bfd *dynobj;
2201250661Sdavidcs  asection *sdyn;
2202250661Sdavidcs
2203250661Sdavidcs  htab = elf_s390_hash_table (info);
2204250661Sdavidcs  dynobj = htab->elf.dynobj;
2205250661Sdavidcs  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2206250661Sdavidcs
2207250661Sdavidcs  if (htab->elf.dynamic_sections_created)
2208250661Sdavidcs    {
2209250661Sdavidcs      Elf64_External_Dyn *dyncon, *dynconend;
2210250661Sdavidcs
2211250661Sdavidcs      if (sdyn == NULL || htab->sgot == NULL)
2212250661Sdavidcs	abort ();
2213250661Sdavidcs
2214250661Sdavidcs      dyncon = (Elf64_External_Dyn *) sdyn->contents;
2215250661Sdavidcs      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2216250661Sdavidcs      for (; dyncon < dynconend; dyncon++)
2217250661Sdavidcs	{
2218250661Sdavidcs	  Elf_Internal_Dyn dyn;
2219250661Sdavidcs	  asection *s;
2220250661Sdavidcs
2221250661Sdavidcs	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2222250661Sdavidcs
2223250661Sdavidcs	  switch (dyn.d_tag)
2224250661Sdavidcs	    {
2225250661Sdavidcs	    default:
2226250661Sdavidcs	      continue;
2227250661Sdavidcs
2228250661Sdavidcs	    case DT_PLTGOT:
2229250661Sdavidcs	      dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2230250661Sdavidcs	      break;
2231250661Sdavidcs
2232250661Sdavidcs	    case DT_JMPREL:
2233250661Sdavidcs	      dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2234250661Sdavidcs	      break;
2235250661Sdavidcs
2236250661Sdavidcs	    case DT_PLTRELSZ:
2237250661Sdavidcs	      s = htab->srelplt->output_section;
2238250661Sdavidcs	      if (s->_cooked_size != 0)
2239250661Sdavidcs		dyn.d_un.d_val = s->_cooked_size;
2240250661Sdavidcs	      else
2241250661Sdavidcs		dyn.d_un.d_val = s->_raw_size;
2242250661Sdavidcs	      break;
2243250661Sdavidcs
2244250661Sdavidcs	    case DT_RELASZ:
2245250661Sdavidcs	      /* The procedure linkage table relocs (DT_JMPREL) should
2246250661Sdavidcs		 not be included in the overall relocs (DT_RELA).
2247250661Sdavidcs		 Therefore, we override the DT_RELASZ entry here to
2248250661Sdavidcs		 make it not include the JMPREL relocs.  Since the
2249250661Sdavidcs		 linker script arranges for .rela.plt to follow all
2250250661Sdavidcs		 other relocation sections, we don't have to worry
2251250661Sdavidcs		 about changing the DT_RELA entry.  */
2252250661Sdavidcs	      s = htab->srelplt->output_section;
2253250661Sdavidcs	      if (s->_cooked_size != 0)
2254250661Sdavidcs		dyn.d_un.d_val -= s->_cooked_size;
2255250661Sdavidcs	      else
2256250661Sdavidcs		dyn.d_un.d_val -= s->_raw_size;
2257250661Sdavidcs	      break;
2258250661Sdavidcs	    }
2259250661Sdavidcs
2260250661Sdavidcs	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2261250661Sdavidcs	}
2262250661Sdavidcs
2263250661Sdavidcs      /* Fill in the special first entry in the procedure linkage table.  */
2264250661Sdavidcs      if (htab->splt && htab->splt->_raw_size > 0)
2265250661Sdavidcs	{
2266250661Sdavidcs	  /* fill in blueprint for plt 0 entry */
2267250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD0,
2268250661Sdavidcs		      htab->splt->contents );
2269250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD1,
2270250661Sdavidcs		      htab->splt->contents +4 );
2271250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD3,
2272250661Sdavidcs		      htab->splt->contents +12 );
2273250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD4,
2274250661Sdavidcs		      htab->splt->contents +16 );
2275250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD5,
2276250661Sdavidcs		      htab->splt->contents +20 );
2277250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD6,
2278250661Sdavidcs		      htab->splt->contents + 24);
2279250661Sdavidcs	  bfd_put_32 (output_bfd, (bfd_vma) PLT_FIRST_ENTRY_WORD7,
2280250661Sdavidcs		      htab->splt->contents + 28 );
2281250661Sdavidcs	  /* Fixup relative address to start of GOT */
2282250661Sdavidcs	  bfd_put_32 (output_bfd,
2283250661Sdavidcs		      (htab->sgotplt->output_section->vma +
2284250661Sdavidcs		       htab->sgotplt->output_offset
2285250661Sdavidcs		       - htab->splt->output_section->vma - 6)/2,
2286250661Sdavidcs		      htab->splt->contents + 8);
2287250661Sdavidcs	}
2288250661Sdavidcs      elf_section_data (htab->splt->output_section)
2289250661Sdavidcs	->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
2290250661Sdavidcs    }
2291250661Sdavidcs
2292250661Sdavidcs  if (htab->sgotplt)
2293250661Sdavidcs    {
2294250661Sdavidcs      /* Fill in the first three entries in the global offset table.  */
2295250661Sdavidcs      if (htab->sgotplt->_raw_size > 0)
2296250661Sdavidcs	{
2297250661Sdavidcs	  bfd_put_64 (output_bfd,
2298250661Sdavidcs		      (sdyn == NULL ? (bfd_vma) 0
2299250661Sdavidcs		       : sdyn->output_section->vma + sdyn->output_offset),
2300250661Sdavidcs		      htab->sgotplt->contents);
2301250661Sdavidcs	  /* One entry for shared object struct ptr.  */
2302250661Sdavidcs	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2303250661Sdavidcs	  /* One entry for _dl_runtime_resolve.  */
2304250661Sdavidcs	  bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 12);
2305250661Sdavidcs	}
2306250661Sdavidcs
2307250661Sdavidcs      elf_section_data (htab->sgot->output_section)
2308250661Sdavidcs	->this_hdr.sh_entsize = 8;
2309250661Sdavidcs    }
2310250661Sdavidcs  return true;
2311250661Sdavidcs}
2312250661Sdavidcs
2313250661Sdavidcsstatic boolean
2314250661Sdavidcself_s390_object_p (abfd)
2315250661Sdavidcs     bfd *abfd;
2316250661Sdavidcs{
2317250661Sdavidcs  return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_64);
2318250661Sdavidcs}
2319250661Sdavidcs
2320250661Sdavidcs/*
2321250661Sdavidcs * Why was the hash table entry size definition changed from
2322250661Sdavidcs * ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
2323250661Sdavidcs * this is the only reason for the s390_elf64_size_info structure.
2324250661Sdavidcs */
2325250661Sdavidcs
2326250661Sdavidcsconst struct elf_size_info s390_elf64_size_info =
2327250661Sdavidcs{
2328250661Sdavidcs  sizeof (Elf64_External_Ehdr),
2329250661Sdavidcs  sizeof (Elf64_External_Phdr),
2330250661Sdavidcs  sizeof (Elf64_External_Shdr),
2331250661Sdavidcs  sizeof (Elf64_External_Rel),
2332250661Sdavidcs  sizeof (Elf64_External_Rela),
2333250661Sdavidcs  sizeof (Elf64_External_Sym),
2334250661Sdavidcs  sizeof (Elf64_External_Dyn),
2335250661Sdavidcs  sizeof (Elf_External_Note),
2336250661Sdavidcs  8,            /* hash-table entry size */
2337250661Sdavidcs  1,            /* internal relocations per external relocations */
2338250661Sdavidcs  64,		/* arch_size */
2339250661Sdavidcs  8,		/* file_align */
2340250661Sdavidcs  ELFCLASS64, EV_CURRENT,
2341250661Sdavidcs  bfd_elf64_write_out_phdrs,
2342250661Sdavidcs  bfd_elf64_write_shdrs_and_ehdr,
2343250661Sdavidcs  bfd_elf64_write_relocs,
2344250661Sdavidcs  bfd_elf64_swap_symbol_in,
2345250661Sdavidcs  bfd_elf64_swap_symbol_out,
2346250661Sdavidcs  bfd_elf64_slurp_reloc_table,
2347250661Sdavidcs  bfd_elf64_slurp_symbol_table,
2348250661Sdavidcs  bfd_elf64_swap_dyn_in,
2349250661Sdavidcs  bfd_elf64_swap_dyn_out,
2350250661Sdavidcs  NULL,
2351250661Sdavidcs  NULL,
2352250661Sdavidcs  NULL,
2353250661Sdavidcs  NULL
2354250661Sdavidcs};
2355250661Sdavidcs
2356250661Sdavidcs#define TARGET_BIG_SYM	bfd_elf64_s390_vec
2357250661Sdavidcs#define TARGET_BIG_NAME	"elf64-s390"
2358250661Sdavidcs#define ELF_ARCH	bfd_arch_s390
2359250661Sdavidcs#define ELF_MACHINE_CODE EM_S390
2360250661Sdavidcs#define ELF_MACHINE_ALT1 EM_S390_OLD
2361250661Sdavidcs#define ELF_MAXPAGESIZE 0x1000
2362250661Sdavidcs
2363250661Sdavidcs#define elf_backend_size_info		s390_elf64_size_info
2364250661Sdavidcs
2365250661Sdavidcs#define elf_backend_can_gc_sections	1
2366250661Sdavidcs#define elf_backend_can_refcount	1
2367250661Sdavidcs#define elf_backend_want_got_plt	1
2368250661Sdavidcs#define elf_backend_plt_readonly	1
2369250661Sdavidcs#define elf_backend_want_plt_sym	0
2370250661Sdavidcs#define elf_backend_got_header_size	24
2371250661Sdavidcs#define elf_backend_plt_header_size	PLT_ENTRY_SIZE
2372250661Sdavidcs#define elf_backend_rela_normal		1
2373250661Sdavidcs
2374250661Sdavidcs#define elf_info_to_howto		elf_s390_info_to_howto
2375250661Sdavidcs
2376250661Sdavidcs#define bfd_elf64_bfd_is_local_label_name     elf_s390_is_local_label_name
2377250661Sdavidcs#define bfd_elf64_bfd_link_hash_table_create  elf_s390_link_hash_table_create
2378250661Sdavidcs#define bfd_elf64_bfd_reloc_type_lookup	      elf_s390_reloc_type_lookup
2379250661Sdavidcs
2380250661Sdavidcs#define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
2381250661Sdavidcs#define elf_backend_check_relocs	      elf_s390_check_relocs
2382250661Sdavidcs#define elf_backend_copy_indirect_symbol      elf_s390_copy_indirect_symbol
2383250661Sdavidcs#define elf_backend_create_dynamic_sections   elf_s390_create_dynamic_sections
2384250661Sdavidcs#define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
2385250661Sdavidcs#define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
2386250661Sdavidcs#define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
2387250661Sdavidcs#define elf_backend_gc_sweep_hook	      elf_s390_gc_sweep_hook
2388250661Sdavidcs#define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
2389250661Sdavidcs#define elf_backend_relocate_section	      elf_s390_relocate_section
2390250661Sdavidcs#define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
2391250661Sdavidcs#define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
2392250661Sdavidcs
2393250661Sdavidcs#define elf_backend_object_p                  elf_s390_object_p
2394250661Sdavidcs
2395250661Sdavidcs#include "elf64-target.h"
2396250661Sdavidcs