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