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