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