xref: /dragonfly/contrib/gdb-7/bfd/elf32-i386.c (revision 8af44722)
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
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 	}
1518 
1519       if (! elf_i386_tls_transition (info, abfd, sec, NULL,
1520 				     symtab_hdr, sym_hashes,
1521 				     &r_type, GOT_UNKNOWN,
1522 				     rel, rel_end, h, r_symndx))
1523 	return FALSE;
1524 
1525       switch (r_type)
1526 	{
1527 	case R_386_TLS_LDM:
1528 	  htab->tls_ldm_got.refcount += 1;
1529 	  goto create_got;
1530 
1531 	case R_386_PLT32:
1532 	  /* This symbol requires a procedure linkage table entry.  We
1533 	     actually build the entry in adjust_dynamic_symbol,
1534 	     because this might be a case of linking PIC code which is
1535 	     never referenced by a dynamic object, in which case we
1536 	     don't need to generate a procedure linkage table entry
1537 	     after all.  */
1538 
1539 	  /* If this is a local symbol, we resolve it directly without
1540 	     creating a procedure linkage table entry.  */
1541 	  if (h == NULL)
1542 	    continue;
1543 
1544 	  h->needs_plt = 1;
1545 	  h->plt.refcount += 1;
1546 	  break;
1547 
1548 	case R_386_SIZE32:
1549 	  size_reloc = TRUE;
1550 	  goto do_size;
1551 
1552 	case R_386_TLS_IE_32:
1553 	case R_386_TLS_IE:
1554 	case R_386_TLS_GOTIE:
1555 	  if (!info->executable)
1556 	    info->flags |= DF_STATIC_TLS;
1557 	  /* Fall through */
1558 
1559 	case R_386_GOT32:
1560 	case R_386_TLS_GD:
1561 	case R_386_TLS_GOTDESC:
1562 	case R_386_TLS_DESC_CALL:
1563 	  /* This symbol requires a global offset table entry.  */
1564 	  {
1565 	    int tls_type, old_tls_type;
1566 
1567 	    switch (r_type)
1568 	      {
1569 	      default:
1570 	      case R_386_GOT32: tls_type = GOT_NORMAL; break;
1571 	      case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
1572 	      case R_386_TLS_GOTDESC:
1573 	      case R_386_TLS_DESC_CALL:
1574 		tls_type = GOT_TLS_GDESC; break;
1575 	      case R_386_TLS_IE_32:
1576 		if (ELF32_R_TYPE (rel->r_info) == r_type)
1577 		  tls_type = GOT_TLS_IE_NEG;
1578 		else
1579 		  /* If this is a GD->IE transition, we may use either of
1580 		     R_386_TLS_TPOFF and R_386_TLS_TPOFF32.  */
1581 		  tls_type = GOT_TLS_IE;
1582 		break;
1583 	      case R_386_TLS_IE:
1584 	      case R_386_TLS_GOTIE:
1585 		tls_type = GOT_TLS_IE_POS; break;
1586 	      }
1587 
1588 	    if (h != NULL)
1589 	      {
1590 		h->got.refcount += 1;
1591 		old_tls_type = elf_i386_hash_entry(h)->tls_type;
1592 	      }
1593 	    else
1594 	      {
1595 		bfd_signed_vma *local_got_refcounts;
1596 
1597 		/* This is a global offset table entry for a local symbol.  */
1598 		local_got_refcounts = elf_local_got_refcounts (abfd);
1599 		if (local_got_refcounts == NULL)
1600 		  {
1601 		    bfd_size_type size;
1602 
1603 		    size = symtab_hdr->sh_info;
1604 		    size *= (sizeof (bfd_signed_vma)
1605 			     + sizeof (bfd_vma) + sizeof(char));
1606 		    local_got_refcounts = (bfd_signed_vma *)
1607                         bfd_zalloc (abfd, size);
1608 		    if (local_got_refcounts == NULL)
1609 		      return FALSE;
1610 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
1611 		    elf_i386_local_tlsdesc_gotent (abfd)
1612 		      = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
1613 		    elf_i386_local_got_tls_type (abfd)
1614 		      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
1615 		  }
1616 		local_got_refcounts[r_symndx] += 1;
1617 		old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1618 	      }
1619 
1620 	    if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1621 	      tls_type |= old_tls_type;
1622 	    /* If a TLS symbol is accessed using IE at least once,
1623 	       there is no point to use dynamic model for it.  */
1624 	    else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1625 		     && (! GOT_TLS_GD_ANY_P (old_tls_type)
1626 			 || (tls_type & GOT_TLS_IE) == 0))
1627 	      {
1628 		if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
1629 		  tls_type = old_tls_type;
1630 		else if (GOT_TLS_GD_ANY_P (old_tls_type)
1631 			 && GOT_TLS_GD_ANY_P (tls_type))
1632 		  tls_type |= old_tls_type;
1633 		else
1634 		  {
1635 		    if (h)
1636 		      name = h->root.root.string;
1637 		    else
1638 		      name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
1639 					     NULL);
1640 		    (*_bfd_error_handler)
1641 		      (_("%B: `%s' accessed both as normal and "
1642 			 "thread local symbol"),
1643 		       abfd, name);
1644 		    bfd_set_error (bfd_error_bad_value);
1645 		    return FALSE;
1646 		  }
1647 	      }
1648 
1649 	    if (old_tls_type != tls_type)
1650 	      {
1651 		if (h != NULL)
1652 		  elf_i386_hash_entry (h)->tls_type = tls_type;
1653 		else
1654 		  elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1655 	      }
1656 	  }
1657 	  /* Fall through */
1658 
1659 	case R_386_GOTOFF:
1660 	case R_386_GOTPC:
1661 	create_got:
1662 	  if (htab->elf.sgot == NULL)
1663 	    {
1664 	      if (htab->elf.dynobj == NULL)
1665 		htab->elf.dynobj = abfd;
1666 	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1667 		return FALSE;
1668 	    }
1669 	  if (r_type != R_386_TLS_IE)
1670 	    break;
1671 	  /* Fall through */
1672 
1673 	case R_386_TLS_LE_32:
1674 	case R_386_TLS_LE:
1675 	  if (info->executable)
1676 	    break;
1677 	  info->flags |= DF_STATIC_TLS;
1678 	  /* Fall through */
1679 
1680 	case R_386_32:
1681 	case R_386_PC32:
1682 	  if (h != NULL && info->executable)
1683 	    {
1684 	      /* If this reloc is in a read-only section, we might
1685 		 need a copy reloc.  We can't check reliably at this
1686 		 stage whether the section is read-only, as input
1687 		 sections have not yet been mapped to output sections.
1688 		 Tentatively set the flag for now, and correct in
1689 		 adjust_dynamic_symbol.  */
1690 	      h->non_got_ref = 1;
1691 
1692 	      /* We may need a .plt entry if the function this reloc
1693 		 refers to is in a shared lib.  */
1694 	      h->plt.refcount += 1;
1695 	      if (r_type != R_386_PC32)
1696 		h->pointer_equality_needed = 1;
1697 	    }
1698 
1699 	  size_reloc = FALSE;
1700 do_size:
1701 	  /* If we are creating a shared library, and this is a reloc
1702 	     against a global symbol, or a non PC relative reloc
1703 	     against a local symbol, then we need to copy the reloc
1704 	     into the shared library.  However, if we are linking with
1705 	     -Bsymbolic, we do not need to copy a reloc against a
1706 	     global symbol which is defined in an object we are
1707 	     including in the link (i.e., DEF_REGULAR is set).  At
1708 	     this point we have not seen all the input files, so it is
1709 	     possible that DEF_REGULAR is not set now but will be set
1710 	     later (it is never cleared).  In case of a weak definition,
1711 	     DEF_REGULAR may be cleared later by a strong definition in
1712 	     a shared library.  We account for that possibility below by
1713 	     storing information in the relocs_copied field of the hash
1714 	     table entry.  A similar situation occurs when creating
1715 	     shared libraries and symbol visibility changes render the
1716 	     symbol local.
1717 
1718 	     If on the other hand, we are creating an executable, we
1719 	     may need to keep relocations for symbols satisfied by a
1720 	     dynamic library if we manage to avoid copy relocs for the
1721 	     symbol.  */
1722 	  if ((info->shared
1723 	       && (sec->flags & SEC_ALLOC) != 0
1724 	       && (r_type != R_386_PC32
1725 		   || (h != NULL
1726 		       && (! SYMBOLIC_BIND (info, h)
1727 			   || h->root.type == bfd_link_hash_defweak
1728 			   || !h->def_regular))))
1729 	      || (ELIMINATE_COPY_RELOCS
1730 		  && !info->shared
1731 		  && (sec->flags & SEC_ALLOC) != 0
1732 		  && h != NULL
1733 		  && (h->root.type == bfd_link_hash_defweak
1734 		      || !h->def_regular)))
1735 	    {
1736 	      struct elf_dyn_relocs *p;
1737 	      struct elf_dyn_relocs **head;
1738 
1739 	      /* We must copy these reloc types into the output file.
1740 		 Create a reloc section in dynobj and make room for
1741 		 this reloc.  */
1742 	      if (sreloc == NULL)
1743 		{
1744 		  if (htab->elf.dynobj == NULL)
1745 		    htab->elf.dynobj = abfd;
1746 
1747 		  sreloc = _bfd_elf_make_dynamic_reloc_section
1748 		    (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
1749 
1750 		  if (sreloc == NULL)
1751 		    return FALSE;
1752 		}
1753 
1754 	      /* If this is a global symbol, we count the number of
1755 		 relocations we need for this symbol.  */
1756 	      if (h != NULL)
1757 		{
1758 		  head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs;
1759 		}
1760 	      else
1761 		{
1762 		  /* Track dynamic relocs needed for local syms too.
1763 		     We really need local syms available to do this
1764 		     easily.  Oh well.  */
1765 		  void **vpp;
1766 		  asection *s;
1767 
1768 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1769 						abfd, r_symndx);
1770 		  if (isym == NULL)
1771 		    return FALSE;
1772 
1773 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1774 		  if (s == NULL)
1775 		    s = sec;
1776 
1777 		  vpp = &elf_section_data (s)->local_dynrel;
1778 		  head = (struct elf_dyn_relocs **)vpp;
1779 		}
1780 
1781 	      p = *head;
1782 	      if (p == NULL || p->sec != sec)
1783 		{
1784 		  bfd_size_type amt = sizeof *p;
1785 		  p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
1786                                                            amt);
1787 		  if (p == NULL)
1788 		    return FALSE;
1789 		  p->next = *head;
1790 		  *head = p;
1791 		  p->sec = sec;
1792 		  p->count = 0;
1793 		  p->pc_count = 0;
1794 		}
1795 
1796 	      p->count += 1;
1797 	      /* Count size relocation as PC-relative relocation.  */
1798 	      if (r_type == R_386_PC32 || size_reloc)
1799 		p->pc_count += 1;
1800 	    }
1801 	  break;
1802 
1803 	  /* This relocation describes the C++ object vtable hierarchy.
1804 	     Reconstruct it for later use during GC.  */
1805 	case R_386_GNU_VTINHERIT:
1806 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1807 	    return FALSE;
1808 	  break;
1809 
1810 	  /* This relocation describes which C++ vtable entries are actually
1811 	     used.  Record for later use during GC.  */
1812 	case R_386_GNU_VTENTRY:
1813 	  BFD_ASSERT (h != NULL);
1814 	  if (h != NULL
1815 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1816 	    return FALSE;
1817 	  break;
1818 
1819 	default:
1820 	  break;
1821 	}
1822     }
1823 
1824   return TRUE;
1825 }
1826 
1827 /* Return the section that should be marked against GC for a given
1828    relocation.  */
1829 
1830 static asection *
1831 elf_i386_gc_mark_hook (asection *sec,
1832 		       struct bfd_link_info *info,
1833 		       Elf_Internal_Rela *rel,
1834 		       struct elf_link_hash_entry *h,
1835 		       Elf_Internal_Sym *sym)
1836 {
1837   if (h != NULL)
1838     switch (ELF32_R_TYPE (rel->r_info))
1839       {
1840       case R_386_GNU_VTINHERIT:
1841       case R_386_GNU_VTENTRY:
1842 	return NULL;
1843       }
1844 
1845   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1846 }
1847 
1848 /* Update the got entry reference counts for the section being removed.  */
1849 
1850 static bfd_boolean
1851 elf_i386_gc_sweep_hook (bfd *abfd,
1852 			struct bfd_link_info *info,
1853 			asection *sec,
1854 			const Elf_Internal_Rela *relocs)
1855 {
1856   struct elf_i386_link_hash_table *htab;
1857   Elf_Internal_Shdr *symtab_hdr;
1858   struct elf_link_hash_entry **sym_hashes;
1859   bfd_signed_vma *local_got_refcounts;
1860   const Elf_Internal_Rela *rel, *relend;
1861 
1862   if (info->relocatable)
1863     return TRUE;
1864 
1865   htab = elf_i386_hash_table (info);
1866   if (htab == NULL)
1867     return FALSE;
1868 
1869   elf_section_data (sec)->local_dynrel = NULL;
1870 
1871   symtab_hdr = &elf_symtab_hdr (abfd);
1872   sym_hashes = elf_sym_hashes (abfd);
1873   local_got_refcounts = elf_local_got_refcounts (abfd);
1874 
1875   relend = relocs + sec->reloc_count;
1876   for (rel = relocs; rel < relend; rel++)
1877     {
1878       unsigned long r_symndx;
1879       unsigned int r_type;
1880       struct elf_link_hash_entry *h = NULL;
1881 
1882       r_symndx = ELF32_R_SYM (rel->r_info);
1883       if (r_symndx >= symtab_hdr->sh_info)
1884 	{
1885 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1886 	  while (h->root.type == bfd_link_hash_indirect
1887 		 || h->root.type == bfd_link_hash_warning)
1888 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1889 	}
1890       else
1891 	{
1892 	  /* A local symbol.  */
1893 	  Elf_Internal_Sym *isym;
1894 
1895 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1896 					abfd, r_symndx);
1897 
1898 	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
1899 	  if (isym != NULL
1900 	      && ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1901 	    {
1902 	      h = elf_i386_get_local_sym_hash (htab, abfd, rel, FALSE);
1903 	      if (h == NULL)
1904 		abort ();
1905 	    }
1906 	}
1907 
1908       if (h)
1909 	{
1910 	  struct elf_i386_link_hash_entry *eh;
1911 	  struct elf_dyn_relocs **pp;
1912 	  struct elf_dyn_relocs *p;
1913 
1914 	  eh = (struct elf_i386_link_hash_entry *) h;
1915 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1916 	    if (p->sec == sec)
1917 	      {
1918 		/* Everything must go for SEC.  */
1919 		*pp = p->next;
1920 		break;
1921 	      }
1922 	}
1923 
1924       r_type = ELF32_R_TYPE (rel->r_info);
1925       if (! elf_i386_tls_transition (info, abfd, sec, NULL,
1926 				     symtab_hdr, sym_hashes,
1927 				     &r_type, GOT_UNKNOWN,
1928 				     rel, relend, h, r_symndx))
1929 	return FALSE;
1930 
1931       switch (r_type)
1932 	{
1933 	case R_386_TLS_LDM:
1934 	  if (htab->tls_ldm_got.refcount > 0)
1935 	    htab->tls_ldm_got.refcount -= 1;
1936 	  break;
1937 
1938 	case R_386_TLS_GD:
1939 	case R_386_TLS_GOTDESC:
1940 	case R_386_TLS_DESC_CALL:
1941 	case R_386_TLS_IE_32:
1942 	case R_386_TLS_IE:
1943 	case R_386_TLS_GOTIE:
1944 	case R_386_GOT32:
1945 	  if (h != NULL)
1946 	    {
1947 	      if (h->got.refcount > 0)
1948 		h->got.refcount -= 1;
1949 	      if (h->type == STT_GNU_IFUNC)
1950 		{
1951 		  if (h->plt.refcount > 0)
1952 		    h->plt.refcount -= 1;
1953 		}
1954 	    }
1955 	  else if (local_got_refcounts != NULL)
1956 	    {
1957 	      if (local_got_refcounts[r_symndx] > 0)
1958 		local_got_refcounts[r_symndx] -= 1;
1959 	    }
1960 	  break;
1961 
1962 	case R_386_32:
1963 	case R_386_PC32:
1964 	case R_386_SIZE32:
1965 	  if (info->shared
1966 	      && (h == NULL || h->type != STT_GNU_IFUNC))
1967 	    break;
1968 	  /* Fall through */
1969 
1970 	case R_386_PLT32:
1971 	  if (h != NULL)
1972 	    {
1973 	      if (h->plt.refcount > 0)
1974 		h->plt.refcount -= 1;
1975 	    }
1976 	  break;
1977 
1978 	case R_386_GOTOFF:
1979 	  if (h != NULL && h->type == STT_GNU_IFUNC)
1980 	    {
1981 	      if (h->got.refcount > 0)
1982 		h->got.refcount -= 1;
1983 	      if (h->plt.refcount > 0)
1984 		h->plt.refcount -= 1;
1985 	    }
1986 	  break;
1987 
1988 	default:
1989 	  break;
1990 	}
1991     }
1992 
1993   return TRUE;
1994 }
1995 
1996 /* Adjust a symbol defined by a dynamic object and referenced by a
1997    regular object.  The current definition is in some section of the
1998    dynamic object, but we're not including those sections.  We have to
1999    change the definition to something the rest of the link can
2000    understand.  */
2001 
2002 static bfd_boolean
2003 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2004 				struct elf_link_hash_entry *h)
2005 {
2006   struct elf_i386_link_hash_table *htab;
2007   asection *s;
2008   struct elf_i386_link_hash_entry *eh;
2009   struct elf_dyn_relocs *p;
2010 
2011   /* STT_GNU_IFUNC symbol must go through PLT. */
2012   if (h->type == STT_GNU_IFUNC)
2013     {
2014       /* All local STT_GNU_IFUNC references must be treate as local
2015 	 calls via local PLT.  */
2016       if (h->ref_regular
2017 	  && SYMBOL_CALLS_LOCAL (info, h))
2018 	{
2019 	  bfd_size_type pc_count = 0, count = 0;
2020 	  struct elf_dyn_relocs **pp;
2021 
2022 	  eh = (struct elf_i386_link_hash_entry *) h;
2023 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2024 	    {
2025 	      pc_count += p->pc_count;
2026 	      p->count -= p->pc_count;
2027 	      p->pc_count = 0;
2028 	      count += p->count;
2029 	      if (p->count == 0)
2030 		*pp = p->next;
2031 	      else
2032 		pp = &p->next;
2033 	    }
2034 
2035 	  if (pc_count || count)
2036 	    {
2037 	      h->needs_plt = 1;
2038 	      h->non_got_ref = 1;
2039 	      if (h->plt.refcount <= 0)
2040 		h->plt.refcount = 1;
2041 	      else
2042 		h->plt.refcount += 1;
2043 	    }
2044 	}
2045 
2046       if (h->plt.refcount <= 0)
2047 	{
2048 	  h->plt.offset = (bfd_vma) -1;
2049 	  h->needs_plt = 0;
2050 	}
2051       return TRUE;
2052     }
2053 
2054   /* If this is a function, put it in the procedure linkage table.  We
2055      will fill in the contents of the procedure linkage table later,
2056      when we know the address of the .got section.  */
2057   if (h->type == STT_FUNC
2058       || h->needs_plt)
2059     {
2060       if (h->plt.refcount <= 0
2061 	  || SYMBOL_CALLS_LOCAL (info, h)
2062 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2063 	      && h->root.type == bfd_link_hash_undefweak))
2064 	{
2065 	  /* This case can occur if we saw a PLT32 reloc in an input
2066 	     file, but the symbol was never referred to by a dynamic
2067 	     object, or if all references were garbage collected.  In
2068 	     such a case, we don't actually need to build a procedure
2069 	     linkage table, and we can just do a PC32 reloc instead.  */
2070 	  h->plt.offset = (bfd_vma) -1;
2071 	  h->needs_plt = 0;
2072 	}
2073 
2074       return TRUE;
2075     }
2076   else
2077     /* It's possible that we incorrectly decided a .plt reloc was
2078        needed for an R_386_PC32 reloc to a non-function sym in
2079        check_relocs.  We can't decide accurately between function and
2080        non-function syms in check-relocs;  Objects loaded later in
2081        the link may change h->type.  So fix it now.  */
2082     h->plt.offset = (bfd_vma) -1;
2083 
2084   /* If this is a weak symbol, and there is a real definition, the
2085      processor independent code will have arranged for us to see the
2086      real definition first, and we can just use the same value.  */
2087   if (h->u.weakdef != NULL)
2088     {
2089       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2090 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2091       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2092       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2093       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2094 	h->non_got_ref = h->u.weakdef->non_got_ref;
2095       return TRUE;
2096     }
2097 
2098   /* This is a reference to a symbol defined by a dynamic object which
2099      is not a function.  */
2100 
2101   /* If we are creating a shared library, we must presume that the
2102      only references to the symbol are via the global offset table.
2103      For such cases we need not do anything here; the relocations will
2104      be handled correctly by relocate_section.  */
2105   if (info->shared)
2106     return TRUE;
2107 
2108   /* If there are no references to this symbol that do not use the
2109      GOT, we don't need to generate a copy reloc.  */
2110   if (!h->non_got_ref)
2111     return TRUE;
2112 
2113   /* If -z nocopyreloc was given, we won't generate them either.  */
2114   if (info->nocopyreloc)
2115     {
2116       h->non_got_ref = 0;
2117       return TRUE;
2118     }
2119 
2120   htab = elf_i386_hash_table (info);
2121   if (htab == NULL)
2122     return FALSE;
2123 
2124   /* If there aren't any dynamic relocs in read-only sections, then
2125      we can keep the dynamic relocs and avoid the copy reloc.  This
2126      doesn't work on VxWorks, where we can not have dynamic relocations
2127      (other than copy and jump slot relocations) in an executable.  */
2128   if (ELIMINATE_COPY_RELOCS
2129       && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2130     {
2131       eh = (struct elf_i386_link_hash_entry *) h;
2132       for (p = eh->dyn_relocs; p != NULL; p = p->next)
2133 	{
2134 	  s = p->sec->output_section;
2135 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
2136 	    break;
2137 	}
2138 
2139       if (p == NULL)
2140 	{
2141 	  h->non_got_ref = 0;
2142 	  return TRUE;
2143 	}
2144     }
2145 
2146   /* We must allocate the symbol in our .dynbss section, which will
2147      become part of the .bss section of the executable.  There will be
2148      an entry for this symbol in the .dynsym section.  The dynamic
2149      object will contain position independent code, so all references
2150      from the dynamic object to this symbol will go through the global
2151      offset table.  The dynamic linker will use the .dynsym entry to
2152      determine the address it must put in the global offset table, so
2153      both the dynamic object and the regular object will refer to the
2154      same memory location for the variable.  */
2155 
2156   /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2157      copy the initial value out of the dynamic object and into the
2158      runtime process image.  */
2159   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2160     {
2161       htab->srelbss->size += sizeof (Elf32_External_Rel);
2162       h->needs_copy = 1;
2163     }
2164 
2165   s = htab->sdynbss;
2166 
2167   return _bfd_elf_adjust_dynamic_copy (h, s);
2168 }
2169 
2170 /* Allocate space in .plt, .got and associated reloc sections for
2171    dynamic relocs.  */
2172 
2173 static bfd_boolean
2174 elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2175 {
2176   struct bfd_link_info *info;
2177   struct elf_i386_link_hash_table *htab;
2178   struct elf_i386_link_hash_entry *eh;
2179   struct elf_dyn_relocs *p;
2180   unsigned plt_entry_size;
2181 
2182   if (h->root.type == bfd_link_hash_indirect)
2183     return TRUE;
2184 
2185   eh = (struct elf_i386_link_hash_entry *) h;
2186 
2187   info = (struct bfd_link_info *) inf;
2188   htab = elf_i386_hash_table (info);
2189   if (htab == NULL)
2190     return FALSE;
2191 
2192   plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2193 
2194   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2195      here if it is defined and referenced in a non-shared object.  */
2196   if (h->type == STT_GNU_IFUNC
2197       && h->def_regular)
2198     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2199                                                plt_entry_size, 4);
2200   else if (htab->elf.dynamic_sections_created
2201 	   && h->plt.refcount > 0)
2202     {
2203       /* Make sure this symbol is output as a dynamic symbol.
2204 	 Undefined weak syms won't yet be marked as dynamic.  */
2205       if (h->dynindx == -1
2206 	  && !h->forced_local)
2207 	{
2208 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2209 	    return FALSE;
2210 	}
2211 
2212       if (info->shared
2213 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2214 	{
2215 	  asection *s = htab->elf.splt;
2216 
2217 	  /* If this is the first .plt entry, make room for the special
2218 	     first entry.  */
2219 	  if (s->size == 0)
2220 	    s->size += plt_entry_size;
2221 
2222 	  h->plt.offset = s->size;
2223 
2224 	  /* If this symbol is not defined in a regular file, and we are
2225 	     not generating a shared library, then set the symbol to this
2226 	     location in the .plt.  This is required to make function
2227 	     pointers compare as equal between the normal executable and
2228 	     the shared library.  */
2229 	  if (! info->shared
2230 	      && !h->def_regular)
2231 	    {
2232 	      h->root.u.def.section = s;
2233 	      h->root.u.def.value = h->plt.offset;
2234 	    }
2235 
2236 	  /* Make room for this entry.  */
2237 	  s->size += plt_entry_size;
2238 
2239 	  /* We also need to make an entry in the .got.plt section, which
2240 	     will be placed in the .got section by the linker script.  */
2241 	  htab->elf.sgotplt->size += 4;
2242 
2243 	  /* We also need to make an entry in the .rel.plt section.  */
2244 	  htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2245 	  htab->elf.srelplt->reloc_count++;
2246 
2247 	  if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2248               && !info->shared)
2249 	    {
2250 	      /* VxWorks has a second set of relocations for each PLT entry
2251 		 in executables.  They go in a separate relocation section,
2252 		 which is processed by the kernel loader.  */
2253 
2254 	      /* There are two relocations for the initial PLT entry: an
2255 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2256 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
2257 
2258 	      if (h->plt.offset == plt_entry_size)
2259 		htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2260 
2261 	      /* There are two extra relocations for each subsequent PLT entry:
2262 		 an R_386_32 relocation for the GOT entry, and an R_386_32
2263 		 relocation for the PLT entry.  */
2264 
2265 	      htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2266 	    }
2267 	}
2268       else
2269 	{
2270 	  h->plt.offset = (bfd_vma) -1;
2271 	  h->needs_plt = 0;
2272 	}
2273     }
2274   else
2275     {
2276       h->plt.offset = (bfd_vma) -1;
2277       h->needs_plt = 0;
2278     }
2279 
2280   eh->tlsdesc_got = (bfd_vma) -1;
2281 
2282   /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2283      make it a R_386_TLS_LE_32 requiring no TLS entry.  */
2284   if (h->got.refcount > 0
2285       && info->executable
2286       && h->dynindx == -1
2287       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2288     h->got.offset = (bfd_vma) -1;
2289   else if (h->got.refcount > 0)
2290     {
2291       asection *s;
2292       bfd_boolean dyn;
2293       int tls_type = elf_i386_hash_entry(h)->tls_type;
2294 
2295       /* Make sure this symbol is output as a dynamic symbol.
2296 	 Undefined weak syms won't yet be marked as dynamic.  */
2297       if (h->dynindx == -1
2298 	  && !h->forced_local)
2299 	{
2300 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2301 	    return FALSE;
2302 	}
2303 
2304       s = htab->elf.sgot;
2305       if (GOT_TLS_GDESC_P (tls_type))
2306 	{
2307 	  eh->tlsdesc_got = htab->elf.sgotplt->size
2308 	    - elf_i386_compute_jump_table_size (htab);
2309 	  htab->elf.sgotplt->size += 8;
2310 	  h->got.offset = (bfd_vma) -2;
2311 	}
2312       if (! GOT_TLS_GDESC_P (tls_type)
2313 	  || GOT_TLS_GD_P (tls_type))
2314 	{
2315 	  h->got.offset = s->size;
2316 	  s->size += 4;
2317 	  /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
2318 	  if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2319 	    s->size += 4;
2320 	}
2321       dyn = htab->elf.dynamic_sections_created;
2322       /* R_386_TLS_IE_32 needs one dynamic relocation,
2323 	 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2324 	 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2325 	 need two), R_386_TLS_GD needs one if local symbol and two if
2326 	 global.  */
2327       if (tls_type == GOT_TLS_IE_BOTH)
2328 	htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2329       else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2330 	       || (tls_type & GOT_TLS_IE))
2331 	htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2332       else if (GOT_TLS_GD_P (tls_type))
2333 	htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2334       else if (! GOT_TLS_GDESC_P (tls_type)
2335 	       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2336 		   || h->root.type != bfd_link_hash_undefweak)
2337 	       && (info->shared
2338 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2339 	htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2340       if (GOT_TLS_GDESC_P (tls_type))
2341 	htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2342     }
2343   else
2344     h->got.offset = (bfd_vma) -1;
2345 
2346   if (eh->dyn_relocs == NULL)
2347     return TRUE;
2348 
2349   /* In the shared -Bsymbolic case, discard space allocated for
2350      dynamic pc-relative relocs against symbols which turn out to be
2351      defined in regular objects.  For the normal shared case, discard
2352      space for pc-relative relocs that have become local due to symbol
2353      visibility changes.  */
2354 
2355   if (info->shared)
2356     {
2357       /* The only reloc that uses pc_count is R_386_PC32, which will
2358 	 appear on a call or on something like ".long foo - .".  We
2359 	 want calls to protected symbols to resolve directly to the
2360 	 function rather than going via the plt.  If people want
2361 	 function pointer comparisons to work as expected then they
2362 	 should avoid writing assembly like ".long foo - .".  */
2363       if (SYMBOL_CALLS_LOCAL (info, h))
2364 	{
2365 	  struct elf_dyn_relocs **pp;
2366 
2367 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2368 	    {
2369 	      p->count -= p->pc_count;
2370 	      p->pc_count = 0;
2371 	      if (p->count == 0)
2372 		*pp = p->next;
2373 	      else
2374 		pp = &p->next;
2375 	    }
2376 	}
2377 
2378       if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2379 	{
2380 	  struct elf_dyn_relocs **pp;
2381 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2382 	    {
2383 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2384 		*pp = p->next;
2385 	      else
2386 		pp = &p->next;
2387 	    }
2388 	}
2389 
2390       /* Also discard relocs on undefined weak syms with non-default
2391     	 visibility.  */
2392       if (eh->dyn_relocs != NULL
2393 	  && h->root.type == bfd_link_hash_undefweak)
2394 	{
2395 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2396 	    eh->dyn_relocs = NULL;
2397 
2398 	  /* Make sure undefined weak symbols are output as a dynamic
2399 	     symbol in PIEs.  */
2400 	  else if (h->dynindx == -1
2401 		   && !h->forced_local)
2402 	    {
2403 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2404 		return FALSE;
2405 	    }
2406 	}
2407     }
2408   else if (ELIMINATE_COPY_RELOCS)
2409     {
2410       /* For the non-shared case, discard space for relocs against
2411 	 symbols which turn out to need copy relocs or are not
2412 	 dynamic.  */
2413 
2414       if (!h->non_got_ref
2415 	  && ((h->def_dynamic
2416 	       && !h->def_regular)
2417 	      || (htab->elf.dynamic_sections_created
2418 		  && (h->root.type == bfd_link_hash_undefweak
2419 		      || h->root.type == bfd_link_hash_undefined))))
2420 	{
2421 	  /* Make sure this symbol is output as a dynamic symbol.
2422 	     Undefined weak syms won't yet be marked as dynamic.  */
2423 	  if (h->dynindx == -1
2424 	      && !h->forced_local)
2425 	    {
2426 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2427 		return FALSE;
2428 	    }
2429 
2430 	  /* If that succeeded, we know we'll be keeping all the
2431 	     relocs.  */
2432 	  if (h->dynindx != -1)
2433 	    goto keep;
2434 	}
2435 
2436       eh->dyn_relocs = NULL;
2437 
2438     keep: ;
2439     }
2440 
2441   /* Finally, allocate space.  */
2442   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2443     {
2444       asection *sreloc;
2445 
2446       sreloc = elf_section_data (p->sec)->sreloc;
2447 
2448       BFD_ASSERT (sreloc != NULL);
2449       sreloc->size += p->count * sizeof (Elf32_External_Rel);
2450     }
2451 
2452   return TRUE;
2453 }
2454 
2455 /* Allocate space in .plt, .got and associated reloc sections for
2456    local dynamic relocs.  */
2457 
2458 static bfd_boolean
2459 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2460 {
2461   struct elf_link_hash_entry *h
2462     = (struct elf_link_hash_entry *) *slot;
2463 
2464   if (h->type != STT_GNU_IFUNC
2465       || !h->def_regular
2466       || !h->ref_regular
2467       || !h->forced_local
2468       || h->root.type != bfd_link_hash_defined)
2469     abort ();
2470 
2471   return elf_i386_allocate_dynrelocs (h, inf);
2472 }
2473 
2474 /* Find any dynamic relocs that apply to read-only sections.  */
2475 
2476 static bfd_boolean
2477 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2478 {
2479   struct elf_i386_link_hash_entry *eh;
2480   struct elf_dyn_relocs *p;
2481 
2482   /* Skip local IFUNC symbols. */
2483   if (h->forced_local && h->type == STT_GNU_IFUNC)
2484     return TRUE;
2485 
2486   eh = (struct elf_i386_link_hash_entry *) h;
2487   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2488     {
2489       asection *s = p->sec->output_section;
2490 
2491       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2492 	{
2493 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
2494 
2495 	  info->flags |= DF_TEXTREL;
2496 
2497 	  if (info->warn_shared_textrel && info->shared)
2498 	    info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2499 				    p->sec->owner, h->root.root.string,
2500 				    p->sec);
2501 
2502 	  /* Not an error, just cut short the traversal.  */
2503 	  return FALSE;
2504 	}
2505     }
2506   return TRUE;
2507 }
2508 
2509 /* Convert
2510    mov foo@GOT(%reg), %reg
2511    to
2512    lea foo@GOTOFF(%reg), %reg
2513    with the local symbol, foo.  */
2514 
2515 static bfd_boolean
2516 elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
2517 			     struct bfd_link_info *link_info)
2518 {
2519   Elf_Internal_Shdr *symtab_hdr;
2520   Elf_Internal_Rela *internal_relocs;
2521   Elf_Internal_Rela *irel, *irelend;
2522   bfd_byte *contents;
2523   struct elf_i386_link_hash_table *htab;
2524   bfd_boolean changed_contents;
2525   bfd_boolean changed_relocs;
2526   bfd_signed_vma *local_got_refcounts;
2527 
2528   /* Don't even try to convert non-ELF outputs.  */
2529   if (!is_elf_hash_table (link_info->hash))
2530     return FALSE;
2531 
2532   /* Nothing to do if there are no codes, no relocations or no output.  */
2533   if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2534       || sec->reloc_count == 0
2535       || discarded_section (sec))
2536     return TRUE;
2537 
2538   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2539 
2540   /* Load the relocations for this section.  */
2541   internal_relocs = (_bfd_elf_link_read_relocs
2542 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2543 		      link_info->keep_memory));
2544   if (internal_relocs == NULL)
2545     return FALSE;
2546 
2547   htab = elf_i386_hash_table (link_info);
2548   changed_contents = FALSE;
2549   changed_relocs = FALSE;
2550   local_got_refcounts = elf_local_got_refcounts (abfd);
2551 
2552   /* Get the section contents.  */
2553   if (elf_section_data (sec)->this_hdr.contents != NULL)
2554     contents = elf_section_data (sec)->this_hdr.contents;
2555   else
2556     {
2557       if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2558 	goto error_return;
2559     }
2560 
2561   irelend = internal_relocs + sec->reloc_count;
2562   for (irel = internal_relocs; irel < irelend; irel++)
2563     {
2564       unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2565       unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2566       unsigned int indx;
2567       struct elf_link_hash_entry *h;
2568 
2569       if (r_type != R_386_GOT32)
2570 	continue;
2571 
2572       /* Get the symbol referred to by the reloc.  */
2573       if (r_symndx < symtab_hdr->sh_info)
2574 	{
2575 	  Elf_Internal_Sym *isym;
2576 
2577 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2578 					abfd, r_symndx);
2579 
2580 	  /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  */
2581 	  if (ELF_ST_TYPE (isym->st_info) != STT_GNU_IFUNC
2582 	      && bfd_get_8 (input_bfd,
2583 			    contents + irel->r_offset - 2) == 0x8b)
2584 	    {
2585 	      bfd_put_8 (output_bfd, 0x8d,
2586 			 contents + irel->r_offset - 2);
2587 	      irel->r_info = ELF32_R_INFO (r_symndx, R_386_GOTOFF);
2588 	      if (local_got_refcounts != NULL
2589 		  && local_got_refcounts[r_symndx] > 0)
2590 		local_got_refcounts[r_symndx] -= 1;
2591 	      changed_contents = TRUE;
2592 	      changed_relocs = TRUE;
2593 	    }
2594 	  continue;
2595 	}
2596 
2597       indx = r_symndx - symtab_hdr->sh_info;
2598       h = elf_sym_hashes (abfd)[indx];
2599       BFD_ASSERT (h != NULL);
2600 
2601       while (h->root.type == bfd_link_hash_indirect
2602 	     || h->root.type == bfd_link_hash_warning)
2603 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
2604 
2605       /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  We also avoid
2606 	 optimizing _DYNAMIC since ld.so may use its link-time address.  */
2607       if (h->def_regular
2608 	  && h->type != STT_GNU_IFUNC
2609 	  && h != htab->elf.hdynamic
2610 	  && SYMBOL_REFERENCES_LOCAL (link_info, h)
2611 	  && bfd_get_8 (input_bfd,
2612 			contents + irel->r_offset - 2) == 0x8b)
2613 	{
2614 	  bfd_put_8 (output_bfd, 0x8d,
2615 		     contents + irel->r_offset - 2);
2616 	  irel->r_info = ELF32_R_INFO (r_symndx, R_386_GOTOFF);
2617 	  if (h->got.refcount > 0)
2618 	    h->got.refcount -= 1;
2619 	  changed_contents = TRUE;
2620 	  changed_relocs = TRUE;
2621 	}
2622     }
2623 
2624   if (contents != NULL
2625       && elf_section_data (sec)->this_hdr.contents != contents)
2626     {
2627       if (!changed_contents && !link_info->keep_memory)
2628 	free (contents);
2629       else
2630 	{
2631 	  /* Cache the section contents for elf_link_input_bfd.  */
2632 	  elf_section_data (sec)->this_hdr.contents = contents;
2633 	}
2634     }
2635 
2636   if (elf_section_data (sec)->relocs != internal_relocs)
2637     {
2638       if (!changed_relocs)
2639 	free (internal_relocs);
2640       else
2641 	elf_section_data (sec)->relocs = internal_relocs;
2642     }
2643 
2644   return TRUE;
2645 
2646  error_return:
2647   if (contents != NULL
2648       && elf_section_data (sec)->this_hdr.contents != contents)
2649     free (contents);
2650   if (internal_relocs != NULL
2651       && elf_section_data (sec)->relocs != internal_relocs)
2652     free (internal_relocs);
2653   return FALSE;
2654 }
2655 
2656 /* Set the sizes of the dynamic sections.  */
2657 
2658 static bfd_boolean
2659 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
2660 {
2661   struct elf_i386_link_hash_table *htab;
2662   bfd *dynobj;
2663   asection *s;
2664   bfd_boolean relocs;
2665   bfd *ibfd;
2666 
2667   htab = elf_i386_hash_table (info);
2668   if (htab == NULL)
2669     return FALSE;
2670   dynobj = htab->elf.dynobj;
2671   if (dynobj == NULL)
2672     abort ();
2673 
2674   if (htab->elf.dynamic_sections_created)
2675     {
2676       /* Set the contents of the .interp section to the interpreter.  */
2677       if (info->executable)
2678 	{
2679 	  s = bfd_get_linker_section (dynobj, ".interp");
2680 	  if (s == NULL)
2681 	    abort ();
2682 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2683 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2684 	}
2685     }
2686 
2687   /* Set up .got offsets for local syms, and space for local dynamic
2688      relocs.  */
2689   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2690     {
2691       bfd_signed_vma *local_got;
2692       bfd_signed_vma *end_local_got;
2693       char *local_tls_type;
2694       bfd_vma *local_tlsdesc_gotent;
2695       bfd_size_type locsymcount;
2696       Elf_Internal_Shdr *symtab_hdr;
2697       asection *srel;
2698 
2699       if (! is_i386_elf (ibfd))
2700 	continue;
2701 
2702       for (s = ibfd->sections; s != NULL; s = s->next)
2703 	{
2704 	  struct elf_dyn_relocs *p;
2705 
2706 	  if (!elf_i386_convert_mov_to_lea (ibfd, s, info))
2707 	    return FALSE;
2708 
2709 	  for (p = ((struct elf_dyn_relocs *)
2710 		     elf_section_data (s)->local_dynrel);
2711 	       p != NULL;
2712 	       p = p->next)
2713 	    {
2714 	      if (!bfd_is_abs_section (p->sec)
2715 		  && bfd_is_abs_section (p->sec->output_section))
2716 		{
2717 		  /* Input section has been discarded, either because
2718 		     it is a copy of a linkonce section or due to
2719 		     linker script /DISCARD/, so we'll be discarding
2720 		     the relocs too.  */
2721 		}
2722 	      else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
2723 		       && strcmp (p->sec->output_section->name,
2724 				  ".tls_vars") == 0)
2725 		{
2726 		  /* Relocations in vxworks .tls_vars sections are
2727 		     handled specially by the loader.  */
2728 		}
2729 	      else if (p->count != 0)
2730 		{
2731 		  srel = elf_section_data (p->sec)->sreloc;
2732 		  srel->size += p->count * sizeof (Elf32_External_Rel);
2733 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0
2734 		      && (info->flags & DF_TEXTREL) == 0)
2735 		    {
2736 		      info->flags |= DF_TEXTREL;
2737 		      if (info->warn_shared_textrel && info->shared)
2738 			info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2739 						p->sec->owner, p->sec);
2740 		    }
2741 		}
2742 	    }
2743 	}
2744 
2745       local_got = elf_local_got_refcounts (ibfd);
2746       if (!local_got)
2747 	continue;
2748 
2749       symtab_hdr = &elf_symtab_hdr (ibfd);
2750       locsymcount = symtab_hdr->sh_info;
2751       end_local_got = local_got + locsymcount;
2752       local_tls_type = elf_i386_local_got_tls_type (ibfd);
2753       local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
2754       s = htab->elf.sgot;
2755       srel = htab->elf.srelgot;
2756       for (; local_got < end_local_got;
2757 	   ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2758 	{
2759 	  *local_tlsdesc_gotent = (bfd_vma) -1;
2760 	  if (*local_got > 0)
2761 	    {
2762 	      if (GOT_TLS_GDESC_P (*local_tls_type))
2763 		{
2764 		  *local_tlsdesc_gotent = htab->elf.sgotplt->size
2765 		    - elf_i386_compute_jump_table_size (htab);
2766 		  htab->elf.sgotplt->size += 8;
2767 		  *local_got = (bfd_vma) -2;
2768 		}
2769 	      if (! GOT_TLS_GDESC_P (*local_tls_type)
2770 		  || GOT_TLS_GD_P (*local_tls_type))
2771 		{
2772 		  *local_got = s->size;
2773 		  s->size += 4;
2774 		  if (GOT_TLS_GD_P (*local_tls_type)
2775 		      || *local_tls_type == GOT_TLS_IE_BOTH)
2776 		    s->size += 4;
2777 		}
2778 	      if (info->shared
2779 		  || GOT_TLS_GD_ANY_P (*local_tls_type)
2780 		  || (*local_tls_type & GOT_TLS_IE))
2781 		{
2782 		  if (*local_tls_type == GOT_TLS_IE_BOTH)
2783 		    srel->size += 2 * sizeof (Elf32_External_Rel);
2784 		  else if (GOT_TLS_GD_P (*local_tls_type)
2785 			   || ! GOT_TLS_GDESC_P (*local_tls_type))
2786 		    srel->size += sizeof (Elf32_External_Rel);
2787 		  if (GOT_TLS_GDESC_P (*local_tls_type))
2788 		    htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2789 		}
2790 	    }
2791 	  else
2792 	    *local_got = (bfd_vma) -1;
2793 	}
2794     }
2795 
2796   if (htab->tls_ldm_got.refcount > 0)
2797     {
2798       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
2799 	 relocs.  */
2800       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2801       htab->elf.sgot->size += 8;
2802       htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2803     }
2804   else
2805     htab->tls_ldm_got.offset = -1;
2806 
2807   /* Allocate global sym .plt and .got entries, and space for global
2808      sym dynamic relocs.  */
2809   elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
2810 
2811   /* Allocate .plt and .got entries, and space for local symbols.  */
2812   htab_traverse (htab->loc_hash_table,
2813 		 elf_i386_allocate_local_dynrelocs,
2814 		 info);
2815 
2816   /* For every jump slot reserved in the sgotplt, reloc_count is
2817      incremented.  However, when we reserve space for TLS descriptors,
2818      it's not incremented, so in order to compute the space reserved
2819      for them, it suffices to multiply the reloc count by the jump
2820      slot size.
2821 
2822      PR ld/13302: We start next_irelative_index at the end of .rela.plt
2823      so that R_386_IRELATIVE entries come last.  */
2824   if (htab->elf.srelplt)
2825     {
2826       htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
2827       htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
2828       htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2829     }
2830   else if (htab->elf.irelplt)
2831     htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2832 
2833 
2834   if (htab->elf.sgotplt)
2835     {
2836       /* Don't allocate .got.plt section if there are no GOT nor PLT
2837          entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
2838       if ((htab->elf.hgot == NULL
2839 	   || !htab->elf.hgot->ref_regular_nonweak)
2840 	  && (htab->elf.sgotplt->size
2841 	      == get_elf_backend_data (output_bfd)->got_header_size)
2842 	  && (htab->elf.splt == NULL
2843 	      || htab->elf.splt->size == 0)
2844 	  && (htab->elf.sgot == NULL
2845 	      || htab->elf.sgot->size == 0)
2846 	  && (htab->elf.iplt == NULL
2847 	      || htab->elf.iplt->size == 0)
2848 	  && (htab->elf.igotplt == NULL
2849 	      || htab->elf.igotplt->size == 0))
2850 	htab->elf.sgotplt->size = 0;
2851     }
2852 
2853 
2854   if (htab->plt_eh_frame != NULL
2855       && htab->elf.splt != NULL
2856       && htab->elf.splt->size != 0
2857       && !bfd_is_abs_section (htab->elf.splt->output_section)
2858       && _bfd_elf_eh_frame_present (info))
2859     htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
2860 
2861   /* We now have determined the sizes of the various dynamic sections.
2862      Allocate memory for them.  */
2863   relocs = FALSE;
2864   for (s = dynobj->sections; s != NULL; s = s->next)
2865     {
2866       bfd_boolean strip_section = TRUE;
2867 
2868       if ((s->flags & SEC_LINKER_CREATED) == 0)
2869 	continue;
2870 
2871       if (s == htab->elf.splt
2872 	  || s == htab->elf.sgot)
2873 	{
2874 	  /* Strip this section if we don't need it; see the
2875 	     comment below.  */
2876 	  /* We'd like to strip these sections if they aren't needed, but if
2877 	     we've exported dynamic symbols from them we must leave them.
2878 	     It's too late to tell BFD to get rid of the symbols.  */
2879 
2880 	  if (htab->elf.hplt != NULL)
2881 	    strip_section = FALSE;
2882 	}
2883       else if (s == htab->elf.sgotplt
2884 	       || s == htab->elf.iplt
2885 	       || s == htab->elf.igotplt
2886 	       || s == htab->plt_eh_frame
2887 	       || s == htab->sdynbss)
2888 	{
2889 	  /* Strip these too.  */
2890 	}
2891       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
2892 	{
2893 	  if (s->size != 0
2894 	      && s != htab->elf.srelplt
2895 	      && s != htab->srelplt2)
2896 	    relocs = TRUE;
2897 
2898 	  /* We use the reloc_count field as a counter if we need
2899 	     to copy relocs into the output file.  */
2900 	  s->reloc_count = 0;
2901 	}
2902       else
2903 	{
2904 	  /* It's not one of our sections, so don't allocate space.  */
2905 	  continue;
2906 	}
2907 
2908       if (s->size == 0)
2909 	{
2910 	  /* If we don't need this section, strip it from the
2911 	     output file.  This is mostly to handle .rel.bss and
2912 	     .rel.plt.  We must create both sections in
2913 	     create_dynamic_sections, because they must be created
2914 	     before the linker maps input sections to output
2915 	     sections.  The linker does that before
2916 	     adjust_dynamic_symbol is called, and it is that
2917 	     function which decides whether anything needs to go
2918 	     into these sections.  */
2919 	  if (strip_section)
2920 	    s->flags |= SEC_EXCLUDE;
2921 	  continue;
2922 	}
2923 
2924       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2925 	continue;
2926 
2927       /* Allocate memory for the section contents.  We use bfd_zalloc
2928 	 here in case unused entries are not reclaimed before the
2929 	 section's contents are written out.  This should not happen,
2930 	 but this way if it does, we get a R_386_NONE reloc instead
2931 	 of garbage.  */
2932       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
2933       if (s->contents == NULL)
2934 	return FALSE;
2935     }
2936 
2937   if (htab->plt_eh_frame != NULL
2938       && htab->plt_eh_frame->contents != NULL)
2939     {
2940       memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
2941 	      sizeof (elf_i386_eh_frame_plt));
2942       bfd_put_32 (dynobj, htab->elf.splt->size,
2943 		  htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2944     }
2945 
2946   if (htab->elf.dynamic_sections_created)
2947     {
2948       /* Add some entries to the .dynamic section.  We fill in the
2949 	 values later, in elf_i386_finish_dynamic_sections, but we
2950 	 must add the entries now so that we get the correct size for
2951 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2952 	 dynamic linker and used by the debugger.  */
2953 #define add_dynamic_entry(TAG, VAL) \
2954   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2955 
2956       if (info->executable)
2957 	{
2958 	  if (!add_dynamic_entry (DT_DEBUG, 0))
2959 	    return FALSE;
2960 	}
2961 
2962       if (htab->elf.splt->size != 0)
2963 	{
2964 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
2965 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
2966 	      || !add_dynamic_entry (DT_PLTREL, DT_REL)
2967 	      || !add_dynamic_entry (DT_JMPREL, 0))
2968 	    return FALSE;
2969 	}
2970 
2971       if (relocs)
2972 	{
2973 	  if (!add_dynamic_entry (DT_REL, 0)
2974 	      || !add_dynamic_entry (DT_RELSZ, 0)
2975 	      || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
2976 	    return FALSE;
2977 
2978 	  /* If any dynamic relocs apply to a read-only section,
2979 	     then we need a DT_TEXTREL entry.  */
2980 	  if ((info->flags & DF_TEXTREL) == 0)
2981 	    elf_link_hash_traverse (&htab->elf,
2982 				    elf_i386_readonly_dynrelocs, info);
2983 
2984 	  if ((info->flags & DF_TEXTREL) != 0)
2985 	    {
2986 	      if (!add_dynamic_entry (DT_TEXTREL, 0))
2987 		return FALSE;
2988 	    }
2989 	}
2990       if (get_elf_i386_backend_data (output_bfd)->is_vxworks
2991 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
2992 	return FALSE;
2993     }
2994 #undef add_dynamic_entry
2995 
2996   return TRUE;
2997 }
2998 
2999 static bfd_boolean
3000 elf_i386_always_size_sections (bfd *output_bfd,
3001 			       struct bfd_link_info *info)
3002 {
3003   asection *tls_sec = elf_hash_table (info)->tls_sec;
3004 
3005   if (tls_sec)
3006     {
3007       struct elf_link_hash_entry *tlsbase;
3008 
3009       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3010 				      "_TLS_MODULE_BASE_",
3011 				      FALSE, FALSE, FALSE);
3012 
3013       if (tlsbase && tlsbase->type == STT_TLS)
3014 	{
3015 	  struct elf_i386_link_hash_table *htab;
3016 	  struct bfd_link_hash_entry *bh = NULL;
3017 	  const struct elf_backend_data *bed
3018 	    = get_elf_backend_data (output_bfd);
3019 
3020 	  htab = elf_i386_hash_table (info);
3021 	  if (htab == NULL)
3022 	    return FALSE;
3023 
3024 	  if (!(_bfd_generic_link_add_one_symbol
3025 		(info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3026 		 tls_sec, 0, NULL, FALSE,
3027 		 bed->collect, &bh)))
3028 	    return FALSE;
3029 
3030 	  htab->tls_module_base = bh;
3031 
3032 	  tlsbase = (struct elf_link_hash_entry *)bh;
3033 	  tlsbase->def_regular = 1;
3034 	  tlsbase->other = STV_HIDDEN;
3035 	  (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3036 	}
3037     }
3038 
3039   return TRUE;
3040 }
3041 
3042 /* Set the correct type for an x86 ELF section.  We do this by the
3043    section name, which is a hack, but ought to work.  */
3044 
3045 static bfd_boolean
3046 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3047 			Elf_Internal_Shdr *hdr,
3048 			asection *sec)
3049 {
3050   const char *name;
3051 
3052   name = bfd_get_section_name (abfd, sec);
3053 
3054   /* This is an ugly, but unfortunately necessary hack that is
3055      needed when producing EFI binaries on x86. It tells
3056      elf.c:elf_fake_sections() not to consider ".reloc" as a section
3057      containing ELF relocation info.  We need this hack in order to
3058      be able to generate ELF binaries that can be translated into
3059      EFI applications (which are essentially COFF objects).  Those
3060      files contain a COFF ".reloc" section inside an ELFNN object,
3061      which would normally cause BFD to segfault because it would
3062      attempt to interpret this section as containing relocation
3063      entries for section "oc".  With this hack enabled, ".reloc"
3064      will be treated as a normal data section, which will avoid the
3065      segfault.  However, you won't be able to create an ELFNN binary
3066      with a section named "oc" that needs relocations, but that's
3067      the kind of ugly side-effects you get when detecting section
3068      types based on their names...  In practice, this limitation is
3069      unlikely to bite.  */
3070   if (strcmp (name, ".reloc") == 0)
3071     hdr->sh_type = SHT_PROGBITS;
3072 
3073   return TRUE;
3074 }
3075 
3076 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3077    executables.  Rather than setting it to the beginning of the TLS
3078    section, we have to set it to the end.    This function may be called
3079    multiple times, it is idempotent.  */
3080 
3081 static void
3082 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3083 {
3084   struct elf_i386_link_hash_table *htab;
3085   struct bfd_link_hash_entry *base;
3086 
3087   if (!info->executable)
3088     return;
3089 
3090   htab = elf_i386_hash_table (info);
3091   if (htab == NULL)
3092     return;
3093 
3094   base = htab->tls_module_base;
3095   if (base == NULL)
3096     return;
3097 
3098   base->u.def.value = htab->elf.tls_size;
3099 }
3100 
3101 /* Return the base VMA address which should be subtracted from real addresses
3102    when resolving @dtpoff relocation.
3103    This is PT_TLS segment p_vaddr.  */
3104 
3105 static bfd_vma
3106 elf_i386_dtpoff_base (struct bfd_link_info *info)
3107 {
3108   /* If tls_sec is NULL, we should have signalled an error already.  */
3109   if (elf_hash_table (info)->tls_sec == NULL)
3110     return 0;
3111   return elf_hash_table (info)->tls_sec->vma;
3112 }
3113 
3114 /* Return the relocation value for @tpoff relocation
3115    if STT_TLS virtual address is ADDRESS.  */
3116 
3117 static bfd_vma
3118 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3119 {
3120   struct elf_link_hash_table *htab = elf_hash_table (info);
3121   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3122   bfd_vma static_tls_size;
3123 
3124   /* If tls_sec is NULL, we should have signalled an error already.  */
3125   if (htab->tls_sec == NULL)
3126     return 0;
3127 
3128   /* Consider special static TLS alignment requirements.  */
3129   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3130   return static_tls_size + htab->tls_sec->vma - address;
3131 }
3132 
3133 /* Relocate an i386 ELF section.  */
3134 
3135 static bfd_boolean
3136 elf_i386_relocate_section (bfd *output_bfd,
3137 			   struct bfd_link_info *info,
3138 			   bfd *input_bfd,
3139 			   asection *input_section,
3140 			   bfd_byte *contents,
3141 			   Elf_Internal_Rela *relocs,
3142 			   Elf_Internal_Sym *local_syms,
3143 			   asection **local_sections)
3144 {
3145   struct elf_i386_link_hash_table *htab;
3146   Elf_Internal_Shdr *symtab_hdr;
3147   struct elf_link_hash_entry **sym_hashes;
3148   bfd_vma *local_got_offsets;
3149   bfd_vma *local_tlsdesc_gotents;
3150   Elf_Internal_Rela *rel;
3151   Elf_Internal_Rela *relend;
3152   bfd_boolean is_vxworks_tls;
3153   unsigned plt_entry_size;
3154 
3155   BFD_ASSERT (is_i386_elf (input_bfd));
3156 
3157   htab = elf_i386_hash_table (info);
3158   if (htab == NULL)
3159     return FALSE;
3160   symtab_hdr = &elf_symtab_hdr (input_bfd);
3161   sym_hashes = elf_sym_hashes (input_bfd);
3162   local_got_offsets = elf_local_got_offsets (input_bfd);
3163   local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3164   /* We have to handle relocations in vxworks .tls_vars sections
3165      specially, because the dynamic loader is 'weird'.  */
3166   is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3167                     && info->shared
3168 		    && !strcmp (input_section->output_section->name,
3169 				".tls_vars"));
3170 
3171   elf_i386_set_tls_module_base (info);
3172 
3173   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3174 
3175   rel = relocs;
3176   relend = relocs + input_section->reloc_count;
3177   for (; rel < relend; rel++)
3178     {
3179       unsigned int r_type;
3180       reloc_howto_type *howto;
3181       unsigned long r_symndx;
3182       struct elf_link_hash_entry *h;
3183       Elf_Internal_Sym *sym;
3184       asection *sec;
3185       bfd_vma off, offplt;
3186       bfd_vma relocation;
3187       bfd_boolean unresolved_reloc;
3188       bfd_reloc_status_type r;
3189       unsigned int indx;
3190       int tls_type;
3191       bfd_vma st_size;
3192 
3193       r_type = ELF32_R_TYPE (rel->r_info);
3194       if (r_type == R_386_GNU_VTINHERIT
3195 	  || r_type == R_386_GNU_VTENTRY)
3196 	continue;
3197 
3198       if ((indx = r_type) >= R_386_standard
3199 	  && ((indx = r_type - R_386_ext_offset) - R_386_standard
3200 	      >= R_386_ext - R_386_standard)
3201 	  && ((indx = r_type - R_386_tls_offset) - R_386_ext
3202 	      >= R_386_irelative - R_386_ext))
3203 	{
3204 	  (*_bfd_error_handler)
3205 	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3206 	     input_bfd, input_section, r_type);
3207 	  bfd_set_error (bfd_error_bad_value);
3208 	  return FALSE;
3209 	}
3210       howto = elf_howto_table + indx;
3211 
3212       r_symndx = ELF32_R_SYM (rel->r_info);
3213       h = NULL;
3214       sym = NULL;
3215       sec = NULL;
3216       unresolved_reloc = FALSE;
3217       if (r_symndx < symtab_hdr->sh_info)
3218 	{
3219 	  sym = local_syms + r_symndx;
3220 	  sec = local_sections[r_symndx];
3221 	  relocation = (sec->output_section->vma
3222 			+ sec->output_offset
3223 			+ sym->st_value);
3224 	  st_size = sym->st_size;
3225 
3226 	  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3227 	      && ((sec->flags & SEC_MERGE) != 0
3228 		  || (info->relocatable
3229 		      && sec->output_offset != 0)))
3230 	    {
3231 	      bfd_vma addend;
3232 	      bfd_byte *where = contents + rel->r_offset;
3233 
3234 	      switch (howto->size)
3235 		{
3236 		case 0:
3237 		  addend = bfd_get_8 (input_bfd, where);
3238 		  if (howto->pc_relative)
3239 		    {
3240 		      addend = (addend ^ 0x80) - 0x80;
3241 		      addend += 1;
3242 		    }
3243 		  break;
3244 		case 1:
3245 		  addend = bfd_get_16 (input_bfd, where);
3246 		  if (howto->pc_relative)
3247 		    {
3248 		      addend = (addend ^ 0x8000) - 0x8000;
3249 		      addend += 2;
3250 		    }
3251 		  break;
3252 		case 2:
3253 		  addend = bfd_get_32 (input_bfd, where);
3254 		  if (howto->pc_relative)
3255 		    {
3256 		      addend = (addend ^ 0x80000000) - 0x80000000;
3257 		      addend += 4;
3258 		    }
3259 		  break;
3260 		default:
3261 		  abort ();
3262 		}
3263 
3264 	      if (info->relocatable)
3265 		addend += sec->output_offset;
3266 	      else
3267 		{
3268 		  asection *msec = sec;
3269 		  addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3270 						   addend);
3271 		  addend -= relocation;
3272 		  addend += msec->output_section->vma + msec->output_offset;
3273 		}
3274 
3275 	      switch (howto->size)
3276 		{
3277 		case 0:
3278 		  /* FIXME: overflow checks.  */
3279 		  if (howto->pc_relative)
3280 		    addend -= 1;
3281 		  bfd_put_8 (input_bfd, addend, where);
3282 		  break;
3283 		case 1:
3284 		  if (howto->pc_relative)
3285 		    addend -= 2;
3286 		  bfd_put_16 (input_bfd, addend, where);
3287 		  break;
3288 		case 2:
3289 		  if (howto->pc_relative)
3290 		    addend -= 4;
3291 		  bfd_put_32 (input_bfd, addend, where);
3292 		  break;
3293 		}
3294 	    }
3295 	  else if (!info->relocatable
3296 		   && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3297 	    {
3298 	      /* Relocate against local STT_GNU_IFUNC symbol.  */
3299 	      h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3300 					       FALSE);
3301 	      if (h == NULL)
3302 		abort ();
3303 
3304 	      /* Set STT_GNU_IFUNC symbol value.  */
3305 	      h->root.u.def.value = sym->st_value;
3306 	      h->root.u.def.section = sec;
3307 	    }
3308 	}
3309       else
3310 	{
3311 	  bfd_boolean warned ATTRIBUTE_UNUSED;
3312 
3313 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3314 				   r_symndx, symtab_hdr, sym_hashes,
3315 				   h, sec, relocation,
3316 				   unresolved_reloc, warned);
3317 	  st_size = h->size;
3318 	}
3319 
3320       if (sec != NULL && discarded_section (sec))
3321 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3322 					 rel, 1, relend, howto, 0, contents);
3323 
3324       if (info->relocatable)
3325 	continue;
3326 
3327       /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3328 	 it here if it is defined in a non-shared object.  */
3329       if (h != NULL
3330 	  && h->type == STT_GNU_IFUNC
3331 	  && h->def_regular)
3332 	{
3333 	  asection *plt, *gotplt, *base_got;
3334 	  bfd_vma plt_index;
3335 	  const char *name;
3336 
3337 	  if ((input_section->flags & SEC_ALLOC) == 0
3338 	      || h->plt.offset == (bfd_vma) -1)
3339 	    abort ();
3340 
3341 	  /* STT_GNU_IFUNC symbol must go through PLT.  */
3342 	  if (htab->elf.splt != NULL)
3343 	    {
3344 	      plt = htab->elf.splt;
3345 	      gotplt = htab->elf.sgotplt;
3346 	    }
3347 	  else
3348 	    {
3349 	      plt = htab->elf.iplt;
3350 	      gotplt = htab->elf.igotplt;
3351 	    }
3352 
3353 	  relocation = (plt->output_section->vma
3354 			+ plt->output_offset + h->plt.offset);
3355 
3356 	  switch (r_type)
3357 	    {
3358 	    default:
3359 	      if (h->root.root.string)
3360 		name = h->root.root.string;
3361 	      else
3362 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3363 					 NULL);
3364 	      (*_bfd_error_handler)
3365 		(_("%B: relocation %s against STT_GNU_IFUNC "
3366 		   "symbol `%s' isn't handled by %s"), input_bfd,
3367 		 elf_howto_table[r_type].name,
3368 		 name, __FUNCTION__);
3369 	      bfd_set_error (bfd_error_bad_value);
3370 	      return FALSE;
3371 
3372 	    case R_386_32:
3373 	      /* Generate dynamic relcoation only when there is a
3374 		 non-GOT reference in a shared object.  */
3375 	      if (info->shared && h->non_got_ref)
3376 		{
3377 		  Elf_Internal_Rela outrel;
3378 		  asection *sreloc;
3379 		  bfd_vma offset;
3380 
3381 		  /* Need a dynamic relocation to get the real function
3382 		     adddress.  */
3383 		  offset = _bfd_elf_section_offset (output_bfd,
3384 						    info,
3385 						    input_section,
3386 						    rel->r_offset);
3387 		  if (offset == (bfd_vma) -1
3388 		      || offset == (bfd_vma) -2)
3389 		    abort ();
3390 
3391 		  outrel.r_offset = (input_section->output_section->vma
3392 				     + input_section->output_offset
3393 				     + offset);
3394 
3395 		  if (h->dynindx == -1
3396 		      || h->forced_local
3397 		      || info->executable)
3398 		    {
3399 		      /* This symbol is resolved locally.  */
3400 		      outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3401 		      bfd_put_32 (output_bfd,
3402 				  (h->root.u.def.value
3403 				   + h->root.u.def.section->output_section->vma
3404 				   + h->root.u.def.section->output_offset),
3405 				  contents + offset);
3406 		    }
3407 		  else
3408 		    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3409 
3410 		  sreloc = htab->elf.irelifunc;
3411 		  elf_append_rel (output_bfd, sreloc, &outrel);
3412 
3413 		  /* If this reloc is against an external symbol, we
3414 		     do not want to fiddle with the addend.  Otherwise,
3415 		     we need to include the symbol value so that it
3416 		     becomes an addend for the dynamic reloc.  For an
3417 		     internal symbol, we have updated addend.  */
3418 		  continue;
3419 		}
3420 	      /* FALLTHROUGH */
3421 	    case R_386_PC32:
3422 	    case R_386_PLT32:
3423 	      goto do_relocation;
3424 
3425 	    case R_386_GOT32:
3426 	      base_got = htab->elf.sgot;
3427 	      off = h->got.offset;
3428 
3429 	      if (base_got == NULL)
3430 		abort ();
3431 
3432 	      if (off == (bfd_vma) -1)
3433 		{
3434 		  /* We can't use h->got.offset here to save state, or
3435 		     even just remember the offset, as finish_dynamic_symbol
3436 		     would use that as offset into .got.  */
3437 
3438 		  if (htab->elf.splt != NULL)
3439 		    {
3440 		      plt_index = h->plt.offset / plt_entry_size - 1;
3441 		      off = (plt_index + 3) * 4;
3442 		      base_got = htab->elf.sgotplt;
3443 		    }
3444 		  else
3445 		    {
3446 		      plt_index = h->plt.offset / plt_entry_size;
3447 		      off = plt_index * 4;
3448 		      base_got = htab->elf.igotplt;
3449 		    }
3450 
3451 		  if (h->dynindx == -1
3452 		      || h->forced_local
3453 		      || info->symbolic)
3454 		    {
3455 		      /* This references the local defitionion.  We must
3456 			 initialize this entry in the global offset table.
3457 			 Since the offset must always be a multiple of 8,
3458 			 we use the least significant bit to record
3459 			 whether we have initialized it already.
3460 
3461 			 When doing a dynamic link, we create a .rela.got
3462 			 relocation entry to initialize the value.  This
3463 			 is done in the finish_dynamic_symbol routine.	 */
3464 		      if ((off & 1) != 0)
3465 			off &= ~1;
3466 		      else
3467 			{
3468 			  bfd_put_32 (output_bfd, relocation,
3469 				      base_got->contents + off);
3470 			  h->got.offset |= 1;
3471 			}
3472 		    }
3473 
3474 		  relocation = off;
3475 
3476 		  /* Adjust for static executables.  */
3477 		  if (htab->elf.splt == NULL)
3478 		    relocation += gotplt->output_offset;
3479 		}
3480 	      else
3481 		{
3482 		  relocation = (base_got->output_section->vma
3483 				+ base_got->output_offset + off
3484 				- gotplt->output_section->vma
3485 				- gotplt->output_offset);
3486 		  /* Adjust for static executables.  */
3487 		  if (htab->elf.splt == NULL)
3488 		    relocation += gotplt->output_offset;
3489 		}
3490 
3491 	      goto do_relocation;
3492 
3493 	    case R_386_GOTOFF:
3494 	      relocation -= (gotplt->output_section->vma
3495 			     + gotplt->output_offset);
3496 	      goto do_relocation;
3497 	    }
3498 	}
3499 
3500       switch (r_type)
3501 	{
3502 	case R_386_GOT32:
3503 	  /* Relocation is to the entry for this symbol in the global
3504 	     offset table.  */
3505 	  if (htab->elf.sgot == NULL)
3506 	    abort ();
3507 
3508 	  if (h != NULL)
3509 	    {
3510 	      bfd_boolean dyn;
3511 
3512 	      off = h->got.offset;
3513 	      dyn = htab->elf.dynamic_sections_created;
3514 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3515 		  || (info->shared
3516 		      && SYMBOL_REFERENCES_LOCAL (info, h))
3517 		  || (ELF_ST_VISIBILITY (h->other)
3518 		      && h->root.type == bfd_link_hash_undefweak))
3519 		{
3520 		  /* This is actually a static link, or it is a
3521 		     -Bsymbolic link and the symbol is defined
3522 		     locally, or the symbol was forced to be local
3523 		     because of a version file.  We must initialize
3524 		     this entry in the global offset table.  Since the
3525 		     offset must always be a multiple of 4, we use the
3526 		     least significant bit to record whether we have
3527 		     initialized it already.
3528 
3529 		     When doing a dynamic link, we create a .rel.got
3530 		     relocation entry to initialize the value.  This
3531 		     is done in the finish_dynamic_symbol routine.  */
3532 		  if ((off & 1) != 0)
3533 		    off &= ~1;
3534 		  else
3535 		    {
3536 		      bfd_put_32 (output_bfd, relocation,
3537 				  htab->elf.sgot->contents + off);
3538 		      h->got.offset |= 1;
3539 		    }
3540 		}
3541 	      else
3542 		unresolved_reloc = FALSE;
3543 	    }
3544 	  else
3545 	    {
3546 	      if (local_got_offsets == NULL)
3547 		abort ();
3548 
3549 	      off = local_got_offsets[r_symndx];
3550 
3551 	      /* The offset must always be a multiple of 4.  We use
3552 		 the least significant bit to record whether we have
3553 		 already generated the necessary reloc.  */
3554 	      if ((off & 1) != 0)
3555 		off &= ~1;
3556 	      else
3557 		{
3558 		  bfd_put_32 (output_bfd, relocation,
3559 			      htab->elf.sgot->contents + off);
3560 
3561 		  if (info->shared)
3562 		    {
3563 		      asection *s;
3564 		      Elf_Internal_Rela outrel;
3565 
3566 		      s = htab->elf.srelgot;
3567 		      if (s == NULL)
3568 			abort ();
3569 
3570 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
3571 					 + htab->elf.sgot->output_offset
3572 					 + off);
3573 		      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3574 		      elf_append_rel (output_bfd, s, &outrel);
3575 		    }
3576 
3577 		  local_got_offsets[r_symndx] |= 1;
3578 		}
3579 	    }
3580 
3581 	  if (off >= (bfd_vma) -2)
3582 	    abort ();
3583 
3584 	  relocation = htab->elf.sgot->output_section->vma
3585 		       + htab->elf.sgot->output_offset + off
3586 		       - htab->elf.sgotplt->output_section->vma
3587 		       - htab->elf.sgotplt->output_offset;
3588 	  break;
3589 
3590 	case R_386_GOTOFF:
3591 	  /* Relocation is relative to the start of the global offset
3592 	     table.  */
3593 
3594 	  /* Check to make sure it isn't a protected function symbol
3595 	     for shared library since it may not be local when used
3596 	     as function address.  We also need to make sure that a
3597 	     symbol is defined locally.  */
3598 	  if (info->shared && h)
3599 	    {
3600 	      if (!h->def_regular)
3601 		{
3602 		  const char *v;
3603 
3604 		  switch (ELF_ST_VISIBILITY (h->other))
3605 		    {
3606 		    case STV_HIDDEN:
3607 		      v = _("hidden symbol");
3608 		      break;
3609 		    case STV_INTERNAL:
3610 		      v = _("internal symbol");
3611 		      break;
3612 		    case STV_PROTECTED:
3613 		      v = _("protected symbol");
3614 		      break;
3615 		    default:
3616 		      v = _("symbol");
3617 		      break;
3618 		    }
3619 
3620 		  (*_bfd_error_handler)
3621 		    (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
3622 		     input_bfd, v, h->root.root.string);
3623 		  bfd_set_error (bfd_error_bad_value);
3624 		  return FALSE;
3625 		}
3626 	      else if (!info->executable
3627 		       && !SYMBOLIC_BIND (info, h)
3628 		       && h->type == STT_FUNC
3629 		       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3630 		{
3631 		  (*_bfd_error_handler)
3632 		    (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
3633 		     input_bfd, h->root.root.string);
3634 		  bfd_set_error (bfd_error_bad_value);
3635 		  return FALSE;
3636 		}
3637 	    }
3638 
3639 	  /* Note that sgot is not involved in this
3640 	     calculation.  We always want the start of .got.plt.  If we
3641 	     defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3642 	     permitted by the ABI, we might have to change this
3643 	     calculation.  */
3644 	  relocation -= htab->elf.sgotplt->output_section->vma
3645 			+ htab->elf.sgotplt->output_offset;
3646 	  break;
3647 
3648 	case R_386_GOTPC:
3649 	  /* Use global offset table as symbol value.  */
3650 	  relocation = htab->elf.sgotplt->output_section->vma
3651 		       + htab->elf.sgotplt->output_offset;
3652 	  unresolved_reloc = FALSE;
3653 	  break;
3654 
3655 	case R_386_PLT32:
3656 	  /* Relocation is to the entry for this symbol in the
3657 	     procedure linkage table.  */
3658 
3659 	  /* Resolve a PLT32 reloc against a local symbol directly,
3660 	     without using the procedure linkage table.  */
3661 	  if (h == NULL)
3662 	    break;
3663 
3664 	  if (h->plt.offset == (bfd_vma) -1
3665 	      || htab->elf.splt == NULL)
3666 	    {
3667 	      /* We didn't make a PLT entry for this symbol.  This
3668 		 happens when statically linking PIC code, or when
3669 		 using -Bsymbolic.  */
3670 	      break;
3671 	    }
3672 
3673 	  relocation = (htab->elf.splt->output_section->vma
3674 			+ htab->elf.splt->output_offset
3675 			+ h->plt.offset);
3676 	  unresolved_reloc = FALSE;
3677 	  break;
3678 
3679 	case R_386_SIZE32:
3680 	  /* Set to symbol size.  */
3681 	  relocation = st_size;
3682 	  /* Fall through.  */
3683 
3684 	case R_386_32:
3685 	case R_386_PC32:
3686 	  if ((input_section->flags & SEC_ALLOC) == 0
3687 	      || is_vxworks_tls)
3688 	    break;
3689 
3690 	  if ((info->shared
3691 	       && (h == NULL
3692 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3693 		   || h->root.type != bfd_link_hash_undefweak)
3694 	       && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
3695 		   || !SYMBOL_CALLS_LOCAL (info, h)))
3696 	      || (ELIMINATE_COPY_RELOCS
3697 		  && !info->shared
3698 		  && h != NULL
3699 		  && h->dynindx != -1
3700 		  && !h->non_got_ref
3701 		  && ((h->def_dynamic
3702 		       && !h->def_regular)
3703 		      || h->root.type == bfd_link_hash_undefweak
3704 		      || h->root.type == bfd_link_hash_undefined)))
3705 	    {
3706 	      Elf_Internal_Rela outrel;
3707 	      bfd_boolean skip, relocate;
3708 	      asection *sreloc;
3709 
3710 	      /* When generating a shared object, these relocations
3711 		 are copied into the output file to be resolved at run
3712 		 time.  */
3713 
3714 	      skip = FALSE;
3715 	      relocate = FALSE;
3716 
3717 	      outrel.r_offset =
3718 		_bfd_elf_section_offset (output_bfd, info, input_section,
3719 					 rel->r_offset);
3720 	      if (outrel.r_offset == (bfd_vma) -1)
3721 		skip = TRUE;
3722 	      else if (outrel.r_offset == (bfd_vma) -2)
3723 		skip = TRUE, relocate = TRUE;
3724 	      outrel.r_offset += (input_section->output_section->vma
3725 				  + input_section->output_offset);
3726 
3727 	      if (skip)
3728 		memset (&outrel, 0, sizeof outrel);
3729 	      else if (h != NULL
3730 		       && h->dynindx != -1
3731 		       && (r_type == R_386_PC32
3732 			   || !info->shared
3733 			   || !SYMBOLIC_BIND (info, h)
3734 			   || !h->def_regular))
3735 		outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3736 	      else
3737 		{
3738 		  /* This symbol is local, or marked to become local.  */
3739 		  relocate = TRUE;
3740 		  outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3741 		}
3742 
3743 	      sreloc = elf_section_data (input_section)->sreloc;
3744 
3745 	      if (sreloc == NULL || sreloc->contents == NULL)
3746 		{
3747 		  r = bfd_reloc_notsupported;
3748 		  goto check_relocation_error;
3749 		}
3750 
3751 	      elf_append_rel (output_bfd, sreloc, &outrel);
3752 
3753 	      /* If this reloc is against an external symbol, we do
3754 		 not want to fiddle with the addend.  Otherwise, we
3755 		 need to include the symbol value so that it becomes
3756 		 an addend for the dynamic reloc.  */
3757 	      if (! relocate)
3758 		continue;
3759 	    }
3760 	  break;
3761 
3762 	case R_386_TLS_IE:
3763 	  if (!info->executable)
3764 	    {
3765 	      Elf_Internal_Rela outrel;
3766 	      asection *sreloc;
3767 
3768 	      outrel.r_offset = rel->r_offset
3769 				+ input_section->output_section->vma
3770 				+ input_section->output_offset;
3771 	      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3772 	      sreloc = elf_section_data (input_section)->sreloc;
3773 	      if (sreloc == NULL)
3774 		abort ();
3775 	      elf_append_rel (output_bfd, sreloc, &outrel);
3776 	    }
3777 	  /* Fall through */
3778 
3779 	case R_386_TLS_GD:
3780 	case R_386_TLS_GOTDESC:
3781 	case R_386_TLS_DESC_CALL:
3782 	case R_386_TLS_IE_32:
3783 	case R_386_TLS_GOTIE:
3784 	  tls_type = GOT_UNKNOWN;
3785 	  if (h == NULL && local_got_offsets)
3786 	    tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
3787 	  else if (h != NULL)
3788 	    tls_type = elf_i386_hash_entry(h)->tls_type;
3789 	  if (tls_type == GOT_TLS_IE)
3790 	    tls_type = GOT_TLS_IE_NEG;
3791 
3792 	  if (! elf_i386_tls_transition (info, input_bfd,
3793 					 input_section, contents,
3794 					 symtab_hdr, sym_hashes,
3795 					 &r_type, tls_type, rel,
3796 					 relend, h, r_symndx))
3797 	    return FALSE;
3798 
3799 	  if (r_type == R_386_TLS_LE_32)
3800 	    {
3801 	      BFD_ASSERT (! unresolved_reloc);
3802 	      if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
3803 		{
3804 		  unsigned int type;
3805 		  bfd_vma roff;
3806 
3807 		  /* GD->LE transition.  */
3808 		  type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3809 		  if (type == 0x04)
3810 		    {
3811 		      /* leal foo(,%reg,1), %eax; call ___tls_get_addr
3812 			 Change it into:
3813 			 movl %gs:0, %eax; subl $foo@tpoff, %eax
3814 			 (6 byte form of subl).  */
3815 		      memcpy (contents + rel->r_offset - 3,
3816 			      "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3817 		      roff = rel->r_offset + 5;
3818 		    }
3819 		  else
3820 		    {
3821 		      /* leal foo(%reg), %eax; call ___tls_get_addr; nop
3822 			 Change it into:
3823 			 movl %gs:0, %eax; subl $foo@tpoff, %eax
3824 			 (6 byte form of subl).  */
3825 		      memcpy (contents + rel->r_offset - 2,
3826 			      "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3827 		      roff = rel->r_offset + 6;
3828 		    }
3829 		  bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
3830 			      contents + roff);
3831 		  /* Skip R_386_PC32/R_386_PLT32.  */
3832 		  rel++;
3833 		  continue;
3834 		}
3835 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
3836 		{
3837 		  /* GDesc -> LE transition.
3838 		     It's originally something like:
3839 		     leal x@tlsdesc(%ebx), %eax
3840 
3841 		     leal x@ntpoff, %eax
3842 
3843 		     Registers other than %eax may be set up here.  */
3844 
3845 		  unsigned int val;
3846 		  bfd_vma roff;
3847 
3848 		  roff = rel->r_offset;
3849 		  val = bfd_get_8 (input_bfd, contents + roff - 1);
3850 
3851 		  /* Now modify the instruction as appropriate.  */
3852 		  /* aoliva FIXME: remove the above and xor the byte
3853 		     below with 0x86.  */
3854 		  bfd_put_8 (output_bfd, val ^ 0x86,
3855 			     contents + roff - 1);
3856 		  bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3857 			      contents + roff);
3858 		  continue;
3859 		}
3860 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
3861 		{
3862 		  /* GDesc -> LE transition.
3863 		     It's originally:
3864 		     call *(%eax)
3865 		     Turn it into:
3866 		     xchg %ax,%ax  */
3867 
3868 		  bfd_vma roff;
3869 
3870 		  roff = rel->r_offset;
3871 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
3872 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3873 		  continue;
3874 		}
3875 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
3876 		{
3877 		  unsigned int val;
3878 
3879 		  /* IE->LE transition:
3880 		     Originally it can be one of:
3881 		     movl foo, %eax
3882 		     movl foo, %reg
3883 		     addl foo, %reg
3884 		     We change it into:
3885 		     movl $foo, %eax
3886 		     movl $foo, %reg
3887 		     addl $foo, %reg.  */
3888 		  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3889 		  if (val == 0xa1)
3890 		    {
3891 		      /* movl foo, %eax.  */
3892 		      bfd_put_8 (output_bfd, 0xb8,
3893 				 contents + rel->r_offset - 1);
3894 		    }
3895 		  else
3896 		    {
3897 		      unsigned int type;
3898 
3899 		      type = bfd_get_8 (input_bfd,
3900 					contents + rel->r_offset - 2);
3901 		      switch (type)
3902 			{
3903 			case 0x8b:
3904 			  /* movl */
3905 			  bfd_put_8 (output_bfd, 0xc7,
3906 				     contents + rel->r_offset - 2);
3907 			  bfd_put_8 (output_bfd,
3908 				     0xc0 | ((val >> 3) & 7),
3909 				     contents + rel->r_offset - 1);
3910 			  break;
3911 			case 0x03:
3912 			  /* addl */
3913 			  bfd_put_8 (output_bfd, 0x81,
3914 				     contents + rel->r_offset - 2);
3915 			  bfd_put_8 (output_bfd,
3916 				     0xc0 | ((val >> 3) & 7),
3917 				     contents + rel->r_offset - 1);
3918 			  break;
3919 			default:
3920 			  BFD_FAIL ();
3921 			  break;
3922 			}
3923 		    }
3924 		  bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3925 			      contents + rel->r_offset);
3926 		  continue;
3927 		}
3928 	      else
3929 		{
3930 		  unsigned int val, type;
3931 
3932 		  /* {IE_32,GOTIE}->LE transition:
3933 		     Originally it can be one of:
3934 		     subl foo(%reg1), %reg2
3935 		     movl foo(%reg1), %reg2
3936 		     addl foo(%reg1), %reg2
3937 		     We change it into:
3938 		     subl $foo, %reg2
3939 		     movl $foo, %reg2 (6 byte form)
3940 		     addl $foo, %reg2.  */
3941 		  type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3942 		  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3943 		  if (type == 0x8b)
3944 		    {
3945 		      /* movl */
3946 		      bfd_put_8 (output_bfd, 0xc7,
3947 				 contents + rel->r_offset - 2);
3948 		      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3949 				 contents + rel->r_offset - 1);
3950 		    }
3951 		  else if (type == 0x2b)
3952 		    {
3953 		      /* subl */
3954 		      bfd_put_8 (output_bfd, 0x81,
3955 				 contents + rel->r_offset - 2);
3956 		      bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
3957 				 contents + rel->r_offset - 1);
3958 		    }
3959 		  else if (type == 0x03)
3960 		    {
3961 		      /* addl */
3962 		      bfd_put_8 (output_bfd, 0x81,
3963 				 contents + rel->r_offset - 2);
3964 		      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3965 				 contents + rel->r_offset - 1);
3966 		    }
3967 		  else
3968 		    BFD_FAIL ();
3969 		  if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
3970 		    bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3971 				contents + rel->r_offset);
3972 		  else
3973 		    bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
3974 				contents + rel->r_offset);
3975 		  continue;
3976 		}
3977 	    }
3978 
3979 	  if (htab->elf.sgot == NULL)
3980 	    abort ();
3981 
3982 	  if (h != NULL)
3983 	    {
3984 	      off = h->got.offset;
3985 	      offplt = elf_i386_hash_entry (h)->tlsdesc_got;
3986 	    }
3987 	  else
3988 	    {
3989 	      if (local_got_offsets == NULL)
3990 		abort ();
3991 
3992 	      off = local_got_offsets[r_symndx];
3993 	      offplt = local_tlsdesc_gotents[r_symndx];
3994 	    }
3995 
3996 	  if ((off & 1) != 0)
3997 	    off &= ~1;
3998 	  else
3999 	    {
4000 	      Elf_Internal_Rela outrel;
4001 	      int dr_type;
4002 	      asection *sreloc;
4003 
4004 	      if (htab->elf.srelgot == NULL)
4005 		abort ();
4006 
4007 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
4008 
4009 	      if (GOT_TLS_GDESC_P (tls_type))
4010 		{
4011 		  bfd_byte *loc;
4012 		  outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4013 		  BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4014 			      <= htab->elf.sgotplt->size);
4015 		  outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4016 				     + htab->elf.sgotplt->output_offset
4017 				     + offplt
4018 				     + htab->sgotplt_jump_table_size);
4019 		  sreloc = htab->elf.srelplt;
4020 		  loc = sreloc->contents;
4021 		  loc += (htab->next_tls_desc_index++
4022 			  * sizeof (Elf32_External_Rel));
4023 		  BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4024 			      <= sreloc->contents + sreloc->size);
4025 		  bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4026 		  if (indx == 0)
4027 		    {
4028 		      BFD_ASSERT (! unresolved_reloc);
4029 		      bfd_put_32 (output_bfd,
4030 				  relocation - elf_i386_dtpoff_base (info),
4031 				  htab->elf.sgotplt->contents + offplt
4032 				  + htab->sgotplt_jump_table_size + 4);
4033 		    }
4034 		  else
4035 		    {
4036 		      bfd_put_32 (output_bfd, 0,
4037 				  htab->elf.sgotplt->contents + offplt
4038 				  + htab->sgotplt_jump_table_size + 4);
4039 		    }
4040 		}
4041 
4042 	      sreloc = htab->elf.srelgot;
4043 
4044 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
4045 				 + htab->elf.sgot->output_offset + off);
4046 
4047 	      if (GOT_TLS_GD_P (tls_type))
4048 		dr_type = R_386_TLS_DTPMOD32;
4049 	      else if (GOT_TLS_GDESC_P (tls_type))
4050 		goto dr_done;
4051 	      else if (tls_type == GOT_TLS_IE_POS)
4052 		dr_type = R_386_TLS_TPOFF;
4053 	      else
4054 		dr_type = R_386_TLS_TPOFF32;
4055 
4056 	      if (dr_type == R_386_TLS_TPOFF && indx == 0)
4057 		bfd_put_32 (output_bfd,
4058 			    relocation - elf_i386_dtpoff_base (info),
4059 			    htab->elf.sgot->contents + off);
4060 	      else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4061 		bfd_put_32 (output_bfd,
4062 			    elf_i386_dtpoff_base (info) - relocation,
4063 			    htab->elf.sgot->contents + off);
4064 	      else if (dr_type != R_386_TLS_DESC)
4065 		bfd_put_32 (output_bfd, 0,
4066 			    htab->elf.sgot->contents + off);
4067 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
4068 
4069 	      elf_append_rel (output_bfd, sreloc, &outrel);
4070 
4071 	      if (GOT_TLS_GD_P (tls_type))
4072 		{
4073 		  if (indx == 0)
4074 		    {
4075 	    	      BFD_ASSERT (! unresolved_reloc);
4076 		      bfd_put_32 (output_bfd,
4077 				  relocation - elf_i386_dtpoff_base (info),
4078 				  htab->elf.sgot->contents + off + 4);
4079 		    }
4080 		  else
4081 		    {
4082 		      bfd_put_32 (output_bfd, 0,
4083 				  htab->elf.sgot->contents + off + 4);
4084 		      outrel.r_info = ELF32_R_INFO (indx,
4085 						    R_386_TLS_DTPOFF32);
4086 		      outrel.r_offset += 4;
4087 		      elf_append_rel (output_bfd, sreloc, &outrel);
4088 		    }
4089 		}
4090 	      else if (tls_type == GOT_TLS_IE_BOTH)
4091 		{
4092 		  bfd_put_32 (output_bfd,
4093 			      (indx == 0
4094 			       ? relocation - elf_i386_dtpoff_base (info)
4095 			       : 0),
4096 			      htab->elf.sgot->contents + off + 4);
4097 		  outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4098 		  outrel.r_offset += 4;
4099 		  elf_append_rel (output_bfd, sreloc, &outrel);
4100 		}
4101 
4102 	    dr_done:
4103 	      if (h != NULL)
4104 		h->got.offset |= 1;
4105 	      else
4106 		local_got_offsets[r_symndx] |= 1;
4107 	    }
4108 
4109 	  if (off >= (bfd_vma) -2
4110 	      && ! GOT_TLS_GDESC_P (tls_type))
4111 	    abort ();
4112 	  if (r_type == R_386_TLS_GOTDESC
4113 	      || r_type == R_386_TLS_DESC_CALL)
4114 	    {
4115 	      relocation = htab->sgotplt_jump_table_size + offplt;
4116 	      unresolved_reloc = FALSE;
4117 	    }
4118 	  else if (r_type == ELF32_R_TYPE (rel->r_info))
4119 	    {
4120 	      bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4121 			      + htab->elf.sgotplt->output_offset;
4122 	      relocation = htab->elf.sgot->output_section->vma
4123 		+ htab->elf.sgot->output_offset + off - g_o_t;
4124 	      if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4125 		  && tls_type == GOT_TLS_IE_BOTH)
4126 		relocation += 4;
4127 	      if (r_type == R_386_TLS_IE)
4128 		relocation += g_o_t;
4129 	      unresolved_reloc = FALSE;
4130 	    }
4131 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4132 	    {
4133 	      unsigned int val, type;
4134 	      bfd_vma roff;
4135 
4136 	      /* GD->IE transition.  */
4137 	      type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4138 	      val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4139 	      if (type == 0x04)
4140 		{
4141 		  /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4142 		     Change it into:
4143 		     movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
4144 		  val >>= 3;
4145 		  roff = rel->r_offset - 3;
4146 		}
4147 	      else
4148 		{
4149 		  /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4150 		     Change it into:
4151 		     movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
4152 		  roff = rel->r_offset - 2;
4153 		}
4154 	      memcpy (contents + roff,
4155 		      "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4156 	      contents[roff + 7] = 0x80 | (val & 7);
4157 	      /* If foo is used only with foo@gotntpoff(%reg) and
4158 		 foo@indntpoff, but not with foo@gottpoff(%reg), change
4159 		 subl $foo@gottpoff(%reg), %eax
4160 		 into:
4161 		 addl $foo@gotntpoff(%reg), %eax.  */
4162 	      if (tls_type == GOT_TLS_IE_POS)
4163 		contents[roff + 6] = 0x03;
4164 	      bfd_put_32 (output_bfd,
4165 			  htab->elf.sgot->output_section->vma
4166 			  + htab->elf.sgot->output_offset + off
4167 			  - htab->elf.sgotplt->output_section->vma
4168 			  - htab->elf.sgotplt->output_offset,
4169 			  contents + roff + 8);
4170 	      /* Skip R_386_PLT32.  */
4171 	      rel++;
4172 	      continue;
4173 	    }
4174 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4175 	    {
4176 	      /* GDesc -> IE transition.
4177 		 It's originally something like:
4178 		 leal x@tlsdesc(%ebx), %eax
4179 
4180 		 Change it to:
4181 		 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4182 		 or:
4183 		 movl x@gottpoff(%ebx), %eax # before negl %eax
4184 
4185 		 Registers other than %eax may be set up here.  */
4186 
4187 	      bfd_vma roff;
4188 
4189 	      /* First, make sure it's a leal adding ebx to a 32-bit
4190 		 offset into any register, although it's probably
4191 		 almost always going to be eax.  */
4192 	      roff = rel->r_offset;
4193 
4194 	      /* Now modify the instruction as appropriate.  */
4195 	      /* To turn a leal into a movl in the form we use it, it
4196 		 suffices to change the first byte from 0x8d to 0x8b.
4197 		 aoliva FIXME: should we decide to keep the leal, all
4198 		 we have to do is remove the statement below, and
4199 		 adjust the relaxation of R_386_TLS_DESC_CALL.  */
4200 	      bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4201 
4202 	      if (tls_type == GOT_TLS_IE_BOTH)
4203 		off += 4;
4204 
4205 	      bfd_put_32 (output_bfd,
4206 			  htab->elf.sgot->output_section->vma
4207 			  + htab->elf.sgot->output_offset + off
4208 			  - htab->elf.sgotplt->output_section->vma
4209 			  - htab->elf.sgotplt->output_offset,
4210 			  contents + roff);
4211 	      continue;
4212 	    }
4213 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4214 	    {
4215 	      /* GDesc -> IE transition.
4216 		 It's originally:
4217 		 call *(%eax)
4218 
4219 		 Change it to:
4220 		 xchg %ax,%ax
4221 		 or
4222 		 negl %eax
4223 		 depending on how we transformed the TLS_GOTDESC above.
4224 	      */
4225 
4226 	      bfd_vma roff;
4227 
4228 	      roff = rel->r_offset;
4229 
4230 	      /* Now modify the instruction as appropriate.  */
4231 	      if (tls_type != GOT_TLS_IE_NEG)
4232 		{
4233 		  /* xchg %ax,%ax */
4234 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
4235 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4236 		}
4237 	      else
4238 		{
4239 		  /* negl %eax */
4240 		  bfd_put_8 (output_bfd, 0xf7, contents + roff);
4241 		  bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4242 		}
4243 
4244 	      continue;
4245 	    }
4246 	  else
4247 	    BFD_ASSERT (FALSE);
4248 	  break;
4249 
4250 	case R_386_TLS_LDM:
4251 	  if (! elf_i386_tls_transition (info, input_bfd,
4252 					 input_section, contents,
4253 					 symtab_hdr, sym_hashes,
4254 					 &r_type, GOT_UNKNOWN, rel,
4255 					 relend, h, r_symndx))
4256 	    return FALSE;
4257 
4258 	  if (r_type != R_386_TLS_LDM)
4259 	    {
4260 	      /* LD->LE transition:
4261 		 leal foo(%reg), %eax; call ___tls_get_addr.
4262 		 We change it into:
4263 		 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi.  */
4264 	      BFD_ASSERT (r_type == R_386_TLS_LE_32);
4265 	      memcpy (contents + rel->r_offset - 2,
4266 		      "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4267 	      /* Skip R_386_PC32/R_386_PLT32.  */
4268 	      rel++;
4269 	      continue;
4270 	    }
4271 
4272 	  if (htab->elf.sgot == NULL)
4273 	    abort ();
4274 
4275 	  off = htab->tls_ldm_got.offset;
4276 	  if (off & 1)
4277 	    off &= ~1;
4278 	  else
4279 	    {
4280 	      Elf_Internal_Rela outrel;
4281 
4282 	      if (htab->elf.srelgot == NULL)
4283 		abort ();
4284 
4285 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
4286 				 + htab->elf.sgot->output_offset + off);
4287 
4288 	      bfd_put_32 (output_bfd, 0,
4289 			  htab->elf.sgot->contents + off);
4290 	      bfd_put_32 (output_bfd, 0,
4291 			  htab->elf.sgot->contents + off + 4);
4292 	      outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4293 	      elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
4294 	      htab->tls_ldm_got.offset |= 1;
4295 	    }
4296 	  relocation = htab->elf.sgot->output_section->vma
4297 		       + htab->elf.sgot->output_offset + off
4298 		       - htab->elf.sgotplt->output_section->vma
4299 		       - htab->elf.sgotplt->output_offset;
4300 	  unresolved_reloc = FALSE;
4301 	  break;
4302 
4303 	case R_386_TLS_LDO_32:
4304 	  if (!info->executable || (input_section->flags & SEC_CODE) == 0)
4305 	    relocation -= elf_i386_dtpoff_base (info);
4306 	  else
4307 	    /* When converting LDO to LE, we must negate.  */
4308 	    relocation = -elf_i386_tpoff (info, relocation);
4309 	  break;
4310 
4311 	case R_386_TLS_LE_32:
4312 	case R_386_TLS_LE:
4313 	  if (!info->executable)
4314 	    {
4315 	      Elf_Internal_Rela outrel;
4316 	      asection *sreloc;
4317 
4318 	      outrel.r_offset = rel->r_offset
4319 				+ input_section->output_section->vma
4320 				+ input_section->output_offset;
4321 	      if (h != NULL && h->dynindx != -1)
4322 		indx = h->dynindx;
4323 	      else
4324 		indx = 0;
4325 	      if (r_type == R_386_TLS_LE_32)
4326 		outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
4327 	      else
4328 		outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4329 	      sreloc = elf_section_data (input_section)->sreloc;
4330 	      if (sreloc == NULL)
4331 		abort ();
4332 	      elf_append_rel (output_bfd, sreloc, &outrel);
4333 	      if (indx)
4334 		continue;
4335 	      else if (r_type == R_386_TLS_LE_32)
4336 		relocation = elf_i386_dtpoff_base (info) - relocation;
4337 	      else
4338 		relocation -= elf_i386_dtpoff_base (info);
4339 	    }
4340 	  else if (r_type == R_386_TLS_LE_32)
4341 	    relocation = elf_i386_tpoff (info, relocation);
4342 	  else
4343 	    relocation = -elf_i386_tpoff (info, relocation);
4344 	  break;
4345 
4346 	default:
4347 	  break;
4348 	}
4349 
4350       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4351 	 because such sections are not SEC_ALLOC and thus ld.so will
4352 	 not process them.  */
4353       if (unresolved_reloc
4354 	  && !((input_section->flags & SEC_DEBUGGING) != 0
4355 	       && h->def_dynamic)
4356 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
4357 				      rel->r_offset) != (bfd_vma) -1)
4358 	{
4359 	  (*_bfd_error_handler)
4360 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4361 	     input_bfd,
4362 	     input_section,
4363 	     (long) rel->r_offset,
4364 	     howto->name,
4365 	     h->root.root.string);
4366 	  return FALSE;
4367 	}
4368 
4369 do_relocation:
4370       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4371 				    contents, rel->r_offset,
4372 				    relocation, 0);
4373 
4374 check_relocation_error:
4375       if (r != bfd_reloc_ok)
4376 	{
4377 	  const char *name;
4378 
4379 	  if (h != NULL)
4380 	    name = h->root.root.string;
4381 	  else
4382 	    {
4383 	      name = bfd_elf_string_from_elf_section (input_bfd,
4384 						      symtab_hdr->sh_link,
4385 						      sym->st_name);
4386 	      if (name == NULL)
4387 		return FALSE;
4388 	      if (*name == '\0')
4389 		name = bfd_section_name (input_bfd, sec);
4390 	    }
4391 
4392 	  if (r == bfd_reloc_overflow)
4393 	    {
4394 	      if (! ((*info->callbacks->reloc_overflow)
4395 		     (info, (h ? &h->root : NULL), name, howto->name,
4396 		      (bfd_vma) 0, input_bfd, input_section,
4397 		      rel->r_offset)))
4398 		return FALSE;
4399 	    }
4400 	  else
4401 	    {
4402 	      (*_bfd_error_handler)
4403 		(_("%B(%A+0x%lx): reloc against `%s': error %d"),
4404 		 input_bfd, input_section,
4405 		 (long) rel->r_offset, name, (int) r);
4406 	      return FALSE;
4407 	    }
4408 	}
4409     }
4410 
4411   return TRUE;
4412 }
4413 
4414 /* Finish up dynamic symbol handling.  We set the contents of various
4415    dynamic sections here.  */
4416 
4417 static bfd_boolean
4418 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
4419 				struct bfd_link_info *info,
4420 				struct elf_link_hash_entry *h,
4421 				Elf_Internal_Sym *sym)
4422 {
4423   struct elf_i386_link_hash_table *htab;
4424   unsigned plt_entry_size;
4425   const struct elf_i386_backend_data *abed;
4426 
4427   htab = elf_i386_hash_table (info);
4428   if (htab == NULL)
4429     return FALSE;
4430 
4431   abed = get_elf_i386_backend_data (output_bfd);
4432   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
4433 
4434   if (h->plt.offset != (bfd_vma) -1)
4435     {
4436       bfd_vma plt_index;
4437       bfd_vma got_offset;
4438       Elf_Internal_Rela rel;
4439       bfd_byte *loc;
4440       asection *plt, *gotplt, *relplt;
4441 
4442       /* When building a static executable, use .iplt, .igot.plt and
4443 	 .rel.iplt sections for STT_GNU_IFUNC symbols.  */
4444       if (htab->elf.splt != NULL)
4445 	{
4446 	  plt = htab->elf.splt;
4447 	  gotplt = htab->elf.sgotplt;
4448 	  relplt = htab->elf.srelplt;
4449 	}
4450       else
4451 	{
4452 	  plt = htab->elf.iplt;
4453 	  gotplt = htab->elf.igotplt;
4454 	  relplt = htab->elf.irelplt;
4455 	}
4456 
4457       /* This symbol has an entry in the procedure linkage table.  Set
4458 	 it up.  */
4459 
4460       if ((h->dynindx == -1
4461 	   && !((h->forced_local || info->executable)
4462 		&& h->def_regular
4463 		&& h->type == STT_GNU_IFUNC))
4464 	  || plt == NULL
4465 	  || gotplt == NULL
4466 	  || relplt == NULL)
4467 	abort ();
4468 
4469       /* Get the index in the procedure linkage table which
4470 	 corresponds to this symbol.  This is the index of this symbol
4471 	 in all the symbols for which we are making plt entries.  The
4472 	 first entry in the procedure linkage table is reserved.
4473 
4474 	 Get the offset into the .got table of the entry that
4475 	 corresponds to this function.  Each .got entry is 4 bytes.
4476 	 The first three are reserved.
4477 
4478 	 For static executables, we don't reserve anything.  */
4479 
4480       if (plt == htab->elf.splt)
4481 	{
4482 	  got_offset = h->plt.offset / plt_entry_size - 1;
4483 	  got_offset = (got_offset + 3) * 4;
4484 	}
4485       else
4486 	{
4487 	  got_offset = h->plt.offset / plt_entry_size;
4488 	  got_offset = got_offset * 4;
4489 	}
4490 
4491       /* Fill in the entry in the procedure linkage table.  */
4492       if (! info->shared)
4493 	{
4494 	  memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
4495 		  abed->plt->plt_entry_size);
4496 	  bfd_put_32 (output_bfd,
4497 		      (gotplt->output_section->vma
4498 		       + gotplt->output_offset
4499 		       + got_offset),
4500 		      plt->contents + h->plt.offset
4501                       + abed->plt->plt_got_offset);
4502 
4503 	  if (abed->is_vxworks)
4504 	    {
4505 	      int s, k, reloc_index;
4506 
4507 	      /* Create the R_386_32 relocation referencing the GOT
4508 		 for this PLT entry.  */
4509 
4510 	      /* S: Current slot number (zero-based).  */
4511 	      s = ((h->plt.offset - abed->plt->plt_entry_size)
4512                    / abed->plt->plt_entry_size);
4513 	      /* K: Number of relocations for PLTResolve. */
4514 	      if (info->shared)
4515 		k = PLTRESOLVE_RELOCS_SHLIB;
4516 	      else
4517 		k = PLTRESOLVE_RELOCS;
4518 	      /* Skip the PLTresolve relocations, and the relocations for
4519 		 the other PLT slots. */
4520 	      reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
4521 	      loc = (htab->srelplt2->contents + reloc_index
4522 		     * sizeof (Elf32_External_Rel));
4523 
4524 	      rel.r_offset = (htab->elf.splt->output_section->vma
4525 			      + htab->elf.splt->output_offset
4526 			      + h->plt.offset + 2),
4527 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4528 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4529 
4530 	      /* Create the R_386_32 relocation referencing the beginning of
4531 		 the PLT for this GOT entry.  */
4532 	      rel.r_offset = (htab->elf.sgotplt->output_section->vma
4533 			      + htab->elf.sgotplt->output_offset
4534 			      + got_offset);
4535 	      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
4536 	      bfd_elf32_swap_reloc_out (output_bfd, &rel,
4537 					loc + sizeof (Elf32_External_Rel));
4538 	    }
4539 	}
4540       else
4541 	{
4542 	  memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
4543 		  abed->plt->plt_entry_size);
4544 	  bfd_put_32 (output_bfd, got_offset,
4545 		      plt->contents + h->plt.offset
4546                       + abed->plt->plt_got_offset);
4547 	}
4548 
4549       /* Fill in the entry in the global offset table.  */
4550       bfd_put_32 (output_bfd,
4551 		  (plt->output_section->vma
4552 		   + plt->output_offset
4553 		   + h->plt.offset
4554 		   + abed->plt->plt_lazy_offset),
4555 		  gotplt->contents + got_offset);
4556 
4557       /* Fill in the entry in the .rel.plt section.  */
4558       rel.r_offset = (gotplt->output_section->vma
4559 		      + gotplt->output_offset
4560 		      + got_offset);
4561       if (h->dynindx == -1
4562 	  || ((info->executable
4563 	       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4564 	      && h->def_regular
4565 	       && h->type == STT_GNU_IFUNC))
4566 	{
4567 	  /* If an STT_GNU_IFUNC symbol is locally defined, generate
4568 	     R_386_IRELATIVE instead of R_386_JUMP_SLOT.  Store addend
4569 	     in the .got.plt section.  */
4570 	  bfd_put_32 (output_bfd,
4571 		      (h->root.u.def.value
4572 		       + h->root.u.def.section->output_section->vma
4573 		       + h->root.u.def.section->output_offset),
4574 		      gotplt->contents + got_offset);
4575 	  rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
4576 	  /* R_386_IRELATIVE comes last.  */
4577 	  plt_index = htab->next_irelative_index--;
4578 	}
4579       else
4580 	{
4581 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
4582 	  plt_index = htab->next_jump_slot_index++;
4583 	}
4584       loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
4585       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4586 
4587       /* Don't fill PLT entry for static executables.  */
4588       if (plt == htab->elf.splt)
4589 	{
4590 	  bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
4591 		      plt->contents + h->plt.offset
4592                       + abed->plt->plt_reloc_offset);
4593 	  bfd_put_32 (output_bfd, - (h->plt.offset
4594                                      + abed->plt->plt_plt_offset + 4),
4595 		      plt->contents + h->plt.offset
4596                       + abed->plt->plt_plt_offset);
4597 	}
4598 
4599       if (!h->def_regular)
4600 	{
4601 	  /* Mark the symbol as undefined, rather than as defined in
4602 	     the .plt section.  Leave the value if there were any
4603 	     relocations where pointer equality matters (this is a clue
4604 	     for the dynamic linker, to make function pointer
4605 	     comparisons work between an application and shared
4606 	     library), otherwise set it to zero.  If a function is only
4607 	     called from a binary, there is no need to slow down
4608 	     shared libraries because of that.  */
4609 	  sym->st_shndx = SHN_UNDEF;
4610 	  if (!h->pointer_equality_needed)
4611 	    sym->st_value = 0;
4612 	}
4613     }
4614 
4615   if (h->got.offset != (bfd_vma) -1
4616       && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
4617       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
4618     {
4619       Elf_Internal_Rela rel;
4620 
4621       /* This symbol has an entry in the global offset table.  Set it
4622 	 up.  */
4623 
4624       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4625 	abort ();
4626 
4627       rel.r_offset = (htab->elf.sgot->output_section->vma
4628 		      + htab->elf.sgot->output_offset
4629 		      + (h->got.offset & ~(bfd_vma) 1));
4630 
4631       /* If this is a static link, or it is a -Bsymbolic link and the
4632 	 symbol is defined locally or was forced to be local because
4633 	 of a version file, we just want to emit a RELATIVE reloc.
4634 	 The entry in the global offset table will already have been
4635 	 initialized in the relocate_section function.  */
4636       if (h->def_regular
4637 	  && h->type == STT_GNU_IFUNC)
4638 	{
4639 	  if (info->shared)
4640 	    {
4641 	      /* Generate R_386_GLOB_DAT.  */
4642 	      goto do_glob_dat;
4643 	    }
4644 	  else
4645 	    {
4646 	      asection *plt;
4647 
4648 	      if (!h->pointer_equality_needed)
4649 		abort ();
4650 
4651 	      /* For non-shared object, we can't use .got.plt, which
4652 		 contains the real function addres if we need pointer
4653 		 equality.  We load the GOT entry with the PLT entry.  */
4654 	      plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4655 	      bfd_put_32 (output_bfd,
4656 			  (plt->output_section->vma
4657 			   + plt->output_offset + h->plt.offset),
4658 			  htab->elf.sgot->contents + h->got.offset);
4659 	      return TRUE;
4660 	    }
4661 	}
4662       else if (info->shared
4663 	       && SYMBOL_REFERENCES_LOCAL (info, h))
4664 	{
4665 	  BFD_ASSERT((h->got.offset & 1) != 0);
4666 	  rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4667 	}
4668       else
4669 	{
4670 	  BFD_ASSERT((h->got.offset & 1) == 0);
4671 do_glob_dat:
4672 	  bfd_put_32 (output_bfd, (bfd_vma) 0,
4673 		      htab->elf.sgot->contents + h->got.offset);
4674 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
4675 	}
4676 
4677       elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
4678     }
4679 
4680   if (h->needs_copy)
4681     {
4682       Elf_Internal_Rela rel;
4683 
4684       /* This symbol needs a copy reloc.  Set it up.  */
4685 
4686       if (h->dynindx == -1
4687 	  || (h->root.type != bfd_link_hash_defined
4688 	      && h->root.type != bfd_link_hash_defweak)
4689 	  || htab->srelbss == NULL)
4690 	abort ();
4691 
4692       rel.r_offset = (h->root.u.def.value
4693 		      + h->root.u.def.section->output_section->vma
4694 		      + h->root.u.def.section->output_offset);
4695       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
4696       elf_append_rel (output_bfd, htab->srelbss, &rel);
4697     }
4698 
4699   return TRUE;
4700 }
4701 
4702 /* Finish up local dynamic symbol handling.  We set the contents of
4703    various dynamic sections here.  */
4704 
4705 static bfd_boolean
4706 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
4707 {
4708   struct elf_link_hash_entry *h
4709     = (struct elf_link_hash_entry *) *slot;
4710   struct bfd_link_info *info
4711     = (struct bfd_link_info *) inf;
4712 
4713   return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
4714 					 h, NULL);
4715 }
4716 
4717 /* Used to decide how to sort relocs in an optimal manner for the
4718    dynamic linker, before writing them out.  */
4719 
4720 static enum elf_reloc_type_class
4721 elf_i386_reloc_type_class (const Elf_Internal_Rela *rela)
4722 {
4723   switch (ELF32_R_TYPE (rela->r_info))
4724     {
4725     case R_386_RELATIVE:
4726       return reloc_class_relative;
4727     case R_386_JUMP_SLOT:
4728       return reloc_class_plt;
4729     case R_386_COPY:
4730       return reloc_class_copy;
4731     default:
4732       return reloc_class_normal;
4733     }
4734 }
4735 
4736 /* Finish up the dynamic sections.  */
4737 
4738 static bfd_boolean
4739 elf_i386_finish_dynamic_sections (bfd *output_bfd,
4740 				  struct bfd_link_info *info)
4741 {
4742   struct elf_i386_link_hash_table *htab;
4743   bfd *dynobj;
4744   asection *sdyn;
4745   const struct elf_i386_backend_data *abed;
4746 
4747   htab = elf_i386_hash_table (info);
4748   if (htab == NULL)
4749     return FALSE;
4750 
4751   dynobj = htab->elf.dynobj;
4752   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4753   abed = get_elf_i386_backend_data (output_bfd);
4754 
4755   if (htab->elf.dynamic_sections_created)
4756     {
4757       Elf32_External_Dyn *dyncon, *dynconend;
4758 
4759       if (sdyn == NULL || htab->elf.sgot == NULL)
4760 	abort ();
4761 
4762       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4763       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4764       for (; dyncon < dynconend; dyncon++)
4765 	{
4766 	  Elf_Internal_Dyn dyn;
4767 	  asection *s;
4768 
4769 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4770 
4771 	  switch (dyn.d_tag)
4772 	    {
4773 	    default:
4774 	      if (abed->is_vxworks
4775                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4776 		break;
4777 	      continue;
4778 
4779 	    case DT_PLTGOT:
4780 	      s = htab->elf.sgotplt;
4781 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4782 	      break;
4783 
4784 	    case DT_JMPREL:
4785 	      s = htab->elf.srelplt;
4786 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4787 	      break;
4788 
4789 	    case DT_PLTRELSZ:
4790 	      s = htab->elf.srelplt;
4791 	      dyn.d_un.d_val = s->size;
4792 	      break;
4793 
4794 	    case DT_RELSZ:
4795 	      /* My reading of the SVR4 ABI indicates that the
4796 		 procedure linkage table relocs (DT_JMPREL) should be
4797 		 included in the overall relocs (DT_REL).  This is
4798 		 what Solaris does.  However, UnixWare can not handle
4799 		 that case.  Therefore, we override the DT_RELSZ entry
4800 		 here to make it not include the JMPREL relocs.  */
4801 	      s = htab->elf.srelplt;
4802 	      if (s == NULL)
4803 		continue;
4804 	      dyn.d_un.d_val -= s->size;
4805 	      break;
4806 
4807 	    case DT_REL:
4808 	      /* We may not be using the standard ELF linker script.
4809 		 If .rel.plt is the first .rel section, we adjust
4810 		 DT_REL to not include it.  */
4811 	      s = htab->elf.srelplt;
4812 	      if (s == NULL)
4813 		continue;
4814 	      if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4815 		continue;
4816 	      dyn.d_un.d_ptr += s->size;
4817 	      break;
4818 	    }
4819 
4820 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4821 	}
4822 
4823       /* Fill in the first entry in the procedure linkage table.  */
4824       if (htab->elf.splt && htab->elf.splt->size > 0)
4825 	{
4826 	  if (info->shared)
4827 	    {
4828 	      memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
4829 		      abed->plt->plt0_entry_size);
4830 	      memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
4831 		      abed->plt0_pad_byte,
4832 		      abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
4833 	    }
4834 	  else
4835 	    {
4836 	      memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
4837 		      abed->plt->plt0_entry_size);
4838 	      memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
4839 		      abed->plt0_pad_byte,
4840 		      abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
4841 	      bfd_put_32 (output_bfd,
4842 			  (htab->elf.sgotplt->output_section->vma
4843 			   + htab->elf.sgotplt->output_offset
4844 			   + 4),
4845 			  htab->elf.splt->contents
4846                           + abed->plt->plt0_got1_offset);
4847 	      bfd_put_32 (output_bfd,
4848 			  (htab->elf.sgotplt->output_section->vma
4849 			   + htab->elf.sgotplt->output_offset
4850 			   + 8),
4851 			  htab->elf.splt->contents
4852                           + abed->plt->plt0_got2_offset);
4853 
4854 	      if (abed->is_vxworks)
4855 		{
4856 		  Elf_Internal_Rela rel;
4857 
4858 		  /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
4859 		     On IA32 we use REL relocations so the addend goes in
4860 		     the PLT directly.  */
4861 		  rel.r_offset = (htab->elf.splt->output_section->vma
4862 				  + htab->elf.splt->output_offset
4863 				  + abed->plt->plt0_got1_offset);
4864 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4865 		  bfd_elf32_swap_reloc_out (output_bfd, &rel,
4866 					    htab->srelplt2->contents);
4867 		  /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
4868 		  rel.r_offset = (htab->elf.splt->output_section->vma
4869 				  + htab->elf.splt->output_offset
4870 				  + abed->plt->plt0_got2_offset);
4871 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4872 		  bfd_elf32_swap_reloc_out (output_bfd, &rel,
4873 					    htab->srelplt2->contents +
4874 					    sizeof (Elf32_External_Rel));
4875 		}
4876 	    }
4877 
4878 	  /* UnixWare sets the entsize of .plt to 4, although that doesn't
4879 	     really seem like the right value.  */
4880 	  elf_section_data (htab->elf.splt->output_section)
4881 	    ->this_hdr.sh_entsize = 4;
4882 
4883 	  /* Correct the .rel.plt.unloaded relocations.  */
4884 	  if (abed->is_vxworks && !info->shared)
4885 	    {
4886 	      int num_plts = (htab->elf.splt->size
4887                               / abed->plt->plt_entry_size) - 1;
4888 	      unsigned char *p;
4889 
4890 	      p = htab->srelplt2->contents;
4891 	      if (info->shared)
4892 		p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
4893 	      else
4894 		p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
4895 
4896 	      for (; num_plts; num_plts--)
4897 		{
4898 		  Elf_Internal_Rela rel;
4899 		  bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4900 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4901 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4902 		  p += sizeof (Elf32_External_Rel);
4903 
4904 		  bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4905 		  rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
4906 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4907 		  p += sizeof (Elf32_External_Rel);
4908 		}
4909 	    }
4910 	}
4911     }
4912 
4913   if (htab->elf.sgotplt)
4914     {
4915       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4916 	{
4917 	  (*_bfd_error_handler)
4918 	    (_("discarded output section: `%A'"), htab->elf.sgotplt);
4919 	  return FALSE;
4920 	}
4921 
4922       /* Fill in the first three entries in the global offset table.  */
4923       if (htab->elf.sgotplt->size > 0)
4924 	{
4925 	  bfd_put_32 (output_bfd,
4926 		      (sdyn == NULL ? 0
4927 		       : sdyn->output_section->vma + sdyn->output_offset),
4928 		      htab->elf.sgotplt->contents);
4929 	  bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
4930 	  bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
4931 	}
4932 
4933       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
4934     }
4935 
4936   /* Adjust .eh_frame for .plt section.  */
4937   if (htab->plt_eh_frame != NULL
4938       && htab->plt_eh_frame->contents != NULL)
4939     {
4940       if (htab->elf.splt != NULL
4941 	  && htab->elf.splt->size != 0
4942 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4943 	  && htab->elf.splt->output_section != NULL
4944 	  && htab->plt_eh_frame->output_section != NULL)
4945 	{
4946 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
4947 	  bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4948 				   + htab->plt_eh_frame->output_offset
4949 				   + PLT_FDE_START_OFFSET;
4950 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4951 			     htab->plt_eh_frame->contents
4952 			     + PLT_FDE_START_OFFSET);
4953 	}
4954       if (htab->plt_eh_frame->sec_info_type
4955 	  == SEC_INFO_TYPE_EH_FRAME)
4956 	{
4957 	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4958 						 htab->plt_eh_frame,
4959 						 htab->plt_eh_frame->contents))
4960 	    return FALSE;
4961 	}
4962     }
4963 
4964   if (htab->elf.sgot && htab->elf.sgot->size > 0)
4965     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
4966 
4967   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4968   htab_traverse (htab->loc_hash_table,
4969 		 elf_i386_finish_local_dynamic_symbol,
4970 		 info);
4971 
4972   return TRUE;
4973 }
4974 
4975 /* Return address for Ith PLT stub in section PLT, for relocation REL
4976    or (bfd_vma) -1 if it should not be included.  */
4977 
4978 static bfd_vma
4979 elf_i386_plt_sym_val (bfd_vma i, const asection *plt,
4980 		      const arelent *rel ATTRIBUTE_UNUSED)
4981 {
4982   return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4983 }
4984 
4985 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
4986 
4987 static bfd_boolean
4988 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
4989 {
4990   if (h->plt.offset != (bfd_vma) -1
4991       && !h->def_regular
4992       && !h->pointer_equality_needed)
4993     return FALSE;
4994 
4995   return _bfd_elf_hash_symbol (h);
4996 }
4997 
4998 /* Hook called by the linker routine which adds symbols from an object
4999    file.  */
5000 
5001 static bfd_boolean
5002 elf_i386_add_symbol_hook (bfd * abfd,
5003 			  struct bfd_link_info * info ATTRIBUTE_UNUSED,
5004 			  Elf_Internal_Sym * sym,
5005 			  const char ** namep ATTRIBUTE_UNUSED,
5006 			  flagword * flagsp ATTRIBUTE_UNUSED,
5007 			  asection ** secp ATTRIBUTE_UNUSED,
5008 			  bfd_vma * valp ATTRIBUTE_UNUSED)
5009 {
5010   if ((abfd->flags & DYNAMIC) == 0
5011       && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
5012 	  || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
5013     elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
5014 
5015   return TRUE;
5016 }
5017 
5018 #define TARGET_LITTLE_SYM		bfd_elf32_i386_vec
5019 #define TARGET_LITTLE_NAME		"elf32-i386"
5020 #define ELF_ARCH			bfd_arch_i386
5021 #define ELF_TARGET_ID			I386_ELF_DATA
5022 #define ELF_MACHINE_CODE		EM_386
5023 #define ELF_MAXPAGESIZE			0x1000
5024 
5025 #define elf_backend_can_gc_sections	1
5026 #define elf_backend_can_refcount	1
5027 #define elf_backend_want_got_plt	1
5028 #define elf_backend_plt_readonly	1
5029 #define elf_backend_want_plt_sym	0
5030 #define elf_backend_got_header_size	12
5031 #define elf_backend_plt_alignment	4
5032 
5033 /* Support RELA for objdump of prelink objects.  */
5034 #define elf_info_to_howto		      elf_i386_info_to_howto_rel
5035 #define elf_info_to_howto_rel		      elf_i386_info_to_howto_rel
5036 
5037 #define bfd_elf32_mkobject		      elf_i386_mkobject
5038 
5039 #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
5040 #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
5041 #define bfd_elf32_bfd_link_hash_table_free    elf_i386_link_hash_table_free
5042 #define bfd_elf32_bfd_reloc_type_lookup	      elf_i386_reloc_type_lookup
5043 #define bfd_elf32_bfd_reloc_name_lookup	      elf_i386_reloc_name_lookup
5044 
5045 #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
5046 #define elf_backend_relocs_compatible	      _bfd_elf_relocs_compatible
5047 #define elf_backend_check_relocs	      elf_i386_check_relocs
5048 #define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
5049 #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
5050 #define elf_backend_fake_sections	      elf_i386_fake_sections
5051 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
5052 #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
5053 #define elf_backend_gc_mark_hook	      elf_i386_gc_mark_hook
5054 #define elf_backend_gc_sweep_hook	      elf_i386_gc_sweep_hook
5055 #define elf_backend_grok_prstatus	      elf_i386_grok_prstatus
5056 #define elf_backend_grok_psinfo		      elf_i386_grok_psinfo
5057 #define elf_backend_reloc_type_class	      elf_i386_reloc_type_class
5058 #define elf_backend_relocate_section	      elf_i386_relocate_section
5059 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
5060 #define elf_backend_always_size_sections      elf_i386_always_size_sections
5061 #define elf_backend_omit_section_dynsym \
5062   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5063 #define elf_backend_plt_sym_val		      elf_i386_plt_sym_val
5064 #define elf_backend_hash_symbol		      elf_i386_hash_symbol
5065 #define elf_backend_add_symbol_hook           elf_i386_add_symbol_hook
5066 #undef	elf_backend_post_process_headers
5067 #define	elf_backend_post_process_headers	_bfd_elf_set_osabi
5068 
5069 #include "elf32-target.h"
5070 
5071 /* FreeBSD support.  */
5072 
5073 #undef	TARGET_LITTLE_SYM
5074 #define	TARGET_LITTLE_SYM		bfd_elf32_i386_freebsd_vec
5075 #undef	TARGET_LITTLE_NAME
5076 #define	TARGET_LITTLE_NAME		"elf32-i386-freebsd"
5077 #undef	ELF_OSABI
5078 #define	ELF_OSABI			ELFOSABI_FREEBSD
5079 
5080 /* The kernel recognizes executables as valid only if they carry a
5081    "FreeBSD" label in the ELF header.  So we put this label on all
5082    executables and (for simplicity) also all other object files.  */
5083 
5084 static void
5085 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
5086 {
5087   _bfd_elf_set_osabi (abfd, info);
5088 
5089 #ifdef OLD_FREEBSD_ABI_LABEL
5090   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5091   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5092 #endif
5093 }
5094 
5095 #undef	elf_backend_post_process_headers
5096 #define	elf_backend_post_process_headers	elf_i386_fbsd_post_process_headers
5097 #undef	elf32_bed
5098 #define	elf32_bed				elf32_i386_fbsd_bed
5099 
5100 #undef elf_backend_add_symbol_hook
5101 
5102 #include "elf32-target.h"
5103 
5104 /* Solaris 2.  */
5105 
5106 #undef	TARGET_LITTLE_SYM
5107 #define	TARGET_LITTLE_SYM		bfd_elf32_i386_sol2_vec
5108 #undef	TARGET_LITTLE_NAME
5109 #define	TARGET_LITTLE_NAME		"elf32-i386-sol2"
5110 
5111 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5112    objects won't be recognized.  */
5113 #undef ELF_OSABI
5114 
5115 #undef	elf32_bed
5116 #define	elf32_bed			elf32_i386_sol2_bed
5117 
5118 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
5119    boundary.  */
5120 #undef elf_backend_static_tls_alignment
5121 #define elf_backend_static_tls_alignment 8
5122 
5123 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5124 
5125    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5126    File, p.63.  */
5127 #undef elf_backend_want_plt_sym
5128 #define elf_backend_want_plt_sym	1
5129 
5130 #include "elf32-target.h"
5131 
5132 /* Native Client support.  */
5133 
5134 #undef	TARGET_LITTLE_SYM
5135 #define	TARGET_LITTLE_SYM		bfd_elf32_i386_nacl_vec
5136 #undef	TARGET_LITTLE_NAME
5137 #define	TARGET_LITTLE_NAME		"elf32-i386-nacl"
5138 #undef	elf32_bed
5139 #define	elf32_bed			elf32_i386_nacl_bed
5140 
5141 #undef	ELF_MAXPAGESIZE
5142 #define	ELF_MAXPAGESIZE			0x10000
5143 
5144 /* Restore defaults.  */
5145 #undef	ELF_OSABI
5146 #undef	elf_backend_want_plt_sym
5147 #define elf_backend_want_plt_sym	0
5148 #undef	elf_backend_post_process_headers
5149 #define	elf_backend_post_process_headers	_bfd_elf_set_osabi
5150 #undef	elf_backend_static_tls_alignment
5151 
5152 /* NaCl uses substantially different PLT entries for the same effects.  */
5153 
5154 #undef	elf_backend_plt_alignment
5155 #define elf_backend_plt_alignment	5
5156 #define NACL_PLT_ENTRY_SIZE		64
5157 #define	NACLMASK			0xe0 /* 32-byte alignment mask.  */
5158 
5159 static const bfd_byte elf_i386_nacl_plt0_entry[] =
5160   {
5161     0xff, 0x35,			  /* pushl contents of address */
5162     0, 0, 0, 0,			  /* replaced with address of .got + 4.	 */
5163     0x8b, 0x0d,                   /* movl contents of address, %ecx */
5164     0, 0, 0, 0,			  /* replaced with address of .got + 8.	 */
5165     0x83, 0xe1, NACLMASK,	  /* andl $NACLMASK, %ecx */
5166     0xff, 0xe1			  /* jmp *%ecx */
5167   };
5168 
5169 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5170   {
5171     0x8b, 0x0d,				/* movl contents of address, %ecx */
5172     0, 0, 0, 0,				/* replaced with GOT slot address.  */
5173     0x83, 0xe1, NACLMASK,		/* andl $NACLMASK, %ecx */
5174     0xff, 0xe1,				/* jmp *%ecx */
5175 
5176     /* Pad to the next 32-byte boundary with nop instructions.	*/
5177     0x90,
5178     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5179     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5180 
5181     /* Lazy GOT entries point here (32-byte aligned).  */
5182     0x68,			       /* pushl immediate */
5183     0, 0, 0, 0,			       /* replaced with reloc offset.  */
5184     0xe9,			       /* jmp relative */
5185     0, 0, 0, 0,			       /* replaced with offset to .plt.	 */
5186 
5187     /* Pad to the next 32-byte boundary with nop instructions.	*/
5188     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5189     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5190     0x90, 0x90
5191   };
5192 
5193 static const bfd_byte
5194 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
5195   {
5196     0xff, 0x73, 0x04,		/* pushl 4(%ebx) */
5197     0x8b, 0x4b, 0x08,		/* mov 0x8(%ebx), %ecx */
5198     0x83, 0xe1, 0xe0,		/* and $NACLMASK, %ecx */
5199     0xff, 0xe1,			/* jmp *%ecx */
5200 
5201     /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
5202        so pad to that size with nop instructions.  */
5203     0x90, 0x90, 0x90, 0x90, 0x90, 0x90
5204   };
5205 
5206 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
5207   {
5208     0x8b, 0x8b,          /* movl offset(%ebx), %ecx */
5209     0, 0, 0, 0,          /* replaced with offset of this symbol in .got.  */
5210     0x83, 0xe1, 0xe0,    /* andl $NACLMASK, %ecx */
5211     0xff, 0xe1,          /* jmp *%ecx */
5212 
5213     /* Pad to the next 32-byte boundary with nop instructions.	*/
5214     0x90,
5215     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5216     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5217 
5218     /* Lazy GOT entries point here (32-byte aligned).  */
5219     0x68,                /* pushl immediate */
5220     0, 0, 0, 0,          /* replaced with offset into relocation table.  */
5221     0xe9,                /* jmp relative */
5222     0, 0, 0, 0,          /* replaced with offset to start of .plt.  */
5223 
5224     /* Pad to the next 32-byte boundary with nop instructions.	*/
5225     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5226     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5227     0x90, 0x90
5228   };
5229 
5230 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
5231   {
5232 #if (PLT_CIE_LENGTH != 20                               \
5233      || PLT_FDE_LENGTH != 36                            \
5234      || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8  \
5235      || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5236 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
5237 #endif
5238     PLT_CIE_LENGTH, 0, 0, 0,		/* CIE length */
5239     0, 0, 0, 0,                         /* CIE ID */
5240     1,                                  /* CIE version */
5241     'z', 'R', 0,                        /* Augmentation string */
5242     1,                                  /* Code alignment factor */
5243     0x7c,                               /* Data alignment factor: -4 */
5244     8,                                  /* Return address column */
5245     1,					/* Augmentation size */
5246     DW_EH_PE_pcrel | DW_EH_PE_sdata4,	/* FDE encoding */
5247     DW_CFA_def_cfa, 4, 4,		/* DW_CFA_def_cfa: r4 (esp) ofs 4 */
5248     DW_CFA_offset + 8, 1,		/* DW_CFA_offset: r8 (eip) at cfa-4 */
5249     DW_CFA_nop, DW_CFA_nop,
5250 
5251     PLT_FDE_LENGTH, 0, 0, 0,     /* FDE length */
5252     PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
5253     0, 0, 0, 0,                  /* R_386_PC32 .plt goes here */
5254     0, 0, 0, 0,                  /* .plt size goes here */
5255     0,                           /* Augmentation size */
5256     DW_CFA_def_cfa_offset, 8,    /* DW_CFA_def_cfa_offset: 8 */
5257     DW_CFA_advance_loc + 6,      /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5258     DW_CFA_def_cfa_offset, 12,   /* DW_CFA_def_cfa_offset: 12 */
5259     DW_CFA_advance_loc + 58,     /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5260     DW_CFA_def_cfa_expression,   /* DW_CFA_def_cfa_expression */
5261     13,                          /* Block length */
5262     DW_OP_breg4, 4,              /* DW_OP_breg4 (esp): 4 */
5263     DW_OP_breg8, 0,              /* DW_OP_breg8 (eip): 0 */
5264     DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5265     DW_OP_lit2, DW_OP_shl, DW_OP_plus,
5266     DW_CFA_nop, DW_CFA_nop
5267   };
5268 
5269 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
5270   {
5271     elf_i386_nacl_plt0_entry,		/* plt0_entry */
5272     sizeof (elf_i386_nacl_plt0_entry),	/* plt0_entry_size */
5273     2,					/* plt0_got1_offset */
5274     8,					/* plt0_got2_offset */
5275     elf_i386_nacl_plt_entry,		/* plt_entry */
5276     NACL_PLT_ENTRY_SIZE,		/* plt_entry_size */
5277     2,					/* plt_got_offset */
5278     33,					/* plt_reloc_offset */
5279     38,					/* plt_plt_offset */
5280     32,					/* plt_lazy_offset */
5281     elf_i386_nacl_pic_plt0_entry,	/* pic_plt0_entry */
5282     elf_i386_nacl_pic_plt_entry,	/* pic_plt_entry */
5283     elf_i386_nacl_eh_frame_plt,		/* eh_frame_plt */
5284     sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
5285   };
5286 
5287 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
5288   {
5289     &elf_i386_nacl_plt,                      /* plt */
5290     0x90,				/* plt0_pad_byte: nop insn */
5291     0,                                  /* is_vxworks */
5292   };
5293 
5294 #undef	elf_backend_arch_data
5295 #define elf_backend_arch_data	&elf_i386_nacl_arch_bed
5296 
5297 #undef	elf_backend_modify_segment_map
5298 #define	elf_backend_modify_segment_map		nacl_modify_segment_map
5299 #undef	elf_backend_modify_program_headers
5300 #define	elf_backend_modify_program_headers	nacl_modify_program_headers
5301 
5302 #include "elf32-target.h"
5303 
5304 /* Restore defaults.  */
5305 #undef	elf_backend_modify_segment_map
5306 #undef	elf_backend_modify_program_headers
5307 
5308 /* VxWorks support.  */
5309 
5310 #undef	TARGET_LITTLE_SYM
5311 #define TARGET_LITTLE_SYM		bfd_elf32_i386_vxworks_vec
5312 #undef	TARGET_LITTLE_NAME
5313 #define TARGET_LITTLE_NAME		"elf32-i386-vxworks"
5314 #undef	ELF_OSABI
5315 #undef	elf_backend_plt_alignment
5316 #define elf_backend_plt_alignment	4
5317 
5318 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
5319   {
5320     &elf_i386_plt,                      /* plt */
5321     0x90,                               /* plt0_pad_byte */
5322     1,                                  /* is_vxworks */
5323   };
5324 
5325 #undef	elf_backend_arch_data
5326 #define	elf_backend_arch_data	&elf_i386_vxworks_arch_bed
5327 
5328 #undef elf_backend_relocs_compatible
5329 #undef elf_backend_post_process_headers
5330 #undef elf_backend_add_symbol_hook
5331 #define elf_backend_add_symbol_hook \
5332   elf_vxworks_add_symbol_hook
5333 #undef elf_backend_link_output_symbol_hook
5334 #define elf_backend_link_output_symbol_hook \
5335   elf_vxworks_link_output_symbol_hook
5336 #undef elf_backend_emit_relocs
5337 #define elf_backend_emit_relocs			elf_vxworks_emit_relocs
5338 #undef elf_backend_final_write_processing
5339 #define elf_backend_final_write_processing \
5340   elf_vxworks_final_write_processing
5341 #undef elf_backend_static_tls_alignment
5342 
5343 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
5344    define it.  */
5345 #undef elf_backend_want_plt_sym
5346 #define elf_backend_want_plt_sym	1
5347 
5348 #undef	elf32_bed
5349 #define elf32_bed				elf32_i386_vxworks_bed
5350 
5351 #include "elf32-target.h"
5352