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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [bfd/] [elf32-i386.c] - Blame information for rev 359

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

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

powered by: WebSVN 2.1.0

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