xref: /dragonfly/contrib/gdb-7/bfd/elf32-i386.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
1 /* Intel 80386/80486-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4    Free Software Foundation, Inc.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
27 #include "elf-bfd.h"
28 #include "elf-nacl.h"
29 #include "elf-vxworks.h"
30 #include "bfd_stdint.h"
31 #include "objalloc.h"
32 #include "hashtab.h"
33 #include "dwarf2.h"
34 
35 /* 386 uses REL relocations instead of RELA.  */
36 #define USE_REL     1
37 
38 #include "elf/i386.h"
39 
40 static reloc_howto_type elf_howto_table[]=
41 {
42   HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
43           bfd_elf_generic_reloc, "R_386_NONE",
44           TRUE, 0x00000000, 0x00000000, FALSE),
45   HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
46           bfd_elf_generic_reloc, "R_386_32",
47           TRUE, 0xffffffff, 0xffffffff, FALSE),
48   HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
49           bfd_elf_generic_reloc, "R_386_PC32",
50           TRUE, 0xffffffff, 0xffffffff, TRUE),
51   HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
52           bfd_elf_generic_reloc, "R_386_GOT32",
53           TRUE, 0xffffffff, 0xffffffff, FALSE),
54   HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
55           bfd_elf_generic_reloc, "R_386_PLT32",
56           TRUE, 0xffffffff, 0xffffffff, TRUE),
57   HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
58           bfd_elf_generic_reloc, "R_386_COPY",
59           TRUE, 0xffffffff, 0xffffffff, FALSE),
60   HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
61           bfd_elf_generic_reloc, "R_386_GLOB_DAT",
62           TRUE, 0xffffffff, 0xffffffff, FALSE),
63   HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
64           bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
65           TRUE, 0xffffffff, 0xffffffff, FALSE),
66   HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
67           bfd_elf_generic_reloc, "R_386_RELATIVE",
68           TRUE, 0xffffffff, 0xffffffff, FALSE),
69   HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
70           bfd_elf_generic_reloc, "R_386_GOTOFF",
71           TRUE, 0xffffffff, 0xffffffff, FALSE),
72   HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
73           bfd_elf_generic_reloc, "R_386_GOTPC",
74           TRUE, 0xffffffff, 0xffffffff, TRUE),
75 
76   /* We have a gap in the reloc numbers here.
77      R_386_standard counts the number up to this point, and
78      R_386_ext_offset is the value to subtract from a reloc type of
79      R_386_16 thru R_386_PC8 to form an index into this table.  */
80 #define R_386_standard (R_386_GOTPC + 1)
81 #define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
82 
83   /* These relocs are a GNU extension.  */
84   HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
85           bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
86           TRUE, 0xffffffff, 0xffffffff, FALSE),
87   HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
88           bfd_elf_generic_reloc, "R_386_TLS_IE",
89           TRUE, 0xffffffff, 0xffffffff, FALSE),
90   HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
91           bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
92           TRUE, 0xffffffff, 0xffffffff, FALSE),
93   HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
94           bfd_elf_generic_reloc, "R_386_TLS_LE",
95           TRUE, 0xffffffff, 0xffffffff, FALSE),
96   HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
97           bfd_elf_generic_reloc, "R_386_TLS_GD",
98           TRUE, 0xffffffff, 0xffffffff, FALSE),
99   HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
100           bfd_elf_generic_reloc, "R_386_TLS_LDM",
101           TRUE, 0xffffffff, 0xffffffff, FALSE),
102   HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
103           bfd_elf_generic_reloc, "R_386_16",
104           TRUE, 0xffff, 0xffff, FALSE),
105   HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
106           bfd_elf_generic_reloc, "R_386_PC16",
107           TRUE, 0xffff, 0xffff, TRUE),
108   HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
109           bfd_elf_generic_reloc, "R_386_8",
110           TRUE, 0xff, 0xff, FALSE),
111   HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
112           bfd_elf_generic_reloc, "R_386_PC8",
113           TRUE, 0xff, 0xff, TRUE),
114 
115 #define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
116 #define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
117   /* These are common with Solaris TLS implementation.  */
118   HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
119           bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
120           TRUE, 0xffffffff, 0xffffffff, FALSE),
121   HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
122           bfd_elf_generic_reloc, "R_386_TLS_IE_32",
123           TRUE, 0xffffffff, 0xffffffff, FALSE),
124   HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
125           bfd_elf_generic_reloc, "R_386_TLS_LE_32",
126           TRUE, 0xffffffff, 0xffffffff, FALSE),
127   HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
128           bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
129           TRUE, 0xffffffff, 0xffffffff, FALSE),
130   HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
131           bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
132           TRUE, 0xffffffff, 0xffffffff, FALSE),
133   HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
134           bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
135           TRUE, 0xffffffff, 0xffffffff, FALSE),
136   HOWTO(R_386_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
137           bfd_elf_generic_reloc, "R_386_SIZE32",
138           TRUE, 0xffffffff, 0xffffffff, FALSE),
139   HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
140           bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
141           TRUE, 0xffffffff, 0xffffffff, FALSE),
142   HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
143           bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
144           FALSE, 0, 0, FALSE),
145   HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
146           bfd_elf_generic_reloc, "R_386_TLS_DESC",
147           TRUE, 0xffffffff, 0xffffffff, FALSE),
148   HOWTO(R_386_IRELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
149           bfd_elf_generic_reloc, "R_386_IRELATIVE",
150           TRUE, 0xffffffff, 0xffffffff, FALSE),
151 
152   /* Another gap.  */
153 #define R_386_irelative (R_386_IRELATIVE + 1 - R_386_tls_offset)
154 #define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_irelative)
155 
156 /* GNU extension to record C++ vtable hierarchy.  */
157   HOWTO (R_386_GNU_VTINHERIT, /* type */
158            0,                           /* rightshift */
159            2,                           /* size (0 = byte, 1 = short, 2 = long) */
160            0,                           /* bitsize */
161            FALSE,                       /* pc_relative */
162            0,                           /* bitpos */
163            complain_overflow_dont, /* complain_on_overflow */
164            NULL,                        /* special_function */
165            "R_386_GNU_VTINHERIT",       /* name */
166            FALSE,                       /* partial_inplace */
167            0,                           /* src_mask */
168            0,                           /* dst_mask */
169            FALSE),            /* pcrel_offset */
170 
171 /* GNU extension to record C++ vtable member usage.  */
172   HOWTO (R_386_GNU_VTENTRY,   /* type */
173            0,                           /* rightshift */
174            2,                           /* size (0 = byte, 1 = short, 2 = long) */
175            0,                           /* bitsize */
176            FALSE,                       /* pc_relative */
177            0,                           /* bitpos */
178            complain_overflow_dont, /* complain_on_overflow */
179            _bfd_elf_rel_vtable_reloc_fn, /* special_function */
180            "R_386_GNU_VTENTRY",         /* name */
181            FALSE,                       /* partial_inplace */
182            0,                           /* src_mask */
183            0,                           /* dst_mask */
184            FALSE)                       /* pcrel_offset */
185 
186 #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
187 
188 };
189 
190 #ifdef DEBUG_GEN_RELOC
191 #define TRACE(str) \
192   fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
193 #else
194 #define TRACE(str)
195 #endif
196 
197 static reloc_howto_type *
elf_i386_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)198 elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
199                                   bfd_reloc_code_real_type code)
200 {
201   switch (code)
202     {
203     case BFD_RELOC_NONE:
204       TRACE ("BFD_RELOC_NONE");
205       return &elf_howto_table[R_386_NONE];
206 
207     case BFD_RELOC_32:
208       TRACE ("BFD_RELOC_32");
209       return &elf_howto_table[R_386_32];
210 
211     case BFD_RELOC_CTOR:
212       TRACE ("BFD_RELOC_CTOR");
213       return &elf_howto_table[R_386_32];
214 
215     case BFD_RELOC_32_PCREL:
216       TRACE ("BFD_RELOC_PC32");
217       return &elf_howto_table[R_386_PC32];
218 
219     case BFD_RELOC_386_GOT32:
220       TRACE ("BFD_RELOC_386_GOT32");
221       return &elf_howto_table[R_386_GOT32];
222 
223     case BFD_RELOC_386_PLT32:
224       TRACE ("BFD_RELOC_386_PLT32");
225       return &elf_howto_table[R_386_PLT32];
226 
227     case BFD_RELOC_386_COPY:
228       TRACE ("BFD_RELOC_386_COPY");
229       return &elf_howto_table[R_386_COPY];
230 
231     case BFD_RELOC_386_GLOB_DAT:
232       TRACE ("BFD_RELOC_386_GLOB_DAT");
233       return &elf_howto_table[R_386_GLOB_DAT];
234 
235     case BFD_RELOC_386_JUMP_SLOT:
236       TRACE ("BFD_RELOC_386_JUMP_SLOT");
237       return &elf_howto_table[R_386_JUMP_SLOT];
238 
239     case BFD_RELOC_386_RELATIVE:
240       TRACE ("BFD_RELOC_386_RELATIVE");
241       return &elf_howto_table[R_386_RELATIVE];
242 
243     case BFD_RELOC_386_GOTOFF:
244       TRACE ("BFD_RELOC_386_GOTOFF");
245       return &elf_howto_table[R_386_GOTOFF];
246 
247     case BFD_RELOC_386_GOTPC:
248       TRACE ("BFD_RELOC_386_GOTPC");
249       return &elf_howto_table[R_386_GOTPC];
250 
251       /* These relocs are a GNU extension.  */
252     case BFD_RELOC_386_TLS_TPOFF:
253       TRACE ("BFD_RELOC_386_TLS_TPOFF");
254       return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
255 
256     case BFD_RELOC_386_TLS_IE:
257       TRACE ("BFD_RELOC_386_TLS_IE");
258       return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
259 
260     case BFD_RELOC_386_TLS_GOTIE:
261       TRACE ("BFD_RELOC_386_TLS_GOTIE");
262       return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
263 
264     case BFD_RELOC_386_TLS_LE:
265       TRACE ("BFD_RELOC_386_TLS_LE");
266       return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
267 
268     case BFD_RELOC_386_TLS_GD:
269       TRACE ("BFD_RELOC_386_TLS_GD");
270       return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
271 
272     case BFD_RELOC_386_TLS_LDM:
273       TRACE ("BFD_RELOC_386_TLS_LDM");
274       return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
275 
276     case BFD_RELOC_16:
277       TRACE ("BFD_RELOC_16");
278       return &elf_howto_table[R_386_16 - R_386_ext_offset];
279 
280     case BFD_RELOC_16_PCREL:
281       TRACE ("BFD_RELOC_16_PCREL");
282       return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
283 
284     case BFD_RELOC_8:
285       TRACE ("BFD_RELOC_8");
286       return &elf_howto_table[R_386_8 - R_386_ext_offset];
287 
288     case BFD_RELOC_8_PCREL:
289       TRACE ("BFD_RELOC_8_PCREL");
290       return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
291 
292     /* Common with Sun TLS implementation.  */
293     case BFD_RELOC_386_TLS_LDO_32:
294       TRACE ("BFD_RELOC_386_TLS_LDO_32");
295       return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
296 
297     case BFD_RELOC_386_TLS_IE_32:
298       TRACE ("BFD_RELOC_386_TLS_IE_32");
299       return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
300 
301     case BFD_RELOC_386_TLS_LE_32:
302       TRACE ("BFD_RELOC_386_TLS_LE_32");
303       return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
304 
305     case BFD_RELOC_386_TLS_DTPMOD32:
306       TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
307       return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
308 
309     case BFD_RELOC_386_TLS_DTPOFF32:
310       TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
311       return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
312 
313     case BFD_RELOC_386_TLS_TPOFF32:
314       TRACE ("BFD_RELOC_386_TLS_TPOFF32");
315       return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
316 
317     case BFD_RELOC_SIZE32:
318       TRACE ("BFD_RELOC_SIZE32");
319       return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
320 
321     case BFD_RELOC_386_TLS_GOTDESC:
322       TRACE ("BFD_RELOC_386_TLS_GOTDESC");
323       return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
324 
325     case BFD_RELOC_386_TLS_DESC_CALL:
326       TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
327       return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
328 
329     case BFD_RELOC_386_TLS_DESC:
330       TRACE ("BFD_RELOC_386_TLS_DESC");
331       return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
332 
333     case BFD_RELOC_386_IRELATIVE:
334       TRACE ("BFD_RELOC_386_IRELATIVE");
335       return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
336 
337     case BFD_RELOC_VTABLE_INHERIT:
338       TRACE ("BFD_RELOC_VTABLE_INHERIT");
339       return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
340 
341     case BFD_RELOC_VTABLE_ENTRY:
342       TRACE ("BFD_RELOC_VTABLE_ENTRY");
343       return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
344 
345     default:
346       break;
347     }
348 
349   TRACE ("Unknown");
350   return 0;
351 }
352 
353 static reloc_howto_type *
elf_i386_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)354 elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
355                                   const char *r_name)
356 {
357   unsigned int i;
358 
359   for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
360     if (elf_howto_table[i].name != NULL
361           && strcasecmp (elf_howto_table[i].name, r_name) == 0)
362       return &elf_howto_table[i];
363 
364   return NULL;
365 }
366 
367 static reloc_howto_type *
elf_i386_rtype_to_howto(bfd * abfd,unsigned r_type)368 elf_i386_rtype_to_howto (bfd *abfd, unsigned r_type)
369 {
370   unsigned int indx;
371 
372   if ((indx = r_type) >= R_386_standard
373       && ((indx = r_type - R_386_ext_offset) - R_386_standard
374             >= R_386_ext - R_386_standard)
375       && ((indx = r_type - R_386_tls_offset) - R_386_ext
376             >= R_386_irelative - R_386_ext)
377       && ((indx = r_type - R_386_vt_offset) - R_386_irelative
378             >= R_386_vt - R_386_irelative))
379     {
380       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
381                                    abfd, (int) r_type);
382       indx = R_386_NONE;
383     }
384   BFD_ASSERT (elf_howto_table [indx].type == r_type);
385   return &elf_howto_table[indx];
386 }
387 
388 static void
elf_i386_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)389 elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
390                                   arelent *cache_ptr,
391                                   Elf_Internal_Rela *dst)
392 {
393   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
394   cache_ptr->howto = elf_i386_rtype_to_howto (abfd, r_type);
395 }
396 
397 /* Return whether a symbol name implies a local label.  The UnixWare
398    2.1 cc generates temporary symbols that start with .X, so we
399    recognize them here.  FIXME: do other SVR4 compilers also use .X?.
400    If so, we should move the .X recognition into
401    _bfd_elf_is_local_label_name.  */
402 
403 static bfd_boolean
elf_i386_is_local_label_name(bfd * abfd,const char * name)404 elf_i386_is_local_label_name (bfd *abfd, const char *name)
405 {
406   if (name[0] == '.' && name[1] == 'X')
407     return TRUE;
408 
409   return _bfd_elf_is_local_label_name (abfd, name);
410 }
411 
412 /* Support for core dump NOTE sections.  */
413 
414 static bfd_boolean
elf_i386_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)415 elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
416 {
417   int offset;
418   size_t size;
419 
420   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
421     {
422       int pr_version = bfd_get_32 (abfd, note->descdata);
423 
424       if (pr_version != 1)
425           return FALSE;
426 
427       /* pr_cursig */
428       elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
429 
430       /* pr_pid */
431       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
432 
433       /* pr_reg */
434       offset = 28;
435       size = bfd_get_32 (abfd, note->descdata + 8);
436     }
437   else
438     {
439       switch (note->descsz)
440           {
441           default:
442             return FALSE;
443 
444           case 144:           /* Linux/i386 */
445             /* pr_cursig */
446             elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
447 
448             /* pr_pid */
449             elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
450 
451             /* pr_reg */
452             offset = 72;
453             size = 68;
454 
455             break;
456           }
457     }
458 
459   /* Make a ".reg/999" section.  */
460   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
461                                                     size, note->descpos + offset);
462 }
463 
464 static bfd_boolean
elf_i386_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)465 elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
466 {
467   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
468     {
469       int pr_version = bfd_get_32 (abfd, note->descdata);
470 
471       if (pr_version != 1)
472           return FALSE;
473 
474       elf_tdata (abfd)->core->program
475           = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
476       elf_tdata (abfd)->core->command
477           = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
478     }
479   else
480     {
481       switch (note->descsz)
482           {
483           default:
484             return FALSE;
485 
486           case 124:           /* Linux/i386 elf_prpsinfo.  */
487             elf_tdata (abfd)->core->pid
488               = bfd_get_32 (abfd, note->descdata + 12);
489             elf_tdata (abfd)->core->program
490               = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
491             elf_tdata (abfd)->core->command
492               = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
493           }
494     }
495 
496   /* Note that for some reason, a spurious space is tacked
497      onto the end of the args in some (at least one anyway)
498      implementations, so strip it off if it exists.  */
499   {
500     char *command = elf_tdata (abfd)->core->command;
501     int n = strlen (command);
502 
503     if (0 < n && command[n - 1] == ' ')
504       command[n - 1] = '\0';
505   }
506 
507   return TRUE;
508 }
509 
510 /* Functions for the i386 ELF linker.
511 
512    In order to gain some understanding of code in this file without
513    knowing all the intricate details of the linker, note the
514    following:
515 
516    Functions named elf_i386_* are called by external routines, other
517    functions are only called locally.  elf_i386_* functions appear
518    in this file more or less in the order in which they are called
519    from external routines.  eg. elf_i386_check_relocs is called
520    early in the link process, elf_i386_finish_dynamic_sections is
521    one of the last functions.  */
522 
523 
524 /* The name of the dynamic interpreter.  This is put in the .interp
525    section.  */
526 
527 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
528 
529 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
530    copying dynamic variables from a shared lib into an app's dynbss
531    section, and instead use a dynamic relocation to point into the
532    shared lib.  */
533 #define ELIMINATE_COPY_RELOCS 1
534 
535 /* The size in bytes of an entry in the procedure linkage table.  */
536 
537 #define PLT_ENTRY_SIZE 16
538 
539 /* The first entry in an absolute procedure linkage table looks like
540    this.  See the SVR4 ABI i386 supplement to see how this works.
541    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
542 
543 static const bfd_byte elf_i386_plt0_entry[12] =
544 {
545   0xff, 0x35,       /* pushl contents of address */
546   0, 0, 0, 0,       /* replaced with address of .got + 4.  */
547   0xff, 0x25,       /* jmp indirect */
548   0, 0, 0, 0        /* replaced with address of .got + 8.  */
549 };
550 
551 /* Subsequent entries in an absolute procedure linkage table look like
552    this.  */
553 
554 static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
555 {
556   0xff, 0x25,       /* jmp indirect */
557   0, 0, 0, 0,       /* replaced with address of this symbol in .got.  */
558   0x68,             /* pushl immediate */
559   0, 0, 0, 0,       /* replaced with offset into relocation table.  */
560   0xe9,             /* jmp relative */
561   0, 0, 0, 0        /* replaced with offset to start of .plt.  */
562 };
563 
564 /* The first entry in a PIC procedure linkage table look like this.
565    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
566 
567 static const bfd_byte elf_i386_pic_plt0_entry[12] =
568 {
569   0xff, 0xb3, 4, 0, 0, 0,     /* pushl 4(%ebx) */
570   0xff, 0xa3, 8, 0, 0, 0      /* jmp *8(%ebx) */
571 };
572 
573 /* Subsequent entries in a PIC procedure linkage table look like this.  */
574 
575 static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
576 {
577   0xff, 0xa3,       /* jmp *offset(%ebx) */
578   0, 0, 0, 0,       /* replaced with offset of this symbol in .got.  */
579   0x68,             /* pushl immediate */
580   0, 0, 0, 0,       /* replaced with offset into relocation table.  */
581   0xe9,             /* jmp relative */
582   0, 0, 0, 0        /* replaced with offset to start of .plt.  */
583 };
584 
585 /* .eh_frame covering the .plt section.  */
586 
587 static const bfd_byte elf_i386_eh_frame_plt[] =
588 {
589 #define PLT_CIE_LENGTH                  20
590 #define PLT_FDE_LENGTH                  36
591 #define PLT_FDE_START_OFFSET  4 + PLT_CIE_LENGTH + 8
592 #define PLT_FDE_LEN_OFFSET    4 + PLT_CIE_LENGTH + 12
593   PLT_CIE_LENGTH, 0, 0, 0,    /* CIE length */
594   0, 0, 0, 0,                           /* CIE ID */
595   1,                                    /* CIE version */
596   'z', 'R', 0,                          /* Augmentation string */
597   1,                                    /* Code alignment factor */
598   0x7c,                                 /* Data alignment factor */
599   8,                                    /* Return address column */
600   1,                                    /* Augmentation size */
601   DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
602   DW_CFA_def_cfa, 4, 4,                 /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
603   DW_CFA_offset + 8, 1,                 /* DW_CFA_offset: r8 (eip) at cfa-4 */
604   DW_CFA_nop, DW_CFA_nop,
605 
606   PLT_FDE_LENGTH, 0, 0, 0,    /* FDE length */
607   PLT_CIE_LENGTH + 8, 0, 0, 0,          /* CIE pointer */
608   0, 0, 0, 0,                           /* R_386_PC32 .plt goes here */
609   0, 0, 0, 0,                           /* .plt size goes here */
610   0,                                    /* Augmentation size */
611   DW_CFA_def_cfa_offset, 8,   /* DW_CFA_def_cfa_offset: 8 */
612   DW_CFA_advance_loc + 6,     /* DW_CFA_advance_loc: 6 to __PLT__+6 */
613   DW_CFA_def_cfa_offset, 12,  /* DW_CFA_def_cfa_offset: 12 */
614   DW_CFA_advance_loc + 10,    /* DW_CFA_advance_loc: 10 to __PLT__+16 */
615   DW_CFA_def_cfa_expression,  /* DW_CFA_def_cfa_expression */
616   11,                                   /* Block length */
617   DW_OP_breg4, 4,             /* DW_OP_breg4 (esp): 4 */
618   DW_OP_breg8, 0,             /* DW_OP_breg8 (eip): 0 */
619   DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
620   DW_OP_lit2, DW_OP_shl, DW_OP_plus,
621   DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
622 };
623 
624 struct elf_i386_plt_layout
625 {
626   /* The first entry in an absolute procedure linkage table looks like this.  */
627   const bfd_byte *plt0_entry;
628   unsigned int plt0_entry_size;
629 
630   /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2].  */
631   unsigned int plt0_got1_offset;
632   unsigned int plt0_got2_offset;
633 
634   /* Later entries in an absolute procedure linkage table look like this.  */
635   const bfd_byte *plt_entry;
636   unsigned int plt_entry_size;
637 
638   /* Offsets into plt_entry that are to be replaced with...  */
639   unsigned int plt_got_offset;    /* ... address of this symbol in .got. */
640   unsigned int plt_reloc_offset;  /* ... offset into relocation table. */
641   unsigned int plt_plt_offset;    /* ... offset to start of .plt. */
642 
643   /* Offset into plt_entry where the initial value of the GOT entry points.  */
644   unsigned int plt_lazy_offset;
645 
646   /* The first entry in a PIC procedure linkage table looks like this.  */
647   const bfd_byte *pic_plt0_entry;
648 
649   /* Subsequent entries in a PIC procedure linkage table look like this.  */
650   const bfd_byte *pic_plt_entry;
651 
652   /* .eh_frame covering the .plt section.  */
653   const bfd_byte *eh_frame_plt;
654   unsigned int eh_frame_plt_size;
655 };
656 
657 #define GET_PLT_ENTRY_SIZE(abfd) \
658   get_elf_i386_backend_data (abfd)->plt->plt_entry_size
659 
660 /* These are the standard parameters.  */
661 static const struct elf_i386_plt_layout elf_i386_plt =
662   {
663     elf_i386_plt0_entry,                /* plt0_entry */
664     sizeof (elf_i386_plt0_entry),       /* plt0_entry_size */
665     2,                                  /* plt0_got1_offset */
666     8,                                  /* plt0_got2_offset */
667     elf_i386_plt_entry,                 /* plt_entry */
668     PLT_ENTRY_SIZE,                     /* plt_entry_size */
669     2,                                  /* plt_got_offset */
670     7,                                  /* plt_reloc_offset */
671     12,                                 /* plt_plt_offset */
672     6,                                  /* plt_lazy_offset */
673     elf_i386_pic_plt0_entry,            /* pic_plt0_entry */
674     elf_i386_pic_plt_entry,             /* pic_plt_entry */
675     elf_i386_eh_frame_plt,              /* eh_frame_plt */
676     sizeof (elf_i386_eh_frame_plt),     /* eh_frame_plt_size */
677   };
678 
679 
680 /* On VxWorks, the .rel.plt.unloaded section has absolute relocations
681    for the PLTResolve stub and then for each PLT entry.  */
682 #define PLTRESOLVE_RELOCS_SHLIB 0
683 #define PLTRESOLVE_RELOCS 2
684 #define PLT_NON_JUMP_SLOT_RELOCS 2
685 
686 /* Architecture-specific backend data for i386.  */
687 
688 struct elf_i386_backend_data
689 {
690   /* Parameters describing PLT generation.  */
691   const struct elf_i386_plt_layout *plt;
692 
693   /* Value used to fill the unused bytes of the first PLT entry.  */
694   bfd_byte plt0_pad_byte;
695 
696   /* True if the target system is VxWorks.  */
697   int is_vxworks;
698 };
699 
700 #define get_elf_i386_backend_data(abfd) \
701   ((const struct elf_i386_backend_data *) \
702    get_elf_backend_data (abfd)->arch_data)
703 
704 /* These are the standard parameters.  */
705 static const struct elf_i386_backend_data elf_i386_arch_bed =
706   {
707     &elf_i386_plt,                      /* plt */
708     0,                                  /* plt0_pad_byte */
709     0,                                  /* is_vxworks */
710   };
711 
712 #define   elf_backend_arch_data         &elf_i386_arch_bed
713 
714 /* i386 ELF linker hash entry.  */
715 
716 struct elf_i386_link_hash_entry
717 {
718   struct elf_link_hash_entry elf;
719 
720   /* Track dynamic relocs copied for this symbol.  */
721   struct elf_dyn_relocs *dyn_relocs;
722 
723 #define GOT_UNKNOWN 0
724 #define GOT_NORMAL  1
725 #define GOT_TLS_GD  2
726 #define GOT_TLS_IE  4
727 #define GOT_TLS_IE_POS        5
728 #define GOT_TLS_IE_NEG        6
729 #define GOT_TLS_IE_BOTH 7
730 #define GOT_TLS_GDESC         8
731 #define GOT_TLS_GD_BOTH_P(type)                                                           \
732   ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
733 #define GOT_TLS_GD_P(type)                                                      \
734   ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
735 #define GOT_TLS_GDESC_P(type)                                                   \
736   ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
737 #define GOT_TLS_GD_ANY_P(type)                                                            \
738   (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
739   unsigned char tls_type;
740 
741   /* Offset of the GOTPLT entry reserved for the TLS descriptor,
742      starting at the end of the jump table.  */
743   bfd_vma tlsdesc_got;
744 };
745 
746 #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
747 
748 struct elf_i386_obj_tdata
749 {
750   struct elf_obj_tdata root;
751 
752   /* tls_type for each local got entry.  */
753   char *local_got_tls_type;
754 
755   /* GOTPLT entries for TLS descriptors.  */
756   bfd_vma *local_tlsdesc_gotent;
757 };
758 
759 #define elf_i386_tdata(abfd) \
760   ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
761 
762 #define elf_i386_local_got_tls_type(abfd) \
763   (elf_i386_tdata (abfd)->local_got_tls_type)
764 
765 #define elf_i386_local_tlsdesc_gotent(abfd) \
766   (elf_i386_tdata (abfd)->local_tlsdesc_gotent)
767 
768 #define is_i386_elf(bfd)                                    \
769   (bfd_get_flavour (bfd) == bfd_target_elf_flavour          \
770    && elf_tdata (bfd) != NULL                               \
771    && elf_object_id (bfd) == I386_ELF_DATA)
772 
773 static bfd_boolean
elf_i386_mkobject(bfd * abfd)774 elf_i386_mkobject (bfd *abfd)
775 {
776   return bfd_elf_allocate_object (abfd, sizeof (struct elf_i386_obj_tdata),
777                                           I386_ELF_DATA);
778 }
779 
780 /* i386 ELF linker hash table.  */
781 
782 struct elf_i386_link_hash_table
783 {
784   struct elf_link_hash_table elf;
785 
786   /* Short-cuts to get to dynamic linker sections.  */
787   asection *sdynbss;
788   asection *srelbss;
789   asection *plt_eh_frame;
790 
791   union
792   {
793     bfd_signed_vma refcount;
794     bfd_vma offset;
795   } tls_ldm_got;
796 
797   /* The amount of space used by the reserved portion of the sgotplt
798      section, plus whatever space is used by the jump slots.  */
799   bfd_vma sgotplt_jump_table_size;
800 
801   /* Small local sym cache.  */
802   struct sym_cache sym_cache;
803 
804   /* _TLS_MODULE_BASE_ symbol.  */
805   struct bfd_link_hash_entry *tls_module_base;
806 
807   /* Used by local STT_GNU_IFUNC symbols.  */
808   htab_t loc_hash_table;
809   void * loc_hash_memory;
810 
811   /* The (unloaded but important) .rel.plt.unloaded section on VxWorks.  */
812   asection *srelplt2;
813 
814   /* The index of the next unused R_386_TLS_DESC slot in .rel.plt.  */
815   bfd_vma next_tls_desc_index;
816 
817   /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt.  */
818   bfd_vma next_jump_slot_index;
819 
820   /* The index of the next unused R_386_IRELATIVE slot in .rel.plt.  */
821   bfd_vma next_irelative_index;
822 };
823 
824 /* Get the i386 ELF linker hash table from a link_info structure.  */
825 
826 #define elf_i386_hash_table(p) \
827   (elf_hash_table_id  ((struct elf_link_hash_table *) ((p)->hash)) \
828   == I386_ELF_DATA ? ((struct elf_i386_link_hash_table *) ((p)->hash)) : NULL)
829 
830 #define elf_i386_compute_jump_table_size(htab) \
831   ((htab)->next_tls_desc_index * 4)
832 
833 /* Create an entry in an i386 ELF linker hash table.  */
834 
835 static struct bfd_hash_entry *
elf_i386_link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)836 elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
837                                   struct bfd_hash_table *table,
838                                   const char *string)
839 {
840   /* Allocate the structure if it has not already been allocated by a
841      subclass.  */
842   if (entry == NULL)
843     {
844       entry = (struct bfd_hash_entry *)
845           bfd_hash_allocate (table, sizeof (struct elf_i386_link_hash_entry));
846       if (entry == NULL)
847           return entry;
848     }
849 
850   /* Call the allocation method of the superclass.  */
851   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
852   if (entry != NULL)
853     {
854       struct elf_i386_link_hash_entry *eh;
855 
856       eh = (struct elf_i386_link_hash_entry *) entry;
857       eh->dyn_relocs = NULL;
858       eh->tls_type = GOT_UNKNOWN;
859       eh->tlsdesc_got = (bfd_vma) -1;
860     }
861 
862   return entry;
863 }
864 
865 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
866   for local symbol so that we can handle local STT_GNU_IFUNC symbols
867   as global symbol.  We reuse indx and dynstr_index for local symbol
868   hash since they aren't used by global symbols in this backend.  */
869 
870 static hashval_t
elf_i386_local_htab_hash(const void * ptr)871 elf_i386_local_htab_hash (const void *ptr)
872 {
873   struct elf_link_hash_entry *h
874     = (struct elf_link_hash_entry *) ptr;
875   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
876 }
877 
878 /* Compare local hash entries.  */
879 
880 static int
elf_i386_local_htab_eq(const void * ptr1,const void * ptr2)881 elf_i386_local_htab_eq (const void *ptr1, const void *ptr2)
882 {
883   struct elf_link_hash_entry *h1
884      = (struct elf_link_hash_entry *) ptr1;
885   struct elf_link_hash_entry *h2
886     = (struct elf_link_hash_entry *) ptr2;
887 
888   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
889 }
890 
891 /* Find and/or create a hash entry for local symbol.  */
892 
893 static struct elf_link_hash_entry *
elf_i386_get_local_sym_hash(struct elf_i386_link_hash_table * htab,bfd * abfd,const Elf_Internal_Rela * rel,bfd_boolean create)894 elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
895                                    bfd *abfd, const Elf_Internal_Rela *rel,
896                                    bfd_boolean create)
897 {
898   struct elf_i386_link_hash_entry e, *ret;
899   asection *sec = abfd->sections;
900   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
901                                                ELF32_R_SYM (rel->r_info));
902   void **slot;
903 
904   e.elf.indx = sec->id;
905   e.elf.dynstr_index = ELF32_R_SYM (rel->r_info);
906   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
907                                            create ? INSERT : NO_INSERT);
908 
909   if (!slot)
910     return NULL;
911 
912   if (*slot)
913     {
914       ret = (struct elf_i386_link_hash_entry *) *slot;
915       return &ret->elf;
916     }
917 
918   ret = (struct elf_i386_link_hash_entry *)
919           objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
920                               sizeof (struct elf_i386_link_hash_entry));
921   if (ret)
922     {
923       memset (ret, 0, sizeof (*ret));
924       ret->elf.indx = sec->id;
925       ret->elf.dynstr_index = ELF32_R_SYM (rel->r_info);
926       ret->elf.dynindx = -1;
927       *slot = ret;
928     }
929   return &ret->elf;
930 }
931 
932 /* Create an i386 ELF linker hash table.  */
933 
934 static struct bfd_link_hash_table *
elf_i386_link_hash_table_create(bfd * abfd)935 elf_i386_link_hash_table_create (bfd *abfd)
936 {
937   struct elf_i386_link_hash_table *ret;
938   bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
939 
940   ret = (struct elf_i386_link_hash_table *) bfd_zmalloc (amt);
941   if (ret == NULL)
942     return NULL;
943 
944   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
945                                               elf_i386_link_hash_newfunc,
946                                               sizeof (struct elf_i386_link_hash_entry),
947                                               I386_ELF_DATA))
948     {
949       free (ret);
950       return NULL;
951     }
952 
953   ret->loc_hash_table = htab_try_create (1024,
954                                                    elf_i386_local_htab_hash,
955                                                    elf_i386_local_htab_eq,
956                                                    NULL);
957   ret->loc_hash_memory = objalloc_create ();
958   if (!ret->loc_hash_table || !ret->loc_hash_memory)
959     {
960       free (ret);
961       return NULL;
962     }
963 
964   return &ret->elf.root;
965 }
966 
967 /* Destroy an i386 ELF linker hash table.  */
968 
969 static void
elf_i386_link_hash_table_free(struct bfd_link_hash_table * hash)970 elf_i386_link_hash_table_free (struct bfd_link_hash_table *hash)
971 {
972   struct elf_i386_link_hash_table *htab
973     = (struct elf_i386_link_hash_table *) hash;
974 
975   if (htab->loc_hash_table)
976     htab_delete (htab->loc_hash_table);
977   if (htab->loc_hash_memory)
978     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
979   _bfd_elf_link_hash_table_free (hash);
980 }
981 
982 /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
983    .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
984    hash table.  */
985 
986 static bfd_boolean
elf_i386_create_dynamic_sections(bfd * dynobj,struct bfd_link_info * info)987 elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
988 {
989   struct elf_i386_link_hash_table *htab;
990 
991   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
992     return FALSE;
993 
994   htab = elf_i386_hash_table (info);
995   if (htab == NULL)
996     return FALSE;
997 
998   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
999   if (!info->shared)
1000     htab->srelbss = bfd_get_linker_section (dynobj, ".rel.bss");
1001 
1002   if (!htab->sdynbss
1003       || (!info->shared && !htab->srelbss))
1004     abort ();
1005 
1006   if (get_elf_i386_backend_data (dynobj)->is_vxworks
1007       && !elf_vxworks_create_dynamic_sections (dynobj, info,
1008                                                          &htab->srelplt2))
1009     return FALSE;
1010 
1011   if (!info->no_ld_generated_unwind_info
1012       && htab->plt_eh_frame == NULL
1013       && htab->elf.splt != NULL)
1014     {
1015       flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1016                               | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1017                               | SEC_LINKER_CREATED);
1018       htab->plt_eh_frame
1019           = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1020       if (htab->plt_eh_frame == NULL
1021             || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2))
1022           return FALSE;
1023     }
1024 
1025   return TRUE;
1026 }
1027 
1028 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1029 
1030 static void
elf_i386_copy_indirect_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * dir,struct elf_link_hash_entry * ind)1031 elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
1032                                      struct elf_link_hash_entry *dir,
1033                                      struct elf_link_hash_entry *ind)
1034 {
1035   struct elf_i386_link_hash_entry *edir, *eind;
1036 
1037   edir = (struct elf_i386_link_hash_entry *) dir;
1038   eind = (struct elf_i386_link_hash_entry *) ind;
1039 
1040   if (eind->dyn_relocs != NULL)
1041     {
1042       if (edir->dyn_relocs != NULL)
1043           {
1044             struct elf_dyn_relocs **pp;
1045             struct elf_dyn_relocs *p;
1046 
1047             /* Add reloc counts against the indirect sym to the direct sym
1048                list.  Merge any entries against the same section.  */
1049             for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1050               {
1051                 struct elf_dyn_relocs *q;
1052 
1053                 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1054                     if (q->sec == p->sec)
1055                       {
1056                         q->pc_count += p->pc_count;
1057                         q->count += p->count;
1058                         *pp = p->next;
1059                         break;
1060                       }
1061                 if (q == NULL)
1062                     pp = &p->next;
1063               }
1064             *pp = edir->dyn_relocs;
1065           }
1066 
1067       edir->dyn_relocs = eind->dyn_relocs;
1068       eind->dyn_relocs = NULL;
1069     }
1070 
1071   if (ind->root.type == bfd_link_hash_indirect
1072       && dir->got.refcount <= 0)
1073     {
1074       edir->tls_type = eind->tls_type;
1075       eind->tls_type = GOT_UNKNOWN;
1076     }
1077 
1078   if (ELIMINATE_COPY_RELOCS
1079       && ind->root.type != bfd_link_hash_indirect
1080       && dir->dynamic_adjusted)
1081     {
1082       /* If called to transfer flags for a weakdef during processing
1083            of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1084            We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
1085       dir->ref_dynamic |= ind->ref_dynamic;
1086       dir->ref_regular |= ind->ref_regular;
1087       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1088       dir->needs_plt |= ind->needs_plt;
1089       dir->pointer_equality_needed |= ind->pointer_equality_needed;
1090     }
1091   else
1092     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1093 }
1094 
1095 /* Return TRUE if the TLS access code sequence support transition
1096    from R_TYPE.  */
1097 
1098 static bfd_boolean
elf_i386_check_tls_transition(bfd * abfd,asection * sec,bfd_byte * contents,Elf_Internal_Shdr * symtab_hdr,struct elf_link_hash_entry ** sym_hashes,unsigned int r_type,const Elf_Internal_Rela * rel,const Elf_Internal_Rela * relend)1099 elf_i386_check_tls_transition (bfd *abfd, asection *sec,
1100                                      bfd_byte *contents,
1101                                      Elf_Internal_Shdr *symtab_hdr,
1102                                      struct elf_link_hash_entry **sym_hashes,
1103                                      unsigned int r_type,
1104                                      const Elf_Internal_Rela *rel,
1105                                      const Elf_Internal_Rela *relend)
1106 {
1107   unsigned int val, type;
1108   unsigned long r_symndx;
1109   struct elf_link_hash_entry *h;
1110   bfd_vma offset;
1111 
1112   /* Get the section contents.  */
1113   if (contents == NULL)
1114     {
1115       if (elf_section_data (sec)->this_hdr.contents != NULL)
1116           contents = elf_section_data (sec)->this_hdr.contents;
1117       else
1118           {
1119             /* FIXME: How to better handle error condition?  */
1120             if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1121               return FALSE;
1122 
1123             /* Cache the section contents for elf_link_input_bfd.  */
1124             elf_section_data (sec)->this_hdr.contents = contents;
1125           }
1126     }
1127 
1128   offset = rel->r_offset;
1129   switch (r_type)
1130     {
1131     case R_386_TLS_GD:
1132     case R_386_TLS_LDM:
1133       if (offset < 2 || (rel + 1) >= relend)
1134           return FALSE;
1135 
1136       type = bfd_get_8 (abfd, contents + offset - 2);
1137       if (r_type == R_386_TLS_GD)
1138           {
1139             /* Check transition from GD access model.  Only
1140                     leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr
1141                     leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop
1142                can transit to different access model.  */
1143             if ((offset + 10) > sec->size ||
1144                 (type != 0x8d && type != 0x04))
1145               return FALSE;
1146 
1147             val = bfd_get_8 (abfd, contents + offset - 1);
1148             if (type == 0x04)
1149               {
1150                 /* leal foo@tlsgd(,%reg,1), %eax; call ___tls_get_addr */
1151                 if (offset < 3)
1152                     return FALSE;
1153 
1154                 if (bfd_get_8 (abfd, contents + offset - 3) != 0x8d)
1155                     return FALSE;
1156 
1157                 if ((val & 0xc7) != 0x05 || val == (4 << 3))
1158                     return FALSE;
1159               }
1160             else
1161               {
1162                 /* leal foo@tlsgd(%reg), %eax; call ___tls_get_addr; nop  */
1163                 if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1164                     return FALSE;
1165 
1166                 if (bfd_get_8 (abfd, contents + offset + 9) != 0x90)
1167                     return FALSE;
1168               }
1169           }
1170       else
1171           {
1172             /* Check transition from LD access model.  Only
1173                     leal foo@tlsgd(%reg), %eax; call ___tls_get_addr
1174                can transit to different access model.  */
1175             if (type != 0x8d || (offset + 9) > sec->size)
1176               return FALSE;
1177 
1178             val = bfd_get_8 (abfd, contents + offset - 1);
1179             if ((val & 0xf8) != 0x80 || (val & 7) == 4)
1180               return FALSE;
1181           }
1182 
1183       if (bfd_get_8 (abfd, contents + offset + 4) != 0xe8)
1184           return FALSE;
1185 
1186       r_symndx = ELF32_R_SYM (rel[1].r_info);
1187       if (r_symndx < symtab_hdr->sh_info)
1188           return FALSE;
1189 
1190       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1191       /* Use strncmp to check ___tls_get_addr since ___tls_get_addr
1192            may be versioned.  */
1193       return (h != NULL
1194                 && h->root.root.string != NULL
1195                 && (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
1196                       || ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32)
1197                 && (strncmp (h->root.root.string, "___tls_get_addr",
1198                                  15) == 0));
1199 
1200     case R_386_TLS_IE:
1201       /* Check transition from IE access model:
1202                     movl foo@indntpoff(%rip), %eax
1203                     movl foo@indntpoff(%rip), %reg
1204                     addl foo@indntpoff(%rip), %reg
1205        */
1206 
1207       if (offset < 1 || (offset + 4) > sec->size)
1208           return FALSE;
1209 
1210       /* Check "movl foo@tpoff(%rip), %eax" first.  */
1211       val = bfd_get_8 (abfd, contents + offset - 1);
1212       if (val == 0xa1)
1213           return TRUE;
1214 
1215       if (offset < 2)
1216           return FALSE;
1217 
1218       /* Check movl|addl foo@tpoff(%rip), %reg.   */
1219       type = bfd_get_8 (abfd, contents + offset - 2);
1220       return ((type == 0x8b || type == 0x03)
1221                 && (val & 0xc7) == 0x05);
1222 
1223     case R_386_TLS_GOTIE:
1224     case R_386_TLS_IE_32:
1225       /* Check transition from {IE_32,GOTIE} access model:
1226                     subl foo@{tpoff,gontoff}(%reg1), %reg2
1227                     movl foo@{tpoff,gontoff}(%reg1), %reg2
1228                     addl foo@{tpoff,gontoff}(%reg1), %reg2
1229        */
1230 
1231       if (offset < 2 || (offset + 4) > sec->size)
1232           return FALSE;
1233 
1234       val = bfd_get_8 (abfd, contents + offset - 1);
1235       if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1236           return FALSE;
1237 
1238       type = bfd_get_8 (abfd, contents + offset - 2);
1239       return type == 0x8b || type == 0x2b || type == 0x03;
1240 
1241     case R_386_TLS_GOTDESC:
1242       /* Check transition from GDesc access model:
1243                     leal x@tlsdesc(%ebx), %eax
1244 
1245            Make sure it's a leal adding ebx to a 32-bit offset
1246            into any register, although it's probably almost always
1247            going to be eax.  */
1248 
1249       if (offset < 2 || (offset + 4) > sec->size)
1250           return FALSE;
1251 
1252       if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1253           return FALSE;
1254 
1255       val = bfd_get_8 (abfd, contents + offset - 1);
1256       return (val & 0xc7) == 0x83;
1257 
1258     case R_386_TLS_DESC_CALL:
1259       /* Check transition from GDesc access model:
1260                     call *x@tlsdesc(%rax)
1261        */
1262       if (offset + 2 <= sec->size)
1263           {
1264             /* Make sure that it's a call *x@tlsdesc(%rax).  */
1265             static const unsigned char call[] = { 0xff, 0x10 };
1266             return memcmp (contents + offset, call, 2) == 0;
1267           }
1268 
1269       return FALSE;
1270 
1271     default:
1272       abort ();
1273     }
1274 }
1275 
1276 /* Return TRUE if the TLS access transition is OK or no transition
1277    will be performed.  Update R_TYPE if there is a transition.  */
1278 
1279 static bfd_boolean
elf_i386_tls_transition(struct bfd_link_info * info,bfd * abfd,asection * sec,bfd_byte * contents,Elf_Internal_Shdr * symtab_hdr,struct elf_link_hash_entry ** sym_hashes,unsigned int * r_type,int tls_type,const Elf_Internal_Rela * rel,const Elf_Internal_Rela * relend,struct elf_link_hash_entry * h,unsigned long r_symndx)1280 elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1281                                asection *sec, bfd_byte *contents,
1282                                Elf_Internal_Shdr *symtab_hdr,
1283                                struct elf_link_hash_entry **sym_hashes,
1284                                unsigned int *r_type, int tls_type,
1285                                const Elf_Internal_Rela *rel,
1286                                const Elf_Internal_Rela *relend,
1287                                struct elf_link_hash_entry *h,
1288                                unsigned long r_symndx)
1289 {
1290   unsigned int from_type = *r_type;
1291   unsigned int to_type = from_type;
1292   bfd_boolean check = TRUE;
1293 
1294   /* Skip TLS transition for functions.  */
1295   if (h != NULL
1296       && (h->type == STT_FUNC
1297             || h->type == STT_GNU_IFUNC))
1298     return TRUE;
1299 
1300   switch (from_type)
1301     {
1302     case R_386_TLS_GD:
1303     case R_386_TLS_GOTDESC:
1304     case R_386_TLS_DESC_CALL:
1305     case R_386_TLS_IE_32:
1306     case R_386_TLS_IE:
1307     case R_386_TLS_GOTIE:
1308       if (info->executable)
1309           {
1310             if (h == NULL)
1311               to_type = R_386_TLS_LE_32;
1312             else if (from_type != R_386_TLS_IE
1313                        && from_type != R_386_TLS_GOTIE)
1314               to_type = R_386_TLS_IE_32;
1315           }
1316 
1317       /* When we are called from elf_i386_relocate_section, CONTENTS
1318            isn't NULL and there may be additional transitions based on
1319            TLS_TYPE.  */
1320       if (contents != NULL)
1321           {
1322             unsigned int new_to_type = to_type;
1323 
1324             if (info->executable
1325                 && h != NULL
1326                 && h->dynindx == -1
1327                 && (tls_type & GOT_TLS_IE))
1328               new_to_type = R_386_TLS_LE_32;
1329 
1330             if (to_type == R_386_TLS_GD
1331                 || to_type == R_386_TLS_GOTDESC
1332                 || to_type == R_386_TLS_DESC_CALL)
1333               {
1334                 if (tls_type == GOT_TLS_IE_POS)
1335                     new_to_type = R_386_TLS_GOTIE;
1336                 else if (tls_type & GOT_TLS_IE)
1337                     new_to_type = R_386_TLS_IE_32;
1338               }
1339 
1340             /* We checked the transition before when we were called from
1341                elf_i386_check_relocs.  We only want to check the new
1342                transition which hasn't been checked before.  */
1343             check = new_to_type != to_type && from_type == to_type;
1344             to_type = new_to_type;
1345           }
1346 
1347       break;
1348 
1349     case R_386_TLS_LDM:
1350       if (info->executable)
1351           to_type = R_386_TLS_LE_32;
1352       break;
1353 
1354     default:
1355       return TRUE;
1356     }
1357 
1358   /* Return TRUE if there is no transition.  */
1359   if (from_type == to_type)
1360     return TRUE;
1361 
1362   /* Check if the transition can be performed.  */
1363   if (check
1364       && ! elf_i386_check_tls_transition (abfd, sec, contents,
1365                                                     symtab_hdr, sym_hashes,
1366                                                     from_type, rel, relend))
1367     {
1368       reloc_howto_type *from, *to;
1369       const char *name;
1370 
1371       from = elf_i386_rtype_to_howto (abfd, from_type);
1372       to = elf_i386_rtype_to_howto (abfd, to_type);
1373 
1374       if (h)
1375           name = h->root.root.string;
1376       else
1377           {
1378             struct elf_i386_link_hash_table *htab;
1379 
1380             htab = elf_i386_hash_table (info);
1381             if (htab == NULL)
1382               name = "*unknown*";
1383             else
1384               {
1385                 Elf_Internal_Sym *isym;
1386 
1387                 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1388                                                       abfd, r_symndx);
1389                 name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1390               }
1391           }
1392 
1393       (*_bfd_error_handler)
1394           (_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1395              "in section `%A' failed"),
1396            abfd, sec, from->name, to->name, name,
1397            (unsigned long) rel->r_offset);
1398       bfd_set_error (bfd_error_bad_value);
1399       return FALSE;
1400     }
1401 
1402   *r_type = to_type;
1403   return TRUE;
1404 }
1405 
1406 /* Look through the relocs for a section during the first phase, and
1407    calculate needed space in the global offset table, procedure linkage
1408    table, and dynamic reloc sections.  */
1409 
1410 static bfd_boolean
elf_i386_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)1411 elf_i386_check_relocs (bfd *abfd,
1412                            struct bfd_link_info *info,
1413                            asection *sec,
1414                            const Elf_Internal_Rela *relocs)
1415 {
1416   struct elf_i386_link_hash_table *htab;
1417   Elf_Internal_Shdr *symtab_hdr;
1418   struct elf_link_hash_entry **sym_hashes;
1419   const Elf_Internal_Rela *rel;
1420   const Elf_Internal_Rela *rel_end;
1421   asection *sreloc;
1422 
1423   if (info->relocatable)
1424     return TRUE;
1425 
1426   BFD_ASSERT (is_i386_elf (abfd));
1427 
1428   htab = elf_i386_hash_table (info);
1429   if (htab == NULL)
1430     return FALSE;
1431 
1432   symtab_hdr = &elf_symtab_hdr (abfd);
1433   sym_hashes = elf_sym_hashes (abfd);
1434 
1435   sreloc = NULL;
1436 
1437   rel_end = relocs + sec->reloc_count;
1438   for (rel = relocs; rel < rel_end; rel++)
1439     {
1440       unsigned int r_type;
1441       unsigned long r_symndx;
1442       struct elf_link_hash_entry *h;
1443       Elf_Internal_Sym *isym;
1444       const char *name;
1445       bfd_boolean size_reloc;
1446 
1447       r_symndx = ELF32_R_SYM (rel->r_info);
1448       r_type = ELF32_R_TYPE (rel->r_info);
1449 
1450       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1451           {
1452             (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1453                                          abfd,
1454                                          r_symndx);
1455             return FALSE;
1456           }
1457 
1458       if (r_symndx < symtab_hdr->sh_info)
1459           {
1460             /* A local symbol.  */
1461             isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1462                                                   abfd, r_symndx);
1463             if (isym == NULL)
1464               return FALSE;
1465 
1466             /* Check relocation against local STT_GNU_IFUNC symbol.  */
1467             if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1468               {
1469                 h = elf_i386_get_local_sym_hash (htab, abfd, rel, TRUE);
1470                 if (h == NULL)
1471                     return FALSE;
1472 
1473                 /* Fake a STT_GNU_IFUNC symbol.  */
1474                 h->type = STT_GNU_IFUNC;
1475                 h->def_regular = 1;
1476                 h->ref_regular = 1;
1477                 h->forced_local = 1;
1478                 h->root.type = bfd_link_hash_defined;
1479               }
1480             else
1481               h = NULL;
1482           }
1483       else
1484           {
1485             isym = NULL;
1486             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1487             while (h->root.type == bfd_link_hash_indirect
1488                      || h->root.type == bfd_link_hash_warning)
1489               h = (struct elf_link_hash_entry *) h->root.u.i.link;
1490           }
1491 
1492       if (h != NULL)
1493           {
1494             /* Create the ifunc sections for static executables.  If we
1495                never see an indirect function symbol nor we are building
1496                a static executable, those sections will be empty and
1497                won't appear in output.  */
1498             switch (r_type)
1499               {
1500               default:
1501                 break;
1502 
1503               case R_386_32:
1504               case R_386_PC32:
1505               case R_386_PLT32:
1506               case R_386_GOT32:
1507               case R_386_GOTOFF:
1508                 if (htab->elf.dynobj == NULL)
1509                     htab->elf.dynobj = abfd;
1510                 if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
1511                     return FALSE;
1512                 break;
1513               }
1514 
1515             /* It is referenced by a non-shared object. */
1516             h->ref_regular = 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 *
elf_i386_gc_mark_hook(asection * sec,struct bfd_link_info * info,Elf_Internal_Rela * rel,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)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
elf_i386_gc_sweep_hook(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)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
elf_i386_adjust_dynamic_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h)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
elf_i386_allocate_dynrelocs(struct elf_link_hash_entry * h,void * inf)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, 4);
2200   else if (htab->elf.dynamic_sections_created
2201              && h->plt.refcount > 0)
2202     {
2203       /* Make sure this symbol is output as a dynamic symbol.
2204            Undefined weak syms won't yet be marked as dynamic.  */
2205       if (h->dynindx == -1
2206             && !h->forced_local)
2207           {
2208             if (! bfd_elf_link_record_dynamic_symbol (info, h))
2209               return FALSE;
2210           }
2211 
2212       if (info->shared
2213             || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2214           {
2215             asection *s = htab->elf.splt;
2216 
2217             /* If this is the first .plt entry, make room for the special
2218                first entry.  */
2219             if (s->size == 0)
2220               s->size += plt_entry_size;
2221 
2222             h->plt.offset = s->size;
2223 
2224             /* If this symbol is not defined in a regular file, and we are
2225                not generating a shared library, then set the symbol to this
2226                location in the .plt.  This is required to make function
2227                pointers compare as equal between the normal executable and
2228                the shared library.  */
2229             if (! info->shared
2230                 && !h->def_regular)
2231               {
2232                 h->root.u.def.section = s;
2233                 h->root.u.def.value = h->plt.offset;
2234               }
2235 
2236             /* Make room for this entry.  */
2237             s->size += plt_entry_size;
2238 
2239             /* We also need to make an entry in the .got.plt section, which
2240                will be placed in the .got section by the linker script.  */
2241             htab->elf.sgotplt->size += 4;
2242 
2243             /* We also need to make an entry in the .rel.plt section.  */
2244             htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2245             htab->elf.srelplt->reloc_count++;
2246 
2247             if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2248               && !info->shared)
2249               {
2250                 /* VxWorks has a second set of relocations for each PLT entry
2251                      in executables.  They go in a separate relocation section,
2252                      which is processed by the kernel loader.  */
2253 
2254                 /* There are two relocations for the initial PLT entry: an
2255                      R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2256                      R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
2257 
2258                 if (h->plt.offset == plt_entry_size)
2259                     htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2260 
2261                 /* There are two extra relocations for each subsequent PLT entry:
2262                      an R_386_32 relocation for the GOT entry, and an R_386_32
2263                      relocation for the PLT entry.  */
2264 
2265                 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2266               }
2267           }
2268       else
2269           {
2270             h->plt.offset = (bfd_vma) -1;
2271             h->needs_plt = 0;
2272           }
2273     }
2274   else
2275     {
2276       h->plt.offset = (bfd_vma) -1;
2277       h->needs_plt = 0;
2278     }
2279 
2280   eh->tlsdesc_got = (bfd_vma) -1;
2281 
2282   /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2283      make it a R_386_TLS_LE_32 requiring no TLS entry.  */
2284   if (h->got.refcount > 0
2285       && info->executable
2286       && h->dynindx == -1
2287       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2288     h->got.offset = (bfd_vma) -1;
2289   else if (h->got.refcount > 0)
2290     {
2291       asection *s;
2292       bfd_boolean dyn;
2293       int tls_type = elf_i386_hash_entry(h)->tls_type;
2294 
2295       /* Make sure this symbol is output as a dynamic symbol.
2296            Undefined weak syms won't yet be marked as dynamic.  */
2297       if (h->dynindx == -1
2298             && !h->forced_local)
2299           {
2300             if (! bfd_elf_link_record_dynamic_symbol (info, h))
2301               return FALSE;
2302           }
2303 
2304       s = htab->elf.sgot;
2305       if (GOT_TLS_GDESC_P (tls_type))
2306           {
2307             eh->tlsdesc_got = htab->elf.sgotplt->size
2308               - elf_i386_compute_jump_table_size (htab);
2309             htab->elf.sgotplt->size += 8;
2310             h->got.offset = (bfd_vma) -2;
2311           }
2312       if (! GOT_TLS_GDESC_P (tls_type)
2313             || GOT_TLS_GD_P (tls_type))
2314           {
2315             h->got.offset = s->size;
2316             s->size += 4;
2317             /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
2318             if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2319               s->size += 4;
2320           }
2321       dyn = htab->elf.dynamic_sections_created;
2322       /* R_386_TLS_IE_32 needs one dynamic relocation,
2323            R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2324            (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2325            need two), R_386_TLS_GD needs one if local symbol and two if
2326            global.  */
2327       if (tls_type == GOT_TLS_IE_BOTH)
2328           htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2329       else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2330                  || (tls_type & GOT_TLS_IE))
2331           htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2332       else if (GOT_TLS_GD_P (tls_type))
2333           htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2334       else if (! GOT_TLS_GDESC_P (tls_type)
2335                  && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2336                        || h->root.type != bfd_link_hash_undefweak)
2337                  && (info->shared
2338                        || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2339           htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2340       if (GOT_TLS_GDESC_P (tls_type))
2341           htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2342     }
2343   else
2344     h->got.offset = (bfd_vma) -1;
2345 
2346   if (eh->dyn_relocs == NULL)
2347     return TRUE;
2348 
2349   /* In the shared -Bsymbolic case, discard space allocated for
2350      dynamic pc-relative relocs against symbols which turn out to be
2351      defined in regular objects.  For the normal shared case, discard
2352      space for pc-relative relocs that have become local due to symbol
2353      visibility changes.  */
2354 
2355   if (info->shared)
2356     {
2357       /* The only reloc that uses pc_count is R_386_PC32, which will
2358            appear on a call or on something like ".long foo - .".  We
2359            want calls to protected symbols to resolve directly to the
2360            function rather than going via the plt.  If people want
2361            function pointer comparisons to work as expected then they
2362            should avoid writing assembly like ".long foo - .".  */
2363       if (SYMBOL_CALLS_LOCAL (info, h))
2364           {
2365             struct elf_dyn_relocs **pp;
2366 
2367             for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2368               {
2369                 p->count -= p->pc_count;
2370                 p->pc_count = 0;
2371                 if (p->count == 0)
2372                     *pp = p->next;
2373                 else
2374                     pp = &p->next;
2375               }
2376           }
2377 
2378       if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2379           {
2380             struct elf_dyn_relocs **pp;
2381             for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2382               {
2383                 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2384                     *pp = p->next;
2385                 else
2386                     pp = &p->next;
2387               }
2388           }
2389 
2390       /* Also discard relocs on undefined weak syms with non-default
2391            visibility.  */
2392       if (eh->dyn_relocs != NULL
2393             && h->root.type == bfd_link_hash_undefweak)
2394           {
2395             if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2396               eh->dyn_relocs = NULL;
2397 
2398             /* Make sure undefined weak symbols are output as a dynamic
2399                symbol in PIEs.  */
2400             else if (h->dynindx == -1
2401                        && !h->forced_local)
2402               {
2403                 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2404                     return FALSE;
2405               }
2406           }
2407     }
2408   else if (ELIMINATE_COPY_RELOCS)
2409     {
2410       /* For the non-shared case, discard space for relocs against
2411            symbols which turn out to need copy relocs or are not
2412            dynamic.  */
2413 
2414       if (!h->non_got_ref
2415             && ((h->def_dynamic
2416                  && !h->def_regular)
2417                 || (htab->elf.dynamic_sections_created
2418                       && (h->root.type == bfd_link_hash_undefweak
2419                           || h->root.type == bfd_link_hash_undefined))))
2420           {
2421             /* Make sure this symbol is output as a dynamic symbol.
2422                Undefined weak syms won't yet be marked as dynamic.  */
2423             if (h->dynindx == -1
2424                 && !h->forced_local)
2425               {
2426                 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2427                     return FALSE;
2428               }
2429 
2430             /* If that succeeded, we know we'll be keeping all the
2431                relocs.  */
2432             if (h->dynindx != -1)
2433               goto keep;
2434           }
2435 
2436       eh->dyn_relocs = NULL;
2437 
2438     keep: ;
2439     }
2440 
2441   /* Finally, allocate space.  */
2442   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2443     {
2444       asection *sreloc;
2445 
2446       sreloc = elf_section_data (p->sec)->sreloc;
2447 
2448       BFD_ASSERT (sreloc != NULL);
2449       sreloc->size += p->count * sizeof (Elf32_External_Rel);
2450     }
2451 
2452   return TRUE;
2453 }
2454 
2455 /* Allocate space in .plt, .got and associated reloc sections for
2456    local dynamic relocs.  */
2457 
2458 static bfd_boolean
elf_i386_allocate_local_dynrelocs(void ** slot,void * inf)2459 elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
2460 {
2461   struct elf_link_hash_entry *h
2462     = (struct elf_link_hash_entry *) *slot;
2463 
2464   if (h->type != STT_GNU_IFUNC
2465       || !h->def_regular
2466       || !h->ref_regular
2467       || !h->forced_local
2468       || h->root.type != bfd_link_hash_defined)
2469     abort ();
2470 
2471   return elf_i386_allocate_dynrelocs (h, inf);
2472 }
2473 
2474 /* Find any dynamic relocs that apply to read-only sections.  */
2475 
2476 static bfd_boolean
elf_i386_readonly_dynrelocs(struct elf_link_hash_entry * h,void * inf)2477 elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2478 {
2479   struct elf_i386_link_hash_entry *eh;
2480   struct elf_dyn_relocs *p;
2481 
2482   /* Skip local IFUNC symbols. */
2483   if (h->forced_local && h->type == STT_GNU_IFUNC)
2484     return TRUE;
2485 
2486   eh = (struct elf_i386_link_hash_entry *) h;
2487   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2488     {
2489       asection *s = p->sec->output_section;
2490 
2491       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2492           {
2493             struct bfd_link_info *info = (struct bfd_link_info *) inf;
2494 
2495             info->flags |= DF_TEXTREL;
2496 
2497             if (info->warn_shared_textrel && info->shared)
2498               info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'.\n"),
2499                                             p->sec->owner, h->root.root.string,
2500                                             p->sec);
2501 
2502             /* Not an error, just cut short the traversal.  */
2503             return FALSE;
2504           }
2505     }
2506   return TRUE;
2507 }
2508 
2509 /* Convert
2510    mov foo@GOT(%reg), %reg
2511    to
2512    lea foo@GOTOFF(%reg), %reg
2513    with the local symbol, foo.  */
2514 
2515 static bfd_boolean
elf_i386_convert_mov_to_lea(bfd * abfd,asection * sec,struct bfd_link_info * link_info)2516 elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
2517                                    struct bfd_link_info *link_info)
2518 {
2519   Elf_Internal_Shdr *symtab_hdr;
2520   Elf_Internal_Rela *internal_relocs;
2521   Elf_Internal_Rela *irel, *irelend;
2522   bfd_byte *contents;
2523   struct elf_i386_link_hash_table *htab;
2524   bfd_boolean changed_contents;
2525   bfd_boolean changed_relocs;
2526   bfd_signed_vma *local_got_refcounts;
2527 
2528   /* Don't even try to convert non-ELF outputs.  */
2529   if (!is_elf_hash_table (link_info->hash))
2530     return FALSE;
2531 
2532   /* Nothing to do if there are no codes, no relocations or no output.  */
2533   if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
2534       || sec->reloc_count == 0
2535       || discarded_section (sec))
2536     return TRUE;
2537 
2538   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2539 
2540   /* Load the relocations for this section.  */
2541   internal_relocs = (_bfd_elf_link_read_relocs
2542                          (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2543                           link_info->keep_memory));
2544   if (internal_relocs == NULL)
2545     return FALSE;
2546 
2547   htab = elf_i386_hash_table (link_info);
2548   changed_contents = FALSE;
2549   changed_relocs = FALSE;
2550   local_got_refcounts = elf_local_got_refcounts (abfd);
2551 
2552   /* Get the section contents.  */
2553   if (elf_section_data (sec)->this_hdr.contents != NULL)
2554     contents = elf_section_data (sec)->this_hdr.contents;
2555   else
2556     {
2557       if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2558           goto error_return;
2559     }
2560 
2561   irelend = internal_relocs + sec->reloc_count;
2562   for (irel = internal_relocs; irel < irelend; irel++)
2563     {
2564       unsigned int r_type = ELF32_R_TYPE (irel->r_info);
2565       unsigned int r_symndx = ELF32_R_SYM (irel->r_info);
2566       unsigned int indx;
2567       struct elf_link_hash_entry *h;
2568 
2569       if (r_type != R_386_GOT32)
2570           continue;
2571 
2572       /* Get the symbol referred to by the reloc.  */
2573       if (r_symndx < symtab_hdr->sh_info)
2574           {
2575             Elf_Internal_Sym *isym;
2576 
2577             isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2578                                                   abfd, r_symndx);
2579 
2580             /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  */
2581             if (ELF_ST_TYPE (isym->st_info) != STT_GNU_IFUNC
2582                 && bfd_get_8 (input_bfd,
2583                                   contents + irel->r_offset - 2) == 0x8b)
2584               {
2585                 bfd_put_8 (output_bfd, 0x8d,
2586                                contents + irel->r_offset - 2);
2587                 irel->r_info = ELF32_R_INFO (r_symndx, R_386_GOTOFF);
2588                 if (local_got_refcounts != NULL
2589                       && local_got_refcounts[r_symndx] > 0)
2590                     local_got_refcounts[r_symndx] -= 1;
2591                 changed_contents = TRUE;
2592                 changed_relocs = TRUE;
2593               }
2594             continue;
2595           }
2596 
2597       indx = r_symndx - symtab_hdr->sh_info;
2598       h = elf_sym_hashes (abfd)[indx];
2599       BFD_ASSERT (h != NULL);
2600 
2601       while (h->root.type == bfd_link_hash_indirect
2602                || h->root.type == bfd_link_hash_warning)
2603           h = (struct elf_link_hash_entry *) h->root.u.i.link;
2604 
2605       /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  We also avoid
2606            optimizing _DYNAMIC since ld.so may use its link-time address.  */
2607       if (h->def_regular
2608             && h->type != STT_GNU_IFUNC
2609             && h != htab->elf.hdynamic
2610             && SYMBOL_REFERENCES_LOCAL (link_info, h)
2611             && bfd_get_8 (input_bfd,
2612                               contents + irel->r_offset - 2) == 0x8b)
2613           {
2614             bfd_put_8 (output_bfd, 0x8d,
2615                          contents + irel->r_offset - 2);
2616             irel->r_info = ELF32_R_INFO (r_symndx, R_386_GOTOFF);
2617             if (h->got.refcount > 0)
2618               h->got.refcount -= 1;
2619             changed_contents = TRUE;
2620             changed_relocs = TRUE;
2621           }
2622     }
2623 
2624   if (contents != NULL
2625       && elf_section_data (sec)->this_hdr.contents != contents)
2626     {
2627       if (!changed_contents && !link_info->keep_memory)
2628           free (contents);
2629       else
2630           {
2631             /* Cache the section contents for elf_link_input_bfd.  */
2632             elf_section_data (sec)->this_hdr.contents = contents;
2633           }
2634     }
2635 
2636   if (elf_section_data (sec)->relocs != internal_relocs)
2637     {
2638       if (!changed_relocs)
2639           free (internal_relocs);
2640       else
2641           elf_section_data (sec)->relocs = internal_relocs;
2642     }
2643 
2644   return TRUE;
2645 
2646  error_return:
2647   if (contents != NULL
2648       && elf_section_data (sec)->this_hdr.contents != contents)
2649     free (contents);
2650   if (internal_relocs != NULL
2651       && elf_section_data (sec)->relocs != internal_relocs)
2652     free (internal_relocs);
2653   return FALSE;
2654 }
2655 
2656 /* Set the sizes of the dynamic sections.  */
2657 
2658 static bfd_boolean
elf_i386_size_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)2659 elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
2660 {
2661   struct elf_i386_link_hash_table *htab;
2662   bfd *dynobj;
2663   asection *s;
2664   bfd_boolean relocs;
2665   bfd *ibfd;
2666 
2667   htab = elf_i386_hash_table (info);
2668   if (htab == NULL)
2669     return FALSE;
2670   dynobj = htab->elf.dynobj;
2671   if (dynobj == NULL)
2672     abort ();
2673 
2674   if (htab->elf.dynamic_sections_created)
2675     {
2676       /* Set the contents of the .interp section to the interpreter.  */
2677       if (info->executable)
2678           {
2679             s = bfd_get_linker_section (dynobj, ".interp");
2680             if (s == NULL)
2681               abort ();
2682             s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2683             s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2684           }
2685     }
2686 
2687   /* Set up .got offsets for local syms, and space for local dynamic
2688      relocs.  */
2689   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2690     {
2691       bfd_signed_vma *local_got;
2692       bfd_signed_vma *end_local_got;
2693       char *local_tls_type;
2694       bfd_vma *local_tlsdesc_gotent;
2695       bfd_size_type locsymcount;
2696       Elf_Internal_Shdr *symtab_hdr;
2697       asection *srel;
2698 
2699       if (! is_i386_elf (ibfd))
2700           continue;
2701 
2702       for (s = ibfd->sections; s != NULL; s = s->next)
2703           {
2704             struct elf_dyn_relocs *p;
2705 
2706             if (!elf_i386_convert_mov_to_lea (ibfd, s, info))
2707               return FALSE;
2708 
2709             for (p = ((struct elf_dyn_relocs *)
2710                          elf_section_data (s)->local_dynrel);
2711                  p != NULL;
2712                  p = p->next)
2713               {
2714                 if (!bfd_is_abs_section (p->sec)
2715                       && bfd_is_abs_section (p->sec->output_section))
2716                     {
2717                       /* Input section has been discarded, either because
2718                          it is a copy of a linkonce section or due to
2719                          linker script /DISCARD/, so we'll be discarding
2720                          the relocs too.  */
2721                     }
2722                 else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
2723                            && strcmp (p->sec->output_section->name,
2724                                           ".tls_vars") == 0)
2725                     {
2726                       /* Relocations in vxworks .tls_vars sections are
2727                          handled specially by the loader.  */
2728                     }
2729                 else if (p->count != 0)
2730                     {
2731                       srel = elf_section_data (p->sec)->sreloc;
2732                       srel->size += p->count * sizeof (Elf32_External_Rel);
2733                       if ((p->sec->output_section->flags & SEC_READONLY) != 0
2734                           && (info->flags & DF_TEXTREL) == 0)
2735                         {
2736                           info->flags |= DF_TEXTREL;
2737                           if (info->warn_shared_textrel && info->shared)
2738                               info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'.\n"),
2739                                                             p->sec->owner, p->sec);
2740                         }
2741                     }
2742               }
2743           }
2744 
2745       local_got = elf_local_got_refcounts (ibfd);
2746       if (!local_got)
2747           continue;
2748 
2749       symtab_hdr = &elf_symtab_hdr (ibfd);
2750       locsymcount = symtab_hdr->sh_info;
2751       end_local_got = local_got + locsymcount;
2752       local_tls_type = elf_i386_local_got_tls_type (ibfd);
2753       local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
2754       s = htab->elf.sgot;
2755       srel = htab->elf.srelgot;
2756       for (; local_got < end_local_got;
2757              ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
2758           {
2759             *local_tlsdesc_gotent = (bfd_vma) -1;
2760             if (*local_got > 0)
2761               {
2762                 if (GOT_TLS_GDESC_P (*local_tls_type))
2763                     {
2764                       *local_tlsdesc_gotent = htab->elf.sgotplt->size
2765                         - elf_i386_compute_jump_table_size (htab);
2766                       htab->elf.sgotplt->size += 8;
2767                       *local_got = (bfd_vma) -2;
2768                     }
2769                 if (! GOT_TLS_GDESC_P (*local_tls_type)
2770                       || GOT_TLS_GD_P (*local_tls_type))
2771                     {
2772                       *local_got = s->size;
2773                       s->size += 4;
2774                       if (GOT_TLS_GD_P (*local_tls_type)
2775                           || *local_tls_type == GOT_TLS_IE_BOTH)
2776                         s->size += 4;
2777                     }
2778                 if (info->shared
2779                       || GOT_TLS_GD_ANY_P (*local_tls_type)
2780                       || (*local_tls_type & GOT_TLS_IE))
2781                     {
2782                       if (*local_tls_type == GOT_TLS_IE_BOTH)
2783                         srel->size += 2 * sizeof (Elf32_External_Rel);
2784                       else if (GOT_TLS_GD_P (*local_tls_type)
2785                                  || ! GOT_TLS_GDESC_P (*local_tls_type))
2786                         srel->size += sizeof (Elf32_External_Rel);
2787                       if (GOT_TLS_GDESC_P (*local_tls_type))
2788                         htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2789                     }
2790               }
2791             else
2792               *local_got = (bfd_vma) -1;
2793           }
2794     }
2795 
2796   if (htab->tls_ldm_got.refcount > 0)
2797     {
2798       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
2799            relocs.  */
2800       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2801       htab->elf.sgot->size += 8;
2802       htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2803     }
2804   else
2805     htab->tls_ldm_got.offset = -1;
2806 
2807   /* Allocate global sym .plt and .got entries, and space for global
2808      sym dynamic relocs.  */
2809   elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
2810 
2811   /* Allocate .plt and .got entries, and space for local symbols.  */
2812   htab_traverse (htab->loc_hash_table,
2813                      elf_i386_allocate_local_dynrelocs,
2814                      info);
2815 
2816   /* For every jump slot reserved in the sgotplt, reloc_count is
2817      incremented.  However, when we reserve space for TLS descriptors,
2818      it's not incremented, so in order to compute the space reserved
2819      for them, it suffices to multiply the reloc count by the jump
2820      slot size.
2821 
2822      PR ld/13302: We start next_irelative_index at the end of .rela.plt
2823      so that R_386_IRELATIVE entries come last.  */
2824   if (htab->elf.srelplt)
2825     {
2826       htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
2827       htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
2828       htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
2829     }
2830   else if (htab->elf.irelplt)
2831     htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
2832 
2833 
2834   if (htab->elf.sgotplt)
2835     {
2836       /* Don't allocate .got.plt section if there are no GOT nor PLT
2837          entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
2838       if ((htab->elf.hgot == NULL
2839              || !htab->elf.hgot->ref_regular_nonweak)
2840             && (htab->elf.sgotplt->size
2841                 == get_elf_backend_data (output_bfd)->got_header_size)
2842             && (htab->elf.splt == NULL
2843                 || htab->elf.splt->size == 0)
2844             && (htab->elf.sgot == NULL
2845                 || htab->elf.sgot->size == 0)
2846             && (htab->elf.iplt == NULL
2847                 || htab->elf.iplt->size == 0)
2848             && (htab->elf.igotplt == NULL
2849                 || htab->elf.igotplt->size == 0))
2850           htab->elf.sgotplt->size = 0;
2851     }
2852 
2853 
2854   if (htab->plt_eh_frame != NULL
2855       && htab->elf.splt != NULL
2856       && htab->elf.splt->size != 0
2857       && !bfd_is_abs_section (htab->elf.splt->output_section)
2858       && _bfd_elf_eh_frame_present (info))
2859     htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
2860 
2861   /* We now have determined the sizes of the various dynamic sections.
2862      Allocate memory for them.  */
2863   relocs = FALSE;
2864   for (s = dynobj->sections; s != NULL; s = s->next)
2865     {
2866       bfd_boolean strip_section = TRUE;
2867 
2868       if ((s->flags & SEC_LINKER_CREATED) == 0)
2869           continue;
2870 
2871       if (s == htab->elf.splt
2872             || s == htab->elf.sgot)
2873           {
2874             /* Strip this section if we don't need it; see the
2875                comment below.  */
2876             /* We'd like to strip these sections if they aren't needed, but if
2877                we've exported dynamic symbols from them we must leave them.
2878                It's too late to tell BFD to get rid of the symbols.  */
2879 
2880             if (htab->elf.hplt != NULL)
2881               strip_section = FALSE;
2882           }
2883       else if (s == htab->elf.sgotplt
2884                  || s == htab->elf.iplt
2885                  || s == htab->elf.igotplt
2886                  || s == htab->plt_eh_frame
2887                  || s == htab->sdynbss)
2888           {
2889             /* Strip these too.  */
2890           }
2891       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
2892           {
2893             if (s->size != 0
2894                 && s != htab->elf.srelplt
2895                 && s != htab->srelplt2)
2896               relocs = TRUE;
2897 
2898             /* We use the reloc_count field as a counter if we need
2899                to copy relocs into the output file.  */
2900             s->reloc_count = 0;
2901           }
2902       else
2903           {
2904             /* It's not one of our sections, so don't allocate space.  */
2905             continue;
2906           }
2907 
2908       if (s->size == 0)
2909           {
2910             /* If we don't need this section, strip it from the
2911                output file.  This is mostly to handle .rel.bss and
2912                .rel.plt.  We must create both sections in
2913                create_dynamic_sections, because they must be created
2914                before the linker maps input sections to output
2915                sections.  The linker does that before
2916                adjust_dynamic_symbol is called, and it is that
2917                function which decides whether anything needs to go
2918                into these sections.  */
2919             if (strip_section)
2920               s->flags |= SEC_EXCLUDE;
2921             continue;
2922           }
2923 
2924       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2925           continue;
2926 
2927       /* Allocate memory for the section contents.  We use bfd_zalloc
2928            here in case unused entries are not reclaimed before the
2929            section's contents are written out.  This should not happen,
2930            but this way if it does, we get a R_386_NONE reloc instead
2931            of garbage.  */
2932       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
2933       if (s->contents == NULL)
2934           return FALSE;
2935     }
2936 
2937   if (htab->plt_eh_frame != NULL
2938       && htab->plt_eh_frame->contents != NULL)
2939     {
2940       memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
2941                 sizeof (elf_i386_eh_frame_plt));
2942       bfd_put_32 (dynobj, htab->elf.splt->size,
2943                       htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
2944     }
2945 
2946   if (htab->elf.dynamic_sections_created)
2947     {
2948       /* Add some entries to the .dynamic section.  We fill in the
2949            values later, in elf_i386_finish_dynamic_sections, but we
2950            must add the entries now so that we get the correct size for
2951            the .dynamic section.  The DT_DEBUG entry is filled in by the
2952            dynamic linker and used by the debugger.  */
2953 #define add_dynamic_entry(TAG, VAL) \
2954   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2955 
2956       if (info->executable)
2957           {
2958             if (!add_dynamic_entry (DT_DEBUG, 0))
2959               return FALSE;
2960           }
2961 
2962       if (htab->elf.splt->size != 0)
2963           {
2964             if (!add_dynamic_entry (DT_PLTGOT, 0)
2965                 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2966                 || !add_dynamic_entry (DT_PLTREL, DT_REL)
2967                 || !add_dynamic_entry (DT_JMPREL, 0))
2968               return FALSE;
2969           }
2970 
2971       if (relocs)
2972           {
2973             if (!add_dynamic_entry (DT_REL, 0)
2974                 || !add_dynamic_entry (DT_RELSZ, 0)
2975                 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
2976               return FALSE;
2977 
2978             /* If any dynamic relocs apply to a read-only section,
2979                then we need a DT_TEXTREL entry.  */
2980             if ((info->flags & DF_TEXTREL) == 0)
2981               elf_link_hash_traverse (&htab->elf,
2982                                             elf_i386_readonly_dynrelocs, info);
2983 
2984             if ((info->flags & DF_TEXTREL) != 0)
2985               {
2986                 if (!add_dynamic_entry (DT_TEXTREL, 0))
2987                     return FALSE;
2988               }
2989           }
2990       if (get_elf_i386_backend_data (output_bfd)->is_vxworks
2991             && !elf_vxworks_add_dynamic_entries (output_bfd, info))
2992           return FALSE;
2993     }
2994 #undef add_dynamic_entry
2995 
2996   return TRUE;
2997 }
2998 
2999 static bfd_boolean
elf_i386_always_size_sections(bfd * output_bfd,struct bfd_link_info * info)3000 elf_i386_always_size_sections (bfd *output_bfd,
3001                                      struct bfd_link_info *info)
3002 {
3003   asection *tls_sec = elf_hash_table (info)->tls_sec;
3004 
3005   if (tls_sec)
3006     {
3007       struct elf_link_hash_entry *tlsbase;
3008 
3009       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3010                                               "_TLS_MODULE_BASE_",
3011                                               FALSE, FALSE, FALSE);
3012 
3013       if (tlsbase && tlsbase->type == STT_TLS)
3014           {
3015             struct elf_i386_link_hash_table *htab;
3016             struct bfd_link_hash_entry *bh = NULL;
3017             const struct elf_backend_data *bed
3018               = get_elf_backend_data (output_bfd);
3019 
3020             htab = elf_i386_hash_table (info);
3021             if (htab == NULL)
3022               return FALSE;
3023 
3024             if (!(_bfd_generic_link_add_one_symbol
3025                     (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3026                      tls_sec, 0, NULL, FALSE,
3027                      bed->collect, &bh)))
3028               return FALSE;
3029 
3030             htab->tls_module_base = bh;
3031 
3032             tlsbase = (struct elf_link_hash_entry *)bh;
3033             tlsbase->def_regular = 1;
3034             tlsbase->other = STV_HIDDEN;
3035             (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3036           }
3037     }
3038 
3039   return TRUE;
3040 }
3041 
3042 /* Set the correct type for an x86 ELF section.  We do this by the
3043    section name, which is a hack, but ought to work.  */
3044 
3045 static bfd_boolean
elf_i386_fake_sections(bfd * abfd ATTRIBUTE_UNUSED,Elf_Internal_Shdr * hdr,asection * sec)3046 elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3047                               Elf_Internal_Shdr *hdr,
3048                               asection *sec)
3049 {
3050   const char *name;
3051 
3052   name = bfd_get_section_name (abfd, sec);
3053 
3054   /* This is an ugly, but unfortunately necessary hack that is
3055      needed when producing EFI binaries on x86. It tells
3056      elf.c:elf_fake_sections() not to consider ".reloc" as a section
3057      containing ELF relocation info.  We need this hack in order to
3058      be able to generate ELF binaries that can be translated into
3059      EFI applications (which are essentially COFF objects).  Those
3060      files contain a COFF ".reloc" section inside an ELFNN object,
3061      which would normally cause BFD to segfault because it would
3062      attempt to interpret this section as containing relocation
3063      entries for section "oc".  With this hack enabled, ".reloc"
3064      will be treated as a normal data section, which will avoid the
3065      segfault.  However, you won't be able to create an ELFNN binary
3066      with a section named "oc" that needs relocations, but that's
3067      the kind of ugly side-effects you get when detecting section
3068      types based on their names...  In practice, this limitation is
3069      unlikely to bite.  */
3070   if (strcmp (name, ".reloc") == 0)
3071     hdr->sh_type = SHT_PROGBITS;
3072 
3073   return TRUE;
3074 }
3075 
3076 /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3077    executables.  Rather than setting it to the beginning of the TLS
3078    section, we have to set it to the end.    This function may be called
3079    multiple times, it is idempotent.  */
3080 
3081 static void
elf_i386_set_tls_module_base(struct bfd_link_info * info)3082 elf_i386_set_tls_module_base (struct bfd_link_info *info)
3083 {
3084   struct elf_i386_link_hash_table *htab;
3085   struct bfd_link_hash_entry *base;
3086 
3087   if (!info->executable)
3088     return;
3089 
3090   htab = elf_i386_hash_table (info);
3091   if (htab == NULL)
3092     return;
3093 
3094   base = htab->tls_module_base;
3095   if (base == NULL)
3096     return;
3097 
3098   base->u.def.value = htab->elf.tls_size;
3099 }
3100 
3101 /* Return the base VMA address which should be subtracted from real addresses
3102    when resolving @dtpoff relocation.
3103    This is PT_TLS segment p_vaddr.  */
3104 
3105 static bfd_vma
elf_i386_dtpoff_base(struct bfd_link_info * info)3106 elf_i386_dtpoff_base (struct bfd_link_info *info)
3107 {
3108   /* If tls_sec is NULL, we should have signalled an error already.  */
3109   if (elf_hash_table (info)->tls_sec == NULL)
3110     return 0;
3111   return elf_hash_table (info)->tls_sec->vma;
3112 }
3113 
3114 /* Return the relocation value for @tpoff relocation
3115    if STT_TLS virtual address is ADDRESS.  */
3116 
3117 static bfd_vma
elf_i386_tpoff(struct bfd_link_info * info,bfd_vma address)3118 elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3119 {
3120   struct elf_link_hash_table *htab = elf_hash_table (info);
3121   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3122   bfd_vma static_tls_size;
3123 
3124   /* If tls_sec is NULL, we should have signalled an error already.  */
3125   if (htab->tls_sec == NULL)
3126     return 0;
3127 
3128   /* Consider special static TLS alignment requirements.  */
3129   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3130   return static_tls_size + htab->tls_sec->vma - address;
3131 }
3132 
3133 /* Relocate an i386 ELF section.  */
3134 
3135 static bfd_boolean
elf_i386_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)3136 elf_i386_relocate_section (bfd *output_bfd,
3137                                  struct bfd_link_info *info,
3138                                  bfd *input_bfd,
3139                                  asection *input_section,
3140                                  bfd_byte *contents,
3141                                  Elf_Internal_Rela *relocs,
3142                                  Elf_Internal_Sym *local_syms,
3143                                  asection **local_sections)
3144 {
3145   struct elf_i386_link_hash_table *htab;
3146   Elf_Internal_Shdr *symtab_hdr;
3147   struct elf_link_hash_entry **sym_hashes;
3148   bfd_vma *local_got_offsets;
3149   bfd_vma *local_tlsdesc_gotents;
3150   Elf_Internal_Rela *rel;
3151   Elf_Internal_Rela *relend;
3152   bfd_boolean is_vxworks_tls;
3153   unsigned plt_entry_size;
3154 
3155   BFD_ASSERT (is_i386_elf (input_bfd));
3156 
3157   htab = elf_i386_hash_table (info);
3158   if (htab == NULL)
3159     return FALSE;
3160   symtab_hdr = &elf_symtab_hdr (input_bfd);
3161   sym_hashes = elf_sym_hashes (input_bfd);
3162   local_got_offsets = elf_local_got_offsets (input_bfd);
3163   local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3164   /* We have to handle relocations in vxworks .tls_vars sections
3165      specially, because the dynamic loader is 'weird'.  */
3166   is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3167                     && info->shared
3168                         && !strcmp (input_section->output_section->name,
3169                                         ".tls_vars"));
3170 
3171   elf_i386_set_tls_module_base (info);
3172 
3173   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3174 
3175   rel = relocs;
3176   relend = relocs + input_section->reloc_count;
3177   for (; rel < relend; rel++)
3178     {
3179       unsigned int r_type;
3180       reloc_howto_type *howto;
3181       unsigned long r_symndx;
3182       struct elf_link_hash_entry *h;
3183       Elf_Internal_Sym *sym;
3184       asection *sec;
3185       bfd_vma off, offplt;
3186       bfd_vma relocation;
3187       bfd_boolean unresolved_reloc;
3188       bfd_reloc_status_type r;
3189       unsigned int indx;
3190       int tls_type;
3191       bfd_vma st_size;
3192 
3193       r_type = ELF32_R_TYPE (rel->r_info);
3194       if (r_type == R_386_GNU_VTINHERIT
3195             || r_type == R_386_GNU_VTENTRY)
3196           continue;
3197 
3198       if ((indx = r_type) >= R_386_standard
3199             && ((indx = r_type - R_386_ext_offset) - R_386_standard
3200                 >= R_386_ext - R_386_standard)
3201             && ((indx = r_type - R_386_tls_offset) - R_386_ext
3202                 >= R_386_irelative - R_386_ext))
3203           {
3204             (*_bfd_error_handler)
3205               (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3206                input_bfd, input_section, r_type);
3207             bfd_set_error (bfd_error_bad_value);
3208             return FALSE;
3209           }
3210       howto = elf_howto_table + indx;
3211 
3212       r_symndx = ELF32_R_SYM (rel->r_info);
3213       h = NULL;
3214       sym = NULL;
3215       sec = NULL;
3216       unresolved_reloc = FALSE;
3217       if (r_symndx < symtab_hdr->sh_info)
3218           {
3219             sym = local_syms + r_symndx;
3220             sec = local_sections[r_symndx];
3221             relocation = (sec->output_section->vma
3222                               + sec->output_offset
3223                               + sym->st_value);
3224             st_size = sym->st_size;
3225 
3226             if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3227                 && ((sec->flags & SEC_MERGE) != 0
3228                       || (info->relocatable
3229                           && sec->output_offset != 0)))
3230               {
3231                 bfd_vma addend;
3232                 bfd_byte *where = contents + rel->r_offset;
3233 
3234                 switch (howto->size)
3235                     {
3236                     case 0:
3237                       addend = bfd_get_8 (input_bfd, where);
3238                       if (howto->pc_relative)
3239                         {
3240                           addend = (addend ^ 0x80) - 0x80;
3241                           addend += 1;
3242                         }
3243                       break;
3244                     case 1:
3245                       addend = bfd_get_16 (input_bfd, where);
3246                       if (howto->pc_relative)
3247                         {
3248                           addend = (addend ^ 0x8000) - 0x8000;
3249                           addend += 2;
3250                         }
3251                       break;
3252                     case 2:
3253                       addend = bfd_get_32 (input_bfd, where);
3254                       if (howto->pc_relative)
3255                         {
3256                           addend = (addend ^ 0x80000000) - 0x80000000;
3257                           addend += 4;
3258                         }
3259                       break;
3260                     default:
3261                       abort ();
3262                     }
3263 
3264                 if (info->relocatable)
3265                     addend += sec->output_offset;
3266                 else
3267                     {
3268                       asection *msec = sec;
3269                       addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3270                                                                addend);
3271                       addend -= relocation;
3272                       addend += msec->output_section->vma + msec->output_offset;
3273                     }
3274 
3275                 switch (howto->size)
3276                     {
3277                     case 0:
3278                       /* FIXME: overflow checks.  */
3279                       if (howto->pc_relative)
3280                         addend -= 1;
3281                       bfd_put_8 (input_bfd, addend, where);
3282                       break;
3283                     case 1:
3284                       if (howto->pc_relative)
3285                         addend -= 2;
3286                       bfd_put_16 (input_bfd, addend, where);
3287                       break;
3288                     case 2:
3289                       if (howto->pc_relative)
3290                         addend -= 4;
3291                       bfd_put_32 (input_bfd, addend, where);
3292                       break;
3293                     }
3294               }
3295             else if (!info->relocatable
3296                        && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3297               {
3298                 /* Relocate against local STT_GNU_IFUNC symbol.  */
3299                 h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3300                                                          FALSE);
3301                 if (h == NULL)
3302                     abort ();
3303 
3304                 /* Set STT_GNU_IFUNC symbol value.  */
3305                 h->root.u.def.value = sym->st_value;
3306                 h->root.u.def.section = sec;
3307               }
3308           }
3309       else
3310           {
3311             bfd_boolean warned ATTRIBUTE_UNUSED;
3312 
3313             RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3314                                            r_symndx, symtab_hdr, sym_hashes,
3315                                            h, sec, relocation,
3316                                            unresolved_reloc, warned);
3317             st_size = h->size;
3318           }
3319 
3320       if (sec != NULL && discarded_section (sec))
3321           RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3322                                                    rel, 1, relend, howto, 0, contents);
3323 
3324       if (info->relocatable)
3325           continue;
3326 
3327       /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3328            it here if it is defined in a non-shared object.  */
3329       if (h != NULL
3330             && h->type == STT_GNU_IFUNC
3331             && h->def_regular)
3332           {
3333             asection *plt, *gotplt, *base_got;
3334             bfd_vma plt_index;
3335             const char *name;
3336 
3337             if ((input_section->flags & SEC_ALLOC) == 0
3338                 || h->plt.offset == (bfd_vma) -1)
3339               abort ();
3340 
3341             /* STT_GNU_IFUNC symbol must go through PLT.  */
3342             if (htab->elf.splt != NULL)
3343               {
3344                 plt = htab->elf.splt;
3345                 gotplt = htab->elf.sgotplt;
3346               }
3347             else
3348               {
3349                 plt = htab->elf.iplt;
3350                 gotplt = htab->elf.igotplt;
3351               }
3352 
3353             relocation = (plt->output_section->vma
3354                               + plt->output_offset + h->plt.offset);
3355 
3356             switch (r_type)
3357               {
3358               default:
3359                 if (h->root.root.string)
3360                     name = h->root.root.string;
3361                 else
3362                     name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3363                                                    NULL);
3364                 (*_bfd_error_handler)
3365                     (_("%B: relocation %s against STT_GNU_IFUNC "
3366                        "symbol `%s' isn't handled by %s"), input_bfd,
3367                      elf_howto_table[r_type].name,
3368                      name, __FUNCTION__);
3369                 bfd_set_error (bfd_error_bad_value);
3370                 return FALSE;
3371 
3372               case R_386_32:
3373                 /* Generate dynamic relcoation only when there is a
3374                      non-GOT reference in a shared object.  */
3375                 if (info->shared && h->non_got_ref)
3376                     {
3377                       Elf_Internal_Rela outrel;
3378                       asection *sreloc;
3379                       bfd_vma offset;
3380 
3381                       /* Need a dynamic relocation to get the real function
3382                          adddress.  */
3383                       offset = _bfd_elf_section_offset (output_bfd,
3384                                                                 info,
3385                                                                 input_section,
3386                                                                 rel->r_offset);
3387                       if (offset == (bfd_vma) -1
3388                           || offset == (bfd_vma) -2)
3389                         abort ();
3390 
3391                       outrel.r_offset = (input_section->output_section->vma
3392                                              + input_section->output_offset
3393                                              + offset);
3394 
3395                       if (h->dynindx == -1
3396                           || h->forced_local
3397                           || info->executable)
3398                         {
3399                           /* This symbol is resolved locally.  */
3400                           outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
3401                           bfd_put_32 (output_bfd,
3402                                           (h->root.u.def.value
3403                                            + h->root.u.def.section->output_section->vma
3404                                            + h->root.u.def.section->output_offset),
3405                                           contents + offset);
3406                         }
3407                       else
3408                         outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3409 
3410                       sreloc = htab->elf.irelifunc;
3411                       elf_append_rel (output_bfd, sreloc, &outrel);
3412 
3413                       /* If this reloc is against an external symbol, we
3414                          do not want to fiddle with the addend.  Otherwise,
3415                          we need to include the symbol value so that it
3416                          becomes an addend for the dynamic reloc.  For an
3417                          internal symbol, we have updated addend.  */
3418                       continue;
3419                     }
3420                 /* FALLTHROUGH */
3421               case R_386_PC32:
3422               case R_386_PLT32:
3423                 goto do_relocation;
3424 
3425               case R_386_GOT32:
3426                 base_got = htab->elf.sgot;
3427                 off = h->got.offset;
3428 
3429                 if (base_got == NULL)
3430                     abort ();
3431 
3432                 if (off == (bfd_vma) -1)
3433                     {
3434                       /* We can't use h->got.offset here to save state, or
3435                          even just remember the offset, as finish_dynamic_symbol
3436                          would use that as offset into .got.  */
3437 
3438                       if (htab->elf.splt != NULL)
3439                         {
3440                           plt_index = h->plt.offset / plt_entry_size - 1;
3441                           off = (plt_index + 3) * 4;
3442                           base_got = htab->elf.sgotplt;
3443                         }
3444                       else
3445                         {
3446                           plt_index = h->plt.offset / plt_entry_size;
3447                           off = plt_index * 4;
3448                           base_got = htab->elf.igotplt;
3449                         }
3450 
3451                       if (h->dynindx == -1
3452                           || h->forced_local
3453                           || info->symbolic)
3454                         {
3455                           /* This references the local defitionion.  We must
3456                                initialize this entry in the global offset table.
3457                                Since the offset must always be a multiple of 8,
3458                                we use the least significant bit to record
3459                                whether we have initialized it already.
3460 
3461                                When doing a dynamic link, we create a .rela.got
3462                                relocation entry to initialize the value.  This
3463                                is done in the finish_dynamic_symbol routine.     */
3464                           if ((off & 1) != 0)
3465                               off &= ~1;
3466                           else
3467                               {
3468                                 bfd_put_32 (output_bfd, relocation,
3469                                               base_got->contents + off);
3470                                 h->got.offset |= 1;
3471                               }
3472                         }
3473 
3474                       relocation = off;
3475 
3476                       /* Adjust for static executables.  */
3477                       if (htab->elf.splt == NULL)
3478                         relocation += gotplt->output_offset;
3479                     }
3480                 else
3481                     {
3482                       relocation = (base_got->output_section->vma
3483                                         + base_got->output_offset + off
3484                                         - gotplt->output_section->vma
3485                                         - gotplt->output_offset);
3486                       /* Adjust for static executables.  */
3487                       if (htab->elf.splt == NULL)
3488                         relocation += gotplt->output_offset;
3489                     }
3490 
3491                 goto do_relocation;
3492 
3493               case R_386_GOTOFF:
3494                 relocation -= (gotplt->output_section->vma
3495                                    + gotplt->output_offset);
3496                 goto do_relocation;
3497               }
3498           }
3499 
3500       switch (r_type)
3501           {
3502           case R_386_GOT32:
3503             /* Relocation is to the entry for this symbol in the global
3504                offset table.  */
3505             if (htab->elf.sgot == NULL)
3506               abort ();
3507 
3508             if (h != NULL)
3509               {
3510                 bfd_boolean dyn;
3511 
3512                 off = h->got.offset;
3513                 dyn = htab->elf.dynamic_sections_created;
3514                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3515                       || (info->shared
3516                           && SYMBOL_REFERENCES_LOCAL (info, h))
3517                       || (ELF_ST_VISIBILITY (h->other)
3518                           && h->root.type == bfd_link_hash_undefweak))
3519                     {
3520                       /* This is actually a static link, or it is a
3521                          -Bsymbolic link and the symbol is defined
3522                          locally, or the symbol was forced to be local
3523                          because of a version file.  We must initialize
3524                          this entry in the global offset table.  Since the
3525                          offset must always be a multiple of 4, we use the
3526                          least significant bit to record whether we have
3527                          initialized it already.
3528 
3529                          When doing a dynamic link, we create a .rel.got
3530                          relocation entry to initialize the value.  This
3531                          is done in the finish_dynamic_symbol routine.  */
3532                       if ((off & 1) != 0)
3533                         off &= ~1;
3534                       else
3535                         {
3536                           bfd_put_32 (output_bfd, relocation,
3537                                           htab->elf.sgot->contents + off);
3538                           h->got.offset |= 1;
3539                         }
3540                     }
3541                 else
3542                     unresolved_reloc = FALSE;
3543               }
3544             else
3545               {
3546                 if (local_got_offsets == NULL)
3547                     abort ();
3548 
3549                 off = local_got_offsets[r_symndx];
3550 
3551                 /* The offset must always be a multiple of 4.  We use
3552                      the least significant bit to record whether we have
3553                      already generated the necessary reloc.  */
3554                 if ((off & 1) != 0)
3555                     off &= ~1;
3556                 else
3557                     {
3558                       bfd_put_32 (output_bfd, relocation,
3559                                     htab->elf.sgot->contents + off);
3560 
3561                       if (info->shared)
3562                         {
3563                           asection *s;
3564                           Elf_Internal_Rela outrel;
3565 
3566                           s = htab->elf.srelgot;
3567                           if (s == NULL)
3568                               abort ();
3569 
3570                           outrel.r_offset = (htab->elf.sgot->output_section->vma
3571                                                    + htab->elf.sgot->output_offset
3572                                                    + off);
3573                           outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3574                           elf_append_rel (output_bfd, s, &outrel);
3575                         }
3576 
3577                       local_got_offsets[r_symndx] |= 1;
3578                     }
3579               }
3580 
3581             if (off >= (bfd_vma) -2)
3582               abort ();
3583 
3584             relocation = htab->elf.sgot->output_section->vma
3585                            + htab->elf.sgot->output_offset + off
3586                            - htab->elf.sgotplt->output_section->vma
3587                            - htab->elf.sgotplt->output_offset;
3588             break;
3589 
3590           case R_386_GOTOFF:
3591             /* Relocation is relative to the start of the global offset
3592                table.  */
3593 
3594             /* Check to make sure it isn't a protected function symbol
3595                for shared library since it may not be local when used
3596                as function address.  We also need to make sure that a
3597                symbol is defined locally.  */
3598             if (info->shared && h)
3599               {
3600                 if (!h->def_regular)
3601                     {
3602                       const char *v;
3603 
3604                       switch (ELF_ST_VISIBILITY (h->other))
3605                         {
3606                         case STV_HIDDEN:
3607                           v = _("hidden symbol");
3608                           break;
3609                         case STV_INTERNAL:
3610                           v = _("internal symbol");
3611                           break;
3612                         case STV_PROTECTED:
3613                           v = _("protected symbol");
3614                           break;
3615                         default:
3616                           v = _("symbol");
3617                           break;
3618                         }
3619 
3620                       (*_bfd_error_handler)
3621                         (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
3622                          input_bfd, v, h->root.root.string);
3623                       bfd_set_error (bfd_error_bad_value);
3624                       return FALSE;
3625                     }
3626                 else if (!info->executable
3627                            && !SYMBOLIC_BIND (info, h)
3628                            && h->type == STT_FUNC
3629                            && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
3630                     {
3631                       (*_bfd_error_handler)
3632                         (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
3633                          input_bfd, h->root.root.string);
3634                       bfd_set_error (bfd_error_bad_value);
3635                       return FALSE;
3636                     }
3637               }
3638 
3639             /* Note that sgot is not involved in this
3640                calculation.  We always want the start of .got.plt.  If we
3641                defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
3642                permitted by the ABI, we might have to change this
3643                calculation.  */
3644             relocation -= htab->elf.sgotplt->output_section->vma
3645                               + htab->elf.sgotplt->output_offset;
3646             break;
3647 
3648           case R_386_GOTPC:
3649             /* Use global offset table as symbol value.  */
3650             relocation = htab->elf.sgotplt->output_section->vma
3651                            + htab->elf.sgotplt->output_offset;
3652             unresolved_reloc = FALSE;
3653             break;
3654 
3655           case R_386_PLT32:
3656             /* Relocation is to the entry for this symbol in the
3657                procedure linkage table.  */
3658 
3659             /* Resolve a PLT32 reloc against a local symbol directly,
3660                without using the procedure linkage table.  */
3661             if (h == NULL)
3662               break;
3663 
3664             if (h->plt.offset == (bfd_vma) -1
3665                 || htab->elf.splt == NULL)
3666               {
3667                 /* We didn't make a PLT entry for this symbol.  This
3668                      happens when statically linking PIC code, or when
3669                      using -Bsymbolic.  */
3670                 break;
3671               }
3672 
3673             relocation = (htab->elf.splt->output_section->vma
3674                               + htab->elf.splt->output_offset
3675                               + h->plt.offset);
3676             unresolved_reloc = FALSE;
3677             break;
3678 
3679           case R_386_SIZE32:
3680             /* Set to symbol size.  */
3681             relocation = st_size;
3682             /* Fall through.  */
3683 
3684           case R_386_32:
3685           case R_386_PC32:
3686             if ((input_section->flags & SEC_ALLOC) == 0
3687                 || is_vxworks_tls)
3688               break;
3689 
3690             if ((info->shared
3691                  && (h == NULL
3692                        || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3693                        || h->root.type != bfd_link_hash_undefweak)
3694                  && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
3695                        || !SYMBOL_CALLS_LOCAL (info, h)))
3696                 || (ELIMINATE_COPY_RELOCS
3697                       && !info->shared
3698                       && h != NULL
3699                       && h->dynindx != -1
3700                       && !h->non_got_ref
3701                       && ((h->def_dynamic
3702                            && !h->def_regular)
3703                           || h->root.type == bfd_link_hash_undefweak
3704                           || h->root.type == bfd_link_hash_undefined)))
3705               {
3706                 Elf_Internal_Rela outrel;
3707                 bfd_boolean skip, relocate;
3708                 asection *sreloc;
3709 
3710                 /* When generating a shared object, these relocations
3711                      are copied into the output file to be resolved at run
3712                      time.  */
3713 
3714                 skip = FALSE;
3715                 relocate = FALSE;
3716 
3717                 outrel.r_offset =
3718                     _bfd_elf_section_offset (output_bfd, info, input_section,
3719                                                    rel->r_offset);
3720                 if (outrel.r_offset == (bfd_vma) -1)
3721                     skip = TRUE;
3722                 else if (outrel.r_offset == (bfd_vma) -2)
3723                     skip = TRUE, relocate = TRUE;
3724                 outrel.r_offset += (input_section->output_section->vma
3725                                           + input_section->output_offset);
3726 
3727                 if (skip)
3728                     memset (&outrel, 0, sizeof outrel);
3729                 else if (h != NULL
3730                            && h->dynindx != -1
3731                            && (r_type == R_386_PC32
3732                                  || !info->shared
3733                                  || !SYMBOLIC_BIND (info, h)
3734                                  || !h->def_regular))
3735                     outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3736                 else
3737                     {
3738                       /* This symbol is local, or marked to become local.  */
3739                       relocate = TRUE;
3740                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3741                     }
3742 
3743                 sreloc = elf_section_data (input_section)->sreloc;
3744 
3745                 if (sreloc == NULL || sreloc->contents == NULL)
3746                     {
3747                       r = bfd_reloc_notsupported;
3748                       goto check_relocation_error;
3749                     }
3750 
3751                 elf_append_rel (output_bfd, sreloc, &outrel);
3752 
3753                 /* If this reloc is against an external symbol, we do
3754                      not want to fiddle with the addend.  Otherwise, we
3755                      need to include the symbol value so that it becomes
3756                      an addend for the dynamic reloc.  */
3757                 if (! relocate)
3758                     continue;
3759               }
3760             break;
3761 
3762           case R_386_TLS_IE:
3763             if (!info->executable)
3764               {
3765                 Elf_Internal_Rela outrel;
3766                 asection *sreloc;
3767 
3768                 outrel.r_offset = rel->r_offset
3769                                         + input_section->output_section->vma
3770                                         + input_section->output_offset;
3771                 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3772                 sreloc = elf_section_data (input_section)->sreloc;
3773                 if (sreloc == NULL)
3774                     abort ();
3775                 elf_append_rel (output_bfd, sreloc, &outrel);
3776               }
3777             /* Fall through */
3778 
3779           case R_386_TLS_GD:
3780           case R_386_TLS_GOTDESC:
3781           case R_386_TLS_DESC_CALL:
3782           case R_386_TLS_IE_32:
3783           case R_386_TLS_GOTIE:
3784             tls_type = GOT_UNKNOWN;
3785             if (h == NULL && local_got_offsets)
3786               tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
3787             else if (h != NULL)
3788               tls_type = elf_i386_hash_entry(h)->tls_type;
3789             if (tls_type == GOT_TLS_IE)
3790               tls_type = GOT_TLS_IE_NEG;
3791 
3792             if (! elf_i386_tls_transition (info, input_bfd,
3793                                                    input_section, contents,
3794                                                    symtab_hdr, sym_hashes,
3795                                                    &r_type, tls_type, rel,
3796                                                    relend, h, r_symndx))
3797               return FALSE;
3798 
3799             if (r_type == R_386_TLS_LE_32)
3800               {
3801                 BFD_ASSERT (! unresolved_reloc);
3802                 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
3803                     {
3804                       unsigned int type;
3805                       bfd_vma roff;
3806 
3807                       /* GD->LE transition.  */
3808                       type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3809                       if (type == 0x04)
3810                         {
3811                           /* leal foo(,%reg,1), %eax; call ___tls_get_addr
3812                                Change it into:
3813                                movl %gs:0, %eax; subl $foo@tpoff, %eax
3814                                (6 byte form of subl).  */
3815                           memcpy (contents + rel->r_offset - 3,
3816                                     "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3817                           roff = rel->r_offset + 5;
3818                         }
3819                       else
3820                         {
3821                           /* leal foo(%reg), %eax; call ___tls_get_addr; nop
3822                                Change it into:
3823                                movl %gs:0, %eax; subl $foo@tpoff, %eax
3824                                (6 byte form of subl).  */
3825                           memcpy (contents + rel->r_offset - 2,
3826                                     "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
3827                           roff = rel->r_offset + 6;
3828                         }
3829                       bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
3830                                     contents + roff);
3831                       /* Skip R_386_PC32/R_386_PLT32.  */
3832                       rel++;
3833                       continue;
3834                     }
3835                 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
3836                     {
3837                       /* GDesc -> LE transition.
3838                          It's originally something like:
3839                          leal x@tlsdesc(%ebx), %eax
3840 
3841                          leal x@ntpoff, %eax
3842 
3843                          Registers other than %eax may be set up here.  */
3844 
3845                       unsigned int val;
3846                       bfd_vma roff;
3847 
3848                       roff = rel->r_offset;
3849                       val = bfd_get_8 (input_bfd, contents + roff - 1);
3850 
3851                       /* Now modify the instruction as appropriate.  */
3852                       /* aoliva FIXME: remove the above and xor the byte
3853                          below with 0x86.  */
3854                       bfd_put_8 (output_bfd, val ^ 0x86,
3855                                    contents + roff - 1);
3856                       bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3857                                     contents + roff);
3858                       continue;
3859                     }
3860                 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
3861                     {
3862                       /* GDesc -> LE transition.
3863                          It's originally:
3864                          call *(%eax)
3865                          Turn it into:
3866                          xchg %ax,%ax  */
3867 
3868                       bfd_vma roff;
3869 
3870                       roff = rel->r_offset;
3871                       bfd_put_8 (output_bfd, 0x66, contents + roff);
3872                       bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3873                       continue;
3874                     }
3875                 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
3876                     {
3877                       unsigned int val;
3878 
3879                       /* IE->LE transition:
3880                          Originally it can be one of:
3881                          movl foo, %eax
3882                          movl foo, %reg
3883                          addl foo, %reg
3884                          We change it into:
3885                          movl $foo, %eax
3886                          movl $foo, %reg
3887                          addl $foo, %reg.  */
3888                       val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3889                       if (val == 0xa1)
3890                         {
3891                           /* movl foo, %eax.  */
3892                           bfd_put_8 (output_bfd, 0xb8,
3893                                          contents + rel->r_offset - 1);
3894                         }
3895                       else
3896                         {
3897                           unsigned int type;
3898 
3899                           type = bfd_get_8 (input_bfd,
3900                                                   contents + rel->r_offset - 2);
3901                           switch (type)
3902                               {
3903                               case 0x8b:
3904                                 /* movl */
3905                                 bfd_put_8 (output_bfd, 0xc7,
3906                                              contents + rel->r_offset - 2);
3907                                 bfd_put_8 (output_bfd,
3908                                              0xc0 | ((val >> 3) & 7),
3909                                              contents + rel->r_offset - 1);
3910                                 break;
3911                               case 0x03:
3912                                 /* addl */
3913                                 bfd_put_8 (output_bfd, 0x81,
3914                                              contents + rel->r_offset - 2);
3915                                 bfd_put_8 (output_bfd,
3916                                              0xc0 | ((val >> 3) & 7),
3917                                              contents + rel->r_offset - 1);
3918                                 break;
3919                               default:
3920                                 BFD_FAIL ();
3921                                 break;
3922                               }
3923                         }
3924                       bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3925                                     contents + rel->r_offset);
3926                       continue;
3927                     }
3928                 else
3929                     {
3930                       unsigned int val, type;
3931 
3932                       /* {IE_32,GOTIE}->LE transition:
3933                          Originally it can be one of:
3934                          subl foo(%reg1), %reg2
3935                          movl foo(%reg1), %reg2
3936                          addl foo(%reg1), %reg2
3937                          We change it into:
3938                          subl $foo, %reg2
3939                          movl $foo, %reg2 (6 byte form)
3940                          addl $foo, %reg2.  */
3941                       type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3942                       val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3943                       if (type == 0x8b)
3944                         {
3945                           /* movl */
3946                           bfd_put_8 (output_bfd, 0xc7,
3947                                          contents + rel->r_offset - 2);
3948                           bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3949                                          contents + rel->r_offset - 1);
3950                         }
3951                       else if (type == 0x2b)
3952                         {
3953                           /* subl */
3954                           bfd_put_8 (output_bfd, 0x81,
3955                                          contents + rel->r_offset - 2);
3956                           bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
3957                                          contents + rel->r_offset - 1);
3958                         }
3959                       else if (type == 0x03)
3960                         {
3961                           /* addl */
3962                           bfd_put_8 (output_bfd, 0x81,
3963                                          contents + rel->r_offset - 2);
3964                           bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
3965                                          contents + rel->r_offset - 1);
3966                         }
3967                       else
3968                         BFD_FAIL ();
3969                       if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
3970                         bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
3971                                         contents + rel->r_offset);
3972                       else
3973                         bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
3974                                         contents + rel->r_offset);
3975                       continue;
3976                     }
3977               }
3978 
3979             if (htab->elf.sgot == NULL)
3980               abort ();
3981 
3982             if (h != NULL)
3983               {
3984                 off = h->got.offset;
3985                 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
3986               }
3987             else
3988               {
3989                 if (local_got_offsets == NULL)
3990                     abort ();
3991 
3992                 off = local_got_offsets[r_symndx];
3993                 offplt = local_tlsdesc_gotents[r_symndx];
3994               }
3995 
3996             if ((off & 1) != 0)
3997               off &= ~1;
3998             else
3999               {
4000                 Elf_Internal_Rela outrel;
4001                 int dr_type;
4002                 asection *sreloc;
4003 
4004                 if (htab->elf.srelgot == NULL)
4005                     abort ();
4006 
4007                 indx = h && h->dynindx != -1 ? h->dynindx : 0;
4008 
4009                 if (GOT_TLS_GDESC_P (tls_type))
4010                     {
4011                       bfd_byte *loc;
4012                       outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4013                       BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4014                                     <= htab->elf.sgotplt->size);
4015                       outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4016                                              + htab->elf.sgotplt->output_offset
4017                                              + offplt
4018                                              + htab->sgotplt_jump_table_size);
4019                       sreloc = htab->elf.srelplt;
4020                       loc = sreloc->contents;
4021                       loc += (htab->next_tls_desc_index++
4022                                 * sizeof (Elf32_External_Rel));
4023                       BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4024                                     <= sreloc->contents + sreloc->size);
4025                       bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4026                       if (indx == 0)
4027                         {
4028                           BFD_ASSERT (! unresolved_reloc);
4029                           bfd_put_32 (output_bfd,
4030                                           relocation - elf_i386_dtpoff_base (info),
4031                                           htab->elf.sgotplt->contents + offplt
4032                                           + htab->sgotplt_jump_table_size + 4);
4033                         }
4034                       else
4035                         {
4036                           bfd_put_32 (output_bfd, 0,
4037                                           htab->elf.sgotplt->contents + offplt
4038                                           + htab->sgotplt_jump_table_size + 4);
4039                         }
4040                     }
4041 
4042                 sreloc = htab->elf.srelgot;
4043 
4044                 outrel.r_offset = (htab->elf.sgot->output_section->vma
4045                                          + htab->elf.sgot->output_offset + off);
4046 
4047                 if (GOT_TLS_GD_P (tls_type))
4048                     dr_type = R_386_TLS_DTPMOD32;
4049                 else if (GOT_TLS_GDESC_P (tls_type))
4050                     goto dr_done;
4051                 else if (tls_type == GOT_TLS_IE_POS)
4052                     dr_type = R_386_TLS_TPOFF;
4053                 else
4054                     dr_type = R_386_TLS_TPOFF32;
4055 
4056                 if (dr_type == R_386_TLS_TPOFF && indx == 0)
4057                     bfd_put_32 (output_bfd,
4058                                   relocation - elf_i386_dtpoff_base (info),
4059                                   htab->elf.sgot->contents + off);
4060                 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4061                     bfd_put_32 (output_bfd,
4062                                   elf_i386_dtpoff_base (info) - relocation,
4063                                   htab->elf.sgot->contents + off);
4064                 else if (dr_type != R_386_TLS_DESC)
4065                     bfd_put_32 (output_bfd, 0,
4066                                   htab->elf.sgot->contents + off);
4067                 outrel.r_info = ELF32_R_INFO (indx, dr_type);
4068 
4069                 elf_append_rel (output_bfd, sreloc, &outrel);
4070 
4071                 if (GOT_TLS_GD_P (tls_type))
4072                     {
4073                       if (indx == 0)
4074                         {
4075                           BFD_ASSERT (! unresolved_reloc);
4076                           bfd_put_32 (output_bfd,
4077                                           relocation - elf_i386_dtpoff_base (info),
4078                                           htab->elf.sgot->contents + off + 4);
4079                         }
4080                       else
4081                         {
4082                           bfd_put_32 (output_bfd, 0,
4083                                           htab->elf.sgot->contents + off + 4);
4084                           outrel.r_info = ELF32_R_INFO (indx,
4085                                                                 R_386_TLS_DTPOFF32);
4086                           outrel.r_offset += 4;
4087                           elf_append_rel (output_bfd, sreloc, &outrel);
4088                         }
4089                     }
4090                 else if (tls_type == GOT_TLS_IE_BOTH)
4091                     {
4092                       bfd_put_32 (output_bfd,
4093                                     (indx == 0
4094                                      ? relocation - elf_i386_dtpoff_base (info)
4095                                      : 0),
4096                                     htab->elf.sgot->contents + off + 4);
4097                       outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4098                       outrel.r_offset += 4;
4099                       elf_append_rel (output_bfd, sreloc, &outrel);
4100                     }
4101 
4102               dr_done:
4103                 if (h != NULL)
4104                     h->got.offset |= 1;
4105                 else
4106                     local_got_offsets[r_symndx] |= 1;
4107               }
4108 
4109             if (off >= (bfd_vma) -2
4110                 && ! GOT_TLS_GDESC_P (tls_type))
4111               abort ();
4112             if (r_type == R_386_TLS_GOTDESC
4113                 || r_type == R_386_TLS_DESC_CALL)
4114               {
4115                 relocation = htab->sgotplt_jump_table_size + offplt;
4116                 unresolved_reloc = FALSE;
4117               }
4118             else if (r_type == ELF32_R_TYPE (rel->r_info))
4119               {
4120                 bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4121                                     + htab->elf.sgotplt->output_offset;
4122                 relocation = htab->elf.sgot->output_section->vma
4123                     + htab->elf.sgot->output_offset + off - g_o_t;
4124                 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4125                       && tls_type == GOT_TLS_IE_BOTH)
4126                     relocation += 4;
4127                 if (r_type == R_386_TLS_IE)
4128                     relocation += g_o_t;
4129                 unresolved_reloc = FALSE;
4130               }
4131             else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4132               {
4133                 unsigned int val, type;
4134                 bfd_vma roff;
4135 
4136                 /* GD->IE transition.  */
4137                 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4138                 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4139                 if (type == 0x04)
4140                     {
4141                       /* leal foo(,%reg,1), %eax; call ___tls_get_addr
4142                          Change it into:
4143                          movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
4144                       val >>= 3;
4145                       roff = rel->r_offset - 3;
4146                     }
4147                 else
4148                     {
4149                       /* leal foo(%reg), %eax; call ___tls_get_addr; nop
4150                          Change it into:
4151                          movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
4152                       roff = rel->r_offset - 2;
4153                     }
4154                 memcpy (contents + roff,
4155                           "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4156                 contents[roff + 7] = 0x80 | (val & 7);
4157                 /* If foo is used only with foo@gotntpoff(%reg) and
4158                      foo@indntpoff, but not with foo@gottpoff(%reg), change
4159                      subl $foo@gottpoff(%reg), %eax
4160                      into:
4161                      addl $foo@gotntpoff(%reg), %eax.  */
4162                 if (tls_type == GOT_TLS_IE_POS)
4163                     contents[roff + 6] = 0x03;
4164                 bfd_put_32 (output_bfd,
4165                                 htab->elf.sgot->output_section->vma
4166                                 + htab->elf.sgot->output_offset + off
4167                                 - htab->elf.sgotplt->output_section->vma
4168                                 - htab->elf.sgotplt->output_offset,
4169                                 contents + roff + 8);
4170                 /* Skip R_386_PLT32.  */
4171                 rel++;
4172                 continue;
4173               }
4174             else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4175               {
4176                 /* GDesc -> IE transition.
4177                      It's originally something like:
4178                      leal x@tlsdesc(%ebx), %eax
4179 
4180                      Change it to:
4181                      movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4182                      or:
4183                      movl x@gottpoff(%ebx), %eax # before negl %eax
4184 
4185                      Registers other than %eax may be set up here.  */
4186 
4187                 bfd_vma roff;
4188 
4189                 /* First, make sure it's a leal adding ebx to a 32-bit
4190                      offset into any register, although it's probably
4191                      almost always going to be eax.  */
4192                 roff = rel->r_offset;
4193 
4194                 /* Now modify the instruction as appropriate.  */
4195                 /* To turn a leal into a movl in the form we use it, it
4196                      suffices to change the first byte from 0x8d to 0x8b.
4197                      aoliva FIXME: should we decide to keep the leal, all
4198                      we have to do is remove the statement below, and
4199                      adjust the relaxation of R_386_TLS_DESC_CALL.  */
4200                 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4201 
4202                 if (tls_type == GOT_TLS_IE_BOTH)
4203                     off += 4;
4204 
4205                 bfd_put_32 (output_bfd,
4206                                 htab->elf.sgot->output_section->vma
4207                                 + htab->elf.sgot->output_offset + off
4208                                 - htab->elf.sgotplt->output_section->vma
4209                                 - htab->elf.sgotplt->output_offset,
4210                                 contents + roff);
4211                 continue;
4212               }
4213             else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4214               {
4215                 /* GDesc -> IE transition.
4216                      It's originally:
4217                      call *(%eax)
4218 
4219                      Change it to:
4220                      xchg %ax,%ax
4221                      or
4222                      negl %eax
4223                      depending on how we transformed the TLS_GOTDESC above.
4224                 */
4225 
4226                 bfd_vma roff;
4227 
4228                 roff = rel->r_offset;
4229 
4230                 /* Now modify the instruction as appropriate.  */
4231                 if (tls_type != GOT_TLS_IE_NEG)
4232                     {
4233                       /* xchg %ax,%ax */
4234                       bfd_put_8 (output_bfd, 0x66, contents + roff);
4235                       bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4236                     }
4237                 else
4238                     {
4239                       /* negl %eax */
4240                       bfd_put_8 (output_bfd, 0xf7, contents + roff);
4241                       bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4242                     }
4243 
4244                 continue;
4245               }
4246             else
4247               BFD_ASSERT (FALSE);
4248             break;
4249 
4250           case R_386_TLS_LDM:
4251             if (! elf_i386_tls_transition (info, input_bfd,
4252                                                    input_section, contents,
4253                                                    symtab_hdr, sym_hashes,
4254                                                    &r_type, GOT_UNKNOWN, rel,
4255                                                    relend, h, r_symndx))
4256               return FALSE;
4257 
4258             if (r_type != R_386_TLS_LDM)
4259               {
4260                 /* LD->LE transition:
4261                      leal foo(%reg), %eax; call ___tls_get_addr.
4262                      We change it into:
4263                      movl %gs:0, %eax; nop; leal 0(%esi,1), %esi.  */
4264                 BFD_ASSERT (r_type == R_386_TLS_LE_32);
4265                 memcpy (contents + rel->r_offset - 2,
4266                           "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
4267                 /* Skip R_386_PC32/R_386_PLT32.  */
4268                 rel++;
4269                 continue;
4270               }
4271 
4272             if (htab->elf.sgot == NULL)
4273               abort ();
4274 
4275             off = htab->tls_ldm_got.offset;
4276             if (off & 1)
4277               off &= ~1;
4278             else
4279               {
4280                 Elf_Internal_Rela outrel;
4281 
4282                 if (htab->elf.srelgot == NULL)
4283                     abort ();
4284 
4285                 outrel.r_offset = (htab->elf.sgot->output_section->vma
4286                                          + htab->elf.sgot->output_offset + off);
4287 
4288                 bfd_put_32 (output_bfd, 0,
4289                                 htab->elf.sgot->contents + off);
4290                 bfd_put_32 (output_bfd, 0,
4291                                 htab->elf.sgot->contents + off + 4);
4292                 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
4293                 elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
4294                 htab->tls_ldm_got.offset |= 1;
4295               }
4296             relocation = htab->elf.sgot->output_section->vma
4297                            + htab->elf.sgot->output_offset + off
4298                            - htab->elf.sgotplt->output_section->vma
4299                            - htab->elf.sgotplt->output_offset;
4300             unresolved_reloc = FALSE;
4301             break;
4302 
4303           case R_386_TLS_LDO_32:
4304             if (!info->executable || (input_section->flags & SEC_CODE) == 0)
4305               relocation -= elf_i386_dtpoff_base (info);
4306             else
4307               /* When converting LDO to LE, we must negate.  */
4308               relocation = -elf_i386_tpoff (info, relocation);
4309             break;
4310 
4311           case R_386_TLS_LE_32:
4312           case R_386_TLS_LE:
4313             if (!info->executable)
4314               {
4315                 Elf_Internal_Rela outrel;
4316                 asection *sreloc;
4317 
4318                 outrel.r_offset = rel->r_offset
4319                                         + input_section->output_section->vma
4320                                         + input_section->output_offset;
4321                 if (h != NULL && h->dynindx != -1)
4322                     indx = h->dynindx;
4323                 else
4324                     indx = 0;
4325                 if (r_type == R_386_TLS_LE_32)
4326                     outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
4327                 else
4328                     outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4329                 sreloc = elf_section_data (input_section)->sreloc;
4330                 if (sreloc == NULL)
4331                     abort ();
4332                 elf_append_rel (output_bfd, sreloc, &outrel);
4333                 if (indx)
4334                     continue;
4335                 else if (r_type == R_386_TLS_LE_32)
4336                     relocation = elf_i386_dtpoff_base (info) - relocation;
4337                 else
4338                     relocation -= elf_i386_dtpoff_base (info);
4339               }
4340             else if (r_type == R_386_TLS_LE_32)
4341               relocation = elf_i386_tpoff (info, relocation);
4342             else
4343               relocation = -elf_i386_tpoff (info, relocation);
4344             break;
4345 
4346           default:
4347             break;
4348           }
4349 
4350       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4351            because such sections are not SEC_ALLOC and thus ld.so will
4352            not process them.  */
4353       if (unresolved_reloc
4354             && !((input_section->flags & SEC_DEBUGGING) != 0
4355                  && h->def_dynamic)
4356             && _bfd_elf_section_offset (output_bfd, info, input_section,
4357                                               rel->r_offset) != (bfd_vma) -1)
4358           {
4359             (*_bfd_error_handler)
4360               (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4361                input_bfd,
4362                input_section,
4363                (long) rel->r_offset,
4364                howto->name,
4365                h->root.root.string);
4366             return FALSE;
4367           }
4368 
4369 do_relocation:
4370       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4371                                             contents, rel->r_offset,
4372                                             relocation, 0);
4373 
4374 check_relocation_error:
4375       if (r != bfd_reloc_ok)
4376           {
4377             const char *name;
4378 
4379             if (h != NULL)
4380               name = h->root.root.string;
4381             else
4382               {
4383                 name = bfd_elf_string_from_elf_section (input_bfd,
4384                                                                   symtab_hdr->sh_link,
4385                                                                   sym->st_name);
4386                 if (name == NULL)
4387                     return FALSE;
4388                 if (*name == '\0')
4389                     name = bfd_section_name (input_bfd, sec);
4390               }
4391 
4392             if (r == bfd_reloc_overflow)
4393               {
4394                 if (! ((*info->callbacks->reloc_overflow)
4395                          (info, (h ? &h->root : NULL), name, howto->name,
4396                           (bfd_vma) 0, input_bfd, input_section,
4397                           rel->r_offset)))
4398                     return FALSE;
4399               }
4400             else
4401               {
4402                 (*_bfd_error_handler)
4403                     (_("%B(%A+0x%lx): reloc against `%s': error %d"),
4404                      input_bfd, input_section,
4405                      (long) rel->r_offset, name, (int) r);
4406                 return FALSE;
4407               }
4408           }
4409     }
4410 
4411   return TRUE;
4412 }
4413 
4414 /* Finish up dynamic symbol handling.  We set the contents of various
4415    dynamic sections here.  */
4416 
4417 static bfd_boolean
elf_i386_finish_dynamic_symbol(bfd * output_bfd,struct bfd_link_info * info,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)4418 elf_i386_finish_dynamic_symbol (bfd *output_bfd,
4419                                         struct bfd_link_info *info,
4420                                         struct elf_link_hash_entry *h,
4421                                         Elf_Internal_Sym *sym)
4422 {
4423   struct elf_i386_link_hash_table *htab;
4424   unsigned plt_entry_size;
4425   const struct elf_i386_backend_data *abed;
4426 
4427   htab = elf_i386_hash_table (info);
4428   if (htab == NULL)
4429     return FALSE;
4430 
4431   abed = get_elf_i386_backend_data (output_bfd);
4432   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
4433 
4434   if (h->plt.offset != (bfd_vma) -1)
4435     {
4436       bfd_vma plt_index;
4437       bfd_vma got_offset;
4438       Elf_Internal_Rela rel;
4439       bfd_byte *loc;
4440       asection *plt, *gotplt, *relplt;
4441 
4442       /* When building a static executable, use .iplt, .igot.plt and
4443            .rel.iplt sections for STT_GNU_IFUNC symbols.  */
4444       if (htab->elf.splt != NULL)
4445           {
4446             plt = htab->elf.splt;
4447             gotplt = htab->elf.sgotplt;
4448             relplt = htab->elf.srelplt;
4449           }
4450       else
4451           {
4452             plt = htab->elf.iplt;
4453             gotplt = htab->elf.igotplt;
4454             relplt = htab->elf.irelplt;
4455           }
4456 
4457       /* This symbol has an entry in the procedure linkage table.  Set
4458            it up.  */
4459 
4460       if ((h->dynindx == -1
4461              && !((h->forced_local || info->executable)
4462                     && h->def_regular
4463                     && h->type == STT_GNU_IFUNC))
4464             || plt == NULL
4465             || gotplt == NULL
4466             || relplt == NULL)
4467           abort ();
4468 
4469       /* Get the index in the procedure linkage table which
4470            corresponds to this symbol.  This is the index of this symbol
4471            in all the symbols for which we are making plt entries.  The
4472            first entry in the procedure linkage table is reserved.
4473 
4474            Get the offset into the .got table of the entry that
4475            corresponds to this function.  Each .got entry is 4 bytes.
4476            The first three are reserved.
4477 
4478            For static executables, we don't reserve anything.  */
4479 
4480       if (plt == htab->elf.splt)
4481           {
4482             got_offset = h->plt.offset / plt_entry_size - 1;
4483             got_offset = (got_offset + 3) * 4;
4484           }
4485       else
4486           {
4487             got_offset = h->plt.offset / plt_entry_size;
4488             got_offset = got_offset * 4;
4489           }
4490 
4491       /* Fill in the entry in the procedure linkage table.  */
4492       if (! info->shared)
4493           {
4494             memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
4495                       abed->plt->plt_entry_size);
4496             bfd_put_32 (output_bfd,
4497                           (gotplt->output_section->vma
4498                            + gotplt->output_offset
4499                            + got_offset),
4500                           plt->contents + h->plt.offset
4501                       + abed->plt->plt_got_offset);
4502 
4503             if (abed->is_vxworks)
4504               {
4505                 int s, k, reloc_index;
4506 
4507                 /* Create the R_386_32 relocation referencing the GOT
4508                      for this PLT entry.  */
4509 
4510                 /* S: Current slot number (zero-based).  */
4511                 s = ((h->plt.offset - abed->plt->plt_entry_size)
4512                    / abed->plt->plt_entry_size);
4513                 /* K: Number of relocations for PLTResolve. */
4514                 if (info->shared)
4515                     k = PLTRESOLVE_RELOCS_SHLIB;
4516                 else
4517                     k = PLTRESOLVE_RELOCS;
4518                 /* Skip the PLTresolve relocations, and the relocations for
4519                      the other PLT slots. */
4520                 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
4521                 loc = (htab->srelplt2->contents + reloc_index
4522                          * sizeof (Elf32_External_Rel));
4523 
4524                 rel.r_offset = (htab->elf.splt->output_section->vma
4525                                     + htab->elf.splt->output_offset
4526                                     + h->plt.offset + 2),
4527                 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4528                 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4529 
4530                 /* Create the R_386_32 relocation referencing the beginning of
4531                      the PLT for this GOT entry.  */
4532                 rel.r_offset = (htab->elf.sgotplt->output_section->vma
4533                                     + htab->elf.sgotplt->output_offset
4534                                     + got_offset);
4535                 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
4536                 bfd_elf32_swap_reloc_out (output_bfd, &rel,
4537                                                   loc + sizeof (Elf32_External_Rel));
4538               }
4539           }
4540       else
4541           {
4542             memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
4543                       abed->plt->plt_entry_size);
4544             bfd_put_32 (output_bfd, got_offset,
4545                           plt->contents + h->plt.offset
4546                       + abed->plt->plt_got_offset);
4547           }
4548 
4549       /* Fill in the entry in the global offset table.  */
4550       bfd_put_32 (output_bfd,
4551                       (plt->output_section->vma
4552                        + plt->output_offset
4553                        + h->plt.offset
4554                        + abed->plt->plt_lazy_offset),
4555                       gotplt->contents + got_offset);
4556 
4557       /* Fill in the entry in the .rel.plt section.  */
4558       rel.r_offset = (gotplt->output_section->vma
4559                           + gotplt->output_offset
4560                           + got_offset);
4561       if (h->dynindx == -1
4562             || ((info->executable
4563                  || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4564                 && h->def_regular
4565                  && h->type == STT_GNU_IFUNC))
4566           {
4567             /* If an STT_GNU_IFUNC symbol is locally defined, generate
4568                R_386_IRELATIVE instead of R_386_JUMP_SLOT.  Store addend
4569                in the .got.plt section.  */
4570             bfd_put_32 (output_bfd,
4571                           (h->root.u.def.value
4572                            + h->root.u.def.section->output_section->vma
4573                            + h->root.u.def.section->output_offset),
4574                           gotplt->contents + got_offset);
4575             rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
4576             /* R_386_IRELATIVE comes last.  */
4577             plt_index = htab->next_irelative_index--;
4578           }
4579       else
4580           {
4581             rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
4582             plt_index = htab->next_jump_slot_index++;
4583           }
4584       loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
4585       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4586 
4587       /* Don't fill PLT entry for static executables.  */
4588       if (plt == htab->elf.splt)
4589           {
4590             bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
4591                           plt->contents + h->plt.offset
4592                       + abed->plt->plt_reloc_offset);
4593             bfd_put_32 (output_bfd, - (h->plt.offset
4594                                      + abed->plt->plt_plt_offset + 4),
4595                           plt->contents + h->plt.offset
4596                       + abed->plt->plt_plt_offset);
4597           }
4598 
4599       if (!h->def_regular)
4600           {
4601             /* Mark the symbol as undefined, rather than as defined in
4602                the .plt section.  Leave the value if there were any
4603                relocations where pointer equality matters (this is a clue
4604                for the dynamic linker, to make function pointer
4605                comparisons work between an application and shared
4606                library), otherwise set it to zero.  If a function is only
4607                called from a binary, there is no need to slow down
4608                shared libraries because of that.  */
4609             sym->st_shndx = SHN_UNDEF;
4610             if (!h->pointer_equality_needed)
4611               sym->st_value = 0;
4612           }
4613     }
4614 
4615   if (h->got.offset != (bfd_vma) -1
4616       && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
4617       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
4618     {
4619       Elf_Internal_Rela rel;
4620 
4621       /* This symbol has an entry in the global offset table.  Set it
4622            up.  */
4623 
4624       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
4625           abort ();
4626 
4627       rel.r_offset = (htab->elf.sgot->output_section->vma
4628                           + htab->elf.sgot->output_offset
4629                           + (h->got.offset & ~(bfd_vma) 1));
4630 
4631       /* If this is a static link, or it is a -Bsymbolic link and the
4632            symbol is defined locally or was forced to be local because
4633            of a version file, we just want to emit a RELATIVE reloc.
4634            The entry in the global offset table will already have been
4635            initialized in the relocate_section function.  */
4636       if (h->def_regular
4637             && h->type == STT_GNU_IFUNC)
4638           {
4639             if (info->shared)
4640               {
4641                 /* Generate R_386_GLOB_DAT.  */
4642                 goto do_glob_dat;
4643               }
4644             else
4645               {
4646                 asection *plt;
4647 
4648                 if (!h->pointer_equality_needed)
4649                     abort ();
4650 
4651                 /* For non-shared object, we can't use .got.plt, which
4652                      contains the real function addres if we need pointer
4653                      equality.  We load the GOT entry with the PLT entry.  */
4654                 plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4655                 bfd_put_32 (output_bfd,
4656                                 (plt->output_section->vma
4657                                  + plt->output_offset + h->plt.offset),
4658                                 htab->elf.sgot->contents + h->got.offset);
4659                 return TRUE;
4660               }
4661           }
4662       else if (info->shared
4663                  && SYMBOL_REFERENCES_LOCAL (info, h))
4664           {
4665             BFD_ASSERT((h->got.offset & 1) != 0);
4666             rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4667           }
4668       else
4669           {
4670             BFD_ASSERT((h->got.offset & 1) == 0);
4671 do_glob_dat:
4672             bfd_put_32 (output_bfd, (bfd_vma) 0,
4673                           htab->elf.sgot->contents + h->got.offset);
4674             rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
4675           }
4676 
4677       elf_append_rel (output_bfd, htab->elf.srelgot, &rel);
4678     }
4679 
4680   if (h->needs_copy)
4681     {
4682       Elf_Internal_Rela rel;
4683 
4684       /* This symbol needs a copy reloc.  Set it up.  */
4685 
4686       if (h->dynindx == -1
4687             || (h->root.type != bfd_link_hash_defined
4688                 && h->root.type != bfd_link_hash_defweak)
4689             || htab->srelbss == NULL)
4690           abort ();
4691 
4692       rel.r_offset = (h->root.u.def.value
4693                           + h->root.u.def.section->output_section->vma
4694                           + h->root.u.def.section->output_offset);
4695       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
4696       elf_append_rel (output_bfd, htab->srelbss, &rel);
4697     }
4698 
4699   return TRUE;
4700 }
4701 
4702 /* Finish up local dynamic symbol handling.  We set the contents of
4703    various dynamic sections here.  */
4704 
4705 static bfd_boolean
elf_i386_finish_local_dynamic_symbol(void ** slot,void * inf)4706 elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
4707 {
4708   struct elf_link_hash_entry *h
4709     = (struct elf_link_hash_entry *) *slot;
4710   struct bfd_link_info *info
4711     = (struct bfd_link_info *) inf;
4712 
4713   return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
4714                                                    h, NULL);
4715 }
4716 
4717 /* Used to decide how to sort relocs in an optimal manner for the
4718    dynamic linker, before writing them out.  */
4719 
4720 static enum elf_reloc_type_class
elf_i386_reloc_type_class(const Elf_Internal_Rela * rela)4721 elf_i386_reloc_type_class (const Elf_Internal_Rela *rela)
4722 {
4723   switch (ELF32_R_TYPE (rela->r_info))
4724     {
4725     case R_386_RELATIVE:
4726       return reloc_class_relative;
4727     case R_386_JUMP_SLOT:
4728       return reloc_class_plt;
4729     case R_386_COPY:
4730       return reloc_class_copy;
4731     default:
4732       return reloc_class_normal;
4733     }
4734 }
4735 
4736 /* Finish up the dynamic sections.  */
4737 
4738 static bfd_boolean
elf_i386_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)4739 elf_i386_finish_dynamic_sections (bfd *output_bfd,
4740                                           struct bfd_link_info *info)
4741 {
4742   struct elf_i386_link_hash_table *htab;
4743   bfd *dynobj;
4744   asection *sdyn;
4745   const struct elf_i386_backend_data *abed;
4746 
4747   htab = elf_i386_hash_table (info);
4748   if (htab == NULL)
4749     return FALSE;
4750 
4751   dynobj = htab->elf.dynobj;
4752   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4753   abed = get_elf_i386_backend_data (output_bfd);
4754 
4755   if (htab->elf.dynamic_sections_created)
4756     {
4757       Elf32_External_Dyn *dyncon, *dynconend;
4758 
4759       if (sdyn == NULL || htab->elf.sgot == NULL)
4760           abort ();
4761 
4762       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4763       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4764       for (; dyncon < dynconend; dyncon++)
4765           {
4766             Elf_Internal_Dyn dyn;
4767             asection *s;
4768 
4769             bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4770 
4771             switch (dyn.d_tag)
4772               {
4773               default:
4774                 if (abed->is_vxworks
4775                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4776                     break;
4777                 continue;
4778 
4779               case DT_PLTGOT:
4780                 s = htab->elf.sgotplt;
4781                 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4782                 break;
4783 
4784               case DT_JMPREL:
4785                 s = htab->elf.srelplt;
4786                 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4787                 break;
4788 
4789               case DT_PLTRELSZ:
4790                 s = htab->elf.srelplt;
4791                 dyn.d_un.d_val = s->size;
4792                 break;
4793 
4794               case DT_RELSZ:
4795                 /* My reading of the SVR4 ABI indicates that the
4796                      procedure linkage table relocs (DT_JMPREL) should be
4797                      included in the overall relocs (DT_REL).  This is
4798                      what Solaris does.  However, UnixWare can not handle
4799                      that case.  Therefore, we override the DT_RELSZ entry
4800                      here to make it not include the JMPREL relocs.  */
4801                 s = htab->elf.srelplt;
4802                 if (s == NULL)
4803                     continue;
4804                 dyn.d_un.d_val -= s->size;
4805                 break;
4806 
4807               case DT_REL:
4808                 /* We may not be using the standard ELF linker script.
4809                      If .rel.plt is the first .rel section, we adjust
4810                      DT_REL to not include it.  */
4811                 s = htab->elf.srelplt;
4812                 if (s == NULL)
4813                     continue;
4814                 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4815                     continue;
4816                 dyn.d_un.d_ptr += s->size;
4817                 break;
4818               }
4819 
4820             bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4821           }
4822 
4823       /* Fill in the first entry in the procedure linkage table.  */
4824       if (htab->elf.splt && htab->elf.splt->size > 0)
4825           {
4826             if (info->shared)
4827               {
4828                 memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
4829                           abed->plt->plt0_entry_size);
4830                 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
4831                           abed->plt0_pad_byte,
4832                           abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
4833               }
4834             else
4835               {
4836                 memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
4837                           abed->plt->plt0_entry_size);
4838                 memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
4839                           abed->plt0_pad_byte,
4840                           abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
4841                 bfd_put_32 (output_bfd,
4842                                 (htab->elf.sgotplt->output_section->vma
4843                                  + htab->elf.sgotplt->output_offset
4844                                  + 4),
4845                                 htab->elf.splt->contents
4846                           + abed->plt->plt0_got1_offset);
4847                 bfd_put_32 (output_bfd,
4848                                 (htab->elf.sgotplt->output_section->vma
4849                                  + htab->elf.sgotplt->output_offset
4850                                  + 8),
4851                                 htab->elf.splt->contents
4852                           + abed->plt->plt0_got2_offset);
4853 
4854                 if (abed->is_vxworks)
4855                     {
4856                       Elf_Internal_Rela rel;
4857 
4858                       /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
4859                          On IA32 we use REL relocations so the addend goes in
4860                          the PLT directly.  */
4861                       rel.r_offset = (htab->elf.splt->output_section->vma
4862                                           + htab->elf.splt->output_offset
4863                                           + abed->plt->plt0_got1_offset);
4864                       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4865                       bfd_elf32_swap_reloc_out (output_bfd, &rel,
4866                                                       htab->srelplt2->contents);
4867                       /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
4868                       rel.r_offset = (htab->elf.splt->output_section->vma
4869                                           + htab->elf.splt->output_offset
4870                                           + abed->plt->plt0_got2_offset);
4871                       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4872                       bfd_elf32_swap_reloc_out (output_bfd, &rel,
4873                                                       htab->srelplt2->contents +
4874                                                       sizeof (Elf32_External_Rel));
4875                     }
4876               }
4877 
4878             /* UnixWare sets the entsize of .plt to 4, although that doesn't
4879                really seem like the right value.  */
4880             elf_section_data (htab->elf.splt->output_section)
4881               ->this_hdr.sh_entsize = 4;
4882 
4883             /* Correct the .rel.plt.unloaded relocations.  */
4884             if (abed->is_vxworks && !info->shared)
4885               {
4886                 int num_plts = (htab->elf.splt->size
4887                               / abed->plt->plt_entry_size) - 1;
4888                 unsigned char *p;
4889 
4890                 p = htab->srelplt2->contents;
4891                 if (info->shared)
4892                     p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
4893                 else
4894                     p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
4895 
4896                 for (; num_plts; num_plts--)
4897                     {
4898                       Elf_Internal_Rela rel;
4899                       bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4900                       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
4901                       bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4902                       p += sizeof (Elf32_External_Rel);
4903 
4904                       bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
4905                       rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
4906                       bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
4907                       p += sizeof (Elf32_External_Rel);
4908                     }
4909               }
4910           }
4911     }
4912 
4913   if (htab->elf.sgotplt)
4914     {
4915       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4916           {
4917             (*_bfd_error_handler)
4918               (_("discarded output section: `%A'"), htab->elf.sgotplt);
4919             return FALSE;
4920           }
4921 
4922       /* Fill in the first three entries in the global offset table.  */
4923       if (htab->elf.sgotplt->size > 0)
4924           {
4925             bfd_put_32 (output_bfd,
4926                           (sdyn == NULL ? 0
4927                            : sdyn->output_section->vma + sdyn->output_offset),
4928                           htab->elf.sgotplt->contents);
4929             bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
4930             bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
4931           }
4932 
4933       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
4934     }
4935 
4936   /* Adjust .eh_frame for .plt section.  */
4937   if (htab->plt_eh_frame != NULL
4938       && htab->plt_eh_frame->contents != NULL)
4939     {
4940       if (htab->elf.splt != NULL
4941             && htab->elf.splt->size != 0
4942             && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
4943             && htab->elf.splt->output_section != NULL
4944             && htab->plt_eh_frame->output_section != NULL)
4945           {
4946             bfd_vma plt_start = htab->elf.splt->output_section->vma;
4947             bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
4948                                            + htab->plt_eh_frame->output_offset
4949                                            + PLT_FDE_START_OFFSET;
4950             bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
4951                                    htab->plt_eh_frame->contents
4952                                    + PLT_FDE_START_OFFSET);
4953           }
4954       if (htab->plt_eh_frame->sec_info_type
4955             == SEC_INFO_TYPE_EH_FRAME)
4956           {
4957             if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
4958                                                              htab->plt_eh_frame,
4959                                                              htab->plt_eh_frame->contents))
4960               return FALSE;
4961           }
4962     }
4963 
4964   if (htab->elf.sgot && htab->elf.sgot->size > 0)
4965     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
4966 
4967   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4968   htab_traverse (htab->loc_hash_table,
4969                      elf_i386_finish_local_dynamic_symbol,
4970                      info);
4971 
4972   return TRUE;
4973 }
4974 
4975 /* Return address for Ith PLT stub in section PLT, for relocation REL
4976    or (bfd_vma) -1 if it should not be included.  */
4977 
4978 static bfd_vma
elf_i386_plt_sym_val(bfd_vma i,const asection * plt,const arelent * rel ATTRIBUTE_UNUSED)4979 elf_i386_plt_sym_val (bfd_vma i, const asection *plt,
4980                           const arelent *rel ATTRIBUTE_UNUSED)
4981 {
4982   return plt->vma + (i + 1) * GET_PLT_ENTRY_SIZE (plt->owner);
4983 }
4984 
4985 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
4986 
4987 static bfd_boolean
elf_i386_hash_symbol(struct elf_link_hash_entry * h)4988 elf_i386_hash_symbol (struct elf_link_hash_entry *h)
4989 {
4990   if (h->plt.offset != (bfd_vma) -1
4991       && !h->def_regular
4992       && !h->pointer_equality_needed)
4993     return FALSE;
4994 
4995   return _bfd_elf_hash_symbol (h);
4996 }
4997 
4998 /* Hook called by the linker routine which adds symbols from an object
4999    file.  */
5000 
5001 static bfd_boolean
elf_i386_add_symbol_hook(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED,Elf_Internal_Sym * sym,const char ** namep ATTRIBUTE_UNUSED,flagword * flagsp ATTRIBUTE_UNUSED,asection ** secp ATTRIBUTE_UNUSED,bfd_vma * valp ATTRIBUTE_UNUSED)5002 elf_i386_add_symbol_hook (bfd * abfd,
5003                                 struct bfd_link_info * info ATTRIBUTE_UNUSED,
5004                                 Elf_Internal_Sym * sym,
5005                                 const char ** namep ATTRIBUTE_UNUSED,
5006                                 flagword * flagsp ATTRIBUTE_UNUSED,
5007                                 asection ** secp ATTRIBUTE_UNUSED,
5008                                 bfd_vma * valp ATTRIBUTE_UNUSED)
5009 {
5010   if ((abfd->flags & DYNAMIC) == 0
5011       && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
5012             || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
5013     elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
5014 
5015   return TRUE;
5016 }
5017 
5018 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
5019 #define TARGET_LITTLE_NAME              "elf32-i386"
5020 #define ELF_ARCH                        bfd_arch_i386
5021 #define ELF_TARGET_ID                             I386_ELF_DATA
5022 #define ELF_MACHINE_CODE                EM_386
5023 #define ELF_MAXPAGESIZE                           0x1000
5024 
5025 #define elf_backend_can_gc_sections     1
5026 #define elf_backend_can_refcount        1
5027 #define elf_backend_want_got_plt        1
5028 #define elf_backend_plt_readonly        1
5029 #define elf_backend_want_plt_sym        0
5030 #define elf_backend_got_header_size     12
5031 #define elf_backend_plt_alignment       4
5032 
5033 /* Support RELA for objdump of prelink objects.  */
5034 #define elf_info_to_howto                     elf_i386_info_to_howto_rel
5035 #define elf_info_to_howto_rel                 elf_i386_info_to_howto_rel
5036 
5037 #define bfd_elf32_mkobject                    elf_i386_mkobject
5038 
5039 #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
5040 #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
5041 #define bfd_elf32_bfd_link_hash_table_free    elf_i386_link_hash_table_free
5042 #define bfd_elf32_bfd_reloc_type_lookup       elf_i386_reloc_type_lookup
5043 #define bfd_elf32_bfd_reloc_name_lookup       elf_i386_reloc_name_lookup
5044 
5045 #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
5046 #define elf_backend_relocs_compatible         _bfd_elf_relocs_compatible
5047 #define elf_backend_check_relocs              elf_i386_check_relocs
5048 #define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
5049 #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
5050 #define elf_backend_fake_sections             elf_i386_fake_sections
5051 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
5052 #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
5053 #define elf_backend_gc_mark_hook              elf_i386_gc_mark_hook
5054 #define elf_backend_gc_sweep_hook             elf_i386_gc_sweep_hook
5055 #define elf_backend_grok_prstatus             elf_i386_grok_prstatus
5056 #define elf_backend_grok_psinfo                         elf_i386_grok_psinfo
5057 #define elf_backend_reloc_type_class          elf_i386_reloc_type_class
5058 #define elf_backend_relocate_section          elf_i386_relocate_section
5059 #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
5060 #define elf_backend_always_size_sections      elf_i386_always_size_sections
5061 #define elf_backend_omit_section_dynsym \
5062   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5063 #define elf_backend_plt_sym_val                         elf_i386_plt_sym_val
5064 #define elf_backend_hash_symbol                         elf_i386_hash_symbol
5065 #define elf_backend_add_symbol_hook           elf_i386_add_symbol_hook
5066 #undef    elf_backend_post_process_headers
5067 #define   elf_backend_post_process_headers        _bfd_elf_set_osabi
5068 
5069 #include "elf32-target.h"
5070 
5071 /* FreeBSD support.  */
5072 
5073 #undef    TARGET_LITTLE_SYM
5074 #define   TARGET_LITTLE_SYM             bfd_elf32_i386_freebsd_vec
5075 #undef    TARGET_LITTLE_NAME
5076 #define   TARGET_LITTLE_NAME            "elf32-i386-freebsd"
5077 #undef    ELF_OSABI
5078 #define   ELF_OSABI                     ELFOSABI_FREEBSD
5079 
5080 /* The kernel recognizes executables as valid only if they carry a
5081    "FreeBSD" label in the ELF header.  So we put this label on all
5082    executables and (for simplicity) also all other object files.  */
5083 
5084 static void
elf_i386_fbsd_post_process_headers(bfd * abfd,struct bfd_link_info * info)5085 elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
5086 {
5087   _bfd_elf_set_osabi (abfd, info);
5088 
5089 #ifdef OLD_FREEBSD_ABI_LABEL
5090   /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5091   memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5092 #endif
5093 }
5094 
5095 #undef    elf_backend_post_process_headers
5096 #define   elf_backend_post_process_headers        elf_i386_fbsd_post_process_headers
5097 #undef    elf32_bed
5098 #define   elf32_bed                               elf32_i386_fbsd_bed
5099 
5100 #undef elf_backend_add_symbol_hook
5101 
5102 #include "elf32-target.h"
5103 
5104 /* Solaris 2.  */
5105 
5106 #undef    TARGET_LITTLE_SYM
5107 #define   TARGET_LITTLE_SYM             bfd_elf32_i386_sol2_vec
5108 #undef    TARGET_LITTLE_NAME
5109 #define   TARGET_LITTLE_NAME            "elf32-i386-sol2"
5110 
5111 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
5112    objects won't be recognized.  */
5113 #undef ELF_OSABI
5114 
5115 #undef    elf32_bed
5116 #define   elf32_bed                     elf32_i386_sol2_bed
5117 
5118 /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
5119    boundary.  */
5120 #undef elf_backend_static_tls_alignment
5121 #define elf_backend_static_tls_alignment 8
5122 
5123 /* The Solaris 2 ABI requires a plt symbol on all platforms.
5124 
5125    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
5126    File, p.63.  */
5127 #undef elf_backend_want_plt_sym
5128 #define elf_backend_want_plt_sym        1
5129 
5130 #include "elf32-target.h"
5131 
5132 /* Native Client support.  */
5133 
5134 #undef    TARGET_LITTLE_SYM
5135 #define   TARGET_LITTLE_SYM             bfd_elf32_i386_nacl_vec
5136 #undef    TARGET_LITTLE_NAME
5137 #define   TARGET_LITTLE_NAME            "elf32-i386-nacl"
5138 #undef    elf32_bed
5139 #define   elf32_bed                     elf32_i386_nacl_bed
5140 
5141 #undef    ELF_MAXPAGESIZE
5142 #define   ELF_MAXPAGESIZE                         0x10000
5143 
5144 /* Restore defaults.  */
5145 #undef    ELF_OSABI
5146 #undef    elf_backend_want_plt_sym
5147 #define elf_backend_want_plt_sym        0
5148 #undef    elf_backend_post_process_headers
5149 #define   elf_backend_post_process_headers        _bfd_elf_set_osabi
5150 #undef    elf_backend_static_tls_alignment
5151 
5152 /* NaCl uses substantially different PLT entries for the same effects.  */
5153 
5154 #undef    elf_backend_plt_alignment
5155 #define elf_backend_plt_alignment       5
5156 #define NACL_PLT_ENTRY_SIZE             64
5157 #define   NACLMASK                      0xe0 /* 32-byte alignment mask.  */
5158 
5159 static const bfd_byte elf_i386_nacl_plt0_entry[] =
5160   {
5161     0xff, 0x35,                           /* pushl contents of address */
5162     0, 0, 0, 0,                           /* replaced with address of .got + 4.  */
5163     0x8b, 0x0d,                   /* movl contents of address, %ecx */
5164     0, 0, 0, 0,                           /* replaced with address of .got + 8.  */
5165     0x83, 0xe1, NACLMASK,       /* andl $NACLMASK, %ecx */
5166     0xff, 0xe1                            /* jmp *%ecx */
5167   };
5168 
5169 static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
5170   {
5171     0x8b, 0x0d,                                   /* movl contents of address, %ecx */
5172     0, 0, 0, 0,                                   /* replaced with GOT slot address.  */
5173     0x83, 0xe1, NACLMASK,               /* andl $NACLMASK, %ecx */
5174     0xff, 0xe1,                                   /* jmp *%ecx */
5175 
5176     /* Pad to the next 32-byte boundary with nop instructions.        */
5177     0x90,
5178     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5179     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5180 
5181     /* Lazy GOT entries point here (32-byte aligned).  */
5182     0x68,                            /* pushl immediate */
5183     0, 0, 0, 0,                                /* replaced with reloc offset.  */
5184     0xe9,                            /* jmp relative */
5185     0, 0, 0, 0,                                /* replaced with offset to .plt.  */
5186 
5187     /* Pad to the next 32-byte boundary with nop instructions.        */
5188     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5189     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5190     0x90, 0x90
5191   };
5192 
5193 static const bfd_byte
5194 elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
5195   {
5196     0xff, 0x73, 0x04,                   /* pushl 4(%ebx) */
5197     0x8b, 0x4b, 0x08,                   /* mov 0x8(%ebx), %ecx */
5198     0x83, 0xe1, 0xe0,                   /* and $NACLMASK, %ecx */
5199     0xff, 0xe1,                         /* jmp *%ecx */
5200 
5201     /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
5202        so pad to that size with nop instructions.  */
5203     0x90, 0x90, 0x90, 0x90, 0x90, 0x90
5204   };
5205 
5206 static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
5207   {
5208     0x8b, 0x8b,          /* movl offset(%ebx), %ecx */
5209     0, 0, 0, 0,          /* replaced with offset of this symbol in .got.  */
5210     0x83, 0xe1, 0xe0,    /* andl $NACLMASK, %ecx */
5211     0xff, 0xe1,          /* jmp *%ecx */
5212 
5213     /* Pad to the next 32-byte boundary with nop instructions.        */
5214     0x90,
5215     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5216     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5217 
5218     /* Lazy GOT entries point here (32-byte aligned).  */
5219     0x68,                /* pushl immediate */
5220     0, 0, 0, 0,          /* replaced with offset into relocation table.  */
5221     0xe9,                /* jmp relative */
5222     0, 0, 0, 0,          /* replaced with offset to start of .plt.  */
5223 
5224     /* Pad to the next 32-byte boundary with nop instructions.        */
5225     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5226     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
5227     0x90, 0x90
5228   };
5229 
5230 static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
5231   {
5232 #if (PLT_CIE_LENGTH != 20                               \
5233      || PLT_FDE_LENGTH != 36                            \
5234      || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8  \
5235      || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
5236 # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
5237 #endif
5238     PLT_CIE_LENGTH, 0, 0, 0,            /* CIE length */
5239     0, 0, 0, 0,                         /* CIE ID */
5240     1,                                  /* CIE version */
5241     'z', 'R', 0,                        /* Augmentation string */
5242     1,                                  /* Code alignment factor */
5243     0x7c,                               /* Data alignment factor: -4 */
5244     8,                                  /* Return address column */
5245     1,                                            /* Augmentation size */
5246     DW_EH_PE_pcrel | DW_EH_PE_sdata4,   /* FDE encoding */
5247     DW_CFA_def_cfa, 4, 4,               /* DW_CFA_def_cfa: r4 (esp) ofs 4 */
5248     DW_CFA_offset + 8, 1,               /* DW_CFA_offset: r8 (eip) at cfa-4 */
5249     DW_CFA_nop, DW_CFA_nop,
5250 
5251     PLT_FDE_LENGTH, 0, 0, 0,     /* FDE length */
5252     PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
5253     0, 0, 0, 0,                  /* R_386_PC32 .plt goes here */
5254     0, 0, 0, 0,                  /* .plt size goes here */
5255     0,                           /* Augmentation size */
5256     DW_CFA_def_cfa_offset, 8,    /* DW_CFA_def_cfa_offset: 8 */
5257     DW_CFA_advance_loc + 6,      /* DW_CFA_advance_loc: 6 to __PLT__+6 */
5258     DW_CFA_def_cfa_offset, 12,   /* DW_CFA_def_cfa_offset: 12 */
5259     DW_CFA_advance_loc + 58,     /* DW_CFA_advance_loc: 58 to __PLT__+64 */
5260     DW_CFA_def_cfa_expression,   /* DW_CFA_def_cfa_expression */
5261     13,                          /* Block length */
5262     DW_OP_breg4, 4,              /* DW_OP_breg4 (esp): 4 */
5263     DW_OP_breg8, 0,              /* DW_OP_breg8 (eip): 0 */
5264     DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
5265     DW_OP_lit2, DW_OP_shl, DW_OP_plus,
5266     DW_CFA_nop, DW_CFA_nop
5267   };
5268 
5269 static const struct elf_i386_plt_layout elf_i386_nacl_plt =
5270   {
5271     elf_i386_nacl_plt0_entry,           /* plt0_entry */
5272     sizeof (elf_i386_nacl_plt0_entry),  /* plt0_entry_size */
5273     2,                                            /* plt0_got1_offset */
5274     8,                                            /* plt0_got2_offset */
5275     elf_i386_nacl_plt_entry,            /* plt_entry */
5276     NACL_PLT_ENTRY_SIZE,                /* plt_entry_size */
5277     2,                                            /* plt_got_offset */
5278     33,                                           /* plt_reloc_offset */
5279     38,                                           /* plt_plt_offset */
5280     32,                                           /* plt_lazy_offset */
5281     elf_i386_nacl_pic_plt0_entry,       /* pic_plt0_entry */
5282     elf_i386_nacl_pic_plt_entry,        /* pic_plt_entry */
5283     elf_i386_nacl_eh_frame_plt,                   /* eh_frame_plt */
5284     sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
5285   };
5286 
5287 static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
5288   {
5289     &elf_i386_nacl_plt,                      /* plt */
5290     0x90,                               /* plt0_pad_byte: nop insn */
5291     0,                                  /* is_vxworks */
5292   };
5293 
5294 #undef    elf_backend_arch_data
5295 #define elf_backend_arch_data &elf_i386_nacl_arch_bed
5296 
5297 #undef    elf_backend_modify_segment_map
5298 #define   elf_backend_modify_segment_map                    nacl_modify_segment_map
5299 #undef    elf_backend_modify_program_headers
5300 #define   elf_backend_modify_program_headers      nacl_modify_program_headers
5301 
5302 #include "elf32-target.h"
5303 
5304 /* Restore defaults.  */
5305 #undef    elf_backend_modify_segment_map
5306 #undef    elf_backend_modify_program_headers
5307 
5308 /* VxWorks support.  */
5309 
5310 #undef    TARGET_LITTLE_SYM
5311 #define TARGET_LITTLE_SYM               bfd_elf32_i386_vxworks_vec
5312 #undef    TARGET_LITTLE_NAME
5313 #define TARGET_LITTLE_NAME              "elf32-i386-vxworks"
5314 #undef    ELF_OSABI
5315 #undef    elf_backend_plt_alignment
5316 #define elf_backend_plt_alignment       4
5317 
5318 static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
5319   {
5320     &elf_i386_plt,                      /* plt */
5321     0x90,                               /* plt0_pad_byte */
5322     1,                                  /* is_vxworks */
5323   };
5324 
5325 #undef    elf_backend_arch_data
5326 #define   elf_backend_arch_data         &elf_i386_vxworks_arch_bed
5327 
5328 #undef elf_backend_relocs_compatible
5329 #undef elf_backend_post_process_headers
5330 #undef elf_backend_add_symbol_hook
5331 #define elf_backend_add_symbol_hook \
5332   elf_vxworks_add_symbol_hook
5333 #undef elf_backend_link_output_symbol_hook
5334 #define elf_backend_link_output_symbol_hook \
5335   elf_vxworks_link_output_symbol_hook
5336 #undef elf_backend_emit_relocs
5337 #define elf_backend_emit_relocs                             elf_vxworks_emit_relocs
5338 #undef elf_backend_final_write_processing
5339 #define elf_backend_final_write_processing \
5340   elf_vxworks_final_write_processing
5341 #undef elf_backend_static_tls_alignment
5342 
5343 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
5344    define it.  */
5345 #undef elf_backend_want_plt_sym
5346 #define elf_backend_want_plt_sym        1
5347 
5348 #undef    elf32_bed
5349 #define elf32_bed                                 elf32_i386_vxworks_bed
5350 
5351 #include "elf32-target.h"
5352