OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [gdb-6.8/] [pre-binutils-2.20.1-sync/] [bfd/] [elf32-i386.c] - Blame information for rev 440

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

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

powered by: WebSVN 2.1.0

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