Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elf32-i386.c
Line
Count
Source (jump to first uncovered line)
1
/* Intel 80386/80486-specific support for 32-bit ELF
2
   Copyright (C) 1993-2025 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
#include "elfxx-x86.h"
22
#include "elf-vxworks.h"
23
#include "dwarf2.h"
24
#include "opcode/i386.h"
25
26
/* 386 uses REL relocations instead of RELA.  */
27
#define USE_REL 1
28
29
static reloc_howto_type elf_howto_table[]=
30
{
31
  HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
32
  bfd_elf_generic_reloc, "R_386_NONE",
33
  true, 0x00000000, 0x00000000, false),
34
  HOWTO(R_386_32, 0, 4, 32, false, 0, complain_overflow_dont,
35
  bfd_elf_generic_reloc, "R_386_32",
36
  true, 0xffffffff, 0xffffffff, false),
37
  HOWTO(R_386_PC32, 0, 4, 32, true, 0, complain_overflow_dont,
38
  bfd_elf_generic_reloc, "R_386_PC32",
39
  true, 0xffffffff, 0xffffffff, true),
40
  HOWTO(R_386_GOT32, 0, 4, 32, false, 0, complain_overflow_dont,
41
  bfd_elf_generic_reloc, "R_386_GOT32",
42
  true, 0xffffffff, 0xffffffff, false),
43
  HOWTO(R_386_PLT32, 0, 4, 32, true, 0, complain_overflow_dont,
44
  bfd_elf_generic_reloc, "R_386_PLT32",
45
  true, 0xffffffff, 0xffffffff, true),
46
  HOWTO(R_386_COPY, 0, 4, 32, false, 0, complain_overflow_dont,
47
  bfd_elf_generic_reloc, "R_386_COPY",
48
  true, 0xffffffff, 0xffffffff, false),
49
  HOWTO(R_386_GLOB_DAT, 0, 4, 32, false, 0, complain_overflow_dont,
50
  bfd_elf_generic_reloc, "R_386_GLOB_DAT",
51
  true, 0xffffffff, 0xffffffff, false),
52
  HOWTO(R_386_JUMP_SLOT, 0, 4, 32, false, 0, complain_overflow_dont,
53
  bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
54
  true, 0xffffffff, 0xffffffff, false),
55
  HOWTO(R_386_RELATIVE, 0, 4, 32, false, 0, complain_overflow_dont,
56
  bfd_elf_generic_reloc, "R_386_RELATIVE",
57
  true, 0xffffffff, 0xffffffff, false),
58
  HOWTO(R_386_GOTOFF, 0, 4, 32, false, 0, complain_overflow_dont,
59
  bfd_elf_generic_reloc, "R_386_GOTOFF",
60
  true, 0xffffffff, 0xffffffff, false),
61
  HOWTO(R_386_GOTPC, 0, 4, 32, true, 0, complain_overflow_dont,
62
  bfd_elf_generic_reloc, "R_386_GOTPC",
63
  true, 0xffffffff, 0xffffffff, true),
64
65
  /* We have a gap in the reloc numbers here.
66
     R_386_standard counts the number up to this point, and
67
     R_386_ext_offset is the value to subtract from a reloc type of
68
     R_386_16 thru R_386_PC8 to form an index into this table.  */
69
33.0k
#define R_386_standard (R_386_GOTPC + 1)
70
424
#define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
71
72
  /* These relocs are a GNU extension.  */
73
  HOWTO(R_386_TLS_TPOFF, 0, 4, 32, false, 0, complain_overflow_dont,
74
  bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
75
  true, 0xffffffff, 0xffffffff, false),
76
  HOWTO(R_386_TLS_IE, 0, 4, 32, false, 0, complain_overflow_dont,
77
  bfd_elf_generic_reloc, "R_386_TLS_IE",
78
  true, 0xffffffff, 0xffffffff, false),
79
  HOWTO(R_386_TLS_GOTIE, 0, 4, 32, false, 0, complain_overflow_dont,
80
  bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
81
  true, 0xffffffff, 0xffffffff, false),
82
  HOWTO(R_386_TLS_LE, 0, 4, 32, false, 0, complain_overflow_dont,
83
  bfd_elf_generic_reloc, "R_386_TLS_LE",
84
  true, 0xffffffff, 0xffffffff, false),
85
  HOWTO(R_386_TLS_GD, 0, 4, 32, false, 0, complain_overflow_dont,
86
  bfd_elf_generic_reloc, "R_386_TLS_GD",
87
  true, 0xffffffff, 0xffffffff, false),
88
  HOWTO(R_386_TLS_LDM, 0, 4, 32, false, 0, complain_overflow_dont,
89
  bfd_elf_generic_reloc, "R_386_TLS_LDM",
90
  true, 0xffffffff, 0xffffffff, false),
91
  HOWTO(R_386_16, 0, 2, 16, false, 0, complain_overflow_bitfield,
92
  bfd_elf_generic_reloc, "R_386_16",
93
  true, 0xffff, 0xffff, false),
94
  HOWTO(R_386_PC16, 0, 2, 16, true, 0, complain_overflow_bitfield,
95
  bfd_elf_generic_reloc, "R_386_PC16",
96
  true, 0xffff, 0xffff, true),
97
  HOWTO(R_386_8, 0, 1, 8, false, 0, complain_overflow_bitfield,
98
  bfd_elf_generic_reloc, "R_386_8",
99
  true, 0xff, 0xff, false),
100
  HOWTO(R_386_PC8, 0, 1, 8, true, 0, complain_overflow_signed,
101
  bfd_elf_generic_reloc, "R_386_PC8",
102
  true, 0xff, 0xff, true),
103
104
376
#define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
105
240
#define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
106
  /* These are common with Solaris TLS implementation.  */
107
  HOWTO(R_386_TLS_LDO_32, 0, 4, 32, false, 0, complain_overflow_dont,
108
  bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
109
  true, 0xffffffff, 0xffffffff, false),
110
  HOWTO(R_386_TLS_IE_32, 0, 4, 32, false, 0, complain_overflow_dont,
111
  bfd_elf_generic_reloc, "R_386_TLS_IE_32",
112
  true, 0xffffffff, 0xffffffff, false),
113
  HOWTO(R_386_TLS_LE_32, 0, 4, 32, false, 0, complain_overflow_dont,
114
  bfd_elf_generic_reloc, "R_386_TLS_LE_32",
115
  true, 0xffffffff, 0xffffffff, false),
116
  HOWTO(R_386_TLS_DTPMOD32, 0, 4, 32, false, 0, complain_overflow_dont,
117
  bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
118
  true, 0xffffffff, 0xffffffff, false),
119
  HOWTO(R_386_TLS_DTPOFF32, 0, 4, 32, false, 0, complain_overflow_dont,
120
  bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
121
  true, 0xffffffff, 0xffffffff, false),
122
  HOWTO(R_386_TLS_TPOFF32, 0, 4, 32, false, 0, complain_overflow_dont,
123
  bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
124
  true, 0xffffffff, 0xffffffff, false),
125
  HOWTO(R_386_SIZE32, 0, 4, 32, false, 0, complain_overflow_dont,
126
  bfd_elf_generic_reloc, "R_386_SIZE32",
127
  true, 0xffffffff, 0xffffffff, false),
128
  HOWTO(R_386_TLS_GOTDESC, 0, 4, 32, false, 0, complain_overflow_dont,
129
  bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
130
  true, 0xffffffff, 0xffffffff, false),
131
  HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, false, 0, complain_overflow_dont,
132
  bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
133
  false, 0, 0, false),
134
  HOWTO(R_386_TLS_DESC, 0, 4, 32, false, 0, complain_overflow_dont,
135
  bfd_elf_generic_reloc, "R_386_TLS_DESC",
136
  true, 0xffffffff, 0xffffffff, false),
137
  HOWTO(R_386_IRELATIVE, 0, 4, 32, false, 0, complain_overflow_dont,
138
  bfd_elf_generic_reloc, "R_386_IRELATIVE",
139
  true, 0xffffffff, 0xffffffff, false),
140
  HOWTO(R_386_GOT32X, 0, 4, 32, false, 0, complain_overflow_dont,
141
  bfd_elf_generic_reloc, "R_386_GOT32X",
142
  true, 0xffffffff, 0xffffffff, false),
143
144
  /* Another gap.  */
145
196
#define R_386_ext2 (R_386_GOT32X + 1 - R_386_tls_offset)
146
76
#define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_ext2)
147
148
/* GNU extension to record C++ vtable hierarchy.  */
149
  HOWTO (R_386_GNU_VTINHERIT, /* type */
150
   0,     /* rightshift */
151
   4,     /* size */
152
   0,     /* bitsize */
153
   false,     /* pc_relative */
154
   0,     /* bitpos */
155
   complain_overflow_dont, /* complain_on_overflow */
156
   NULL,      /* special_function */
157
   "R_386_GNU_VTINHERIT", /* name */
158
   false,     /* partial_inplace */
159
   0,     /* src_mask */
160
   0,     /* dst_mask */
161
   false),    /* pcrel_offset */
162
163
/* GNU extension to record C++ vtable member usage.  */
164
  HOWTO (R_386_GNU_VTENTRY, /* type */
165
   0,     /* rightshift */
166
   4,     /* size */
167
   0,     /* bitsize */
168
   false,     /* pc_relative */
169
   0,     /* bitpos */
170
   complain_overflow_dont, /* complain_on_overflow */
171
   _bfd_elf_rel_vtable_reloc_fn, /* special_function */
172
   "R_386_GNU_VTENTRY", /* name */
173
   false,     /* partial_inplace */
174
   0,     /* src_mask */
175
   0,     /* dst_mask */
176
   false)     /* pcrel_offset */
177
178
38
#define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
179
180
};
181
182
#ifdef DEBUG_GEN_RELOC
183
#define TRACE(str) \
184
  fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
185
#else
186
#define TRACE(str)
187
#endif
188
189
static reloc_howto_type *
190
elf_i386_reloc_type_lookup (bfd *abfd,
191
          bfd_reloc_code_real_type code)
192
0
{
193
0
  switch (code)
194
0
    {
195
0
    case BFD_RELOC_NONE:
196
0
      TRACE ("BFD_RELOC_NONE");
197
0
      return &elf_howto_table[R_386_NONE];
198
199
0
    case BFD_RELOC_32:
200
0
      TRACE ("BFD_RELOC_32");
201
0
      return &elf_howto_table[R_386_32];
202
203
0
    case BFD_RELOC_CTOR:
204
0
      TRACE ("BFD_RELOC_CTOR");
205
0
      return &elf_howto_table[R_386_32];
206
207
0
    case BFD_RELOC_32_PCREL:
208
0
      TRACE ("BFD_RELOC_PC32");
209
0
      return &elf_howto_table[R_386_PC32];
210
211
0
    case BFD_RELOC_386_GOT32:
212
0
      TRACE ("BFD_RELOC_386_GOT32");
213
0
      return &elf_howto_table[R_386_GOT32];
214
215
0
    case BFD_RELOC_386_PLT32:
216
0
      TRACE ("BFD_RELOC_386_PLT32");
217
0
      return &elf_howto_table[R_386_PLT32];
218
219
0
    case BFD_RELOC_386_COPY:
220
0
      TRACE ("BFD_RELOC_386_COPY");
221
0
      return &elf_howto_table[R_386_COPY];
222
223
0
    case BFD_RELOC_386_GLOB_DAT:
224
0
      TRACE ("BFD_RELOC_386_GLOB_DAT");
225
0
      return &elf_howto_table[R_386_GLOB_DAT];
226
227
0
    case BFD_RELOC_386_JUMP_SLOT:
228
0
      TRACE ("BFD_RELOC_386_JUMP_SLOT");
229
0
      return &elf_howto_table[R_386_JUMP_SLOT];
230
231
0
    case BFD_RELOC_386_RELATIVE:
232
0
      TRACE ("BFD_RELOC_386_RELATIVE");
233
0
      return &elf_howto_table[R_386_RELATIVE];
234
235
0
    case BFD_RELOC_386_GOTOFF:
236
0
      TRACE ("BFD_RELOC_386_GOTOFF");
237
0
      return &elf_howto_table[R_386_GOTOFF];
238
239
0
    case BFD_RELOC_386_GOTPC:
240
0
      TRACE ("BFD_RELOC_386_GOTPC");
241
0
      return &elf_howto_table[R_386_GOTPC];
242
243
      /* These relocs are a GNU extension.  */
244
0
    case BFD_RELOC_386_TLS_TPOFF:
245
0
      TRACE ("BFD_RELOC_386_TLS_TPOFF");
246
0
      return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
247
248
0
    case BFD_RELOC_386_TLS_IE:
249
0
      TRACE ("BFD_RELOC_386_TLS_IE");
250
0
      return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
251
252
0
    case BFD_RELOC_386_TLS_GOTIE:
253
0
      TRACE ("BFD_RELOC_386_TLS_GOTIE");
254
0
      return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
255
256
0
    case BFD_RELOC_386_TLS_LE:
257
0
      TRACE ("BFD_RELOC_386_TLS_LE");
258
0
      return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
259
260
0
    case BFD_RELOC_386_TLS_GD:
261
0
      TRACE ("BFD_RELOC_386_TLS_GD");
262
0
      return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
263
264
0
    case BFD_RELOC_386_TLS_LDM:
265
0
      TRACE ("BFD_RELOC_386_TLS_LDM");
266
0
      return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
267
268
0
    case BFD_RELOC_16:
269
0
      TRACE ("BFD_RELOC_16");
270
0
      return &elf_howto_table[R_386_16 - R_386_ext_offset];
271
272
0
    case BFD_RELOC_16_PCREL:
273
0
      TRACE ("BFD_RELOC_16_PCREL");
274
0
      return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
275
276
0
    case BFD_RELOC_8:
277
0
      TRACE ("BFD_RELOC_8");
278
0
      return &elf_howto_table[R_386_8 - R_386_ext_offset];
279
280
0
    case BFD_RELOC_8_PCREL:
281
0
      TRACE ("BFD_RELOC_8_PCREL");
282
0
      return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
283
284
    /* Common with Sun TLS implementation.  */
285
0
    case BFD_RELOC_386_TLS_LDO_32:
286
0
      TRACE ("BFD_RELOC_386_TLS_LDO_32");
287
0
      return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
288
289
0
    case BFD_RELOC_386_TLS_IE_32:
290
0
      TRACE ("BFD_RELOC_386_TLS_IE_32");
291
0
      return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
292
293
0
    case BFD_RELOC_386_TLS_LE_32:
294
0
      TRACE ("BFD_RELOC_386_TLS_LE_32");
295
0
      return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
296
297
0
    case BFD_RELOC_386_TLS_DTPMOD32:
298
0
      TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
299
0
      return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
300
301
0
    case BFD_RELOC_386_TLS_DTPOFF32:
302
0
      TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
303
0
      return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
304
305
0
    case BFD_RELOC_386_TLS_TPOFF32:
306
0
      TRACE ("BFD_RELOC_386_TLS_TPOFF32");
307
0
      return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
308
309
0
    case BFD_RELOC_SIZE32:
310
0
      TRACE ("BFD_RELOC_SIZE32");
311
0
      return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
312
313
0
    case BFD_RELOC_386_TLS_GOTDESC:
314
0
      TRACE ("BFD_RELOC_386_TLS_GOTDESC");
315
0
      return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
316
317
0
    case BFD_RELOC_386_TLS_DESC_CALL:
318
0
      TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
319
0
      return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
320
321
0
    case BFD_RELOC_386_TLS_DESC:
322
0
      TRACE ("BFD_RELOC_386_TLS_DESC");
323
0
      return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
324
325
0
    case BFD_RELOC_386_IRELATIVE:
326
0
      TRACE ("BFD_RELOC_386_IRELATIVE");
327
0
      return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
328
329
0
    case BFD_RELOC_386_GOT32X:
330
0
      TRACE ("BFD_RELOC_386_GOT32X");
331
0
      return &elf_howto_table[R_386_GOT32X - R_386_tls_offset];
332
333
0
    case BFD_RELOC_VTABLE_INHERIT:
334
0
      TRACE ("BFD_RELOC_VTABLE_INHERIT");
335
0
      return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
336
337
0
    case BFD_RELOC_VTABLE_ENTRY:
338
0
      TRACE ("BFD_RELOC_VTABLE_ENTRY");
339
0
      return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
340
341
0
    default:
342
0
      TRACE ("Unknown");
343
      /* xgettext:c-format */
344
0
      _bfd_error_handler (_("%pB: unsupported relocation type: %#x"),
345
0
        abfd, (int) code);
346
0
      bfd_set_error (bfd_error_bad_value);
347
0
      return NULL;
348
0
    }
349
0
}
350
351
static reloc_howto_type *
352
elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
353
          const char *r_name)
354
0
{
355
0
  unsigned int i;
356
357
0
  for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
358
0
    if (elf_howto_table[i].name != NULL
359
0
  && strcasecmp (elf_howto_table[i].name, r_name) == 0)
360
0
      return &elf_howto_table[i];
361
362
0
  return NULL;
363
0
}
364
365
static reloc_howto_type *
366
elf_i386_rtype_to_howto (unsigned r_type)
367
16.2k
{
368
16.2k
  unsigned int indx;
369
370
16.2k
  if ((indx = r_type) >= R_386_standard
371
16.2k
      && ((indx = r_type - R_386_ext_offset) - R_386_standard
372
48
    >= R_386_ext - R_386_standard)
373
16.2k
      && ((indx = r_type - R_386_tls_offset) - R_386_ext
374
44
    >= R_386_ext2 - R_386_ext)
375
16.2k
      && ((indx = r_type - R_386_vt_offset) - R_386_ext2
376
38
    >= R_386_vt - R_386_ext2))
377
38
      return NULL;
378
  /* PR 17512: file: 0f67f69d.  */
379
16.2k
  if (elf_howto_table [indx].type != r_type)
380
0
    return NULL;
381
16.2k
  return &elf_howto_table[indx];
382
16.2k
}
383
384
static bool
385
elf_i386_info_to_howto_rel (bfd *abfd,
386
          arelent *cache_ptr,
387
          Elf_Internal_Rela *dst)
388
16.2k
{
389
16.2k
  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
390
391
16.2k
  if ((cache_ptr->howto = elf_i386_rtype_to_howto (r_type)) == NULL)
392
38
    {
393
      /* xgettext:c-format */
394
38
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
395
38
        abfd, r_type);
396
38
      bfd_set_error (bfd_error_bad_value);
397
38
      return false;
398
38
    }
399
400
16.2k
  return true;
401
16.2k
}
402
403
/* Return whether a symbol name implies a local label.  The UnixWare
404
   2.1 cc generates temporary symbols that start with .X, so we
405
   recognize them here.  FIXME: do other SVR4 compilers also use .X?.
406
   If so, we should move the .X recognition into
407
   _bfd_elf_is_local_label_name.  */
408
409
static bool
410
elf_i386_is_local_label_name (bfd *abfd, const char *name)
411
0
{
412
0
  if (name[0] == '.' && name[1] == 'X')
413
0
    return true;
414
415
0
  return _bfd_elf_is_local_label_name (abfd, name);
416
0
}
417

418
/* Support for core dump NOTE sections.  */
419
420
static bool
421
elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
422
0
{
423
0
  int offset;
424
0
  size_t size;
425
426
0
  if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
427
0
    {
428
0
      int pr_version = bfd_get_32 (abfd, note->descdata);
429
430
0
      if (pr_version != 1)
431
0
  return false;
432
433
      /* pr_cursig */
434
0
      elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
435
436
      /* pr_pid */
437
0
      elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
438
439
      /* pr_reg */
440
0
      offset = 28;
441
0
      size = bfd_get_32 (abfd, note->descdata + 8);
442
0
    }
443
0
  else
444
0
    {
445
0
      switch (note->descsz)
446
0
  {
447
0
  default:
448
0
    return false;
449
450
0
  case 144:   /* Linux/i386 */
451
    /* pr_cursig */
452
0
    elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
453
454
    /* pr_pid */
455
0
    elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
456
457
    /* pr_reg */
458
0
    offset = 72;
459
0
    size = 68;
460
461
0
    break;
462
0
  }
463
0
    }
464
465
  /* Make a ".reg/999" section.  */
466
0
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
467
0
            size, note->descpos + offset);
468
0
}
469
470
static bool
471
elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
472
0
{
473
0
  if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
474
0
    {
475
0
      int pr_version = bfd_get_32 (abfd, note->descdata);
476
477
0
      if (pr_version != 1)
478
0
  return false;
479
480
0
      elf_tdata (abfd)->core->program
481
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
482
0
      elf_tdata (abfd)->core->command
483
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
484
0
    }
485
0
  else
486
0
    {
487
0
      switch (note->descsz)
488
0
  {
489
0
  default:
490
0
    return false;
491
492
0
  case 124:   /* Linux/i386 elf_prpsinfo.  */
493
0
    elf_tdata (abfd)->core->pid
494
0
      = bfd_get_32 (abfd, note->descdata + 12);
495
0
    elf_tdata (abfd)->core->program
496
0
      = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
497
0
    elf_tdata (abfd)->core->command
498
0
      = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
499
0
  }
500
0
    }
501
502
  /* Note that for some reason, a spurious space is tacked
503
     onto the end of the args in some (at least one anyway)
504
     implementations, so strip it off if it exists.  */
505
0
  {
506
0
    char *command = elf_tdata (abfd)->core->command;
507
0
    int n = strlen (command);
508
509
0
    if (0 < n && command[n - 1] == ' ')
510
0
      command[n - 1] = '\0';
511
0
  }
512
513
0
  return true;
514
0
}
515

516
/* Functions for the i386 ELF linker.
517
518
   In order to gain some understanding of code in this file without
519
   knowing all the intricate details of the linker, note the
520
   following:
521
522
   Functions named elf_i386_* are called by external routines, other
523
   functions are only called locally.  elf_i386_* functions appear
524
   in this file more or less in the order in which they are called
525
   from external routines.  eg. elf_i386_scan_relocs is called
526
   early in the link process, elf_i386_finish_dynamic_sections is
527
   one of the last functions.  */
528
529
/* The size in bytes of an entry in the lazy procedure linkage table.  */
530
531
#define LAZY_PLT_ENTRY_SIZE 16
532
533
/* The size in bytes of an entry in the non-lazy procedure linkage
534
   table.  */
535
536
#define NON_LAZY_PLT_ENTRY_SIZE 8
537
538
/* The first entry in an absolute lazy procedure linkage table looks
539
   like this.  See the SVR4 ABI i386 supplement to see how this works.
540
   Will be padded to LAZY_PLT_ENTRY_SIZE with lazy_plt->plt0_pad_byte.  */
541
542
static const bfd_byte elf_i386_lazy_plt0_entry[12] =
543
{
544
  0xff, 0x35, /* pushl contents of address */
545
  0, 0, 0, 0, /* replaced with address of .got + 4.  */
546
  0xff, 0x25, /* jmp indirect */
547
  0, 0, 0, 0  /* replaced with address of .got + 8.  */
548
};
549
550
/* Subsequent entries in an absolute lazy procedure linkage table look
551
   like this.  */
552
553
static const bfd_byte elf_i386_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
554
{
555
  0xff, 0x25, /* jmp indirect */
556
  0, 0, 0, 0, /* replaced with address of this symbol in .got.  */
557
  0x68,   /* pushl immediate */
558
  0, 0, 0, 0, /* replaced with offset into relocation table.  */
559
  0xe9,   /* jmp relative */
560
  0, 0, 0, 0  /* replaced with offset to start of .plt.  */
561
};
562
563
/* The first entry in a PIC lazy procedure linkage table look like
564
   this.  Will be padded to LAZY_PLT_ENTRY_SIZE with
565
   lazy_plt->plt0_pad_byte.  */
566
567
static const bfd_byte elf_i386_pic_lazy_plt0_entry[12] =
568
{
569
  0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
570
  0xff, 0xa3, 8, 0, 0, 0  /* jmp *8(%ebx) */
571
};
572
573
/* Subsequent entries in a PIC lazy procedure linkage table look like
574
   this.  */
575
576
static const bfd_byte elf_i386_pic_lazy_plt_entry[LAZY_PLT_ENTRY_SIZE] =
577
{
578
  0xff, 0xa3, /* jmp *offset(%ebx) */
579
  0, 0, 0, 0, /* replaced with offset of this symbol in .got.  */
580
  0x68,   /* pushl immediate */
581
  0, 0, 0, 0, /* replaced with offset into relocation table.  */
582
  0xe9,   /* jmp relative */
583
  0, 0, 0, 0  /* replaced with offset to start of .plt.  */
584
};
585
586
/* Entries in the non-lazy procedure linkage table look like this.  */
587
588
static const bfd_byte elf_i386_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
589
{
590
  0xff, 0x25, /* jmp indirect */
591
  0, 0, 0, 0, /* replaced with offset of this symbol in .got.  */
592
  0x66, 0x90  /* xchg %ax,%ax  */
593
};
594
595
/* Entries in the PIC non-lazy procedure linkage table look like
596
   this.  */
597
598
static const bfd_byte elf_i386_pic_non_lazy_plt_entry[NON_LAZY_PLT_ENTRY_SIZE] =
599
{
600
  0xff, 0xa3, /* jmp *offset(%ebx)  */
601
  0, 0, 0, 0, /* replaced with offset of this symbol in .got.  */
602
  0x66, 0x90  /* xchg %ax,%ax  */
603
};
604
605
/* The first entry in an absolute IBT-enabled lazy procedure linkage
606
   table looks like this.  */
607
608
static const bfd_byte elf_i386_lazy_ibt_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
609
{
610
  0xff, 0x35, 0, 0, 0, 0, /* pushl GOT[1]       */
611
  0xff, 0x25, 0, 0, 0, 0, /* jmp *GOT[2]        */
612
  0x0f, 0x1f, 0x40, 0x00  /* nopl 0(%rax)       */
613
};
614
615
/* Subsequent entries for an absolute IBT-enabled lazy procedure linkage
616
   table look like this.  Subsequent entries for a PIC IBT-enabled lazy
617
   procedure linkage table are the same.  */
618
619
static const bfd_byte elf_i386_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
620
{
621
  0xf3, 0x0f, 0x1e, 0xfb, /* endbr32          */
622
  0x68, 0, 0, 0, 0,   /* pushl immediate        */
623
  0xe9, 0, 0, 0, 0,   /* jmp relative         */
624
  0x66, 0x90      /* xchg %ax,%ax         */
625
};
626
627
/* The first entry in a PIC IBT-enabled lazy procedure linkage table
628
   look like.  */
629
630
static const bfd_byte elf_i386_pic_lazy_ibt_plt0_entry[LAZY_PLT_ENTRY_SIZE] =
631
{
632
  0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx)      */
633
  0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx)       */
634
  0x0f, 0x1f, 0x40, 0x00  /* nopl 0(%rax)       */
635
};
636
637
/* Entries for branches with IBT-enabled in the absolute non-lazey
638
   procedure linkage table look like this.  They have the same size
639
   as the lazy PLT entry.  */
640
641
static const bfd_byte elf_i386_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
642
{
643
  0xf3, 0x0f, 0x1e, 0xfb,      /* endbr32         */
644
  0xff, 0x25, 0, 0, 0, 0,      /* jmp *name@GOT       */
645
  0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1) */
646
};
647
648
/* Entries for branches with IBT-enabled in the PIC non-lazey procedure
649
   linkage table look like this.  They have the same size as the lazy
650
   PLT entry.  */
651
652
static const bfd_byte elf_i386_pic_non_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
653
{
654
  0xf3, 0x0f, 0x1e, 0xfb,      /* endbr32         */
655
  0xff, 0xa3, 0, 0, 0, 0,      /* jmp *name@GOT(%ebx)   */
656
  0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nopw 0x0(%rax,%rax,1) */
657
};
658
659
/* .eh_frame covering the lazy .plt section.  */
660
661
static const bfd_byte elf_i386_eh_frame_lazy_plt[] =
662
{
663
  PLT_CIE_LENGTH, 0, 0, 0,  /* CIE length */
664
  0, 0, 0, 0,     /* CIE ID */
665
  1,        /* CIE version */
666
  'z', 'R', 0,      /* Augmentation string */
667
  1,        /* Code alignment factor */
668
  0x7c,       /* Data alignment factor */
669
  8,        /* Return address column */
670
  1,        /* Augmentation size */
671
  DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
672
  DW_CFA_def_cfa, 4, 4,   /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
673
  DW_CFA_offset + 8, 1,   /* DW_CFA_offset: r8 (eip) at cfa-4 */
674
  DW_CFA_nop, DW_CFA_nop,
675
676
  PLT_FDE_LENGTH, 0, 0, 0,  /* FDE length */
677
  PLT_CIE_LENGTH + 8, 0, 0, 0,  /* CIE pointer */
678
  0, 0, 0, 0,     /* R_386_PC32 .plt goes here */
679
  0, 0, 0, 0,     /* .plt size goes here */
680
  0,        /* Augmentation size */
681
  DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
682
  DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
683
  DW_CFA_def_cfa_offset, 12,  /* DW_CFA_def_cfa_offset: 12 */
684
  DW_CFA_advance_loc + 10,  /* DW_CFA_advance_loc: 10 to __PLT__+16 */
685
  DW_CFA_def_cfa_expression,  /* DW_CFA_def_cfa_expression */
686
  11,       /* Block length */
687
  DW_OP_breg4, 4,   /* DW_OP_breg4 (esp): 4 */
688
  DW_OP_breg8, 0,   /* DW_OP_breg8 (eip): 0 */
689
  DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
690
  DW_OP_lit2, DW_OP_shl, DW_OP_plus,
691
  DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
692
};
693
694
/* .eh_frame covering the lazy .plt section with IBT-enabled.  */
695
696
static const bfd_byte elf_i386_eh_frame_lazy_ibt_plt[] =
697
{
698
  PLT_CIE_LENGTH, 0, 0, 0,  /* CIE length */
699
  0, 0, 0, 0,     /* CIE ID */
700
  1,        /* CIE version */
701
  'z', 'R', 0,      /* Augmentation string */
702
  1,        /* Code alignment factor */
703
  0x7c,       /* Data alignment factor */
704
  8,        /* Return address column */
705
  1,        /* Augmentation size */
706
  DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
707
  DW_CFA_def_cfa, 4, 4,   /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
708
  DW_CFA_offset + 8, 1,   /* DW_CFA_offset: r8 (eip) at cfa-4 */
709
  DW_CFA_nop, DW_CFA_nop,
710
711
  PLT_FDE_LENGTH, 0, 0, 0,  /* FDE length */
712
  PLT_CIE_LENGTH + 8, 0, 0, 0,  /* CIE pointer */
713
  0, 0, 0, 0,     /* R_386_PC32 .plt goes here */
714
  0, 0, 0, 0,     /* .plt size goes here */
715
  0,        /* Augmentation size */
716
  DW_CFA_def_cfa_offset, 8, /* DW_CFA_def_cfa_offset: 8 */
717
  DW_CFA_advance_loc + 6, /* DW_CFA_advance_loc: 6 to __PLT__+6 */
718
  DW_CFA_def_cfa_offset, 12,  /* DW_CFA_def_cfa_offset: 12 */
719
  DW_CFA_advance_loc + 10,  /* DW_CFA_advance_loc: 10 to __PLT__+16 */
720
  DW_CFA_def_cfa_expression,  /* DW_CFA_def_cfa_expression */
721
  11,       /* Block length */
722
  DW_OP_breg4, 4,   /* DW_OP_breg4 (esp): 4 */
723
  DW_OP_breg8, 0,   /* DW_OP_breg8 (eip): 0 */
724
  DW_OP_lit15, DW_OP_and, DW_OP_lit9, DW_OP_ge,
725
  DW_OP_lit2, DW_OP_shl, DW_OP_plus,
726
  DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
727
};
728
729
/* .eh_frame covering the non-lazy .plt section.  */
730
731
static const bfd_byte elf_i386_eh_frame_non_lazy_plt[] =
732
{
733
#define PLT_GOT_FDE_LENGTH    16
734
  PLT_CIE_LENGTH, 0, 0, 0,  /* CIE length */
735
  0, 0, 0, 0,     /* CIE ID */
736
  1,        /* CIE version */
737
  'z', 'R', 0,      /* Augmentation string */
738
  1,        /* Code alignment factor */
739
  0x7c,       /* Data alignment factor */
740
  8,        /* Return address column */
741
  1,        /* Augmentation size */
742
  DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
743
  DW_CFA_def_cfa, 4, 4,   /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
744
  DW_CFA_offset + 8, 1,   /* DW_CFA_offset: r8 (eip) at cfa-4 */
745
  DW_CFA_nop, DW_CFA_nop,
746
747
  PLT_GOT_FDE_LENGTH, 0, 0, 0,  /* FDE length */
748
  PLT_CIE_LENGTH + 8, 0, 0, 0,  /* CIE pointer */
749
  0, 0, 0, 0,     /* the start of non-lazy .plt goes here */
750
  0, 0, 0, 0,     /* non-lazy .plt size goes here */
751
  0,        /* Augmentation size */
752
  DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
753
};
754
755
/* These are the standard parameters.  */
756
static const struct elf_x86_lazy_plt_layout elf_i386_lazy_plt =
757
  {
758
    elf_i386_lazy_plt0_entry,   /* plt0_entry */
759
    sizeof (elf_i386_lazy_plt0_entry),  /* plt0_entry_size */
760
    elf_i386_lazy_plt_entry,    /* plt_entry */
761
    LAZY_PLT_ENTRY_SIZE,    /* plt_entry_size */
762
    NULL,       /* plt_tlsdesc_entry */
763
    0,          /* plt_tlsdesc_entry_size*/
764
    0,          /* plt_tlsdesc_got1_offset */
765
    0,          /* plt_tlsdesc_got2_offset */
766
    0,          /* plt_tlsdesc_got1_insn_end */
767
    0,          /* plt_tlsdesc_got2_insn_end */
768
    2,          /* plt0_got1_offset */
769
    8,          /* plt0_got2_offset */
770
    0,          /* plt0_got2_insn_end */
771
    2,          /* plt_got_offset */
772
    7,          /* plt_reloc_offset */
773
    12,         /* plt_plt_offset */
774
    0,          /* plt_got_insn_size */
775
    0,          /* plt_plt_insn_end */
776
    6,          /* plt_lazy_offset */
777
    elf_i386_pic_lazy_plt0_entry, /* pic_plt0_entry */
778
    elf_i386_pic_lazy_plt_entry,  /* pic_plt_entry */
779
    elf_i386_eh_frame_lazy_plt,   /* eh_frame_plt */
780
    sizeof (elf_i386_eh_frame_lazy_plt) /* eh_frame_plt_size */
781
  };
782
783
static const struct elf_x86_non_lazy_plt_layout elf_i386_non_lazy_plt =
784
  {
785
    elf_i386_non_lazy_plt_entry,  /* plt_entry */
786
    elf_i386_pic_non_lazy_plt_entry,  /* pic_plt_entry */
787
    NON_LAZY_PLT_ENTRY_SIZE,    /* plt_entry_size */
788
    2,          /* plt_got_offset */
789
    0,          /* plt_got_insn_size */
790
    elf_i386_eh_frame_non_lazy_plt, /* eh_frame_plt */
791
    sizeof (elf_i386_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
792
  };
793
794
static const struct elf_x86_lazy_plt_layout elf_i386_lazy_ibt_plt =
795
  {
796
    elf_i386_lazy_ibt_plt0_entry, /* plt0_entry */
797
    sizeof (elf_i386_lazy_ibt_plt0_entry), /* plt0_entry_size */
798
    elf_i386_lazy_ibt_plt_entry,  /* plt_entry */
799
    LAZY_PLT_ENTRY_SIZE,    /* plt_entry_size */
800
    NULL,       /* plt_tlsdesc_entry */
801
    0,          /* plt_tlsdesc_entry_size*/
802
    0,          /* plt_tlsdesc_got1_offset */
803
    0,          /* plt_tlsdesc_got2_offset */
804
    0,          /* plt_tlsdesc_got1_insn_end */
805
    0,          /* plt_tlsdesc_got2_insn_end */
806
    2,          /* plt0_got1_offset */
807
    8,          /* plt0_got2_offset */
808
    0,          /* plt0_got2_insn_end */
809
    4+2,        /* plt_got_offset */
810
    4+1,        /* plt_reloc_offset */
811
    4+6,        /* plt_plt_offset */
812
    0,          /* plt_got_insn_size */
813
    0,          /* plt_plt_insn_end */
814
    0,          /* plt_lazy_offset */
815
    elf_i386_pic_lazy_ibt_plt0_entry, /* pic_plt0_entry */
816
    elf_i386_lazy_ibt_plt_entry,  /* pic_plt_entry */
817
    elf_i386_eh_frame_lazy_ibt_plt, /* eh_frame_plt */
818
    sizeof (elf_i386_eh_frame_lazy_ibt_plt) /* eh_frame_plt_size */
819
  };
820
821
static const struct elf_x86_non_lazy_plt_layout elf_i386_non_lazy_ibt_plt =
822
  {
823
    elf_i386_non_lazy_ibt_plt_entry,  /* plt_entry */
824
    elf_i386_pic_non_lazy_ibt_plt_entry,/* pic_plt_entry */
825
    LAZY_PLT_ENTRY_SIZE,    /* plt_entry_size */
826
    4+2,        /* plt_got_offset */
827
    0,          /* plt_got_insn_size */
828
    elf_i386_eh_frame_non_lazy_plt, /* eh_frame_plt */
829
    sizeof (elf_i386_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
830
  };
831

832
833
/* On VxWorks, the .rel.plt.unloaded section has absolute relocations
834
   for the PLTResolve stub and then for each PLT entry.  */
835
0
#define PLTRESOLVE_RELOCS_SHLIB 0
836
0
#define PLTRESOLVE_RELOCS 2
837
0
#define PLT_NON_JUMP_SLOT_RELOCS 2
838
839
/* Return TRUE if the TLS access code sequence support transition
840
   from R_TYPE.  */
841
842
static enum elf_x86_tls_error_type
843
elf_i386_check_tls_transition (asection *sec,
844
             bfd_byte *contents,
845
             Elf_Internal_Shdr *symtab_hdr,
846
             struct elf_link_hash_entry **sym_hashes,
847
             unsigned int r_type,
848
             const Elf_Internal_Rela *rel,
849
             const Elf_Internal_Rela *relend)
850
0
{
851
0
  unsigned int val, type, reg;
852
0
  unsigned long r_symndx;
853
0
  struct elf_link_hash_entry *h;
854
0
  bfd_vma offset;
855
0
  bfd_byte *call;
856
0
  bool indirect_call;
857
858
0
  offset = rel->r_offset;
859
0
  switch (r_type)
860
0
    {
861
0
    case R_386_TLS_GD:
862
0
    case R_386_TLS_LDM:
863
0
      if (offset < 2 || (rel + 1) >= relend)
864
0
  return elf_x86_tls_error_yes;
865
866
0
      indirect_call = false;
867
0
      call = contents + offset + 4;
868
0
      val = *(call - 5);
869
0
      type = *(call - 6);
870
0
      if (r_type == R_386_TLS_GD)
871
0
  {
872
    /* Check transition from GD access model.  Only
873
    leal foo@tlsgd(,%ebx,1), %eax
874
    call ___tls_get_addr@PLT
875
       or
876
    leal foo@tlsgd(%ebx) %eax
877
    call ___tls_get_addr@PLT
878
    nop
879
       or
880
    leal foo@tlsgd(%reg), %eax
881
    call *___tls_get_addr@GOT(%reg)
882
    which may be converted to
883
    addr32 call ___tls_get_addr
884
       can transit to different access model.  */
885
0
    if ((offset + 10) > sec->size
886
0
        || (type != 0x8d && type != 0x04))
887
0
      return elf_x86_tls_error_yes;
888
889
0
    if (type == 0x04)
890
0
      {
891
        /* leal foo@tlsgd(,%ebx,1), %eax
892
     call ___tls_get_addr@PLT  */
893
0
        if (offset < 3)
894
0
    return elf_x86_tls_error_yes;
895
896
0
        if (*(call - 7) != 0x8d
897
0
      || val != 0x1d
898
0
      || call[0] != 0xe8)
899
0
    return elf_x86_tls_error_yes;
900
0
      }
901
0
    else
902
0
      {
903
        /* This must be
904
      leal foo@tlsgd(%ebx), %eax
905
      call ___tls_get_addr@PLT
906
      nop
907
     or
908
      leal foo@tlsgd(%reg), %eax
909
      call *___tls_get_addr@GOT(%reg)
910
      which may be converted to
911
      addr32 call ___tls_get_addr
912
913
     %eax can't be used as the GOT base register since it
914
     is used to pass parameter to ___tls_get_addr.  */
915
0
        reg = val & 7;
916
0
        if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
917
0
    return elf_x86_tls_error_yes;
918
919
0
        indirect_call = call[0] == 0xff;
920
0
        if (!(reg == 3 && call[0] == 0xe8 && call[5] == 0x90)
921
0
      && !(call[0] == 0x67 && call[1] == 0xe8)
922
0
      && !(indirect_call
923
0
           && (call[1] & 0xf8) == 0x90
924
0
           && (call[1] & 0x7) == reg))
925
0
    return elf_x86_tls_error_yes;
926
0
      }
927
0
  }
928
0
      else
929
0
  {
930
    /* Check transition from LD access model.  Only
931
    leal foo@tlsldm(%ebx), %eax
932
    call ___tls_get_addr@PLT
933
       or
934
    leal foo@tlsldm(%reg), %eax
935
    call *___tls_get_addr@GOT(%reg)
936
    which may be converted to
937
    addr32 call ___tls_get_addr
938
       can transit to different access model.  */
939
0
    if (type != 0x8d || (offset + 9) > sec->size)
940
0
      return elf_x86_tls_error_yes;
941
942
    /* %eax can't be used as the GOT base register since it is
943
       used to pass parameter to ___tls_get_addr.  */
944
0
    reg = val & 7;
945
0
    if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
946
0
      return elf_x86_tls_error_yes;
947
948
0
    indirect_call = call[0] == 0xff;
949
0
    if (!(reg == 3 && call[0] == 0xe8)
950
0
        && !(call[0] == 0x67 && call[1] == 0xe8)
951
0
        && !(indirect_call
952
0
       && (call[1] & 0xf8) == 0x90
953
0
       && (call[1] & 0x7) == reg))
954
0
      return elf_x86_tls_error_yes;
955
0
  }
956
957
0
      r_symndx = ELF32_R_SYM (rel[1].r_info);
958
0
      if (r_symndx < symtab_hdr->sh_info)
959
0
  return elf_x86_tls_error_yes;
960
961
0
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
962
0
      if (h == NULL
963
0
    || !((struct elf_x86_link_hash_entry *) h)->tls_get_addr)
964
0
  return elf_x86_tls_error_yes;
965
0
      else if (indirect_call)
966
0
  return ((ELF32_R_TYPE (rel[1].r_info) == R_386_GOT32X
967
0
     || ELF32_R_TYPE (rel[1].r_info) == R_386_GOT32)
968
0
    ? elf_x86_tls_error_none
969
0
    : elf_x86_tls_error_yes);
970
0
      else
971
0
  return ((ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
972
0
    || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32)
973
0
    ? elf_x86_tls_error_none
974
0
    : elf_x86_tls_error_yes);
975
976
0
    case R_386_TLS_IE:
977
      /* Check transition from IE access model:
978
    movl foo@indntpoff, %eax
979
    movl foo@indntpoff, %reg
980
    addl foo@indntpoff, %reg
981
       */
982
983
0
      if (offset < 1 || (offset + 4) > sec->size)
984
0
  return elf_x86_tls_error_yes;
985
986
      /* Check "movl foo@indntpoff, %eax" first.  */
987
0
      val = bfd_get_8 (abfd, contents + offset - 1);
988
0
      if (val == 0xa1)
989
0
  return elf_x86_tls_error_none;
990
991
0
      if (offset < 2)
992
0
  return elf_x86_tls_error_yes;
993
994
      /* Check movl|addl foo@indntpoff, %reg.   */
995
0
      type = bfd_get_8 (abfd, contents + offset - 2);
996
0
      if (type != 0x8b && type != 0x03)
997
0
  return elf_x86_tls_error_add_mov;
998
0
      return ((val & 0xc7) == 0x05
999
0
        ? elf_x86_tls_error_none
1000
0
        : elf_x86_tls_error_yes);
1001
1002
0
    case R_386_TLS_GOTIE:
1003
0
    case R_386_TLS_IE_32:
1004
      /* Check transition from {IE_32,GOTIE} access model:
1005
    subl foo@{tpoff,gontoff}(%reg1), %reg2
1006
    movl foo@{tpoff,gontoff}(%reg1), %reg2
1007
    addl foo@{tpoff,gontoff}(%reg1), %reg2
1008
       */
1009
1010
0
      if (offset < 2 || (offset + 4) > sec->size)
1011
0
  return elf_x86_tls_error_yes;
1012
1013
0
      val = bfd_get_8 (abfd, contents + offset - 1);
1014
0
      if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1015
0
  return elf_x86_tls_error_yes;
1016
1017
0
      type = bfd_get_8 (abfd, contents + offset - 2);
1018
0
      return (type == 0x8b || type == 0x2b || type == 0x03
1019
0
        ? elf_x86_tls_error_none
1020
0
        : elf_x86_tls_error_add_sub_mov);
1021
1022
0
    case R_386_TLS_GOTDESC:
1023
      /* Check transition from GDesc access model:
1024
    leal x@tlsdesc(%ebx), %eax
1025
1026
   Make sure it's a leal adding ebx to a 32-bit offset
1027
   into any register, although it's probably almost always
1028
   going to be eax.  */
1029
1030
0
      if (offset < 2 || (offset + 4) > sec->size)
1031
0
  return elf_x86_tls_error_yes;
1032
1033
0
      if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1034
0
  return elf_x86_tls_error_lea;
1035
1036
0
      val = bfd_get_8 (abfd, contents + offset - 1);
1037
0
      return ((val & 0xc7) == 0x83
1038
0
        ? elf_x86_tls_error_none
1039
0
        : elf_x86_tls_error_yes);
1040
1041
0
    case R_386_TLS_DESC_CALL:
1042
      /* It has been checked in elf_i386_tls_transition.  */
1043
0
      return elf_x86_tls_error_none;
1044
1045
0
    default:
1046
0
      abort ();
1047
0
    }
1048
0
}
1049
1050
/* Return TRUE if the TLS access transition is OK or no transition
1051
   will be performed.  Update R_TYPE if there is a transition.  */
1052
1053
static bool
1054
elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1055
       asection *sec, bfd_byte *contents,
1056
       Elf_Internal_Shdr *symtab_hdr,
1057
       struct elf_link_hash_entry **sym_hashes,
1058
       unsigned int *r_type, int tls_type,
1059
       const Elf_Internal_Rela *rel,
1060
       const Elf_Internal_Rela *relend,
1061
       struct elf_link_hash_entry *h,
1062
       Elf_Internal_Sym *sym,
1063
       bool from_relocate_section)
1064
0
{
1065
0
  unsigned int from_type = *r_type;
1066
0
  unsigned int to_type = from_type;
1067
0
  bool check = true;
1068
0
  unsigned int to_le_type, to_ie_type;
1069
0
  bfd_vma offset;
1070
0
  bfd_byte *call;
1071
1072
  /* Skip TLS transition for functions.  */
1073
0
  if (h != NULL
1074
0
      && (h->type == STT_FUNC
1075
0
    || h->type == STT_GNU_IFUNC))
1076
0
    return true;
1077
1078
0
  if (get_elf_backend_data (abfd)->target_os == is_solaris)
1079
0
    {
1080
      /* NB: Solaris only supports R_386_TLS_LE and R_386_TLS_IE.  */
1081
0
      to_le_type = R_386_TLS_LE;
1082
0
      to_ie_type = R_386_TLS_IE;
1083
0
    }
1084
0
  else
1085
0
    {
1086
0
      to_le_type = R_386_TLS_LE_32;
1087
0
      to_ie_type = R_386_TLS_IE_32;
1088
0
    }
1089
1090
0
  switch (from_type)
1091
0
    {
1092
0
    case R_386_TLS_DESC_CALL:
1093
      /* Check valid GDesc call:
1094
    call *x@tlscall(%eax)
1095
       */
1096
0
      offset = rel->r_offset;
1097
0
      call = NULL;
1098
0
      if (offset + 2 <= sec->size)
1099
0
  {
1100
    /* Make sure that it's a call *x@tlscall(%eax).  */
1101
0
    call = contents + offset;
1102
0
    if (call[0] != 0xff || call[1] != 0x10)
1103
0
      call = NULL;
1104
0
  }
1105
1106
0
      if (call == NULL)
1107
0
  {
1108
0
    _bfd_x86_elf_link_report_tls_transition_error
1109
0
      (info, abfd, sec, symtab_hdr, h, sym, rel,
1110
0
       "R_386_TLS_DESC_CALL", NULL,
1111
0
       elf_x86_tls_error_indirect_call);
1112
1113
0
    return false;
1114
0
  }
1115
1116
      /* Fall through.  */
1117
1118
0
    case R_386_TLS_GD:
1119
0
    case R_386_TLS_GOTDESC:
1120
0
    case R_386_TLS_IE_32:
1121
0
    case R_386_TLS_IE:
1122
0
    case R_386_TLS_GOTIE:
1123
0
      if (bfd_link_executable (info))
1124
0
  {
1125
0
    if (h == NULL)
1126
0
      to_type = to_le_type;
1127
0
    else if (from_type != R_386_TLS_IE
1128
0
       && from_type != R_386_TLS_GOTIE)
1129
0
      to_type = to_ie_type;
1130
0
  }
1131
1132
      /* When we are called from elf_i386_relocate_section, there may
1133
   be additional transitions based on TLS_TYPE.  */
1134
0
      if (from_relocate_section)
1135
0
  {
1136
0
    unsigned int new_to_type = to_type;
1137
1138
0
    if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
1139
0
      new_to_type = to_le_type;
1140
1141
0
    if (to_type == R_386_TLS_GD
1142
0
        || to_type == R_386_TLS_GOTDESC
1143
0
        || to_type == R_386_TLS_DESC_CALL)
1144
0
      {
1145
0
        if (tls_type == GOT_TLS_IE_POS)
1146
0
    new_to_type = R_386_TLS_GOTIE;
1147
0
        else if (tls_type & GOT_TLS_IE)
1148
0
    new_to_type = to_ie_type;
1149
0
      }
1150
1151
    /* We checked the transition before when we were called from
1152
       elf_i386_scan_relocs.  We only want to check the new
1153
       transition which hasn't been checked before.  */
1154
0
    check = new_to_type != to_type && from_type == to_type;
1155
0
    to_type = new_to_type;
1156
0
  }
1157
1158
0
      break;
1159
1160
0
    case R_386_TLS_LDM:
1161
0
      if (bfd_link_executable (info))
1162
0
  to_type = to_le_type;
1163
0
      break;
1164
1165
0
    default:
1166
0
      return true;
1167
0
    }
1168
1169
  /* Return TRUE if there is no transition.  */
1170
0
  if (from_type == to_type)
1171
0
    return true;
1172
1173
  /* Check if the transition can be performed.  */
1174
0
  enum elf_x86_tls_error_type tls_error;
1175
0
  if (check
1176
0
      && ((tls_error = elf_i386_check_tls_transition (sec, contents,
1177
0
                  symtab_hdr,
1178
0
                  sym_hashes,
1179
0
                  from_type, rel,
1180
0
                  relend))
1181
0
    != elf_x86_tls_error_none))
1182
0
    {
1183
0
      reloc_howto_type *from, *to;
1184
1185
0
      from = elf_i386_rtype_to_howto (from_type);
1186
0
      to = elf_i386_rtype_to_howto (to_type);
1187
1188
0
      _bfd_x86_elf_link_report_tls_transition_error
1189
0
  (info, abfd, sec, symtab_hdr, h, sym, rel, from->name,
1190
0
   to->name, tls_error);
1191
1192
0
      return false;
1193
0
    }
1194
1195
0
  *r_type = to_type;
1196
0
  return true;
1197
0
}
1198
1199
/* With the local symbol, foo, we convert
1200
   mov foo@GOT[(%reg1)], %reg2
1201
   to
1202
   lea foo[@GOTOFF(%reg1)], %reg2
1203
   and convert
1204
   call/jmp *foo@GOT[(%reg)]
1205
   to
1206
   nop call foo/jmp foo nop
1207
   When PIC is false, convert
1208
   test %reg1, foo@GOT[(%reg2)]
1209
   to
1210
   test $foo, %reg1
1211
   and convert
1212
   push foo@GOT[(%reg)]
1213
   to
1214
   push $foo
1215
   and convert
1216
   binop foo@GOT[(%reg1)], %reg2
1217
   to
1218
   binop $foo, %reg2
1219
   where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1220
   instructions.  */
1221
1222
static
1223
bool
1224
elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
1225
           bfd_byte *contents,
1226
           unsigned int *r_type_p,
1227
           Elf_Internal_Rela *irel,
1228
           struct elf_link_hash_entry *h,
1229
           bool *converted,
1230
           struct bfd_link_info *link_info)
1231
0
{
1232
0
  struct elf_x86_link_hash_table *htab;
1233
0
  unsigned int opcode;
1234
0
  unsigned int modrm;
1235
0
  bool baseless;
1236
0
  Elf_Internal_Sym *isym;
1237
0
  unsigned int addend;
1238
0
  unsigned int nop;
1239
0
  bfd_vma nop_offset;
1240
0
  bool is_pic, is_branch = false;
1241
0
  bool to_reloc_32;
1242
0
  bool abs_symbol;
1243
0
  unsigned int r_type;
1244
0
  unsigned int r_symndx;
1245
0
  bfd_vma roff = irel->r_offset;
1246
0
  bool local_ref;
1247
0
  struct elf_x86_link_hash_entry *eh;
1248
1249
0
  if (roff < 2)
1250
0
    return true;
1251
1252
  /* Addend for R_386_GOT32X relocations must be 0.  */
1253
0
  addend = bfd_get_32 (abfd, contents + roff);
1254
0
  if (addend != 0)
1255
0
    return true;
1256
1257
0
  htab = elf_x86_hash_table (link_info, I386_ELF_DATA);
1258
0
  if (htab == NULL || ! is_x86_elf (abfd, htab))
1259
0
    {
1260
0
      bfd_set_error (bfd_error_wrong_format);
1261
0
      return false;
1262
0
    }
1263
1264
0
  is_pic = bfd_link_pic (link_info);
1265
1266
0
  r_type = *r_type_p;
1267
0
  r_symndx = ELF32_R_SYM (irel->r_info);
1268
1269
0
  modrm = bfd_get_8 (abfd, contents + roff - 1);
1270
0
  baseless = (modrm & 0xc7) == 0x5;
1271
1272
0
  if (h)
1273
0
    {
1274
      /* NB: Also set linker_def via SYMBOL_REFERENCES_LOCAL_P.  */
1275
0
      local_ref = SYMBOL_REFERENCES_LOCAL_P (link_info, h);
1276
0
      isym = NULL;
1277
0
      abs_symbol = ABS_SYMBOL_P (h);
1278
0
    }
1279
0
  else
1280
0
    {
1281
0
      local_ref = true;
1282
0
      isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
1283
0
            r_symndx);
1284
0
      abs_symbol = isym->st_shndx == SHN_ABS;
1285
0
    }
1286
1287
0
  if (baseless && is_pic)
1288
0
    {
1289
      /* For PIC, disallow R_386_GOT32X without a base register
1290
   since we don't know what the GOT base is.  */
1291
0
      const char *name;
1292
1293
0
      if (h == NULL)
1294
0
  name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1295
0
      else
1296
0
  name = h->root.root.string;
1297
1298
0
      _bfd_error_handler
1299
  /* xgettext:c-format */
1300
0
  (_("%pB: direct GOT relocation R_386_GOT32X against `%s' without base"
1301
0
     " register can not be used when making a shared object"),
1302
0
   abfd, name);
1303
0
      return false;
1304
0
    }
1305
1306
0
  opcode = bfd_get_8 (abfd, contents + roff - 2);
1307
1308
0
  if (opcode == 0xff)
1309
0
    {
1310
0
      switch (modrm & 0x38)
1311
0
  {
1312
0
  case 0x10: /* CALL */
1313
0
  case 0x20: /* JMP */
1314
0
    is_branch = true;
1315
0
    break;
1316
1317
0
  case 0x30: /* PUSH */
1318
0
    break;
1319
1320
0
  default:
1321
0
    return true;
1322
0
  }
1323
0
    }
1324
1325
  /* Convert to R_386_32 if PIC is false (if PIC is true we already know
1326
     there is a base register).  */
1327
0
  to_reloc_32 = !is_pic;
1328
1329
0
  eh = elf_x86_hash_entry (h);
1330
1331
  /* Try to convert R_386_GOT32X.  Get the symbol referred to by the
1332
     reloc.  */
1333
0
  if (h == NULL)
1334
0
    {
1335
0
      if (is_branch)
1336
  /* Convert "call/jmp *foo@GOT[(%reg)]".  */
1337
0
  goto convert_branch;
1338
0
      else
1339
  /* Convert "mov foo@GOT[(%reg1)], %reg2",
1340
     "test %reg1, foo@GOT(%reg2)" and
1341
     "binop foo@GOT[(%reg1)], %reg2". */
1342
0
  goto convert_load;
1343
0
    }
1344
1345
  /* Undefined weak symbol is only bound locally in executable
1346
     and its reference is resolved as 0.  */
1347
0
  if (h->root.type == bfd_link_hash_undefweak
1348
0
      && !eh->linker_def
1349
0
      && local_ref)
1350
0
    {
1351
0
      if (is_branch)
1352
0
  {
1353
    /* No direct branch to 0 for PIC.  */
1354
0
    if (is_pic)
1355
0
      return true;
1356
0
    else
1357
0
      goto convert_branch;
1358
0
  }
1359
0
      else
1360
0
  {
1361
    /* We can convert load of address 0 to R_386_32.  */
1362
0
    to_reloc_32 = true;
1363
0
    goto convert_load;
1364
0
  }
1365
0
    }
1366
1367
0
  if (is_branch)
1368
0
    {
1369
      /* We have "call/jmp *foo@GOT[(%reg)]".  */
1370
0
      if ((h->root.type == bfd_link_hash_defined
1371
0
     || h->root.type == bfd_link_hash_defweak)
1372
0
    && local_ref)
1373
0
  {
1374
    /* The function is locally defined.   */
1375
0
  convert_branch:
1376
    /* Convert R_386_GOT32X to R_386_PC32.  */
1377
0
    if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
1378
0
      {
1379
        /* Convert to "nop call foo".  ADDR_PREFIX_OPCODE
1380
     is a nop prefix.  */
1381
0
        modrm = 0xe8;
1382
        /* To support TLS optimization, always use addr32 prefix
1383
     for "call *___tls_get_addr@GOT(%reg)".  */
1384
0
        if (eh && eh->tls_get_addr)
1385
0
    {
1386
0
      nop = 0x67;
1387
0
      nop_offset = irel->r_offset - 2;
1388
0
    }
1389
0
        else
1390
0
    {
1391
0
      nop = htab->params->call_nop_byte;
1392
0
      if (htab->params->call_nop_as_suffix)
1393
0
        {
1394
0
          nop_offset = roff + 3;
1395
0
          irel->r_offset -= 1;
1396
0
        }
1397
0
      else
1398
0
        nop_offset = roff - 2;
1399
0
    }
1400
0
      }
1401
0
    else
1402
0
      {
1403
        /* Convert to "jmp foo nop".  */
1404
0
        modrm = 0xe9;
1405
0
        nop = NOP_OPCODE;
1406
0
        nop_offset = roff + 3;
1407
0
        irel->r_offset -= 1;
1408
0
      }
1409
1410
0
    bfd_put_8 (abfd, nop, contents + nop_offset);
1411
0
    bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
1412
    /* When converting to PC-relative relocation, we
1413
       need to adjust addend by -4.  */
1414
0
    bfd_put_32 (abfd, -4, contents + irel->r_offset);
1415
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
1416
0
    *r_type_p = R_386_PC32;
1417
0
    *converted = true;
1418
0
  }
1419
0
    }
1420
0
  else
1421
0
    {
1422
      /* We have "mov foo@GOT[(%re1g)], %reg2",
1423
   "test %reg1, foo@GOT(%reg2)",
1424
   "push foo@GOT[(%reg)]", or
1425
   "binop foo@GOT[(%reg1)], %reg2".
1426
1427
   Avoid optimizing _DYNAMIC since ld.so may use its
1428
   link-time address.  */
1429
0
      if (h == htab->elf.hdynamic)
1430
0
  return true;
1431
1432
      /* def_regular is set by an assignment in a linker script in
1433
   bfd_elf_record_link_assignment.  start_stop is set on
1434
   __start_SECNAME/__stop_SECNAME which mark section SECNAME.  */
1435
0
      if (h->start_stop
1436
0
    || eh->linker_def
1437
0
    || ((h->def_regular
1438
0
         || h->root.type == bfd_link_hash_defined
1439
0
         || h->root.type == bfd_link_hash_defweak)
1440
0
        && local_ref))
1441
0
  {
1442
0
  convert_load:
1443
0
    if (opcode == 0x8b)
1444
0
      {
1445
0
        if (abs_symbol && local_ref)
1446
0
    to_reloc_32 = true;
1447
1448
0
        if (to_reloc_32)
1449
0
    {
1450
      /* Convert "mov foo@GOT[(%reg1)], %reg2" to
1451
         "mov $foo, %reg2" with R_386_32.  */
1452
0
      r_type = R_386_32;
1453
0
      modrm = 0xc0 | (modrm & 0x38) >> 3;
1454
0
      bfd_put_8 (abfd, modrm, contents + roff - 1);
1455
0
      opcode = 0xc7;
1456
0
    }
1457
0
        else
1458
0
    {
1459
      /* Convert "mov foo@GOT(%reg1), %reg2" to
1460
         "lea foo@GOTOFF(%reg1), %reg2".  */
1461
0
      r_type = R_386_GOTOFF;
1462
0
      opcode = 0x8d;
1463
0
    }
1464
0
      }
1465
0
    else
1466
0
      {
1467
        /* Only R_386_32 is supported.  */
1468
0
        if (!to_reloc_32)
1469
0
    return true;
1470
1471
0
        if (opcode == 0x85)
1472
0
    {
1473
      /* Convert "test %reg1, foo@GOT(%reg2)" to
1474
         "test $foo, %reg1".  */
1475
0
      modrm = 0xc0 | (modrm & 0x38) >> 3;
1476
0
      opcode = 0xf7;
1477
0
    }
1478
0
        else if ((opcode | 0x38) == 0x3b)
1479
0
    {
1480
      /* Convert "binop foo@GOT(%reg1), %reg2" to
1481
         "binop $foo, %reg2".  */
1482
0
      modrm = 0xc0 | ((modrm & 0x38) >> 3) | (opcode & 0x38);
1483
0
      opcode = 0x81;
1484
0
    }
1485
0
        else if (opcode == 0xff)
1486
0
    {
1487
      /* Convert "push foo@GOT(%reg)" to
1488
         "push $foo".  */
1489
0
      modrm = 0x68; /* Really the opcode.  */
1490
0
      opcode = 0x2e; /* Really a meaningless %cs: prefix.  */
1491
0
    }
1492
0
        else
1493
0
    return true;
1494
1495
0
        bfd_put_8 (abfd, modrm, contents + roff - 1);
1496
0
        r_type = R_386_32;
1497
0
      }
1498
1499
0
    bfd_put_8 (abfd, opcode, contents + roff - 2);
1500
0
    irel->r_info = ELF32_R_INFO (r_symndx, r_type);
1501
0
    *r_type_p = r_type;
1502
0
    *converted = true;
1503
0
  }
1504
0
    }
1505
1506
0
  return true;
1507
0
}
1508
1509
/* Look through the relocs for a section during the first phase, and
1510
   calculate needed space in the global offset table, and procedure
1511
   linkage table.  */
1512
1513
static bool
1514
elf_i386_scan_relocs (bfd *abfd,
1515
          struct bfd_link_info *info,
1516
          asection *sec,
1517
          const Elf_Internal_Rela *relocs)
1518
0
{
1519
0
  struct elf_x86_link_hash_table *htab;
1520
0
  Elf_Internal_Shdr *symtab_hdr;
1521
0
  struct elf_link_hash_entry **sym_hashes;
1522
0
  const Elf_Internal_Rela *rel;
1523
0
  const Elf_Internal_Rela *rel_end;
1524
0
  bfd_byte *contents;
1525
0
  bool converted;
1526
1527
0
  if (bfd_link_relocatable (info))
1528
0
    return true;
1529
1530
0
  htab = elf_x86_hash_table (info, I386_ELF_DATA);
1531
0
  if (htab == NULL)
1532
0
    {
1533
0
      sec->check_relocs_failed = 1;
1534
0
      return false;
1535
0
    }
1536
1537
0
  BFD_ASSERT (is_x86_elf (abfd, htab));
1538
1539
  /* Get the section contents.  */
1540
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
1541
0
    contents = elf_section_data (sec)->this_hdr.contents;
1542
0
  else if (!_bfd_elf_mmap_section_contents (abfd, sec, &contents))
1543
0
    {
1544
0
      sec->check_relocs_failed = 1;
1545
0
      return false;
1546
0
    }
1547
1548
0
  symtab_hdr = &elf_symtab_hdr (abfd);
1549
0
  sym_hashes = elf_sym_hashes (abfd);
1550
1551
0
  converted = false;
1552
1553
0
  rel_end = relocs + sec->reloc_count;
1554
0
  for (rel = relocs; rel < rel_end; rel++)
1555
0
    {
1556
0
      unsigned int r_type;
1557
0
      unsigned int r_symndx;
1558
0
      struct elf_link_hash_entry *h;
1559
0
      struct elf_x86_link_hash_entry *eh;
1560
0
      Elf_Internal_Sym *isym;
1561
0
      const char *name;
1562
0
      bool size_reloc;
1563
0
      bool no_dynreloc;
1564
0
      reloc_howto_type *howto;
1565
1566
0
      r_symndx = ELF32_R_SYM (rel->r_info);
1567
0
      r_type = ELF32_R_TYPE (rel->r_info);
1568
1569
      /* Don't check R_386_NONE.  */
1570
0
      if (r_type == R_386_NONE)
1571
0
  continue;
1572
1573
0
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1574
0
  {
1575
    /* xgettext:c-format */
1576
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"),
1577
0
            abfd, r_symndx);
1578
0
    goto error_return;
1579
0
  }
1580
1581
0
      howto = elf_i386_rtype_to_howto (r_type);
1582
0
      if (rel->r_offset + bfd_get_reloc_size (howto) > sec->size)
1583
0
  {
1584
    /* xgettext:c-format */
1585
0
    _bfd_error_handler
1586
0
      (_("%pB: bad reloc offset (%#" PRIx32 " > %#" PRIx32 ") for"
1587
0
         " section `%pA'"), abfd, (uint32_t) rel->r_offset,
1588
0
       (uint32_t) sec->size, sec);
1589
0
    goto error_return;
1590
0
  }
1591
1592
0
      if (r_symndx < symtab_hdr->sh_info)
1593
0
  {
1594
    /* A local symbol.  */
1595
0
    isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
1596
0
          abfd, r_symndx);
1597
0
    if (isym == NULL)
1598
0
      goto error_return;
1599
1600
    /* Check relocation against local STT_GNU_IFUNC symbol.  */
1601
0
    if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1602
0
      {
1603
0
        h = _bfd_elf_x86_get_local_sym_hash (htab, abfd, rel, true);
1604
0
        if (h == NULL)
1605
0
    goto error_return;
1606
1607
        /* Fake a STT_GNU_IFUNC symbol.  */
1608
0
        h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
1609
0
                  isym, NULL);
1610
0
        h->type = STT_GNU_IFUNC;
1611
0
        h->def_regular = 1;
1612
0
        h->ref_regular = 1;
1613
0
        h->forced_local = 1;
1614
0
        h->root.type = bfd_link_hash_defined;
1615
0
      }
1616
0
    else
1617
0
      h = NULL;
1618
0
  }
1619
0
      else
1620
0
  {
1621
0
    isym = NULL;
1622
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1623
0
    while (h->root.type == bfd_link_hash_indirect
1624
0
     || h->root.type == bfd_link_hash_warning)
1625
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
1626
0
  }
1627
1628
0
      eh = (struct elf_x86_link_hash_entry *) h;
1629
0
      if (h != NULL)
1630
0
  {
1631
0
    if (r_type == R_386_GOTOFF)
1632
0
      eh->gotoff_ref = 1;
1633
1634
    /* It is referenced by a non-shared object. */
1635
0
    h->ref_regular = 1;
1636
0
  }
1637
1638
0
      if (r_type == R_386_GOT32X
1639
0
    && (h == NULL || h->type != STT_GNU_IFUNC))
1640
0
  {
1641
0
    Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
1642
0
    if (!elf_i386_convert_load_reloc (abfd, symtab_hdr, contents,
1643
0
              &r_type, irel, h,
1644
0
              &converted, info))
1645
0
      goto error_return;
1646
0
  }
1647
1648
0
      if (!_bfd_elf_x86_valid_reloc_p (sec, info, htab, rel, h, isym,
1649
0
               symtab_hdr, &no_dynreloc))
1650
0
  return false;
1651
1652
0
      if (! elf_i386_tls_transition (info, abfd, sec, contents,
1653
0
             symtab_hdr, sym_hashes,
1654
0
             &r_type, GOT_UNKNOWN,
1655
0
             rel, rel_end, h, isym, false))
1656
0
  goto error_return;
1657
1658
      /* Check if _GLOBAL_OFFSET_TABLE_ is referenced.  */
1659
0
      if (h == htab->elf.hgot)
1660
0
  htab->got_referenced = true;
1661
1662
0
      switch (r_type)
1663
0
  {
1664
0
  case R_386_TLS_LDM:
1665
0
    htab->tls_ld_or_ldm_got.refcount = 1;
1666
0
    goto create_got;
1667
1668
0
  case R_386_PLT32:
1669
    /* This symbol requires a procedure linkage table entry.  We
1670
       actually build the entry in adjust_dynamic_symbol,
1671
       because this might be a case of linking PIC code which is
1672
       never referenced by a dynamic object, in which case we
1673
       don't need to generate a procedure linkage table entry
1674
       after all.  */
1675
1676
    /* If this is a local symbol, we resolve it directly without
1677
       creating a procedure linkage table entry.  */
1678
0
    if (h == NULL)
1679
0
      continue;
1680
1681
0
    eh->zero_undefweak &= 0x2;
1682
0
    h->needs_plt = 1;
1683
0
    h->plt.refcount = 1;
1684
0
    break;
1685
1686
0
  case R_386_SIZE32:
1687
0
    size_reloc = true;
1688
0
    goto do_size;
1689
1690
0
  case R_386_TLS_IE_32:
1691
0
  case R_386_TLS_IE:
1692
0
  case R_386_TLS_GOTIE:
1693
0
    if (!bfd_link_executable (info))
1694
0
      info->flags |= DF_STATIC_TLS;
1695
    /* Fall through */
1696
1697
0
  case R_386_GOT32:
1698
0
  case R_386_GOT32X:
1699
0
  case R_386_TLS_GD:
1700
0
  case R_386_TLS_GOTDESC:
1701
0
  case R_386_TLS_DESC_CALL:
1702
    /* This symbol requires a global offset table entry.  */
1703
0
    {
1704
0
      int tls_type, old_tls_type;
1705
1706
0
      switch (r_type)
1707
0
        {
1708
0
        default:
1709
0
        case R_386_GOT32:
1710
0
        case R_386_GOT32X:
1711
0
    tls_type = GOT_NORMAL;
1712
0
    break;
1713
0
        case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
1714
0
        case R_386_TLS_GOTDESC:
1715
0
        case R_386_TLS_DESC_CALL:
1716
0
    tls_type = GOT_TLS_GDESC; break;
1717
0
        case R_386_TLS_IE_32:
1718
0
    if (ELF32_R_TYPE (rel->r_info) == r_type)
1719
0
      tls_type = GOT_TLS_IE_NEG;
1720
0
    else
1721
      /* If this is a GD->IE transition, we may use either of
1722
         R_386_TLS_TPOFF and R_386_TLS_TPOFF32.  */
1723
0
      tls_type = GOT_TLS_IE;
1724
0
    break;
1725
0
        case R_386_TLS_IE:
1726
0
        case R_386_TLS_GOTIE:
1727
0
    tls_type = GOT_TLS_IE_POS; break;
1728
0
        }
1729
1730
0
      if (h != NULL)
1731
0
        {
1732
0
    h->got.refcount = 1;
1733
0
    old_tls_type = elf_x86_hash_entry (h)->tls_type;
1734
0
        }
1735
0
      else
1736
0
        {
1737
0
    bfd_signed_vma *local_got_refcounts;
1738
1739
0
    if (!elf_x86_allocate_local_got_info (abfd,
1740
0
                  symtab_hdr->sh_info))
1741
0
          goto error_return;
1742
1743
    /* This is a global offset table entry for a local symbol.  */
1744
0
    local_got_refcounts = elf_local_got_refcounts (abfd);
1745
0
    local_got_refcounts[r_symndx] = 1;
1746
0
    old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
1747
0
        }
1748
1749
0
      if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1750
0
        tls_type |= old_tls_type;
1751
      /* If a TLS symbol is accessed using IE at least once,
1752
         there is no point to use dynamic model for it.  */
1753
0
      else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1754
0
         && (! GOT_TLS_GD_ANY_P (old_tls_type)
1755
0
       || (tls_type & GOT_TLS_IE) == 0))
1756
0
        {
1757
0
    if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
1758
0
      tls_type = old_tls_type;
1759
0
    else if (GOT_TLS_GD_ANY_P (old_tls_type)
1760
0
       && GOT_TLS_GD_ANY_P (tls_type))
1761
0
      tls_type |= old_tls_type;
1762
0
    else
1763
0
      {
1764
0
        if (h)
1765
0
          name = h->root.root.string;
1766
0
        else
1767
0
          name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1768
0
                 NULL);
1769
0
        _bfd_error_handler
1770
          /* xgettext:c-format */
1771
0
          (_("%pB: `%s' accessed both as normal and "
1772
0
       "thread local symbol"),
1773
0
           abfd, name);
1774
0
        bfd_set_error (bfd_error_bad_value);
1775
0
        goto error_return;
1776
0
      }
1777
0
        }
1778
1779
0
      if (old_tls_type != tls_type)
1780
0
        {
1781
0
    if (h != NULL)
1782
0
      elf_x86_hash_entry (h)->tls_type = tls_type;
1783
0
    else
1784
0
      elf_x86_local_got_tls_type (abfd) [r_symndx] = tls_type;
1785
0
        }
1786
0
    }
1787
    /* Fall through */
1788
1789
0
  case R_386_GOTOFF:
1790
0
  case R_386_GOTPC:
1791
0
  create_got:
1792
0
    if (r_type != R_386_TLS_IE)
1793
0
      {
1794
0
        if (eh != NULL)
1795
0
    {
1796
0
      eh->zero_undefweak &= 0x2;
1797
1798
      /* Need GOT to resolve undefined weak symbol to 0.  */
1799
0
      if (r_type == R_386_GOTOFF
1800
0
          && h->root.type == bfd_link_hash_undefweak
1801
0
          && bfd_link_executable (info))
1802
0
        htab->got_referenced = true;
1803
0
    }
1804
0
        break;
1805
0
      }
1806
    /* Fall through */
1807
1808
0
  case R_386_TLS_LE_32:
1809
0
  case R_386_TLS_LE:
1810
0
    if (eh != NULL)
1811
0
      eh->zero_undefweak &= 0x2;
1812
0
    if (bfd_link_executable (info))
1813
0
      break;
1814
0
    info->flags |= DF_STATIC_TLS;
1815
0
    goto do_relocation;
1816
1817
0
  case R_386_32:
1818
0
  case R_386_PC32:
1819
0
    if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1820
0
      eh->zero_undefweak |= 0x2;
1821
0
  do_relocation:
1822
    /* We are called after all symbols have been resolved.  Only
1823
       relocation against STT_GNU_IFUNC symbol must go through
1824
       PLT.  */
1825
0
    if (h != NULL
1826
0
        && (bfd_link_executable (info)
1827
0
      || h->type == STT_GNU_IFUNC))
1828
0
      {
1829
0
        bool func_pointer_ref = false;
1830
1831
0
        if (r_type == R_386_PC32)
1832
0
    {
1833
      /* Since something like ".long foo - ." may be used
1834
         as pointer, make sure that PLT is used if foo is
1835
         a function defined in a shared library.  */
1836
0
      if ((sec->flags & SEC_CODE) == 0)
1837
0
        h->pointer_equality_needed = 1;
1838
0
      else if (h->type == STT_GNU_IFUNC
1839
0
         && bfd_link_pic (info))
1840
0
        {
1841
0
          _bfd_error_handler
1842
      /* xgettext:c-format */
1843
0
      (_("%pB: unsupported non-PIC call to IFUNC `%s'"),
1844
0
       abfd, h->root.root.string);
1845
0
          bfd_set_error (bfd_error_bad_value);
1846
0
          goto error_return;
1847
0
        }
1848
0
    }
1849
0
        else
1850
0
    {
1851
      /* R_386_32 can be resolved at run-time.  Function
1852
         pointer reference doesn't need PLT for pointer
1853
         equality.  */
1854
0
      if (r_type == R_386_32
1855
0
          && (sec->flags & SEC_READONLY) == 0)
1856
0
        func_pointer_ref = true;
1857
1858
      /* IFUNC symbol needs pointer equality in PDE so that
1859
         function pointer reference will be resolved to its
1860
         PLT entry directly.  */
1861
0
      if (!func_pointer_ref
1862
0
          || (bfd_link_pde (info)
1863
0
        && h->type == STT_GNU_IFUNC))
1864
0
        h->pointer_equality_needed = 1;
1865
0
    }
1866
1867
0
        if (!func_pointer_ref)
1868
0
    {
1869
      /* If this reloc is in a read-only section, we might
1870
         need a copy reloc.  We can't check reliably at this
1871
         stage whether the section is read-only, as input
1872
         sections have not yet been mapped to output sections.
1873
         Tentatively set the flag for now, and correct in
1874
         adjust_dynamic_symbol.  */
1875
0
      h->non_got_ref = 1;
1876
1877
0
      if (!elf_has_indirect_extern_access (sec->owner))
1878
0
        eh->non_got_ref_without_indirect_extern_access = 1;
1879
1880
      /* We may need a .plt entry if the symbol is a function
1881
         defined in a shared lib or is a function referenced
1882
         from the code or read-only section.  */
1883
0
      if (!h->def_regular
1884
0
          || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
1885
0
        h->plt.refcount = 1;
1886
1887
0
      if (htab->elf.target_os != is_solaris
1888
0
          && h->pointer_equality_needed
1889
0
          && h->type == STT_FUNC
1890
0
          && eh->def_protected
1891
0
          && !SYMBOL_DEFINED_NON_SHARED_P (h)
1892
0
          && h->def_dynamic)
1893
0
        {
1894
          /* Disallow non-canonical reference to canonical
1895
       protected function.  */
1896
0
          _bfd_error_handler
1897
      /* xgettext:c-format */
1898
0
      (_("%pB: non-canonical reference to canonical "
1899
0
         "protected function `%s' in %pB"),
1900
0
       abfd, h->root.root.string,
1901
0
       h->root.u.def.section->owner);
1902
0
          bfd_set_error (bfd_error_bad_value);
1903
0
          goto error_return;
1904
0
        }
1905
0
    }
1906
0
      }
1907
1908
0
    size_reloc = false;
1909
0
  do_size:
1910
0
    if (!no_dynreloc
1911
0
        && NEED_DYNAMIC_RELOCATION_P (false, info, false, h, sec,
1912
0
              r_type, R_386_32))
1913
0
      {
1914
0
        struct elf_dyn_relocs *p;
1915
0
        struct elf_dyn_relocs **head;
1916
1917
        /* If this is a global symbol, we count the number of
1918
     relocations we need for this symbol.  */
1919
0
        if (h != NULL)
1920
0
    {
1921
0
      head = &h->dyn_relocs;
1922
0
    }
1923
0
        else
1924
0
    {
1925
      /* Track dynamic relocs needed for local syms too.
1926
         We really need local syms available to do this
1927
         easily.  Oh well.  */
1928
0
      void **vpp;
1929
0
      asection *s;
1930
1931
0
      isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
1932
0
            abfd, r_symndx);
1933
0
      if (isym == NULL)
1934
0
        goto error_return;
1935
1936
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1937
0
      if (s == NULL)
1938
0
        s = sec;
1939
1940
0
      vpp = &elf_section_data (s)->local_dynrel;
1941
0
      head = (struct elf_dyn_relocs **)vpp;
1942
0
    }
1943
1944
0
        p = *head;
1945
0
        if (p == NULL || p->sec != sec)
1946
0
    {
1947
0
      size_t amt = sizeof *p;
1948
0
      p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1949
0
                 amt);
1950
0
      if (p == NULL)
1951
0
        goto error_return;
1952
0
      p->next = *head;
1953
0
      *head = p;
1954
0
      p->sec = sec;
1955
0
      p->count = 0;
1956
0
      p->pc_count = 0;
1957
0
    }
1958
1959
0
        p->count += 1;
1960
        /* Count size relocation as PC-relative relocation.  */
1961
0
        if (r_type == R_386_PC32 || size_reloc)
1962
0
    p->pc_count += 1;
1963
0
      }
1964
0
    break;
1965
1966
    /* This relocation describes the C++ object vtable hierarchy.
1967
       Reconstruct it for later use during GC.  */
1968
0
  case R_386_GNU_VTINHERIT:
1969
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1970
0
      goto error_return;
1971
0
    break;
1972
1973
    /* This relocation describes which C++ vtable entries are actually
1974
       used.  Record for later use during GC.  */
1975
0
  case R_386_GNU_VTENTRY:
1976
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1977
0
      goto error_return;
1978
0
    break;
1979
1980
0
  default:
1981
0
    break;
1982
0
  }
1983
0
    }
1984
1985
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
1986
0
    {
1987
0
      if (!converted)
1988
0
  _bfd_elf_munmap_section_contents (sec, contents);
1989
0
      else
1990
0
  {
1991
    /* Cache the section contents for elf_link_input_bfd if any
1992
       load is converted or --no-keep-memory isn't used.  */
1993
0
    elf_section_data (sec)->this_hdr.contents = contents;
1994
0
    info->cache_size += sec->size;
1995
0
  }
1996
0
    }
1997
1998
  /* Cache relocations if any load is converted.  */
1999
0
  if (elf_section_data (sec)->relocs != relocs && converted)
2000
0
    elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
2001
2002
0
  return true;
2003
2004
0
 error_return:
2005
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
2006
0
    _bfd_elf_munmap_section_contents (sec, contents);
2007
0
  sec->check_relocs_failed = 1;
2008
0
  return false;
2009
0
}
2010
2011
static bool
2012
elf_i386_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
2013
0
{
2014
0
  bfd *abfd;
2015
2016
  /* Scan relocations after rel_from_abs has been set on __ehdr_start.  */
2017
0
  for (abfd = info->input_bfds;
2018
0
       abfd != (bfd *) NULL;
2019
0
       abfd = abfd->link.next)
2020
0
    if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2021
0
  && !_bfd_elf_link_iterate_on_relocs (abfd, info,
2022
0
               elf_i386_scan_relocs))
2023
0
      return false;
2024
2025
0
  return _bfd_x86_elf_early_size_sections (output_bfd, info);
2026
0
}
2027
2028
/* Set the correct type for an x86 ELF section.  We do this by the
2029
   section name, which is a hack, but ought to work.  */
2030
2031
static bool
2032
elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2033
      Elf_Internal_Shdr *hdr,
2034
      asection *sec)
2035
166
{
2036
166
  const char *name;
2037
2038
166
  name = bfd_section_name (sec);
2039
2040
  /* This is an ugly, but unfortunately necessary hack that is
2041
     needed when producing EFI binaries on x86. It tells
2042
     elf.c:elf_fake_sections() not to consider ".reloc" as a section
2043
     containing ELF relocation info.  We need this hack in order to
2044
     be able to generate ELF binaries that can be translated into
2045
     EFI applications (which are essentially COFF objects).  Those
2046
     files contain a COFF ".reloc" section inside an ELFNN object,
2047
     which would normally cause BFD to segfault because it would
2048
     attempt to interpret this section as containing relocation
2049
     entries for section "oc".  With this hack enabled, ".reloc"
2050
     will be treated as a normal data section, which will avoid the
2051
     segfault.  However, you won't be able to create an ELFNN binary
2052
     with a section named "oc" that needs relocations, but that's
2053
     the kind of ugly side-effects you get when detecting section
2054
     types based on their names...  In practice, this limitation is
2055
     unlikely to bite.  */
2056
166
  if (strcmp (name, ".reloc") == 0)
2057
0
    hdr->sh_type = SHT_PROGBITS;
2058
2059
166
  return true;
2060
166
}
2061
2062
/* Return the relocation value for @tpoff relocation
2063
   if STT_TLS virtual address is ADDRESS.  */
2064
2065
static bfd_vma
2066
elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
2067
0
{
2068
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2069
0
  const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
2070
0
  bfd_vma static_tls_size;
2071
2072
  /* If tls_sec is NULL, we should have signalled an error already.  */
2073
0
  if (htab->tls_sec == NULL)
2074
0
    return 0;
2075
2076
  /* Consider special static TLS alignment requirements.  */
2077
0
  static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
2078
0
  return static_tls_size + htab->tls_sec->vma - address;
2079
0
}
2080
2081
/* Relocate an i386 ELF section.  */
2082
2083
static int
2084
elf_i386_relocate_section (bfd *output_bfd,
2085
         struct bfd_link_info *info,
2086
         bfd *input_bfd,
2087
         asection *input_section,
2088
         bfd_byte *contents,
2089
         Elf_Internal_Rela *relocs,
2090
         Elf_Internal_Sym *local_syms,
2091
         asection **local_sections)
2092
0
{
2093
0
  struct elf_x86_link_hash_table *htab;
2094
0
  Elf_Internal_Shdr *symtab_hdr;
2095
0
  struct elf_link_hash_entry **sym_hashes;
2096
0
  bfd_vma *local_got_offsets;
2097
0
  bfd_vma *local_tlsdesc_gotents;
2098
0
  Elf_Internal_Rela *rel;
2099
0
  Elf_Internal_Rela *wrel;
2100
0
  Elf_Internal_Rela *relend;
2101
0
  bool is_vxworks_tls;
2102
0
  unsigned expected_tls_le;
2103
0
  unsigned plt_entry_size;
2104
2105
  /* Skip if check_relocs or scan_relocs failed.  */
2106
0
  if (input_section->check_relocs_failed)
2107
0
    return false;
2108
2109
0
  htab = elf_x86_hash_table (info, I386_ELF_DATA);
2110
0
  if (htab == NULL)
2111
0
    return false;
2112
2113
0
  if (!is_x86_elf (input_bfd, htab))
2114
0
    {
2115
0
      bfd_set_error (bfd_error_wrong_format);
2116
0
      return false;
2117
0
    }
2118
2119
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
2120
0
  sym_hashes = elf_sym_hashes (input_bfd);
2121
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
2122
0
  local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
2123
  /* We have to handle relocations in vxworks .tls_vars sections
2124
     specially, because the dynamic loader is 'weird'.  */
2125
0
  is_vxworks_tls = (htab->elf.target_os == is_vxworks
2126
0
        && bfd_link_pic (info)
2127
0
        && !strcmp (input_section->output_section->name,
2128
0
        ".tls_vars"));
2129
2130
0
  _bfd_x86_elf_set_tls_module_base (info);
2131
2132
0
  plt_entry_size = htab->plt.plt_entry_size;
2133
2134
0
  rel = wrel = relocs;
2135
0
  relend = relocs + input_section->reloc_count;
2136
0
  for (; rel < relend; wrel++, rel++)
2137
0
    {
2138
0
      unsigned int r_type, r_type_tls;
2139
0
      reloc_howto_type *howto;
2140
0
      unsigned long r_symndx;
2141
0
      struct elf_link_hash_entry *h;
2142
0
      struct elf_x86_link_hash_entry *eh;
2143
0
      Elf_Internal_Sym *sym;
2144
0
      asection *sec;
2145
0
      bfd_vma off, offplt, plt_offset;
2146
0
      bfd_vma relocation;
2147
0
      bool unresolved_reloc;
2148
0
      bfd_reloc_status_type r;
2149
0
      unsigned int indx;
2150
0
      int tls_type;
2151
0
      bfd_vma st_size;
2152
0
      asection *resolved_plt;
2153
0
      bool resolved_to_zero;
2154
0
      bool relative_reloc;
2155
2156
0
      r_type = ELF32_R_TYPE (rel->r_info);
2157
0
      if (r_type == R_386_GNU_VTINHERIT
2158
0
    || r_type == R_386_GNU_VTENTRY)
2159
0
  {
2160
0
    if (wrel != rel)
2161
0
      *wrel = *rel;
2162
0
    continue;
2163
0
  }
2164
2165
0
      howto = elf_i386_rtype_to_howto (r_type);
2166
0
      if (howto == NULL)
2167
0
  return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
2168
2169
0
      r_symndx = ELF32_R_SYM (rel->r_info);
2170
0
      h = NULL;
2171
0
      sym = NULL;
2172
0
      sec = NULL;
2173
0
      unresolved_reloc = false;
2174
0
      if (r_symndx < symtab_hdr->sh_info)
2175
0
  {
2176
0
    sym = local_syms + r_symndx;
2177
0
    sec = local_sections[r_symndx];
2178
0
    relocation = (sec->output_section->vma
2179
0
      + sec->output_offset
2180
0
      + sym->st_value);
2181
0
    st_size = sym->st_size;
2182
2183
0
    if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
2184
0
        && ((sec->flags & SEC_MERGE) != 0
2185
0
      || (bfd_link_relocatable (info)
2186
0
          && sec->output_offset != 0)))
2187
0
      {
2188
0
        bfd_vma addend;
2189
0
        bfd_byte *where = contents + rel->r_offset;
2190
2191
0
        switch (bfd_get_reloc_size (howto))
2192
0
    {
2193
0
    case 1:
2194
0
      addend = bfd_get_8 (input_bfd, where);
2195
0
      if (howto->pc_relative)
2196
0
        {
2197
0
          addend = (addend ^ 0x80) - 0x80;
2198
0
          addend += 1;
2199
0
        }
2200
0
      break;
2201
0
    case 2:
2202
0
      addend = bfd_get_16 (input_bfd, where);
2203
0
      if (howto->pc_relative)
2204
0
        {
2205
0
          addend = (addend ^ 0x8000) - 0x8000;
2206
0
          addend += 2;
2207
0
        }
2208
0
      break;
2209
0
    case 4:
2210
0
      addend = bfd_get_32 (input_bfd, where);
2211
0
      if (howto->pc_relative)
2212
0
        {
2213
0
          addend = (addend ^ 0x80000000) - 0x80000000;
2214
0
          addend += 4;
2215
0
        }
2216
0
      break;
2217
0
    default:
2218
0
      abort ();
2219
0
    }
2220
2221
0
        if (bfd_link_relocatable (info))
2222
0
    addend += sec->output_offset;
2223
0
        else
2224
0
    {
2225
0
      asection *msec = sec;
2226
0
      addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
2227
0
               addend);
2228
0
      addend -= relocation;
2229
0
      addend += msec->output_section->vma + msec->output_offset;
2230
0
    }
2231
2232
0
        switch (bfd_get_reloc_size (howto))
2233
0
    {
2234
0
    case 1:
2235
      /* FIXME: overflow checks.  */
2236
0
      if (howto->pc_relative)
2237
0
        addend -= 1;
2238
0
      bfd_put_8 (input_bfd, addend, where);
2239
0
      break;
2240
0
    case 2:
2241
0
      if (howto->pc_relative)
2242
0
        addend -= 2;
2243
0
      bfd_put_16 (input_bfd, addend, where);
2244
0
      break;
2245
0
    case 4:
2246
0
      if (howto->pc_relative)
2247
0
        addend -= 4;
2248
0
      bfd_put_32 (input_bfd, addend, where);
2249
0
      break;
2250
0
    }
2251
0
      }
2252
0
    else if (!bfd_link_relocatable (info)
2253
0
       && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2254
0
      {
2255
        /* Relocate against local STT_GNU_IFUNC symbol.  */
2256
0
        h = _bfd_elf_x86_get_local_sym_hash (htab, input_bfd, rel,
2257
0
               false);
2258
0
        if (h == NULL)
2259
0
    abort ();
2260
2261
        /* Set STT_GNU_IFUNC symbol value.  */
2262
0
        h->root.u.def.value = sym->st_value;
2263
0
        h->root.u.def.section = sec;
2264
0
      }
2265
0
  }
2266
0
      else
2267
0
  {
2268
0
    bool warned ATTRIBUTE_UNUSED;
2269
0
    bool ignored ATTRIBUTE_UNUSED;
2270
2271
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2272
0
           r_symndx, symtab_hdr, sym_hashes,
2273
0
           h, sec, relocation,
2274
0
           unresolved_reloc, warned, ignored);
2275
0
    st_size = h->size;
2276
0
  }
2277
2278
0
      if (sec != NULL && discarded_section (sec))
2279
0
  {
2280
0
    _bfd_clear_contents (howto, input_bfd, input_section,
2281
0
             contents, rel->r_offset);
2282
0
    wrel->r_offset = rel->r_offset;
2283
0
    wrel->r_info = 0;
2284
0
    wrel->r_addend = 0;
2285
2286
    /* For ld -r, remove relocations in debug sections against
2287
       sections defined in discarded sections.  Not done for
2288
       eh_frame editing code expects to be present.  */
2289
0
     if (bfd_link_relocatable (info)
2290
0
         && (input_section->flags & SEC_DEBUGGING))
2291
0
       wrel--;
2292
2293
0
     continue;
2294
0
  }
2295
2296
0
      if (bfd_link_relocatable (info))
2297
0
  {
2298
0
    if (wrel != rel)
2299
0
      *wrel = *rel;
2300
0
    continue;
2301
0
  }
2302
2303
0
      eh = (struct elf_x86_link_hash_entry *) h;
2304
2305
      /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
2306
   it here if it is defined in a non-shared object.  */
2307
0
      if (h != NULL
2308
0
    && h->type == STT_GNU_IFUNC
2309
0
    && h->def_regular)
2310
0
  {
2311
0
    asection *gotplt, *base_got;
2312
0
    bfd_vma plt_index;
2313
0
    const char *name;
2314
2315
0
    if ((input_section->flags & SEC_ALLOC) == 0)
2316
0
      {
2317
        /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2318
           STT_GNU_IFUNC symbol as STT_FUNC.  */
2319
0
        if (elf_section_type (input_section) == SHT_NOTE)
2320
0
    goto skip_ifunc;
2321
        /* Dynamic relocs are not propagated for SEC_DEBUGGING
2322
     sections because such sections are not SEC_ALLOC and
2323
     thus ld.so will not process them.  */
2324
0
        if ((input_section->flags & SEC_DEBUGGING) != 0)
2325
0
    continue;
2326
0
        abort ();
2327
0
      }
2328
2329
    /* STT_GNU_IFUNC symbol must go through PLT.  */
2330
0
    if (htab->elf.splt != NULL)
2331
0
      {
2332
0
        if (htab->plt_second != NULL)
2333
0
    {
2334
0
      resolved_plt = htab->plt_second;
2335
0
      plt_offset = eh->plt_second.offset;
2336
0
    }
2337
0
        else
2338
0
    {
2339
0
      resolved_plt = htab->elf.splt;
2340
0
      plt_offset = h->plt.offset;
2341
0
    }
2342
0
        gotplt = htab->elf.sgotplt;
2343
0
      }
2344
0
    else
2345
0
      {
2346
0
        resolved_plt = htab->elf.iplt;
2347
0
        plt_offset = h->plt.offset;
2348
0
        gotplt = htab->elf.igotplt;
2349
0
      }
2350
2351
0
    switch (r_type)
2352
0
      {
2353
0
      default:
2354
0
        break;
2355
2356
0
      case R_386_GOT32:
2357
0
      case R_386_GOT32X:
2358
0
        base_got = htab->elf.sgot;
2359
0
        off = h->got.offset;
2360
2361
0
        if (base_got == NULL)
2362
0
    abort ();
2363
2364
0
        if (off == (bfd_vma) -1)
2365
0
    {
2366
      /* We can't use h->got.offset here to save state, or
2367
         even just remember the offset, as finish_dynamic_symbol
2368
         would use that as offset into .got.  */
2369
2370
0
      if (h->plt.offset == (bfd_vma) -1)
2371
0
        abort ();
2372
2373
0
      if (htab->elf.splt != NULL)
2374
0
        {
2375
0
          plt_index = (h->plt.offset / plt_entry_size
2376
0
           - htab->plt.has_plt0);
2377
0
          off = (plt_index + 3) * 4;
2378
0
          base_got = htab->elf.sgotplt;
2379
0
        }
2380
0
      else
2381
0
        {
2382
0
          plt_index = h->plt.offset / plt_entry_size;
2383
0
          off = plt_index * 4;
2384
0
          base_got = htab->elf.igotplt;
2385
0
        }
2386
2387
0
      if (h->dynindx == -1
2388
0
          || h->forced_local
2389
0
          || info->symbolic)
2390
0
        {
2391
          /* This references the local defitionion.  We must
2392
       initialize this entry in the global offset table.
2393
       Since the offset must always be a multiple of 4,
2394
       we use the least significant bit to record
2395
       whether we have initialized it already.
2396
2397
       When doing a dynamic link, we create a .rela.got
2398
       relocation entry to initialize the value.  This
2399
       is done in the finish_dynamic_symbol routine.   */
2400
0
          if ((off & 1) != 0)
2401
0
      off &= ~1;
2402
0
          else
2403
0
      {
2404
0
        bfd_put_32 (output_bfd, relocation,
2405
0
              base_got->contents + off);
2406
0
        h->got.offset |= 1;
2407
0
      }
2408
0
        }
2409
2410
0
      relocation = off;
2411
0
    }
2412
0
        else
2413
0
    relocation = (base_got->output_section->vma
2414
0
            + base_got->output_offset + off
2415
0
            - gotplt->output_section->vma
2416
0
            - gotplt->output_offset);
2417
2418
0
        if (rel->r_offset > 1
2419
0
      && (*(contents + rel->r_offset - 1) & 0xc7) == 0x5
2420
0
      && *(contents + rel->r_offset - 2) != 0x8d)
2421
0
    {
2422
0
      if (bfd_link_pic (info))
2423
0
        goto disallow_got32;
2424
2425
      /* Add the GOT base if there is no base register.  */
2426
0
      relocation += (gotplt->output_section->vma
2427
0
         + gotplt->output_offset);
2428
0
    }
2429
0
        else if (htab->elf.splt == NULL)
2430
0
    {
2431
      /* Adjust for static executables.  */
2432
0
      relocation += gotplt->output_offset;
2433
0
    }
2434
2435
0
        goto do_relocation;
2436
0
      }
2437
2438
0
    if (h->plt.offset == (bfd_vma) -1)
2439
0
      {
2440
        /* Handle static pointers of STT_GNU_IFUNC symbols.  */
2441
0
        if (r_type == R_386_32
2442
0
      && (input_section->flags & SEC_CODE) == 0)
2443
0
    goto do_ifunc_pointer;
2444
0
        goto bad_ifunc_reloc;
2445
0
      }
2446
2447
0
    relocation = (resolved_plt->output_section->vma
2448
0
      + resolved_plt->output_offset + plt_offset);
2449
2450
0
    switch (r_type)
2451
0
      {
2452
0
      default:
2453
0
      bad_ifunc_reloc:
2454
0
        if (h->root.root.string)
2455
0
    name = h->root.root.string;
2456
0
        else
2457
0
    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2458
0
           NULL);
2459
0
        _bfd_error_handler
2460
    /* xgettext:c-format */
2461
0
    (_("%pB: relocation %s against STT_GNU_IFUNC "
2462
0
       "symbol `%s' isn't supported"), input_bfd,
2463
0
     howto->name, name);
2464
0
        bfd_set_error (bfd_error_bad_value);
2465
0
        return false;
2466
2467
0
      case R_386_32:
2468
        /* Generate dynamic relcoation only when there is a
2469
     non-GOT reference in a shared object.  */
2470
0
        if ((bfd_link_pic (info) && h->non_got_ref)
2471
0
      || h->plt.offset == (bfd_vma) -1)
2472
0
    {
2473
0
      Elf_Internal_Rela outrel;
2474
0
      asection *sreloc;
2475
0
      bfd_vma offset;
2476
2477
0
    do_ifunc_pointer:
2478
      /* Need a dynamic relocation to get the real function
2479
         adddress.  */
2480
0
      offset = _bfd_elf_section_offset (output_bfd,
2481
0
                info,
2482
0
                input_section,
2483
0
                rel->r_offset);
2484
0
      if (offset == (bfd_vma) -1
2485
0
          || offset == (bfd_vma) -2)
2486
0
        abort ();
2487
2488
0
      outrel.r_offset = (input_section->output_section->vma
2489
0
             + input_section->output_offset
2490
0
             + offset);
2491
2492
0
      if (POINTER_LOCAL_IFUNC_P (info, h))
2493
0
        {
2494
0
          info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
2495
0
                h->root.root.string,
2496
0
                h->root.u.def.section->owner);
2497
2498
          /* This symbol is resolved locally.  */
2499
0
          outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
2500
2501
0
          if (htab->params->report_relative_reloc)
2502
0
      _bfd_x86_elf_link_report_relative_reloc
2503
0
        (info, input_section, h, sym,
2504
0
         "R_386_IRELATIVE", &outrel);
2505
2506
0
          bfd_put_32 (output_bfd,
2507
0
          (h->root.u.def.value
2508
0
           + h->root.u.def.section->output_section->vma
2509
0
           + h->root.u.def.section->output_offset),
2510
0
          contents + offset);
2511
0
        }
2512
0
      else
2513
0
        outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2514
2515
      /* Dynamic relocations are stored in
2516
         1. .rel.ifunc section in PIC object.
2517
         2. .rel.got section in dynamic executable.
2518
         3. .rel.iplt section in static executable.  */
2519
0
      if (bfd_link_pic (info))
2520
0
        sreloc = htab->elf.irelifunc;
2521
0
      else if (htab->elf.splt != NULL)
2522
0
        sreloc = htab->elf.srelgot;
2523
0
      else
2524
0
        sreloc = htab->elf.irelplt;
2525
0
      elf_append_rel (output_bfd, sreloc, &outrel);
2526
2527
      /* If this reloc is against an external symbol, we
2528
         do not want to fiddle with the addend.  Otherwise,
2529
         we need to include the symbol value so that it
2530
         becomes an addend for the dynamic reloc.  For an
2531
         internal symbol, we have updated addend.  */
2532
0
      continue;
2533
0
    }
2534
        /* FALLTHROUGH */
2535
0
      case R_386_PC32:
2536
0
      case R_386_PLT32:
2537
0
        goto do_relocation;
2538
2539
0
      case R_386_GOTOFF:
2540
        /* NB: We can't use the PLT entry as the function address
2541
     for PIC since the PIC register may not be set up
2542
     properly for indirect call. */
2543
0
        if (bfd_link_pic (info))
2544
0
    goto bad_ifunc_reloc;
2545
0
        relocation -= (gotplt->output_section->vma
2546
0
           + gotplt->output_offset);
2547
0
        goto do_relocation;
2548
0
      }
2549
0
  }
2550
2551
0
    skip_ifunc:
2552
0
      resolved_to_zero = (eh != NULL
2553
0
        && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
2554
2555
0
      switch (r_type)
2556
0
  {
2557
0
  case R_386_GOT32X:
2558
0
  case R_386_GOT32:
2559
    /* Relocation is to the entry for this symbol in the global
2560
       offset table.  */
2561
0
    if (htab->elf.sgot == NULL)
2562
0
      abort ();
2563
2564
0
    relative_reloc = false;
2565
0
    if (h != NULL)
2566
0
      {
2567
0
        off = h->got.offset;
2568
0
        if (RESOLVED_LOCALLY_P (info, h, htab))
2569
0
    {
2570
      /* We must initialize this entry in the global offset
2571
         table.  Since the offset must always be a multiple
2572
         of 4, we use the least significant bit to record
2573
         whether we have initialized it already.
2574
2575
         When doing a dynamic link, we create a .rel.got
2576
         relocation entry to initialize the value.  This
2577
         is done in the finish_dynamic_symbol routine.  */
2578
0
      if ((off & 1) != 0)
2579
0
        off &= ~1;
2580
0
      else
2581
0
        {
2582
0
          bfd_put_32 (output_bfd, relocation,
2583
0
          htab->elf.sgot->contents + off);
2584
0
          h->got.offset |= 1;
2585
          /* NB: Don't generate relative relocation here if
2586
       it has been generated by DT_RELR.  */
2587
0
          if (!info->enable_dt_relr
2588
0
        && GENERATE_RELATIVE_RELOC_P (info, h))
2589
0
      {
2590
        /* PR ld/21402: If this symbol isn't dynamic
2591
           in PIC, generate R_386_RELATIVE here.  */
2592
0
        eh->no_finish_dynamic_symbol = 1;
2593
0
        relative_reloc = true;
2594
0
      }
2595
0
        }
2596
0
    }
2597
0
        else
2598
0
    unresolved_reloc = false;
2599
0
      }
2600
0
    else
2601
0
      {
2602
0
        if (local_got_offsets == NULL)
2603
0
    abort ();
2604
2605
0
        off = local_got_offsets[r_symndx];
2606
2607
        /* The offset must always be a multiple of 4.  We use
2608
     the least significant bit to record whether we have
2609
     already generated the necessary reloc.  */
2610
0
        if ((off & 1) != 0)
2611
0
    off &= ~1;
2612
0
        else
2613
0
    {
2614
0
      bfd_put_32 (output_bfd, relocation,
2615
0
            htab->elf.sgot->contents + off);
2616
0
      local_got_offsets[r_symndx] |= 1;
2617
2618
      /* NB: Don't generate relative relocation here if it
2619
         has been generated by DT_RELR.  */
2620
0
      if (!info->enable_dt_relr && bfd_link_pic (info))
2621
0
        relative_reloc = true;
2622
0
    }
2623
0
      }
2624
2625
0
    if (relative_reloc)
2626
0
      {
2627
0
        asection *s;
2628
0
        Elf_Internal_Rela outrel;
2629
2630
0
        s = htab->elf.srelgot;
2631
0
        if (s == NULL)
2632
0
    abort ();
2633
2634
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
2635
0
         + htab->elf.sgot->output_offset
2636
0
         + off);
2637
0
        outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2638
2639
0
        if (htab->params->report_relative_reloc)
2640
0
    _bfd_x86_elf_link_report_relative_reloc
2641
0
      (info, input_section, h, sym, "R_386_RELATIVE",
2642
0
       &outrel);
2643
2644
0
        elf_append_rel (output_bfd, s, &outrel);
2645
0
      }
2646
2647
0
    if (off >= (bfd_vma) -2)
2648
0
      abort ();
2649
2650
0
    relocation = (htab->elf.sgot->output_section->vma
2651
0
      + htab->elf.sgot->output_offset + off);
2652
0
    if (rel->r_offset > 1
2653
0
        && (*(contents + rel->r_offset - 1) & 0xc7) == 0x5
2654
0
        && *(contents + rel->r_offset - 2) != 0x8d)
2655
0
      {
2656
0
        if (bfd_link_pic (info))
2657
0
    {
2658
      /* For PIC, disallow R_386_GOT32 without a base
2659
         register, except for "lea foo@GOT, %reg", since
2660
         we don't know what the GOT base is.  */
2661
0
      const char *name;
2662
2663
0
    disallow_got32:
2664
0
      if (h == NULL || h->root.root.string == NULL)
2665
0
        name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2666
0
               NULL);
2667
0
      else
2668
0
        name = h->root.root.string;
2669
2670
0
      _bfd_error_handler
2671
        /* xgettext:c-format */
2672
0
        (_("%pB: direct GOT relocation %s against `%s'"
2673
0
           " without base register can not be used"
2674
0
           " when making a shared object"),
2675
0
         input_bfd, howto->name, name);
2676
0
      bfd_set_error (bfd_error_bad_value);
2677
0
      return false;
2678
0
    }
2679
0
      }
2680
0
    else
2681
0
      {
2682
        /* Subtract the .got.plt section address only with a base
2683
     register.  */
2684
0
        relocation -= (htab->elf.sgotplt->output_section->vma
2685
0
           + htab->elf.sgotplt->output_offset);
2686
0
      }
2687
2688
0
    break;
2689
2690
0
  case R_386_GOTOFF:
2691
    /* Relocation is relative to the start of the global offset
2692
       table.  */
2693
2694
    /* Check to make sure it isn't a protected function or data
2695
       symbol for shared library since it may not be local when
2696
       used as function address or with copy relocation.  We also
2697
       need to make sure that a symbol is referenced locally.  */
2698
0
    if (!bfd_link_executable (info) && h)
2699
0
      {
2700
0
        if (!h->def_regular)
2701
0
    {
2702
0
      const char *v;
2703
2704
0
      switch (ELF_ST_VISIBILITY (h->other))
2705
0
        {
2706
0
        case STV_HIDDEN:
2707
0
          v = _("hidden symbol");
2708
0
          break;
2709
0
        case STV_INTERNAL:
2710
0
          v = _("internal symbol");
2711
0
          break;
2712
0
        case STV_PROTECTED:
2713
0
          v = _("protected symbol");
2714
0
          break;
2715
0
        default:
2716
0
          v = _("symbol");
2717
0
          break;
2718
0
        }
2719
2720
0
      _bfd_error_handler
2721
        /* xgettext:c-format */
2722
0
        (_("%pB: relocation R_386_GOTOFF against undefined %s"
2723
0
           " `%s' can not be used when making a shared object"),
2724
0
         input_bfd, v, h->root.root.string);
2725
0
      bfd_set_error (bfd_error_bad_value);
2726
0
      return false;
2727
0
    }
2728
0
        else if (!SYMBOL_REFERENCES_LOCAL_P (info, h)
2729
0
           && (h->type == STT_FUNC
2730
0
         || h->type == STT_OBJECT)
2731
0
           && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2732
0
    {
2733
0
      _bfd_error_handler
2734
        /* xgettext:c-format */
2735
0
        (_("%pB: relocation R_386_GOTOFF against protected %s"
2736
0
           " `%s' can not be used when making a shared object"),
2737
0
         input_bfd,
2738
0
         h->type == STT_FUNC ? "function" : "data",
2739
0
         h->root.root.string);
2740
0
      bfd_set_error (bfd_error_bad_value);
2741
0
      return false;
2742
0
    }
2743
0
      }
2744
2745
    /* Note that sgot is not involved in this
2746
       calculation.  We always want the start of .got.plt.  If we
2747
       defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2748
       permitted by the ABI, we might have to change this
2749
       calculation.  */
2750
0
    relocation -= htab->elf.sgotplt->output_section->vma
2751
0
      + htab->elf.sgotplt->output_offset;
2752
0
    break;
2753
2754
0
  case R_386_GOTPC:
2755
    /* Use global offset table as symbol value.  */
2756
0
    relocation = htab->elf.sgotplt->output_section->vma
2757
0
           + htab->elf.sgotplt->output_offset;
2758
0
    unresolved_reloc = false;
2759
0
    break;
2760
2761
0
  case R_386_PLT32:
2762
    /* Relocation is to the entry for this symbol in the
2763
       procedure linkage table.  */
2764
2765
    /* Resolve a PLT32 reloc against a local symbol directly,
2766
       without using the procedure linkage table.  */
2767
0
    if (h == NULL)
2768
0
      break;
2769
2770
0
    if ((h->plt.offset == (bfd_vma) -1
2771
0
         && eh->plt_got.offset == (bfd_vma) -1)
2772
0
        || htab->elf.splt == NULL)
2773
0
      {
2774
        /* We didn't make a PLT entry for this symbol.  This
2775
     happens when statically linking PIC code, or when
2776
     using -Bsymbolic.  */
2777
0
        break;
2778
0
      }
2779
2780
0
    if (h->plt.offset != (bfd_vma) -1)
2781
0
      {
2782
0
        if (htab->plt_second != NULL)
2783
0
    {
2784
0
      resolved_plt = htab->plt_second;
2785
0
      plt_offset = eh->plt_second.offset;
2786
0
    }
2787
0
        else
2788
0
    {
2789
0
      resolved_plt = htab->elf.splt;
2790
0
      plt_offset = h->plt.offset;
2791
0
    }
2792
0
      }
2793
0
    else
2794
0
      {
2795
0
        resolved_plt = htab->plt_got;
2796
0
        plt_offset = eh->plt_got.offset;
2797
0
      }
2798
2799
0
    relocation = (resolved_plt->output_section->vma
2800
0
      + resolved_plt->output_offset
2801
0
      + plt_offset);
2802
0
    unresolved_reloc = false;
2803
0
    break;
2804
2805
0
  case R_386_SIZE32:
2806
    /* Set to symbol size.  */
2807
0
    relocation = st_size;
2808
    /* Fall through.  */
2809
2810
0
  case R_386_32:
2811
0
  case R_386_PC32:
2812
0
    if ((input_section->flags & SEC_ALLOC) == 0
2813
0
        || is_vxworks_tls)
2814
0
      break;
2815
2816
0
    if (GENERATE_DYNAMIC_RELOCATION_P (false, info, eh, r_type,
2817
0
               sec, false,
2818
0
               resolved_to_zero,
2819
0
               (r_type == R_386_PC32)))
2820
0
      {
2821
0
        Elf_Internal_Rela outrel;
2822
0
        bool skip, relocate;
2823
0
        bool generate_dynamic_reloc = true;
2824
0
        asection *sreloc;
2825
2826
        /* When generating a shared object, these relocations
2827
     are copied into the output file to be resolved at run
2828
     time.  */
2829
2830
0
        skip = false;
2831
0
        relocate = false;
2832
2833
0
        outrel.r_offset =
2834
0
    _bfd_elf_section_offset (output_bfd, info, input_section,
2835
0
           rel->r_offset);
2836
0
        if (outrel.r_offset == (bfd_vma) -1)
2837
0
    skip = true;
2838
0
        else if (outrel.r_offset == (bfd_vma) -2)
2839
0
    skip = true, relocate = true;
2840
0
        outrel.r_offset += (input_section->output_section->vma
2841
0
          + input_section->output_offset);
2842
2843
0
        if (skip)
2844
0
    memset (&outrel, 0, sizeof outrel);
2845
0
        else if (COPY_INPUT_RELOC_P (false, info, h, r_type))
2846
0
    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2847
0
        else
2848
0
    {
2849
      /* This symbol is local, or marked to become local.  */
2850
0
      relocate = true;
2851
      /* NB: Don't generate relative relocation here if it
2852
         has been generated by DT_RELR.  */
2853
0
      if (info->enable_dt_relr)
2854
0
        generate_dynamic_reloc = false;
2855
0
      else
2856
0
        {
2857
0
          outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2858
2859
0
          if (htab->params->report_relative_reloc)
2860
0
      _bfd_x86_elf_link_report_relative_reloc
2861
0
        (info, input_section, h, sym, "R_386_RELATIVE",
2862
0
         &outrel);
2863
0
        }
2864
0
    }
2865
2866
0
        if (generate_dynamic_reloc)
2867
0
    {
2868
0
      sreloc = elf_section_data (input_section)->sreloc;
2869
2870
0
      if (sreloc == NULL || sreloc->contents == NULL)
2871
0
        {
2872
0
          r = bfd_reloc_notsupported;
2873
0
          goto check_relocation_error;
2874
0
        }
2875
2876
0
      elf_append_rel (output_bfd, sreloc, &outrel);
2877
0
    }
2878
2879
        /* If this reloc is against an external symbol, we do
2880
     not want to fiddle with the addend.  Otherwise, we
2881
     need to include the symbol value so that it becomes
2882
     an addend for the dynamic reloc.  */
2883
0
        if (! relocate)
2884
0
    continue;
2885
0
      }
2886
0
    break;
2887
2888
0
  case R_386_TLS_IE:
2889
0
    if (!bfd_link_executable (info))
2890
0
      {
2891
0
        Elf_Internal_Rela outrel;
2892
0
        asection *sreloc;
2893
2894
0
        outrel.r_offset = rel->r_offset
2895
0
        + input_section->output_section->vma
2896
0
        + input_section->output_offset;
2897
0
        outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2898
2899
0
        if (htab->params->report_relative_reloc)
2900
0
    _bfd_x86_elf_link_report_relative_reloc
2901
0
      (info, input_section, h, sym, "R_386_RELATIVE",
2902
0
       &outrel);
2903
2904
0
        sreloc = elf_section_data (input_section)->sreloc;
2905
0
        if (sreloc == NULL)
2906
0
    abort ();
2907
0
        elf_append_rel (output_bfd, sreloc, &outrel);
2908
0
      }
2909
    /* Fall through */
2910
2911
0
  case R_386_TLS_GD:
2912
0
  case R_386_TLS_GOTDESC:
2913
0
  case R_386_TLS_DESC_CALL:
2914
0
  case R_386_TLS_IE_32:
2915
0
  case R_386_TLS_GOTIE:
2916
0
    tls_type = GOT_UNKNOWN;
2917
0
    if (h == NULL && local_got_offsets)
2918
0
      tls_type = elf_x86_local_got_tls_type (input_bfd) [r_symndx];
2919
0
    else if (h != NULL)
2920
0
      tls_type = elf_x86_hash_entry(h)->tls_type;
2921
0
    if (tls_type == GOT_TLS_IE)
2922
0
      tls_type = GOT_TLS_IE_NEG;
2923
2924
0
     r_type_tls = r_type;
2925
0
    if (! elf_i386_tls_transition (info, input_bfd,
2926
0
           input_section, contents,
2927
0
           symtab_hdr, sym_hashes,
2928
0
           &r_type_tls, tls_type, rel,
2929
0
           relend, h, sym, true))
2930
0
      return false;
2931
2932
0
    expected_tls_le = htab->elf.target_os == is_solaris
2933
0
      ? R_386_TLS_LE : R_386_TLS_LE_32;
2934
0
    if (r_type_tls == expected_tls_le)
2935
0
      {
2936
        /* NB: Solaris only supports R_386_TLS_GD->R_386_TLS_LE.  */
2937
0
        BFD_ASSERT (! unresolved_reloc
2938
0
        && (htab->elf.target_os != is_solaris
2939
0
            || (htab->elf.target_os == is_solaris
2940
0
          && (r_type == R_386_TLS_GD
2941
0
              || r_type == R_386_TLS_IE
2942
0
              || r_type == R_386_TLS_GOTIE))));
2943
0
        if (r_type == R_386_TLS_GD)
2944
0
    {
2945
0
      unsigned int type;
2946
0
      bfd_vma roff;
2947
2948
      /* GD->LE transition.  */
2949
0
      type = *(contents + rel->r_offset - 2);
2950
0
      if (type == 0x04)
2951
0
        {
2952
          /* Change
2953
        leal foo@tlsgd(,%ebx,1), %eax
2954
        call ___tls_get_addr@PLT
2955
       into:
2956
        movl %gs:0, %eax
2957
        subl $foo@tpoff, %eax
2958
       (6 byte form of subl).  */
2959
0
          roff = rel->r_offset + 5;
2960
0
        }
2961
0
      else
2962
0
        {
2963
          /* Change
2964
        leal foo@tlsgd(%ebx), %eax
2965
        call ___tls_get_addr@PLT
2966
        nop
2967
       or
2968
        leal foo@tlsgd(%reg), %eax
2969
        call *___tls_get_addr@GOT(%reg)
2970
        which may be converted to
2971
        addr32 call ___tls_get_addr
2972
       into:
2973
        movl %gs:0, %eax; subl $foo@tpoff, %eax
2974
       (6 byte form of subl).  */
2975
0
          roff = rel->r_offset + 6;
2976
0
        }
2977
0
      memcpy (contents + roff - 8,
2978
0
        "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2979
0
      bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
2980
0
            contents + roff);
2981
      /* Skip R_386_PC32, R_386_PLT32 and R_386_GOT32X.  */
2982
0
      rel++;
2983
0
      wrel++;
2984
0
      continue;
2985
0
    }
2986
0
        else if (r_type == R_386_TLS_GOTDESC)
2987
0
    {
2988
      /* GDesc -> LE transition.
2989
         It's originally something like:
2990
         leal x@tlsdesc(%ebx), %eax
2991
2992
         leal x@ntpoff, %eax
2993
2994
         Registers other than %eax may be set up here.  */
2995
2996
0
      unsigned int val;
2997
0
      bfd_vma roff;
2998
2999
0
      roff = rel->r_offset;
3000
0
      val = bfd_get_8 (input_bfd, contents + roff - 1);
3001
3002
      /* Now modify the instruction as appropriate.  */
3003
      /* aoliva FIXME: remove the above and xor the byte
3004
         below with 0x86.  */
3005
0
      bfd_put_8 (output_bfd, val ^ 0x86,
3006
0
           contents + roff - 1);
3007
0
      bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3008
0
            contents + roff);
3009
0
      continue;
3010
0
    }
3011
0
        else if (r_type == R_386_TLS_DESC_CALL)
3012
0
    {
3013
      /* GDesc -> LE transition.
3014
         It's originally:
3015
         call *(%eax)
3016
         Turn it into:
3017
         xchg %ax,%ax  */
3018
3019
0
      bfd_vma roff;
3020
3021
0
      roff = rel->r_offset;
3022
0
      bfd_put_8 (output_bfd, 0x66, contents + roff);
3023
0
      bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3024
0
      continue;
3025
0
    }
3026
0
        else if (r_type == R_386_TLS_IE)
3027
0
    {
3028
0
      unsigned int val;
3029
3030
      /* IE->LE transition:
3031
         Originally it can be one of:
3032
         movl foo, %eax
3033
         movl foo, %reg
3034
         addl foo, %reg
3035
         We change it into:
3036
         movl $foo, %eax
3037
         movl $foo, %reg
3038
         addl $foo, %reg.  */
3039
0
      val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3040
0
      if (val == 0xa1)
3041
0
        {
3042
          /* movl foo, %eax.  */
3043
0
          bfd_put_8 (output_bfd, 0xb8,
3044
0
         contents + rel->r_offset - 1);
3045
0
        }
3046
0
      else
3047
0
        {
3048
0
          unsigned int type;
3049
3050
0
          type = bfd_get_8 (input_bfd,
3051
0
          contents + rel->r_offset - 2);
3052
0
          switch (type)
3053
0
      {
3054
0
      case 0x8b:
3055
        /* movl */
3056
0
        bfd_put_8 (output_bfd, 0xc7,
3057
0
             contents + rel->r_offset - 2);
3058
0
        bfd_put_8 (output_bfd,
3059
0
             0xc0 | ((val >> 3) & 7),
3060
0
             contents + rel->r_offset - 1);
3061
0
        break;
3062
0
      case 0x03:
3063
        /* addl */
3064
0
        bfd_put_8 (output_bfd, 0x81,
3065
0
             contents + rel->r_offset - 2);
3066
0
        bfd_put_8 (output_bfd,
3067
0
             0xc0 | ((val >> 3) & 7),
3068
0
             contents + rel->r_offset - 1);
3069
0
        break;
3070
0
      default:
3071
0
        BFD_FAIL ();
3072
0
        break;
3073
0
      }
3074
0
        }
3075
0
      bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3076
0
            contents + rel->r_offset);
3077
0
      continue;
3078
0
    }
3079
0
        else
3080
0
    {
3081
0
      unsigned int val, type;
3082
3083
      /* {IE_32,GOTIE}->LE transition:
3084
         Originally it can be one of:
3085
         subl foo(%reg1), %reg2
3086
         movl foo(%reg1), %reg2
3087
         addl foo(%reg1), %reg2
3088
         We change it into:
3089
         subl $foo, %reg2
3090
         movl $foo, %reg2 (6 byte form)
3091
         addl $foo, %reg2.  */
3092
0
      type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3093
0
      val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3094
0
      if (type == 0x8b)
3095
0
        {
3096
          /* movl */
3097
0
          bfd_put_8 (output_bfd, 0xc7,
3098
0
         contents + rel->r_offset - 2);
3099
0
          bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3100
0
         contents + rel->r_offset - 1);
3101
0
        }
3102
0
      else if (type == 0x2b)
3103
0
        {
3104
          /* subl */
3105
0
          bfd_put_8 (output_bfd, 0x81,
3106
0
         contents + rel->r_offset - 2);
3107
0
          bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
3108
0
         contents + rel->r_offset - 1);
3109
0
        }
3110
0
      else if (type == 0x03)
3111
0
        {
3112
          /* addl */
3113
0
          bfd_put_8 (output_bfd, 0x81,
3114
0
         contents + rel->r_offset - 2);
3115
0
          bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3116
0
         contents + rel->r_offset - 1);
3117
0
        }
3118
0
      else
3119
0
        BFD_FAIL ();
3120
0
      if (r_type == R_386_TLS_GOTIE)
3121
0
        bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3122
0
        contents + rel->r_offset);
3123
0
      else
3124
0
        bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
3125
0
        contents + rel->r_offset);
3126
0
      continue;
3127
0
    }
3128
0
      }
3129
3130
0
    if (htab->elf.sgot == NULL)
3131
0
      abort ();
3132
3133
0
    if (h != NULL)
3134
0
      {
3135
0
        off = h->got.offset;
3136
0
        offplt = elf_x86_hash_entry (h)->tlsdesc_got;
3137
0
      }
3138
0
    else
3139
0
      {
3140
0
        if (local_got_offsets == NULL)
3141
0
    abort ();
3142
3143
0
        off = local_got_offsets[r_symndx];
3144
0
        offplt = local_tlsdesc_gotents[r_symndx];
3145
0
      }
3146
3147
0
    if ((off & 1) != 0)
3148
0
      off &= ~1;
3149
0
    else
3150
0
      {
3151
0
        Elf_Internal_Rela outrel;
3152
0
        int dr_type;
3153
0
        asection *sreloc;
3154
3155
0
        if (htab->elf.srelgot == NULL)
3156
0
    abort ();
3157
3158
0
        indx = h && h->dynindx != -1 ? h->dynindx : 0;
3159
3160
0
        if (GOT_TLS_GDESC_P (tls_type))
3161
0
    {
3162
0
      bfd_byte *loc;
3163
0
      outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
3164
0
      BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
3165
0
            <= htab->elf.sgotplt->size);
3166
0
      outrel.r_offset = (htab->elf.sgotplt->output_section->vma
3167
0
             + htab->elf.sgotplt->output_offset
3168
0
             + offplt
3169
0
             + htab->sgotplt_jump_table_size);
3170
0
      sreloc = htab->elf.srelplt;
3171
0
      loc = sreloc->contents;
3172
0
      loc += (htab->next_tls_desc_index++
3173
0
        * sizeof (Elf32_External_Rel));
3174
0
      BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
3175
0
            <= sreloc->contents + sreloc->size);
3176
0
      bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3177
0
      if (indx == 0)
3178
0
        {
3179
0
          BFD_ASSERT (! unresolved_reloc);
3180
0
          bfd_put_32 (output_bfd,
3181
0
          relocation - _bfd_x86_elf_dtpoff_base (info),
3182
0
          htab->elf.sgotplt->contents + offplt
3183
0
          + htab->sgotplt_jump_table_size + 4);
3184
0
        }
3185
0
      else
3186
0
        {
3187
0
          bfd_put_32 (output_bfd, 0,
3188
0
          htab->elf.sgotplt->contents + offplt
3189
0
          + htab->sgotplt_jump_table_size + 4);
3190
0
        }
3191
0
    }
3192
3193
0
        sreloc = htab->elf.srelgot;
3194
3195
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3196
0
         + htab->elf.sgot->output_offset + off);
3197
3198
0
        if (GOT_TLS_GD_P (tls_type))
3199
0
    dr_type = R_386_TLS_DTPMOD32;
3200
0
        else if (GOT_TLS_GDESC_P (tls_type))
3201
0
    goto dr_done;
3202
0
        else if (tls_type == GOT_TLS_IE_POS)
3203
0
    dr_type = R_386_TLS_TPOFF;
3204
0
        else
3205
0
    dr_type = R_386_TLS_TPOFF32;
3206
3207
0
        if (dr_type == R_386_TLS_TPOFF && indx == 0)
3208
0
    bfd_put_32 (output_bfd,
3209
0
          relocation - _bfd_x86_elf_dtpoff_base (info),
3210
0
          htab->elf.sgot->contents + off);
3211
0
        else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
3212
0
    bfd_put_32 (output_bfd,
3213
0
          _bfd_x86_elf_dtpoff_base (info) - relocation,
3214
0
          htab->elf.sgot->contents + off);
3215
0
        else if (dr_type != R_386_TLS_DESC)
3216
0
    bfd_put_32 (output_bfd, 0,
3217
0
          htab->elf.sgot->contents + off);
3218
0
        outrel.r_info = ELF32_R_INFO (indx, dr_type);
3219
3220
0
        elf_append_rel (output_bfd, sreloc, &outrel);
3221
3222
0
        if (GOT_TLS_GD_P (tls_type))
3223
0
    {
3224
0
      if (indx == 0)
3225
0
        {
3226
0
          BFD_ASSERT (! unresolved_reloc);
3227
0
          bfd_put_32 (output_bfd,
3228
0
          relocation - _bfd_x86_elf_dtpoff_base (info),
3229
0
          htab->elf.sgot->contents + off + 4);
3230
0
        }
3231
0
      else
3232
0
        {
3233
0
          bfd_put_32 (output_bfd, 0,
3234
0
          htab->elf.sgot->contents + off + 4);
3235
0
          outrel.r_info = ELF32_R_INFO (indx,
3236
0
                R_386_TLS_DTPOFF32);
3237
0
          outrel.r_offset += 4;
3238
0
          elf_append_rel (output_bfd, sreloc, &outrel);
3239
0
        }
3240
0
    }
3241
0
        else if (tls_type == GOT_TLS_IE_BOTH)
3242
0
    {
3243
0
      bfd_put_32 (output_bfd,
3244
0
            (indx == 0
3245
0
             ? relocation - _bfd_x86_elf_dtpoff_base (info)
3246
0
             : 0),
3247
0
            htab->elf.sgot->contents + off + 4);
3248
0
      outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3249
0
      outrel.r_offset += 4;
3250
0
      elf_append_rel (output_bfd, sreloc, &outrel);
3251
0
    }
3252
3253
0
      dr_done:
3254
0
        if (h != NULL)
3255
0
    h->got.offset |= 1;
3256
0
        else
3257
0
    local_got_offsets[r_symndx] |= 1;
3258
0
      }
3259
3260
0
    if (off >= (bfd_vma) -2
3261
0
        && ! GOT_TLS_GDESC_P (tls_type))
3262
0
      abort ();
3263
0
    if (r_type_tls == R_386_TLS_GOTDESC
3264
0
        || r_type_tls == R_386_TLS_DESC_CALL)
3265
0
      {
3266
0
        relocation = htab->sgotplt_jump_table_size + offplt;
3267
0
        unresolved_reloc = false;
3268
0
      }
3269
0
    else if (r_type_tls == r_type)
3270
0
      {
3271
0
        bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
3272
0
            + htab->elf.sgotplt->output_offset;
3273
0
        relocation = htab->elf.sgot->output_section->vma
3274
0
    + htab->elf.sgot->output_offset + off - g_o_t;
3275
0
        if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
3276
0
      && tls_type == GOT_TLS_IE_BOTH)
3277
0
    relocation += 4;
3278
0
        if (r_type == R_386_TLS_IE)
3279
0
    relocation += g_o_t;
3280
0
        unresolved_reloc = false;
3281
0
      }
3282
0
    else if (r_type == R_386_TLS_GD)
3283
0
      {
3284
0
        unsigned int val, type;
3285
0
        bfd_vma roff;
3286
3287
        /* GD->IE transition.  */
3288
0
        type = *(contents + rel->r_offset - 2);
3289
0
        val = *(contents + rel->r_offset - 1);
3290
0
        if (type == 0x04)
3291
0
    {
3292
      /* Change
3293
      leal foo@tlsgd(,%ebx,1), %eax
3294
      call ___tls_get_addr@PLT
3295
         into:
3296
      movl %gs:0, %eax
3297
      subl $foo@gottpoff(%ebx), %eax.  */
3298
0
      val >>= 3;
3299
0
      roff = rel->r_offset - 3;
3300
0
    }
3301
0
        else
3302
0
    {
3303
      /* Change
3304
      leal foo@tlsgd(%ebx), %eax
3305
      call ___tls_get_addr@PLT
3306
      nop
3307
         or
3308
      leal foo@tlsgd(%reg), %eax
3309
      call *___tls_get_addr@GOT(%reg)
3310
      which may be converted to
3311
      addr32 call ___tls_get_addr
3312
         into:
3313
      movl %gs:0, %eax;
3314
      subl $foo@gottpoff(%reg), %eax.  */
3315
0
      roff = rel->r_offset - 2;
3316
0
    }
3317
0
        memcpy (contents + roff,
3318
0
          "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
3319
0
        contents[roff + 7] = 0x80 | (val & 7);
3320
        /* If foo is used only with foo@gotntpoff(%reg) and
3321
     foo@indntpoff, but not with foo@gottpoff(%reg), change
3322
     subl $foo@gottpoff(%reg), %eax
3323
     into:
3324
     addl $foo@gotntpoff(%reg), %eax.  */
3325
0
        if (tls_type == GOT_TLS_IE_POS)
3326
0
    contents[roff + 6] = 0x03;
3327
0
        bfd_put_32 (output_bfd,
3328
0
        htab->elf.sgot->output_section->vma
3329
0
        + htab->elf.sgot->output_offset + off
3330
0
        - htab->elf.sgotplt->output_section->vma
3331
0
        - htab->elf.sgotplt->output_offset,
3332
0
        contents + roff + 8);
3333
        /* Skip R_386_PLT32 and R_386_GOT32X.  */
3334
0
        rel++;
3335
0
        wrel++;
3336
0
        continue;
3337
0
      }
3338
0
    else if (r_type == R_386_TLS_GOTDESC)
3339
0
      {
3340
        /* GDesc -> IE transition.
3341
     It's originally something like:
3342
     leal x@tlsdesc(%ebx), %eax
3343
3344
     Change it to:
3345
     movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
3346
     or:
3347
     movl x@gottpoff(%ebx), %eax # before negl %eax
3348
3349
     Registers other than %eax may be set up here.  */
3350
3351
0
        bfd_vma roff;
3352
3353
        /* First, make sure it's a leal adding ebx to a 32-bit
3354
     offset into any register, although it's probably
3355
     almost always going to be eax.  */
3356
0
        roff = rel->r_offset;
3357
3358
        /* Now modify the instruction as appropriate.  */
3359
        /* To turn a leal into a movl in the form we use it, it
3360
     suffices to change the first byte from 0x8d to 0x8b.
3361
     aoliva FIXME: should we decide to keep the leal, all
3362
     we have to do is remove the statement below, and
3363
     adjust the relaxation of R_386_TLS_DESC_CALL.  */
3364
0
        bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
3365
3366
0
        if (tls_type == GOT_TLS_IE_BOTH)
3367
0
    off += 4;
3368
3369
0
        bfd_put_32 (output_bfd,
3370
0
        htab->elf.sgot->output_section->vma
3371
0
        + htab->elf.sgot->output_offset + off
3372
0
        - htab->elf.sgotplt->output_section->vma
3373
0
        - htab->elf.sgotplt->output_offset,
3374
0
        contents + roff);
3375
0
        continue;
3376
0
      }
3377
0
    else if (r_type == R_386_TLS_DESC_CALL)
3378
0
      {
3379
        /* GDesc -> IE transition.
3380
     It's originally:
3381
     call *(%eax)
3382
3383
     Change it to:
3384
     xchg %ax,%ax
3385
     or
3386
     negl %eax
3387
     depending on how we transformed the TLS_GOTDESC above.
3388
        */
3389
3390
0
        bfd_vma roff;
3391
3392
0
        roff = rel->r_offset;
3393
3394
        /* Now modify the instruction as appropriate.  */
3395
0
        if (tls_type != GOT_TLS_IE_NEG)
3396
0
    {
3397
      /* xchg %ax,%ax */
3398
0
      bfd_put_8 (output_bfd, 0x66, contents + roff);
3399
0
      bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3400
0
    }
3401
0
        else
3402
0
    {
3403
      /* negl %eax */
3404
0
      bfd_put_8 (output_bfd, 0xf7, contents + roff);
3405
0
      bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
3406
0
    }
3407
3408
0
        continue;
3409
0
      }
3410
0
    else
3411
0
      BFD_ASSERT (false);
3412
0
    break;
3413
3414
0
  case R_386_TLS_LDM:
3415
0
    if (! elf_i386_tls_transition (info, input_bfd,
3416
0
           input_section, contents,
3417
0
           symtab_hdr, sym_hashes,
3418
0
           &r_type, GOT_UNKNOWN, rel,
3419
0
           relend, h, sym, true))
3420
0
      return false;
3421
3422
0
    if (r_type != R_386_TLS_LDM)
3423
0
      {
3424
        /* LD->LE transition.  Change
3425
      leal foo@tlsldm(%ebx) %eax
3426
      call ___tls_get_addr@PLT
3427
     into:
3428
      movl %gs:0, %eax
3429
      nop
3430
      leal 0(%esi,1), %esi
3431
     or change
3432
      leal foo@tlsldm(%reg) %eax
3433
      call *___tls_get_addr@GOT(%reg)
3434
      which may be converted to
3435
      addr32 call ___tls_get_addr
3436
     into:
3437
      movl %gs:0, %eax
3438
      leal 0(%esi), %esi  */
3439
0
        expected_tls_le = htab->elf.target_os == is_solaris
3440
0
    ? R_386_TLS_LE : R_386_TLS_LE_32;
3441
0
        BFD_ASSERT (r_type == expected_tls_le);
3442
0
        if (*(contents + rel->r_offset + 4) == 0xff
3443
0
      || *(contents + rel->r_offset + 4) == 0x67)
3444
0
    memcpy (contents + rel->r_offset - 2,
3445
0
      "\x65\xa1\0\0\0\0\x8d\xb6\0\0\0", 12);
3446
0
        else
3447
0
    memcpy (contents + rel->r_offset - 2,
3448
0
      "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
3449
        /* Skip R_386_PC32/R_386_PLT32.  */
3450
0
        rel++;
3451
0
        wrel++;
3452
0
        continue;
3453
0
      }
3454
3455
0
    if (htab->elf.sgot == NULL)
3456
0
      abort ();
3457
3458
0
    off = htab->tls_ld_or_ldm_got.offset;
3459
0
    if (off & 1)
3460
0
      off &= ~1;
3461
0
    else
3462
0
      {
3463
0
        Elf_Internal_Rela outrel;
3464
3465
0
        if (htab->elf.srelgot == NULL)
3466
0
    abort ();
3467
3468
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3469
0
         + htab->elf.sgot->output_offset + off);
3470
3471
0
        bfd_put_32 (output_bfd, 0,
3472
0
        htab->elf.sgot->contents + off);
3473
0
        bfd_put_32 (output_bfd, 0,
3474
0
        htab->elf.sgot->contents + off + 4);
3475
0
        outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
3476
0
        elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
3477
0
        htab->tls_ld_or_ldm_got.offset |= 1;
3478
0
      }
3479
0
    relocation = htab->elf.sgot->output_section->vma
3480
0
           + htab->elf.sgot->output_offset + off
3481
0
           - htab->elf.sgotplt->output_section->vma
3482
0
           - htab->elf.sgotplt->output_offset;
3483
0
    unresolved_reloc = false;
3484
0
    break;
3485
3486
0
  case R_386_TLS_LDO_32:
3487
0
    if (!bfd_link_executable (info)
3488
0
        || (input_section->flags & SEC_CODE) == 0)
3489
0
      relocation -= _bfd_x86_elf_dtpoff_base (info);
3490
0
    else
3491
      /* When converting LDO to LE, we must negate.  */
3492
0
      relocation = -elf_i386_tpoff (info, relocation);
3493
0
    break;
3494
3495
0
  case R_386_TLS_LE_32:
3496
0
  case R_386_TLS_LE:
3497
0
    if (!bfd_link_executable (info))
3498
0
      {
3499
0
        Elf_Internal_Rela outrel;
3500
0
        asection *sreloc;
3501
3502
0
        outrel.r_offset = rel->r_offset
3503
0
        + input_section->output_section->vma
3504
0
        + input_section->output_offset;
3505
0
        if (h != NULL && h->dynindx != -1)
3506
0
    indx = h->dynindx;
3507
0
        else
3508
0
    indx = 0;
3509
0
        if (r_type == R_386_TLS_LE_32)
3510
0
    outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
3511
0
        else
3512
0
    outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3513
0
        sreloc = elf_section_data (input_section)->sreloc;
3514
0
        if (sreloc == NULL)
3515
0
    abort ();
3516
0
        elf_append_rel (output_bfd, sreloc, &outrel);
3517
0
        if (indx)
3518
0
    continue;
3519
0
        else if (r_type == R_386_TLS_LE_32)
3520
0
    relocation = _bfd_x86_elf_dtpoff_base (info) - relocation;
3521
0
        else
3522
0
    relocation -= _bfd_x86_elf_dtpoff_base (info);
3523
0
      }
3524
0
    else if (r_type == R_386_TLS_LE_32)
3525
0
      relocation = elf_i386_tpoff (info, relocation);
3526
0
    else
3527
0
      relocation = -elf_i386_tpoff (info, relocation);
3528
0
    break;
3529
3530
0
  default:
3531
0
    break;
3532
0
  }
3533
3534
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3535
   because such sections are not SEC_ALLOC and thus ld.so will
3536
   not process them.  */
3537
0
      if (unresolved_reloc
3538
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
3539
0
         && h->def_dynamic)
3540
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
3541
0
              rel->r_offset) != (bfd_vma) -1)
3542
0
  {
3543
0
    _bfd_error_handler
3544
      /* xgettext:c-format */
3545
0
      (_("%pB(%pA+%#" PRIx64 "): unresolvable %s relocation against symbol `%s'"),
3546
0
       input_bfd,
3547
0
       input_section,
3548
0
       (uint64_t) rel->r_offset,
3549
0
       howto->name,
3550
0
       h->root.root.string);
3551
0
    return false;
3552
0
  }
3553
3554
0
    do_relocation:
3555
0
      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3556
0
            contents, rel->r_offset,
3557
0
            relocation, 0);
3558
3559
0
    check_relocation_error:
3560
0
      if (r != bfd_reloc_ok)
3561
0
  {
3562
0
    const char *name;
3563
3564
0
    if (h != NULL)
3565
0
      name = h->root.root.string;
3566
0
    else
3567
0
      {
3568
0
        name = bfd_elf_string_from_elf_section (input_bfd,
3569
0
                  symtab_hdr->sh_link,
3570
0
                  sym->st_name);
3571
0
        if (name == NULL)
3572
0
    return false;
3573
0
        if (*name == '\0')
3574
0
    name = bfd_section_name (sec);
3575
0
      }
3576
3577
0
    if (r == bfd_reloc_overflow)
3578
0
      (*info->callbacks->reloc_overflow)
3579
0
        (info, (h ? &h->root : NULL), name, howto->name,
3580
0
         (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3581
0
    else
3582
0
      {
3583
0
        _bfd_error_handler
3584
    /* xgettext:c-format */
3585
0
    (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"),
3586
0
     input_bfd, input_section,
3587
0
     (uint64_t) rel->r_offset, name, (int) r);
3588
0
        return false;
3589
0
      }
3590
0
  }
3591
3592
0
      if (wrel != rel)
3593
0
  *wrel = *rel;
3594
0
    }
3595
3596
0
  if (wrel != rel)
3597
0
    {
3598
0
      Elf_Internal_Shdr *rel_hdr;
3599
0
      size_t deleted = rel - wrel;
3600
3601
0
      rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
3602
0
      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
3603
0
      if (rel_hdr->sh_size == 0)
3604
0
  {
3605
    /* It is too late to remove an empty reloc section.  Leave
3606
       one NONE reloc.
3607
       ??? What is wrong with an empty section???  */
3608
0
    rel_hdr->sh_size = rel_hdr->sh_entsize;
3609
0
    deleted -= 1;
3610
0
  }
3611
0
      rel_hdr = _bfd_elf_single_rel_hdr (input_section);
3612
0
      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
3613
0
      input_section->reloc_count -= deleted;
3614
0
    }
3615
3616
0
  return true;
3617
0
}
3618
3619
/* Finish up dynamic symbol handling.  We set the contents of various
3620
   dynamic sections here.  */
3621
3622
static bool
3623
elf_i386_finish_dynamic_symbol (bfd *output_bfd,
3624
        struct bfd_link_info *info,
3625
        struct elf_link_hash_entry *h,
3626
        Elf_Internal_Sym *sym)
3627
0
{
3628
0
  struct elf_x86_link_hash_table *htab;
3629
0
  unsigned plt_entry_size;
3630
0
  struct elf_x86_link_hash_entry *eh;
3631
0
  bool local_undefweak;
3632
0
  bool use_plt_second;
3633
3634
0
  htab = elf_x86_hash_table (info, I386_ELF_DATA);
3635
3636
0
  plt_entry_size = htab->plt.plt_entry_size;
3637
3638
  /* Use the second PLT section only if there is .plt section.  */
3639
0
  use_plt_second = htab->elf.splt != NULL && htab->plt_second != NULL;
3640
3641
0
  eh = (struct elf_x86_link_hash_entry *) h;
3642
0
  if (eh->no_finish_dynamic_symbol)
3643
0
    abort ();
3644
3645
  /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
3646
     resolved undefined weak symbols in executable so that their
3647
     references have value 0 at run-time.  */
3648
0
  local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
3649
3650
0
  if (h->plt.offset != (bfd_vma) -1)
3651
0
    {
3652
0
      bfd_vma plt_index, plt_offset;
3653
0
      bfd_vma got_offset;
3654
0
      Elf_Internal_Rela rel;
3655
0
      bfd_byte *loc;
3656
0
      asection *plt, *resolved_plt, *gotplt, *relplt;
3657
3658
      /* When building a static executable, use .iplt, .igot.plt and
3659
   .rel.iplt sections for STT_GNU_IFUNC symbols.  */
3660
0
      if (htab->elf.splt != NULL)
3661
0
  {
3662
0
    plt = htab->elf.splt;
3663
0
    gotplt = htab->elf.sgotplt;
3664
0
    relplt = htab->elf.srelplt;
3665
0
  }
3666
0
      else
3667
0
  {
3668
0
    plt = htab->elf.iplt;
3669
0
    gotplt = htab->elf.igotplt;
3670
0
    relplt = htab->elf.irelplt;
3671
0
  }
3672
3673
0
      VERIFY_PLT_ENTRY (info, h, plt, gotplt, relplt, local_undefweak)
3674
3675
      /* Get the index in the procedure linkage table which
3676
   corresponds to this symbol.  This is the index of this symbol
3677
   in all the symbols for which we are making plt entries.  The
3678
   first entry in the procedure linkage table is reserved.
3679
3680
   Get the offset into the .got table of the entry that
3681
   corresponds to this function.  Each .got entry is 4 bytes.
3682
   The first three are reserved.
3683
3684
   For static executables, we don't reserve anything.  */
3685
3686
0
      if (plt == htab->elf.splt)
3687
0
  {
3688
0
    got_offset = (h->plt.offset / plt_entry_size
3689
0
      - htab->plt.has_plt0);
3690
0
    got_offset = (got_offset + 3) * 4;
3691
0
  }
3692
0
      else
3693
0
  {
3694
0
    got_offset = h->plt.offset / plt_entry_size;
3695
0
    got_offset = got_offset * 4;
3696
0
  }
3697
3698
      /* Fill in the entry in the procedure linkage table and update
3699
   the first slot.  */
3700
0
      memcpy (plt->contents + h->plt.offset, htab->plt.plt_entry,
3701
0
        plt_entry_size);
3702
3703
0
      if (use_plt_second)
3704
0
  {
3705
0
    const bfd_byte *plt_entry;
3706
0
    if (bfd_link_pic (info))
3707
0
      plt_entry = htab->non_lazy_plt->pic_plt_entry;
3708
0
    else
3709
0
      plt_entry = htab->non_lazy_plt->plt_entry;
3710
0
    memcpy (htab->plt_second->contents + eh->plt_second.offset,
3711
0
      plt_entry, htab->non_lazy_plt->plt_entry_size);
3712
3713
0
    resolved_plt = htab->plt_second;
3714
0
    plt_offset = eh->plt_second.offset;
3715
0
  }
3716
0
      else
3717
0
  {
3718
0
    resolved_plt = plt;
3719
0
    plt_offset = h->plt.offset;
3720
0
  }
3721
3722
0
      if (! bfd_link_pic (info))
3723
0
  {
3724
0
    bfd_put_32 (output_bfd,
3725
0
          (gotplt->output_section->vma
3726
0
           + gotplt->output_offset
3727
0
           + got_offset),
3728
0
          resolved_plt->contents + plt_offset
3729
0
          + htab->plt.plt_got_offset);
3730
3731
0
    if (htab->elf.target_os == is_vxworks)
3732
0
      {
3733
0
        int s, k, reloc_index;
3734
3735
        /* Create the R_386_32 relocation referencing the GOT
3736
     for this PLT entry.  */
3737
3738
        /* S: Current slot number (zero-based).  */
3739
0
        s = ((h->plt.offset - htab->plt.plt_entry_size)
3740
0
       / htab->plt.plt_entry_size);
3741
        /* K: Number of relocations for PLTResolve. */
3742
0
        if (bfd_link_pic (info))
3743
0
    k = PLTRESOLVE_RELOCS_SHLIB;
3744
0
        else
3745
0
    k = PLTRESOLVE_RELOCS;
3746
        /* Skip the PLTresolve relocations, and the relocations for
3747
     the other PLT slots. */
3748
0
        reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
3749
0
        loc = (htab->srelplt2->contents + reloc_index
3750
0
         * sizeof (Elf32_External_Rel));
3751
3752
0
        rel.r_offset = (plt->output_section->vma
3753
0
            + plt->output_offset
3754
0
            + h->plt.offset + 2),
3755
0
        rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
3756
0
        bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3757
3758
        /* Create the R_386_32 relocation referencing the beginning of
3759
     the PLT for this GOT entry.  */
3760
0
        rel.r_offset = (htab->elf.sgotplt->output_section->vma
3761
0
            + htab->elf.sgotplt->output_offset
3762
0
            + got_offset);
3763
0
        rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
3764
0
        bfd_elf32_swap_reloc_out (output_bfd, &rel,
3765
0
          loc + sizeof (Elf32_External_Rel));
3766
0
      }
3767
0
  }
3768
0
      else
3769
0
  {
3770
0
    bfd_put_32 (output_bfd, got_offset,
3771
0
          resolved_plt->contents + plt_offset
3772
0
          + htab->plt.plt_got_offset);
3773
0
  }
3774
3775
      /* Fill in the entry in the global offset table.  Leave the entry
3776
   as zero for undefined weak symbol in PIE.  No PLT relocation
3777
   against undefined weak symbol in PIE.  */
3778
0
      if (!local_undefweak)
3779
0
  {
3780
0
    if (htab->plt.has_plt0)
3781
0
      bfd_put_32 (output_bfd,
3782
0
      (plt->output_section->vma
3783
0
       + plt->output_offset
3784
0
       + h->plt.offset
3785
0
       + htab->lazy_plt->plt_lazy_offset),
3786
0
      gotplt->contents + got_offset);
3787
3788
    /* Fill in the entry in the .rel.plt section.  */
3789
0
    rel.r_offset = (gotplt->output_section->vma
3790
0
        + gotplt->output_offset
3791
0
        + got_offset);
3792
0
    if (PLT_LOCAL_IFUNC_P (info, h))
3793
0
      {
3794
0
        info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
3795
0
              h->root.root.string,
3796
0
              h->root.u.def.section->owner);
3797
3798
        /* If an STT_GNU_IFUNC symbol is locally defined, generate
3799
     R_386_IRELATIVE instead of R_386_JUMP_SLOT.  Store addend
3800
     in the .got.plt section.  */
3801
0
        bfd_put_32 (output_bfd,
3802
0
        (h->root.u.def.value
3803
0
         + h->root.u.def.section->output_section->vma
3804
0
         + h->root.u.def.section->output_offset),
3805
0
        gotplt->contents + got_offset);
3806
0
        rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3807
3808
0
        if (htab->params->report_relative_reloc)
3809
0
    _bfd_x86_elf_link_report_relative_reloc
3810
0
      (info, relplt, h, sym, "R_386_IRELATIVE", &rel);
3811
3812
        /* R_386_IRELATIVE comes last.  */
3813
0
        plt_index = htab->next_irelative_index--;
3814
0
      }
3815
0
    else
3816
0
      {
3817
0
        rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
3818
0
        plt_index = htab->next_jump_slot_index++;
3819
0
      }
3820
3821
0
    loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
3822
0
    bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3823
3824
    /* Don't fill the second and third slots in PLT entry for
3825
       static executables nor without PLT0.  */
3826
0
    if (plt == htab->elf.splt && htab->plt.has_plt0)
3827
0
      {
3828
0
        bfd_put_32 (output_bfd,
3829
0
        plt_index * sizeof (Elf32_External_Rel),
3830
0
        plt->contents + h->plt.offset
3831
0
        + htab->lazy_plt->plt_reloc_offset);
3832
0
        bfd_put_32 (output_bfd,
3833
0
        - (h->plt.offset
3834
0
           + htab->lazy_plt->plt_plt_offset + 4),
3835
0
        (plt->contents + h->plt.offset
3836
0
         + htab->lazy_plt->plt_plt_offset));
3837
0
      }
3838
0
  }
3839
0
    }
3840
0
  else if (eh->plt_got.offset != (bfd_vma) -1)
3841
0
    {
3842
0
      bfd_vma got_offset, plt_offset;
3843
0
      asection *plt, *got, *gotplt;
3844
0
      const bfd_byte *got_plt_entry;
3845
3846
      /* Set the entry in the GOT procedure linkage table.  */
3847
0
      plt = htab->plt_got;
3848
0
      got = htab->elf.sgot;
3849
0
      gotplt = htab->elf.sgotplt;
3850
0
      got_offset = h->got.offset;
3851
3852
0
      if (got_offset == (bfd_vma) -1
3853
0
    || plt == NULL
3854
0
    || got == NULL
3855
0
    || gotplt == NULL)
3856
0
  abort ();
3857
3858
      /* Fill in the entry in the GOT procedure linkage table.  */
3859
0
      if (! bfd_link_pic (info))
3860
0
  {
3861
0
    got_plt_entry = htab->non_lazy_plt->plt_entry;
3862
0
    got_offset += got->output_section->vma + got->output_offset;
3863
0
  }
3864
0
      else
3865
0
  {
3866
0
    got_plt_entry = htab->non_lazy_plt->pic_plt_entry;
3867
0
    got_offset += (got->output_section->vma
3868
0
       + got->output_offset
3869
0
       - gotplt->output_section->vma
3870
0
       - gotplt->output_offset);
3871
0
  }
3872
3873
0
      plt_offset = eh->plt_got.offset;
3874
0
      memcpy (plt->contents + plt_offset, got_plt_entry,
3875
0
        htab->non_lazy_plt->plt_entry_size);
3876
0
      bfd_put_32 (output_bfd, got_offset,
3877
0
      (plt->contents + plt_offset
3878
0
       + htab->non_lazy_plt->plt_got_offset));
3879
0
    }
3880
3881
0
  if (!local_undefweak
3882
0
      && !h->def_regular
3883
0
      && (h->plt.offset != (bfd_vma) -1
3884
0
    || eh->plt_got.offset != (bfd_vma) -1))
3885
0
    {
3886
      /* Mark the symbol as undefined, rather than as defined in
3887
   the .plt section.  Leave the value if there were any
3888
   relocations where pointer equality matters (this is a clue
3889
   for the dynamic linker, to make function pointer
3890
   comparisons work between an application and shared
3891
   library), otherwise set it to zero.  If a function is only
3892
   called from a binary, there is no need to slow down
3893
   shared libraries because of that.  */
3894
0
      sym->st_shndx = SHN_UNDEF;
3895
0
      if (!h->pointer_equality_needed)
3896
0
  sym->st_value = 0;
3897
0
    }
3898
3899
0
  _bfd_x86_elf_link_fixup_ifunc_symbol (info, htab, h, sym);
3900
3901
  /* Don't generate dynamic GOT relocation against undefined weak
3902
     symbol in executable.  */
3903
0
  if (h->got.offset != (bfd_vma) -1
3904
0
      && ! GOT_TLS_GD_ANY_P (elf_x86_hash_entry(h)->tls_type)
3905
0
      && (elf_x86_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
3906
0
      && !local_undefweak)
3907
0
    {
3908
0
      Elf_Internal_Rela rel;
3909
0
      asection *relgot = htab->elf.srelgot;
3910
0
      const char *relative_reloc_name = NULL;
3911
0
      bool generate_dynamic_reloc = true;
3912
3913
      /* This symbol has an entry in the global offset table.  Set it
3914
   up.  */
3915
3916
0
      if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
3917
0
  abort ();
3918
3919
0
      rel.r_offset = (htab->elf.sgot->output_section->vma
3920
0
          + htab->elf.sgot->output_offset
3921
0
          + (h->got.offset & ~(bfd_vma) 1));
3922
3923
      /* If this is a static link, or it is a -Bsymbolic link and the
3924
   symbol is defined locally or was forced to be local because
3925
   of a version file, we just want to emit a RELATIVE reloc.
3926
   The entry in the global offset table will already have been
3927
   initialized in the relocate_section function.  */
3928
0
      if (h->def_regular
3929
0
    && h->type == STT_GNU_IFUNC)
3930
0
  {
3931
0
    if (h->plt.offset == (bfd_vma) -1)
3932
0
      {
3933
        /* STT_GNU_IFUNC is referenced without PLT.  */
3934
0
        if (htab->elf.splt == NULL)
3935
0
    {
3936
      /* use .rel[a].iplt section to store .got relocations
3937
         in static executable.  */
3938
0
      relgot = htab->elf.irelplt;
3939
0
    }
3940
0
        if (SYMBOL_REFERENCES_LOCAL_P (info, h))
3941
0
    {
3942
0
      info->callbacks->minfo (_("Local IFUNC function `%s' in %pB\n"),
3943
0
            h->root.root.string,
3944
0
            h->root.u.def.section->owner);
3945
3946
0
      bfd_put_32 (output_bfd,
3947
0
            (h->root.u.def.value
3948
0
             + h->root.u.def.section->output_section->vma
3949
0
             + h->root.u.def.section->output_offset),
3950
0
            htab->elf.sgot->contents + h->got.offset);
3951
0
      rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3952
0
      relative_reloc_name = "R_386_IRELATIVE";
3953
0
    }
3954
0
        else
3955
0
    goto do_glob_dat;
3956
0
      }
3957
0
    else if (bfd_link_pic (info))
3958
0
      {
3959
        /* Generate R_386_GLOB_DAT.  */
3960
0
        goto do_glob_dat;
3961
0
      }
3962
0
    else
3963
0
      {
3964
0
        asection *plt;
3965
0
        bfd_vma plt_offset;
3966
3967
0
        if (!h->pointer_equality_needed)
3968
0
    abort ();
3969
3970
        /* For non-shared object, we can't use .got.plt, which
3971
     contains the real function addres if we need pointer
3972
     equality.  We load the GOT entry with the PLT entry.  */
3973
0
        if (htab->plt_second != NULL)
3974
0
    {
3975
0
      plt = htab->plt_second;
3976
0
      plt_offset = eh->plt_second.offset;
3977
0
    }
3978
0
        else
3979
0
    {
3980
0
      plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
3981
0
      plt_offset = h->plt.offset;
3982
0
    }
3983
0
        bfd_put_32 (output_bfd,
3984
0
        (plt->output_section->vma
3985
0
         + plt->output_offset + plt_offset),
3986
0
        htab->elf.sgot->contents + h->got.offset);
3987
0
        return true;
3988
0
      }
3989
0
  }
3990
0
      else if (bfd_link_pic (info)
3991
0
         && SYMBOL_REFERENCES_LOCAL_P (info, h))
3992
0
  {
3993
0
    BFD_ASSERT((h->got.offset & 1) != 0);
3994
0
    if (info->enable_dt_relr)
3995
0
      generate_dynamic_reloc = false;
3996
0
    else
3997
0
      {
3998
0
        rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3999
0
        relative_reloc_name = "R_386_RELATIVE";
4000
0
      }
4001
0
  }
4002
0
      else
4003
0
  {
4004
0
    BFD_ASSERT((h->got.offset & 1) == 0);
4005
0
  do_glob_dat:
4006
0
    bfd_put_32 (output_bfd, (bfd_vma) 0,
4007
0
          htab->elf.sgot->contents + h->got.offset);
4008
0
    rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
4009
0
  }
4010
4011
0
      if (generate_dynamic_reloc)
4012
0
  {
4013
0
    if (relative_reloc_name != NULL
4014
0
        && htab->params->report_relative_reloc)
4015
0
      _bfd_x86_elf_link_report_relative_reloc
4016
0
        (info, relgot, h, sym, relative_reloc_name, &rel);
4017
4018
0
    elf_append_rel (output_bfd, relgot, &rel);
4019
0
  }
4020
0
    }
4021
4022
0
  if (h->needs_copy)
4023
0
    {
4024
0
      Elf_Internal_Rela rel;
4025
0
      asection *s;
4026
4027
      /* This symbol needs a copy reloc.  Set it up.  */
4028
0
      VERIFY_COPY_RELOC (h, htab)
4029
4030
0
      rel.r_offset = (h->root.u.def.value
4031
0
          + h->root.u.def.section->output_section->vma
4032
0
          + h->root.u.def.section->output_offset);
4033
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
4034
0
      if (h->root.u.def.section == htab->elf.sdynrelro)
4035
0
  s = htab->elf.sreldynrelro;
4036
0
      else
4037
0
  s = htab->elf.srelbss;
4038
0
      elf_append_rel (output_bfd, s, &rel);
4039
0
    }
4040
4041
0
  return true;
4042
0
}
4043
4044
/* Finish up local dynamic symbol handling.  We set the contents of
4045
   various dynamic sections here.  */
4046
4047
static int
4048
elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
4049
0
{
4050
0
  struct elf_link_hash_entry *h
4051
0
    = (struct elf_link_hash_entry *) *slot;
4052
0
  struct bfd_link_info *info
4053
0
    = (struct bfd_link_info *) inf;
4054
4055
0
  return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
4056
0
           h, NULL);
4057
0
}
4058
4059
/* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4060
   here since undefined weak symbol may not be dynamic and may not be
4061
   called for elf_i386_finish_dynamic_symbol.  */
4062
4063
static bool
4064
elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4065
              void *inf)
4066
0
{
4067
0
  struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4068
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
4069
4070
0
  if (h->root.type != bfd_link_hash_undefweak
4071
0
      || h->dynindx != -1)
4072
0
    return true;
4073
4074
0
  return elf_i386_finish_dynamic_symbol (info->output_bfd,
4075
0
           info, h, NULL);
4076
0
}
4077
4078
/* Used to decide how to sort relocs in an optimal manner for the
4079
   dynamic linker, before writing them out.  */
4080
4081
static enum elf_reloc_type_class
4082
elf_i386_reloc_type_class (const struct bfd_link_info *info,
4083
         const asection *rel_sec ATTRIBUTE_UNUSED,
4084
         const Elf_Internal_Rela *rela)
4085
0
{
4086
0
  bfd *abfd = info->output_bfd;
4087
0
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4088
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
4089
4090
0
  if (htab->dynsym != NULL
4091
0
      && htab->dynsym->contents != NULL)
4092
0
    {
4093
      /* Check relocation against STT_GNU_IFUNC symbol if there are
4094
   dynamic symbols.  */
4095
0
      unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
4096
0
      if (r_symndx != STN_UNDEF)
4097
0
  {
4098
0
    Elf_Internal_Sym sym;
4099
0
    if (!bed->s->swap_symbol_in (abfd,
4100
0
               (htab->dynsym->contents
4101
0
          + r_symndx * sizeof (Elf32_External_Sym)),
4102
0
               0, &sym))
4103
0
      abort ();
4104
4105
0
    if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
4106
0
      return reloc_class_ifunc;
4107
0
  }
4108
0
    }
4109
4110
0
  switch (ELF32_R_TYPE (rela->r_info))
4111
0
    {
4112
0
    case R_386_IRELATIVE:
4113
0
      return reloc_class_ifunc;
4114
0
    case R_386_RELATIVE:
4115
0
      return reloc_class_relative;
4116
0
    case R_386_JUMP_SLOT:
4117
0
      return reloc_class_plt;
4118
0
    case R_386_COPY:
4119
0
      return reloc_class_copy;
4120
0
    default:
4121
0
      return reloc_class_normal;
4122
0
    }
4123
0
}
4124
4125
/* Finish up the dynamic sections.  */
4126
4127
static bool
4128
elf_i386_finish_dynamic_sections (bfd *output_bfd,
4129
          struct bfd_link_info *info)
4130
0
{
4131
0
  struct elf_x86_link_hash_table *htab;
4132
4133
0
  htab = _bfd_x86_elf_finish_dynamic_sections (output_bfd, info);
4134
0
  if (htab == NULL)
4135
0
    return false;
4136
4137
0
  if (!htab->elf.dynamic_sections_created)
4138
0
    return true;
4139
4140
0
  if (htab->elf.splt && htab->elf.splt->size > 0)
4141
0
    {
4142
0
      if (bfd_is_abs_section (htab->elf.splt->output_section))
4143
0
  {
4144
0
    info->callbacks->fatal
4145
0
      (_("%P: discarded output section: `%pA'\n"),
4146
0
       htab->elf.splt);
4147
0
    return false;
4148
0
  }
4149
4150
      /* UnixWare sets the entsize of .plt to 4, although that doesn't
4151
   really seem like the right value.  */
4152
0
      elf_section_data (htab->elf.splt->output_section)
4153
0
  ->this_hdr.sh_entsize = 4;
4154
4155
0
      if (htab->plt.has_plt0)
4156
0
  {
4157
    /* Fill in the special first entry in the procedure linkage
4158
       table.  */
4159
0
    memcpy (htab->elf.splt->contents, htab->plt.plt0_entry,
4160
0
      htab->lazy_plt->plt0_entry_size);
4161
0
    memset (htab->elf.splt->contents + htab->lazy_plt->plt0_entry_size,
4162
0
      htab->plt0_pad_byte,
4163
0
      htab->plt.plt_entry_size - htab->lazy_plt->plt0_entry_size);
4164
0
    if (!bfd_link_pic (info))
4165
0
      {
4166
0
        bfd_put_32 (output_bfd,
4167
0
        (htab->elf.sgotplt->output_section->vma
4168
0
         + htab->elf.sgotplt->output_offset
4169
0
         + 4),
4170
0
        htab->elf.splt->contents
4171
0
        + htab->lazy_plt->plt0_got1_offset);
4172
0
        bfd_put_32 (output_bfd,
4173
0
        (htab->elf.sgotplt->output_section->vma
4174
0
         + htab->elf.sgotplt->output_offset
4175
0
         + 8),
4176
0
        htab->elf.splt->contents
4177
0
        + htab->lazy_plt->plt0_got2_offset);
4178
4179
0
        if (htab->elf.target_os == is_vxworks)
4180
0
    {
4181
0
      Elf_Internal_Rela rel;
4182
0
      int num_plts = (htab->elf.splt->size
4183
0
          / htab->plt.plt_entry_size) - 1;
4184
0
      unsigned char *p;
4185
0
      asection *srelplt2 = htab->srelplt2;
4186
4187
      /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
4188
         + 4.  On IA32 we use REL relocations so the
4189
         addend goes in the PLT directly.  */
4190
0
      rel.r_offset = (htab->elf.splt->output_section->vma
4191
0
          + htab->elf.splt->output_offset
4192
0
          + htab->lazy_plt->plt0_got1_offset);
4193
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
4194
0
               R_386_32);
4195
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel,
4196
0
              srelplt2->contents);
4197
      /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
4198
         + 8.  */
4199
0
      rel.r_offset = (htab->elf.splt->output_section->vma
4200
0
          + htab->elf.splt->output_offset
4201
0
          + htab->lazy_plt->plt0_got2_offset);
4202
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
4203
0
               R_386_32);
4204
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel,
4205
0
              srelplt2->contents +
4206
0
              sizeof (Elf32_External_Rel));
4207
      /* Correct the .rel.plt.unloaded relocations.  */
4208
0
      p = srelplt2->contents;
4209
0
      if (bfd_link_pic (info))
4210
0
        p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
4211
0
      else
4212
0
        p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
4213
4214
0
      for (; num_plts; num_plts--)
4215
0
        {
4216
0
          bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4217
0
          rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
4218
0
             R_386_32);
4219
0
          bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4220
0
          p += sizeof (Elf32_External_Rel);
4221
4222
0
          bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4223
0
          rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
4224
0
             R_386_32);
4225
0
          bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4226
0
          p += sizeof (Elf32_External_Rel);
4227
0
        }
4228
0
    }
4229
0
      }
4230
0
  }
4231
0
    }
4232
4233
  /* Fill PLT entries for undefined weak symbols in PIE.  */
4234
0
  if (bfd_link_pie (info))
4235
0
    bfd_hash_traverse (&info->hash->table,
4236
0
           elf_i386_pie_finish_undefweak_symbol,
4237
0
           info);
4238
4239
0
  return true;
4240
0
}
4241
4242
/* Fill PLT/GOT entries and allocate dynamic relocations for local
4243
   STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
4244
   It has to be done before elf_link_sort_relocs is called so that
4245
   dynamic relocations are properly sorted.  */
4246
4247
static bool
4248
elf_i386_output_arch_local_syms
4249
  (bfd *output_bfd ATTRIBUTE_UNUSED,
4250
   struct bfd_link_info *info,
4251
   void *flaginfo ATTRIBUTE_UNUSED,
4252
   int (*func) (void *, const char *,
4253
    Elf_Internal_Sym *,
4254
    asection *,
4255
    struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
4256
0
{
4257
0
  struct elf_x86_link_hash_table *htab
4258
0
    = elf_x86_hash_table (info, I386_ELF_DATA);
4259
0
  if (htab == NULL)
4260
0
    return false;
4261
4262
  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4263
0
  htab_traverse (htab->loc_hash_table,
4264
0
     elf_i386_finish_local_dynamic_symbol,
4265
0
     info);
4266
4267
0
  return true;
4268
0
}
4269
4270
/* Similar to _bfd_elf_get_synthetic_symtab.  Support PLTs with all
4271
   dynamic relocations.   */
4272
4273
static long
4274
elf_i386_get_synthetic_symtab (bfd *abfd,
4275
             long symcount ATTRIBUTE_UNUSED,
4276
             asymbol **syms ATTRIBUTE_UNUSED,
4277
             long dynsymcount,
4278
             asymbol **dynsyms,
4279
             asymbol **ret)
4280
47
{
4281
47
  long count, i, n;
4282
47
  int j;
4283
47
  bfd_byte *plt_contents;
4284
47
  long relsize;
4285
47
  const struct elf_x86_lazy_plt_layout *lazy_plt;
4286
47
  const struct elf_x86_non_lazy_plt_layout *non_lazy_plt;
4287
47
  const struct elf_x86_lazy_plt_layout *lazy_ibt_plt;
4288
47
  const struct elf_x86_non_lazy_plt_layout *non_lazy_ibt_plt;
4289
47
  asection *plt;
4290
47
  bfd_vma got_addr;
4291
47
  enum elf_x86_plt_type plt_type;
4292
47
  struct elf_x86_plt plts[] =
4293
47
    {
4294
47
      { ".plt", NULL, NULL, plt_unknown, 0, 0, 0, 0 },
4295
47
      { ".plt.got", NULL, NULL, plt_non_lazy, 0, 0, 0, 0 },
4296
47
      { ".plt.sec", NULL, NULL, plt_second, 0, 0, 0, 0 },
4297
47
      { NULL, NULL, NULL, plt_non_lazy, 0, 0, 0, 0 }
4298
47
    };
4299
4300
47
  *ret = NULL;
4301
4302
47
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
4303
12
    return 0;
4304
4305
35
  if (dynsymcount <= 0)
4306
18
    return 0;
4307
4308
17
  relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
4309
17
  if (relsize <= 0)
4310
0
    return -1;
4311
4312
17
  non_lazy_plt = NULL;
4313
  /* Silence GCC 6.  */
4314
17
  lazy_plt = NULL;
4315
17
  non_lazy_ibt_plt = NULL;
4316
17
  lazy_ibt_plt = NULL;
4317
17
  switch (get_elf_backend_data (abfd)->target_os)
4318
17
    {
4319
17
    case is_normal:
4320
17
    case is_solaris:
4321
17
      non_lazy_plt = &elf_i386_non_lazy_plt;
4322
17
      lazy_ibt_plt = &elf_i386_lazy_ibt_plt;
4323
17
      non_lazy_ibt_plt = &elf_i386_non_lazy_ibt_plt;
4324
      /* Fall through */
4325
17
    case is_vxworks:
4326
17
      lazy_plt = &elf_i386_lazy_plt;
4327
17
      break;
4328
0
    default:
4329
0
      abort ();
4330
17
    }
4331
4332
17
  got_addr = 0;
4333
4334
17
  count = 0;
4335
68
  for (j = 0; plts[j].name != NULL; j++)
4336
51
    {
4337
51
      plt = bfd_get_section_by_name (abfd, plts[j].name);
4338
51
      if (plt == NULL || plt->size == 0)
4339
33
  continue;
4340
4341
      /* Get the PLT section contents.  */
4342
18
      plt_contents = (bfd_byte *) bfd_malloc (plt->size);
4343
18
      if (plt_contents == NULL)
4344
0
  break;
4345
18
      if (!bfd_get_section_contents (abfd, (asection *) plt,
4346
18
             plt_contents, 0, plt->size))
4347
0
  {
4348
0
    free (plt_contents);
4349
0
    break;
4350
0
  }
4351
4352
      /* Check what kind of PLT it is.  */
4353
18
      plt_type = plt_unknown;
4354
18
      if (plts[j].type == plt_unknown
4355
18
    && (plt->size >= (lazy_plt->plt0_entry_size
4356
15
          + lazy_plt->plt_entry_size)))
4357
15
  {
4358
    /* Match lazy PLT first.  */
4359
15
    if (memcmp (plt_contents, lazy_plt->plt0_entry,
4360
15
          lazy_plt->plt0_got1_offset) == 0)
4361
4
      {
4362
        /* The fist entry in the lazy IBT PLT is the same as the
4363
     normal lazy PLT.  */
4364
4
        if (lazy_ibt_plt != NULL
4365
4
      && (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
4366
4
            lazy_ibt_plt->plt_entry,
4367
4
            lazy_ibt_plt->plt_got_offset) == 0))
4368
0
    plt_type = plt_lazy | plt_second;
4369
4
        else
4370
4
    plt_type = plt_lazy;
4371
4
      }
4372
11
    else if (memcmp (plt_contents, lazy_plt->pic_plt0_entry,
4373
11
         lazy_plt->plt0_got1_offset) == 0)
4374
9
      {
4375
        /* The fist entry in the PIC lazy IBT PLT is the same as
4376
     the normal PIC lazy PLT.  */
4377
9
        if (lazy_ibt_plt != NULL
4378
9
      && (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
4379
9
            lazy_ibt_plt->pic_plt_entry,
4380
9
            lazy_ibt_plt->plt_got_offset) == 0))
4381
0
    plt_type = plt_lazy | plt_pic | plt_second;
4382
9
        else
4383
9
    plt_type = plt_lazy | plt_pic;
4384
9
      }
4385
15
  }
4386
4387
18
      if (non_lazy_plt != NULL
4388
18
    && (plt_type == plt_unknown || plt_type == plt_non_lazy)
4389
18
    && plt->size >= non_lazy_plt->plt_entry_size)
4390
5
  {
4391
    /* Match non-lazy PLT.  */
4392
5
    if (memcmp (plt_contents, non_lazy_plt->plt_entry,
4393
5
          non_lazy_plt->plt_got_offset) == 0)
4394
0
      plt_type = plt_non_lazy;
4395
5
    else if (memcmp (plt_contents, non_lazy_plt->pic_plt_entry,
4396
5
         non_lazy_plt->plt_got_offset) == 0)
4397
3
      plt_type = plt_pic;
4398
5
  }
4399
4400
18
      if ((non_lazy_ibt_plt != NULL)
4401
18
    && (plt_type == plt_unknown || plt_type == plt_second)
4402
18
    && plt->size >= non_lazy_ibt_plt->plt_entry_size)
4403
2
  {
4404
2
    if (memcmp (plt_contents,
4405
2
          non_lazy_ibt_plt->plt_entry,
4406
2
          non_lazy_ibt_plt->plt_got_offset) == 0)
4407
0
      {
4408
        /* Match IBT PLT.  */
4409
0
        plt_type = plt_second;
4410
0
        non_lazy_plt = non_lazy_ibt_plt;
4411
0
      }
4412
2
    else if (memcmp (plt_contents,
4413
2
         non_lazy_ibt_plt->pic_plt_entry,
4414
2
         non_lazy_ibt_plt->plt_got_offset) == 0)
4415
0
      {
4416
        /* Match PIC IBT PLT.  */
4417
0
        plt_type = plt_second | plt_pic;
4418
0
        non_lazy_plt = non_lazy_ibt_plt;
4419
0
      }
4420
2
  }
4421
4422
18
      if (plt_type == plt_unknown)
4423
2
  {
4424
2
    free (plt_contents);
4425
2
    continue;
4426
2
  }
4427
4428
16
      plts[j].sec = plt;
4429
16
      plts[j].type = plt_type;
4430
4431
16
      if ((plt_type & plt_lazy))
4432
13
  {
4433
13
    plts[j].plt_got_offset = lazy_plt->plt_got_offset;
4434
13
    plts[j].plt_entry_size = lazy_plt->plt_entry_size;
4435
    /* Skip PLT0 in lazy PLT.  */
4436
13
    i = 1;
4437
13
  }
4438
3
      else
4439
3
  {
4440
3
    plts[j].plt_got_offset = non_lazy_plt->plt_got_offset;
4441
3
    plts[j].plt_entry_size = non_lazy_plt->plt_entry_size;
4442
3
    i = 0;
4443
3
  }
4444
4445
      /* Skip lazy PLT when the second PLT is used.  */
4446
16
      if ((plt_type & (plt_lazy | plt_second))
4447
16
    == (plt_lazy | plt_second))
4448
0
  plts[j].count = 0;
4449
16
      else
4450
16
  {
4451
16
    n = plt->size / plts[j].plt_entry_size;
4452
16
    plts[j].count = n;
4453
16
    count += n - i;
4454
16
  }
4455
4456
16
      plts[j].contents = plt_contents;
4457
4458
      /* The _GLOBAL_OFFSET_TABLE_ address is needed.  */
4459
16
      if ((plt_type & plt_pic))
4460
12
  got_addr = (bfd_vma) -1;
4461
16
    }
4462
4463
17
  return _bfd_x86_elf_get_synthetic_symtab (abfd, count, relsize,
4464
17
              got_addr, plts, dynsyms,
4465
17
              ret);
4466
17
}
4467
4468
/* Set up i386 GNU properties.  Return the first relocatable ELF input
4469
   with GNU properties if found.  Otherwise, return NULL.  */
4470
4471
static bfd *
4472
elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
4473
0
{
4474
0
  struct elf_x86_init_table init_table;
4475
4476
0
  switch (get_elf_backend_data (info->output_bfd)->target_os)
4477
0
    {
4478
0
    case is_normal:
4479
0
    case is_solaris:
4480
0
      init_table.plt0_pad_byte = 0x0;
4481
0
      init_table.lazy_plt = &elf_i386_lazy_plt;
4482
0
      init_table.non_lazy_plt = &elf_i386_non_lazy_plt;
4483
0
      init_table.lazy_ibt_plt = &elf_i386_lazy_ibt_plt;
4484
0
      init_table.non_lazy_ibt_plt = &elf_i386_non_lazy_ibt_plt;
4485
0
      break;
4486
0
    case is_vxworks:
4487
0
      init_table.plt0_pad_byte = 0x90;
4488
0
      init_table.lazy_plt = &elf_i386_lazy_plt;
4489
0
      init_table.non_lazy_plt = NULL;
4490
0
      init_table.lazy_ibt_plt = NULL;
4491
0
      init_table.non_lazy_ibt_plt = NULL;
4492
0
      break;
4493
0
    default:
4494
0
      abort ();
4495
0
    }
4496
4497
0
  init_table.r_info = elf32_r_info;
4498
0
  init_table.r_sym = elf32_r_sym;
4499
4500
0
  return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
4501
0
}
4502
4503
#define TARGET_LITTLE_SYM   i386_elf32_vec
4504
#define TARGET_LITTLE_NAME    "elf32-i386"
4505
#define ELF_ARCH      bfd_arch_i386
4506
#define ELF_TARGET_ID     I386_ELF_DATA
4507
#define ELF_MACHINE_CODE    EM_386
4508
#define ELF_MAXPAGESIZE     0x1000
4509
4510
#define elf_backend_can_gc_sections 1
4511
#define elf_backend_can_refcount  1
4512
#define elf_backend_want_got_plt  1
4513
#define elf_backend_plt_readonly  1
4514
#define elf_backend_want_plt_sym  0
4515
#define elf_backend_got_header_size 12
4516
#define elf_backend_plt_alignment 4
4517
#define elf_backend_dtrel_excludes_plt  1
4518
#define elf_backend_caches_rawsize  1
4519
#define elf_backend_want_dynrelro 1
4520
4521
/* Support RELA for objdump of prelink objects.  */
4522
#define elf_info_to_howto         elf_i386_info_to_howto_rel
4523
#define elf_info_to_howto_rel         elf_i386_info_to_howto_rel
4524
4525
#define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
4526
#define bfd_elf32_bfd_reloc_type_lookup       elf_i386_reloc_type_lookup
4527
#define bfd_elf32_bfd_reloc_name_lookup       elf_i386_reloc_name_lookup
4528
#define bfd_elf32_get_synthetic_symtab        elf_i386_get_synthetic_symtab
4529
4530
#define elf_backend_relocs_compatible       _bfd_elf_relocs_compatible
4531
#define elf_backend_early_size_sections       elf_i386_early_size_sections
4532
#define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
4533
#define elf_backend_fake_sections       elf_i386_fake_sections
4534
#define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
4535
#define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
4536
#define elf_backend_output_arch_local_syms     elf_i386_output_arch_local_syms
4537
#define elf_backend_grok_prstatus       elf_i386_grok_prstatus
4538
#define elf_backend_grok_psinfo         elf_i386_grok_psinfo
4539
#define elf_backend_reloc_type_class        elf_i386_reloc_type_class
4540
#define elf_backend_relocate_section        elf_i386_relocate_section
4541
#define elf_backend_setup_gnu_properties      elf_i386_link_setup_gnu_properties
4542
#define elf_backend_hide_symbol         _bfd_x86_elf_hide_symbol
4543
4544
#define elf_backend_linux_prpsinfo32_ugid16 true
4545
4546
#define elf32_bed           elf32_i386_bed
4547
4548
#include "elf32-target.h"
4549
4550
/* FreeBSD support.  */
4551
4552
#undef  TARGET_LITTLE_SYM
4553
#define TARGET_LITTLE_SYM   i386_elf32_fbsd_vec
4554
#undef  TARGET_LITTLE_NAME
4555
#define TARGET_LITTLE_NAME    "elf32-i386-freebsd"
4556
#undef  ELF_OSABI
4557
#define ELF_OSABI     ELFOSABI_FREEBSD
4558
4559
/* The kernel recognizes executables as valid only if they carry a
4560
   "FreeBSD" label in the ELF header.  So we put this label on all
4561
   executables and (for simplicity) also all other object files.  */
4562
4563
static bool
4564
elf_i386_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
4565
0
{
4566
0
  if (!_bfd_elf_init_file_header (abfd, info))
4567
0
    return false;
4568
4569
#ifdef OLD_FREEBSD_ABI_LABEL
4570
  {
4571
    /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
4572
    Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4573
    memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
4574
  }
4575
#endif
4576
0
  return true;
4577
0
}
4578
4579
#undef  elf_backend_init_file_header
4580
#define elf_backend_init_file_header  elf_i386_fbsd_init_file_header
4581
#undef  elf32_bed
4582
#define elf32_bed       elf32_i386_fbsd_bed
4583
4584
#undef elf_backend_add_symbol_hook
4585
4586
#include "elf32-target.h"
4587
4588
#undef elf_backend_init_file_header
4589
4590
/* Solaris 2.  */
4591
4592
#undef  TARGET_LITTLE_SYM
4593
#define TARGET_LITTLE_SYM   i386_elf32_sol2_vec
4594
#undef  TARGET_LITTLE_NAME
4595
#define TARGET_LITTLE_NAME    "elf32-i386-sol2"
4596
4597
#undef  ELF_TARGET_OS
4598
#define ELF_TARGET_OS     is_solaris
4599
4600
/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
4601
   objects won't be recognized.  */
4602
#undef ELF_OSABI
4603
4604
#undef  elf32_bed
4605
#define elf32_bed     elf32_i386_sol2_bed
4606
4607
/* The 32-bit static TLS arena size is rounded to the nearest 8-byte
4608
   boundary.  */
4609
#undef  elf_backend_static_tls_alignment
4610
#define elf_backend_static_tls_alignment 8
4611
4612
/* The Solaris 2 ABI requires a plt symbol on all platforms.
4613
4614
   Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
4615
   File, p.63.  */
4616
#undef  elf_backend_want_plt_sym
4617
#define elf_backend_want_plt_sym  1
4618
4619
#undef  elf_backend_strtab_flags
4620
#define elf_backend_strtab_flags  SHF_STRINGS
4621
4622
/* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
4623
   has a type >= SHT_LOOS.  Returns TRUE if these fields were initialised
4624
   FALSE otherwise.  ISECTION is the best guess matching section from the
4625
   input bfd IBFD, but it might be NULL.  */
4626
4627
static bool
4628
elf32_i386_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
4629
            bfd *obfd ATTRIBUTE_UNUSED,
4630
            const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
4631
            Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
4632
0
{
4633
  /* PR 19938: FIXME: Need to add code for setting the sh_info
4634
     and sh_link fields of Solaris specific section types.  */
4635
0
  return false;
4636
4637
  /* Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
4638
     Object File Format, Table 13-9  ELF sh_link and sh_info Interpretation:
4639
4640
http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
4641
4642
     The following values should be set:
4643
4644
Type         Link         Info
4645
-----------------------------------------------------------------------------
4646
SHT_SUNW_ancillary   The section header index of    0
4647
 [0x6fffffee]      the associated string table.
4648
4649
SHT_SUNW_capinfo     The section header index of    For a dynamic object, the
4650
 [0x6ffffff0]      the associated symbol table.   section header index of
4651
                the associated
4652
                SHT_SUNW_capchain table,
4653
                otherwise 0.
4654
4655
SHT_SUNW_symsort     The section header index of    0
4656
 [0x6ffffff1]      the associated symbol table.
4657
4658
SHT_SUNW_tlssort     The section header index of    0
4659
 [0x6ffffff2]      the associated symbol table.
4660
4661
SHT_SUNW_LDYNSYM     The section header index of    One greater than the
4662
 [0x6ffffff3]      the associated string table.   symbol table index of the
4663
         This index is the same string  last local symbol,
4664
         table used by the SHT_DYNSYM   STB_LOCAL. Since
4665
         section.         SHT_SUNW_LDYNSYM only
4666
                contains local symbols,
4667
                sh_info is equivalent to
4668
                the number of symbols in
4669
                the table.
4670
4671
SHT_SUNW_cap       If symbol capabilities exist,  If any capabilities refer
4672
 [0x6ffffff5]      the section header index of    to named strings, the
4673
         the associated       section header index of
4674
         SHT_SUNW_capinfo table,      the associated string
4675
        otherwise 0.        table, otherwise 0.
4676
4677
SHT_SUNW_move      The section header index of    0
4678
 [0x6ffffffa]      the associated symbol table.
4679
4680
SHT_SUNW_COMDAT      0            0
4681
 [0x6ffffffb]
4682
4683
SHT_SUNW_syminfo     The section header index of    The section header index
4684
 [0x6ffffffc]      the associated symbol table.   of the associated
4685
                .dynamic section.
4686
4687
SHT_SUNW_verdef      The section header index of    The number of version
4688
 [0x6ffffffd]      the associated string table.   definitions within the
4689
                section.
4690
4691
SHT_SUNW_verneed     The section header index of    The number of version
4692
 [0x6ffffffe]      the associated string table.   dependencies within the
4693
                section.
4694
4695
SHT_SUNW_versym      The section header index of    0
4696
 [0x6fffffff]      the associated symbol table.  */
4697
0
}
4698
4699
#undef  elf_backend_copy_special_section_fields
4700
#define elf_backend_copy_special_section_fields elf32_i386_copy_solaris_special_section_fields
4701
4702
#include "elf32-target.h"
4703
4704
/* Intel MCU support.  */
4705
4706
static bool
4707
elf32_iamcu_elf_object_p (bfd *abfd)
4708
1.78k
{
4709
  /* Set the right machine number for an IAMCU elf32 file.  */
4710
1.78k
  bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
4711
1.78k
  return true;
4712
1.78k
}
4713
4714
#undef  TARGET_LITTLE_SYM
4715
#define TARGET_LITTLE_SYM   iamcu_elf32_vec
4716
#undef  TARGET_LITTLE_NAME
4717
#define TARGET_LITTLE_NAME    "elf32-iamcu"
4718
#undef  ELF_ARCH
4719
#define ELF_ARCH      bfd_arch_iamcu
4720
4721
#undef  ELF_MACHINE_CODE
4722
#define ELF_MACHINE_CODE    EM_IAMCU
4723
4724
#undef  ELF_TARGET_OS
4725
#undef  ELF_OSABI
4726
4727
#undef  elf32_bed
4728
#define elf32_bed     elf32_iamcu_bed
4729
4730
#undef  elf_backend_object_p
4731
#define elf_backend_object_p    elf32_iamcu_elf_object_p
4732
4733
#undef  elf_backend_static_tls_alignment
4734
4735
#undef  elf_backend_want_plt_sym
4736
#define elf_backend_want_plt_sym  0
4737
4738
#undef  elf_backend_strtab_flags
4739
#undef  elf_backend_copy_special_section_fields
4740
4741
#include "elf32-target.h"
4742
4743
/* Restore defaults.  */
4744
#undef  ELF_ARCH
4745
#define ELF_ARCH      bfd_arch_i386
4746
#undef  ELF_MACHINE_CODE
4747
#define ELF_MACHINE_CODE    EM_386
4748
#undef  elf_backend_object_p
4749
4750
/* VxWorks support.  */
4751
4752
#undef  TARGET_LITTLE_SYM
4753
#define TARGET_LITTLE_SYM   i386_elf32_vxworks_vec
4754
#undef  TARGET_LITTLE_NAME
4755
#define TARGET_LITTLE_NAME    "elf32-i386-vxworks"
4756
#undef  ELF_OSABI
4757
#undef  ELF_MAXPAGESIZE
4758
#define ELF_MAXPAGESIZE     0x1000
4759
#undef  elf_backend_plt_alignment
4760
#define elf_backend_plt_alignment 4
4761
4762
#undef  ELF_TARGET_OS
4763
#define ELF_TARGET_OS   is_vxworks
4764
4765
#undef elf_backend_relocs_compatible
4766
#undef elf_backend_add_symbol_hook
4767
#define elf_backend_add_symbol_hook \
4768
  elf_vxworks_add_symbol_hook
4769
#undef elf_backend_link_output_symbol_hook
4770
#define elf_backend_link_output_symbol_hook \
4771
  elf_vxworks_link_output_symbol_hook
4772
#undef elf_backend_emit_relocs
4773
#define elf_backend_emit_relocs     elf_vxworks_emit_relocs
4774
#undef elf_backend_final_write_processing
4775
#define elf_backend_final_write_processing \
4776
  elf_vxworks_final_write_processing
4777
#undef elf_backend_static_tls_alignment
4778
4779
/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
4780
   define it.  */
4781
#undef elf_backend_want_plt_sym
4782
#define elf_backend_want_plt_sym  1
4783
4784
#undef  elf32_bed
4785
#define elf32_bed       elf32_i386_vxworks_bed
4786
4787
#include "elf32-target.h"