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