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