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