Add s390 support
[binutils.git] / bfd / elf64-s390.c
blob9296a26976e61da7b927287a850692c463cf8e85
1 /* IBM S/390-specific support for 64-bit ELF
2 Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3 Contributed Martin Schwidefsky (schwidefsky@de.ibm.com).
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
28 static reloc_howto_type *elf_s390_reloc_type_lookup
29 PARAMS ((bfd *, bfd_reloc_code_real_type));
30 static void elf_s390_info_to_howto
31 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
32 static boolean elf_s390_is_local_label_name PARAMS ((bfd *, const char *));
33 static struct bfd_hash_entry *elf_s390_link_hash_newfunc
34 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
35 static struct bfd_link_hash_table *elf_s390_link_hash_table_create
36 PARAMS ((bfd *));
37 static boolean elf_s390_check_relocs
38 PARAMS ((bfd *, struct bfd_link_info *, asection *,
39 const Elf_Internal_Rela *));
40 static boolean elf_s390_adjust_dynamic_symbol
41 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
42 static boolean elf_s390_size_dynamic_sections
43 PARAMS ((bfd *, struct bfd_link_info *));
44 static boolean elf_s390_relocate_section
45 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
46 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
47 static boolean elf_s390_finish_dynamic_symbol
48 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
49 Elf_Internal_Sym *));
50 static boolean elf_s390_finish_dynamic_sections
51 PARAMS ((bfd *, struct bfd_link_info *));
53 #define USE_RELA 1 /* We want RELA relocations, not REL. */
55 #include "elf/s390.h"
57 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
58 from smaller values. Start with zero, widen, *then* decrement. */
59 #define MINUS_ONE (((bfd_vma)0) - 1)
61 /* The relocation "howto" table. */
62 static reloc_howto_type elf_howto_table[] =
64 HOWTO (R_390_NONE, /* type */
65 0, /* rightshift */
66 0, /* size (0 = byte, 1 = short, 2 = long) */
67 0, /* bitsize */
68 false, /* pc_relative */
69 0, /* bitpos */
70 complain_overflow_dont, /* complain_on_overflow */
71 bfd_elf_generic_reloc, /* special_function */
72 "R_390_NONE", /* name */
73 false, /* partial_inplace */
74 0, /* src_mask */
75 0, /* dst_mask */
76 false), /* pcrel_offset */
78 HOWTO(R_390_8, 0, 0, 8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_8", false, 0,0x000000ff, false),
79 HOWTO(R_390_12, 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_12", false, 0,0x00000fff, false),
80 HOWTO(R_390_16, 0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_16", false, 0,0x0000ffff, false),
81 HOWTO(R_390_32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_32", false, 0,0xffffffff, false),
82 HOWTO(R_390_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32", false, 0,0xffffffff, true),
83 HOWTO(R_390_GOT12, 0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_GOT12", false, 0,0x00000fff, false),
84 HOWTO(R_390_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT32", false, 0,0xffffffff, false),
85 HOWTO(R_390_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32", false, 0,0xffffffff, true),
86 HOWTO(R_390_COPY, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_COPY", false, 0,MINUS_ONE, false),
87 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),
88 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),
89 HOWTO(R_390_RELATIVE, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_RELATIVE",false, 0,MINUS_ONE, false),
90 HOWTO(R_390_GOTOFF, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTOFF", false, 0,MINUS_ONE, false),
91 HOWTO(R_390_GOTPC, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPC", false, 0,MINUS_ONE, true),
92 HOWTO(R_390_GOT16, 0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT16", false, 0,0x0000ffff, false),
93 HOWTO(R_390_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16", false, 0,0x0000ffff, true),
94 HOWTO(R_390_PC16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff, true),
95 HOWTO(R_390_PLT16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true),
96 HOWTO(R_390_PC32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff, true),
97 HOWTO(R_390_PLT32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true),
98 HOWTO(R_390_GOTPCDBL, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,MINUS_ONE, true),
99 HOWTO(R_390_64, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_64", false, 0,MINUS_ONE, false),
100 HOWTO(R_390_PC64, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC64", false, 0,MINUS_ONE, true),
101 HOWTO(R_390_GOT64, 0, 4, 64, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT64", false, 0,MINUS_ONE, false),
102 HOWTO(R_390_PLT64, 0, 4, 64, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT64", false, 0,MINUS_ONE, true),
103 HOWTO(R_390_GOTENT, 1, 2, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTENT", false, 0,MINUS_ONE, true),
106 /* GNU extension to record C++ vtable hierarchy. */
107 static reloc_howto_type elf64_s390_vtinherit_howto =
108 HOWTO (R_390_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false);
109 static reloc_howto_type elf64_s390_vtentry_howto =
110 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);
112 static reloc_howto_type *
113 elf_s390_reloc_type_lookup (abfd, code)
114 bfd *abfd ATTRIBUTE_UNUSED;
115 bfd_reloc_code_real_type code;
117 switch (code) {
118 case BFD_RELOC_NONE:
119 return &elf_howto_table[(int) R_390_NONE];
120 case BFD_RELOC_8:
121 return &elf_howto_table[(int) R_390_8];
122 case BFD_RELOC_390_12:
123 return &elf_howto_table[(int) R_390_12];
124 case BFD_RELOC_16:
125 return &elf_howto_table[(int) R_390_16];
126 case BFD_RELOC_32:
127 return &elf_howto_table[(int) R_390_32];
128 case BFD_RELOC_CTOR:
129 return &elf_howto_table[(int) R_390_32];
130 case BFD_RELOC_32_PCREL:
131 return &elf_howto_table[(int) R_390_PC32];
132 case BFD_RELOC_390_GOT12:
133 return &elf_howto_table[(int) R_390_GOT12];
134 case BFD_RELOC_32_GOT_PCREL:
135 return &elf_howto_table[(int) R_390_GOT32];
136 case BFD_RELOC_390_PLT32:
137 return &elf_howto_table[(int) R_390_PLT32];
138 case BFD_RELOC_390_COPY:
139 return &elf_howto_table[(int) R_390_COPY];
140 case BFD_RELOC_390_GLOB_DAT:
141 return &elf_howto_table[(int) R_390_GLOB_DAT];
142 case BFD_RELOC_390_JMP_SLOT:
143 return &elf_howto_table[(int) R_390_JMP_SLOT];
144 case BFD_RELOC_390_RELATIVE:
145 return &elf_howto_table[(int) R_390_RELATIVE];
146 case BFD_RELOC_32_GOTOFF:
147 return &elf_howto_table[(int) R_390_GOTOFF];
148 case BFD_RELOC_390_GOTPC:
149 return &elf_howto_table[(int) R_390_GOTPC];
150 case BFD_RELOC_390_GOT16:
151 return &elf_howto_table[(int) R_390_GOT16];
152 case BFD_RELOC_16_PCREL:
153 return &elf_howto_table[(int) R_390_PC16];
154 case BFD_RELOC_390_PC16DBL:
155 return &elf_howto_table[(int) R_390_PC16DBL];
156 case BFD_RELOC_390_PLT16DBL:
157 return &elf_howto_table[(int) R_390_PLT16DBL];
158 case BFD_RELOC_VTABLE_INHERIT:
159 return &elf64_s390_vtinherit_howto;
160 case BFD_RELOC_VTABLE_ENTRY:
161 return &elf64_s390_vtentry_howto;
162 case BFD_RELOC_390_PC32DBL:
163 return &elf_howto_table[(int) R_390_PC32DBL];
164 case BFD_RELOC_390_PLT32DBL:
165 return &elf_howto_table[(int) R_390_PLT32DBL];
166 case BFD_RELOC_390_GOTPCDBL:
167 return &elf_howto_table[(int) R_390_GOTPCDBL];
168 case BFD_RELOC_64:
169 return &elf_howto_table[(int) R_390_64];
170 case BFD_RELOC_64_PCREL:
171 return &elf_howto_table[(int) R_390_PC64];
172 case BFD_RELOC_390_GOT64:
173 return &elf_howto_table[(int) R_390_GOT64];
174 case BFD_RELOC_390_PLT64:
175 return &elf_howto_table[(int) R_390_PLT64];
176 case BFD_RELOC_390_GOTENT:
177 return &elf_howto_table[(int) R_390_GOTENT];
178 default:
179 break;
181 return 0;
184 /* We need to use ELF64_R_TYPE so we have our own copy of this function,
185 and elf64-s390.c has its own copy. */
187 static void
188 elf_s390_info_to_howto (abfd, cache_ptr, dst)
189 bfd *abfd ATTRIBUTE_UNUSED;
190 arelent *cache_ptr;
191 Elf_Internal_Rela *dst;
193 switch (ELF64_R_TYPE(dst->r_info))
195 case R_390_GNU_VTINHERIT:
196 cache_ptr->howto = &elf64_s390_vtinherit_howto;
197 break;
199 case R_390_GNU_VTENTRY:
200 cache_ptr->howto = &elf64_s390_vtentry_howto;
201 break;
203 default:
204 BFD_ASSERT (ELF64_R_TYPE(dst->r_info) < (unsigned int) R_390_max);
205 cache_ptr->howto = &elf_howto_table[ELF64_R_TYPE(dst->r_info)];
209 static boolean
210 elf_s390_is_local_label_name (abfd, name)
211 bfd *abfd;
212 const char *name;
214 if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
215 return true;
217 return _bfd_elf_is_local_label_name (abfd, name);
220 /* Functions for the 390 ELF linker. */
222 /* The name of the dynamic interpreter. This is put in the .interp
223 section. */
225 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
227 /* The nop opcode we use. */
229 #define s390_NOP 0x07070707
232 /* The size in bytes of the first entry in the procedure linkage table. */
233 #define PLT_FIRST_ENTRY_SIZE 32
234 /* The size in bytes of an entry in the procedure linkage table. */
235 #define PLT_ENTRY_SIZE 32
237 #define GOT_ENTRY_SIZE 8
239 /* The first three entries in a procedure linkage table are reserved,
240 and the initial contents are unimportant (we zero them out).
241 Subsequent entries look like this. See the SVR4 ABI 386
242 supplement to see how this works. */
244 /* For the s390, simple addr offset can only be 0 - 4096.
245 To use the full 16777216 TB address space, several instructions
246 are needed to load an address in a register and execute
247 a branch( or just saving the address)
249 Furthermore, only r 0 and 1 are free to use!!! */
251 /* The first 3 words in the GOT are then reserved.
252 Word 0 is the address of the dynamic table.
253 Word 1 is a pointer to a structure describing the object
254 Word 2 is used to point to the loader entry address.
256 The code for PLT entries looks like this:
258 The GOT holds the address in the PLT to be executed.
259 The loader then gets:
260 24(15) = Pointer to the structure describing the object.
261 28(15) = Offset in symbol table
262 The loader must then find the module where the function is
263 and insert the address in the GOT.
265 PLT1: LARL 1,<fn>@GOTENT # 6 bytes Load address of GOT entry in r1
266 LG 1,0(1) # 6 bytes Load address from GOT in r1
267 BCR 15,1 # 2 bytes Jump to address
268 RET1: BASR 1,0 # 2 bytes Return from GOT 1st time
269 LGF 1,12(1) # 6 bytes Load offset in symbl table in r1
270 BRCL 15,-x # 6 bytes Jump to start of PLT
271 .long ? # 4 bytes offset into symbol table
273 Total = 32 bytes per PLT entry
274 Fixup at offset 2: relative address to GOT entry
275 Fixup at offset 22: relative branch to PLT0
276 Fixup at offset 28: 32 bit offset into symbol table
278 A 32 bit offset into the symbol table is enough. It allows for symbol
279 tables up to a size of 2 gigabyte. A single dynamic object (the main
280 program, any shared library) is limited to 4GB in size and I want to see
281 the program that manages to have a symbol table of more than 2 GB with a
282 total size of at max 4 GB. */
284 #define PLT_ENTRY_WORD0 0xc0100000
285 #define PLT_ENTRY_WORD1 0x0000e310
286 #define PLT_ENTRY_WORD2 0x10000004
287 #define PLT_ENTRY_WORD3 0x07f10d10
288 #define PLT_ENTRY_WORD4 0xe310100c
289 #define PLT_ENTRY_WORD5 0x0014c0f4
290 #define PLT_ENTRY_WORD6 0x00000000
291 #define PLT_ENTRY_WORD7 0x00000000
293 /* The first PLT entry pushes the offset into the symbol table
294 from R1 onto the stack at 8(15) and the loader object info
295 at 12(15), loads the loader address in R1 and jumps to it. */
297 /* The first entry in the PLT:
299 PLT0:
300 STG 1,56(15) # r1 contains the offset into the symbol table
301 LARL 1,_GLOBAL_OFFSET_TABLE # load address of global offset table
302 MVC 48(8,15),8(1) # move loader ino (object struct address) to stack
303 LG 1,16(1) # get entry address of loader
304 BCR 15,1 # jump to loader
306 Fixup at offset 8: relative address to start of GOT. */
308 #define PLT_FIRST_ENTRY_WORD0 0xe310f038
309 #define PLT_FIRST_ENTRY_WORD1 0x0024c010
310 #define PLT_FIRST_ENTRY_WORD2 0x00000000
311 #define PLT_FIRST_ENTRY_WORD3 0xd207f030
312 #define PLT_FIRST_ENTRY_WORD4 0x1008e310
313 #define PLT_FIRST_ENTRY_WORD5 0x10100004
314 #define PLT_FIRST_ENTRY_WORD6 0x07f10700
315 #define PLT_FIRST_ENTRY_WORD7 0x07000700
317 /* The s390 linker needs to keep track of the number of relocs that it
318 decides to copy in check_relocs for each symbol. This is so that
319 it can discard PC relative relocs if it doesn't need them when
320 linking with -Bsymbolic. We store the information in a field
321 extending the regular ELF linker hash table. */
323 /* This structure keeps track of the number of PC relative relocs we
324 have copied for a given symbol. */
326 struct elf_s390_pcrel_relocs_copied
328 /* Next section. */
329 struct elf_s390_pcrel_relocs_copied *next;
330 /* A section in dynobj. */
331 asection *section;
332 /* Number of relocs copied in this section. */
333 bfd_size_type count;
336 /* s390 ELF linker hash entry. */
338 struct elf_s390_link_hash_entry
340 struct elf_link_hash_entry root;
342 /* Number of PC relative relocs copied for this symbol. */
343 struct elf_s390_pcrel_relocs_copied *pcrel_relocs_copied;
346 /* s390 ELF linker hash table. */
348 struct elf_s390_link_hash_table
350 struct elf_link_hash_table root;
353 /* Declare this now that the above structures are defined. */
355 static boolean elf_s390_discard_copies
356 PARAMS ((struct elf_s390_link_hash_entry *, PTR));
358 /* Traverse an s390 ELF linker hash table. */
360 #define elf_s390_link_hash_traverse(table, func, info) \
361 (elf_link_hash_traverse \
362 (&(table)->root, \
363 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
364 (info)))
366 /* Get the s390 ELF linker hash table from a link_info structure. */
368 #define elf_s390_hash_table(p) \
369 ((struct elf_s390_link_hash_table *) ((p)->hash))
371 /* Create an entry in an s390 ELF linker hash table. */
373 static struct bfd_hash_entry *
374 elf_s390_link_hash_newfunc (entry, table, string)
375 struct bfd_hash_entry *entry;
376 struct bfd_hash_table *table;
377 const char *string;
379 struct elf_s390_link_hash_entry *ret =
380 (struct elf_s390_link_hash_entry *) entry;
382 /* Allocate the structure if it has not already been allocated by a
383 subclass. */
384 if (ret == (struct elf_s390_link_hash_entry *) NULL)
385 ret = ((struct elf_s390_link_hash_entry *)
386 bfd_hash_allocate (table,
387 sizeof (struct elf_s390_link_hash_entry)));
388 if (ret == (struct elf_s390_link_hash_entry *) NULL)
389 return (struct bfd_hash_entry *) ret;
391 /* Call the allocation method of the superclass. */
392 ret = ((struct elf_s390_link_hash_entry *)
393 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
394 table, string));
395 if (ret != (struct elf_s390_link_hash_entry *) NULL)
397 ret->pcrel_relocs_copied = NULL;
400 return (struct bfd_hash_entry *) ret;
403 /* Create an s390 ELF linker hash table. */
405 static struct bfd_link_hash_table *
406 elf_s390_link_hash_table_create (abfd)
407 bfd *abfd;
409 struct elf_s390_link_hash_table *ret;
411 ret = ((struct elf_s390_link_hash_table *)
412 bfd_alloc (abfd, sizeof (struct elf_s390_link_hash_table)));
413 if (ret == (struct elf_s390_link_hash_table *) NULL)
414 return NULL;
416 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
417 elf_s390_link_hash_newfunc))
419 bfd_release (abfd, ret);
420 return NULL;
423 return &ret->root.root;
427 /* Look through the relocs for a section during the first phase, and
428 allocate space in the global offset table or procedure linkage
429 table. */
431 static boolean
432 elf_s390_check_relocs (abfd, info, sec, relocs)
433 bfd *abfd;
434 struct bfd_link_info *info;
435 asection *sec;
436 const Elf_Internal_Rela *relocs;
438 bfd *dynobj;
439 Elf_Internal_Shdr *symtab_hdr;
440 struct elf_link_hash_entry **sym_hashes;
441 bfd_signed_vma *local_got_refcounts;
442 const Elf_Internal_Rela *rel;
443 const Elf_Internal_Rela *rel_end;
444 asection *sgot;
445 asection *srelgot;
446 asection *sreloc;
448 if (info->relocateable)
449 return true;
451 dynobj = elf_hash_table (info)->dynobj;
452 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
453 sym_hashes = elf_sym_hashes (abfd);
454 local_got_refcounts = elf_local_got_offsets (abfd);
456 sgot = NULL;
457 srelgot = NULL;
458 sreloc = NULL;
460 rel_end = relocs + sec->reloc_count;
461 for (rel = relocs; rel < rel_end; rel++)
463 unsigned long r_symndx;
464 struct elf_link_hash_entry *h;
466 r_symndx = ELF64_R_SYM (rel->r_info);
468 if (r_symndx < symtab_hdr->sh_info)
469 h = NULL;
470 else
471 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
473 /* Some relocs require a global offset table. */
474 if (dynobj == NULL)
476 switch (ELF64_R_TYPE (rel->r_info))
478 case R_390_GOT12:
479 case R_390_GOT16:
480 case R_390_GOT32:
481 case R_390_GOT64:
482 case R_390_GOTOFF:
483 case R_390_GOTPC:
484 case R_390_GOTPCDBL:
485 case R_390_GOTENT:
486 elf_hash_table (info)->dynobj = dynobj = abfd;
487 if (! _bfd_elf_create_got_section (dynobj, info))
488 return false;
489 break;
491 default:
492 break;
497 switch (ELF64_R_TYPE (rel->r_info))
499 case R_390_GOT12:
500 case R_390_GOT16:
501 case R_390_GOT32:
502 case R_390_GOT64:
503 case R_390_GOTENT:
504 /* This symbol requires a global offset table entry. */
506 if (sgot == NULL)
508 sgot = bfd_get_section_by_name (dynobj, ".got");
509 BFD_ASSERT (sgot != NULL);
513 if (srelgot == NULL
514 && (h != NULL || info->shared))
516 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
517 if (srelgot == NULL)
519 srelgot = bfd_make_section (dynobj, ".rela.got");
520 if (srelgot == NULL
521 || ! bfd_set_section_flags (dynobj, srelgot,
522 (SEC_ALLOC
523 | SEC_LOAD
524 | SEC_HAS_CONTENTS
525 | SEC_IN_MEMORY
526 | SEC_LINKER_CREATED
527 | SEC_READONLY))
528 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
529 return false;
533 if (h != NULL)
535 if (h->got.refcount == -1)
537 h->got.refcount = 1;
539 /* Make sure this symbol is output as a dynamic symbol. */
540 if (h->dynindx == -1)
542 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
543 return false;
546 sgot->_raw_size += 8;
547 srelgot->_raw_size += sizeof (Elf64_External_Rela);
549 else
550 h->got.refcount += 1;
552 else
554 /* This is a global offset table entry for a local symbol. */
555 if (local_got_refcounts == NULL)
557 size_t size;
559 size = symtab_hdr->sh_info * sizeof (bfd_vma);
560 local_got_refcounts = (bfd_signed_vma *)
561 bfd_alloc (abfd, size);
562 if (local_got_refcounts == NULL)
563 return false;
564 elf_local_got_refcounts (abfd) = local_got_refcounts;
565 memset (local_got_refcounts, -1, size);
567 if (local_got_refcounts[r_symndx] == -1)
569 local_got_refcounts[r_symndx] = 1;
571 sgot->_raw_size += 8;
572 if (info->shared)
574 /* If we are generating a shared object, we need to
575 output a R_390_RELATIVE reloc so that the dynamic
576 linker can adjust this GOT entry. */
577 srelgot->_raw_size += sizeof (Elf64_External_Rela);
580 else
581 local_got_refcounts[r_symndx] += 1;
584 break;
586 case R_390_PLT16DBL:
587 case R_390_PLT32:
588 case R_390_PLT32DBL:
589 case R_390_PLT64:
590 /* This symbol requires a procedure linkage table entry. We
591 actually build the entry in adjust_dynamic_symbol,
592 because this might be a case of linking PIC code which is
593 never referenced by a dynamic object, in which case we
594 don't need to generate a procedure linkage table entry
595 after all. */
597 /* If this is a local symbol, we resolve it directly without
598 creating a procedure linkage table entry. */
599 if (h == NULL)
600 continue;
602 if (h->plt.refcount == -1)
604 h->plt.refcount = 1;
605 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
607 else
608 h->plt.refcount += 1;
609 break;
611 case R_390_8:
612 case R_390_16:
613 case R_390_32:
614 case R_390_64:
615 case R_390_PC16:
616 case R_390_PC16DBL:
617 case R_390_PC32:
618 case R_390_PC32DBL:
619 case R_390_PC64:
620 if (h != NULL)
621 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
623 /* If we are creating a shared library, and this is a reloc
624 against a global symbol, or a non PC relative reloc
625 against a local symbol, then we need to copy the reloc
626 into the shared library. However, if we are linking with
627 -Bsymbolic, we do not need to copy a reloc against a
628 global symbol which is defined in an object we are
629 including in the link (i.e., DEF_REGULAR is set). At
630 this point we have not seen all the input files, so it is
631 possible that DEF_REGULAR is not set now but will be set
632 later (it is never cleared). We account for that
633 possibility below by storing information in the
634 pcrel_relocs_copied field of the hash table entry. */
635 if (info->shared
636 && (sec->flags & SEC_ALLOC) != 0
637 && (ELF64_R_TYPE (rel->r_info) == R_390_8
638 || ELF64_R_TYPE (rel->r_info) == R_390_16
639 || ELF64_R_TYPE (rel->r_info) == R_390_32
640 || ELF64_R_TYPE (rel->r_info) == R_390_64
641 || (h != NULL
642 && h->dynindx != -1
643 && (! info->symbolic
644 || (h->elf_link_hash_flags
645 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
647 /* When creating a shared object, we must copy these
648 reloc types into the output file. We create a reloc
649 section in dynobj and make room for this reloc. */
650 if (sreloc == NULL)
652 const char *name;
654 name = (bfd_elf_string_from_elf_section
655 (abfd,
656 elf_elfheader (abfd)->e_shstrndx,
657 elf_section_data (sec)->rel_hdr.sh_name));
658 if (name == NULL)
659 return false;
661 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
662 && strcmp (bfd_get_section_name (abfd, sec),
663 name + 5) == 0);
665 sreloc = bfd_get_section_by_name (dynobj, name);
666 if (sreloc == NULL)
668 flagword flags;
670 sreloc = bfd_make_section (dynobj, name);
671 flags = (SEC_HAS_CONTENTS | SEC_READONLY
672 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
673 if ((sec->flags & SEC_ALLOC) != 0)
674 flags |= SEC_ALLOC | SEC_LOAD;
675 if (sreloc == NULL
676 || ! bfd_set_section_flags (dynobj, sreloc, flags)
677 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
678 return false;
682 sreloc->_raw_size += sizeof (Elf64_External_Rela);
684 /* If we are linking with -Bsymbolic, and this is a
685 global symbol, we count the number of PC relative
686 relocations we have entered for this symbol, so that
687 we can discard them again if the symbol is later
688 defined by a regular object. Note that this function
689 is only called if we are using an elf64_s390 linker
690 hash table, which means that h is really a pointer to
691 an elf64_s390_link_hash_entry. */
692 if (h != NULL
693 && (ELF64_R_TYPE (rel->r_info) == R_390_PC16 ||
694 ELF64_R_TYPE (rel->r_info) == R_390_PC16DBL ||
695 ELF64_R_TYPE (rel->r_info) == R_390_PC32 ||
696 ELF64_R_TYPE (rel->r_info) == R_390_PC32DBL ||
697 ELF64_R_TYPE (rel->r_info) == R_390_PC64))
699 struct elf_s390_link_hash_entry *eh;
700 struct elf_s390_pcrel_relocs_copied *p;
702 eh = (struct elf_s390_link_hash_entry *) h;
704 for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
705 if (p->section == sreloc)
706 break;
708 if (p == NULL)
710 p = ((struct elf_s390_pcrel_relocs_copied *)
711 bfd_alloc (dynobj, sizeof *p));
712 if (p == NULL)
713 return false;
714 p->next = eh->pcrel_relocs_copied;
715 eh->pcrel_relocs_copied = p;
716 p->section = sreloc;
717 p->count = 0;
720 ++p->count;
724 break;
726 /* This relocation describes the C++ object vtable hierarchy.
727 Reconstruct it for later use during GC. */
728 case R_390_GNU_VTINHERIT:
729 if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
730 return false;
731 break;
733 /* This relocation describes which C++ vtable entries are actually
734 used. Record for later use during GC. */
735 case R_390_GNU_VTENTRY:
736 if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
737 return false;
738 break;
740 default:
741 break;
745 return true;
748 /* Return the section that should be marked against GC for a given
749 relocation. */
751 static asection *
752 elf_s390_gc_mark_hook (abfd, info, rel, h, sym)
753 bfd *abfd;
754 struct bfd_link_info *info ATTRIBUTE_UNUSED;
755 Elf_Internal_Rela *rel;
756 struct elf_link_hash_entry *h;
757 Elf_Internal_Sym *sym;
759 if (h != NULL)
761 switch (ELF64_R_TYPE (rel->r_info))
763 case R_390_GNU_VTINHERIT:
764 case R_390_GNU_VTENTRY:
765 break;
767 default:
768 switch (h->root.type)
770 case bfd_link_hash_defined:
771 case bfd_link_hash_defweak:
772 return h->root.u.def.section;
774 case bfd_link_hash_common:
775 return h->root.u.c.p->section;
777 default:
778 break;
782 else
784 if (!(elf_bad_symtab (abfd)
785 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
786 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
787 && sym->st_shndx != SHN_COMMON))
789 return bfd_section_from_elf_index (abfd, sym->st_shndx);
793 return NULL;
796 /* Update the got entry reference counts for the section being removed. */
798 static boolean
799 elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
800 bfd *abfd ATTRIBUTE_UNUSED;
801 struct bfd_link_info *info ATTRIBUTE_UNUSED;
802 asection *sec ATTRIBUTE_UNUSED;
803 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
805 Elf_Internal_Shdr *symtab_hdr;
806 struct elf_link_hash_entry **sym_hashes;
807 bfd_signed_vma *local_got_refcounts;
808 const Elf_Internal_Rela *rel, *relend;
809 unsigned long r_symndx;
810 struct elf_link_hash_entry *h;
811 bfd *dynobj;
812 asection *sgot;
813 asection *srelgot;
815 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
816 sym_hashes = elf_sym_hashes (abfd);
817 local_got_refcounts = elf_local_got_refcounts (abfd);
819 dynobj = elf_hash_table (info)->dynobj;
820 if (dynobj == NULL)
821 return true;
823 sgot = bfd_get_section_by_name (dynobj, ".got");
824 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
826 relend = relocs + sec->reloc_count;
827 for (rel = relocs; rel < relend; rel++)
828 switch (ELF64_R_TYPE (rel->r_info))
830 case R_390_GOT12:
831 case R_390_GOT16:
832 case R_390_GOT32:
833 case R_390_GOT64:
834 case R_390_GOTOFF:
835 case R_390_GOTPC:
836 case R_390_GOTPCDBL:
837 case R_390_GOTENT:
838 r_symndx = ELF64_R_SYM (rel->r_info);
839 if (r_symndx >= symtab_hdr->sh_info)
841 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
842 if (h->got.refcount > 0)
844 h->got.refcount -= 1;
845 if (h->got.refcount == 0)
847 sgot->_raw_size -= 8;
848 srelgot->_raw_size -= sizeof (Elf64_External_Rela);
852 else if (local_got_refcounts != NULL)
854 if (local_got_refcounts[r_symndx] > 0)
856 local_got_refcounts[r_symndx] -= 1;
857 if (local_got_refcounts[r_symndx] == 0)
859 sgot->_raw_size -= 8;
860 if (info->shared)
861 srelgot->_raw_size -= sizeof (Elf64_External_Rela);
865 break;
867 case R_390_PLT16DBL:
868 case R_390_PLT32:
869 case R_390_PLT32DBL:
870 case R_390_PLT64:
871 r_symndx = ELF64_R_SYM (rel->r_info);
872 if (r_symndx >= symtab_hdr->sh_info)
874 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
875 if (h->plt.refcount > 0)
876 h->plt.refcount -= 1;
878 break;
880 default:
881 break;
884 return true;
887 /* Adjust a symbol defined by a dynamic object and referenced by a
888 regular object. The current definition is in some section of the
889 dynamic object, but we're not including those sections. We have to
890 change the definition to something the rest of the link can
891 understand. */
893 static boolean
894 elf_s390_adjust_dynamic_symbol (info, h)
895 struct bfd_link_info *info;
896 struct elf_link_hash_entry *h;
898 bfd *dynobj;
899 asection *s;
900 unsigned int power_of_two;
902 dynobj = elf_hash_table (info)->dynobj;
904 /* Make sure we know what is going on here. */
905 BFD_ASSERT (dynobj != NULL
906 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
907 || h->weakdef != NULL
908 || ((h->elf_link_hash_flags
909 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
910 && (h->elf_link_hash_flags
911 & ELF_LINK_HASH_REF_REGULAR) != 0
912 && (h->elf_link_hash_flags
913 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
915 /* If this is a function, put it in the procedure linkage table. We
916 will fill in the contents of the procedure linkage table later
917 (although we could actually do it here). */
918 if (h->type == STT_FUNC
919 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
921 if ((! info->shared
922 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
923 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
924 || (info->shared && h->plt.refcount <= 0))
926 /* This case can occur if we saw a PLT32 reloc in an input
927 file, but the symbol was never referred to by a dynamic
928 object. In such a case, we don't actually need to build
929 a procedure linkage table, and we can just do a PC32
930 reloc instead. */
931 h->plt.offset = (bfd_vma) -1;
932 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
933 return true;
936 /* Make sure this symbol is output as a dynamic symbol. */
937 if (h->dynindx == -1)
939 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
940 return false;
943 s = bfd_get_section_by_name (dynobj, ".plt");
944 BFD_ASSERT (s != NULL);
947 /* The first entry in .plt is reserved. */
948 if (s->_raw_size == 0)
949 s->_raw_size = PLT_FIRST_ENTRY_SIZE;
951 /* If this symbol is not defined in a regular file, and we are
952 not generating a shared library, then set the symbol to this
953 location in the .plt. This is required to make function
954 pointers compare as equal between the normal executable and
955 the shared library. */
956 if (! info->shared
957 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
959 h->root.u.def.section = s;
960 h->root.u.def.value = s->_raw_size;
963 h->plt.offset = s->_raw_size;
965 /* Make room for this entry. */
966 s->_raw_size += PLT_ENTRY_SIZE;
968 /* We also need to make an entry in the .got.plt section, which
969 will be placed in the .got section by the linker script. */
970 s = bfd_get_section_by_name (dynobj, ".got.plt");
971 BFD_ASSERT (s != NULL);
972 s->_raw_size += GOT_ENTRY_SIZE;
974 /* We also need to make an entry in the .rela.plt section. */
975 s = bfd_get_section_by_name (dynobj, ".rela.plt");
976 BFD_ASSERT (s != NULL);
977 s->_raw_size += sizeof (Elf64_External_Rela);
979 return true;
982 /* If this is a weak symbol, and there is a real definition, the
983 processor independent code will have arranged for us to see the
984 real definition first, and we can just use the same value. */
985 if (h->weakdef != NULL)
987 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
988 || h->weakdef->root.type == bfd_link_hash_defweak);
989 h->root.u.def.section = h->weakdef->root.u.def.section;
990 h->root.u.def.value = h->weakdef->root.u.def.value;
991 return true;
994 /* This is a reference to a symbol defined by a dynamic object which
995 is not a function. */
997 /* If we are creating a shared library, we must presume that the
998 only references to the symbol are via the global offset table.
999 For such cases we need not do anything here; the relocations will
1000 be handled correctly by relocate_section. */
1001 if (info->shared)
1002 return true;
1004 /* If there are no references to this symbol that do not use the
1005 GOT, we don't need to generate a copy reloc. */
1006 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1007 return true;
1009 /* We must allocate the symbol in our .dynbss section, which will
1010 become part of the .bss section of the executable. There will be
1011 an entry for this symbol in the .dynsym section. The dynamic
1012 object will contain position independent code, so all references
1013 from the dynamic object to this symbol will go through the global
1014 offset table. The dynamic linker will use the .dynsym entry to
1015 determine the address it must put in the global offset table, so
1016 both the dynamic object and the regular object will refer to the
1017 same memory location for the variable. */
1019 s = bfd_get_section_by_name (dynobj, ".dynbss");
1020 BFD_ASSERT (s != NULL);
1022 /* We must generate a R_390_COPY reloc to tell the dynamic linker
1023 to copy the initial value out of the dynamic object and into the
1024 runtime process image. We need to remember the offset into the
1025 .rel.bss section we are going to use. */
1026 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1028 asection *srel;
1030 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1031 BFD_ASSERT (srel != NULL);
1032 srel->_raw_size += sizeof (Elf64_External_Rela);
1033 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1036 /* We need to figure out the alignment required for this symbol. I
1037 have no idea how ELF linkers handle this. */
1038 power_of_two = bfd_log2 (h->size);
1039 if (power_of_two > 3)
1040 power_of_two = 3;
1042 /* Apply the required alignment. */
1043 s->_raw_size = BFD_ALIGN (s->_raw_size,
1044 (bfd_size_type) (1 << power_of_two));
1045 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1047 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1048 return false;
1051 /* Define the symbol as being at this point in the section. */
1052 h->root.u.def.section = s;
1053 h->root.u.def.value = s->_raw_size;
1055 /* Increment the section size to make room for the symbol. */
1056 s->_raw_size += h->size;
1058 return true;
1061 /* Set the sizes of the dynamic sections. */
1063 static boolean
1064 elf_s390_size_dynamic_sections (output_bfd, info)
1065 bfd *output_bfd;
1066 struct bfd_link_info *info;
1068 bfd *dynobj;
1069 asection *s;
1070 boolean reltext;
1071 boolean relocs;
1072 boolean plt;
1074 dynobj = elf_hash_table (info)->dynobj;
1075 BFD_ASSERT (dynobj != NULL);
1077 if (elf_hash_table (info)->dynamic_sections_created)
1079 /* Set the contents of the .interp section to the interpreter. */
1080 if (! info->shared)
1082 s = bfd_get_section_by_name (dynobj, ".interp");
1083 BFD_ASSERT (s != NULL);
1084 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1085 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1088 else
1090 /* We may have created entries in the .rela.got section.
1091 However, if we are not creating the dynamic sections, we will
1092 not actually use these entries. Reset the size of .rela.got,
1093 which will cause it to get stripped from the output file
1094 below. */
1095 s = bfd_get_section_by_name (dynobj, ".rela.got");
1096 if (s != NULL)
1097 s->_raw_size = 0;
1100 /* If this is a -Bsymbolic shared link, then we need to discard all
1101 PC relative relocs against symbols defined in a regular object.
1102 We allocated space for them in the check_relocs routine, but we
1103 will not fill them in in the relocate_section routine. */
1104 if (info->shared)
1105 elf_s390_link_hash_traverse (elf_s390_hash_table (info),
1106 elf_s390_discard_copies,
1107 (PTR) info);
1109 /* The check_relocs and adjust_dynamic_symbol entry points have
1110 determined the sizes of the various dynamic sections. Allocate
1111 memory for them. */
1112 plt = false;
1113 reltext = false;
1114 relocs = false;
1115 for (s = dynobj->sections; s != NULL; s = s->next)
1117 const char *name;
1118 boolean strip;
1120 if ((s->flags & SEC_LINKER_CREATED) == 0)
1121 continue;
1123 /* It's OK to base decisions on the section name, because none
1124 of the dynobj section names depend upon the input files. */
1125 name = bfd_get_section_name (dynobj, s);
1127 strip = false;
1129 if (strcmp (name, ".plt") == 0)
1131 if (s->_raw_size == 0)
1133 /* Strip this section if we don't need it; see the
1134 comment below. */
1135 strip = true;
1137 else
1139 /* Remember whether there is a PLT. */
1140 plt = true;
1143 else if (strncmp (name, ".rela", 5) == 0)
1145 if (s->_raw_size == 0)
1147 /* If we don't need this section, strip it from the
1148 output file. This is to handle .rela.bss and
1149 .rel.plt. We must create it in
1150 create_dynamic_sections, because it must be created
1151 before the linker maps input sections to output
1152 sections. The linker does that before
1153 adjust_dynamic_symbol is called, and it is that
1154 function which decides whether anything needs to go
1155 into these sections. */
1156 strip = true;
1158 else
1160 asection *target;
1162 /* Remember whether there are any reloc sections other
1163 than .rela.plt. */
1164 if (strcmp (name, ".rela.plt") != 0)
1166 const char *outname;
1168 relocs = true;
1170 /* If this relocation section applies to a read only
1171 section, then we probably need a DT_TEXTREL
1172 entry. The entries in the .rela.plt section
1173 really apply to the .got section, which we
1174 created ourselves and so know is not readonly. */
1175 outname = bfd_get_section_name (output_bfd,
1176 s->output_section);
1177 target = bfd_get_section_by_name (output_bfd, outname + 5);
1178 if (target != NULL
1179 && (target->flags & SEC_READONLY) != 0
1180 && (target->flags & SEC_ALLOC) != 0)
1181 reltext = true;
1184 /* We use the reloc_count field as a counter if we need
1185 to copy relocs into the output file. */
1186 s->reloc_count = 0;
1189 else if (strncmp (name, ".got", 4) != 0)
1191 /* It's not one of our sections, so don't allocate space. */
1192 continue;
1195 if (strip)
1197 _bfd_strip_section_from_output (info, s);
1198 continue;
1201 /* Allocate memory for the section contents. */
1202 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1203 if (s->contents == NULL && s->_raw_size != 0)
1204 return false;
1207 if (elf_hash_table (info)->dynamic_sections_created)
1209 /* Add some entries to the .dynamic section. We fill in the
1210 values later, in elf_s390_finish_dynamic_sections, but we
1211 must add the entries now so that we get the correct size for
1212 the .dynamic section. The DT_DEBUG entry is filled in by the
1213 dynamic linker and used by the debugger. */
1214 if (! info->shared)
1216 if (! bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0))
1217 return false;
1220 if (plt)
1222 if (! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0)
1223 || ! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1224 || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1225 || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
1226 return false;
1229 if (relocs)
1231 if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
1232 || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
1233 || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
1234 sizeof (Elf64_External_Rela)))
1235 return false;
1238 if (reltext)
1240 if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
1241 return false;
1242 info->flags |= DF_TEXTREL;
1246 return true;
1249 /* This function is called via elf64_s390_link_hash_traverse if we are
1250 creating a shared object with -Bsymbolic. It discards the space
1251 allocated to copy PC relative relocs against symbols which are
1252 defined in regular objects. We allocated space for them in the
1253 check_relocs routine, but we won't fill them in in the
1254 relocate_section routine. */
1256 /*ARGSUSED*/
1257 static boolean
1258 elf_s390_discard_copies (h, inf)
1259 struct elf_s390_link_hash_entry *h;
1260 PTR inf;
1262 struct elf_s390_pcrel_relocs_copied *s;
1263 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1265 /* If a symbol has been forced local or we have found a regular
1266 definition for the symbolic link case, then we won't be needing
1267 any relocs. */
1268 if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1269 && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1270 || info->symbolic))
1272 for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
1273 s->section->_raw_size -= s->count * sizeof (Elf64_External_Rela);
1276 return true;
1278 /* Relocate a 390 ELF section. */
1280 static boolean
1281 elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
1282 contents, relocs, local_syms, local_sections)
1283 bfd *output_bfd;
1284 struct bfd_link_info *info;
1285 bfd *input_bfd;
1286 asection *input_section;
1287 bfd_byte *contents;
1288 Elf_Internal_Rela *relocs;
1289 Elf_Internal_Sym *local_syms;
1290 asection **local_sections;
1292 bfd *dynobj;
1293 Elf_Internal_Shdr *symtab_hdr;
1294 struct elf_link_hash_entry **sym_hashes;
1295 bfd_vma *local_got_offsets;
1296 asection *sgot;
1297 asection *splt;
1298 asection *sreloc;
1299 Elf_Internal_Rela *rel;
1300 Elf_Internal_Rela *relend;
1302 dynobj = elf_hash_table (info)->dynobj;
1303 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1304 sym_hashes = elf_sym_hashes (input_bfd);
1305 local_got_offsets = elf_local_got_offsets (input_bfd);
1307 sgot = NULL;
1308 splt = NULL;
1309 sreloc = NULL;
1310 if (dynobj != NULL)
1312 splt = bfd_get_section_by_name (dynobj, ".plt");
1313 sgot = bfd_get_section_by_name (dynobj, ".got");
1316 rel = relocs;
1317 relend = relocs + input_section->reloc_count;
1318 for (; rel < relend; rel++)
1320 int r_type;
1321 reloc_howto_type *howto;
1322 unsigned long r_symndx;
1323 struct elf_link_hash_entry *h;
1324 Elf_Internal_Sym *sym;
1325 asection *sec;
1326 bfd_vma relocation;
1327 bfd_reloc_status_type r;
1329 r_type = ELF64_R_TYPE (rel->r_info);
1330 if (r_type == R_390_GNU_VTINHERIT
1331 || r_type == R_390_GNU_VTENTRY)
1332 continue;
1333 if (r_type < 0 || r_type >= (int) R_390_max)
1335 bfd_set_error (bfd_error_bad_value);
1336 return false;
1338 howto = elf_howto_table + r_type;
1340 r_symndx = ELF64_R_SYM (rel->r_info);
1342 if (info->relocateable)
1344 /* This is a relocateable link. We don't have to change
1345 anything, unless the reloc is against a section symbol,
1346 in which case we have to adjust according to where the
1347 section symbol winds up in the output section. */
1348 if (r_symndx < symtab_hdr->sh_info)
1350 sym = local_syms + r_symndx;
1351 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1353 sec = local_sections[r_symndx];
1354 rel->r_addend += sec->output_offset + sym->st_value;
1358 continue;
1361 /* This is a final link. */
1362 h = NULL;
1363 sym = NULL;
1364 sec = NULL;
1365 if (r_symndx < symtab_hdr->sh_info)
1367 sym = local_syms + r_symndx;
1368 sec = local_sections[r_symndx];
1369 relocation = (sec->output_section->vma
1370 + sec->output_offset
1371 + sym->st_value);
1373 else
1375 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1376 while (h->root.type == bfd_link_hash_indirect
1377 || h->root.type == bfd_link_hash_warning)
1378 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1379 if (h->root.type == bfd_link_hash_defined
1380 || h->root.type == bfd_link_hash_defweak)
1382 sec = h->root.u.def.section;
1383 if ((r_type == R_390_GOTPC
1384 || r_type == R_390_GOTPCDBL)
1385 || ((r_type == R_390_PLT16DBL ||
1386 r_type == R_390_PLT32 ||
1387 r_type == R_390_PLT32DBL ||
1388 r_type == R_390_PLT64)
1389 && splt != NULL
1390 && h->plt.offset != (bfd_vma) -1)
1391 || ((r_type == R_390_GOT12 ||
1392 r_type == R_390_GOT16 ||
1393 r_type == R_390_GOT32 ||
1394 r_type == R_390_GOT64 ||
1395 r_type == R_390_GOTENT)
1396 && elf_hash_table (info)->dynamic_sections_created
1397 && (! info->shared
1398 || (! info->symbolic && h->dynindx != -1)
1399 || (h->elf_link_hash_flags
1400 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1401 || (info->shared
1402 && ((! info->symbolic && h->dynindx != -1)
1403 || (h->elf_link_hash_flags
1404 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1405 && ( r_type == R_390_8 ||
1406 r_type == R_390_16 ||
1407 r_type == R_390_32 ||
1408 r_type == R_390_64 ||
1409 r_type == R_390_PC16 ||
1410 r_type == R_390_PC16DBL ||
1411 r_type == R_390_PC32 ||
1412 r_type == R_390_PC32DBL ||
1413 r_type == R_390_PC64)
1414 && ((input_section->flags & SEC_ALLOC) != 0
1415 /* DWARF will emit R_386_32 relocations in its
1416 sections against symbols defined externally
1417 in shared libraries. We can't do anything
1418 with them here. */
1419 || ((input_section->flags & SEC_DEBUGGING) != 0
1420 && (h->elf_link_hash_flags
1421 & ELF_LINK_HASH_DEF_DYNAMIC) != 0))))
1423 /* In these cases, we don't need the relocation
1424 value. We check specially because in some
1425 obscure cases sec->output_section will be NULL. */
1426 relocation = 0;
1428 else if (sec->output_section == NULL)
1430 (*_bfd_error_handler)
1431 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1432 bfd_get_filename (input_bfd), h->root.root.string,
1433 bfd_get_section_name (input_bfd, input_section));
1434 relocation = 0;
1436 else
1437 relocation = (h->root.u.def.value
1438 + sec->output_section->vma
1439 + sec->output_offset);
1441 else if (h->root.type == bfd_link_hash_undefweak)
1442 relocation = 0;
1443 else if (info->shared && !info->symbolic
1444 && !info->no_undefined
1445 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1446 relocation = 0;
1447 else
1449 if (! ((*info->callbacks->undefined_symbol)
1450 (info, h->root.root.string, input_bfd,
1451 input_section, rel->r_offset,
1452 (!info->shared || info->no_undefined
1453 || ELF_ST_VISIBILITY (h->other)))))
1454 return false;
1455 relocation = 0;
1459 switch (r_type)
1461 case R_390_GOT12:
1462 case R_390_GOT16:
1463 case R_390_GOT32:
1464 case R_390_GOT64:
1465 case R_390_GOTENT:
1466 /* Relocation is to the entry for this symbol in the global
1467 offset table. */
1468 BFD_ASSERT (sgot != NULL);
1470 if (h != NULL)
1472 bfd_vma off;
1474 off = h->got.offset;
1475 BFD_ASSERT (off != (bfd_vma) -1);
1477 if (! elf_hash_table (info)->dynamic_sections_created
1478 || (info->shared
1479 && (info->symbolic || h->dynindx == -1)
1480 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1482 /* This is actually a static link, or it is a
1483 -Bsymbolic link and the symbol is defined
1484 locally, or the symbol was forced to be local
1485 because of a version file. We must initialize
1486 this entry in the global offset table. Since the
1487 offset must always be a multiple of 2, we use the
1488 least significant bit to record whether we have
1489 initialized it already.
1491 When doing a dynamic link, we create a .rel.got
1492 relocation entry to initialize the value. This
1493 is done in the finish_dynamic_symbol routine. */
1494 if ((off & 1) != 0)
1495 off &= ~1;
1496 else
1498 bfd_put_64 (output_bfd, relocation,
1499 sgot->contents + off);
1500 h->got.offset |= 1;
1503 relocation = sgot->output_offset + off;
1505 else
1507 bfd_vma off;
1509 BFD_ASSERT (local_got_offsets != NULL
1510 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1512 off = local_got_offsets[r_symndx];
1514 /* The offset must always be a multiple of 8. We use
1515 the least significant bit to record whether we have
1516 already generated the necessary reloc. */
1517 if ((off & 1) != 0)
1518 off &= ~1;
1519 else
1521 bfd_put_64 (output_bfd, relocation, sgot->contents + off);
1523 if (info->shared)
1525 asection *srelgot;
1526 Elf_Internal_Rela outrel;
1528 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1529 BFD_ASSERT (srelgot != NULL);
1531 outrel.r_offset = (sgot->output_section->vma
1532 + sgot->output_offset
1533 + off);
1534 outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1535 outrel.r_addend = relocation;
1536 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
1537 (((Elf64_External_Rela *)
1538 srelgot->contents)
1539 + srelgot->reloc_count));
1540 ++srelgot->reloc_count;
1543 local_got_offsets[r_symndx] |= 1;
1546 relocation = sgot->output_offset + off;
1550 * For @GOTENT the relocation is against the offset between
1551 * the instruction and the symbols entry in the GOT and not
1552 * between the start of the GOT and the symbols entry. We
1553 * add the vma of the GOT to get the correct value.
1555 if (r_type == R_390_GOTENT)
1556 relocation += sgot->output_section->vma;
1558 break;
1560 case R_390_GOTOFF:
1561 /* Relocation is relative to the start of the global offset
1562 table. */
1564 if (sgot == NULL)
1566 sgot = bfd_get_section_by_name (dynobj, ".got");
1567 BFD_ASSERT (sgot != NULL);
1570 /* Note that sgot->output_offset is not involved in this
1571 calculation. We always want the start of .got. If we
1572 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1573 permitted by the ABI, we might have to change this
1574 calculation. */
1575 relocation -= sgot->output_section->vma;
1577 break;
1579 case R_390_GOTPC:
1580 case R_390_GOTPCDBL:
1581 /* Use global offset table as symbol value. */
1583 if (sgot == NULL)
1585 sgot = bfd_get_section_by_name (dynobj, ".got");
1586 BFD_ASSERT (sgot != NULL);
1589 relocation = sgot->output_section->vma;
1591 break;
1593 case R_390_PLT16DBL:
1594 case R_390_PLT32:
1595 case R_390_PLT32DBL:
1596 case R_390_PLT64:
1597 /* Relocation is to the entry for this symbol in the
1598 procedure linkage table. */
1600 /* Resolve a PLT32 reloc against a local symbol directly,
1601 without using the procedure linkage table. */
1602 if (h == NULL)
1603 break;
1605 if (h->plt.offset == (bfd_vma) -1 || splt == NULL)
1607 /* We didn't make a PLT entry for this symbol. This
1608 happens when statically linking PIC code, or when
1609 using -Bsymbolic. */
1610 break;
1613 relocation = (splt->output_section->vma
1614 + splt->output_offset
1615 + h->plt.offset);
1617 break;
1619 case R_390_8:
1620 case R_390_16:
1621 case R_390_32:
1622 case R_390_64:
1623 case R_390_PC16:
1624 case R_390_PC16DBL:
1625 case R_390_PC32:
1626 case R_390_PC32DBL:
1627 case R_390_PC64:
1628 if (info->shared
1629 && (input_section->flags & SEC_ALLOC) != 0
1630 && (r_type == R_390_8
1631 || r_type == R_390_16
1632 || r_type == R_390_32
1633 || r_type == R_390_64
1634 || (h != NULL
1635 && h->dynindx != -1
1636 && (! info->symbolic
1637 || (h->elf_link_hash_flags
1638 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1640 Elf_Internal_Rela outrel;
1641 boolean skip, relocate;
1643 /* When generating a shared object, these relocations
1644 are copied into the output file to be resolved at run
1645 time. */
1647 if (sreloc == NULL)
1649 const char *name;
1651 name = (bfd_elf_string_from_elf_section
1652 (input_bfd,
1653 elf_elfheader (input_bfd)->e_shstrndx,
1654 elf_section_data (input_section)->rel_hdr.sh_name));
1655 if (name == NULL)
1656 return false;
1658 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1659 && strcmp (bfd_get_section_name (input_bfd,
1660 input_section),
1661 name + 5) == 0);
1663 sreloc = bfd_get_section_by_name (dynobj, name);
1664 BFD_ASSERT (sreloc != NULL);
1667 skip = false;
1669 if (elf_section_data (input_section)->stab_info == NULL)
1670 outrel.r_offset = rel->r_offset;
1671 else
1673 bfd_vma off;
1675 off = (_bfd_stab_section_offset
1676 (output_bfd, &elf_hash_table (info)->stab_info,
1677 input_section,
1678 &elf_section_data (input_section)->stab_info,
1679 rel->r_offset));
1680 if (off == (bfd_vma) -1)
1681 skip = true;
1682 outrel.r_offset = off;
1685 outrel.r_offset += (input_section->output_section->vma
1686 + input_section->output_offset);
1688 if (skip)
1690 memset (&outrel, 0, sizeof outrel);
1691 relocate = false;
1693 else if (r_type == R_390_PC16 ||
1694 r_type == R_390_PC16DBL ||
1695 r_type == R_390_PC32 ||
1696 r_type == R_390_PC32DBL ||
1697 r_type == R_390_PC64)
1699 BFD_ASSERT (h != NULL && h->dynindx != -1);
1700 relocate = false;
1701 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
1702 outrel.r_addend = relocation + rel->r_addend;
1704 else
1706 /* h->dynindx may be -1 if this symbol was marked to
1707 become local. */
1708 if (h == NULL
1709 || ((info->symbolic || h->dynindx == -1)
1710 && (h->elf_link_hash_flags
1711 & ELF_LINK_HASH_DEF_REGULAR) != 0))
1713 relocate = true;
1714 outrel.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1715 outrel.r_addend = relocation + rel->r_addend;
1717 else
1719 BFD_ASSERT (h->dynindx != -1);
1720 relocate = false;
1721 outrel.r_info = ELF64_R_INFO (h->dynindx, R_390_64);
1722 outrel.r_addend = relocation + rel->r_addend;
1726 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
1727 (((Elf64_External_Rela *)
1728 sreloc->contents)
1729 + sreloc->reloc_count));
1730 ++sreloc->reloc_count;
1732 /* If this reloc is against an external symbol, we do
1733 not want to fiddle with the addend. Otherwise, we
1734 need to include the symbol value so that it becomes
1735 an addend for the dynamic reloc. */
1736 if (! relocate)
1737 continue;
1740 break;
1742 default:
1743 break;
1746 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1747 contents, rel->r_offset,
1748 relocation, rel->r_addend);
1750 if (r != bfd_reloc_ok)
1752 switch (r)
1754 default:
1755 case bfd_reloc_outofrange:
1756 abort ();
1757 case bfd_reloc_overflow:
1759 const char *name;
1761 if (h != NULL)
1762 name = h->root.root.string;
1763 else
1765 name = bfd_elf_string_from_elf_section (input_bfd,
1766 symtab_hdr->sh_link,
1767 sym->st_name);
1768 if (name == NULL)
1769 return false;
1770 if (*name == '\0')
1771 name = bfd_section_name (input_bfd, sec);
1773 if (! ((*info->callbacks->reloc_overflow)
1774 (info, name, howto->name, (bfd_vma) 0,
1775 input_bfd, input_section, rel->r_offset)))
1776 return false;
1778 break;
1783 return true;
1786 /* Finish up dynamic symbol handling. We set the contents of various
1787 dynamic sections here. */
1789 static boolean
1790 elf_s390_finish_dynamic_symbol (output_bfd, info, h, sym)
1791 bfd *output_bfd;
1792 struct bfd_link_info *info;
1793 struct elf_link_hash_entry *h;
1794 Elf_Internal_Sym *sym;
1796 bfd *dynobj;
1798 dynobj = elf_hash_table (info)->dynobj;
1800 if (h->plt.offset != (bfd_vma) -1)
1802 asection *splt;
1803 asection *srela;
1804 Elf_Internal_Rela rela;
1805 bfd_vma got_offset;
1806 bfd_vma plt_index;
1807 asection *sgot;
1809 /* This symbol has an entry in the procedure linkage table. Set
1810 it up. */
1812 BFD_ASSERT (h->dynindx != -1);
1814 splt = bfd_get_section_by_name (dynobj, ".plt");
1815 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1816 srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1817 BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1819 /* Calc. index no.
1820 Current offset - size first entry / entry size. */
1821 plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
1823 /* Offset in GOT is PLT index plus GOT headers(3) times 8,
1824 addr & GOT addr. */
1825 got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
1827 /* Fill in the blueprint of a PLT. */
1828 bfd_put_32 (output_bfd, PLT_ENTRY_WORD0,
1829 splt->contents + h->plt.offset);
1830 bfd_put_32 (output_bfd, PLT_ENTRY_WORD1,
1831 splt->contents + h->plt.offset + 4);
1832 bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
1833 splt->contents + h->plt.offset + 8);
1834 bfd_put_32 (output_bfd, PLT_ENTRY_WORD3,
1835 splt->contents + h->plt.offset + 12);
1836 bfd_put_32 (output_bfd, PLT_ENTRY_WORD4,
1837 splt->contents + h->plt.offset + 16);
1838 bfd_put_32 (output_bfd, PLT_ENTRY_WORD5,
1839 splt->contents + h->plt.offset + 20);
1840 bfd_put_32 (output_bfd, PLT_ENTRY_WORD6,
1841 splt->contents + h->plt.offset + 24);
1842 bfd_put_32 (output_bfd, PLT_ENTRY_WORD7,
1843 splt->contents + h->plt.offset + 28);
1844 /* Fixup the relative address to the GOT entry */
1845 bfd_put_32 (output_bfd,
1846 (sgot->output_section->vma + sgot->output_offset + got_offset
1847 - (splt->output_section->vma + h->plt.offset))/2,
1848 splt->contents + h->plt.offset + 2);
1849 /* Fixup the relative branch to PLT 0 */
1850 bfd_put_32 (output_bfd, - (PLT_FIRST_ENTRY_SIZE +
1851 (PLT_ENTRY_SIZE * plt_index) + 22)/2,
1852 splt->contents + h->plt.offset + 24);
1853 /* Fixup offset into symbol table */
1854 bfd_put_32 (output_bfd, plt_index * sizeof (Elf64_External_Rela),
1855 splt->contents + h->plt.offset + 28);
1857 /* Fill in the entry in the .rela.plt section. */
1858 rela.r_offset = (sgot->output_section->vma
1859 + sgot->output_offset
1860 + got_offset);
1861 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
1862 rela.r_addend = 0;
1863 bfd_elf64_swap_reloca_out (output_bfd, &rela,
1864 ((Elf64_External_Rela *) srela->contents
1865 + plt_index ));
1867 /* Fill in the entry in the global offset table.
1868 Points to instruction after GOT offset. */
1869 bfd_put_64 (output_bfd,
1870 (splt->output_section->vma
1871 + splt->output_offset
1872 + h->plt.offset
1873 + 14),
1874 sgot->contents + got_offset);
1877 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1879 /* Mark the symbol as undefined, rather than as defined in
1880 the .plt section. Leave the value alone. */
1881 sym->st_shndx = SHN_UNDEF;
1885 if (h->got.offset != (bfd_vma) -1)
1887 asection *sgot;
1888 asection *srela;
1889 Elf_Internal_Rela rela;
1891 /* This symbol has an entry in the global offset table. Set it
1892 up. */
1894 sgot = bfd_get_section_by_name (dynobj, ".got");
1895 srela = bfd_get_section_by_name (dynobj, ".rela.got");
1896 BFD_ASSERT (sgot != NULL && srela != NULL);
1898 rela.r_offset = (sgot->output_section->vma
1899 + sgot->output_offset
1900 + (h->got.offset &~ 1));
1902 /* If this is a static link, or it is a -Bsymbolic link and the
1903 symbol is defined locally or was forced to be local because
1904 of a version file, we just want to emit a RELATIVE reloc.
1905 The entry in the global offset table will already have been
1906 initialized in the relocate_section function. */
1907 if (! elf_hash_table (info)->dynamic_sections_created
1908 || (info->shared
1909 && (info->symbolic || h->dynindx == -1)
1910 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1912 rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE);
1913 rela.r_addend = (h->root.u.def.value
1914 + h->root.u.def.section->output_section->vma
1915 + h->root.u.def.section->output_offset);
1917 else
1919 BFD_ASSERT((h->got.offset & 1) == 0);
1920 bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1921 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_GLOB_DAT);
1922 rela.r_addend = 0;
1925 bfd_elf64_swap_reloca_out (output_bfd, &rela,
1926 ((Elf64_External_Rela *) srela->contents
1927 + srela->reloc_count));
1928 ++srela->reloc_count;
1931 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1933 asection *s;
1934 Elf_Internal_Rela rela;
1936 /* This symbols needs a copy reloc. Set it up. */
1938 BFD_ASSERT (h->dynindx != -1
1939 && (h->root.type == bfd_link_hash_defined
1940 || h->root.type == bfd_link_hash_defweak));
1943 s = bfd_get_section_by_name (h->root.u.def.section->owner,
1944 ".rela.bss");
1945 BFD_ASSERT (s != NULL);
1947 rela.r_offset = (h->root.u.def.value
1948 + h->root.u.def.section->output_section->vma
1949 + h->root.u.def.section->output_offset);
1950 rela.r_info = ELF64_R_INFO (h->dynindx, R_390_COPY);
1951 rela.r_addend = 0;
1952 bfd_elf64_swap_reloca_out (output_bfd, &rela,
1953 ((Elf64_External_Rela *) s->contents
1954 + s->reloc_count));
1955 ++s->reloc_count;
1958 /* Mark some specially defined symbols as absolute. */
1959 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1960 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
1961 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
1962 sym->st_shndx = SHN_ABS;
1964 return true;
1967 /* Finish up the dynamic sections. */
1969 static boolean
1970 elf_s390_finish_dynamic_sections (output_bfd, info)
1971 bfd *output_bfd;
1972 struct bfd_link_info *info;
1974 bfd *dynobj;
1975 asection *sdyn;
1976 asection *sgot;
1978 dynobj = elf_hash_table (info)->dynobj;
1980 sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1981 BFD_ASSERT (sgot != NULL);
1982 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1984 if (elf_hash_table (info)->dynamic_sections_created)
1986 asection *splt;
1987 Elf64_External_Dyn *dyncon, *dynconend;
1989 BFD_ASSERT (sdyn != NULL);
1991 dyncon = (Elf64_External_Dyn *) sdyn->contents;
1992 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1993 for (; dyncon < dynconend; dyncon++)
1995 Elf_Internal_Dyn dyn;
1996 const char *name;
1997 asection *s;
1999 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2001 switch (dyn.d_tag)
2003 default:
2004 break;
2006 case DT_PLTGOT:
2007 name = ".got";
2008 goto get_vma;
2009 case DT_JMPREL:
2010 name = ".rela.plt";
2011 get_vma:
2012 s = bfd_get_section_by_name(output_bfd, name);
2013 BFD_ASSERT (s != NULL);
2014 dyn.d_un.d_ptr = s->vma;
2015 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2016 break;
2018 case DT_PLTRELSZ:
2019 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2020 BFD_ASSERT (s != NULL);
2021 if (s->_cooked_size != 0)
2022 dyn.d_un.d_val = s->_cooked_size;
2023 else
2024 dyn.d_un.d_val = s->_raw_size;
2025 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2026 break;
2028 case DT_RELASZ:
2029 /* The procedure linkage table relocs (DT_JMPREL) should
2030 not be included in the overall relocs (DT_RELA).
2031 Therefore, we override the DT_RELASZ entry here to
2032 make it not include the JMPREL relocs. Since the
2033 linker script arranges for .rela.plt to follow all
2034 other relocation sections, we don't have to worry
2035 about changing the DT_RELA entry. */
2036 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2037 if (s != NULL)
2039 if (s->_cooked_size != 0)
2040 dyn.d_un.d_val -= s->_cooked_size;
2041 else
2042 dyn.d_un.d_val -= s->_raw_size;
2044 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2045 break;
2049 /* Fill in the special first entry in the procedure linkage table. */
2050 splt = bfd_get_section_by_name (dynobj, ".plt");
2051 if (splt && splt->_raw_size > 0)
2053 /* fill in blueprint for plt 0 entry */
2054 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD0,
2055 splt->contents );
2056 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD1,
2057 splt->contents +4 );
2058 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD3,
2059 splt->contents +12 );
2060 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD4,
2061 splt->contents +16 );
2062 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD5,
2063 splt->contents +20 );
2064 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD6,
2065 splt->contents + 24);
2066 bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD7,
2067 splt->contents + 28 );
2068 /* Fixup relative address to start of GOT */
2069 bfd_put_32 (output_bfd,
2070 (sgot->output_section->vma + sgot->output_offset
2071 - splt->output_section->vma - 6)/2,
2072 splt->contents + 8);
2075 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
2076 PLT_ENTRY_SIZE;
2079 /* Set the first entry in the global offset table to the address of
2080 the dynamic section. */
2081 if (sgot->_raw_size > 0)
2083 if (sdyn == NULL)
2084 bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents);
2085 else
2086 bfd_put_64 (output_bfd,
2087 sdyn->output_section->vma + sdyn->output_offset,
2088 sgot->contents);
2090 /* One entry for shared object struct ptr. */
2091 bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
2092 /* One entry for _dl_runtime_resolve. */
2093 bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 12);
2096 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8;
2098 return true;
2101 static boolean
2102 elf_s390_object_p (abfd)
2103 bfd *abfd;
2105 return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esame);
2109 * Why was the hash table entry size definition changed from
2110 * ARCH_SIZE/8 to 4? This breaks the 64 bit dynamic linker and
2111 * this is the only reason for the s390_elf64_size_info structure.
2114 const struct elf_size_info s390_elf64_size_info =
2116 sizeof (Elf64_External_Ehdr),
2117 sizeof (Elf64_External_Phdr),
2118 sizeof (Elf64_External_Shdr),
2119 sizeof (Elf64_External_Rel),
2120 sizeof (Elf64_External_Rela),
2121 sizeof (Elf64_External_Sym),
2122 sizeof (Elf64_External_Dyn),
2123 sizeof (Elf_External_Note),
2124 8, /* hash-table entry size */
2125 1, /* internal relocations per external relocations */
2126 64, /* arch_size */
2127 8, /* file_align */
2128 ELFCLASS64, EV_CURRENT,
2129 bfd_elf64_write_out_phdrs,
2130 bfd_elf64_write_shdrs_and_ehdr,
2131 bfd_elf64_write_relocs,
2132 bfd_elf64_swap_symbol_out,
2133 bfd_elf64_slurp_reloc_table,
2134 bfd_elf64_slurp_symbol_table,
2135 bfd_elf64_swap_dyn_in,
2136 bfd_elf64_swap_dyn_out,
2137 NULL,
2138 NULL,
2139 NULL,
2140 NULL
2143 #define TARGET_BIG_SYM bfd_elf64_s390_vec
2144 #define TARGET_BIG_NAME "elf64-s390"
2145 #define ELF_ARCH bfd_arch_s390
2146 #define ELF_MACHINE_CODE EM_S390
2147 #define ELF_MACHINE_ALT1 EM_S390_OLD
2148 #define ELF_MAXPAGESIZE 0x1000
2150 #define elf_backend_size_info s390_elf64_size_info
2152 #define elf_backend_can_gc_sections 1
2153 #define elf_backend_want_got_plt 1
2154 #define elf_backend_plt_readonly 1
2155 #define elf_backend_want_plt_sym 0
2156 #define elf_backend_got_header_size 24
2157 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
2159 #define elf_info_to_howto elf_s390_info_to_howto
2161 #define bfd_elf64_bfd_final_link _bfd_elf64_gc_common_final_link
2162 #define bfd_elf64_bfd_is_local_label_name elf_s390_is_local_label_name
2163 #define bfd_elf64_bfd_link_hash_table_create elf_s390_link_hash_table_create
2164 #define bfd_elf64_bfd_reloc_type_lookup elf_s390_reloc_type_lookup
2166 #define elf_backend_adjust_dynamic_symbol elf_s390_adjust_dynamic_symbol
2167 #define elf_backend_check_relocs elf_s390_check_relocs
2168 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
2169 #define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections
2170 #define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol
2171 #define elf_backend_gc_mark_hook elf_s390_gc_mark_hook
2172 #define elf_backend_gc_sweep_hook elf_s390_gc_sweep_hook
2173 #define elf_backend_relocate_section elf_s390_relocate_section
2174 #define elf_backend_size_dynamic_sections elf_s390_size_dynamic_sections
2176 #define elf_backend_object_p elf_s390_object_p
2178 #include "elf64-target.h"