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