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