2005-08-24 H.J. Lu <hongjiu.lu@intel.com>
[external/binutils.git] / bfd / elf32-i386.c
1 /* Intel 80386/80486-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005 Free Software Foundation, Inc.
4
5    This file is part of BFD, the Binary File Descriptor library.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf-vxworks.h"
27
28 /* 386 uses REL relocations instead of RELA.  */
29 #define USE_REL 1
30
31 #include "elf/i386.h"
32
33 static reloc_howto_type elf_howto_table[]=
34 {
35   HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
36         bfd_elf_generic_reloc, "R_386_NONE",
37         TRUE, 0x00000000, 0x00000000, FALSE),
38   HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
39         bfd_elf_generic_reloc, "R_386_32",
40         TRUE, 0xffffffff, 0xffffffff, FALSE),
41   HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
42         bfd_elf_generic_reloc, "R_386_PC32",
43         TRUE, 0xffffffff, 0xffffffff, TRUE),
44   HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
45         bfd_elf_generic_reloc, "R_386_GOT32",
46         TRUE, 0xffffffff, 0xffffffff, FALSE),
47   HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
48         bfd_elf_generic_reloc, "R_386_PLT32",
49         TRUE, 0xffffffff, 0xffffffff, TRUE),
50   HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
51         bfd_elf_generic_reloc, "R_386_COPY",
52         TRUE, 0xffffffff, 0xffffffff, FALSE),
53   HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
54         bfd_elf_generic_reloc, "R_386_GLOB_DAT",
55         TRUE, 0xffffffff, 0xffffffff, FALSE),
56   HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
57         bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
58         TRUE, 0xffffffff, 0xffffffff, FALSE),
59   HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
60         bfd_elf_generic_reloc, "R_386_RELATIVE",
61         TRUE, 0xffffffff, 0xffffffff, FALSE),
62   HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
63         bfd_elf_generic_reloc, "R_386_GOTOFF",
64         TRUE, 0xffffffff, 0xffffffff, FALSE),
65   HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
66         bfd_elf_generic_reloc, "R_386_GOTPC",
67         TRUE, 0xffffffff, 0xffffffff, TRUE),
68
69   /* We have a gap in the reloc numbers here.
70      R_386_standard counts the number up to this point, and
71      R_386_ext_offset is the value to subtract from a reloc type of
72      R_386_16 thru R_386_PC8 to form an index into this table.  */
73 #define R_386_standard (R_386_GOTPC + 1)
74 #define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
75
76   /* These relocs are a GNU extension.  */
77   HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
78         bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
79         TRUE, 0xffffffff, 0xffffffff, FALSE),
80   HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
81         bfd_elf_generic_reloc, "R_386_TLS_IE",
82         TRUE, 0xffffffff, 0xffffffff, FALSE),
83   HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
84         bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
85         TRUE, 0xffffffff, 0xffffffff, FALSE),
86   HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
87         bfd_elf_generic_reloc, "R_386_TLS_LE",
88         TRUE, 0xffffffff, 0xffffffff, FALSE),
89   HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
90         bfd_elf_generic_reloc, "R_386_TLS_GD",
91         TRUE, 0xffffffff, 0xffffffff, FALSE),
92   HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
93         bfd_elf_generic_reloc, "R_386_TLS_LDM",
94         TRUE, 0xffffffff, 0xffffffff, FALSE),
95   HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
96         bfd_elf_generic_reloc, "R_386_16",
97         TRUE, 0xffff, 0xffff, FALSE),
98   HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
99         bfd_elf_generic_reloc, "R_386_PC16",
100         TRUE, 0xffff, 0xffff, TRUE),
101   HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
102         bfd_elf_generic_reloc, "R_386_8",
103         TRUE, 0xff, 0xff, FALSE),
104   HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
105         bfd_elf_generic_reloc, "R_386_PC8",
106         TRUE, 0xff, 0xff, TRUE),
107
108 #define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
109 #define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
110   /* These are common with Solaris TLS implementation.  */
111   HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
112         bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
113         TRUE, 0xffffffff, 0xffffffff, FALSE),
114   HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
115         bfd_elf_generic_reloc, "R_386_TLS_IE_32",
116         TRUE, 0xffffffff, 0xffffffff, FALSE),
117   HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
118         bfd_elf_generic_reloc, "R_386_TLS_LE_32",
119         TRUE, 0xffffffff, 0xffffffff, FALSE),
120   HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
121         bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
122         TRUE, 0xffffffff, 0xffffffff, FALSE),
123   HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
124         bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
125         TRUE, 0xffffffff, 0xffffffff, FALSE),
126   HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
127         bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
128         TRUE, 0xffffffff, 0xffffffff, FALSE),
129
130   /* Another gap.  */
131 #define R_386_tls (R_386_TLS_TPOFF32 + 1 - R_386_tls_offset)
132 #define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_tls)
133
134 /* GNU extension to record C++ vtable hierarchy.  */
135   HOWTO (R_386_GNU_VTINHERIT,   /* type */
136          0,                     /* rightshift */
137          2,                     /* size (0 = byte, 1 = short, 2 = long) */
138          0,                     /* bitsize */
139          FALSE,                 /* pc_relative */
140          0,                     /* bitpos */
141          complain_overflow_dont, /* complain_on_overflow */
142          NULL,                  /* special_function */
143          "R_386_GNU_VTINHERIT", /* name */
144          FALSE,                 /* partial_inplace */
145          0,                     /* src_mask */
146          0,                     /* dst_mask */
147          FALSE),                /* pcrel_offset */
148
149 /* GNU extension to record C++ vtable member usage.  */
150   HOWTO (R_386_GNU_VTENTRY,     /* type */
151          0,                     /* rightshift */
152          2,                     /* size (0 = byte, 1 = short, 2 = long) */
153          0,                     /* bitsize */
154          FALSE,                 /* pc_relative */
155          0,                     /* bitpos */
156          complain_overflow_dont, /* complain_on_overflow */
157          _bfd_elf_rel_vtable_reloc_fn, /* special_function */
158          "R_386_GNU_VTENTRY",   /* name */
159          FALSE,                 /* partial_inplace */
160          0,                     /* src_mask */
161          0,                     /* dst_mask */
162          FALSE)                 /* pcrel_offset */
163
164 #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
165
166 };
167
168 #ifdef DEBUG_GEN_RELOC
169 #define TRACE(str) \
170   fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
171 #else
172 #define TRACE(str)
173 #endif
174
175 static reloc_howto_type *
176 elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
177                             bfd_reloc_code_real_type code)
178 {
179   switch (code)
180     {
181     case BFD_RELOC_NONE:
182       TRACE ("BFD_RELOC_NONE");
183       return &elf_howto_table[R_386_NONE];
184
185     case BFD_RELOC_32:
186       TRACE ("BFD_RELOC_32");
187       return &elf_howto_table[R_386_32];
188
189     case BFD_RELOC_CTOR:
190       TRACE ("BFD_RELOC_CTOR");
191       return &elf_howto_table[R_386_32];
192
193     case BFD_RELOC_32_PCREL:
194       TRACE ("BFD_RELOC_PC32");
195       return &elf_howto_table[R_386_PC32];
196
197     case BFD_RELOC_386_GOT32:
198       TRACE ("BFD_RELOC_386_GOT32");
199       return &elf_howto_table[R_386_GOT32];
200
201     case BFD_RELOC_386_PLT32:
202       TRACE ("BFD_RELOC_386_PLT32");
203       return &elf_howto_table[R_386_PLT32];
204
205     case BFD_RELOC_386_COPY:
206       TRACE ("BFD_RELOC_386_COPY");
207       return &elf_howto_table[R_386_COPY];
208
209     case BFD_RELOC_386_GLOB_DAT:
210       TRACE ("BFD_RELOC_386_GLOB_DAT");
211       return &elf_howto_table[R_386_GLOB_DAT];
212
213     case BFD_RELOC_386_JUMP_SLOT:
214       TRACE ("BFD_RELOC_386_JUMP_SLOT");
215       return &elf_howto_table[R_386_JUMP_SLOT];
216
217     case BFD_RELOC_386_RELATIVE:
218       TRACE ("BFD_RELOC_386_RELATIVE");
219       return &elf_howto_table[R_386_RELATIVE];
220
221     case BFD_RELOC_386_GOTOFF:
222       TRACE ("BFD_RELOC_386_GOTOFF");
223       return &elf_howto_table[R_386_GOTOFF];
224
225     case BFD_RELOC_386_GOTPC:
226       TRACE ("BFD_RELOC_386_GOTPC");
227       return &elf_howto_table[R_386_GOTPC];
228
229       /* These relocs are a GNU extension.  */
230     case BFD_RELOC_386_TLS_TPOFF:
231       TRACE ("BFD_RELOC_386_TLS_TPOFF");
232       return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
233
234     case BFD_RELOC_386_TLS_IE:
235       TRACE ("BFD_RELOC_386_TLS_IE");
236       return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
237
238     case BFD_RELOC_386_TLS_GOTIE:
239       TRACE ("BFD_RELOC_386_TLS_GOTIE");
240       return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
241
242     case BFD_RELOC_386_TLS_LE:
243       TRACE ("BFD_RELOC_386_TLS_LE");
244       return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
245
246     case BFD_RELOC_386_TLS_GD:
247       TRACE ("BFD_RELOC_386_TLS_GD");
248       return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
249
250     case BFD_RELOC_386_TLS_LDM:
251       TRACE ("BFD_RELOC_386_TLS_LDM");
252       return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
253
254     case BFD_RELOC_16:
255       TRACE ("BFD_RELOC_16");
256       return &elf_howto_table[R_386_16 - R_386_ext_offset];
257
258     case BFD_RELOC_16_PCREL:
259       TRACE ("BFD_RELOC_16_PCREL");
260       return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
261
262     case BFD_RELOC_8:
263       TRACE ("BFD_RELOC_8");
264       return &elf_howto_table[R_386_8 - R_386_ext_offset];
265
266     case BFD_RELOC_8_PCREL:
267       TRACE ("BFD_RELOC_8_PCREL");
268       return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
269
270     /* Common with Sun TLS implementation.  */
271     case BFD_RELOC_386_TLS_LDO_32:
272       TRACE ("BFD_RELOC_386_TLS_LDO_32");
273       return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
274
275     case BFD_RELOC_386_TLS_IE_32:
276       TRACE ("BFD_RELOC_386_TLS_IE_32");
277       return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
278
279     case BFD_RELOC_386_TLS_LE_32:
280       TRACE ("BFD_RELOC_386_TLS_LE_32");
281       return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
282
283     case BFD_RELOC_386_TLS_DTPMOD32:
284       TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
285       return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
286
287     case BFD_RELOC_386_TLS_DTPOFF32:
288       TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
289       return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
290
291     case BFD_RELOC_386_TLS_TPOFF32:
292       TRACE ("BFD_RELOC_386_TLS_TPOFF32");
293       return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
294
295     case BFD_RELOC_VTABLE_INHERIT:
296       TRACE ("BFD_RELOC_VTABLE_INHERIT");
297       return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
298
299     case BFD_RELOC_VTABLE_ENTRY:
300       TRACE ("BFD_RELOC_VTABLE_ENTRY");
301       return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
302
303     default:
304       break;
305     }
306
307   TRACE ("Unknown");
308   return 0;
309 }
310
311 static void
312 elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
313                             arelent *cache_ptr,
314                             Elf_Internal_Rela *dst)
315 {
316   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
317   unsigned int indx;
318
319   if ((indx = r_type) >= R_386_standard
320       && ((indx = r_type - R_386_ext_offset) - R_386_standard
321           >= R_386_ext - R_386_standard)
322       && ((indx = r_type - R_386_tls_offset) - R_386_ext
323           >= R_386_tls - R_386_ext)
324       && ((indx = r_type - R_386_vt_offset) - R_386_tls
325           >= R_386_vt - R_386_tls))
326     {
327       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
328                              abfd, (int) r_type);
329       indx = R_386_NONE;
330     }
331   cache_ptr->howto = &elf_howto_table[indx];
332 }
333
334 /* Return whether a symbol name implies a local label.  The UnixWare
335    2.1 cc generates temporary symbols that start with .X, so we
336    recognize them here.  FIXME: do other SVR4 compilers also use .X?.
337    If so, we should move the .X recognition into
338    _bfd_elf_is_local_label_name.  */
339
340 static bfd_boolean
341 elf_i386_is_local_label_name (bfd *abfd, const char *name)
342 {
343   if (name[0] == '.' && name[1] == 'X')
344     return TRUE;
345
346   return _bfd_elf_is_local_label_name (abfd, name);
347 }
348 \f
349 /* Support for core dump NOTE sections.  */
350
351 static bfd_boolean
352 elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
353 {
354   int offset;
355   size_t size;
356
357   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
358     {
359       int pr_version = bfd_get_32 (abfd, note->descdata);
360
361       if (pr_version != 1)
362         return FALSE;
363
364       /* pr_cursig */
365       elf_tdata (abfd)->core_signal = bfd_get_32 (abfd, note->descdata + 20);
366
367       /* pr_pid */
368       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
369
370       /* pr_reg */
371       offset = 28;
372       size = bfd_get_32 (abfd, note->descdata + 8);
373     }
374   else
375     {
376       switch (note->descsz)
377         {
378         default:
379           return FALSE;
380
381         case 144:               /* Linux/i386 */
382           /* pr_cursig */
383           elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
384
385           /* pr_pid */
386           elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
387
388           /* pr_reg */
389           offset = 72;
390           size = 68;
391
392           break;
393         }
394     }
395
396   /* Make a ".reg/999" section.  */
397   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
398                                           size, note->descpos + offset);
399 }
400
401 static bfd_boolean
402 elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
403 {
404   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
405     {
406       int pr_version = bfd_get_32 (abfd, note->descdata);
407
408       if (pr_version != 1)
409         return FALSE;
410
411       elf_tdata (abfd)->core_program
412         = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
413       elf_tdata (abfd)->core_command
414         = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
415     }
416   else
417     {
418       switch (note->descsz)
419         {
420         default:
421           return FALSE;
422
423         case 124:               /* Linux/i386 elf_prpsinfo.  */
424           elf_tdata (abfd)->core_program
425             = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
426           elf_tdata (abfd)->core_command
427             = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
428         }
429     }
430
431   /* Note that for some reason, a spurious space is tacked
432      onto the end of the args in some (at least one anyway)
433      implementations, so strip it off if it exists.  */
434   {
435     char *command = elf_tdata (abfd)->core_command;
436     int n = strlen (command);
437
438     if (0 < n && command[n - 1] == ' ')
439       command[n - 1] = '\0';
440   }
441
442   return TRUE;
443 }
444 \f
445 /* Functions for the i386 ELF linker.
446
447    In order to gain some understanding of code in this file without
448    knowing all the intricate details of the linker, note the
449    following:
450
451    Functions named elf_i386_* are called by external routines, other
452    functions are only called locally.  elf_i386_* functions appear
453    in this file more or less in the order in which they are called
454    from external routines.  eg. elf_i386_check_relocs is called
455    early in the link process, elf_i386_finish_dynamic_sections is
456    one of the last functions.  */
457
458
459 /* The name of the dynamic interpreter.  This is put in the .interp
460    section.  */
461
462 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
463
464 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
465    copying dynamic variables from a shared lib into an app's dynbss
466    section, and instead use a dynamic relocation to point into the
467    shared lib.  */
468 #define ELIMINATE_COPY_RELOCS 1
469
470 /* The size in bytes of an entry in the procedure linkage table.  */
471
472 #define PLT_ENTRY_SIZE 16
473
474 /* The first entry in an absolute procedure linkage table looks like
475    this.  See the SVR4 ABI i386 supplement to see how this works.
476    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
477
478 static const bfd_byte elf_i386_plt0_entry[12] =
479 {
480   0xff, 0x35,   /* pushl contents of address */
481   0, 0, 0, 0,   /* replaced with address of .got + 4.  */
482   0xff, 0x25,   /* jmp indirect */
483   0, 0, 0, 0    /* replaced with address of .got + 8.  */
484 };
485
486 /* Subsequent entries in an absolute procedure linkage table look like
487    this.  */
488
489 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
490 {
491   0xff, 0x25,   /* jmp indirect */
492   0, 0, 0, 0,   /* replaced with address of this symbol in .got.  */
493   0x68,         /* pushl immediate */
494   0, 0, 0, 0,   /* replaced with offset into relocation table.  */
495   0xe9,         /* jmp relative */
496   0, 0, 0, 0    /* replaced with offset to start of .plt.  */
497 };
498
499 /* The first entry in a PIC procedure linkage table look like this.
500    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
501
502 static const bfd_byte elf_i386_pic_plt0_entry[12] =
503 {
504   0xff, 0xb3, 4, 0, 0, 0,       /* pushl 4(%ebx) */
505   0xff, 0xa3, 8, 0, 0, 0        /* jmp *8(%ebx) */
506 };
507
508 /* Subsequent entries in a PIC procedure linkage table look like this.  */
509
510 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
511 {
512   0xff, 0xa3,   /* jmp *offset(%ebx) */
513   0, 0, 0, 0,   /* replaced with offset of this symbol in .got.  */
514   0x68,         /* pushl immediate */
515   0, 0, 0, 0,   /* replaced with offset into relocation table.  */
516   0xe9,         /* jmp relative */
517   0, 0, 0, 0    /* replaced with offset to start of .plt.  */
518 };
519
520 /* On VxWorks, the .rel.plt.unloaded section has absolute relocations
521    for the PLTResolve stub and then for each PLT entry.  */
522 #define PLTRESOLVE_RELOCS_SHLIB 0
523 #define PLTRESOLVE_RELOCS 2
524 #define PLT_NON_JUMP_SLOT_RELOCS 2
525
526 /* The i386 linker needs to keep track of the number of relocs that it
527    decides to copy as dynamic relocs in check_relocs for each symbol.
528    This is so that it can later discard them if they are found to be
529    unnecessary.  We store the information in a field extending the
530    regular ELF linker hash table.  */
531
532 struct elf_i386_dyn_relocs
533 {
534   struct elf_i386_dyn_relocs *next;
535
536   /* The input section of the reloc.  */
537   asection *sec;
538
539   /* Total number of relocs copied for the input section.  */
540   bfd_size_type count;
541
542   /* Number of pc-relative relocs copied for the input section.  */
543   bfd_size_type pc_count;
544 };
545
546 /* i386 ELF linker hash entry.  */
547
548 struct elf_i386_link_hash_entry
549 {
550   struct elf_link_hash_entry elf;
551
552   /* Track dynamic relocs copied for this symbol.  */
553   struct elf_i386_dyn_relocs *dyn_relocs;
554
555 #define GOT_UNKNOWN     0
556 #define GOT_NORMAL      1
557 #define GOT_TLS_GD      2
558 #define GOT_TLS_IE      4
559 #define GOT_TLS_IE_POS  5
560 #define GOT_TLS_IE_NEG  6
561 #define GOT_TLS_IE_BOTH 7
562   unsigned char tls_type;
563 };
564
565 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
566
567 struct elf_i386_obj_tdata
568 {
569   struct elf_obj_tdata root;
570
571   /* tls_type for each local got entry.  */
572   char *local_got_tls_type;
573 };
574
575 #define elf_i386_tdata(abfd) \
576   ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
577
578 #define elf_i386_local_got_tls_type(abfd) \
579   (elf_i386_tdata (abfd)->local_got_tls_type)
580
581 static bfd_boolean
582 elf_i386_mkobject (bfd *abfd)
583 {
584   bfd_size_type amt = sizeof (struct elf_i386_obj_tdata);
585   abfd->tdata.any = bfd_zalloc (abfd, amt);
586   if (abfd->tdata.any == NULL)
587     return FALSE;
588   return TRUE;
589 }
590
591 /* i386 ELF linker hash table.  */
592
593 struct elf_i386_link_hash_table
594 {
595   struct elf_link_hash_table elf;
596
597   /* Short-cuts to get to dynamic linker sections.  */
598   asection *sgot;
599   asection *sgotplt;
600   asection *srelgot;
601   asection *splt;
602   asection *srelplt;
603   asection *sdynbss;
604   asection *srelbss;
605
606   /* The (unloaded but important) .rel.plt.unloaded section on VxWorks.  */
607   asection *srelplt2;
608
609   /* Short-cuts to frequently used symbols for VxWorks targets.  */
610   struct elf_link_hash_entry *hgot, *hplt;
611
612   /* True if the target system is VxWorks.  */
613   int is_vxworks;
614
615   /* Value used to fill the last word of the first plt entry.  */
616   bfd_byte plt0_pad_byte;
617
618   union {
619     bfd_signed_vma refcount;
620     bfd_vma offset;
621   } tls_ldm_got;
622
623   /* Small local sym to section mapping cache.  */
624   struct sym_sec_cache sym_sec;
625 };
626
627 /* Get the i386 ELF linker hash table from a link_info structure.  */
628
629 #define elf_i386_hash_table(p) \
630   ((struct elf_i386_link_hash_table *) ((p)->hash))
631
632 /* Create an entry in an i386 ELF linker hash table.  */
633
634 static struct bfd_hash_entry *
635 link_hash_newfunc (struct bfd_hash_entry *entry,
636                    struct bfd_hash_table *table,
637                    const char *string)
638 {
639   /* Allocate the structure if it has not already been allocated by a
640      subclass.  */
641   if (entry == NULL)
642     {
643       entry = bfd_hash_allocate (table,
644                                  sizeof (struct elf_i386_link_hash_entry));
645       if (entry == NULL)
646         return entry;
647     }
648
649   /* Call the allocation method of the superclass.  */
650   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
651   if (entry != NULL)
652     {
653       struct elf_i386_link_hash_entry *eh;
654
655       eh = (struct elf_i386_link_hash_entry *) entry;
656       eh->dyn_relocs = NULL;
657       eh->tls_type = GOT_UNKNOWN;
658     }
659
660   return entry;
661 }
662
663 /* Create an i386 ELF linker hash table.  */
664
665 static struct bfd_link_hash_table *
666 elf_i386_link_hash_table_create (bfd *abfd)
667 {
668   struct elf_i386_link_hash_table *ret;
669   bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
670
671   ret = bfd_malloc (amt);
672   if (ret == NULL)
673     return NULL;
674
675   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
676     {
677       free (ret);
678       return NULL;
679     }
680
681   ret->sgot = NULL;
682   ret->sgotplt = NULL;
683   ret->srelgot = NULL;
684   ret->splt = NULL;
685   ret->srelplt = NULL;
686   ret->sdynbss = NULL;
687   ret->srelbss = NULL;
688   ret->tls_ldm_got.refcount = 0;
689   ret->sym_sec.abfd = NULL;
690   ret->is_vxworks = 0;
691   ret->srelplt2 = NULL;
692   ret->hgot = NULL;
693   ret->hplt = NULL;
694   ret->plt0_pad_byte = 0;
695
696   return &ret->elf.root;
697 }
698
699 /* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
700    shortcuts to them in our hash table.  */
701
702 static bfd_boolean
703 create_got_section (bfd *dynobj, struct bfd_link_info *info)
704 {
705   struct elf_i386_link_hash_table *htab;
706
707   if (! _bfd_elf_create_got_section (dynobj, info))
708     return FALSE;
709
710   htab = elf_i386_hash_table (info);
711   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
712   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
713   if (!htab->sgot || !htab->sgotplt)
714     abort ();
715
716   htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got",
717                                                (SEC_ALLOC | SEC_LOAD
718                                                 | SEC_HAS_CONTENTS
719                                                 | SEC_IN_MEMORY
720                                                 | SEC_LINKER_CREATED
721                                                 | SEC_READONLY));
722   if (htab->srelgot == NULL
723       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
724     return FALSE;
725   return TRUE;
726 }
727
728 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
729    .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
730    hash table.  */
731
732 static bfd_boolean
733 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
734 {
735   struct elf_i386_link_hash_table *htab;
736   asection * s;
737   int flags;
738   const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
739
740   htab = elf_i386_hash_table (info);
741   if (!htab->sgot && !create_got_section (dynobj, info))
742     return FALSE;
743
744   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
745     return FALSE;
746
747   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
748   htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
749   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
750   if (!info->shared)
751     htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
752
753   if (!htab->splt || !htab->srelplt || !htab->sdynbss
754       || (!info->shared && !htab->srelbss))
755     abort ();
756
757   if (htab->is_vxworks && !info->shared)
758     {
759       s = bfd_make_section (dynobj, ".rel.plt.unloaded");
760       flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY
761               | SEC_LINKER_CREATED);
762       if (s == NULL
763          || ! bfd_set_section_flags (dynobj, s, flags)
764          || ! bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
765        return FALSE;
766       htab->srelplt2 = s;
767     }
768
769   return TRUE;
770 }
771
772 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
773
774 static void
775 elf_i386_copy_indirect_symbol (const struct elf_backend_data *bed,
776                                struct elf_link_hash_entry *dir,
777                                struct elf_link_hash_entry *ind)
778 {
779   struct elf_i386_link_hash_entry *edir, *eind;
780
781   edir = (struct elf_i386_link_hash_entry *) dir;
782   eind = (struct elf_i386_link_hash_entry *) ind;
783
784   if (eind->dyn_relocs != NULL)
785     {
786       if (edir->dyn_relocs != NULL)
787         {
788           struct elf_i386_dyn_relocs **pp;
789           struct elf_i386_dyn_relocs *p;
790
791           if (ind->root.type == bfd_link_hash_indirect)
792             abort ();
793
794           /* Add reloc counts against the weak sym to the strong sym
795              list.  Merge any entries against the same section.  */
796           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
797             {
798               struct elf_i386_dyn_relocs *q;
799
800               for (q = edir->dyn_relocs; q != NULL; q = q->next)
801                 if (q->sec == p->sec)
802                   {
803                     q->pc_count += p->pc_count;
804                     q->count += p->count;
805                     *pp = p->next;
806                     break;
807                   }
808               if (q == NULL)
809                 pp = &p->next;
810             }
811           *pp = edir->dyn_relocs;
812         }
813
814       edir->dyn_relocs = eind->dyn_relocs;
815       eind->dyn_relocs = NULL;
816     }
817
818   if (ind->root.type == bfd_link_hash_indirect
819       && dir->got.refcount <= 0)
820     {
821       edir->tls_type = eind->tls_type;
822       eind->tls_type = GOT_UNKNOWN;
823     }
824
825   if (ELIMINATE_COPY_RELOCS
826       && ind->root.type != bfd_link_hash_indirect
827       && dir->dynamic_adjusted)
828     {
829       /* If called to transfer flags for a weakdef during processing
830          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
831          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
832       dir->ref_dynamic |= ind->ref_dynamic;
833       dir->ref_regular |= ind->ref_regular;
834       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
835       dir->needs_plt |= ind->needs_plt;
836       dir->pointer_equality_needed |= ind->pointer_equality_needed;
837     }
838   else
839     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
840 }
841
842 static int
843 elf_i386_tls_transition (struct bfd_link_info *info, int r_type, int is_local)
844 {
845   if (info->shared)
846     return r_type;
847
848   switch (r_type)
849     {
850     case R_386_TLS_GD:
851     case R_386_TLS_IE_32:
852       if (is_local)
853         return R_386_TLS_LE_32;
854       return R_386_TLS_IE_32;
855     case R_386_TLS_IE:
856     case R_386_TLS_GOTIE:
857       if (is_local)
858         return R_386_TLS_LE_32;
859       return r_type;
860     case R_386_TLS_LDM:
861       return R_386_TLS_LE_32;
862     }
863
864   return r_type;
865 }
866
867 /* Look through the relocs for a section during the first phase, and
868    calculate needed space in the global offset table, procedure linkage
869    table, and dynamic reloc sections.  */
870
871 static bfd_boolean
872 elf_i386_check_relocs (bfd *abfd,
873                        struct bfd_link_info *info,
874                        asection *sec,
875                        const Elf_Internal_Rela *relocs)
876 {
877   struct elf_i386_link_hash_table *htab;
878   Elf_Internal_Shdr *symtab_hdr;
879   struct elf_link_hash_entry **sym_hashes;
880   const Elf_Internal_Rela *rel;
881   const Elf_Internal_Rela *rel_end;
882   asection *sreloc;
883
884   if (info->relocatable)
885     return TRUE;
886
887   htab = elf_i386_hash_table (info);
888   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
889   sym_hashes = elf_sym_hashes (abfd);
890
891   sreloc = NULL;
892
893   rel_end = relocs + sec->reloc_count;
894   for (rel = relocs; rel < rel_end; rel++)
895     {
896       unsigned int r_type;
897       unsigned long r_symndx;
898       struct elf_link_hash_entry *h;
899
900       r_symndx = ELF32_R_SYM (rel->r_info);
901       r_type = ELF32_R_TYPE (rel->r_info);
902
903       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
904         {
905           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
906                                  abfd,
907                                  r_symndx);
908           return FALSE;
909         }
910
911       if (r_symndx < symtab_hdr->sh_info)
912         h = NULL;
913       else
914         {
915           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
916           while (h->root.type == bfd_link_hash_indirect
917                  || h->root.type == bfd_link_hash_warning)
918             h = (struct elf_link_hash_entry *) h->root.u.i.link;
919         }
920
921       r_type = elf_i386_tls_transition (info, r_type, h == NULL);
922
923       switch (r_type)
924         {
925         case R_386_TLS_LDM:
926           htab->tls_ldm_got.refcount += 1;
927           goto create_got;
928
929         case R_386_PLT32:
930           /* This symbol requires a procedure linkage table entry.  We
931              actually build the entry in adjust_dynamic_symbol,
932              because this might be a case of linking PIC code which is
933              never referenced by a dynamic object, in which case we
934              don't need to generate a procedure linkage table entry
935              after all.  */
936
937           /* If this is a local symbol, we resolve it directly without
938              creating a procedure linkage table entry.  */
939           if (h == NULL)
940             continue;
941
942           h->needs_plt = 1;
943           h->plt.refcount += 1;
944           break;
945
946         case R_386_TLS_IE_32:
947         case R_386_TLS_IE:
948         case R_386_TLS_GOTIE:
949           if (info->shared)
950             info->flags |= DF_STATIC_TLS;
951           /* Fall through */
952
953         case R_386_GOT32:
954         case R_386_TLS_GD:
955           /* This symbol requires a global offset table entry.  */
956           {
957             int tls_type, old_tls_type;
958
959             switch (r_type)
960               {
961               default:
962               case R_386_GOT32: tls_type = GOT_NORMAL; break;
963               case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
964               case R_386_TLS_IE_32:
965                 if (ELF32_R_TYPE (rel->r_info) == r_type)
966                   tls_type = GOT_TLS_IE_NEG;
967                 else
968                   /* If this is a GD->IE transition, we may use either of
969                      R_386_TLS_TPOFF and R_386_TLS_TPOFF32.  */
970                   tls_type = GOT_TLS_IE;
971                 break;
972               case R_386_TLS_IE:
973               case R_386_TLS_GOTIE:
974                 tls_type = GOT_TLS_IE_POS; break;
975               }
976
977             if (h != NULL)
978               {
979                 h->got.refcount += 1;
980                 old_tls_type = elf_i386_hash_entry(h)->tls_type;
981               }
982             else
983               {
984                 bfd_signed_vma *local_got_refcounts;
985
986                 /* This is a global offset table entry for a local symbol.  */
987                 local_got_refcounts = elf_local_got_refcounts (abfd);
988                 if (local_got_refcounts == NULL)
989                   {
990                     bfd_size_type size;
991
992                     size = symtab_hdr->sh_info;
993                     size *= (sizeof (bfd_signed_vma) + sizeof(char));
994                     local_got_refcounts = bfd_zalloc (abfd, size);
995                     if (local_got_refcounts == NULL)
996                       return FALSE;
997                     elf_local_got_refcounts (abfd) = local_got_refcounts;
998                     elf_i386_local_got_tls_type (abfd)
999                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1000                   }
1001                 local_got_refcounts[r_symndx] += 1;
1002                 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1003               }
1004
1005             if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1006               tls_type |= old_tls_type;
1007             /* If a TLS symbol is accessed using IE at least once,
1008                there is no point to use dynamic model for it.  */
1009             else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1010                      && (old_tls_type != GOT_TLS_GD
1011                          || (tls_type & GOT_TLS_IE) == 0))
1012               {
1013                 if ((old_tls_type & GOT_TLS_IE) && tls_type == GOT_TLS_GD)
1014                   tls_type = old_tls_type;
1015                 else
1016                   {
1017                     (*_bfd_error_handler)
1018                       (_("%B: `%s' accessed both as normal and "
1019                          "thread local symbol"),
1020                        abfd,
1021                        h ? h->root.root.string : "<local>");
1022                     return FALSE;
1023                   }
1024               }
1025
1026             if (old_tls_type != tls_type)
1027               {
1028                 if (h != NULL)
1029                   elf_i386_hash_entry (h)->tls_type = tls_type;
1030                 else
1031                   elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1032               }
1033           }
1034           /* Fall through */
1035
1036         case R_386_GOTOFF:
1037         case R_386_GOTPC:
1038         create_got:
1039           if (htab->sgot == NULL)
1040             {
1041               if (htab->elf.dynobj == NULL)
1042                 htab->elf.dynobj = abfd;
1043               if (!create_got_section (htab->elf.dynobj, info))
1044                 return FALSE;
1045             }
1046           if (r_type != R_386_TLS_IE)
1047             break;
1048           /* Fall through */
1049
1050         case R_386_TLS_LE_32:
1051         case R_386_TLS_LE:
1052           if (!info->shared)
1053             break;
1054           info->flags |= DF_STATIC_TLS;
1055           /* Fall through */
1056
1057         case R_386_32:
1058         case R_386_PC32:
1059           if (h != NULL && !info->shared)
1060             {
1061               /* If this reloc is in a read-only section, we might
1062                  need a copy reloc.  We can't check reliably at this
1063                  stage whether the section is read-only, as input
1064                  sections have not yet been mapped to output sections.
1065                  Tentatively set the flag for now, and correct in
1066                  adjust_dynamic_symbol.  */
1067               h->non_got_ref = 1;
1068
1069               /* We may need a .plt entry if the function this reloc
1070                  refers to is in a shared lib.  */
1071               h->plt.refcount += 1;
1072               if (r_type != R_386_PC32)
1073                 h->pointer_equality_needed = 1;
1074             }
1075
1076           /* If we are creating a shared library, and this is a reloc
1077              against a global symbol, or a non PC relative reloc
1078              against a local symbol, then we need to copy the reloc
1079              into the shared library.  However, if we are linking with
1080              -Bsymbolic, we do not need to copy a reloc against a
1081              global symbol which is defined in an object we are
1082              including in the link (i.e., DEF_REGULAR is set).  At
1083              this point we have not seen all the input files, so it is
1084              possible that DEF_REGULAR is not set now but will be set
1085              later (it is never cleared).  In case of a weak definition,
1086              DEF_REGULAR may be cleared later by a strong definition in
1087              a shared library.  We account for that possibility below by
1088              storing information in the relocs_copied field of the hash
1089              table entry.  A similar situation occurs when creating
1090              shared libraries and symbol visibility changes render the
1091              symbol local.
1092
1093              If on the other hand, we are creating an executable, we
1094              may need to keep relocations for symbols satisfied by a
1095              dynamic library if we manage to avoid copy relocs for the
1096              symbol.  */
1097           if ((info->shared
1098                && (sec->flags & SEC_ALLOC) != 0
1099                && (r_type != R_386_PC32
1100                    || (h != NULL
1101                        && (! info->symbolic
1102                            || h->root.type == bfd_link_hash_defweak
1103                            || !h->def_regular))))
1104               || (ELIMINATE_COPY_RELOCS
1105                   && !info->shared
1106                   && (sec->flags & SEC_ALLOC) != 0
1107                   && h != NULL
1108                   && (h->root.type == bfd_link_hash_defweak
1109                       || !h->def_regular)))
1110             {
1111               struct elf_i386_dyn_relocs *p;
1112               struct elf_i386_dyn_relocs **head;
1113
1114               /* We must copy these reloc types into the output file.
1115                  Create a reloc section in dynobj and make room for
1116                  this reloc.  */
1117               if (sreloc == NULL)
1118                 {
1119                   const char *name;
1120                   bfd *dynobj;
1121                   unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
1122                   unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name;
1123
1124                   name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
1125                   if (name == NULL)
1126                     return FALSE;
1127
1128                   if (strncmp (name, ".rel", 4) != 0
1129                       || strcmp (bfd_get_section_name (abfd, sec),
1130                                  name + 4) != 0)
1131                     {
1132                       (*_bfd_error_handler)
1133                         (_("%B: bad relocation section name `%s\'"),
1134                          abfd, name);
1135                     }
1136
1137                   if (htab->elf.dynobj == NULL)
1138                     htab->elf.dynobj = abfd;
1139
1140                   dynobj = htab->elf.dynobj;
1141                   sreloc = bfd_get_section_by_name (dynobj, name);
1142                   if (sreloc == NULL)
1143                     {
1144                       flagword flags;
1145
1146                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
1147                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1148                       if ((sec->flags & SEC_ALLOC) != 0)
1149                         flags |= SEC_ALLOC | SEC_LOAD;
1150                       sreloc = bfd_make_section_with_flags (dynobj,
1151                                                             name,
1152                                                             flags);
1153                       if (sreloc == NULL
1154                           || ! bfd_set_section_alignment (dynobj, sreloc, 2))
1155                         return FALSE;
1156                     }
1157                   elf_section_data (sec)->sreloc = sreloc;
1158                 }
1159
1160               /* If this is a global symbol, we count the number of
1161                  relocations we need for this symbol.  */
1162               if (h != NULL)
1163                 {
1164                   head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs;
1165                 }
1166               else
1167                 {
1168                   /* Track dynamic relocs needed for local syms too.
1169                      We really need local syms available to do this
1170                      easily.  Oh well.  */
1171
1172                   asection *s;
1173                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1174                                                  sec, r_symndx);
1175                   if (s == NULL)
1176                     return FALSE;
1177
1178                   head = ((struct elf_i386_dyn_relocs **)
1179                           &elf_section_data (s)->local_dynrel);
1180                 }
1181
1182               p = *head;
1183               if (p == NULL || p->sec != sec)
1184                 {
1185                   bfd_size_type amt = sizeof *p;
1186                   p = bfd_alloc (htab->elf.dynobj, amt);
1187                   if (p == NULL)
1188                     return FALSE;
1189                   p->next = *head;
1190                   *head = p;
1191                   p->sec = sec;
1192                   p->count = 0;
1193                   p->pc_count = 0;
1194                 }
1195
1196               p->count += 1;
1197               if (r_type == R_386_PC32)
1198                 p->pc_count += 1;
1199             }
1200           break;
1201
1202           /* This relocation describes the C++ object vtable hierarchy.
1203              Reconstruct it for later use during GC.  */
1204         case R_386_GNU_VTINHERIT:
1205           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1206             return FALSE;
1207           break;
1208
1209           /* This relocation describes which C++ vtable entries are actually
1210              used.  Record for later use during GC.  */
1211         case R_386_GNU_VTENTRY:
1212           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
1213             return FALSE;
1214           break;
1215
1216         default:
1217           break;
1218         }
1219     }
1220
1221   return TRUE;
1222 }
1223
1224 /* Return the section that should be marked against GC for a given
1225    relocation.  */
1226
1227 static asection *
1228 elf_i386_gc_mark_hook (asection *sec,
1229                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
1230                        Elf_Internal_Rela *rel,
1231                        struct elf_link_hash_entry *h,
1232                        Elf_Internal_Sym *sym)
1233 {
1234   if (h != NULL)
1235     {
1236       switch (ELF32_R_TYPE (rel->r_info))
1237         {
1238         case R_386_GNU_VTINHERIT:
1239         case R_386_GNU_VTENTRY:
1240           break;
1241
1242         default:
1243           switch (h->root.type)
1244             {
1245             case bfd_link_hash_defined:
1246             case bfd_link_hash_defweak:
1247               return h->root.u.def.section;
1248
1249             case bfd_link_hash_common:
1250               return h->root.u.c.p->section;
1251
1252             default:
1253               break;
1254             }
1255         }
1256     }
1257   else
1258     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1259
1260   return NULL;
1261 }
1262
1263 /* Update the got entry reference counts for the section being removed.  */
1264
1265 static bfd_boolean
1266 elf_i386_gc_sweep_hook (bfd *abfd,
1267                         struct bfd_link_info *info,
1268                         asection *sec,
1269                         const Elf_Internal_Rela *relocs)
1270 {
1271   Elf_Internal_Shdr *symtab_hdr;
1272   struct elf_link_hash_entry **sym_hashes;
1273   bfd_signed_vma *local_got_refcounts;
1274   const Elf_Internal_Rela *rel, *relend;
1275
1276   elf_section_data (sec)->local_dynrel = NULL;
1277
1278   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1279   sym_hashes = elf_sym_hashes (abfd);
1280   local_got_refcounts = elf_local_got_refcounts (abfd);
1281
1282   relend = relocs + sec->reloc_count;
1283   for (rel = relocs; rel < relend; rel++)
1284     {
1285       unsigned long r_symndx;
1286       unsigned int r_type;
1287       struct elf_link_hash_entry *h = NULL;
1288
1289       r_symndx = ELF32_R_SYM (rel->r_info);
1290       if (r_symndx >= symtab_hdr->sh_info)
1291         {
1292           struct elf_i386_link_hash_entry *eh;
1293           struct elf_i386_dyn_relocs **pp;
1294           struct elf_i386_dyn_relocs *p;
1295
1296           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1297           while (h->root.type == bfd_link_hash_indirect
1298                  || h->root.type == bfd_link_hash_warning)
1299             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1300           eh = (struct elf_i386_link_hash_entry *) h;
1301
1302           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1303             if (p->sec == sec)
1304               {
1305                 /* Everything must go for SEC.  */
1306                 *pp = p->next;
1307                 break;
1308               }
1309         }
1310
1311       r_type = ELF32_R_TYPE (rel->r_info);
1312       r_type = elf_i386_tls_transition (info, r_type, h != NULL);
1313       switch (r_type)
1314         {
1315         case R_386_TLS_LDM:
1316           if (elf_i386_hash_table (info)->tls_ldm_got.refcount > 0)
1317             elf_i386_hash_table (info)->tls_ldm_got.refcount -= 1;
1318           break;
1319
1320         case R_386_TLS_GD:
1321         case R_386_TLS_IE_32:
1322         case R_386_TLS_IE:
1323         case R_386_TLS_GOTIE:
1324         case R_386_GOT32:
1325           if (h != NULL)
1326             {
1327               if (h->got.refcount > 0)
1328                 h->got.refcount -= 1;
1329             }
1330           else if (local_got_refcounts != NULL)
1331             {
1332               if (local_got_refcounts[r_symndx] > 0)
1333                 local_got_refcounts[r_symndx] -= 1;
1334             }
1335           break;
1336
1337         case R_386_32:
1338         case R_386_PC32:
1339           if (info->shared)
1340             break;
1341           /* Fall through */
1342
1343         case R_386_PLT32:
1344           if (h != NULL)
1345             {
1346               if (h->plt.refcount > 0)
1347                 h->plt.refcount -= 1;
1348             }
1349           break;
1350
1351         default:
1352           break;
1353         }
1354     }
1355
1356   return TRUE;
1357 }
1358
1359 /* Adjust a symbol defined by a dynamic object and referenced by a
1360    regular object.  The current definition is in some section of the
1361    dynamic object, but we're not including those sections.  We have to
1362    change the definition to something the rest of the link can
1363    understand.  */
1364
1365 static bfd_boolean
1366 elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
1367                                 struct elf_link_hash_entry *h)
1368 {
1369   struct elf_i386_link_hash_table *htab;
1370   asection *s;
1371   unsigned int power_of_two;
1372
1373   /* If this is a function, put it in the procedure linkage table.  We
1374      will fill in the contents of the procedure linkage table later,
1375      when we know the address of the .got section.  */
1376   if (h->type == STT_FUNC
1377       || h->needs_plt)
1378     {
1379       if (h->plt.refcount <= 0
1380           || SYMBOL_CALLS_LOCAL (info, h)
1381           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1382               && h->root.type == bfd_link_hash_undefweak))
1383         {
1384           /* This case can occur if we saw a PLT32 reloc in an input
1385              file, but the symbol was never referred to by a dynamic
1386              object, or if all references were garbage collected.  In
1387              such a case, we don't actually need to build a procedure
1388              linkage table, and we can just do a PC32 reloc instead.  */
1389           h->plt.offset = (bfd_vma) -1;
1390           h->needs_plt = 0;
1391         }
1392
1393       return TRUE;
1394     }
1395   else
1396     /* It's possible that we incorrectly decided a .plt reloc was
1397        needed for an R_386_PC32 reloc to a non-function sym in
1398        check_relocs.  We can't decide accurately between function and
1399        non-function syms in check-relocs;  Objects loaded later in
1400        the link may change h->type.  So fix it now.  */
1401     h->plt.offset = (bfd_vma) -1;
1402
1403   /* If this is a weak symbol, and there is a real definition, the
1404      processor independent code will have arranged for us to see the
1405      real definition first, and we can just use the same value.  */
1406   if (h->u.weakdef != NULL)
1407     {
1408       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1409                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1410       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1411       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1412       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
1413         h->non_got_ref = h->u.weakdef->non_got_ref;
1414       return TRUE;
1415     }
1416
1417   /* This is a reference to a symbol defined by a dynamic object which
1418      is not a function.  */
1419
1420   /* If we are creating a shared library, we must presume that the
1421      only references to the symbol are via the global offset table.
1422      For such cases we need not do anything here; the relocations will
1423      be handled correctly by relocate_section.  */
1424   if (info->shared)
1425     return TRUE;
1426
1427   /* If there are no references to this symbol that do not use the
1428      GOT, we don't need to generate a copy reloc.  */
1429   if (!h->non_got_ref)
1430     return TRUE;
1431
1432   /* If -z nocopyreloc was given, we won't generate them either.  */
1433   if (info->nocopyreloc)
1434     {
1435       h->non_got_ref = 0;
1436       return TRUE;
1437     }
1438
1439   htab = elf_i386_hash_table (info);
1440
1441   /* If there aren't any dynamic relocs in read-only sections, then
1442      we can keep the dynamic relocs and avoid the copy reloc.  This
1443      doesn't work on VxWorks, where we can not have dynamic relocations
1444      (other than copy and jump slot relocations) in an executable.  */
1445   if (ELIMINATE_COPY_RELOCS && !htab->is_vxworks)
1446     {
1447       struct elf_i386_link_hash_entry * eh;
1448       struct elf_i386_dyn_relocs *p;
1449
1450       eh = (struct elf_i386_link_hash_entry *) h;
1451       for (p = eh->dyn_relocs; p != NULL; p = p->next)
1452         {
1453           s = p->sec->output_section;
1454           if (s != NULL && (s->flags & SEC_READONLY) != 0)
1455             break;
1456         }
1457
1458       if (p == NULL)
1459         {
1460           h->non_got_ref = 0;
1461           return TRUE;
1462         }
1463     }
1464
1465   if (h->size == 0)
1466     {
1467       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1468                              h->root.root.string);
1469       return TRUE;
1470     }
1471
1472   /* We must allocate the symbol in our .dynbss section, which will
1473      become part of the .bss section of the executable.  There will be
1474      an entry for this symbol in the .dynsym section.  The dynamic
1475      object will contain position independent code, so all references
1476      from the dynamic object to this symbol will go through the global
1477      offset table.  The dynamic linker will use the .dynsym entry to
1478      determine the address it must put in the global offset table, so
1479      both the dynamic object and the regular object will refer to the
1480      same memory location for the variable.  */
1481
1482   /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1483      copy the initial value out of the dynamic object and into the
1484      runtime process image.  */
1485   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1486     {
1487       htab->srelbss->size += sizeof (Elf32_External_Rel);
1488       h->needs_copy = 1;
1489     }
1490
1491   /* We need to figure out the alignment required for this symbol.  I
1492      have no idea how ELF linkers handle this.  */
1493   power_of_two = bfd_log2 (h->size);
1494   if (power_of_two > 3)
1495     power_of_two = 3;
1496
1497   /* Apply the required alignment.  */
1498   s = htab->sdynbss;
1499   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1500   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1501     {
1502       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1503         return FALSE;
1504     }
1505
1506   /* Define the symbol as being at this point in the section.  */
1507   h->root.u.def.section = s;
1508   h->root.u.def.value = s->size;
1509
1510   /* Increment the section size to make room for the symbol.  */
1511   s->size += h->size;
1512
1513   return TRUE;
1514 }
1515
1516 /* Allocate space in .plt, .got and associated reloc sections for
1517    dynamic relocs.  */
1518
1519 static bfd_boolean
1520 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1521 {
1522   struct bfd_link_info *info;
1523   struct elf_i386_link_hash_table *htab;
1524   struct elf_i386_link_hash_entry *eh;
1525   struct elf_i386_dyn_relocs *p;
1526
1527   if (h->root.type == bfd_link_hash_indirect)
1528     return TRUE;
1529
1530   if (h->root.type == bfd_link_hash_warning)
1531     /* When warning symbols are created, they **replace** the "real"
1532        entry in the hash table, thus we never get to see the real
1533        symbol in a hash traversal.  So look at it now.  */
1534     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1535
1536   info = (struct bfd_link_info *) inf;
1537   htab = elf_i386_hash_table (info);
1538
1539   if (htab->elf.dynamic_sections_created
1540       && h->plt.refcount > 0)
1541     {
1542       /* Make sure this symbol is output as a dynamic symbol.
1543          Undefined weak syms won't yet be marked as dynamic.  */
1544       if (h->dynindx == -1
1545           && !h->forced_local)
1546         {
1547           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1548             return FALSE;
1549         }
1550
1551       if (info->shared
1552           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1553         {
1554           asection *s = htab->splt;
1555
1556           /* If this is the first .plt entry, make room for the special
1557              first entry.  */
1558           if (s->size == 0)
1559             s->size += PLT_ENTRY_SIZE;
1560
1561           h->plt.offset = s->size;
1562
1563           /* If this symbol is not defined in a regular file, and we are
1564              not generating a shared library, then set the symbol to this
1565              location in the .plt.  This is required to make function
1566              pointers compare as equal between the normal executable and
1567              the shared library.  */
1568           if (! info->shared
1569               && !h->def_regular)
1570             {
1571               h->root.u.def.section = s;
1572               h->root.u.def.value = h->plt.offset;
1573             }
1574
1575           /* Make room for this entry.  */
1576           s->size += PLT_ENTRY_SIZE;
1577
1578           /* We also need to make an entry in the .got.plt section, which
1579              will be placed in the .got section by the linker script.  */
1580           htab->sgotplt->size += 4;
1581
1582           /* We also need to make an entry in the .rel.plt section.  */
1583           htab->srelplt->size += sizeof (Elf32_External_Rel);
1584
1585           if (htab->is_vxworks && !info->shared)
1586             {
1587               /* VxWorks has a second set of relocations for each PLT entry
1588                  in executables.  They go in a separate relocation section,
1589                  which is processed by the kernel loader.  */
1590
1591               /* There are two relocations for the initial PLT entry: an
1592                  R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
1593                  R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
1594
1595               if (h->plt.offset == PLT_ENTRY_SIZE)
1596                 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1597
1598               /* There are two extra relocations for each subsequent PLT entry:
1599                  an R_386_32 relocation for the GOT entry, and an R_386_32
1600                  relocation for the PLT entry.  */
1601
1602               htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1603             }
1604         }
1605       else
1606         {
1607           h->plt.offset = (bfd_vma) -1;
1608           h->needs_plt = 0;
1609         }
1610     }
1611   else
1612     {
1613       h->plt.offset = (bfd_vma) -1;
1614       h->needs_plt = 0;
1615     }
1616
1617   /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
1618      make it a R_386_TLS_LE_32 requiring no TLS entry.  */
1619   if (h->got.refcount > 0
1620       && !info->shared
1621       && h->dynindx == -1
1622       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
1623     h->got.offset = (bfd_vma) -1;
1624   else if (h->got.refcount > 0)
1625     {
1626       asection *s;
1627       bfd_boolean dyn;
1628       int tls_type = elf_i386_hash_entry(h)->tls_type;
1629
1630       /* Make sure this symbol is output as a dynamic symbol.
1631          Undefined weak syms won't yet be marked as dynamic.  */
1632       if (h->dynindx == -1
1633           && !h->forced_local)
1634         {
1635           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1636             return FALSE;
1637         }
1638
1639       s = htab->sgot;
1640       h->got.offset = s->size;
1641       s->size += 4;
1642       /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
1643       if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE_BOTH)
1644         s->size += 4;
1645       dyn = htab->elf.dynamic_sections_created;
1646       /* R_386_TLS_IE_32 needs one dynamic relocation,
1647          R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
1648          (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
1649          need two), R_386_TLS_GD needs one if local symbol and two if
1650          global.  */
1651       if (tls_type == GOT_TLS_IE_BOTH)
1652         htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
1653       else if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1654                || (tls_type & GOT_TLS_IE))
1655         htab->srelgot->size += sizeof (Elf32_External_Rel);
1656       else if (tls_type == GOT_TLS_GD)
1657         htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
1658       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1659                 || h->root.type != bfd_link_hash_undefweak)
1660                && (info->shared
1661                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1662         htab->srelgot->size += sizeof (Elf32_External_Rel);
1663     }
1664   else
1665     h->got.offset = (bfd_vma) -1;
1666
1667   eh = (struct elf_i386_link_hash_entry *) h;
1668   if (eh->dyn_relocs == NULL)
1669     return TRUE;
1670
1671   /* In the shared -Bsymbolic case, discard space allocated for
1672      dynamic pc-relative relocs against symbols which turn out to be
1673      defined in regular objects.  For the normal shared case, discard
1674      space for pc-relative relocs that have become local due to symbol
1675      visibility changes.  */
1676
1677   if (info->shared)
1678     {
1679       /* The only reloc that uses pc_count is R_386_PC32, which will
1680          appear on a call or on something like ".long foo - .".  We
1681          want calls to protected symbols to resolve directly to the
1682          function rather than going via the plt.  If people want
1683          function pointer comparisons to work as expected then they
1684          should avoid writing assembly like ".long foo - .".  */
1685       if (SYMBOL_CALLS_LOCAL (info, h))
1686         {
1687           struct elf_i386_dyn_relocs **pp;
1688
1689           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1690             {
1691               p->count -= p->pc_count;
1692               p->pc_count = 0;
1693               if (p->count == 0)
1694                 *pp = p->next;
1695               else
1696                 pp = &p->next;
1697             }
1698         }
1699
1700       /* Also discard relocs on undefined weak syms with non-default
1701          visibility.  */
1702       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1703           && h->root.type == bfd_link_hash_undefweak)
1704         eh->dyn_relocs = NULL;
1705     }
1706   else if (ELIMINATE_COPY_RELOCS)
1707     {
1708       /* For the non-shared case, discard space for relocs against
1709          symbols which turn out to need copy relocs or are not
1710          dynamic.  */
1711
1712       if (!h->non_got_ref
1713           && ((h->def_dynamic
1714                && !h->def_regular)
1715               || (htab->elf.dynamic_sections_created
1716                   && (h->root.type == bfd_link_hash_undefweak
1717                       || h->root.type == bfd_link_hash_undefined))))
1718         {
1719           /* Make sure this symbol is output as a dynamic symbol.
1720              Undefined weak syms won't yet be marked as dynamic.  */
1721           if (h->dynindx == -1
1722               && !h->forced_local)
1723             {
1724               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1725                 return FALSE;
1726             }
1727
1728           /* If that succeeded, we know we'll be keeping all the
1729              relocs.  */
1730           if (h->dynindx != -1)
1731             goto keep;
1732         }
1733
1734       eh->dyn_relocs = NULL;
1735
1736     keep: ;
1737     }
1738
1739   /* Finally, allocate space.  */
1740   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1741     {
1742       asection *sreloc = elf_section_data (p->sec)->sreloc;
1743       sreloc->size += p->count * sizeof (Elf32_External_Rel);
1744     }
1745
1746   return TRUE;
1747 }
1748
1749 /* Find any dynamic relocs that apply to read-only sections.  */
1750
1751 static bfd_boolean
1752 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1753 {
1754   struct elf_i386_link_hash_entry *eh;
1755   struct elf_i386_dyn_relocs *p;
1756
1757   if (h->root.type == bfd_link_hash_warning)
1758     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1759
1760   eh = (struct elf_i386_link_hash_entry *) h;
1761   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1762     {
1763       asection *s = p->sec->output_section;
1764
1765       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1766         {
1767           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1768
1769           info->flags |= DF_TEXTREL;
1770
1771           /* Not an error, just cut short the traversal.  */
1772           return FALSE;
1773         }
1774     }
1775   return TRUE;
1776 }
1777
1778 /* Set the sizes of the dynamic sections.  */
1779
1780 static bfd_boolean
1781 elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1782                                 struct bfd_link_info *info)
1783 {
1784   struct elf_i386_link_hash_table *htab;
1785   bfd *dynobj;
1786   asection *s;
1787   bfd_boolean relocs;
1788   bfd *ibfd;
1789
1790   htab = elf_i386_hash_table (info);
1791   dynobj = htab->elf.dynobj;
1792   if (dynobj == NULL)
1793     abort ();
1794
1795   if (htab->elf.dynamic_sections_created)
1796     {
1797       /* Set the contents of the .interp section to the interpreter.  */
1798       if (info->executable)
1799         {
1800           s = bfd_get_section_by_name (dynobj, ".interp");
1801           if (s == NULL)
1802             abort ();
1803           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1804           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1805         }
1806     }
1807
1808   /* Set up .got offsets for local syms, and space for local dynamic
1809      relocs.  */
1810   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1811     {
1812       bfd_signed_vma *local_got;
1813       bfd_signed_vma *end_local_got;
1814       char *local_tls_type;
1815       bfd_size_type locsymcount;
1816       Elf_Internal_Shdr *symtab_hdr;
1817       asection *srel;
1818
1819       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1820         continue;
1821
1822       for (s = ibfd->sections; s != NULL; s = s->next)
1823         {
1824           struct elf_i386_dyn_relocs *p;
1825
1826           for (p = *((struct elf_i386_dyn_relocs **)
1827                      &elf_section_data (s)->local_dynrel);
1828                p != NULL;
1829                p = p->next)
1830             {
1831               if (!bfd_is_abs_section (p->sec)
1832                   && bfd_is_abs_section (p->sec->output_section))
1833                 {
1834                   /* Input section has been discarded, either because
1835                      it is a copy of a linkonce section or due to
1836                      linker script /DISCARD/, so we'll be discarding
1837                      the relocs too.  */
1838                 }
1839               else if (p->count != 0)
1840                 {
1841                   srel = elf_section_data (p->sec)->sreloc;
1842                   srel->size += p->count * sizeof (Elf32_External_Rel);
1843                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1844                     info->flags |= DF_TEXTREL;
1845                 }
1846             }
1847         }
1848
1849       local_got = elf_local_got_refcounts (ibfd);
1850       if (!local_got)
1851         continue;
1852
1853       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1854       locsymcount = symtab_hdr->sh_info;
1855       end_local_got = local_got + locsymcount;
1856       local_tls_type = elf_i386_local_got_tls_type (ibfd);
1857       s = htab->sgot;
1858       srel = htab->srelgot;
1859       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1860         {
1861           if (*local_got > 0)
1862             {
1863               *local_got = s->size;
1864               s->size += 4;
1865               if (*local_tls_type == GOT_TLS_GD
1866                   || *local_tls_type == GOT_TLS_IE_BOTH)
1867                 s->size += 4;
1868               if (info->shared
1869                   || *local_tls_type == GOT_TLS_GD
1870                   || (*local_tls_type & GOT_TLS_IE))
1871                 {
1872                   if (*local_tls_type == GOT_TLS_IE_BOTH)
1873                     srel->size += 2 * sizeof (Elf32_External_Rel);
1874                   else
1875                     srel->size += sizeof (Elf32_External_Rel);
1876                 }
1877             }
1878           else
1879             *local_got = (bfd_vma) -1;
1880         }
1881     }
1882
1883   if (htab->tls_ldm_got.refcount > 0)
1884     {
1885       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
1886          relocs.  */
1887       htab->tls_ldm_got.offset = htab->sgot->size;
1888       htab->sgot->size += 8;
1889       htab->srelgot->size += sizeof (Elf32_External_Rel);
1890     }
1891   else
1892     htab->tls_ldm_got.offset = -1;
1893
1894   if (htab->is_vxworks)
1895     {
1896       /* Save the GOT and PLT symbols in the hash table for easy access.
1897          Mark them as having relocations; they might not, but we won't
1898          know for sure until we build the GOT in finish_dynamic_symbol.  */
1899
1900       htab->hgot = elf_link_hash_lookup (elf_hash_table (info),
1901                                         "_GLOBAL_OFFSET_TABLE_",
1902                                         FALSE, FALSE, FALSE);
1903       if (htab->hgot)
1904         htab->hgot->indx = -2;
1905       htab->hplt = elf_link_hash_lookup (elf_hash_table (info),
1906                                         "_PROCEDURE_LINKAGE_TABLE_",
1907                                         FALSE, FALSE, FALSE);
1908       if (htab->hplt)
1909         htab->hplt->indx = -2;
1910
1911       if (htab->is_vxworks && htab->hplt && htab->splt->flags & SEC_CODE)
1912         htab->hplt->type = STT_FUNC;
1913     }
1914
1915   /* Allocate global sym .plt and .got entries, and space for global
1916      sym dynamic relocs.  */
1917   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1918
1919   /* We now have determined the sizes of the various dynamic sections.
1920      Allocate memory for them.  */
1921   relocs = FALSE;
1922   for (s = dynobj->sections; s != NULL; s = s->next)
1923     {
1924       bfd_boolean strip_section = TRUE;
1925
1926       if ((s->flags & SEC_LINKER_CREATED) == 0)
1927         continue;
1928
1929       if (s == htab->splt
1930           || s == htab->sgot
1931           || s == htab->sgotplt
1932           || s == htab->sdynbss)
1933         {
1934           /* Strip this section if we don't need it; see the
1935              comment below.  */
1936           /* We'd like to strip these sections if they aren't needed, but if
1937              we've exported dynamic symbols from them we must leave them.
1938              It's too late to tell BFD to get rid of the symbols.  */
1939
1940           if (htab->hplt != NULL)
1941             strip_section = FALSE;
1942         }
1943       else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1944         {
1945           if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
1946             relocs = TRUE;
1947
1948           /* We use the reloc_count field as a counter if we need
1949              to copy relocs into the output file.  */
1950           s->reloc_count = 0;
1951         }
1952       else
1953         {
1954           /* It's not one of our sections, so don't allocate space.  */
1955           continue;
1956         }
1957
1958       if (s->size == 0)
1959         {
1960           /* If we don't need this section, strip it from the
1961              output file.  This is mostly to handle .rel.bss and
1962              .rel.plt.  We must create both sections in
1963              create_dynamic_sections, because they must be created
1964              before the linker maps input sections to output
1965              sections.  The linker does that before
1966              adjust_dynamic_symbol is called, and it is that
1967              function which decides whether anything needs to go
1968              into these sections.  */
1969           if (strip_section)
1970             s->flags |= SEC_EXCLUDE;
1971           continue;
1972         }
1973
1974       if ((s->flags & SEC_HAS_CONTENTS) == 0)
1975         continue;
1976
1977       /* Allocate memory for the section contents.  We use bfd_zalloc
1978          here in case unused entries are not reclaimed before the
1979          section's contents are written out.  This should not happen,
1980          but this way if it does, we get a R_386_NONE reloc instead
1981          of garbage.  */
1982       s->contents = bfd_zalloc (dynobj, s->size);
1983       if (s->contents == NULL)
1984         return FALSE;
1985     }
1986
1987   if (htab->elf.dynamic_sections_created)
1988     {
1989       /* Add some entries to the .dynamic section.  We fill in the
1990          values later, in elf_i386_finish_dynamic_sections, but we
1991          must add the entries now so that we get the correct size for
1992          the .dynamic section.  The DT_DEBUG entry is filled in by the
1993          dynamic linker and used by the debugger.  */
1994 #define add_dynamic_entry(TAG, VAL) \
1995   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1996
1997       if (info->executable)
1998         {
1999           if (!add_dynamic_entry (DT_DEBUG, 0))
2000             return FALSE;
2001         }
2002
2003       if (htab->splt->size != 0)
2004         {
2005           if (!add_dynamic_entry (DT_PLTGOT, 0)
2006               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2007               || !add_dynamic_entry (DT_PLTREL, DT_REL)
2008               || !add_dynamic_entry (DT_JMPREL, 0))
2009             return FALSE;
2010         }
2011
2012       if (relocs)
2013         {
2014           if (!add_dynamic_entry (DT_REL, 0)
2015               || !add_dynamic_entry (DT_RELSZ, 0)
2016               || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
2017             return FALSE;
2018
2019           /* If any dynamic relocs apply to a read-only section,
2020              then we need a DT_TEXTREL entry.  */
2021           if ((info->flags & DF_TEXTREL) == 0)
2022             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2023                                     (PTR) info);
2024
2025           if ((info->flags & DF_TEXTREL) != 0)
2026             {
2027               if (!add_dynamic_entry (DT_TEXTREL, 0))
2028                 return FALSE;
2029             }
2030         }
2031     }
2032 #undef add_dynamic_entry
2033
2034   return TRUE;
2035 }
2036
2037 /* Set the correct type for an x86 ELF section.  We do this by the
2038    section name, which is a hack, but ought to work.  */
2039
2040 static bfd_boolean
2041 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2042                         Elf_Internal_Shdr *hdr,
2043                         asection *sec)
2044 {
2045   register const char *name;
2046
2047   name = bfd_get_section_name (abfd, sec);
2048
2049   /* This is an ugly, but unfortunately necessary hack that is
2050      needed when producing EFI binaries on x86. It tells
2051      elf.c:elf_fake_sections() not to consider ".reloc" as a section
2052      containing ELF relocation info.  We need this hack in order to
2053      be able to generate ELF binaries that can be translated into
2054      EFI applications (which are essentially COFF objects).  Those
2055      files contain a COFF ".reloc" section inside an ELFNN object,
2056      which would normally cause BFD to segfault because it would
2057      attempt to interpret this section as containing relocation
2058      entries for section "oc".  With this hack enabled, ".reloc"
2059      will be treated as a normal data section, which will avoid the
2060      segfault.  However, you won't be able to create an ELFNN binary
2061      with a section named "oc" that needs relocations, but that's
2062      the kind of ugly side-effects you get when detecting section
2063      types based on their names...  In practice, this limitation is
2064      unlikely to bite.  */
2065   if (strcmp (name, ".reloc") == 0)
2066     hdr->sh_type = SHT_PROGBITS;
2067
2068   return TRUE;
2069 }
2070
2071 /* Return the base VMA address which should be subtracted from real addresses
2072    when resolving @dtpoff relocation.
2073    This is PT_TLS segment p_vaddr.  */
2074
2075 static bfd_vma
2076 dtpoff_base (struct bfd_link_info *info)
2077 {
2078   /* If tls_sec is NULL, we should have signalled an error already.  */
2079   if (elf_hash_table (info)->tls_sec == NULL)
2080     return 0;
2081   return elf_hash_table (info)->tls_sec->vma;
2082 }
2083
2084 /* Return the relocation value for @tpoff relocation
2085    if STT_TLS virtual address is ADDRESS.  */
2086
2087 static bfd_vma
2088 tpoff (struct bfd_link_info *info, bfd_vma address)
2089 {
2090   struct elf_link_hash_table *htab = elf_hash_table (info);
2091
2092   /* If tls_sec is NULL, we should have signalled an error already.  */
2093   if (htab->tls_sec == NULL)
2094     return 0;
2095   return htab->tls_size + htab->tls_sec->vma - address;
2096 }
2097
2098 /* Relocate an i386 ELF section.  */
2099
2100 static bfd_boolean
2101 elf_i386_relocate_section (bfd *output_bfd,
2102                            struct bfd_link_info *info,
2103                            bfd *input_bfd,
2104                            asection *input_section,
2105                            bfd_byte *contents,
2106                            Elf_Internal_Rela *relocs,
2107                            Elf_Internal_Sym *local_syms,
2108                            asection **local_sections)
2109 {
2110   struct elf_i386_link_hash_table *htab;
2111   Elf_Internal_Shdr *symtab_hdr;
2112   struct elf_link_hash_entry **sym_hashes;
2113   bfd_vma *local_got_offsets;
2114   Elf_Internal_Rela *rel;
2115   Elf_Internal_Rela *relend;
2116
2117   htab = elf_i386_hash_table (info);
2118   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2119   sym_hashes = elf_sym_hashes (input_bfd);
2120   local_got_offsets = elf_local_got_offsets (input_bfd);
2121
2122   rel = relocs;
2123   relend = relocs + input_section->reloc_count;
2124   for (; rel < relend; rel++)
2125     {
2126       unsigned int r_type;
2127       reloc_howto_type *howto;
2128       unsigned long r_symndx;
2129       struct elf_link_hash_entry *h;
2130       Elf_Internal_Sym *sym;
2131       asection *sec;
2132       bfd_vma off;
2133       bfd_vma relocation;
2134       bfd_boolean unresolved_reloc;
2135       bfd_reloc_status_type r;
2136       unsigned int indx;
2137       int tls_type;
2138
2139       r_type = ELF32_R_TYPE (rel->r_info);
2140       if (r_type == R_386_GNU_VTINHERIT
2141           || r_type == R_386_GNU_VTENTRY)
2142         continue;
2143
2144       if ((indx = r_type) >= R_386_standard
2145           && ((indx = r_type - R_386_ext_offset) - R_386_standard
2146               >= R_386_ext - R_386_standard)
2147           && ((indx = r_type - R_386_tls_offset) - R_386_ext
2148               >= R_386_tls - R_386_ext))
2149         {
2150           (*_bfd_error_handler)
2151             (_("%B: unrecognized relocation (0x%x) in section `%A'"),
2152              input_bfd, input_section, r_type);
2153           bfd_set_error (bfd_error_bad_value);
2154           return FALSE;
2155         }
2156       howto = elf_howto_table + indx;
2157
2158       r_symndx = ELF32_R_SYM (rel->r_info);
2159
2160       if (info->relocatable)
2161         {
2162           bfd_vma val;
2163           bfd_byte *where;
2164
2165           /* This is a relocatable link.  We don't have to change
2166              anything, unless the reloc is against a section symbol,
2167              in which case we have to adjust according to where the
2168              section symbol winds up in the output section.  */
2169           if (r_symndx >= symtab_hdr->sh_info)
2170             continue;
2171
2172           sym = local_syms + r_symndx;
2173           if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2174             continue;
2175
2176           sec = local_sections[r_symndx];
2177           val = sec->output_offset;
2178           if (val == 0)
2179             continue;
2180
2181           where = contents + rel->r_offset;
2182           switch (howto->size)
2183             {
2184               /* FIXME: overflow checks.  */
2185             case 0:
2186               val += bfd_get_8 (input_bfd, where);
2187               bfd_put_8 (input_bfd, val, where);
2188               break;
2189             case 1:
2190               val += bfd_get_16 (input_bfd, where);
2191               bfd_put_16 (input_bfd, val, where);
2192               break;
2193             case 2:
2194               val += bfd_get_32 (input_bfd, where);
2195               bfd_put_32 (input_bfd, val, where);
2196               break;
2197             default:
2198               abort ();
2199             }
2200           continue;
2201         }
2202
2203       /* This is a final link.  */
2204       h = NULL;
2205       sym = NULL;
2206       sec = NULL;
2207       unresolved_reloc = FALSE;
2208       if (r_symndx < symtab_hdr->sh_info)
2209         {
2210           sym = local_syms + r_symndx;
2211           sec = local_sections[r_symndx];
2212           relocation = (sec->output_section->vma
2213                         + sec->output_offset
2214                         + sym->st_value);
2215           if ((sec->flags & SEC_MERGE)
2216               && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2217             {
2218               asection *msec;
2219               bfd_vma addend;
2220               bfd_byte *where = contents + rel->r_offset;
2221
2222               switch (howto->size)
2223                 {
2224                 case 0:
2225                   addend = bfd_get_8 (input_bfd, where);
2226                   if (howto->pc_relative)
2227                     {
2228                       addend = (addend ^ 0x80) - 0x80;
2229                       addend += 1;
2230                     }
2231                   break;
2232                 case 1:
2233                   addend = bfd_get_16 (input_bfd, where);
2234                   if (howto->pc_relative)
2235                     {
2236                       addend = (addend ^ 0x8000) - 0x8000;
2237                       addend += 2;
2238                     }
2239                   break;
2240                 case 2:
2241                   addend = bfd_get_32 (input_bfd, where);
2242                   if (howto->pc_relative)
2243                     {
2244                       addend = (addend ^ 0x80000000) - 0x80000000;
2245                       addend += 4;
2246                     }
2247                   break;
2248                 default:
2249                   abort ();
2250                 }
2251
2252               msec = sec;
2253               addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend);
2254               addend -= relocation;
2255               addend += msec->output_section->vma + msec->output_offset;
2256
2257               switch (howto->size)
2258                 {
2259                 case 0:
2260                   /* FIXME: overflow checks.  */
2261                   if (howto->pc_relative)
2262                     addend -= 1;
2263                   bfd_put_8 (input_bfd, addend, where);
2264                   break;
2265                 case 1:
2266                   if (howto->pc_relative)
2267                     addend -= 2;
2268                   bfd_put_16 (input_bfd, addend, where);
2269                   break;
2270                 case 2:
2271                   if (howto->pc_relative)
2272                     addend -= 4;
2273                   bfd_put_32 (input_bfd, addend, where);
2274                   break;
2275                 }
2276             }
2277         }
2278       else
2279         {
2280           bfd_boolean warned;
2281
2282           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2283                                    r_symndx, symtab_hdr, sym_hashes,
2284                                    h, sec, relocation,
2285                                    unresolved_reloc, warned);
2286         }
2287
2288       if (r_symndx == 0)
2289         {
2290         /* r_symndx will be zero only for relocs against symbols from
2291            removed linkonce sections, or sections discarded by a linker
2292            script.  For these relocs, we just want the section contents
2293            zeroed.  Avoid any special processing in the switch below.  */
2294           r_type = R_386_NONE;
2295
2296           relocation = 0;
2297           if (howto->pc_relative)
2298             relocation = (input_section->output_section->vma
2299                           + input_section->output_offset
2300                           + rel->r_offset);
2301         }
2302
2303       switch (r_type)
2304         {
2305         case R_386_GOT32:
2306           /* Relocation is to the entry for this symbol in the global
2307              offset table.  */
2308           if (htab->sgot == NULL)
2309             abort ();
2310
2311           if (h != NULL)
2312             {
2313               bfd_boolean dyn;
2314
2315               off = h->got.offset;
2316               dyn = htab->elf.dynamic_sections_created;
2317               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2318                   || (info->shared
2319                       && SYMBOL_REFERENCES_LOCAL (info, h))
2320                   || (ELF_ST_VISIBILITY (h->other)
2321                       && h->root.type == bfd_link_hash_undefweak))
2322                 {
2323                   /* This is actually a static link, or it is a
2324                      -Bsymbolic link and the symbol is defined
2325                      locally, or the symbol was forced to be local
2326                      because of a version file.  We must initialize
2327                      this entry in the global offset table.  Since the
2328                      offset must always be a multiple of 4, we use the
2329                      least significant bit to record whether we have
2330                      initialized it already.
2331
2332                      When doing a dynamic link, we create a .rel.got
2333                      relocation entry to initialize the value.  This
2334                      is done in the finish_dynamic_symbol routine.  */
2335                   if ((off & 1) != 0)
2336                     off &= ~1;
2337                   else
2338                     {
2339                       bfd_put_32 (output_bfd, relocation,
2340                                   htab->sgot->contents + off);
2341                       h->got.offset |= 1;
2342                     }
2343                 }
2344               else
2345                 unresolved_reloc = FALSE;
2346             }
2347           else
2348             {
2349               if (local_got_offsets == NULL)
2350                 abort ();
2351
2352               off = local_got_offsets[r_symndx];
2353
2354               /* The offset must always be a multiple of 4.  We use
2355                  the least significant bit to record whether we have
2356                  already generated the necessary reloc.  */
2357               if ((off & 1) != 0)
2358                 off &= ~1;
2359               else
2360                 {
2361                   bfd_put_32 (output_bfd, relocation,
2362                               htab->sgot->contents + off);
2363
2364                   if (info->shared)
2365                     {
2366                       asection *s;
2367                       Elf_Internal_Rela outrel;
2368                       bfd_byte *loc;
2369
2370                       s = htab->srelgot;
2371                       if (s == NULL)
2372                         abort ();
2373
2374                       outrel.r_offset = (htab->sgot->output_section->vma
2375                                          + htab->sgot->output_offset
2376                                          + off);
2377                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2378                       loc = s->contents;
2379                       loc += s->reloc_count++ * sizeof (Elf32_External_Rel);
2380                       bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2381                     }
2382
2383                   local_got_offsets[r_symndx] |= 1;
2384                 }
2385             }
2386
2387           if (off >= (bfd_vma) -2)
2388             abort ();
2389
2390           relocation = htab->sgot->output_section->vma
2391                        + htab->sgot->output_offset + off
2392                        - htab->sgotplt->output_section->vma
2393                        - htab->sgotplt->output_offset;
2394           break;
2395
2396         case R_386_GOTOFF:
2397           /* Relocation is relative to the start of the global offset
2398              table.  */
2399
2400           /* Check to make sure it isn't a protected function symbol
2401              for shared library since it may not be local when used
2402              as function address.  */
2403           if (info->shared
2404               && !info->executable
2405               && h
2406               && h->def_regular
2407               && h->type == STT_FUNC
2408               && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2409             {
2410               (*_bfd_error_handler)
2411                 (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
2412                  input_bfd, h->root.root.string);
2413               bfd_set_error (bfd_error_bad_value);
2414               return FALSE;
2415             }
2416
2417           /* Note that sgot is not involved in this
2418              calculation.  We always want the start of .got.plt.  If we
2419              defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2420              permitted by the ABI, we might have to change this
2421              calculation.  */
2422           relocation -= htab->sgotplt->output_section->vma
2423                         + htab->sgotplt->output_offset;
2424           break;
2425
2426         case R_386_GOTPC:
2427           /* Use global offset table as symbol value.  */
2428           relocation = htab->sgotplt->output_section->vma
2429                        + htab->sgotplt->output_offset;
2430           unresolved_reloc = FALSE;
2431           break;
2432
2433         case R_386_PLT32:
2434           /* Relocation is to the entry for this symbol in the
2435              procedure linkage table.  */
2436
2437           /* Resolve a PLT32 reloc against a local symbol directly,
2438              without using the procedure linkage table.  */
2439           if (h == NULL)
2440             break;
2441
2442           if (h->plt.offset == (bfd_vma) -1
2443               || htab->splt == NULL)
2444             {
2445               /* We didn't make a PLT entry for this symbol.  This
2446                  happens when statically linking PIC code, or when
2447                  using -Bsymbolic.  */
2448               break;
2449             }
2450
2451           relocation = (htab->splt->output_section->vma
2452                         + htab->splt->output_offset
2453                         + h->plt.offset);
2454           unresolved_reloc = FALSE;
2455           break;
2456
2457         case R_386_32:
2458         case R_386_PC32:
2459           if ((input_section->flags & SEC_ALLOC) == 0)
2460             break;
2461
2462           if ((info->shared
2463                && (h == NULL
2464                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2465                    || h->root.type != bfd_link_hash_undefweak)
2466                && (r_type != R_386_PC32
2467                    || !SYMBOL_CALLS_LOCAL (info, h)))
2468               || (ELIMINATE_COPY_RELOCS
2469                   && !info->shared
2470                   && h != NULL
2471                   && h->dynindx != -1
2472                   && !h->non_got_ref
2473                   && ((h->def_dynamic
2474                        && !h->def_regular)
2475                       || h->root.type == bfd_link_hash_undefweak
2476                       || h->root.type == bfd_link_hash_undefined)))
2477             {
2478               Elf_Internal_Rela outrel;
2479               bfd_byte *loc;
2480               bfd_boolean skip, relocate;
2481               asection *sreloc;
2482
2483               /* When generating a shared object, these relocations
2484                  are copied into the output file to be resolved at run
2485                  time.  */
2486
2487               skip = FALSE;
2488               relocate = FALSE;
2489
2490               outrel.r_offset =
2491                 _bfd_elf_section_offset (output_bfd, info, input_section,
2492                                          rel->r_offset);
2493               if (outrel.r_offset == (bfd_vma) -1)
2494                 skip = TRUE;
2495               else if (outrel.r_offset == (bfd_vma) -2)
2496                 skip = TRUE, relocate = TRUE;
2497               outrel.r_offset += (input_section->output_section->vma
2498                                   + input_section->output_offset);
2499
2500               if (skip)
2501                 memset (&outrel, 0, sizeof outrel);
2502               else if (h != NULL
2503                        && h->dynindx != -1
2504                        && (r_type == R_386_PC32
2505                            || !info->shared
2506                            || !info->symbolic
2507                            || !h->def_regular))
2508                 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2509               else
2510                 {
2511                   /* This symbol is local, or marked to become local.  */
2512                   relocate = TRUE;
2513                   outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2514                 }
2515
2516               sreloc = elf_section_data (input_section)->sreloc;
2517               if (sreloc == NULL)
2518                 abort ();
2519
2520               loc = sreloc->contents;
2521               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
2522               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2523
2524               /* If this reloc is against an external symbol, we do
2525                  not want to fiddle with the addend.  Otherwise, we
2526                  need to include the symbol value so that it becomes
2527                  an addend for the dynamic reloc.  */
2528               if (! relocate)
2529                 continue;
2530             }
2531           break;
2532
2533         case R_386_TLS_IE:
2534           if (info->shared)
2535             {
2536               Elf_Internal_Rela outrel;
2537               bfd_byte *loc;
2538               asection *sreloc;
2539
2540               outrel.r_offset = rel->r_offset
2541                                 + input_section->output_section->vma
2542                                 + input_section->output_offset;
2543               outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2544               sreloc = elf_section_data (input_section)->sreloc;
2545               if (sreloc == NULL)
2546                 abort ();
2547               loc = sreloc->contents;
2548               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
2549               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2550             }
2551           /* Fall through */
2552
2553         case R_386_TLS_GD:
2554         case R_386_TLS_IE_32:
2555         case R_386_TLS_GOTIE:
2556           r_type = elf_i386_tls_transition (info, r_type, h == NULL);
2557           tls_type = GOT_UNKNOWN;
2558           if (h == NULL && local_got_offsets)
2559             tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
2560           else if (h != NULL)
2561             {
2562               tls_type = elf_i386_hash_entry(h)->tls_type;
2563               if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE))
2564                 r_type = R_386_TLS_LE_32;
2565             }
2566           if (tls_type == GOT_TLS_IE)
2567             tls_type = GOT_TLS_IE_NEG;
2568           if (r_type == R_386_TLS_GD)
2569             {
2570               if (tls_type == GOT_TLS_IE_POS)
2571                 r_type = R_386_TLS_GOTIE;
2572               else if (tls_type & GOT_TLS_IE)
2573                 r_type = R_386_TLS_IE_32;
2574             }
2575
2576           if (r_type == R_386_TLS_LE_32)
2577             {
2578               BFD_ASSERT (! unresolved_reloc);
2579               if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
2580                 {
2581                   unsigned int val, type;
2582                   bfd_vma roff;
2583
2584                   /* GD->LE transition.  */
2585                   BFD_ASSERT (rel->r_offset >= 2);
2586                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2587                   BFD_ASSERT (type == 0x8d || type == 0x04);
2588                   BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2589                   BFD_ASSERT (bfd_get_8 (input_bfd,
2590                                          contents + rel->r_offset + 4)
2591                               == 0xe8);
2592                   BFD_ASSERT (rel + 1 < relend);
2593                   BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2594                   roff = rel->r_offset + 5;
2595                   val = bfd_get_8 (input_bfd,
2596                                    contents + rel->r_offset - 1);
2597                   if (type == 0x04)
2598                     {
2599                       /* leal foo(,%reg,1), %eax; call ___tls_get_addr
2600                          Change it into:
2601                          movl %gs:0, %eax; subl $foo@tpoff, %eax
2602                          (6 byte form of subl).  */
2603                       BFD_ASSERT (rel->r_offset >= 3);
2604                       BFD_ASSERT (bfd_get_8 (input_bfd,
2605                                              contents + rel->r_offset - 3)
2606                                   == 0x8d);
2607                       BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
2608                       memcpy (contents + rel->r_offset - 3,
2609                               "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2610                     }
2611                   else
2612                     {
2613                       BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2614                       if (rel->r_offset + 10 <= input_section->size
2615                           && bfd_get_8 (input_bfd,
2616                                         contents + rel->r_offset + 9) == 0x90)
2617                         {
2618                           /* leal foo(%reg), %eax; call ___tls_get_addr; nop
2619                              Change it into:
2620                              movl %gs:0, %eax; subl $foo@tpoff, %eax
2621                              (6 byte form of subl).  */
2622                           memcpy (contents + rel->r_offset - 2,
2623                                   "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2624                           roff = rel->r_offset + 6;
2625                         }
2626                       else
2627                         {
2628                           /* leal foo(%reg), %eax; call ___tls_get_addr
2629                              Change it into:
2630                              movl %gs:0, %eax; subl $foo@tpoff, %eax
2631                              (5 byte form of subl).  */
2632                           memcpy (contents + rel->r_offset - 2,
2633                                   "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
2634                         }
2635                     }
2636                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2637                               contents + roff);
2638                   /* Skip R_386_PLT32.  */
2639                   rel++;
2640                   continue;
2641                 }
2642               else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
2643                 {
2644                   unsigned int val, type;
2645
2646                   /* IE->LE transition:
2647                      Originally it can be one of:
2648                      movl foo, %eax
2649                      movl foo, %reg
2650                      addl foo, %reg
2651                      We change it into:
2652                      movl $foo, %eax
2653                      movl $foo, %reg
2654                      addl $foo, %reg.  */
2655                   BFD_ASSERT (rel->r_offset >= 1);
2656                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2657                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2658                   if (val == 0xa1)
2659                     {
2660                       /* movl foo, %eax.  */
2661                       bfd_put_8 (output_bfd, 0xb8,
2662                                  contents + rel->r_offset - 1);
2663                     }
2664                   else
2665                     {
2666                       BFD_ASSERT (rel->r_offset >= 2);
2667                       type = bfd_get_8 (input_bfd,
2668                                         contents + rel->r_offset - 2);
2669                       switch (type)
2670                         {
2671                         case 0x8b:
2672                           /* movl */
2673                           BFD_ASSERT ((val & 0xc7) == 0x05);
2674                           bfd_put_8 (output_bfd, 0xc7,
2675                                      contents + rel->r_offset - 2);
2676                           bfd_put_8 (output_bfd,
2677                                      0xc0 | ((val >> 3) & 7),
2678                                      contents + rel->r_offset - 1);
2679                           break;
2680                         case 0x03:
2681                           /* addl */
2682                           BFD_ASSERT ((val & 0xc7) == 0x05);
2683                           bfd_put_8 (output_bfd, 0x81,
2684                                      contents + rel->r_offset - 2);
2685                           bfd_put_8 (output_bfd,
2686                                      0xc0 | ((val >> 3) & 7),
2687                                      contents + rel->r_offset - 1);
2688                           break;
2689                         default:
2690                           BFD_FAIL ();
2691                           break;
2692                         }
2693                     }
2694                   bfd_put_32 (output_bfd, -tpoff (info, relocation),
2695                               contents + rel->r_offset);
2696                   continue;
2697                 }
2698               else
2699                 {
2700                   unsigned int val, type;
2701
2702                   /* {IE_32,GOTIE}->LE transition:
2703                      Originally it can be one of:
2704                      subl foo(%reg1), %reg2
2705                      movl foo(%reg1), %reg2
2706                      addl foo(%reg1), %reg2
2707                      We change it into:
2708                      subl $foo, %reg2
2709                      movl $foo, %reg2 (6 byte form)
2710                      addl $foo, %reg2.  */
2711                   BFD_ASSERT (rel->r_offset >= 2);
2712                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2713                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2714                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2715                   BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4);
2716                   if (type == 0x8b)
2717                     {
2718                       /* movl */
2719                       bfd_put_8 (output_bfd, 0xc7,
2720                                  contents + rel->r_offset - 2);
2721                       bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2722                                  contents + rel->r_offset - 1);
2723                     }
2724                   else if (type == 0x2b)
2725                     {
2726                       /* subl */
2727                       bfd_put_8 (output_bfd, 0x81,
2728                                  contents + rel->r_offset - 2);
2729                       bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
2730                                  contents + rel->r_offset - 1);
2731                     }
2732                   else if (type == 0x03)
2733                     {
2734                       /* addl */
2735                       bfd_put_8 (output_bfd, 0x81,
2736                                  contents + rel->r_offset - 2);
2737                       bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2738                                  contents + rel->r_offset - 1);
2739                     }
2740                   else
2741                     BFD_FAIL ();
2742                   if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
2743                     bfd_put_32 (output_bfd, -tpoff (info, relocation),
2744                                 contents + rel->r_offset);
2745                   else
2746                     bfd_put_32 (output_bfd, tpoff (info, relocation),
2747                                 contents + rel->r_offset);
2748                   continue;
2749                 }
2750             }
2751
2752           if (htab->sgot == NULL)
2753             abort ();
2754
2755           if (h != NULL)
2756             off = h->got.offset;
2757           else
2758             {
2759               if (local_got_offsets == NULL)
2760                 abort ();
2761
2762               off = local_got_offsets[r_symndx];
2763             }
2764
2765           if ((off & 1) != 0)
2766             off &= ~1;
2767           else
2768             {
2769               Elf_Internal_Rela outrel;
2770               bfd_byte *loc;
2771               int dr_type, indx;
2772
2773               if (htab->srelgot == NULL)
2774                 abort ();
2775
2776               outrel.r_offset = (htab->sgot->output_section->vma
2777                                  + htab->sgot->output_offset + off);
2778
2779               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2780               if (r_type == R_386_TLS_GD)
2781                 dr_type = R_386_TLS_DTPMOD32;
2782               else if (tls_type == GOT_TLS_IE_POS)
2783                 dr_type = R_386_TLS_TPOFF;
2784               else
2785                 dr_type = R_386_TLS_TPOFF32;
2786               if (dr_type == R_386_TLS_TPOFF && indx == 0)
2787                 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
2788                             htab->sgot->contents + off);
2789               else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
2790                 bfd_put_32 (output_bfd, dtpoff_base (info) - relocation,
2791                             htab->sgot->contents + off);
2792               else
2793                 bfd_put_32 (output_bfd, 0,
2794                             htab->sgot->contents + off);
2795               outrel.r_info = ELF32_R_INFO (indx, dr_type);
2796               loc = htab->srelgot->contents;
2797               loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
2798               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2799
2800               if (r_type == R_386_TLS_GD)
2801                 {
2802                   if (indx == 0)
2803                     {
2804                       BFD_ASSERT (! unresolved_reloc);
2805                       bfd_put_32 (output_bfd,
2806                                   relocation - dtpoff_base (info),
2807                                   htab->sgot->contents + off + 4);
2808                     }
2809                   else
2810                     {
2811                       bfd_put_32 (output_bfd, 0,
2812                                   htab->sgot->contents + off + 4);
2813                       outrel.r_info = ELF32_R_INFO (indx,
2814                                                     R_386_TLS_DTPOFF32);
2815                       outrel.r_offset += 4;
2816                       htab->srelgot->reloc_count++;
2817                       loc += sizeof (Elf32_External_Rel);
2818                       bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2819                     }
2820                 }
2821               else if (tls_type == GOT_TLS_IE_BOTH)
2822                 {
2823                   bfd_put_32 (output_bfd,
2824                               indx == 0 ? relocation - dtpoff_base (info) : 0,
2825                               htab->sgot->contents + off + 4);
2826                   outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
2827                   outrel.r_offset += 4;
2828                   htab->srelgot->reloc_count++;
2829                   loc += sizeof (Elf32_External_Rel);
2830                   bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2831                 }
2832
2833               if (h != NULL)
2834                 h->got.offset |= 1;
2835               else
2836                 local_got_offsets[r_symndx] |= 1;
2837             }
2838
2839           if (off >= (bfd_vma) -2)
2840             abort ();
2841           if (r_type == ELF32_R_TYPE (rel->r_info))
2842             {
2843               bfd_vma g_o_t = htab->sgotplt->output_section->vma
2844                               + htab->sgotplt->output_offset;
2845               relocation = htab->sgot->output_section->vma
2846                            + htab->sgot->output_offset + off - g_o_t;
2847               if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
2848                   && tls_type == GOT_TLS_IE_BOTH)
2849                 relocation += 4;
2850               if (r_type == R_386_TLS_IE)
2851                 relocation += g_o_t;
2852               unresolved_reloc = FALSE;
2853             }
2854           else
2855             {
2856               unsigned int val, type;
2857               bfd_vma roff;
2858
2859               /* GD->IE transition.  */
2860               BFD_ASSERT (rel->r_offset >= 2);
2861               type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2862               BFD_ASSERT (type == 0x8d || type == 0x04);
2863               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2864               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2865                           == 0xe8);
2866               BFD_ASSERT (rel + 1 < relend);
2867               BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2868               roff = rel->r_offset - 3;
2869               val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2870               if (type == 0x04)
2871                 {
2872                   /* leal foo(,%reg,1), %eax; call ___tls_get_addr
2873                      Change it into:
2874                      movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
2875                   BFD_ASSERT (rel->r_offset >= 3);
2876                   BFD_ASSERT (bfd_get_8 (input_bfd,
2877                                          contents + rel->r_offset - 3)
2878                               == 0x8d);
2879                   BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
2880                   val >>= 3;
2881                 }
2882               else
2883                 {
2884                   /* leal foo(%reg), %eax; call ___tls_get_addr; nop
2885                      Change it into:
2886                      movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
2887                   BFD_ASSERT (rel->r_offset + 10 <= input_section->size);
2888                   BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2889                   BFD_ASSERT (bfd_get_8 (input_bfd,
2890                                          contents + rel->r_offset + 9)
2891                               == 0x90);
2892                   roff = rel->r_offset - 2;
2893                 }
2894               memcpy (contents + roff,
2895                       "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
2896               contents[roff + 7] = 0x80 | (val & 7);
2897               /* If foo is used only with foo@gotntpoff(%reg) and
2898                  foo@indntpoff, but not with foo@gottpoff(%reg), change
2899                  subl $foo@gottpoff(%reg), %eax
2900                  into:
2901                  addl $foo@gotntpoff(%reg), %eax.  */
2902               if (r_type == R_386_TLS_GOTIE)
2903                 {
2904                   contents[roff + 6] = 0x03;
2905                   if (tls_type == GOT_TLS_IE_BOTH)
2906                     off += 4;
2907                 }
2908               bfd_put_32 (output_bfd,
2909                           htab->sgot->output_section->vma
2910                           + htab->sgot->output_offset + off
2911                           - htab->sgotplt->output_section->vma
2912                           - htab->sgotplt->output_offset,
2913                           contents + roff + 8);
2914               /* Skip R_386_PLT32.  */
2915               rel++;
2916               continue;
2917             }
2918           break;
2919
2920         case R_386_TLS_LDM:
2921           if (! info->shared)
2922             {
2923               unsigned int val;
2924
2925               /* LD->LE transition:
2926                  Ensure it is:
2927                  leal foo(%reg), %eax; call ___tls_get_addr.
2928                  We change it into:
2929                  movl %gs:0, %eax; nop; leal 0(%esi,1), %esi.  */
2930               BFD_ASSERT (rel->r_offset >= 2);
2931               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
2932                           == 0x8d);
2933               val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2934               BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2935               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2936               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2937                           == 0xe8);
2938               BFD_ASSERT (rel + 1 < relend);
2939               BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2940               memcpy (contents + rel->r_offset - 2,
2941                       "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
2942               /* Skip R_386_PLT32.  */
2943               rel++;
2944               continue;
2945             }
2946
2947           if (htab->sgot == NULL)
2948             abort ();
2949
2950           off = htab->tls_ldm_got.offset;
2951           if (off & 1)
2952             off &= ~1;
2953           else
2954             {
2955               Elf_Internal_Rela outrel;
2956               bfd_byte *loc;
2957
2958               if (htab->srelgot == NULL)
2959                 abort ();
2960
2961               outrel.r_offset = (htab->sgot->output_section->vma
2962                                  + htab->sgot->output_offset + off);
2963
2964               bfd_put_32 (output_bfd, 0,
2965                           htab->sgot->contents + off);
2966               bfd_put_32 (output_bfd, 0,
2967                           htab->sgot->contents + off + 4);
2968               outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
2969               loc = htab->srelgot->contents;
2970               loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
2971               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2972               htab->tls_ldm_got.offset |= 1;
2973             }
2974           relocation = htab->sgot->output_section->vma
2975                        + htab->sgot->output_offset + off
2976                        - htab->sgotplt->output_section->vma
2977                        - htab->sgotplt->output_offset;
2978           unresolved_reloc = FALSE;
2979           break;
2980
2981         case R_386_TLS_LDO_32:
2982           if (info->shared || (input_section->flags & SEC_CODE) == 0)
2983             relocation -= dtpoff_base (info);
2984           else
2985             /* When converting LDO to LE, we must negate.  */
2986             relocation = -tpoff (info, relocation);
2987           break;
2988
2989         case R_386_TLS_LE_32:
2990         case R_386_TLS_LE:
2991           if (info->shared)
2992             {
2993               Elf_Internal_Rela outrel;
2994               asection *sreloc;
2995               bfd_byte *loc;
2996               int indx;
2997
2998               outrel.r_offset = rel->r_offset
2999                                 + input_section->output_section->vma
3000                                 + input_section->output_offset;
3001               if (h != NULL && h->dynindx != -1)
3002                 indx = h->dynindx;
3003               else
3004                 indx = 0;
3005               if (r_type == R_386_TLS_LE_32)
3006                 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
3007               else
3008                 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3009               sreloc = elf_section_data (input_section)->sreloc;
3010               if (sreloc == NULL)
3011                 abort ();
3012               loc = sreloc->contents;
3013               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3014               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3015               if (indx)
3016                 continue;
3017               else if (r_type == R_386_TLS_LE_32)
3018                 relocation = dtpoff_base (info) - relocation;
3019               else
3020                 relocation -= dtpoff_base (info);
3021             }
3022           else if (r_type == R_386_TLS_LE_32)
3023             relocation = tpoff (info, relocation);
3024           else
3025             relocation = -tpoff (info, relocation);
3026           break;
3027
3028         default:
3029           break;
3030         }
3031
3032       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3033          because such sections are not SEC_ALLOC and thus ld.so will
3034          not process them.  */
3035       if (unresolved_reloc
3036           && !((input_section->flags & SEC_DEBUGGING) != 0
3037                && h->def_dynamic))
3038         {
3039           (*_bfd_error_handler)
3040             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3041              input_bfd,
3042              input_section,
3043              (long) rel->r_offset,
3044              howto->name,
3045              h->root.root.string);
3046           return FALSE;
3047         }
3048
3049       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3050                                     contents, rel->r_offset,
3051                                     relocation, 0);
3052
3053       if (r != bfd_reloc_ok)
3054         {
3055           const char *name;
3056
3057           if (h != NULL)
3058             name = h->root.root.string;
3059           else
3060             {
3061               name = bfd_elf_string_from_elf_section (input_bfd,
3062                                                       symtab_hdr->sh_link,
3063                                                       sym->st_name);
3064               if (name == NULL)
3065                 return FALSE;
3066               if (*name == '\0')
3067                 name = bfd_section_name (input_bfd, sec);
3068             }
3069
3070           if (r == bfd_reloc_overflow)
3071             {
3072               if (! ((*info->callbacks->reloc_overflow)
3073                      (info, (h ? &h->root : NULL), name, howto->name,
3074                       (bfd_vma) 0, input_bfd, input_section,
3075                       rel->r_offset)))
3076                 return FALSE;
3077             }
3078           else
3079             {
3080               (*_bfd_error_handler)
3081                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3082                  input_bfd, input_section,
3083                  (long) rel->r_offset, name, (int) r);
3084               return FALSE;
3085             }
3086         }
3087     }
3088
3089   return TRUE;
3090 }
3091
3092 /* Finish up dynamic symbol handling.  We set the contents of various
3093    dynamic sections here.  */
3094
3095 static bfd_boolean
3096 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
3097                                 struct bfd_link_info *info,
3098                                 struct elf_link_hash_entry *h,
3099                                 Elf_Internal_Sym *sym)
3100 {
3101   struct elf_i386_link_hash_table *htab;
3102
3103   htab = elf_i386_hash_table (info);
3104
3105   if (h->plt.offset != (bfd_vma) -1)
3106     {
3107       bfd_vma plt_index;
3108       bfd_vma got_offset;
3109       Elf_Internal_Rela rel;
3110       bfd_byte *loc;
3111
3112       /* This symbol has an entry in the procedure linkage table.  Set
3113          it up.  */
3114
3115       if (h->dynindx == -1
3116           || htab->splt == NULL
3117           || htab->sgotplt == NULL
3118           || htab->srelplt == NULL)
3119         abort ();
3120
3121       /* Get the index in the procedure linkage table which
3122          corresponds to this symbol.  This is the index of this symbol
3123          in all the symbols for which we are making plt entries.  The
3124          first entry in the procedure linkage table is reserved.  */
3125       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3126
3127       /* Get the offset into the .got table of the entry that
3128          corresponds to this function.  Each .got entry is 4 bytes.
3129          The first three are reserved.  */
3130       got_offset = (plt_index + 3) * 4;
3131
3132       /* Fill in the entry in the procedure linkage table.  */
3133       if (! info->shared)
3134         {
3135           memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
3136                   PLT_ENTRY_SIZE);
3137           bfd_put_32 (output_bfd,
3138                       (htab->sgotplt->output_section->vma
3139                        + htab->sgotplt->output_offset
3140                        + got_offset),
3141                       htab->splt->contents + h->plt.offset + 2);
3142
3143           if (htab->is_vxworks)
3144             {
3145               int s, k, reloc_index;
3146
3147               /* Create the R_386_32 relocation referencing the GOT
3148                  for this PLT entry.  */
3149
3150               /* S: Current slot number (zero-based).  */
3151               s = (h->plt.offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3152               /* K: Number of relocations for PLTResolve. */
3153               if (info->shared)
3154                 k = PLTRESOLVE_RELOCS_SHLIB;
3155               else
3156                 k = PLTRESOLVE_RELOCS;
3157               /* Skip the PLTresolve relocations, and the relocations for
3158                  the other PLT slots. */
3159               reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
3160               loc = (htab->srelplt2->contents + reloc_index
3161                      * sizeof (Elf32_External_Rel));
3162
3163               rel.r_offset = (htab->splt->output_section->vma
3164                               + htab->splt->output_offset
3165                               + h->plt.offset + 2),
3166               rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32);
3167               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3168
3169               /* Create the R_386_32 relocation referencing the beginning of
3170                  the PLT for this GOT entry.  */
3171               rel.r_offset = (htab->sgotplt->output_section->vma
3172                               + htab->sgotplt->output_offset
3173                               + got_offset);
3174               rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32);
3175               bfd_elf32_swap_reloc_out (output_bfd, &rel,
3176               loc + sizeof (Elf32_External_Rel));
3177             }
3178         }
3179       else
3180         {
3181           memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
3182                   PLT_ENTRY_SIZE);
3183           bfd_put_32 (output_bfd, got_offset,
3184                       htab->splt->contents + h->plt.offset + 2);
3185         }
3186
3187       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
3188                   htab->splt->contents + h->plt.offset + 7);
3189       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
3190                   htab->splt->contents + h->plt.offset + 12);
3191
3192       /* Fill in the entry in the global offset table.  */
3193       bfd_put_32 (output_bfd,
3194                   (htab->splt->output_section->vma
3195                    + htab->splt->output_offset
3196                    + h->plt.offset
3197                    + 6),
3198                   htab->sgotplt->contents + got_offset);
3199
3200       /* Fill in the entry in the .rel.plt section.  */
3201       rel.r_offset = (htab->sgotplt->output_section->vma
3202                       + htab->sgotplt->output_offset
3203                       + got_offset);
3204       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
3205       loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel);
3206       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3207
3208       if (!h->def_regular)
3209         {
3210           /* Mark the symbol as undefined, rather than as defined in
3211              the .plt section.  Leave the value if there were any
3212              relocations where pointer equality matters (this is a clue
3213              for the dynamic linker, to make function pointer
3214              comparisons work between an application and shared
3215              library), otherwise set it to zero.  If a function is only
3216              called from a binary, there is no need to slow down
3217              shared libraries because of that.  */
3218           sym->st_shndx = SHN_UNDEF;
3219           if (!h->pointer_equality_needed)
3220             sym->st_value = 0;
3221         }
3222     }
3223
3224   if (h->got.offset != (bfd_vma) -1
3225       && elf_i386_hash_entry(h)->tls_type != GOT_TLS_GD
3226       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
3227     {
3228       Elf_Internal_Rela rel;
3229       bfd_byte *loc;
3230
3231       /* This symbol has an entry in the global offset table.  Set it
3232          up.  */
3233
3234       if (htab->sgot == NULL || htab->srelgot == NULL)
3235         abort ();
3236
3237       rel.r_offset = (htab->sgot->output_section->vma
3238                       + htab->sgot->output_offset
3239                       + (h->got.offset & ~(bfd_vma) 1));
3240
3241       /* If this is a static link, or it is a -Bsymbolic link and the
3242          symbol is defined locally or was forced to be local because
3243          of a version file, we just want to emit a RELATIVE reloc.
3244          The entry in the global offset table will already have been
3245          initialized in the relocate_section function.  */
3246       if (info->shared
3247           && SYMBOL_REFERENCES_LOCAL (info, h))
3248         {
3249           BFD_ASSERT((h->got.offset & 1) != 0);
3250           rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3251         }
3252       else
3253         {
3254           BFD_ASSERT((h->got.offset & 1) == 0);
3255           bfd_put_32 (output_bfd, (bfd_vma) 0,
3256                       htab->sgot->contents + h->got.offset);
3257           rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
3258         }
3259
3260       loc = htab->srelgot->contents;
3261       loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3262       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3263     }
3264
3265   if (h->needs_copy)
3266     {
3267       Elf_Internal_Rela rel;
3268       bfd_byte *loc;
3269
3270       /* This symbol needs a copy reloc.  Set it up.  */
3271
3272       if (h->dynindx == -1
3273           || (h->root.type != bfd_link_hash_defined
3274               && h->root.type != bfd_link_hash_defweak)
3275           || htab->srelbss == NULL)
3276         abort ();
3277
3278       rel.r_offset = (h->root.u.def.value
3279                       + h->root.u.def.section->output_section->vma
3280                       + h->root.u.def.section->output_offset);
3281       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
3282       loc = htab->srelbss->contents;
3283       loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel);
3284       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3285     }
3286
3287   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.
3288      On VxWorks, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it
3289      is relative to the ".got" section.  */
3290   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3291       || (strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3292           && !htab->is_vxworks))
3293     sym->st_shndx = SHN_ABS;
3294
3295   return TRUE;
3296 }
3297
3298 /* Used to decide how to sort relocs in an optimal manner for the
3299    dynamic linker, before writing them out.  */
3300
3301 static enum elf_reloc_type_class
3302 elf_i386_reloc_type_class (const Elf_Internal_Rela *rela)
3303 {
3304   switch (ELF32_R_TYPE (rela->r_info))
3305     {
3306     case R_386_RELATIVE:
3307       return reloc_class_relative;
3308     case R_386_JUMP_SLOT:
3309       return reloc_class_plt;
3310     case R_386_COPY:
3311       return reloc_class_copy;
3312     default:
3313       return reloc_class_normal;
3314     }
3315 }
3316
3317 /* Finish up the dynamic sections.  */
3318
3319 static bfd_boolean
3320 elf_i386_finish_dynamic_sections (bfd *output_bfd,
3321                                   struct bfd_link_info *info)
3322 {
3323   struct elf_i386_link_hash_table *htab;
3324   bfd *dynobj;
3325   asection *sdyn;
3326
3327   htab = elf_i386_hash_table (info);
3328   dynobj = htab->elf.dynobj;
3329   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3330
3331   if (htab->elf.dynamic_sections_created)
3332     {
3333       Elf32_External_Dyn *dyncon, *dynconend;
3334
3335       if (sdyn == NULL || htab->sgot == NULL)
3336         abort ();
3337
3338       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3339       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3340       for (; dyncon < dynconend; dyncon++)
3341         {
3342           Elf_Internal_Dyn dyn;
3343           asection *s;
3344
3345           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3346
3347           switch (dyn.d_tag)
3348             {
3349             default:
3350               continue;
3351
3352             case DT_PLTGOT:
3353               s = htab->sgotplt;
3354               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3355               break;
3356
3357             case DT_JMPREL:
3358               s = htab->srelplt;
3359               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3360               break;
3361
3362             case DT_PLTRELSZ:
3363               s = htab->srelplt;
3364               dyn.d_un.d_val = s->size;
3365               break;
3366
3367             case DT_RELSZ:
3368               /* My reading of the SVR4 ABI indicates that the
3369                  procedure linkage table relocs (DT_JMPREL) should be
3370                  included in the overall relocs (DT_REL).  This is
3371                  what Solaris does.  However, UnixWare can not handle
3372                  that case.  Therefore, we override the DT_RELSZ entry
3373                  here to make it not include the JMPREL relocs.  */
3374               s = htab->srelplt;
3375               if (s == NULL)
3376                 continue;
3377               dyn.d_un.d_val -= s->size;
3378               break;
3379
3380             case DT_REL:
3381               /* We may not be using the standard ELF linker script.
3382                  If .rel.plt is the first .rel section, we adjust
3383                  DT_REL to not include it.  */
3384               s = htab->srelplt;
3385               if (s == NULL)
3386                 continue;
3387               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
3388                 continue;
3389               dyn.d_un.d_ptr += s->size;
3390               break;
3391             }
3392
3393           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3394         }
3395
3396       /* Fill in the first entry in the procedure linkage table.  */
3397       if (htab->splt && htab->splt->size > 0)
3398         {
3399           if (info->shared)
3400             {
3401               memcpy (htab->splt->contents, elf_i386_pic_plt0_entry,
3402                       sizeof (elf_i386_pic_plt0_entry));
3403               memset (htab->splt->contents + sizeof (elf_i386_pic_plt0_entry),
3404                       htab->plt0_pad_byte,
3405                       PLT_ENTRY_SIZE - sizeof (elf_i386_pic_plt0_entry));
3406             }
3407           else
3408             {
3409               memcpy (htab->splt->contents, elf_i386_plt0_entry,
3410                       sizeof(elf_i386_plt0_entry));
3411               memset (htab->splt->contents + sizeof (elf_i386_plt0_entry),
3412                       htab->plt0_pad_byte,
3413                       PLT_ENTRY_SIZE - sizeof (elf_i386_plt0_entry));
3414               bfd_put_32 (output_bfd,
3415                           (htab->sgotplt->output_section->vma
3416                            + htab->sgotplt->output_offset
3417                            + 4),
3418                           htab->splt->contents + 2);
3419               bfd_put_32 (output_bfd,
3420                           (htab->sgotplt->output_section->vma
3421                            + htab->sgotplt->output_offset
3422                            + 8),
3423                           htab->splt->contents + 8);
3424
3425               if (htab->is_vxworks)
3426                 {
3427                   Elf_Internal_Rela rel;
3428                   struct elf_link_hash_entry *hgot;
3429
3430                   /* The VxWorks GOT is relocated by the dynamic linker.
3431                      Therefore, we must emit relocations rather than
3432                      simply computing the values now.  */
3433                   hgot = elf_link_hash_lookup (elf_hash_table (info),
3434                                                "_GLOBAL_OFFSET_TABLE_",
3435                                                FALSE, FALSE, FALSE);
3436                   /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
3437                      On IA32 we use REL relocations so the addend goes in
3438                      the PLT directly.  */
3439                   rel.r_offset = (htab->splt->output_section->vma
3440                                   + htab->splt->output_offset
3441                                   + 2);
3442                   rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32);
3443                   bfd_elf32_swap_reloc_out (output_bfd, &rel,
3444                                             htab->srelplt2->contents);
3445                   /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
3446                   rel.r_offset = (htab->splt->output_section->vma
3447                                   + htab->splt->output_offset
3448                                   + 8);
3449                   rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32);
3450                   bfd_elf32_swap_reloc_out (output_bfd, &rel,
3451                                             htab->srelplt2->contents +
3452                                             sizeof (Elf32_External_Rel));
3453                 }
3454             }
3455
3456           /* UnixWare sets the entsize of .plt to 4, although that doesn't
3457              really seem like the right value.  */
3458           elf_section_data (htab->splt->output_section)
3459             ->this_hdr.sh_entsize = 4;
3460
3461           /* Correct the .rel.plt.unloaded relocations.  */
3462           if (htab->is_vxworks && !info->shared)
3463             {
3464               int num_plts = (htab->splt->size / PLT_ENTRY_SIZE) - 1;
3465               unsigned char *p;
3466
3467               p = htab->srelplt2->contents;
3468               if (info->shared)
3469                 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
3470               else
3471                 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
3472
3473               for (; num_plts; num_plts--)
3474                 {
3475                   Elf_Internal_Rela rel;
3476                   bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
3477                   rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32);
3478                   bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3479                   p += sizeof (Elf32_External_Rel);
3480
3481                   bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
3482                   rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32);
3483                   bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3484                   p += sizeof (Elf32_External_Rel);
3485                 }
3486             }
3487         }
3488     }
3489
3490   if (htab->sgotplt)
3491     {
3492       /* Fill in the first three entries in the global offset table.  */
3493       if (htab->sgotplt->size > 0)
3494         {
3495           bfd_put_32 (output_bfd,
3496                       (sdyn == NULL ? 0
3497                        : sdyn->output_section->vma + sdyn->output_offset),
3498                       htab->sgotplt->contents);
3499           bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 4);
3500           bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 8);
3501         }
3502
3503       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
3504     }
3505
3506   if (htab->sgot && htab->sgot->size > 0)
3507     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3508
3509   return TRUE;
3510 }
3511
3512 /* Return address for Ith PLT stub in section PLT, for relocation REL
3513    or (bfd_vma) -1 if it should not be included.  */
3514
3515 static bfd_vma
3516 elf_i386_plt_sym_val (bfd_vma i, const asection *plt,
3517                       const arelent *rel ATTRIBUTE_UNUSED)
3518 {
3519   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3520 }
3521
3522
3523 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
3524 #define TARGET_LITTLE_NAME              "elf32-i386"
3525 #define ELF_ARCH                        bfd_arch_i386
3526 #define ELF_MACHINE_CODE                EM_386
3527 #define ELF_MAXPAGESIZE                 0x1000
3528
3529 #define elf_backend_can_gc_sections     1
3530 #define elf_backend_can_refcount        1
3531 #define elf_backend_want_got_plt        1
3532 #define elf_backend_plt_readonly        1
3533 #define elf_backend_want_plt_sym        0
3534 #define elf_backend_got_header_size     12
3535
3536 /* Support RELA for objdump of prelink objects.  */
3537 #define elf_info_to_howto                     elf_i386_info_to_howto_rel
3538 #define elf_info_to_howto_rel                 elf_i386_info_to_howto_rel
3539
3540 #define bfd_elf32_mkobject                    elf_i386_mkobject
3541
3542 #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
3543 #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
3544 #define bfd_elf32_bfd_reloc_type_lookup       elf_i386_reloc_type_lookup
3545
3546 #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
3547 #define elf_backend_check_relocs              elf_i386_check_relocs
3548 #define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
3549 #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
3550 #define elf_backend_fake_sections             elf_i386_fake_sections
3551 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
3552 #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
3553 #define elf_backend_gc_mark_hook              elf_i386_gc_mark_hook
3554 #define elf_backend_gc_sweep_hook             elf_i386_gc_sweep_hook
3555 #define elf_backend_grok_prstatus             elf_i386_grok_prstatus
3556 #define elf_backend_grok_psinfo               elf_i386_grok_psinfo
3557 #define elf_backend_reloc_type_class          elf_i386_reloc_type_class
3558 #define elf_backend_relocate_section          elf_i386_relocate_section
3559 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
3560 #define elf_backend_plt_sym_val               elf_i386_plt_sym_val
3561
3562 #include "elf32-target.h"
3563
3564 /* FreeBSD support.  */
3565
3566 #undef  TARGET_LITTLE_SYM
3567 #define TARGET_LITTLE_SYM               bfd_elf32_i386_freebsd_vec
3568 #undef  TARGET_LITTLE_NAME
3569 #define TARGET_LITTLE_NAME              "elf32-i386-freebsd"
3570
3571 /* The kernel recognizes executables as valid only if they carry a
3572    "FreeBSD" label in the ELF header.  So we put this label on all
3573    executables and (for simplicity) also all other object files.  */
3574
3575 static void
3576 elf_i386_post_process_headers (bfd *abfd,
3577                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
3578 {
3579   Elf_Internal_Ehdr *i_ehdrp;
3580
3581   i_ehdrp = elf_elfheader (abfd);
3582
3583   /* Put an ABI label supported by FreeBSD >= 4.1.  */
3584   i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
3585 #ifdef OLD_FREEBSD_ABI_LABEL
3586   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
3587   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
3588 #endif
3589 }
3590
3591 #undef  elf_backend_post_process_headers
3592 #define elf_backend_post_process_headers        elf_i386_post_process_headers
3593 #undef  elf32_bed
3594 #define elf32_bed                               elf32_i386_fbsd_bed
3595
3596 #include "elf32-target.h"
3597
3598 /* VxWorks support.  */
3599
3600 #undef  TARGET_LITTLE_SYM
3601 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vxworks_vec
3602 #undef  TARGET_LITTLE_NAME
3603 #define TARGET_LITTLE_NAME              "elf32-i386-vxworks"
3604
3605
3606 /* Like elf_i386_link_hash_table_create but with tweaks for VxWorks.  */
3607
3608 static struct bfd_link_hash_table *
3609 elf_i386_vxworks_link_hash_table_create (bfd *abfd)
3610 {
3611   struct bfd_link_hash_table *ret;
3612   struct elf_i386_link_hash_table *htab;
3613
3614   ret = elf_i386_link_hash_table_create (abfd);
3615   if (ret)
3616     {
3617       htab = (struct elf_i386_link_hash_table *) ret;
3618       htab->is_vxworks = 1;
3619       htab->plt0_pad_byte = 0x90;
3620     }
3621
3622   return ret;
3623 }
3624
3625
3626 /* Tweak magic VxWorks symbols as they are written to the output file.  */
3627 static bfd_boolean
3628 elf_i386_vxworks_link_output_symbol_hook (struct bfd_link_info *info
3629                                             ATTRIBUTE_UNUSED,
3630                                           const char *name,
3631                                           Elf_Internal_Sym *sym,
3632                                           asection *input_sec ATTRIBUTE_UNUSED,
3633                                           struct elf_link_hash_entry *h
3634                                             ATTRIBUTE_UNUSED)
3635 {
3636   /* Ignore the first dummy symbol.  */
3637   if (!name)
3638     return TRUE;
3639
3640   return elf_vxworks_link_output_symbol_hook (name, sym);
3641 }
3642
3643 #undef  elf_backend_post_process_headers
3644 #undef bfd_elf32_bfd_link_hash_table_create
3645 #define bfd_elf32_bfd_link_hash_table_create \
3646   elf_i386_vxworks_link_hash_table_create
3647 #undef elf_backend_add_symbol_hook
3648 #define elf_backend_add_symbol_hook \
3649   elf_vxworks_add_symbol_hook
3650 #undef elf_backend_link_output_symbol_hook
3651 #define elf_backend_link_output_symbol_hook \
3652   elf_i386_vxworks_link_output_symbol_hook
3653 #undef elf_backend_emit_relocs
3654 #define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
3655 #undef elf_backend_final_write_processing
3656 #define elf_backend_final_write_processing \
3657   elf_vxworks_final_write_processing
3658
3659 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
3660    define it.  */
3661 #undef elf_backend_want_plt_sym
3662 #define elf_backend_want_plt_sym        1
3663
3664 #undef  elf32_bed
3665 #define elf32_bed                               elf32_i386_vxworks_bed
3666
3667 #include "elf32-target.h"