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