OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-s390.c] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.