OSDN Git Service

Add s390 support
[pf3gnuchains/pf3gnuchains4x.git] / bfd / elf32-s390.c
1 /* IBM S/390-specific support for 32-bit ELF
2    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3    Contributed by Carl B. Pedersen and Martin Schwidefsky.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27
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 *));
52
53 #define USE_RELA 1              /* We want RELA relocations, not REL.  */
54
55 #include "elf/s390.h"
56
57 /* The relocation "howto" table.  */
58
59 static reloc_howto_type elf_howto_table[] =
60 {
61   HOWTO (R_390_NONE,            /* type */
62          0,                     /* rightshift */
63          0,                     /* size (0 = byte, 1 = short, 2 = long) */
64          0,                     /* bitsize */
65          false,                 /* pc_relative */
66          0,                     /* bitpos */
67          complain_overflow_dont, /* complain_on_overflow */
68          bfd_elf_generic_reloc, /* special_function */
69          "R_390_NONE",          /* name */
70          false,                 /* partial_inplace */
71          0,                     /* src_mask */
72          0,                     /* dst_mask */
73          false),                /* pcrel_offset */
74
75   HOWTO(R_390_8,         0, 0,  8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_8",       false, 0,0x000000ff, false),
76   HOWTO(R_390_12,        0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_12",      false, 0,0x00000fff, false),
77   HOWTO(R_390_16,        0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_16",      false, 0,0x0000ffff, false),
78   HOWTO(R_390_32,        0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_32",      false, 0,0xffffffff, false),
79   HOWTO(R_390_PC32,      0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC32",    false, 0,0xffffffff,  true),
80   HOWTO(R_390_GOT12,     0, 1, 12, false, 0, complain_overflow_dont, bfd_elf_generic_reloc, "R_390_GOT12",   false, 0,0x00000fff, false),
81   HOWTO(R_390_GOT32,     0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT32",   false, 0,0xffffffff, false),
82   HOWTO(R_390_PLT32,     0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT32",   false, 0,0xffffffff,  true),
83   HOWTO(R_390_COPY,      0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_COPY",    false, 0,0xffffffff, false),
84   HOWTO(R_390_GLOB_DAT,  0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GLOB_DAT",false, 0,0xffffffff, false),
85   HOWTO(R_390_JMP_SLOT,  0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_JMP_SLOT",false, 0,0xffffffff, false),
86   HOWTO(R_390_RELATIVE,  0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_RELATIVE",false, 0,0xffffffff, false),
87   HOWTO(R_390_GOTOFF,    0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTOFF",  false, 0,0xffffffff, false),
88   HOWTO(R_390_GOTPC,     0, 2, 32,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOTPC",   false, 0,0xffffffff,  true),
89   HOWTO(R_390_GOT16,     0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_GOT16",   false, 0,0x0000ffff, false),
90   HOWTO(R_390_PC16,      0, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16",    false, 0,0x0000ffff,  true),
91   HOWTO(R_390_PC16DBL,   1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff,  true),
92   HOWTO(R_390_PLT16DBL,  1, 1, 16,  true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff,  true),
93 };
94
95 /* GNU extension to record C++ vtable hierarchy.  */
96 static reloc_howto_type elf32_s390_vtinherit_howto =
97   HOWTO (R_390_GNU_VTINHERIT, 0,2,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false);
98 static reloc_howto_type elf32_s390_vtentry_howto =
99   HOWTO (R_390_GNU_VTENTRY, 0,2,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", false,0,0, false); 
100
101 static reloc_howto_type *
102 elf_s390_reloc_type_lookup (abfd, code)
103      bfd *abfd ATTRIBUTE_UNUSED;
104      bfd_reloc_code_real_type code;
105 {
106   switch (code) {
107   case BFD_RELOC_NONE:
108     return &elf_howto_table[(int) R_390_NONE];
109   case BFD_RELOC_8:
110     return &elf_howto_table[(int) R_390_8];
111   case BFD_RELOC_390_12:
112     return &elf_howto_table[(int) R_390_12];
113   case BFD_RELOC_16:
114     return &elf_howto_table[(int) R_390_16];
115   case BFD_RELOC_32:
116     return &elf_howto_table[(int) R_390_32];
117   case BFD_RELOC_CTOR:
118     return &elf_howto_table[(int) R_390_32];
119   case BFD_RELOC_32_PCREL:
120     return &elf_howto_table[(int) R_390_PC32];
121   case BFD_RELOC_390_GOT12:
122     return &elf_howto_table[(int) R_390_GOT12];
123   case BFD_RELOC_32_GOT_PCREL:
124     return &elf_howto_table[(int) R_390_GOT32];
125   case BFD_RELOC_390_PLT32:
126     return &elf_howto_table[(int) R_390_PLT32];
127   case BFD_RELOC_390_COPY:
128     return &elf_howto_table[(int) R_390_COPY];
129   case BFD_RELOC_390_GLOB_DAT:
130     return &elf_howto_table[(int) R_390_GLOB_DAT];
131   case BFD_RELOC_390_JMP_SLOT:
132     return &elf_howto_table[(int) R_390_JMP_SLOT];
133   case BFD_RELOC_390_RELATIVE:
134     return &elf_howto_table[(int) R_390_RELATIVE];
135   case BFD_RELOC_32_GOTOFF:
136     return &elf_howto_table[(int) R_390_GOTOFF];
137   case BFD_RELOC_390_GOTPC:
138     return &elf_howto_table[(int) R_390_GOTPC];
139   case BFD_RELOC_390_GOT16:
140     return &elf_howto_table[(int) R_390_GOT16];
141   case BFD_RELOC_16_PCREL:
142     return &elf_howto_table[(int) R_390_PC16];
143   case BFD_RELOC_390_PC16DBL:
144     return &elf_howto_table[(int) R_390_PC16DBL];
145   case BFD_RELOC_390_PLT16DBL:
146     return &elf_howto_table[(int) R_390_PLT16DBL];
147   case BFD_RELOC_VTABLE_INHERIT:
148     return &elf32_s390_vtinherit_howto;
149   case BFD_RELOC_VTABLE_ENTRY:
150     return &elf32_s390_vtentry_howto;
151   default:
152     break;                                         
153   }
154   return 0;
155 }
156
157 /* We need to use ELF32_R_TYPE so we have our own copy of this function,
158    and elf32-s390.c has its own copy.  */
159
160 static void
161 elf_s390_info_to_howto (abfd, cache_ptr, dst)
162      bfd *abfd ATTRIBUTE_UNUSED;
163      arelent *cache_ptr;
164      Elf_Internal_Rela *dst;
165 {
166   switch (ELF32_R_TYPE(dst->r_info))
167     {
168     case R_390_GNU_VTINHERIT:
169       cache_ptr->howto = &elf32_s390_vtinherit_howto;
170       break;
171
172     case R_390_GNU_VTENTRY:
173       cache_ptr->howto = &elf32_s390_vtentry_howto;
174       break;
175
176     default:
177       BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_390_max);
178       cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)];
179     }     
180 }
181
182 static boolean
183 elf_s390_is_local_label_name (abfd, name)
184      bfd *abfd;
185      const char *name;
186 {
187   if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L'))
188     return true;
189
190   return _bfd_elf_is_local_label_name (abfd, name);
191 }
192
193 /* Functions for the 390 ELF linker.  */
194
195 /* The name of the dynamic interpreter.  This is put in the .interp
196    section.  */
197
198 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
199
200 /* The nop opcode we use.  */
201
202 #define s390_NOP 0x07070707
203
204
205 /* The size in bytes of the first entry in the procedure linkage table.  */
206 #define PLT_FIRST_ENTRY_SIZE 32
207 /* The size in bytes of an entry in the procedure linkage table.  */
208 #define PLT_ENTRY_SIZE 32 
209
210 #define GOT_ENTRY_SIZE 4
211
212 /* The first three entries in a procedure linkage table are reserved,
213    and the initial contents are unimportant (we zero them out).
214    Subsequent entries look like this.  See the SVR4 ABI 386
215    supplement to see how this works.  */
216
217 /* For the s390, simple addr offset can only be 0 - 4096.
218    To use the full 2 GB address space, several instructions
219    are needed to load an address in a register and execute
220    a branch( or just saving the address)
221
222    Furthermore, only r 0 and 1 are free to use!!!  */ 
223
224 /* The first 3 words in the GOT are then reserved.
225    Word 0 is the address of the dynamic table.
226    Word 1 is a pointer to a structure describing the object
227    Word 2 is used to point to the loader entry address.
228
229    The code for position independand PLT entries looks like this:
230
231    r12 holds addr of the current GOT at entry to the PLT
232
233    The GOT holds the address in the PLT to be executed.
234    The loader then gets:
235    24(15) =  Pointer to the structure describing the object.
236    28(15) =  Offset in symbol table                                             
237
238    The loader  must  then find the module where the function is
239    and insert the address in the GOT.
240
241   Note: 390 can only address +- 64 K relative.
242         We check if offset > 65536, then make a relative branch -64xxx
243         back to a previous defined branch
244
245 PLT1: BASR 1,0         # 2 bytes
246       L    1,22(1)     # 4 bytes  Load offset in GOT in r 1
247       L    1,(1,12)    # 4 bytes  Load address from GOT in r1
248       BCR  15,1        # 2 bytes  Jump to address
249 RET1: BASR 1,0         # 2 bytes  Return from GOT 1st time
250       L    1,14(1)     # 4 bytes  Load offset in symol table in r1
251       BRC  15,-x       # 4 bytes  Jump to start of PLT
252       .word 0          # 2 bytes filler
253       .long ?          # 4 bytes  offset in GOT
254       .long ?          # 4 bytes  offset into symbol table
255
256   This was the general case. There are two additional, optimizes PLT
257   definitions. One for GOT offsets < 4096 and one for GOT offsets < 32768.
258   First the one for GOT offsets < 4096:
259
260 PLT1: L    1,<offset>(12) # 4 bytes  Load address from GOT in R1
261       BCR  15,1           # 2 bytes  Jump to address
262       .word 0,0,0         # 6 bytes  filler
263 RET1: BASR 1,0            # 2 bytes  Return from GOT 1st time
264       L    1,14(1)        # 4 bytes  Load offset in symbol table in r1
265       BRC  15,-x          # 4 bytes  Jump to start of PLT
266       .word 0,0,0         # 6 bytes  filler
267       .long ?             # 4 bytes  offset into symbol table
268
269   Second the one for GOT offsets < 32768:
270
271 PLT1: LHI  1,<offset>     # 4 bytes  Load offset in GOT to r1
272       L    1,(1,12)       # 4 bytes  Load address from GOT to r1
273       BCR  15,1           # 2 bytes  Jump to address
274       .word 0             # 2 bytes  filler
275 RET1: BASR 1,0            # 2 bytes  Return from GOT 1st time
276       L    1,14(1)        # 4 bytes  Load offset in symbol table in r1
277       BRC  15,-x          # 4 bytes  Jump to start of PLT
278       .word 0,0,0         # 6 bytes  filler
279       .long ?             # 4 bytes  offset into symbol table
280
281 Total = 32 bytes per PLT entry
282
283    The code for static build PLT entries looks like this:
284
285 PLT1: BASR 1,0         # 2 bytes
286       L    1,22(1)     # 4 bytes  Load address of GOT entry
287       L    1,0(0,1)    # 4 bytes  Load address from GOT in r1
288       BCR  15,1        # 2 bytes  Jump to address
289 RET1: BASR 1,0         # 2 bytes  Return from GOT 1st time
290       L    1,14(1)     # 4 bytes  Load offset in symbol table in r1
291       BRC  15,-x       # 4 bytes  Jump to start of PLT
292       .word 0          # 2 bytes  filler
293       .long ?          # 4 bytes  address of GOT entry
294       .long ?          # 4 bytes  offset into symbol table  */
295
296 #define PLT_PIC_ENTRY_WORD0 0x0d105810
297 #define PLT_PIC_ENTRY_WORD1 0x10165811
298 #define PLT_PIC_ENTRY_WORD2 0xc00007f1
299 #define PLT_PIC_ENTRY_WORD3 0x0d105810
300 #define PLT_PIC_ENTRY_WORD4 0x100ea7f4
301
302 #define PLT_PIC12_ENTRY_WORD0 0x5810c000
303 #define PLT_PIC12_ENTRY_WORD1 0x07f10000
304 #define PLT_PIC12_ENTRY_WORD2 0x00000000
305 #define PLT_PIC12_ENTRY_WORD3 0x0d105810
306 #define PLT_PIC12_ENTRY_WORD4 0x100ea7f4
307
308 #define PLT_PIC16_ENTRY_WORD0 0xa7180000
309 #define PLT_PIC16_ENTRY_WORD1 0x5811c000
310 #define PLT_PIC16_ENTRY_WORD2 0x07f10000
311 #define PLT_PIC16_ENTRY_WORD3 0x0d105810
312 #define PLT_PIC16_ENTRY_WORD4 0x100ea7f4
313
314 #define PLT_ENTRY_WORD0     0x0d105810
315 #define PLT_ENTRY_WORD1     0x10165810
316 #define PLT_ENTRY_WORD2     0x100007f1
317 #define PLT_ENTRY_WORD3     0x0d105810
318 #define PLT_ENTRY_WORD4     0x100ea7f4
319
320 /* The first PLT entry pushes the offset into the symbol table
321    from R1 onto the stack at 8(15) and the loader object info
322    at 12(15), loads the loader address in R1 and jumps to it.  */
323
324 /* The first entry in the PLT for PIC code:
325
326 PLT0:
327    ST   1,28(15)  # R1 has offset into symbol table
328    L    1,4(12)   # Get loader ino(object struct address)
329    ST   1,24(15)  # Store address 
330    L    1,8(12)   # Entry address of loader in R1
331    BR   1         # Jump to loader
332
333    The first entry in the PLT for static code:
334
335 PLT0:
336    ST   1,28(15)      # R1 has offset into symbol table
337    BASR 1,0
338    L    1,18(0,1)     # Get address of GOT
339    MVC  24(4,15),4(1) # Move loader ino to stack
340    L    1,8(1)        # Get address of loader
341    BR   1             # Jump to loader
342    .word 0            # filler
343    .long got          # address of GOT  */
344
345 #define PLT_PIC_FIRST_ENTRY_WORD0 0x5010f01c
346 #define PLT_PIC_FIRST_ENTRY_WORD1 0x5810c004
347 #define PLT_PIC_FIRST_ENTRY_WORD2 0x5010f018
348 #define PLT_PIC_FIRST_ENTRY_WORD3 0x5810c008
349 #define PLT_PIC_FIRST_ENTRY_WORD4 0x07f10000
350
351 #define PLT_FIRST_ENTRY_WORD0     0x5010f01c
352 #define PLT_FIRST_ENTRY_WORD1     0x0d105810
353 #define PLT_FIRST_ENTRY_WORD2     0x1012D203
354 #define PLT_FIRST_ENTRY_WORD3     0xf0181004
355 #define PLT_FIRST_ENTRY_WORD4     0x58101008
356 #define PLT_FIRST_ENTRY_WORD5     0x07f10000
357
358 /* The s390 linker needs to keep track of the number of relocs that it
359    decides to copy in check_relocs for each symbol.  This is so that
360    it can discard PC relative relocs if it doesn't need them when
361    linking with -Bsymbolic.  We store the information in a field
362    extending the regular ELF linker hash table.  */
363
364 /* This structure keeps track of the number of PC relative relocs we
365    have copied for a given symbol.  */
366
367 struct elf_s390_pcrel_relocs_copied
368 {
369   /* Next section.  */
370   struct elf_s390_pcrel_relocs_copied *next;
371   /* A section in dynobj.  */
372   asection *section;
373   /* Number of relocs copied in this section.  */
374   bfd_size_type count;
375 };
376
377 /* s390 ELF linker hash entry.  */
378
379 struct elf_s390_link_hash_entry
380 {
381   struct elf_link_hash_entry root;
382
383   /* Number of PC relative relocs copied for this symbol.  */
384   struct elf_s390_pcrel_relocs_copied *pcrel_relocs_copied;
385 };
386
387 /* s390 ELF linker hash table.  */
388
389 struct elf_s390_link_hash_table
390 {
391   struct elf_link_hash_table root;
392 };
393
394 /* Declare this now that the above structures are defined.  */
395
396 static boolean elf_s390_discard_copies
397   PARAMS ((struct elf_s390_link_hash_entry *, PTR));
398
399 /* Traverse an s390 ELF linker hash table.  */
400
401 #define elf_s390_link_hash_traverse(table, func, info)                  \
402   (elf_link_hash_traverse                                               \
403    (&(table)->root,                                                     \
404     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
405     (info)))
406
407 /* Get the s390 ELF linker hash table from a link_info structure.  */
408
409 #define elf_s390_hash_table(p) \
410   ((struct elf_s390_link_hash_table *) ((p)->hash))
411
412 /* Create an entry in an s390 ELF linker hash table.  */
413
414 static struct bfd_hash_entry *
415 elf_s390_link_hash_newfunc (entry, table, string)
416      struct bfd_hash_entry *entry;
417      struct bfd_hash_table *table;
418      const char *string;
419 {
420   struct elf_s390_link_hash_entry *ret =
421     (struct elf_s390_link_hash_entry *) entry;
422
423   /* Allocate the structure if it has not already been allocated by a
424      subclass.  */
425   if (ret == (struct elf_s390_link_hash_entry *) NULL)
426     ret = ((struct elf_s390_link_hash_entry *)
427            bfd_hash_allocate (table,
428                               sizeof (struct elf_s390_link_hash_entry)));
429   if (ret == (struct elf_s390_link_hash_entry *) NULL)
430     return (struct bfd_hash_entry *) ret;
431
432   /* Call the allocation method of the superclass.  */
433   ret = ((struct elf_s390_link_hash_entry *)
434          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
435                                      table, string));
436   if (ret != (struct elf_s390_link_hash_entry *) NULL)
437     {
438       ret->pcrel_relocs_copied = NULL;
439     }
440
441   return (struct bfd_hash_entry *) ret;
442 }
443
444 /* Create an s390 ELF linker hash table.  */
445
446 static struct bfd_link_hash_table *
447 elf_s390_link_hash_table_create (abfd)
448      bfd *abfd;
449 {
450   struct elf_s390_link_hash_table *ret;
451
452   ret = ((struct elf_s390_link_hash_table *)
453          bfd_alloc (abfd, sizeof (struct elf_s390_link_hash_table)));
454   if (ret == (struct elf_s390_link_hash_table *) NULL)
455     return NULL;
456
457   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
458                                        elf_s390_link_hash_newfunc))
459     {
460       bfd_release (abfd, ret);
461       return NULL;
462     }
463
464   return &ret->root.root;
465 }
466
467
468 /* Look through the relocs for a section during the first phase, and
469    allocate space in the global offset table or procedure linkage
470    table.  */
471
472 static boolean
473 elf_s390_check_relocs (abfd, info, sec, relocs)
474      bfd *abfd;
475      struct bfd_link_info *info;
476      asection *sec;
477      const Elf_Internal_Rela *relocs;
478 {
479   bfd *dynobj;
480   Elf_Internal_Shdr *symtab_hdr;
481   struct elf_link_hash_entry **sym_hashes;
482   bfd_signed_vma *local_got_refcounts;
483   const Elf_Internal_Rela *rel;
484   const Elf_Internal_Rela *rel_end;
485   asection *sgot;
486   asection *srelgot;
487   asection *sreloc;
488
489   if (info->relocateable)
490     return true;
491
492   dynobj = elf_hash_table (info)->dynobj;
493   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
494   sym_hashes = elf_sym_hashes (abfd);
495   local_got_refcounts = elf_local_got_offsets (abfd);
496
497   sgot = NULL;
498   srelgot = NULL;
499   sreloc = NULL;
500
501   rel_end = relocs + sec->reloc_count;
502   for (rel = relocs; rel < rel_end; rel++)
503     {
504       unsigned long r_symndx;
505       struct elf_link_hash_entry *h;
506
507       r_symndx = ELF32_R_SYM (rel->r_info);
508
509       if (r_symndx < symtab_hdr->sh_info)
510         h = NULL;
511       else
512         h = sym_hashes[r_symndx - symtab_hdr->sh_info];      
513
514       /* Some relocs require a global offset table.  */
515       if (dynobj == NULL)
516         {
517           switch (ELF32_R_TYPE (rel->r_info))
518             {
519             case R_390_GOT12:
520             case R_390_GOT16:
521             case R_390_GOT32:
522             case R_390_GOTOFF:
523             case R_390_GOTPC:
524               elf_hash_table (info)->dynobj = dynobj = abfd;
525               if (! _bfd_elf_create_got_section (dynobj, info))
526                 return false;
527               break;
528
529             default:
530               break;
531             }
532         }
533
534
535       switch (ELF32_R_TYPE (rel->r_info))
536         {
537         case R_390_GOT12:
538         case R_390_GOT16:
539         case R_390_GOT32:
540           /* This symbol requires a global offset table entry.  */
541
542           if (sgot == NULL)
543             {
544               sgot = bfd_get_section_by_name (dynobj, ".got");
545               BFD_ASSERT (sgot != NULL);
546             }
547
548
549           if (srelgot == NULL
550               && (h != NULL || info->shared))
551             {
552               srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
553               if (srelgot == NULL)
554                 {
555                   srelgot = bfd_make_section (dynobj, ".rela.got");
556                   if (srelgot == NULL
557                       || ! bfd_set_section_flags (dynobj, srelgot,
558                                                   (SEC_ALLOC
559                                                    | SEC_LOAD
560                                                    | SEC_HAS_CONTENTS
561                                                    | SEC_IN_MEMORY
562                                                    | SEC_LINKER_CREATED
563                                                    | SEC_READONLY))
564                       || ! bfd_set_section_alignment (dynobj, srelgot, 2))
565                     return false;
566                 }
567             }
568
569           if (h != NULL)
570             {
571               if (h->got.refcount == -1)
572                 {
573                   h->got.refcount = 1;
574
575                   /* Make sure this symbol is output as a dynamic symbol.  */
576                   if (h->dynindx == -1)
577                     {
578                       if (! bfd_elf32_link_record_dynamic_symbol (info, h))
579                         return false;
580                     }
581
582                   sgot->_raw_size += 4;
583                   srelgot->_raw_size += sizeof (Elf32_External_Rela);
584                 }
585               else
586                 h->got.refcount += 1;
587             }
588           else
589             {
590               /* This is a global offset table entry for a local symbol.  */
591               if (local_got_refcounts == NULL)
592                 {
593                   size_t size;
594
595                   size = symtab_hdr->sh_info * sizeof (bfd_signed_vma);
596                   local_got_refcounts = (bfd_signed_vma *)
597                                          bfd_alloc (abfd, size);
598                   if (local_got_refcounts == NULL)
599                     return false;
600                   elf_local_got_refcounts (abfd) = local_got_refcounts;
601                   memset (local_got_refcounts, -1, size);
602                 }
603               if (local_got_refcounts[r_symndx] == -1)
604                 {
605                   local_got_refcounts[r_symndx] = 1;
606
607                   sgot->_raw_size += 4;
608                   if (info->shared)
609                     {
610                       /* If we are generating a shared object, we need to
611                          output a R_390_RELATIVE reloc so that the dynamic
612                          linker can adjust this GOT entry.  */
613                       srelgot->_raw_size += sizeof (Elf32_External_Rela);
614                     }
615                 }
616               else
617                 local_got_refcounts[r_symndx] += 1;
618             }
619           break;
620
621         case R_390_PLT16DBL:
622         case R_390_PLT32:
623           /* This symbol requires a procedure linkage table entry.  We
624              actually build the entry in adjust_dynamic_symbol,
625              because this might be a case of linking PIC code which is
626              never referenced by a dynamic object, in which case we
627              don't need to generate a procedure linkage table entry
628              after all.  */
629
630           /* If this is a local symbol, we resolve it directly without
631              creating a procedure linkage table entry.  */
632           if (h == NULL)
633             continue;
634
635           if (h->plt.refcount == -1)
636             {
637               h->plt.refcount = 1;
638               h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
639             }
640           else
641             h->plt.refcount += 1;
642           break;
643
644         case R_390_8:
645         case R_390_16:
646         case R_390_32:
647         case R_390_PC16:
648         case R_390_PC16DBL:
649         case R_390_PC32:
650           if (h != NULL)
651             h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
652
653           /* If we are creating a shared library, and this is a reloc
654              against a global symbol, or a non PC relative reloc
655              against a local symbol, then we need to copy the reloc
656              into the shared library.  However, if we are linking with
657              -Bsymbolic, we do not need to copy a reloc against a
658              global symbol which is defined in an object we are
659              including in the link (i.e., DEF_REGULAR is set).  At
660              this point we have not seen all the input files, so it is
661              possible that DEF_REGULAR is not set now but will be set
662              later (it is never cleared).  We account for that
663              possibility below by storing information in the
664              pcrel_relocs_copied field of the hash table entry.  */
665           if (info->shared
666               && (sec->flags & SEC_ALLOC) != 0
667               && ((ELF32_R_TYPE (rel->r_info) != R_390_PC16 &&
668                    ELF32_R_TYPE (rel->r_info) != R_390_PC16DBL &&
669                    ELF32_R_TYPE (rel->r_info) != R_390_PC32)
670                   || (h != NULL
671                       && (! info->symbolic
672                           || (h->elf_link_hash_flags
673                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
674             {
675               /* When creating a shared object, we must copy these
676                  reloc types into the output file.  We create a reloc
677                  section in dynobj and make room for this reloc.  */
678               if (sreloc == NULL)
679                 {
680                   const char *name;
681
682                   name = (bfd_elf_string_from_elf_section
683                           (abfd,
684                            elf_elfheader (abfd)->e_shstrndx,
685                            elf_section_data (sec)->rel_hdr.sh_name));
686                   if (name == NULL)
687                     return false;
688
689                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
690                               && strcmp (bfd_get_section_name (abfd, sec),
691                                          name + 5) == 0);
692
693                   sreloc = bfd_get_section_by_name (dynobj, name);
694                   if (sreloc == NULL)
695                     {
696                       flagword flags;
697
698                       sreloc = bfd_make_section (dynobj, name);
699                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
700                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
701                       if ((sec->flags & SEC_ALLOC) != 0)
702                         flags |= SEC_ALLOC | SEC_LOAD;
703                       if (sreloc == NULL
704                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
705                           || ! bfd_set_section_alignment (dynobj, sreloc, 2))
706                         return false;
707                     }
708                 }
709
710               sreloc->_raw_size += sizeof (Elf32_External_Rela);
711
712               /* If we are linking with -Bsymbolic, and this is a
713                  global symbol, we count the number of PC relative
714                  relocations we have entered for this symbol, so that
715                  we can discard them again if the symbol is later
716                  defined by a regular object.  Note that this function
717                  is only called if we are using an elf_s390 linker
718                  hash table, which means that h is really a pointer to
719                  an elf_s390_link_hash_entry.  */
720               if (h != NULL
721                   && (ELF32_R_TYPE (rel->r_info) == R_390_PC16 ||
722                       ELF32_R_TYPE (rel->r_info) == R_390_PC16DBL ||
723                       ELF32_R_TYPE (rel->r_info) == R_390_PC32))
724                 {
725                   struct elf_s390_link_hash_entry *eh;
726                   struct elf_s390_pcrel_relocs_copied *p;
727
728                   eh = (struct elf_s390_link_hash_entry *) h;
729
730                   for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
731                     if (p->section == sreloc)
732                       break;
733
734                   if (p == NULL)
735                     {
736                       p = ((struct elf_s390_pcrel_relocs_copied *)
737                            bfd_alloc (dynobj, sizeof *p));
738                       if (p == NULL)
739                         return false;
740                       p->next = eh->pcrel_relocs_copied;
741                       eh->pcrel_relocs_copied = p;
742                       p->section = sreloc;
743                       p->count = 0;
744                     }
745
746                   ++p->count;
747                 }
748             }
749
750           break;
751
752           /* This relocation describes the C++ object vtable hierarchy.
753              Reconstruct it for later use during GC.  */
754         case R_390_GNU_VTINHERIT:
755           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
756             return false;
757           break;
758
759           /* This relocation describes which C++ vtable entries are actually
760              used.  Record for later use during GC.  */
761         case R_390_GNU_VTENTRY:
762           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
763             return false;
764           break;
765                    
766         default:
767           break;
768         }
769     }
770
771   return true;
772 }
773
774 /* Return the section that should be marked against GC for a given
775    relocation.  */
776
777 static asection *
778 elf_s390_gc_mark_hook (abfd, info, rel, h, sym)
779      bfd *abfd;
780      struct bfd_link_info *info ATTRIBUTE_UNUSED;
781      Elf_Internal_Rela *rel;
782      struct elf_link_hash_entry *h;
783      Elf_Internal_Sym *sym;
784 {
785   if (h != NULL)
786     {
787       switch (ELF32_R_TYPE (rel->r_info))
788         {
789         case R_390_GNU_VTINHERIT:
790         case R_390_GNU_VTENTRY:
791           break;
792
793         default:
794           switch (h->root.type)
795             {
796             case bfd_link_hash_defined:
797             case bfd_link_hash_defweak:
798               return h->root.u.def.section;
799
800             case bfd_link_hash_common:
801               return h->root.u.c.p->section;
802
803             default:
804               break;
805             }
806         }
807     }
808   else
809     {
810       if (!(elf_bad_symtab (abfd)
811             && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
812           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
813                 && sym->st_shndx != SHN_COMMON))
814         {
815           return bfd_section_from_elf_index (abfd, sym->st_shndx);
816         }
817     }
818
819   return NULL;
820 }
821
822 /* Update the got entry reference counts for the section being removed.  */
823
824 static boolean
825 elf_s390_gc_sweep_hook (abfd, info, sec, relocs)
826      bfd *abfd ATTRIBUTE_UNUSED;
827      struct bfd_link_info *info ATTRIBUTE_UNUSED;
828      asection *sec ATTRIBUTE_UNUSED;
829      const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
830 {
831   Elf_Internal_Shdr *symtab_hdr;
832   struct elf_link_hash_entry **sym_hashes;
833   bfd_signed_vma *local_got_refcounts;
834   const Elf_Internal_Rela *rel, *relend;
835   unsigned long r_symndx;
836   struct elf_link_hash_entry *h;
837   bfd *dynobj;
838   asection *sgot;
839   asection *srelgot;
840
841   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
842   sym_hashes = elf_sym_hashes (abfd);
843   local_got_refcounts = elf_local_got_refcounts (abfd);
844
845   dynobj = elf_hash_table (info)->dynobj;
846   if (dynobj == NULL)
847     return true;
848
849   sgot = bfd_get_section_by_name (dynobj, ".got");
850   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
851
852   relend = relocs + sec->reloc_count;
853   for (rel = relocs; rel < relend; rel++)
854     switch (ELF32_R_TYPE (rel->r_info))
855       {
856       case R_390_GOT12:
857       case R_390_GOT16:
858       case R_390_GOT32:
859       case R_390_GOTOFF:
860       case R_390_GOTPC:
861         r_symndx = ELF32_R_SYM (rel->r_info);
862         if (r_symndx >= symtab_hdr->sh_info)
863           {
864             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
865             if (h->got.refcount > 0)
866               {
867                 h->got.refcount -= 1;
868                 if (h->got.refcount == 0)
869                   {
870                     sgot->_raw_size -= 4;
871                     srelgot->_raw_size -= sizeof (Elf32_External_Rela);
872                   }
873               }
874           }
875         else if (local_got_refcounts != NULL)
876           {
877             if (local_got_refcounts[r_symndx] > 0)
878               {
879                 local_got_refcounts[r_symndx] -= 1;
880                 if (local_got_refcounts[r_symndx] == 0)
881                   {
882                     sgot->_raw_size -= 4;
883                     if (info->shared)
884                       srelgot->_raw_size -= sizeof (Elf32_External_Rela);
885                   }
886               }
887           }
888         break;
889
890       case R_390_PLT16DBL:
891       case R_390_PLT32:
892         r_symndx = ELF32_R_SYM (rel->r_info);
893         if (r_symndx >= symtab_hdr->sh_info)
894           {
895             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
896             if (h->plt.refcount > 0)
897               h->plt.refcount -= 1;
898           }
899         break;
900
901       default:
902         break;
903       }
904
905   return true;
906 }
907
908 /* Adjust a symbol defined by a dynamic object and referenced by a
909    regular object.  The current definition is in some section of the
910    dynamic object, but we're not including those sections.  We have to
911    change the definition to something the rest of the link can
912    understand.  */
913
914 static boolean
915 elf_s390_adjust_dynamic_symbol (info, h)
916      struct bfd_link_info *info;
917      struct elf_link_hash_entry *h;
918 {
919   bfd *dynobj;
920   asection *s;
921   unsigned int power_of_two;
922
923   dynobj = elf_hash_table (info)->dynobj;
924
925   /* Make sure we know what is going on here.  */
926   BFD_ASSERT (dynobj != NULL
927               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
928                   || h->weakdef != NULL
929                   || ((h->elf_link_hash_flags
930                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
931                       && (h->elf_link_hash_flags
932                           & ELF_LINK_HASH_REF_REGULAR) != 0
933                       && (h->elf_link_hash_flags
934                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
935
936   /* If this is a function, put it in the procedure linkage table.  We
937      will fill in the contents of the procedure linkage table later
938      (although we could actually do it here). */
939   if (h->type == STT_FUNC
940       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
941     {
942       if ((! info->shared
943            && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
944            && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
945           || (info->shared && h->plt.refcount <= 0))
946         {
947           /* This case can occur if we saw a PLT32 reloc in an input
948              file, but the symbol was never referred to by a dynamic
949              object, or if all references were garbage collected.  In
950              such a case, we don't actually need to build a procedure
951              linkage table, and we can just do a PC32 reloc instead.  */
952           h->plt.offset = (bfd_vma) -1;
953           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
954           return true;
955         }
956
957       /* Make sure this symbol is output as a dynamic symbol.  */
958       if (h->dynindx == -1)
959         {
960           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
961             return false;
962         }
963
964       s = bfd_get_section_by_name (dynobj, ".plt");
965       BFD_ASSERT (s != NULL);
966
967       /* The first entry in .plt is reserved.  */
968       if (s->_raw_size == 0)
969         s->_raw_size = PLT_FIRST_ENTRY_SIZE;
970
971      /* If this symbol is not defined in a regular file, and we are
972        not generating a shared library, then set the symbol to this
973        location in the .plt.  This is required to make function
974        pointers compare as equal between the normal executable and
975        the shared library.  */
976      if (! info->shared
977         && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
978       {
979         h->root.u.def.section = s;
980         h->root.u.def.value = s->_raw_size;
981       }
982
983       h->plt.offset = s->_raw_size;
984
985       /* Make room for this entry.  */
986       s->_raw_size += PLT_ENTRY_SIZE;
987
988       /* We also need to make an entry in the .got.plt section, which
989          will be placed in the .got section by the linker script.  */
990       s = bfd_get_section_by_name (dynobj, ".got.plt");
991       BFD_ASSERT (s != NULL);
992       s->_raw_size += GOT_ENTRY_SIZE;
993
994       /* We also need to make an entry in the .rela.plt section.  */
995       s = bfd_get_section_by_name (dynobj, ".rela.plt");
996       BFD_ASSERT (s != NULL);
997       s->_raw_size += sizeof (Elf32_External_Rela);
998
999       return true;
1000     }
1001
1002   /* If this is a weak symbol, and there is a real definition, the
1003      processor independent code will have arranged for us to see the
1004      real definition first, and we can just use the same value.  */
1005   if (h->weakdef != NULL)
1006     {
1007       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1008                   || h->weakdef->root.type == bfd_link_hash_defweak);
1009       h->root.u.def.section = h->weakdef->root.u.def.section;
1010       h->root.u.def.value = h->weakdef->root.u.def.value;
1011       return true;
1012     }
1013
1014   /* This is a reference to a symbol defined by a dynamic object which
1015      is not a function.  */
1016
1017   /* If we are creating a shared library, we must presume that the
1018      only references to the symbol are via the global offset table.
1019      For such cases we need not do anything here; the relocations will
1020      be handled correctly by relocate_section.  */
1021   if (info->shared)
1022     return true;
1023
1024   /* If there are no references to this symbol that do not use the
1025      GOT, we don't need to generate a copy reloc.  */
1026   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1027     return true;
1028
1029   /* We must allocate the symbol in our .dynbss section, which will
1030      become part of the .bss section of the executable.  There will be
1031      an entry for this symbol in the .dynsym section.  The dynamic
1032      object will contain position independent code, so all references
1033      from the dynamic object to this symbol will go through the global
1034      offset table.  The dynamic linker will use the .dynsym entry to
1035      determine the address it must put in the global offset table, so
1036      both the dynamic object and the regular object will refer to the
1037      same memory location for the variable.  */
1038
1039   s = bfd_get_section_by_name (dynobj, ".dynbss");
1040   BFD_ASSERT (s != NULL);
1041
1042   /* We must generate a R_390_COPY reloc to tell the dynamic linker
1043      to copy the initial value out of the dynamic object and into the
1044      runtime process image.  We need to remember the offset into the
1045      .rel.bss section we are going to use.  */
1046   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1047     {
1048       asection *srel;
1049
1050       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1051       BFD_ASSERT (srel != NULL);
1052       srel->_raw_size += sizeof (Elf32_External_Rela);
1053       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1054     }
1055
1056   /* We need to figure out the alignment required for this symbol.  I
1057      have no idea how ELF linkers handle this.  */
1058   power_of_two = bfd_log2 (h->size);
1059   if (power_of_two > 3)
1060     power_of_two = 3;
1061
1062   /* Apply the required alignment.  */
1063   s->_raw_size = BFD_ALIGN (s->_raw_size,
1064                             (bfd_size_type) (1 << power_of_two));
1065   if (power_of_two > bfd_get_section_alignment (dynobj, s))
1066     {
1067       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1068         return false;
1069     }
1070
1071   /* Define the symbol as being at this point in the section.  */
1072   h->root.u.def.section = s;
1073   h->root.u.def.value = s->_raw_size;
1074
1075   /* Increment the section size to make room for the symbol.  */
1076   s->_raw_size += h->size;
1077
1078   return true;
1079 }
1080
1081 /* Set the sizes of the dynamic sections.  */
1082
1083 static boolean
1084 elf_s390_size_dynamic_sections (output_bfd, info)
1085      bfd *output_bfd;
1086      struct bfd_link_info *info;
1087 {
1088   bfd *dynobj;
1089   asection *s;
1090   boolean reltext;
1091   boolean relocs;
1092   boolean plt;
1093
1094   dynobj = elf_hash_table (info)->dynobj;
1095   BFD_ASSERT (dynobj != NULL);
1096
1097   if (elf_hash_table (info)->dynamic_sections_created)
1098     {
1099       /* Set the contents of the .interp section to the interpreter.  */
1100       if (! info->shared)
1101         {
1102           s = bfd_get_section_by_name (dynobj, ".interp");
1103           BFD_ASSERT (s != NULL);
1104           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1105           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1106         }
1107     }
1108   else
1109     {
1110       /* We may have created entries in the .rela.got section.
1111          However, if we are not creating the dynamic sections, we will
1112          not actually use these entries.  Reset the size of .rela.got,
1113          which will cause it to get stripped from the output file
1114          below.  */
1115       s = bfd_get_section_by_name (dynobj, ".rela.got");
1116       if (s != NULL)
1117         s->_raw_size = 0;
1118     }
1119
1120   /* If this is a -Bsymbolic shared link, then we need to discard all
1121      PC relative relocs against symbols defined in a regular object.
1122      We allocated space for them in the check_relocs routine, but we
1123      will not fill them in in the relocate_section routine.  */
1124   if (info->shared)
1125     elf_s390_link_hash_traverse (elf_s390_hash_table (info),
1126                                  elf_s390_discard_copies,
1127                                  (PTR) info);
1128
1129   /* The check_relocs and adjust_dynamic_symbol entry points have
1130      determined the sizes of the various dynamic sections.  Allocate
1131      memory for them.  */
1132   plt = false;
1133   reltext = false;
1134   relocs = false;
1135   for (s = dynobj->sections; s != NULL; s = s->next)
1136     {
1137       const char *name;
1138       boolean strip;
1139
1140       if ((s->flags & SEC_LINKER_CREATED) == 0)
1141         continue;
1142
1143       /* It's OK to base decisions on the section name, because none
1144          of the dynobj section names depend upon the input files.  */
1145       name = bfd_get_section_name (dynobj, s);
1146
1147       strip = false;
1148
1149       if (strcmp (name, ".plt") == 0)
1150         {
1151           if (s->_raw_size == 0)
1152             {
1153               /* Strip this section if we don't need it; see the
1154                  comment below.  */
1155               strip = true;
1156             }
1157           else
1158             {
1159               /* Remember whether there is a PLT.  */
1160               plt = true;
1161             }
1162         }
1163       else if (strncmp (name, ".rela", 5) == 0)
1164         {
1165           if (s->_raw_size == 0)
1166             {
1167               /* If we don't need this section, strip it from the
1168                  output file.  This is to handle .rela.bss and
1169                  .rel.plt.  We must create it in
1170                  create_dynamic_sections, because it must be created
1171                  before the linker maps input sections to output
1172                  sections.  The linker does that before
1173                  adjust_dynamic_symbol is called, and it is that
1174                  function which decides whether anything needs to go
1175                  into these sections.  */
1176               strip = true;
1177             }
1178           else
1179             {
1180               asection *target;
1181
1182               /* Remember whether there are any reloc sections other
1183                  than .rela.plt.  */
1184               if (strcmp (name, ".rela.plt") != 0)
1185                 {
1186                   const char *outname;
1187
1188                   relocs = true;
1189
1190                   /* If this relocation section applies to a read only
1191                      section, then we probably need a DT_TEXTREL
1192                      entry.  The entries in the .rela.plt section
1193                      really apply to the .got section, which we
1194                      created ourselves and so know is not readonly.  */
1195                   outname = bfd_get_section_name (output_bfd,
1196                                                   s->output_section);
1197                   target = bfd_get_section_by_name (output_bfd, outname + 5);
1198                   if (target != NULL
1199                       && (target->flags & SEC_READONLY) != 0
1200                       && (target->flags & SEC_ALLOC) != 0)
1201                     reltext = true;
1202                 }
1203
1204               /* We use the reloc_count field as a counter if we need
1205                  to copy relocs into the output file.  */
1206               s->reloc_count = 0;
1207             }
1208         }
1209       else if (strncmp (name, ".got", 4) != 0)
1210         {
1211           /* It's not one of our sections, so don't allocate space.  */
1212           continue;
1213         }
1214
1215       if (strip)
1216         {
1217           _bfd_strip_section_from_output (info, s);
1218           continue;
1219         }
1220
1221       /* Allocate memory for the section contents.  */
1222       s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1223       if (s->contents == NULL && s->_raw_size != 0)
1224         return false;
1225     }
1226
1227   if (elf_hash_table (info)->dynamic_sections_created)
1228     {
1229       /* Add some entries to the .dynamic section.  We fill in the
1230          values later, in elf_s390_finish_dynamic_sections, but we
1231          must add the entries now so that we get the correct size for
1232          the .dynamic section.  The DT_DEBUG entry is filled in by the
1233          dynamic linker and used by the debugger.  */
1234       if (! info->shared)
1235         {
1236           if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
1237             return false;
1238         }
1239
1240       if (plt)
1241         {
1242           if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
1243               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1244               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1245               || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
1246             return false;
1247         }
1248
1249       if (relocs)
1250         {
1251           if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
1252               || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
1253               || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
1254                                             sizeof (Elf32_External_Rela)))
1255             return false;
1256          }
1257
1258       if (reltext)
1259         {
1260           if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
1261             return false;
1262           info->flags |= DF_TEXTREL;
1263         }
1264     }
1265
1266   return true;
1267 }
1268
1269 /* This function is called via elf_s390_link_hash_traverse if we are
1270    creating a shared object with -Bsymbolic.  It discards the space
1271    allocated to copy PC relative relocs against symbols which are
1272    defined in regular objects.  We allocated space for them in the
1273    check_relocs routine, but we won't fill them in in the
1274    relocate_section routine.  */
1275
1276 /*ARGSUSED*/
1277 static boolean
1278 elf_s390_discard_copies (h, inf)
1279      struct elf_s390_link_hash_entry *h;
1280      PTR inf;
1281 {
1282   struct elf_s390_pcrel_relocs_copied *s;
1283   struct bfd_link_info *info = (struct bfd_link_info *) inf;
1284
1285   /* If a symbol has been forced local or we have found a regular
1286      definition for the symbolic link case, then we won't be needing
1287      any relocs.  */
1288   if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1289       && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1290           || info->symbolic))
1291     {
1292       for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
1293         s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
1294     }
1295   return true;
1296 }
1297 /* Relocate a 390 ELF section.  */
1298
1299 static boolean
1300 elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
1301                               contents, relocs, local_syms, local_sections)
1302      bfd *output_bfd;
1303      struct bfd_link_info *info;
1304      bfd *input_bfd;
1305      asection *input_section;
1306      bfd_byte *contents;
1307      Elf_Internal_Rela *relocs;
1308      Elf_Internal_Sym *local_syms;
1309      asection **local_sections;
1310 {
1311   bfd *dynobj;
1312   Elf_Internal_Shdr *symtab_hdr;
1313   struct elf_link_hash_entry **sym_hashes;
1314   bfd_vma *local_got_offsets;
1315   asection *sgot;
1316   asection *splt;
1317   asection *sreloc;
1318   Elf_Internal_Rela *rel;
1319   Elf_Internal_Rela *relend;
1320
1321   dynobj = elf_hash_table (info)->dynobj;
1322   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1323   sym_hashes = elf_sym_hashes (input_bfd);
1324   local_got_offsets = elf_local_got_offsets (input_bfd);
1325
1326   sgot = NULL;
1327   splt = NULL;
1328   sreloc = NULL;
1329   if (dynobj != NULL)
1330     {
1331       splt = bfd_get_section_by_name (dynobj, ".plt");
1332       sgot = bfd_get_section_by_name (dynobj, ".got");
1333     }
1334
1335   rel = relocs;
1336   relend = relocs + input_section->reloc_count;
1337   for (; rel < relend; rel++)
1338     {
1339       int r_type;
1340       reloc_howto_type *howto;
1341       unsigned long r_symndx;
1342       struct elf_link_hash_entry *h;
1343       Elf_Internal_Sym *sym;
1344       asection *sec;
1345       bfd_vma relocation;
1346       bfd_reloc_status_type r;
1347
1348       r_type = ELF32_R_TYPE (rel->r_info);
1349       if (r_type == (int) R_390_GNU_VTINHERIT
1350           || r_type == (int) R_390_GNU_VTENTRY)
1351         continue;
1352       if (r_type < 0 || r_type >= (int) R_390_max)
1353         {
1354           bfd_set_error (bfd_error_bad_value);
1355           return false;
1356         }
1357       howto = elf_howto_table + r_type;
1358
1359       r_symndx = ELF32_R_SYM (rel->r_info);
1360
1361       if (info->relocateable)
1362         {
1363           /* This is a relocateable link.  We don't have to change
1364              anything, unless the reloc is against a section symbol,
1365              in which case we have to adjust according to where the
1366              section symbol winds up in the output section.  */
1367           if (r_symndx < symtab_hdr->sh_info)
1368             {
1369               sym = local_syms + r_symndx;
1370               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1371                 {
1372                   sec = local_sections[r_symndx];
1373                   rel->r_addend += sec->output_offset + sym->st_value;
1374                 }
1375             }
1376
1377           continue;
1378         }
1379
1380       /* This is a final link.  */
1381       h = NULL;
1382       sym = NULL;
1383       sec = NULL;
1384       if (r_symndx < symtab_hdr->sh_info)
1385         {
1386           sym = local_syms + r_symndx;
1387           sec = local_sections[r_symndx];
1388           relocation = (sec->output_section->vma
1389                         + sec->output_offset
1390                         + sym->st_value);
1391         }
1392       else
1393         {
1394           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1395           while (h->root.type == bfd_link_hash_indirect
1396                  || h->root.type == bfd_link_hash_warning)
1397             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1398           if (h->root.type == bfd_link_hash_defined
1399               || h->root.type == bfd_link_hash_defweak)
1400             {
1401               sec = h->root.u.def.section;
1402               if (r_type == R_390_GOTPC
1403                   || ((r_type == R_390_PLT16DBL ||
1404                        r_type == R_390_PLT32)
1405                       && splt != NULL
1406                       && h->plt.offset != (bfd_vma) -1)
1407                   || ((r_type == R_390_GOT12 ||
1408                        r_type == R_390_GOT16 ||
1409                        r_type == R_390_GOT32)
1410                       && elf_hash_table (info)->dynamic_sections_created
1411                       && (! info->shared
1412                           || (! info->symbolic && h->dynindx != -1)
1413                           || (h->elf_link_hash_flags
1414                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
1415                   || (info->shared
1416                       && ((! info->symbolic && h->dynindx != -1)
1417                           || (h->elf_link_hash_flags
1418                               & ELF_LINK_HASH_DEF_REGULAR) == 0)
1419                       && ( r_type == R_390_8 ||
1420                            r_type == R_390_16 ||
1421                            r_type == R_390_32 ||
1422                            r_type == R_390_PC16 ||
1423                            r_type == R_390_PC16DBL ||
1424                            r_type == R_390_PC32)
1425                       && ((input_section->flags & SEC_ALLOC) != 0
1426                           /* DWARF will emit R_386_32 relocations in its
1427                              sections against symbols defined externally
1428                              in shared libraries.  We can't do anything
1429                              with them here.  */
1430                           || ((input_section->flags & SEC_DEBUGGING) != 0
1431                               && (h->elf_link_hash_flags
1432                                   & ELF_LINK_HASH_DEF_DYNAMIC) != 0))))
1433                 {
1434                   /* In these cases, we don't need the relocation
1435                      value.  We check specially because in some
1436                      obscure cases sec->output_section will be NULL.  */
1437                   relocation = 0;
1438                 }
1439               else if (sec->output_section == NULL)
1440                 {
1441                   (*_bfd_error_handler)
1442                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1443                      bfd_get_filename (input_bfd), h->root.root.string,
1444                      bfd_get_section_name (input_bfd, input_section));
1445                   relocation = 0;
1446                 }
1447               else
1448                 relocation = (h->root.u.def.value
1449                               + sec->output_section->vma
1450                               + sec->output_offset);
1451             }
1452           else if (h->root.type == bfd_link_hash_undefweak)
1453             relocation = 0;
1454           else if (info->shared && !info->symbolic
1455                    && !info->no_undefined
1456                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1457             relocation = 0;
1458           else
1459             {
1460               if (! ((*info->callbacks->undefined_symbol)
1461                      (info, h->root.root.string, input_bfd,
1462                       input_section, rel->r_offset,
1463                      (!info->shared || info->no_undefined
1464                       || ELF_ST_VISIBILITY (h->other)))))
1465                 return false;
1466               relocation = 0;
1467             }
1468         }
1469
1470       switch (r_type)
1471         {
1472         case R_390_GOT12:
1473         case R_390_GOT16:
1474         case R_390_GOT32:
1475           /* Relocation is to the entry for this symbol in the global
1476              offset table.  */
1477           BFD_ASSERT (sgot != NULL);
1478
1479           if (h != NULL)
1480             {
1481               bfd_vma off;
1482
1483               off = h->got.offset;
1484               BFD_ASSERT (off != (bfd_vma) -1);
1485
1486               if (! elf_hash_table (info)->dynamic_sections_created
1487                   || (info->shared
1488                       && (info->symbolic || h->dynindx == -1)
1489                       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1490                 {
1491                   /* This is actually a static link, or it is a
1492                      -Bsymbolic link and the symbol is defined
1493                      locally, or the symbol was forced to be local
1494                      because of a version file.  We must initialize
1495                      this entry in the global offset table.  Since the
1496                      offset must always be a multiple of 2, we use the
1497                      least significant bit to record whether we have
1498                      initialized it already.
1499
1500                      When doing a dynamic link, we create a .rel.got
1501                      relocation entry to initialize the value.  This
1502                      is done in the finish_dynamic_symbol routine.  */
1503                   if ((off & 1) != 0)
1504                     off &= ~1;
1505                   else
1506                     {
1507                       bfd_put_32 (output_bfd, relocation,
1508                                   sgot->contents + off);
1509                       h->got.offset |= 1;
1510                     }
1511                 }
1512               relocation = sgot->output_offset + off;
1513             }
1514           else
1515             {
1516               bfd_vma off;
1517
1518               BFD_ASSERT (local_got_offsets != NULL
1519                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
1520
1521               off = local_got_offsets[r_symndx];
1522
1523               /* The offset must always be a multiple of 4.  We use
1524                  the least significant bit to record whether we have
1525                  already generated the necessary reloc.  */
1526               if ((off & 1) != 0)
1527                 off &= ~1;
1528               else
1529                 {
1530                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1531
1532                   if (info->shared)
1533                     {
1534                       asection *srelgot;
1535                       Elf_Internal_Rela outrel;
1536
1537                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1538                       BFD_ASSERT (srelgot != NULL);
1539
1540                       outrel.r_offset = (sgot->output_section->vma
1541                                          + sgot->output_offset
1542                                          + off);
1543                       outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
1544                       outrel.r_addend = relocation;
1545                       bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1546                                                 (((Elf32_External_Rela *)
1547                                                   srelgot->contents)
1548                                                  + srelgot->reloc_count));
1549                       ++srelgot->reloc_count;
1550                     }
1551
1552                   local_got_offsets[r_symndx] |= 1;
1553                 }
1554
1555               relocation = sgot->output_offset + off;
1556             }
1557
1558
1559           break;
1560  
1561         case R_390_GOTOFF:
1562           /* Relocation is relative to the start of the global offset
1563              table.  */
1564
1565           if (sgot == NULL)
1566             {
1567               sgot = bfd_get_section_by_name (dynobj, ".got");
1568               BFD_ASSERT (sgot != NULL);
1569             }
1570
1571           /* Note that sgot->output_offset is not involved in this
1572              calculation.  We always want the start of .got.  If we
1573              defined _GLOBAL_OFFSET_TABLE in a different way, as is
1574              permitted by the ABI, we might have to change this
1575              calculation.  */
1576           relocation -= sgot->output_section->vma;
1577
1578           break;
1579
1580         case R_390_GOTPC:
1581           /* Use global offset table as symbol value.  */
1582
1583           if (sgot == NULL)
1584             {
1585               sgot = bfd_get_section_by_name (dynobj, ".got");
1586               BFD_ASSERT (sgot != NULL);
1587             }
1588
1589           relocation = sgot->output_section->vma;
1590
1591           break;
1592
1593         case R_390_PLT16DBL:
1594         case R_390_PLT32:
1595           /* Relocation is to the entry for this symbol in the
1596              procedure linkage table.  */
1597
1598           /* Resolve a PLT32 reloc against a local symbol directly,
1599              without using the procedure linkage table.  */
1600           if (h == NULL)
1601             break;
1602
1603           if (h->plt.offset == (bfd_vma) -1 || splt == NULL)
1604             {
1605               /* We didn't make a PLT entry for this symbol.  This
1606                  happens when statically linking PIC code, or when
1607                  using -Bsymbolic.  */
1608               break;
1609             }
1610
1611           relocation = (splt->output_section->vma
1612                         + splt->output_offset
1613                         + h->plt.offset);
1614
1615           break;
1616
1617         case R_390_8:
1618         case R_390_16:
1619         case R_390_32:
1620         case R_390_PC16:
1621         case R_390_PC16DBL:
1622         case R_390_PC32:
1623           if (info->shared
1624               && (input_section->flags & SEC_ALLOC) != 0
1625               && ((r_type != R_390_PC16 &&
1626                    r_type != R_390_PC16DBL &&
1627                    r_type != R_390_PC32)
1628                   || (h != NULL
1629                       && h->dynindx != -1
1630                       && (! info->symbolic
1631                           || (h->elf_link_hash_flags
1632                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1633             {
1634               Elf_Internal_Rela outrel;
1635               boolean skip, relocate;
1636
1637               /* When generating a shared object, these relocations
1638                  are copied into the output file to be resolved at run
1639                  time.  */
1640
1641               if (sreloc == NULL)
1642                 {
1643                   const char *name;
1644
1645                   name = (bfd_elf_string_from_elf_section
1646                           (input_bfd,
1647                            elf_elfheader (input_bfd)->e_shstrndx,
1648                            elf_section_data (input_section)->rel_hdr.sh_name));
1649                   if (name == NULL)
1650                     return false;
1651
1652                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1653                               && strcmp (bfd_get_section_name (input_bfd,
1654                                                                input_section),
1655                                          name + 5) == 0);
1656
1657                   sreloc = bfd_get_section_by_name (dynobj, name);
1658                   BFD_ASSERT (sreloc != NULL);
1659                 }
1660
1661               skip = false;
1662
1663               if (elf_section_data (input_section)->stab_info == NULL)
1664                 outrel.r_offset = rel->r_offset;
1665               else
1666                 {
1667                   bfd_vma off;
1668
1669                   off = (_bfd_stab_section_offset
1670                          (output_bfd, &elf_hash_table (info)->stab_info,
1671                           input_section,
1672                           &elf_section_data (input_section)->stab_info,
1673                           rel->r_offset));
1674                   if (off == (bfd_vma) -1)
1675                     skip = true;
1676                   outrel.r_offset = off;
1677                 }
1678
1679               outrel.r_offset += (input_section->output_section->vma
1680                                   + input_section->output_offset);
1681
1682               if (skip)
1683                 {
1684                   memset (&outrel, 0, sizeof outrel);
1685                   relocate = false;
1686                 }
1687               else if (r_type == R_390_PC16 ||
1688                        r_type == R_390_PC16DBL ||
1689                        r_type == R_390_PC32)
1690                 {
1691                   BFD_ASSERT (h != NULL && h->dynindx != -1);
1692                   relocate = false;
1693                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1694                   outrel.r_addend = relocation + rel->r_addend;
1695                 }
1696               else
1697                 {
1698                   /* h->dynindx may be -1 if this symbol was marked to
1699                      become local.  */
1700                   if (h == NULL
1701                       || ((info->symbolic || h->dynindx == -1)
1702                           && (h->elf_link_hash_flags
1703                               & ELF_LINK_HASH_DEF_REGULAR) != 0))
1704                     {
1705                       relocate = true;
1706                       outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
1707                       outrel.r_addend = relocation + rel->r_addend;
1708                     }
1709                   else
1710                     {
1711                       BFD_ASSERT (h->dynindx != -1);
1712                       relocate = false;
1713                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_390_32);
1714                       outrel.r_addend = relocation + rel->r_addend;
1715                     }
1716                 }
1717
1718               bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1719                                         (((Elf32_External_Rela *)
1720                                           sreloc->contents)
1721                                          + sreloc->reloc_count));
1722               ++sreloc->reloc_count;
1723
1724               /* If this reloc is against an external symbol, we do
1725                  not want to fiddle with the addend.  Otherwise, we
1726                  need to include the symbol value so that it becomes
1727                  an addend for the dynamic reloc.  */
1728               if (! relocate)
1729                 continue;
1730             }
1731
1732           break;
1733
1734         default:
1735           break;
1736         }
1737
1738       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1739                                       contents, rel->r_offset,
1740                                       relocation, rel->r_addend);
1741
1742       if (r != bfd_reloc_ok)
1743         {
1744           switch (r)
1745             {
1746             default:
1747             case bfd_reloc_outofrange:
1748               abort ();
1749             case bfd_reloc_overflow:
1750               {
1751                 const char *name;
1752
1753                 if (h != NULL)
1754                   name = h->root.root.string;
1755                 else
1756                   {
1757                     name = bfd_elf_string_from_elf_section (input_bfd,
1758                                                             symtab_hdr->sh_link,
1759                                                             sym->st_name);
1760                     if (name == NULL)
1761                       return false;
1762                     if (*name == '\0')
1763                       name = bfd_section_name (input_bfd, sec);
1764                   }
1765                 if (! ((*info->callbacks->reloc_overflow)
1766                        (info, name, howto->name, (bfd_vma) 0,
1767                         input_bfd, input_section, rel->r_offset)))
1768                   return false;
1769               }
1770               break;
1771             }
1772         }
1773     }
1774
1775   return true;
1776 }
1777
1778 /* Finish up dynamic symbol handling.  We set the contents of various
1779    dynamic sections here.  */
1780
1781 static boolean
1782 elf_s390_finish_dynamic_symbol (output_bfd, info, h, sym)
1783      bfd *output_bfd;
1784      struct bfd_link_info *info;
1785      struct elf_link_hash_entry *h;
1786      Elf_Internal_Sym *sym;
1787 {
1788   bfd *dynobj;
1789
1790   dynobj = elf_hash_table (info)->dynobj;
1791
1792   if (h->plt.offset != (bfd_vma) -1)
1793     {
1794       asection *splt;
1795       asection *srela;
1796       Elf_Internal_Rela rela;
1797       bfd_vma relative_offset;
1798       bfd_vma got_offset;
1799       bfd_vma plt_index;
1800       asection *sgot;
1801
1802       /* This symbol has an entry in the procedure linkage table.  Set
1803          it up.  */
1804
1805       BFD_ASSERT (h->dynindx != -1);
1806
1807       splt = bfd_get_section_by_name (dynobj, ".plt");
1808       sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1809       srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1810       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1811
1812       /* Calc. index no. 
1813          Current offset - size first entry / entry size.  */
1814       plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
1815
1816       /* Offset in GOT is PLT index plus GOT headers(3) times 4,
1817          addr & GOT addr.  */
1818       got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
1819
1820       /* S390 uses halfwords for relative branch calc!  */
1821       relative_offset = - ((PLT_FIRST_ENTRY_SIZE + 
1822                            (PLT_ENTRY_SIZE * plt_index) + 18)/2);
1823       /* If offset is > 32768, branch to a previous branch
1824          390 can only handle +-64 K jumps.  */
1825       if ( -32768 > (int)relative_offset )
1826           relative_offset = -(((65536/PLT_ENTRY_SIZE-1)*PLT_ENTRY_SIZE)/2);
1827
1828       /* Fill in the entry in the procedure linkage table.  */
1829       if (!info->shared)
1830        {
1831         bfd_put_32 (output_bfd, PLT_ENTRY_WORD0,
1832                     splt->contents + h->plt.offset);
1833         bfd_put_32 (output_bfd, PLT_ENTRY_WORD1,
1834                     splt->contents + h->plt.offset + 4);
1835         bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
1836                     splt->contents + h->plt.offset + 8);
1837         bfd_put_32 (output_bfd, PLT_ENTRY_WORD3,
1838                     splt->contents + h->plt.offset + 12);
1839         bfd_put_32 (output_bfd, PLT_ENTRY_WORD4,
1840                     splt->contents + h->plt.offset + 16);
1841         bfd_put_32 (output_bfd, 0+(relative_offset << 16),
1842                     splt->contents + h->plt.offset + 20);
1843         bfd_put_32 (output_bfd,
1844                     (sgot->output_section->vma +
1845                      sgot->output_offset +
1846                      got_offset),
1847                      splt->contents + h->plt.offset + 24);
1848        }
1849       else if (got_offset < 4096)
1850        {
1851         bfd_put_32 (output_bfd, PLT_PIC12_ENTRY_WORD0 + got_offset,
1852                     splt->contents + h->plt.offset);
1853         bfd_put_32 (output_bfd, PLT_PIC12_ENTRY_WORD1,
1854                     splt->contents + h->plt.offset + 4);
1855         bfd_put_32 (output_bfd, PLT_PIC12_ENTRY_WORD2,
1856                     splt->contents + h->plt.offset + 8);
1857         bfd_put_32 (output_bfd, PLT_PIC12_ENTRY_WORD3,
1858                     splt->contents + h->plt.offset + 12);
1859         bfd_put_32 (output_bfd, PLT_PIC12_ENTRY_WORD4,
1860                     splt->contents + h->plt.offset + 16);
1861         bfd_put_32 (output_bfd, 0+(relative_offset << 16),
1862                     splt->contents + h->plt.offset + 20);
1863         bfd_put_32 (output_bfd, 0,
1864                     splt->contents + h->plt.offset + 24);
1865        }
1866       else if (got_offset < 32768)
1867        {
1868         bfd_put_32 (output_bfd, PLT_PIC16_ENTRY_WORD0 + got_offset,
1869                     splt->contents + h->plt.offset);
1870         bfd_put_32 (output_bfd, PLT_PIC16_ENTRY_WORD1,
1871                     splt->contents + h->plt.offset + 4);
1872         bfd_put_32 (output_bfd, PLT_PIC16_ENTRY_WORD2,
1873                     splt->contents + h->plt.offset + 8);
1874         bfd_put_32 (output_bfd, PLT_PIC16_ENTRY_WORD3,
1875                     splt->contents + h->plt.offset + 12);
1876         bfd_put_32 (output_bfd, PLT_PIC16_ENTRY_WORD4,
1877                     splt->contents + h->plt.offset + 16);
1878         bfd_put_32 (output_bfd, 0+(relative_offset << 16),
1879                     splt->contents + h->plt.offset + 20);
1880         bfd_put_32 (output_bfd, 0,
1881                     splt->contents + h->plt.offset + 24);
1882        }
1883       else
1884        {
1885         bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD0,
1886                     splt->contents + h->plt.offset);
1887         bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD1,
1888                     splt->contents + h->plt.offset + 4);
1889         bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD2,
1890                     splt->contents + h->plt.offset + 8);
1891         bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD3, 
1892                     splt->contents + h->plt.offset + 12);
1893         bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD4,
1894                     splt->contents + h->plt.offset + 16);
1895         bfd_put_32 (output_bfd, 0+(relative_offset << 16),
1896                     splt->contents + h->plt.offset + 20);
1897         bfd_put_32 (output_bfd, got_offset,
1898                     splt->contents + h->plt.offset + 24);
1899        }
1900       /* Insert offset into  reloc. table here.  */
1901       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
1902                   splt->contents + h->plt.offset + 28);
1903       /* Fill in the entry in the .rela.plt section.  */
1904       rela.r_offset = (sgot->output_section->vma
1905                        + sgot->output_offset
1906                        + got_offset);
1907       rela.r_info = ELF32_R_INFO (h->dynindx, R_390_JMP_SLOT);
1908       rela.r_addend = 0;
1909       bfd_elf32_swap_reloca_out (output_bfd, &rela,
1910                                  ((Elf32_External_Rela *) srela->contents
1911                                   + plt_index ));
1912
1913       /* Fill in the entry in the global offset table.
1914          Points to instruction after GOT offset.  */
1915       bfd_put_32 (output_bfd,
1916                   (splt->output_section->vma
1917                    + splt->output_offset
1918                    + h->plt.offset
1919                    + 12),
1920                   sgot->contents + got_offset);
1921
1922
1923       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1924         {
1925           /* Mark the symbol as undefined, rather than as defined in
1926              the .plt section.  Leave the value alone.  */
1927           sym->st_shndx = SHN_UNDEF;
1928         }
1929     }
1930
1931   if (h->got.offset != (bfd_vma) -1)
1932     {
1933       asection *sgot;
1934       asection *srela;
1935       Elf_Internal_Rela rela;
1936
1937       /* This symbol has an entry in the global offset table.  Set it
1938          up.  */
1939
1940       sgot = bfd_get_section_by_name (dynobj, ".got");
1941       srela = bfd_get_section_by_name (dynobj, ".rela.got");
1942       BFD_ASSERT (sgot != NULL && srela != NULL);
1943
1944       rela.r_offset = (sgot->output_section->vma
1945                        + sgot->output_offset
1946                        + (h->got.offset &~ 1));
1947
1948       /* If this is a static link, or it is a -Bsymbolic link and the
1949          symbol is defined locally or was forced to be local because
1950          of a version file, we just want to emit a RELATIVE reloc.
1951          The entry in the global offset table will already have been
1952          initialized in the relocate_section function.  */
1953       if (! elf_hash_table (info)->dynamic_sections_created
1954           || (info->shared
1955               && (info->symbolic || h->dynindx == -1)
1956               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1957         {
1958           rela.r_info = ELF32_R_INFO (0, R_390_RELATIVE);
1959           rela.r_addend = (h->root.u.def.value
1960                            + h->root.u.def.section->output_section->vma
1961                            + h->root.u.def.section->output_offset);
1962         }
1963       else
1964         {
1965           BFD_ASSERT((h->got.offset & 1) == 0);
1966           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1967           rela.r_info = ELF32_R_INFO (h->dynindx, R_390_GLOB_DAT);
1968           rela.r_addend = 0;
1969         }
1970
1971       bfd_elf32_swap_reloca_out (output_bfd, &rela,
1972                                  ((Elf32_External_Rela *) srela->contents
1973                                   + srela->reloc_count));
1974       ++srela->reloc_count;
1975     }
1976
1977   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1978     {
1979       asection *s;
1980       Elf_Internal_Rela rela;
1981
1982       /* This symbols needs a copy reloc.  Set it up.  */
1983
1984       BFD_ASSERT (h->dynindx != -1
1985                   && (h->root.type == bfd_link_hash_defined
1986                       || h->root.type == bfd_link_hash_defweak));
1987
1988
1989       s = bfd_get_section_by_name (h->root.u.def.section->owner,
1990                                    ".rela.bss");
1991       BFD_ASSERT (s != NULL);
1992
1993       rela.r_offset = (h->root.u.def.value
1994                        + h->root.u.def.section->output_section->vma
1995                        + h->root.u.def.section->output_offset);
1996       rela.r_info = ELF32_R_INFO (h->dynindx, R_390_COPY);
1997       rela.r_addend = 0;
1998       bfd_elf32_swap_reloca_out (output_bfd, &rela,
1999                                  ((Elf32_External_Rela *) s->contents
2000                                   + s->reloc_count));
2001       ++s->reloc_count;
2002     }
2003
2004   /* Mark some specially defined symbols as absolute.  */
2005   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2006       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
2007       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
2008     sym->st_shndx = SHN_ABS;
2009
2010   return true;
2011 }
2012
2013 /* Finish up the dynamic sections.  */
2014
2015 static boolean
2016 elf_s390_finish_dynamic_sections (output_bfd, info)
2017      bfd *output_bfd;
2018      struct bfd_link_info *info;
2019 {
2020   bfd *dynobj;
2021   asection *sdyn;
2022   asection *sgot;
2023
2024   dynobj = elf_hash_table (info)->dynobj;
2025
2026   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
2027   BFD_ASSERT (sgot != NULL);
2028   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2029
2030   if (elf_hash_table (info)->dynamic_sections_created)
2031     {
2032       asection *splt;
2033       Elf32_External_Dyn *dyncon, *dynconend;
2034
2035       BFD_ASSERT (sdyn != NULL);
2036
2037       dyncon = (Elf32_External_Dyn *) sdyn->contents;
2038       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2039       for (; dyncon < dynconend; dyncon++)
2040         {
2041           Elf_Internal_Dyn dyn;
2042           const char *name;
2043           asection *s;
2044
2045           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2046
2047           switch (dyn.d_tag)
2048             {
2049             default:
2050               break;
2051
2052             case DT_PLTGOT:
2053               name = ".got";
2054               goto get_vma;
2055             case DT_JMPREL:
2056               name = ".rela.plt";
2057             get_vma:
2058               s = bfd_get_section_by_name(output_bfd, name);
2059               BFD_ASSERT (s != NULL);
2060               dyn.d_un.d_ptr = s->vma;
2061               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2062               break;
2063
2064             case DT_PLTRELSZ:
2065               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2066               BFD_ASSERT (s != NULL);
2067               if (s->_cooked_size != 0)
2068                 dyn.d_un.d_val = s->_cooked_size;
2069               else
2070                 dyn.d_un.d_val = s->_raw_size;
2071               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2072               break;
2073             }
2074         }
2075
2076       /* Fill in the special first entry in the procedure linkage table.  */
2077       splt = bfd_get_section_by_name (dynobj, ".plt");
2078       if (splt && splt->_raw_size > 0)
2079         {
2080           memset (splt->contents, 0, PLT_FIRST_ENTRY_SIZE);
2081           if (info->shared)
2082            {
2083               bfd_put_32 (output_bfd, PLT_PIC_FIRST_ENTRY_WORD0,
2084                           splt->contents );
2085               bfd_put_32 (output_bfd, PLT_PIC_FIRST_ENTRY_WORD1,
2086                           splt->contents +4 );
2087               bfd_put_32 (output_bfd, PLT_PIC_FIRST_ENTRY_WORD2,
2088                           splt->contents +8 );
2089               bfd_put_32 (output_bfd, PLT_PIC_FIRST_ENTRY_WORD3,
2090                           splt->contents +12 );
2091               bfd_put_32 (output_bfd, PLT_PIC_FIRST_ENTRY_WORD4,
2092                           splt->contents +16 );
2093            }
2094           else
2095            {
2096               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD0,
2097                           splt->contents );
2098               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD1,
2099                           splt->contents +4 );
2100               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD2,
2101                           splt->contents +8 );
2102               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD3,
2103                           splt->contents +12 );
2104               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD4,
2105                           splt->contents +16 );
2106               bfd_put_32 (output_bfd, PLT_FIRST_ENTRY_WORD5,
2107                           splt->contents +20 );
2108               bfd_put_32 (output_bfd,
2109                           sgot->output_section->vma + sgot->output_offset,
2110                           splt->contents + 24);
2111            }
2112           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
2113         }
2114
2115     }
2116
2117   /* Set the first entry in the global offset table to the address of
2118      the dynamic section.  */
2119   if (sgot->_raw_size > 0)
2120     {
2121       if (sdyn == NULL)
2122         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2123       else
2124         bfd_put_32 (output_bfd,
2125                     sdyn->output_section->vma + sdyn->output_offset,
2126                     sgot->contents);
2127
2128       /* One entry for shared object struct ptr.  */
2129       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
2130       /* One entry for _dl_runtime_resolve.  */
2131       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
2132     }
2133
2134   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2135
2136   return true;
2137 }
2138
2139 static boolean
2140 elf_s390_object_p (abfd)
2141      bfd *abfd;
2142 {
2143   return bfd_default_set_arch_mach (abfd, bfd_arch_s390, bfd_mach_s390_esa);
2144 }
2145
2146 #define TARGET_BIG_SYM  bfd_elf32_s390_vec
2147 #define TARGET_BIG_NAME "elf32-s390"
2148 #define ELF_ARCH        bfd_arch_s390
2149 #define ELF_MACHINE_CODE EM_S390
2150 #define ELF_MACHINE_ALT1 EM_S390_OLD
2151 #define ELF_MAXPAGESIZE 0x1000
2152
2153 #define elf_backend_can_gc_sections     1
2154 #define elf_backend_want_got_plt        1
2155 #define elf_backend_plt_readonly        1
2156 #define elf_backend_want_plt_sym        0
2157 #define elf_backend_got_header_size     12
2158 #define elf_backend_plt_header_size     PLT_ENTRY_SIZE
2159
2160 #define elf_info_to_howto                     elf_s390_info_to_howto
2161
2162 #define bfd_elf32_bfd_final_link              _bfd_elf32_gc_common_final_link
2163 #define bfd_elf32_bfd_is_local_label_name     elf_s390_is_local_label_name
2164 #define bfd_elf32_bfd_link_hash_table_create  elf_s390_link_hash_table_create
2165 #define bfd_elf32_bfd_reloc_type_lookup       elf_s390_reloc_type_lookup
2166
2167 #define elf_backend_adjust_dynamic_symbol     elf_s390_adjust_dynamic_symbol
2168 #define elf_backend_check_relocs              elf_s390_check_relocs
2169 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
2170 #define elf_backend_finish_dynamic_sections   elf_s390_finish_dynamic_sections
2171 #define elf_backend_finish_dynamic_symbol     elf_s390_finish_dynamic_symbol
2172 #define elf_backend_gc_mark_hook              elf_s390_gc_mark_hook
2173 #define elf_backend_gc_sweep_hook             elf_s390_gc_sweep_hook
2174 #define elf_backend_relocate_section          elf_s390_relocate_section
2175 #define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
2176
2177 #define elf_backend_object_p            elf_s390_object_p
2178
2179 #include "elf32-target.h"