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