2005-06-20 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   /* We must allocate the symbol in our .dynbss section, which will
1466      become part of the .bss section of the executable.  There will be
1467      an entry for this symbol in the .dynsym section.  The dynamic
1468      object will contain position independent code, so all references
1469      from the dynamic object to this symbol will go through the global
1470      offset table.  The dynamic linker will use the .dynsym entry to
1471      determine the address it must put in the global offset table, so
1472      both the dynamic object and the regular object will refer to the
1473      same memory location for the variable.  */
1474
1475   /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1476      copy the initial value out of the dynamic object and into the
1477      runtime process image.  */
1478   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1479     {
1480       htab->srelbss->size += sizeof (Elf32_External_Rel);
1481       h->needs_copy = 1;
1482     }
1483
1484   /* We need to figure out the alignment required for this symbol.  I
1485      have no idea how ELF linkers handle this.  */
1486   power_of_two = bfd_log2 (h->size);
1487   if (power_of_two > 3)
1488     power_of_two = 3;
1489
1490   /* Apply the required alignment.  */
1491   s = htab->sdynbss;
1492   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1493   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1494     {
1495       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1496         return FALSE;
1497     }
1498
1499   /* Define the symbol as being at this point in the section.  */
1500   h->root.u.def.section = s;
1501   h->root.u.def.value = s->size;
1502
1503   /* Increment the section size to make room for the symbol.  */
1504   s->size += h->size;
1505
1506   return TRUE;
1507 }
1508
1509 /* Allocate space in .plt, .got and associated reloc sections for
1510    dynamic relocs.  */
1511
1512 static bfd_boolean
1513 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1514 {
1515   struct bfd_link_info *info;
1516   struct elf_i386_link_hash_table *htab;
1517   struct elf_i386_link_hash_entry *eh;
1518   struct elf_i386_dyn_relocs *p;
1519
1520   if (h->root.type == bfd_link_hash_indirect)
1521     return TRUE;
1522
1523   if (h->root.type == bfd_link_hash_warning)
1524     /* When warning symbols are created, they **replace** the "real"
1525        entry in the hash table, thus we never get to see the real
1526        symbol in a hash traversal.  So look at it now.  */
1527     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1528
1529   info = (struct bfd_link_info *) inf;
1530   htab = elf_i386_hash_table (info);
1531
1532   if (htab->elf.dynamic_sections_created
1533       && h->plt.refcount > 0)
1534     {
1535       /* Make sure this symbol is output as a dynamic symbol.
1536          Undefined weak syms won't yet be marked as dynamic.  */
1537       if (h->dynindx == -1
1538           && !h->forced_local)
1539         {
1540           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1541             return FALSE;
1542         }
1543
1544       if (info->shared
1545           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
1546         {
1547           asection *s = htab->splt;
1548
1549           /* If this is the first .plt entry, make room for the special
1550              first entry.  */
1551           if (s->size == 0)
1552             s->size += PLT_ENTRY_SIZE;
1553
1554           h->plt.offset = s->size;
1555
1556           /* If this symbol is not defined in a regular file, and we are
1557              not generating a shared library, then set the symbol to this
1558              location in the .plt.  This is required to make function
1559              pointers compare as equal between the normal executable and
1560              the shared library.  */
1561           if (! info->shared
1562               && !h->def_regular)
1563             {
1564               h->root.u.def.section = s;
1565               h->root.u.def.value = h->plt.offset;
1566             }
1567
1568           /* Make room for this entry.  */
1569           s->size += PLT_ENTRY_SIZE;
1570
1571           /* We also need to make an entry in the .got.plt section, which
1572              will be placed in the .got section by the linker script.  */
1573           htab->sgotplt->size += 4;
1574
1575           /* We also need to make an entry in the .rel.plt section.  */
1576           htab->srelplt->size += sizeof (Elf32_External_Rel);
1577
1578           if (htab->is_vxworks && !info->shared)
1579             {
1580               /* VxWorks has a second set of relocations for each PLT entry
1581                  in executables.  They go in a separate relocation section,
1582                  which is processed by the kernel loader.  */
1583
1584               /* There are two relocations for the initial PLT entry: an
1585                  R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
1586                  R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
1587
1588               if (h->plt.offset == PLT_ENTRY_SIZE)
1589                 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1590
1591               /* There are two extra relocations for each subsequent PLT entry:
1592                  an R_386_32 relocation for the GOT entry, and an R_386_32
1593                  relocation for the PLT entry.  */
1594
1595               htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1596             }
1597         }
1598       else
1599         {
1600           h->plt.offset = (bfd_vma) -1;
1601           h->needs_plt = 0;
1602         }
1603     }
1604   else
1605     {
1606       h->plt.offset = (bfd_vma) -1;
1607       h->needs_plt = 0;
1608     }
1609
1610   /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
1611      make it a R_386_TLS_LE_32 requiring no TLS entry.  */
1612   if (h->got.refcount > 0
1613       && !info->shared
1614       && h->dynindx == -1
1615       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
1616     h->got.offset = (bfd_vma) -1;
1617   else if (h->got.refcount > 0)
1618     {
1619       asection *s;
1620       bfd_boolean dyn;
1621       int tls_type = elf_i386_hash_entry(h)->tls_type;
1622
1623       /* Make sure this symbol is output as a dynamic symbol.
1624          Undefined weak syms won't yet be marked as dynamic.  */
1625       if (h->dynindx == -1
1626           && !h->forced_local)
1627         {
1628           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1629             return FALSE;
1630         }
1631
1632       s = htab->sgot;
1633       h->got.offset = s->size;
1634       s->size += 4;
1635       /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
1636       if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE_BOTH)
1637         s->size += 4;
1638       dyn = htab->elf.dynamic_sections_created;
1639       /* R_386_TLS_IE_32 needs one dynamic relocation,
1640          R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
1641          (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
1642          need two), R_386_TLS_GD needs one if local symbol and two if
1643          global.  */
1644       if (tls_type == GOT_TLS_IE_BOTH)
1645         htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
1646       else if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1647                || (tls_type & GOT_TLS_IE))
1648         htab->srelgot->size += sizeof (Elf32_External_Rel);
1649       else if (tls_type == GOT_TLS_GD)
1650         htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
1651       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1652                 || h->root.type != bfd_link_hash_undefweak)
1653                && (info->shared
1654                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1655         htab->srelgot->size += sizeof (Elf32_External_Rel);
1656     }
1657   else
1658     h->got.offset = (bfd_vma) -1;
1659
1660   eh = (struct elf_i386_link_hash_entry *) h;
1661   if (eh->dyn_relocs == NULL)
1662     return TRUE;
1663
1664   /* In the shared -Bsymbolic case, discard space allocated for
1665      dynamic pc-relative relocs against symbols which turn out to be
1666      defined in regular objects.  For the normal shared case, discard
1667      space for pc-relative relocs that have become local due to symbol
1668      visibility changes.  */
1669
1670   if (info->shared)
1671     {
1672       /* The only reloc that uses pc_count is R_386_PC32, which will
1673          appear on a call or on something like ".long foo - .".  We
1674          want calls to protected symbols to resolve directly to the
1675          function rather than going via the plt.  If people want
1676          function pointer comparisons to work as expected then they
1677          should avoid writing assembly like ".long foo - .".  */
1678       if (SYMBOL_CALLS_LOCAL (info, h))
1679         {
1680           struct elf_i386_dyn_relocs **pp;
1681
1682           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1683             {
1684               p->count -= p->pc_count;
1685               p->pc_count = 0;
1686               if (p->count == 0)
1687                 *pp = p->next;
1688               else
1689                 pp = &p->next;
1690             }
1691         }
1692
1693       /* Also discard relocs on undefined weak syms with non-default
1694          visibility.  */
1695       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1696           && h->root.type == bfd_link_hash_undefweak)
1697         eh->dyn_relocs = NULL;
1698     }
1699   else if (ELIMINATE_COPY_RELOCS)
1700     {
1701       /* For the non-shared case, discard space for relocs against
1702          symbols which turn out to need copy relocs or are not
1703          dynamic.  */
1704
1705       if (!h->non_got_ref
1706           && ((h->def_dynamic
1707                && !h->def_regular)
1708               || (htab->elf.dynamic_sections_created
1709                   && (h->root.type == bfd_link_hash_undefweak
1710                       || h->root.type == bfd_link_hash_undefined))))
1711         {
1712           /* Make sure this symbol is output as a dynamic symbol.
1713              Undefined weak syms won't yet be marked as dynamic.  */
1714           if (h->dynindx == -1
1715               && !h->forced_local)
1716             {
1717               if (! bfd_elf_link_record_dynamic_symbol (info, h))
1718                 return FALSE;
1719             }
1720
1721           /* If that succeeded, we know we'll be keeping all the
1722              relocs.  */
1723           if (h->dynindx != -1)
1724             goto keep;
1725         }
1726
1727       eh->dyn_relocs = NULL;
1728
1729     keep: ;
1730     }
1731
1732   /* Finally, allocate space.  */
1733   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1734     {
1735       asection *sreloc = elf_section_data (p->sec)->sreloc;
1736       sreloc->size += p->count * sizeof (Elf32_External_Rel);
1737     }
1738
1739   return TRUE;
1740 }
1741
1742 /* Find any dynamic relocs that apply to read-only sections.  */
1743
1744 static bfd_boolean
1745 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1746 {
1747   struct elf_i386_link_hash_entry *eh;
1748   struct elf_i386_dyn_relocs *p;
1749
1750   if (h->root.type == bfd_link_hash_warning)
1751     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1752
1753   eh = (struct elf_i386_link_hash_entry *) h;
1754   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1755     {
1756       asection *s = p->sec->output_section;
1757
1758       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1759         {
1760           struct bfd_link_info *info = (struct bfd_link_info *) inf;
1761
1762           info->flags |= DF_TEXTREL;
1763
1764           /* Not an error, just cut short the traversal.  */
1765           return FALSE;
1766         }
1767     }
1768   return TRUE;
1769 }
1770
1771 /* Set the sizes of the dynamic sections.  */
1772
1773 static bfd_boolean
1774 elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1775                                 struct bfd_link_info *info)
1776 {
1777   struct elf_i386_link_hash_table *htab;
1778   bfd *dynobj;
1779   asection *s;
1780   bfd_boolean relocs;
1781   bfd *ibfd;
1782
1783   htab = elf_i386_hash_table (info);
1784   dynobj = htab->elf.dynobj;
1785   if (dynobj == NULL)
1786     abort ();
1787
1788   if (htab->elf.dynamic_sections_created)
1789     {
1790       /* Set the contents of the .interp section to the interpreter.  */
1791       if (info->executable)
1792         {
1793           s = bfd_get_section_by_name (dynobj, ".interp");
1794           if (s == NULL)
1795             abort ();
1796           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1797           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1798         }
1799     }
1800
1801   /* Set up .got offsets for local syms, and space for local dynamic
1802      relocs.  */
1803   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1804     {
1805       bfd_signed_vma *local_got;
1806       bfd_signed_vma *end_local_got;
1807       char *local_tls_type;
1808       bfd_size_type locsymcount;
1809       Elf_Internal_Shdr *symtab_hdr;
1810       asection *srel;
1811
1812       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1813         continue;
1814
1815       for (s = ibfd->sections; s != NULL; s = s->next)
1816         {
1817           struct elf_i386_dyn_relocs *p;
1818
1819           for (p = *((struct elf_i386_dyn_relocs **)
1820                      &elf_section_data (s)->local_dynrel);
1821                p != NULL;
1822                p = p->next)
1823             {
1824               if (!bfd_is_abs_section (p->sec)
1825                   && bfd_is_abs_section (p->sec->output_section))
1826                 {
1827                   /* Input section has been discarded, either because
1828                      it is a copy of a linkonce section or due to
1829                      linker script /DISCARD/, so we'll be discarding
1830                      the relocs too.  */
1831                 }
1832               else if (p->count != 0)
1833                 {
1834                   srel = elf_section_data (p->sec)->sreloc;
1835                   srel->size += p->count * sizeof (Elf32_External_Rel);
1836                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1837                     info->flags |= DF_TEXTREL;
1838                 }
1839             }
1840         }
1841
1842       local_got = elf_local_got_refcounts (ibfd);
1843       if (!local_got)
1844         continue;
1845
1846       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1847       locsymcount = symtab_hdr->sh_info;
1848       end_local_got = local_got + locsymcount;
1849       local_tls_type = elf_i386_local_got_tls_type (ibfd);
1850       s = htab->sgot;
1851       srel = htab->srelgot;
1852       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1853         {
1854           if (*local_got > 0)
1855             {
1856               *local_got = s->size;
1857               s->size += 4;
1858               if (*local_tls_type == GOT_TLS_GD
1859                   || *local_tls_type == GOT_TLS_IE_BOTH)
1860                 s->size += 4;
1861               if (info->shared
1862                   || *local_tls_type == GOT_TLS_GD
1863                   || (*local_tls_type & GOT_TLS_IE))
1864                 {
1865                   if (*local_tls_type == GOT_TLS_IE_BOTH)
1866                     srel->size += 2 * sizeof (Elf32_External_Rel);
1867                   else
1868                     srel->size += sizeof (Elf32_External_Rel);
1869                 }
1870             }
1871           else
1872             *local_got = (bfd_vma) -1;
1873         }
1874     }
1875
1876   if (htab->tls_ldm_got.refcount > 0)
1877     {
1878       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
1879          relocs.  */
1880       htab->tls_ldm_got.offset = htab->sgot->size;
1881       htab->sgot->size += 8;
1882       htab->srelgot->size += sizeof (Elf32_External_Rel);
1883     }
1884   else
1885     htab->tls_ldm_got.offset = -1;
1886
1887   if (htab->is_vxworks)
1888     {
1889       /* Save the GOT and PLT symbols in the hash table for easy access.
1890          Mark them as having relocations; they might not, but we won't
1891          know for sure until we build the GOT in finish_dynamic_symbol.  */
1892
1893       htab->hgot = elf_link_hash_lookup (elf_hash_table (info),
1894                                         "_GLOBAL_OFFSET_TABLE_",
1895                                         FALSE, FALSE, FALSE);
1896       if (htab->hgot)
1897         htab->hgot->indx = -2;
1898       htab->hplt = elf_link_hash_lookup (elf_hash_table (info),
1899                                         "_PROCEDURE_LINKAGE_TABLE_",
1900                                         FALSE, FALSE, FALSE);
1901       if (htab->hplt)
1902         htab->hplt->indx = -2;
1903
1904       if (htab->is_vxworks && htab->hplt && htab->splt->flags & SEC_CODE)
1905         htab->hplt->type = STT_FUNC;
1906     }
1907
1908   /* Allocate global sym .plt and .got entries, and space for global
1909      sym dynamic relocs.  */
1910   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1911
1912   /* We now have determined the sizes of the various dynamic sections.
1913      Allocate memory for them.  */
1914   relocs = FALSE;
1915   for (s = dynobj->sections; s != NULL; s = s->next)
1916     {
1917       bfd_boolean strip_section = TRUE;
1918
1919       if ((s->flags & SEC_LINKER_CREATED) == 0)
1920         continue;
1921
1922       if (s == htab->splt
1923           || s == htab->sgot
1924           || s == htab->sgotplt
1925           || s == htab->sdynbss)
1926         {
1927           /* Strip this section if we don't need it; see the
1928              comment below.  */
1929           /* We'd like to strip these sections if they aren't needed, but if
1930              we've exported dynamic symbols from them we must leave them.
1931              It's too late to tell BFD to get rid of the symbols.  */
1932
1933           if (htab->hplt != NULL)
1934             strip_section = FALSE;
1935         }
1936       else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
1937         {
1938           if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
1939             relocs = TRUE;
1940
1941           /* We use the reloc_count field as a counter if we need
1942              to copy relocs into the output file.  */
1943           s->reloc_count = 0;
1944         }
1945       else
1946         {
1947           /* It's not one of our sections, so don't allocate space.  */
1948           continue;
1949         }
1950
1951       if (s->size == 0 && strip_section)
1952         {
1953           /* If we don't need this section, strip it from the
1954              output file.  This is mostly to handle .rel.bss and
1955              .rel.plt.  We must create both sections in
1956              create_dynamic_sections, because they must be created
1957              before the linker maps input sections to output
1958              sections.  The linker does that before
1959              adjust_dynamic_symbol is called, and it is that
1960              function which decides whether anything needs to go
1961              into these sections.  */
1962
1963           s->flags |= SEC_EXCLUDE;
1964           continue;
1965         }
1966
1967       /* Allocate memory for the section contents.  We use bfd_zalloc
1968          here in case unused entries are not reclaimed before the
1969          section's contents are written out.  This should not happen,
1970          but this way if it does, we get a R_386_NONE reloc instead
1971          of garbage.  */
1972       s->contents = bfd_zalloc (dynobj, s->size);
1973       if (s->contents == NULL)
1974         return FALSE;
1975     }
1976
1977   if (htab->elf.dynamic_sections_created)
1978     {
1979       /* Add some entries to the .dynamic section.  We fill in the
1980          values later, in elf_i386_finish_dynamic_sections, but we
1981          must add the entries now so that we get the correct size for
1982          the .dynamic section.  The DT_DEBUG entry is filled in by the
1983          dynamic linker and used by the debugger.  */
1984 #define add_dynamic_entry(TAG, VAL) \
1985   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1986
1987       if (info->executable)
1988         {
1989           if (!add_dynamic_entry (DT_DEBUG, 0))
1990             return FALSE;
1991         }
1992
1993       if (htab->splt->size != 0)
1994         {
1995           if (!add_dynamic_entry (DT_PLTGOT, 0)
1996               || !add_dynamic_entry (DT_PLTRELSZ, 0)
1997               || !add_dynamic_entry (DT_PLTREL, DT_REL)
1998               || !add_dynamic_entry (DT_JMPREL, 0))
1999             return FALSE;
2000         }
2001
2002       if (relocs)
2003         {
2004           if (!add_dynamic_entry (DT_REL, 0)
2005               || !add_dynamic_entry (DT_RELSZ, 0)
2006               || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
2007             return FALSE;
2008
2009           /* If any dynamic relocs apply to a read-only section,
2010              then we need a DT_TEXTREL entry.  */
2011           if ((info->flags & DF_TEXTREL) == 0)
2012             elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2013                                     (PTR) info);
2014
2015           if ((info->flags & DF_TEXTREL) != 0)
2016             {
2017               if (!add_dynamic_entry (DT_TEXTREL, 0))
2018                 return FALSE;
2019             }
2020         }
2021     }
2022 #undef add_dynamic_entry
2023
2024   return TRUE;
2025 }
2026
2027 /* Set the correct type for an x86 ELF section.  We do this by the
2028    section name, which is a hack, but ought to work.  */
2029
2030 static bfd_boolean
2031 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2032                         Elf_Internal_Shdr *hdr,
2033                         asection *sec)
2034 {
2035   register const char *name;
2036
2037   name = bfd_get_section_name (abfd, sec);
2038
2039   /* This is an ugly, but unfortunately necessary hack that is
2040      needed when producing EFI binaries on x86. It tells
2041      elf.c:elf_fake_sections() not to consider ".reloc" as a section
2042      containing ELF relocation info.  We need this hack in order to
2043      be able to generate ELF binaries that can be translated into
2044      EFI applications (which are essentially COFF objects).  Those
2045      files contain a COFF ".reloc" section inside an ELFNN object,
2046      which would normally cause BFD to segfault because it would
2047      attempt to interpret this section as containing relocation
2048      entries for section "oc".  With this hack enabled, ".reloc"
2049      will be treated as a normal data section, which will avoid the
2050      segfault.  However, you won't be able to create an ELFNN binary
2051      with a section named "oc" that needs relocations, but that's
2052      the kind of ugly side-effects you get when detecting section
2053      types based on their names...  In practice, this limitation is
2054      unlikely to bite.  */
2055   if (strcmp (name, ".reloc") == 0)
2056     hdr->sh_type = SHT_PROGBITS;
2057
2058   return TRUE;
2059 }
2060
2061 /* Return the base VMA address which should be subtracted from real addresses
2062    when resolving @dtpoff relocation.
2063    This is PT_TLS segment p_vaddr.  */
2064
2065 static bfd_vma
2066 dtpoff_base (struct bfd_link_info *info)
2067 {
2068   /* If tls_sec is NULL, we should have signalled an error already.  */
2069   if (elf_hash_table (info)->tls_sec == NULL)
2070     return 0;
2071   return elf_hash_table (info)->tls_sec->vma;
2072 }
2073
2074 /* Return the relocation value for @tpoff relocation
2075    if STT_TLS virtual address is ADDRESS.  */
2076
2077 static bfd_vma
2078 tpoff (struct bfd_link_info *info, bfd_vma address)
2079 {
2080   struct elf_link_hash_table *htab = elf_hash_table (info);
2081
2082   /* If tls_sec is NULL, we should have signalled an error already.  */
2083   if (htab->tls_sec == NULL)
2084     return 0;
2085   return htab->tls_size + htab->tls_sec->vma - address;
2086 }
2087
2088 /* Relocate an i386 ELF section.  */
2089
2090 static bfd_boolean
2091 elf_i386_relocate_section (bfd *output_bfd,
2092                            struct bfd_link_info *info,
2093                            bfd *input_bfd,
2094                            asection *input_section,
2095                            bfd_byte *contents,
2096                            Elf_Internal_Rela *relocs,
2097                            Elf_Internal_Sym *local_syms,
2098                            asection **local_sections)
2099 {
2100   struct elf_i386_link_hash_table *htab;
2101   Elf_Internal_Shdr *symtab_hdr;
2102   struct elf_link_hash_entry **sym_hashes;
2103   bfd_vma *local_got_offsets;
2104   Elf_Internal_Rela *rel;
2105   Elf_Internal_Rela *relend;
2106
2107   htab = elf_i386_hash_table (info);
2108   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2109   sym_hashes = elf_sym_hashes (input_bfd);
2110   local_got_offsets = elf_local_got_offsets (input_bfd);
2111
2112   rel = relocs;
2113   relend = relocs + input_section->reloc_count;
2114   for (; rel < relend; rel++)
2115     {
2116       unsigned int r_type;
2117       reloc_howto_type *howto;
2118       unsigned long r_symndx;
2119       struct elf_link_hash_entry *h;
2120       Elf_Internal_Sym *sym;
2121       asection *sec;
2122       bfd_vma off;
2123       bfd_vma relocation;
2124       bfd_boolean unresolved_reloc;
2125       bfd_reloc_status_type r;
2126       unsigned int indx;
2127       int tls_type;
2128
2129       r_type = ELF32_R_TYPE (rel->r_info);
2130       if (r_type == R_386_GNU_VTINHERIT
2131           || r_type == R_386_GNU_VTENTRY)
2132         continue;
2133
2134       if ((indx = r_type) >= R_386_standard
2135           && ((indx = r_type - R_386_ext_offset) - R_386_standard
2136               >= R_386_ext - R_386_standard)
2137           && ((indx = r_type - R_386_tls_offset) - R_386_ext
2138               >= R_386_tls - R_386_ext))
2139         {
2140           (*_bfd_error_handler)
2141             (_("%B: unrecognized relocation (0x%x) in section `%A'"),
2142              input_bfd, input_section, r_type);
2143           bfd_set_error (bfd_error_bad_value);
2144           return FALSE;
2145         }
2146       howto = elf_howto_table + indx;
2147
2148       r_symndx = ELF32_R_SYM (rel->r_info);
2149
2150       if (info->relocatable)
2151         {
2152           bfd_vma val;
2153           bfd_byte *where;
2154
2155           /* This is a relocatable link.  We don't have to change
2156              anything, unless the reloc is against a section symbol,
2157              in which case we have to adjust according to where the
2158              section symbol winds up in the output section.  */
2159           if (r_symndx >= symtab_hdr->sh_info)
2160             continue;
2161
2162           sym = local_syms + r_symndx;
2163           if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2164             continue;
2165
2166           sec = local_sections[r_symndx];
2167           val = sec->output_offset;
2168           if (val == 0)
2169             continue;
2170
2171           where = contents + rel->r_offset;
2172           switch (howto->size)
2173             {
2174               /* FIXME: overflow checks.  */
2175             case 0:
2176               val += bfd_get_8 (input_bfd, where);
2177               bfd_put_8 (input_bfd, val, where);
2178               break;
2179             case 1:
2180               val += bfd_get_16 (input_bfd, where);
2181               bfd_put_16 (input_bfd, val, where);
2182               break;
2183             case 2:
2184               val += bfd_get_32 (input_bfd, where);
2185               bfd_put_32 (input_bfd, val, where);
2186               break;
2187             default:
2188               abort ();
2189             }
2190           continue;
2191         }
2192
2193       /* This is a final link.  */
2194       h = NULL;
2195       sym = NULL;
2196       sec = NULL;
2197       unresolved_reloc = FALSE;
2198       if (r_symndx < symtab_hdr->sh_info)
2199         {
2200           sym = local_syms + r_symndx;
2201           sec = local_sections[r_symndx];
2202           relocation = (sec->output_section->vma
2203                         + sec->output_offset
2204                         + sym->st_value);
2205           if ((sec->flags & SEC_MERGE)
2206               && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2207             {
2208               asection *msec;
2209               bfd_vma addend;
2210               bfd_byte *where = contents + rel->r_offset;
2211
2212               switch (howto->size)
2213                 {
2214                 case 0:
2215                   addend = bfd_get_8 (input_bfd, where);
2216                   if (howto->pc_relative)
2217                     {
2218                       addend = (addend ^ 0x80) - 0x80;
2219                       addend += 1;
2220                     }
2221                   break;
2222                 case 1:
2223                   addend = bfd_get_16 (input_bfd, where);
2224                   if (howto->pc_relative)
2225                     {
2226                       addend = (addend ^ 0x8000) - 0x8000;
2227                       addend += 2;
2228                     }
2229                   break;
2230                 case 2:
2231                   addend = bfd_get_32 (input_bfd, where);
2232                   if (howto->pc_relative)
2233                     {
2234                       addend = (addend ^ 0x80000000) - 0x80000000;
2235                       addend += 4;
2236                     }
2237                   break;
2238                 default:
2239                   abort ();
2240                 }
2241
2242               msec = sec;
2243               addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend);
2244               addend -= relocation;
2245               addend += msec->output_section->vma + msec->output_offset;
2246
2247               switch (howto->size)
2248                 {
2249                 case 0:
2250                   /* FIXME: overflow checks.  */
2251                   if (howto->pc_relative)
2252                     addend -= 1;
2253                   bfd_put_8 (input_bfd, addend, where);
2254                   break;
2255                 case 1:
2256                   if (howto->pc_relative)
2257                     addend -= 2;
2258                   bfd_put_16 (input_bfd, addend, where);
2259                   break;
2260                 case 2:
2261                   if (howto->pc_relative)
2262                     addend -= 4;
2263                   bfd_put_32 (input_bfd, addend, where);
2264                   break;
2265                 }
2266             }
2267         }
2268       else
2269         {
2270           bfd_boolean warned;
2271
2272           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2273                                    r_symndx, symtab_hdr, sym_hashes,
2274                                    h, sec, relocation,
2275                                    unresolved_reloc, warned);
2276         }
2277
2278       if (r_symndx == 0)
2279         {
2280         /* r_symndx will be zero only for relocs against symbols from
2281            removed linkonce sections, or sections discarded by a linker
2282            script.  For these relocs, we just want the section contents
2283            zeroed.  Avoid any special processing in the switch below.  */
2284           r_type = R_386_NONE;
2285
2286           relocation = 0;
2287           if (howto->pc_relative)
2288             relocation = (input_section->output_section->vma
2289                           + input_section->output_offset
2290                           + rel->r_offset);
2291         }
2292
2293       switch (r_type)
2294         {
2295         case R_386_GOT32:
2296           /* Relocation is to the entry for this symbol in the global
2297              offset table.  */
2298           if (htab->sgot == NULL)
2299             abort ();
2300
2301           if (h != NULL)
2302             {
2303               bfd_boolean dyn;
2304
2305               off = h->got.offset;
2306               dyn = htab->elf.dynamic_sections_created;
2307               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2308                   || (info->shared
2309                       && SYMBOL_REFERENCES_LOCAL (info, h))
2310                   || (ELF_ST_VISIBILITY (h->other)
2311                       && h->root.type == bfd_link_hash_undefweak))
2312                 {
2313                   /* This is actually a static link, or it is a
2314                      -Bsymbolic link and the symbol is defined
2315                      locally, or the symbol was forced to be local
2316                      because of a version file.  We must initialize
2317                      this entry in the global offset table.  Since the
2318                      offset must always be a multiple of 4, we use the
2319                      least significant bit to record whether we have
2320                      initialized it already.
2321
2322                      When doing a dynamic link, we create a .rel.got
2323                      relocation entry to initialize the value.  This
2324                      is done in the finish_dynamic_symbol routine.  */
2325                   if ((off & 1) != 0)
2326                     off &= ~1;
2327                   else
2328                     {
2329                       bfd_put_32 (output_bfd, relocation,
2330                                   htab->sgot->contents + off);
2331                       h->got.offset |= 1;
2332                     }
2333                 }
2334               else
2335                 unresolved_reloc = FALSE;
2336             }
2337           else
2338             {
2339               if (local_got_offsets == NULL)
2340                 abort ();
2341
2342               off = local_got_offsets[r_symndx];
2343
2344               /* The offset must always be a multiple of 4.  We use
2345                  the least significant bit to record whether we have
2346                  already generated the necessary reloc.  */
2347               if ((off & 1) != 0)
2348                 off &= ~1;
2349               else
2350                 {
2351                   bfd_put_32 (output_bfd, relocation,
2352                               htab->sgot->contents + off);
2353
2354                   if (info->shared)
2355                     {
2356                       asection *s;
2357                       Elf_Internal_Rela outrel;
2358                       bfd_byte *loc;
2359
2360                       s = htab->srelgot;
2361                       if (s == NULL)
2362                         abort ();
2363
2364                       outrel.r_offset = (htab->sgot->output_section->vma
2365                                          + htab->sgot->output_offset
2366                                          + off);
2367                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2368                       loc = s->contents;
2369                       loc += s->reloc_count++ * sizeof (Elf32_External_Rel);
2370                       bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2371                     }
2372
2373                   local_got_offsets[r_symndx] |= 1;
2374                 }
2375             }
2376
2377           if (off >= (bfd_vma) -2)
2378             abort ();
2379
2380           relocation = htab->sgot->output_section->vma
2381                        + htab->sgot->output_offset + off
2382                        - htab->sgotplt->output_section->vma
2383                        - htab->sgotplt->output_offset;
2384           break;
2385
2386         case R_386_GOTOFF:
2387           /* Relocation is relative to the start of the global offset
2388              table.  */
2389
2390           /* Check to make sure it isn't a protected function symbol
2391              for shared library since it may not be local when used
2392              as function address.  */
2393           if (info->shared
2394               && !info->executable
2395               && h
2396               && h->def_regular
2397               && h->type == STT_FUNC
2398               && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2399             {
2400               (*_bfd_error_handler)
2401                 (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
2402                  input_bfd, h->root.root.string);
2403               bfd_set_error (bfd_error_bad_value);
2404               return FALSE;
2405             }
2406
2407           /* Note that sgot is not involved in this
2408              calculation.  We always want the start of .got.plt.  If we
2409              defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
2410              permitted by the ABI, we might have to change this
2411              calculation.  */
2412           relocation -= htab->sgotplt->output_section->vma
2413                         + htab->sgotplt->output_offset;
2414           break;
2415
2416         case R_386_GOTPC:
2417           /* Use global offset table as symbol value.  */
2418           relocation = htab->sgotplt->output_section->vma
2419                        + htab->sgotplt->output_offset;
2420           unresolved_reloc = FALSE;
2421           break;
2422
2423         case R_386_PLT32:
2424           /* Relocation is to the entry for this symbol in the
2425              procedure linkage table.  */
2426
2427           /* Resolve a PLT32 reloc against a local symbol directly,
2428              without using the procedure linkage table.  */
2429           if (h == NULL)
2430             break;
2431
2432           if (h->plt.offset == (bfd_vma) -1
2433               || htab->splt == NULL)
2434             {
2435               /* We didn't make a PLT entry for this symbol.  This
2436                  happens when statically linking PIC code, or when
2437                  using -Bsymbolic.  */
2438               break;
2439             }
2440
2441           relocation = (htab->splt->output_section->vma
2442                         + htab->splt->output_offset
2443                         + h->plt.offset);
2444           unresolved_reloc = FALSE;
2445           break;
2446
2447         case R_386_32:
2448         case R_386_PC32:
2449           if ((input_section->flags & SEC_ALLOC) == 0)
2450             break;
2451
2452           if ((info->shared
2453                && (h == NULL
2454                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2455                    || h->root.type != bfd_link_hash_undefweak)
2456                && (r_type != R_386_PC32
2457                    || !SYMBOL_CALLS_LOCAL (info, h)))
2458               || (ELIMINATE_COPY_RELOCS
2459                   && !info->shared
2460                   && h != NULL
2461                   && h->dynindx != -1
2462                   && !h->non_got_ref
2463                   && ((h->def_dynamic
2464                        && !h->def_regular)
2465                       || h->root.type == bfd_link_hash_undefweak
2466                       || h->root.type == bfd_link_hash_undefined)))
2467             {
2468               Elf_Internal_Rela outrel;
2469               bfd_byte *loc;
2470               bfd_boolean skip, relocate;
2471               asection *sreloc;
2472
2473               /* When generating a shared object, these relocations
2474                  are copied into the output file to be resolved at run
2475                  time.  */
2476
2477               skip = FALSE;
2478               relocate = FALSE;
2479
2480               outrel.r_offset =
2481                 _bfd_elf_section_offset (output_bfd, info, input_section,
2482                                          rel->r_offset);
2483               if (outrel.r_offset == (bfd_vma) -1)
2484                 skip = TRUE;
2485               else if (outrel.r_offset == (bfd_vma) -2)
2486                 skip = TRUE, relocate = TRUE;
2487               outrel.r_offset += (input_section->output_section->vma
2488                                   + input_section->output_offset);
2489
2490               if (skip)
2491                 memset (&outrel, 0, sizeof outrel);
2492               else if (h != NULL
2493                        && h->dynindx != -1
2494                        && (r_type == R_386_PC32
2495                            || !info->shared
2496                            || !info->symbolic
2497                            || !h->def_regular))
2498                 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2499               else
2500                 {
2501                   /* This symbol is local, or marked to become local.  */
2502                   relocate = TRUE;
2503                   outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2504                 }
2505
2506               sreloc = elf_section_data (input_section)->sreloc;
2507               if (sreloc == NULL)
2508                 abort ();
2509
2510               loc = sreloc->contents;
2511               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
2512               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2513
2514               /* If this reloc is against an external symbol, we do
2515                  not want to fiddle with the addend.  Otherwise, we
2516                  need to include the symbol value so that it becomes
2517                  an addend for the dynamic reloc.  */
2518               if (! relocate)
2519                 continue;
2520             }
2521           break;
2522
2523         case R_386_TLS_IE:
2524           if (info->shared)
2525             {
2526               Elf_Internal_Rela outrel;
2527               bfd_byte *loc;
2528               asection *sreloc;
2529
2530               outrel.r_offset = rel->r_offset
2531                                 + input_section->output_section->vma
2532                                 + input_section->output_offset;
2533               outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2534               sreloc = elf_section_data (input_section)->sreloc;
2535               if (sreloc == NULL)
2536                 abort ();
2537               loc = sreloc->contents;
2538               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
2539               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2540             }
2541           /* Fall through */
2542
2543         case R_386_TLS_GD:
2544         case R_386_TLS_IE_32:
2545         case R_386_TLS_GOTIE:
2546           r_type = elf_i386_tls_transition (info, r_type, h == NULL);
2547           tls_type = GOT_UNKNOWN;
2548           if (h == NULL && local_got_offsets)
2549             tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
2550           else if (h != NULL)
2551             {
2552               tls_type = elf_i386_hash_entry(h)->tls_type;
2553               if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE))
2554                 r_type = R_386_TLS_LE_32;
2555             }
2556           if (tls_type == GOT_TLS_IE)
2557             tls_type = GOT_TLS_IE_NEG;
2558           if (r_type == R_386_TLS_GD)
2559             {
2560               if (tls_type == GOT_TLS_IE_POS)
2561                 r_type = R_386_TLS_GOTIE;
2562               else if (tls_type & GOT_TLS_IE)
2563                 r_type = R_386_TLS_IE_32;
2564             }
2565
2566           if (r_type == R_386_TLS_LE_32)
2567             {
2568               BFD_ASSERT (! unresolved_reloc);
2569               if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
2570                 {
2571                   unsigned int val, type;
2572                   bfd_vma roff;
2573
2574                   /* GD->LE transition.  */
2575                   BFD_ASSERT (rel->r_offset >= 2);
2576                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2577                   BFD_ASSERT (type == 0x8d || type == 0x04);
2578                   BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2579                   BFD_ASSERT (bfd_get_8 (input_bfd,
2580                                          contents + rel->r_offset + 4)
2581                               == 0xe8);
2582                   BFD_ASSERT (rel + 1 < relend);
2583                   BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2584                   roff = rel->r_offset + 5;
2585                   val = bfd_get_8 (input_bfd,
2586                                    contents + rel->r_offset - 1);
2587                   if (type == 0x04)
2588                     {
2589                       /* leal foo(,%reg,1), %eax; call ___tls_get_addr
2590                          Change it into:
2591                          movl %gs:0, %eax; subl $foo@tpoff, %eax
2592                          (6 byte form of subl).  */
2593                       BFD_ASSERT (rel->r_offset >= 3);
2594                       BFD_ASSERT (bfd_get_8 (input_bfd,
2595                                              contents + rel->r_offset - 3)
2596                                   == 0x8d);
2597                       BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
2598                       memcpy (contents + rel->r_offset - 3,
2599                               "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2600                     }
2601                   else
2602                     {
2603                       BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2604                       if (rel->r_offset + 10 <= input_section->size
2605                           && bfd_get_8 (input_bfd,
2606                                         contents + rel->r_offset + 9) == 0x90)
2607                         {
2608                           /* leal foo(%reg), %eax; call ___tls_get_addr; nop
2609                              Change it into:
2610                              movl %gs:0, %eax; subl $foo@tpoff, %eax
2611                              (6 byte form of subl).  */
2612                           memcpy (contents + rel->r_offset - 2,
2613                                   "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2614                           roff = rel->r_offset + 6;
2615                         }
2616                       else
2617                         {
2618                           /* leal foo(%reg), %eax; call ___tls_get_addr
2619                              Change it into:
2620                              movl %gs:0, %eax; subl $foo@tpoff, %eax
2621                              (5 byte form of subl).  */
2622                           memcpy (contents + rel->r_offset - 2,
2623                                   "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
2624                         }
2625                     }
2626                   bfd_put_32 (output_bfd, tpoff (info, relocation),
2627                               contents + roff);
2628                   /* Skip R_386_PLT32.  */
2629                   rel++;
2630                   continue;
2631                 }
2632               else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
2633                 {
2634                   unsigned int val, type;
2635
2636                   /* IE->LE transition:
2637                      Originally it can be one of:
2638                      movl foo, %eax
2639                      movl foo, %reg
2640                      addl foo, %reg
2641                      We change it into:
2642                      movl $foo, %eax
2643                      movl $foo, %reg
2644                      addl $foo, %reg.  */
2645                   BFD_ASSERT (rel->r_offset >= 1);
2646                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2647                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2648                   if (val == 0xa1)
2649                     {
2650                       /* movl foo, %eax.  */
2651                       bfd_put_8 (output_bfd, 0xb8,
2652                                  contents + rel->r_offset - 1);
2653                     }
2654                   else
2655                     {
2656                       BFD_ASSERT (rel->r_offset >= 2);
2657                       type = bfd_get_8 (input_bfd,
2658                                         contents + rel->r_offset - 2);
2659                       switch (type)
2660                         {
2661                         case 0x8b:
2662                           /* movl */
2663                           BFD_ASSERT ((val & 0xc7) == 0x05);
2664                           bfd_put_8 (output_bfd, 0xc7,
2665                                      contents + rel->r_offset - 2);
2666                           bfd_put_8 (output_bfd,
2667                                      0xc0 | ((val >> 3) & 7),
2668                                      contents + rel->r_offset - 1);
2669                           break;
2670                         case 0x03:
2671                           /* addl */
2672                           BFD_ASSERT ((val & 0xc7) == 0x05);
2673                           bfd_put_8 (output_bfd, 0x81,
2674                                      contents + rel->r_offset - 2);
2675                           bfd_put_8 (output_bfd,
2676                                      0xc0 | ((val >> 3) & 7),
2677                                      contents + rel->r_offset - 1);
2678                           break;
2679                         default:
2680                           BFD_FAIL ();
2681                           break;
2682                         }
2683                     }
2684                   bfd_put_32 (output_bfd, -tpoff (info, relocation),
2685                               contents + rel->r_offset);
2686                   continue;
2687                 }
2688               else
2689                 {
2690                   unsigned int val, type;
2691
2692                   /* {IE_32,GOTIE}->LE transition:
2693                      Originally it can be one of:
2694                      subl foo(%reg1), %reg2
2695                      movl foo(%reg1), %reg2
2696                      addl foo(%reg1), %reg2
2697                      We change it into:
2698                      subl $foo, %reg2
2699                      movl $foo, %reg2 (6 byte form)
2700                      addl $foo, %reg2.  */
2701                   BFD_ASSERT (rel->r_offset >= 2);
2702                   type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2703                   val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2704                   BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
2705                   BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4);
2706                   if (type == 0x8b)
2707                     {
2708                       /* movl */
2709                       bfd_put_8 (output_bfd, 0xc7,
2710                                  contents + rel->r_offset - 2);
2711                       bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2712                                  contents + rel->r_offset - 1);
2713                     }
2714                   else if (type == 0x2b)
2715                     {
2716                       /* subl */
2717                       bfd_put_8 (output_bfd, 0x81,
2718                                  contents + rel->r_offset - 2);
2719                       bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
2720                                  contents + rel->r_offset - 1);
2721                     }
2722                   else if (type == 0x03)
2723                     {
2724                       /* addl */
2725                       bfd_put_8 (output_bfd, 0x81,
2726                                  contents + rel->r_offset - 2);
2727                       bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2728                                  contents + rel->r_offset - 1);
2729                     }
2730                   else
2731                     BFD_FAIL ();
2732                   if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
2733                     bfd_put_32 (output_bfd, -tpoff (info, relocation),
2734                                 contents + rel->r_offset);
2735                   else
2736                     bfd_put_32 (output_bfd, tpoff (info, relocation),
2737                                 contents + rel->r_offset);
2738                   continue;
2739                 }
2740             }
2741
2742           if (htab->sgot == NULL)
2743             abort ();
2744
2745           if (h != NULL)
2746             off = h->got.offset;
2747           else
2748             {
2749               if (local_got_offsets == NULL)
2750                 abort ();
2751
2752               off = local_got_offsets[r_symndx];
2753             }
2754
2755           if ((off & 1) != 0)
2756             off &= ~1;
2757           else
2758             {
2759               Elf_Internal_Rela outrel;
2760               bfd_byte *loc;
2761               int dr_type, indx;
2762
2763               if (htab->srelgot == NULL)
2764                 abort ();
2765
2766               outrel.r_offset = (htab->sgot->output_section->vma
2767                                  + htab->sgot->output_offset + off);
2768
2769               indx = h && h->dynindx != -1 ? h->dynindx : 0;
2770               if (r_type == R_386_TLS_GD)
2771                 dr_type = R_386_TLS_DTPMOD32;
2772               else if (tls_type == GOT_TLS_IE_POS)
2773                 dr_type = R_386_TLS_TPOFF;
2774               else
2775                 dr_type = R_386_TLS_TPOFF32;
2776               if (dr_type == R_386_TLS_TPOFF && indx == 0)
2777                 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
2778                             htab->sgot->contents + off);
2779               else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
2780                 bfd_put_32 (output_bfd, dtpoff_base (info) - relocation,
2781                             htab->sgot->contents + off);
2782               else
2783                 bfd_put_32 (output_bfd, 0,
2784                             htab->sgot->contents + off);
2785               outrel.r_info = ELF32_R_INFO (indx, dr_type);
2786               loc = htab->srelgot->contents;
2787               loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
2788               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2789
2790               if (r_type == R_386_TLS_GD)
2791                 {
2792                   if (indx == 0)
2793                     {
2794                       BFD_ASSERT (! unresolved_reloc);
2795                       bfd_put_32 (output_bfd,
2796                                   relocation - dtpoff_base (info),
2797                                   htab->sgot->contents + off + 4);
2798                     }
2799                   else
2800                     {
2801                       bfd_put_32 (output_bfd, 0,
2802                                   htab->sgot->contents + off + 4);
2803                       outrel.r_info = ELF32_R_INFO (indx,
2804                                                     R_386_TLS_DTPOFF32);
2805                       outrel.r_offset += 4;
2806                       htab->srelgot->reloc_count++;
2807                       loc += sizeof (Elf32_External_Rel);
2808                       bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2809                     }
2810                 }
2811               else if (tls_type == GOT_TLS_IE_BOTH)
2812                 {
2813                   bfd_put_32 (output_bfd,
2814                               indx == 0 ? relocation - dtpoff_base (info) : 0,
2815                               htab->sgot->contents + off + 4);
2816                   outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
2817                   outrel.r_offset += 4;
2818                   htab->srelgot->reloc_count++;
2819                   loc += sizeof (Elf32_External_Rel);
2820                   bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2821                 }
2822
2823               if (h != NULL)
2824                 h->got.offset |= 1;
2825               else
2826                 local_got_offsets[r_symndx] |= 1;
2827             }
2828
2829           if (off >= (bfd_vma) -2)
2830             abort ();
2831           if (r_type == ELF32_R_TYPE (rel->r_info))
2832             {
2833               bfd_vma g_o_t = htab->sgotplt->output_section->vma
2834                               + htab->sgotplt->output_offset;
2835               relocation = htab->sgot->output_section->vma
2836                            + htab->sgot->output_offset + off - g_o_t;
2837               if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
2838                   && tls_type == GOT_TLS_IE_BOTH)
2839                 relocation += 4;
2840               if (r_type == R_386_TLS_IE)
2841                 relocation += g_o_t;
2842               unresolved_reloc = FALSE;
2843             }
2844           else
2845             {
2846               unsigned int val, type;
2847               bfd_vma roff;
2848
2849               /* GD->IE transition.  */
2850               BFD_ASSERT (rel->r_offset >= 2);
2851               type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2852               BFD_ASSERT (type == 0x8d || type == 0x04);
2853               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2854               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2855                           == 0xe8);
2856               BFD_ASSERT (rel + 1 < relend);
2857               BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2858               roff = rel->r_offset - 3;
2859               val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2860               if (type == 0x04)
2861                 {
2862                   /* leal foo(,%reg,1), %eax; call ___tls_get_addr
2863                      Change it into:
2864                      movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
2865                   BFD_ASSERT (rel->r_offset >= 3);
2866                   BFD_ASSERT (bfd_get_8 (input_bfd,
2867                                          contents + rel->r_offset - 3)
2868                               == 0x8d);
2869                   BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
2870                   val >>= 3;
2871                 }
2872               else
2873                 {
2874                   /* leal foo(%reg), %eax; call ___tls_get_addr; nop
2875                      Change it into:
2876                      movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
2877                   BFD_ASSERT (rel->r_offset + 10 <= input_section->size);
2878                   BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2879                   BFD_ASSERT (bfd_get_8 (input_bfd,
2880                                          contents + rel->r_offset + 9)
2881                               == 0x90);
2882                   roff = rel->r_offset - 2;
2883                 }
2884               memcpy (contents + roff,
2885                       "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
2886               contents[roff + 7] = 0x80 | (val & 7);
2887               /* If foo is used only with foo@gotntpoff(%reg) and
2888                  foo@indntpoff, but not with foo@gottpoff(%reg), change
2889                  subl $foo@gottpoff(%reg), %eax
2890                  into:
2891                  addl $foo@gotntpoff(%reg), %eax.  */
2892               if (r_type == R_386_TLS_GOTIE)
2893                 {
2894                   contents[roff + 6] = 0x03;
2895                   if (tls_type == GOT_TLS_IE_BOTH)
2896                     off += 4;
2897                 }
2898               bfd_put_32 (output_bfd,
2899                           htab->sgot->output_section->vma
2900                           + htab->sgot->output_offset + off
2901                           - htab->sgotplt->output_section->vma
2902                           - htab->sgotplt->output_offset,
2903                           contents + roff + 8);
2904               /* Skip R_386_PLT32.  */
2905               rel++;
2906               continue;
2907             }
2908           break;
2909
2910         case R_386_TLS_LDM:
2911           if (! info->shared)
2912             {
2913               unsigned int val;
2914
2915               /* LD->LE transition:
2916                  Ensure it is:
2917                  leal foo(%reg), %eax; call ___tls_get_addr.
2918                  We change it into:
2919                  movl %gs:0, %eax; nop; leal 0(%esi,1), %esi.  */
2920               BFD_ASSERT (rel->r_offset >= 2);
2921               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
2922                           == 0x8d);
2923               val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
2924               BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
2925               BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
2926               BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
2927                           == 0xe8);
2928               BFD_ASSERT (rel + 1 < relend);
2929               BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2930               memcpy (contents + rel->r_offset - 2,
2931                       "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
2932               /* Skip R_386_PLT32.  */
2933               rel++;
2934               continue;
2935             }
2936
2937           if (htab->sgot == NULL)
2938             abort ();
2939
2940           off = htab->tls_ldm_got.offset;
2941           if (off & 1)
2942             off &= ~1;
2943           else
2944             {
2945               Elf_Internal_Rela outrel;
2946               bfd_byte *loc;
2947
2948               if (htab->srelgot == NULL)
2949                 abort ();
2950
2951               outrel.r_offset = (htab->sgot->output_section->vma
2952                                  + htab->sgot->output_offset + off);
2953
2954               bfd_put_32 (output_bfd, 0,
2955                           htab->sgot->contents + off);
2956               bfd_put_32 (output_bfd, 0,
2957                           htab->sgot->contents + off + 4);
2958               outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
2959               loc = htab->srelgot->contents;
2960               loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
2961               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2962               htab->tls_ldm_got.offset |= 1;
2963             }
2964           relocation = htab->sgot->output_section->vma
2965                        + htab->sgot->output_offset + off
2966                        - htab->sgotplt->output_section->vma
2967                        - htab->sgotplt->output_offset;
2968           unresolved_reloc = FALSE;
2969           break;
2970
2971         case R_386_TLS_LDO_32:
2972           if (info->shared || (input_section->flags & SEC_CODE) == 0)
2973             relocation -= dtpoff_base (info);
2974           else
2975             /* When converting LDO to LE, we must negate.  */
2976             relocation = -tpoff (info, relocation);
2977           break;
2978
2979         case R_386_TLS_LE_32:
2980         case R_386_TLS_LE:
2981           if (info->shared)
2982             {
2983               Elf_Internal_Rela outrel;
2984               asection *sreloc;
2985               bfd_byte *loc;
2986               int indx;
2987
2988               outrel.r_offset = rel->r_offset
2989                                 + input_section->output_section->vma
2990                                 + input_section->output_offset;
2991               if (h != NULL && h->dynindx != -1)
2992                 indx = h->dynindx;
2993               else
2994                 indx = 0;
2995               if (r_type == R_386_TLS_LE_32)
2996                 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
2997               else
2998                 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
2999               sreloc = elf_section_data (input_section)->sreloc;
3000               if (sreloc == NULL)
3001                 abort ();
3002               loc = sreloc->contents;
3003               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3004               bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3005               if (indx)
3006                 continue;
3007               else if (r_type == R_386_TLS_LE_32)
3008                 relocation = dtpoff_base (info) - relocation;
3009               else
3010                 relocation -= dtpoff_base (info);
3011             }
3012           else if (r_type == R_386_TLS_LE_32)
3013             relocation = tpoff (info, relocation);
3014           else
3015             relocation = -tpoff (info, relocation);
3016           break;
3017
3018         default:
3019           break;
3020         }
3021
3022       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3023          because such sections are not SEC_ALLOC and thus ld.so will
3024          not process them.  */
3025       if (unresolved_reloc
3026           && !((input_section->flags & SEC_DEBUGGING) != 0
3027                && h->def_dynamic))
3028         {
3029           (*_bfd_error_handler)
3030             (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
3031              input_bfd,
3032              input_section,
3033              (long) rel->r_offset,
3034              h->root.root.string);
3035           return FALSE;
3036         }
3037
3038       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3039                                     contents, rel->r_offset,
3040                                     relocation, 0);
3041
3042       if (r != bfd_reloc_ok)
3043         {
3044           const char *name;
3045
3046           if (h != NULL)
3047             name = h->root.root.string;
3048           else
3049             {
3050               name = bfd_elf_string_from_elf_section (input_bfd,
3051                                                       symtab_hdr->sh_link,
3052                                                       sym->st_name);
3053               if (name == NULL)
3054                 return FALSE;
3055               if (*name == '\0')
3056                 name = bfd_section_name (input_bfd, sec);
3057             }
3058
3059           if (r == bfd_reloc_overflow)
3060             {
3061               if (! ((*info->callbacks->reloc_overflow)
3062                      (info, (h ? &h->root : NULL), name, howto->name,
3063                       (bfd_vma) 0, input_bfd, input_section,
3064                       rel->r_offset)))
3065                 return FALSE;
3066             }
3067           else
3068             {
3069               (*_bfd_error_handler)
3070                 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3071                  input_bfd, input_section,
3072                  (long) rel->r_offset, name, (int) r);
3073               return FALSE;
3074             }
3075         }
3076     }
3077
3078   return TRUE;
3079 }
3080
3081 /* Finish up dynamic symbol handling.  We set the contents of various
3082    dynamic sections here.  */
3083
3084 static bfd_boolean
3085 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
3086                                 struct bfd_link_info *info,
3087                                 struct elf_link_hash_entry *h,
3088                                 Elf_Internal_Sym *sym)
3089 {
3090   struct elf_i386_link_hash_table *htab;
3091
3092   htab = elf_i386_hash_table (info);
3093
3094   if (h->plt.offset != (bfd_vma) -1)
3095     {
3096       bfd_vma plt_index;
3097       bfd_vma got_offset;
3098       Elf_Internal_Rela rel;
3099       bfd_byte *loc;
3100
3101       /* This symbol has an entry in the procedure linkage table.  Set
3102          it up.  */
3103
3104       if (h->dynindx == -1
3105           || htab->splt == NULL
3106           || htab->sgotplt == NULL
3107           || htab->srelplt == NULL)
3108         abort ();
3109
3110       /* Get the index in the procedure linkage table which
3111          corresponds to this symbol.  This is the index of this symbol
3112          in all the symbols for which we are making plt entries.  The
3113          first entry in the procedure linkage table is reserved.  */
3114       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3115
3116       /* Get the offset into the .got table of the entry that
3117          corresponds to this function.  Each .got entry is 4 bytes.
3118          The first three are reserved.  */
3119       got_offset = (plt_index + 3) * 4;
3120
3121       /* Fill in the entry in the procedure linkage table.  */
3122       if (! info->shared)
3123         {
3124           memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
3125                   PLT_ENTRY_SIZE);
3126           bfd_put_32 (output_bfd,
3127                       (htab->sgotplt->output_section->vma
3128                        + htab->sgotplt->output_offset
3129                        + got_offset),
3130                       htab->splt->contents + h->plt.offset + 2);
3131
3132           if (htab->is_vxworks)
3133             {
3134               int s, k, reloc_index;
3135
3136               /* Create the R_386_32 relocation referencing the GOT
3137                  for this PLT entry.  */
3138
3139               /* S: Current slot number (zero-based).  */
3140               s = (h->plt.offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3141               /* K: Number of relocations for PLTResolve. */
3142               if (info->shared)
3143                 k = PLTRESOLVE_RELOCS_SHLIB;
3144               else
3145                 k = PLTRESOLVE_RELOCS;
3146               /* Skip the PLTresolve relocations, and the relocations for
3147                  the other PLT slots. */
3148               reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
3149               loc = (htab->srelplt2->contents + reloc_index
3150                      * sizeof (Elf32_External_Rel));
3151
3152               rel.r_offset = (htab->splt->output_section->vma
3153                               + htab->splt->output_offset
3154                               + h->plt.offset + 2),
3155               rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32);
3156               bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3157
3158               /* Create the R_386_32 relocation referencing the beginning of
3159                  the PLT for this GOT entry.  */
3160               rel.r_offset = (htab->sgotplt->output_section->vma
3161                               + htab->sgotplt->output_offset
3162                               + got_offset);
3163               rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32);
3164               bfd_elf32_swap_reloc_out (output_bfd, &rel,
3165               loc + sizeof (Elf32_External_Rel));
3166             }
3167         }
3168       else
3169         {
3170           memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
3171                   PLT_ENTRY_SIZE);
3172           bfd_put_32 (output_bfd, got_offset,
3173                       htab->splt->contents + h->plt.offset + 2);
3174         }
3175
3176       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
3177                   htab->splt->contents + h->plt.offset + 7);
3178       bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
3179                   htab->splt->contents + h->plt.offset + 12);
3180
3181       /* Fill in the entry in the global offset table.  */
3182       bfd_put_32 (output_bfd,
3183                   (htab->splt->output_section->vma
3184                    + htab->splt->output_offset
3185                    + h->plt.offset
3186                    + 6),
3187                   htab->sgotplt->contents + got_offset);
3188
3189       /* Fill in the entry in the .rel.plt section.  */
3190       rel.r_offset = (htab->sgotplt->output_section->vma
3191                       + htab->sgotplt->output_offset
3192                       + got_offset);
3193       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
3194       loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel);
3195       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3196
3197       if (!h->def_regular)
3198         {
3199           /* Mark the symbol as undefined, rather than as defined in
3200              the .plt section.  Leave the value if there were any
3201              relocations where pointer equality matters (this is a clue
3202              for the dynamic linker, to make function pointer
3203              comparisons work between an application and shared
3204              library), otherwise set it to zero.  If a function is only
3205              called from a binary, there is no need to slow down
3206              shared libraries because of that.  */
3207           sym->st_shndx = SHN_UNDEF;
3208           if (!h->pointer_equality_needed)
3209             sym->st_value = 0;
3210         }
3211     }
3212
3213   if (h->got.offset != (bfd_vma) -1
3214       && elf_i386_hash_entry(h)->tls_type != GOT_TLS_GD
3215       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
3216     {
3217       Elf_Internal_Rela rel;
3218       bfd_byte *loc;
3219
3220       /* This symbol has an entry in the global offset table.  Set it
3221          up.  */
3222
3223       if (htab->sgot == NULL || htab->srelgot == NULL)
3224         abort ();
3225
3226       rel.r_offset = (htab->sgot->output_section->vma
3227                       + htab->sgot->output_offset
3228                       + (h->got.offset & ~(bfd_vma) 1));
3229
3230       /* If this is a static link, or it is a -Bsymbolic link and the
3231          symbol is defined locally or was forced to be local because
3232          of a version file, we just want to emit a RELATIVE reloc.
3233          The entry in the global offset table will already have been
3234          initialized in the relocate_section function.  */
3235       if (info->shared
3236           && SYMBOL_REFERENCES_LOCAL (info, h))
3237         {
3238           BFD_ASSERT((h->got.offset & 1) != 0);
3239           rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3240         }
3241       else
3242         {
3243           BFD_ASSERT((h->got.offset & 1) == 0);
3244           bfd_put_32 (output_bfd, (bfd_vma) 0,
3245                       htab->sgot->contents + h->got.offset);
3246           rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
3247         }
3248
3249       loc = htab->srelgot->contents;
3250       loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
3251       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3252     }
3253
3254   if (h->needs_copy)
3255     {
3256       Elf_Internal_Rela rel;
3257       bfd_byte *loc;
3258
3259       /* This symbol needs a copy reloc.  Set it up.  */
3260
3261       if (h->dynindx == -1
3262           || (h->root.type != bfd_link_hash_defined
3263               && h->root.type != bfd_link_hash_defweak)
3264           || htab->srelbss == NULL)
3265         abort ();
3266
3267       rel.r_offset = (h->root.u.def.value
3268                       + h->root.u.def.section->output_section->vma
3269                       + h->root.u.def.section->output_offset);
3270       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
3271       loc = htab->srelbss->contents;
3272       loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel);
3273       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3274     }
3275
3276   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.
3277      On VxWorks, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it
3278      is relative to the ".got" section.  */
3279   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3280       || (strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3281           && !htab->is_vxworks))
3282     sym->st_shndx = SHN_ABS;
3283
3284   return TRUE;
3285 }
3286
3287 /* Used to decide how to sort relocs in an optimal manner for the
3288    dynamic linker, before writing them out.  */
3289
3290 static enum elf_reloc_type_class
3291 elf_i386_reloc_type_class (const Elf_Internal_Rela *rela)
3292 {
3293   switch (ELF32_R_TYPE (rela->r_info))
3294     {
3295     case R_386_RELATIVE:
3296       return reloc_class_relative;
3297     case R_386_JUMP_SLOT:
3298       return reloc_class_plt;
3299     case R_386_COPY:
3300       return reloc_class_copy;
3301     default:
3302       return reloc_class_normal;
3303     }
3304 }
3305
3306 /* Finish up the dynamic sections.  */
3307
3308 static bfd_boolean
3309 elf_i386_finish_dynamic_sections (bfd *output_bfd,
3310                                   struct bfd_link_info *info)
3311 {
3312   struct elf_i386_link_hash_table *htab;
3313   bfd *dynobj;
3314   asection *sdyn;
3315
3316   htab = elf_i386_hash_table (info);
3317   dynobj = htab->elf.dynobj;
3318   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3319
3320   if (htab->elf.dynamic_sections_created)
3321     {
3322       Elf32_External_Dyn *dyncon, *dynconend;
3323
3324       if (sdyn == NULL || htab->sgot == NULL)
3325         abort ();
3326
3327       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3328       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3329       for (; dyncon < dynconend; dyncon++)
3330         {
3331           Elf_Internal_Dyn dyn;
3332           asection *s;
3333
3334           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3335
3336           switch (dyn.d_tag)
3337             {
3338             default:
3339               continue;
3340
3341             case DT_PLTGOT:
3342               s = htab->sgotplt;
3343               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3344               break;
3345
3346             case DT_JMPREL:
3347               s = htab->srelplt;
3348               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3349               break;
3350
3351             case DT_PLTRELSZ:
3352               s = htab->srelplt;
3353               dyn.d_un.d_val = s->size;
3354               break;
3355
3356             case DT_RELSZ:
3357               /* My reading of the SVR4 ABI indicates that the
3358                  procedure linkage table relocs (DT_JMPREL) should be
3359                  included in the overall relocs (DT_REL).  This is
3360                  what Solaris does.  However, UnixWare can not handle
3361                  that case.  Therefore, we override the DT_RELSZ entry
3362                  here to make it not include the JMPREL relocs.  */
3363               s = htab->srelplt;
3364               if (s == NULL)
3365                 continue;
3366               dyn.d_un.d_val -= s->size;
3367               break;
3368
3369             case DT_REL:
3370               /* We may not be using the standard ELF linker script.
3371                  If .rel.plt is the first .rel section, we adjust
3372                  DT_REL to not include it.  */
3373               s = htab->srelplt;
3374               if (s == NULL)
3375                 continue;
3376               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
3377                 continue;
3378               dyn.d_un.d_ptr += s->size;
3379               break;
3380             }
3381
3382           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3383         }
3384
3385       /* Fill in the first entry in the procedure linkage table.  */
3386       if (htab->splt && htab->splt->size > 0)
3387         {
3388           if (info->shared)
3389             {
3390               memcpy (htab->splt->contents, elf_i386_pic_plt0_entry,
3391                       sizeof (elf_i386_pic_plt0_entry));
3392               memset (htab->splt->contents + sizeof (elf_i386_pic_plt0_entry),
3393                       htab->plt0_pad_byte,
3394                       PLT_ENTRY_SIZE - sizeof (elf_i386_pic_plt0_entry));
3395             }
3396           else
3397             {
3398               memcpy (htab->splt->contents, elf_i386_plt0_entry,
3399                       sizeof(elf_i386_plt0_entry));
3400               memset (htab->splt->contents + sizeof (elf_i386_plt0_entry),
3401                       htab->plt0_pad_byte,
3402                       PLT_ENTRY_SIZE - sizeof (elf_i386_plt0_entry));
3403               bfd_put_32 (output_bfd,
3404                           (htab->sgotplt->output_section->vma
3405                            + htab->sgotplt->output_offset
3406                            + 4),
3407                           htab->splt->contents + 2);
3408               bfd_put_32 (output_bfd,
3409                           (htab->sgotplt->output_section->vma
3410                            + htab->sgotplt->output_offset
3411                            + 8),
3412                           htab->splt->contents + 8);
3413
3414               if (htab->is_vxworks)
3415                 {
3416                   Elf_Internal_Rela rel;
3417                   struct elf_link_hash_entry *hgot;
3418
3419                   /* The VxWorks GOT is relocated by the dynamic linker.
3420                      Therefore, we must emit relocations rather than
3421                      simply computing the values now.  */
3422                   hgot = elf_link_hash_lookup (elf_hash_table (info),
3423                                                "_GLOBAL_OFFSET_TABLE_",
3424                                                FALSE, FALSE, FALSE);
3425                   /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
3426                      On IA32 we use REL relocations so the addend goes in
3427                      the PLT directly.  */
3428                   rel.r_offset = (htab->splt->output_section->vma
3429                                   + htab->splt->output_offset
3430                                   + 2);
3431                   rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32);
3432                   bfd_elf32_swap_reloc_out (output_bfd, &rel,
3433                                             htab->srelplt2->contents);
3434                   /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
3435                   rel.r_offset = (htab->splt->output_section->vma
3436                                   + htab->splt->output_offset
3437                                   + 8);
3438                   rel.r_info = ELF32_R_INFO (hgot->indx, R_386_32);
3439                   bfd_elf32_swap_reloc_out (output_bfd, &rel,
3440                                             htab->srelplt2->contents +
3441                                             sizeof (Elf32_External_Rel));
3442                 }
3443             }
3444
3445           /* UnixWare sets the entsize of .plt to 4, although that doesn't
3446              really seem like the right value.  */
3447           elf_section_data (htab->splt->output_section)
3448             ->this_hdr.sh_entsize = 4;
3449
3450           /* Correct the .rel.plt.unloaded relocations.  */
3451           if (htab->is_vxworks && !info->shared)
3452             {
3453               int num_plts = (htab->splt->size / PLT_ENTRY_SIZE) - 1;
3454               unsigned char *p;
3455
3456               p = htab->srelplt2->contents;
3457               if (info->shared)
3458                 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
3459               else
3460                 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
3461
3462               for (; num_plts; num_plts--)
3463                 {
3464                   Elf_Internal_Rela rel;
3465                   bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
3466                   rel.r_info = ELF32_R_INFO (htab->hgot->indx, R_386_32);
3467                   bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3468                   p += sizeof (Elf32_External_Rel);
3469
3470                   bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
3471                   rel.r_info = ELF32_R_INFO (htab->hplt->indx, R_386_32);
3472                   bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3473                   p += sizeof (Elf32_External_Rel);
3474                 }
3475             }
3476         }
3477     }
3478
3479   if (htab->sgotplt)
3480     {
3481       /* Fill in the first three entries in the global offset table.  */
3482       if (htab->sgotplt->size > 0)
3483         {
3484           bfd_put_32 (output_bfd,
3485                       (sdyn == NULL ? 0
3486                        : sdyn->output_section->vma + sdyn->output_offset),
3487                       htab->sgotplt->contents);
3488           bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 4);
3489           bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 8);
3490         }
3491
3492       elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
3493     }
3494
3495   if (htab->sgot && htab->sgot->size > 0)
3496     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3497
3498   return TRUE;
3499 }
3500
3501 /* Return address for Ith PLT stub in section PLT, for relocation REL
3502    or (bfd_vma) -1 if it should not be included.  */
3503
3504 static bfd_vma
3505 elf_i386_plt_sym_val (bfd_vma i, const asection *plt,
3506                       const arelent *rel ATTRIBUTE_UNUSED)
3507 {
3508   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3509 }
3510
3511
3512 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
3513 #define TARGET_LITTLE_NAME              "elf32-i386"
3514 #define ELF_ARCH                        bfd_arch_i386
3515 #define ELF_MACHINE_CODE                EM_386
3516 #define ELF_MAXPAGESIZE                 0x1000
3517
3518 #define elf_backend_can_gc_sections     1
3519 #define elf_backend_can_refcount        1
3520 #define elf_backend_want_got_plt        1
3521 #define elf_backend_plt_readonly        1
3522 #define elf_backend_want_plt_sym        0
3523 #define elf_backend_got_header_size     12
3524
3525 /* Support RELA for objdump of prelink objects.  */
3526 #define elf_info_to_howto                     elf_i386_info_to_howto_rel
3527 #define elf_info_to_howto_rel                 elf_i386_info_to_howto_rel
3528
3529 #define bfd_elf32_mkobject                    elf_i386_mkobject
3530
3531 #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
3532 #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
3533 #define bfd_elf32_bfd_reloc_type_lookup       elf_i386_reloc_type_lookup
3534
3535 #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
3536 #define elf_backend_check_relocs              elf_i386_check_relocs
3537 #define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
3538 #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
3539 #define elf_backend_fake_sections             elf_i386_fake_sections
3540 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
3541 #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
3542 #define elf_backend_gc_mark_hook              elf_i386_gc_mark_hook
3543 #define elf_backend_gc_sweep_hook             elf_i386_gc_sweep_hook
3544 #define elf_backend_grok_prstatus             elf_i386_grok_prstatus
3545 #define elf_backend_grok_psinfo               elf_i386_grok_psinfo
3546 #define elf_backend_reloc_type_class          elf_i386_reloc_type_class
3547 #define elf_backend_relocate_section          elf_i386_relocate_section
3548 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
3549 #define elf_backend_plt_sym_val               elf_i386_plt_sym_val
3550
3551 #include "elf32-target.h"
3552
3553 /* FreeBSD support.  */
3554
3555 #undef  TARGET_LITTLE_SYM
3556 #define TARGET_LITTLE_SYM               bfd_elf32_i386_freebsd_vec
3557 #undef  TARGET_LITTLE_NAME
3558 #define TARGET_LITTLE_NAME              "elf32-i386-freebsd"
3559
3560 /* The kernel recognizes executables as valid only if they carry a
3561    "FreeBSD" label in the ELF header.  So we put this label on all
3562    executables and (for simplicity) also all other object files.  */
3563
3564 static void
3565 elf_i386_post_process_headers (bfd *abfd,
3566                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
3567 {
3568   Elf_Internal_Ehdr *i_ehdrp;
3569
3570   i_ehdrp = elf_elfheader (abfd);
3571
3572   /* Put an ABI label supported by FreeBSD >= 4.1.  */
3573   i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
3574 #ifdef OLD_FREEBSD_ABI_LABEL
3575   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
3576   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
3577 #endif
3578 }
3579
3580 #undef  elf_backend_post_process_headers
3581 #define elf_backend_post_process_headers        elf_i386_post_process_headers
3582 #undef  elf32_bed
3583 #define elf32_bed                               elf32_i386_fbsd_bed
3584
3585 #include "elf32-target.h"
3586
3587 /* VxWorks support.  */
3588
3589 #undef  TARGET_LITTLE_SYM
3590 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vxworks_vec
3591 #undef  TARGET_LITTLE_NAME
3592 #define TARGET_LITTLE_NAME              "elf32-i386-vxworks"
3593
3594
3595 /* Like elf_i386_link_hash_table_create but with tweaks for VxWorks.  */
3596
3597 static struct bfd_link_hash_table *
3598 elf_i386_vxworks_link_hash_table_create (bfd *abfd)
3599 {
3600   struct bfd_link_hash_table *ret;
3601   struct elf_i386_link_hash_table *htab;
3602
3603   ret = elf_i386_link_hash_table_create (abfd);
3604   if (ret)
3605     {
3606       htab = (struct elf_i386_link_hash_table *) ret;
3607       htab->is_vxworks = 1;
3608       htab->plt0_pad_byte = 0x90;
3609     }
3610
3611   return ret;
3612 }
3613
3614
3615 /* Tweak magic VxWorks symbols as they are written to the output file.  */
3616 static bfd_boolean
3617 elf_i386_vxworks_link_output_symbol_hook (struct bfd_link_info *info
3618                                             ATTRIBUTE_UNUSED,
3619                                           const char *name,
3620                                           Elf_Internal_Sym *sym,
3621                                           asection *input_sec ATTRIBUTE_UNUSED,
3622                                           struct elf_link_hash_entry *h
3623                                             ATTRIBUTE_UNUSED)
3624 {
3625   /* Ignore the first dummy symbol.  */
3626   if (!name)
3627     return TRUE;
3628
3629   return elf_vxworks_link_output_symbol_hook (name, sym);
3630 }
3631
3632 #undef  elf_backend_post_process_headers
3633 #undef bfd_elf32_bfd_link_hash_table_create
3634 #define bfd_elf32_bfd_link_hash_table_create \
3635   elf_i386_vxworks_link_hash_table_create
3636 #undef elf_backend_add_symbol_hook
3637 #define elf_backend_add_symbol_hook \
3638   elf_vxworks_add_symbol_hook
3639 #undef elf_backend_link_output_symbol_hook
3640 #define elf_backend_link_output_symbol_hook \
3641   elf_i386_vxworks_link_output_symbol_hook
3642 #undef elf_backend_emit_relocs
3643 #define elf_backend_emit_relocs                 elf_vxworks_emit_relocs
3644 #undef elf_backend_final_write_processing
3645 #define elf_backend_final_write_processing \
3646   elf_vxworks_final_write_processing
3647
3648 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
3649    define it.  */
3650 #undef elf_backend_want_plt_sym
3651 #define elf_backend_want_plt_sym        1
3652
3653 #undef  elf32_bed
3654 #define elf32_bed                               elf32_i386_vxworks_bed
3655
3656 #include "elf32-target.h"