66a27db0ed8186598ea019fff5899be875e9ce8f
[deliverable/binutils-gdb.git] / bfd / elf64-x86-64.c
1 /* X86-64 specific support for 64-bit ELF
2 Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka <jh@suse.cz>.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26
27 #include "elf/x86-64.h"
28
29 /* We use only the RELA entries. */
30 #define USE_RELA 1
31
32 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
33 #define MINUS_ONE (~ (bfd_vma) 0)
34
35 /* The relocation "howto" table. Order of fields:
36 type, size, bitsize, pc_relative, complain_on_overflow,
37 special_function, name, partial_inplace, src_mask, dst_pack, pcrel_offset. */
38 static reloc_howto_type x86_64_elf_howto_table[] =
39 {
40 HOWTO(R_X86_64_NONE, 0, 0, 0, false, 0, complain_overflow_dont,
41 bfd_elf_generic_reloc, "R_X86_64_NONE", false, 0x00000000, 0x00000000,
42 false),
43 HOWTO(R_X86_64_64, 0, 4, 64, false, 0, complain_overflow_bitfield,
44 bfd_elf_generic_reloc, "R_X86_64_64", false, MINUS_ONE, MINUS_ONE,
45 false),
46 HOWTO(R_X86_64_PC32, 0, 4, 32, true, 0, complain_overflow_signed,
47 bfd_elf_generic_reloc, "R_X86_64_PC32", false, 0xffffffff, 0xffffffff,
48 true),
49 HOWTO(R_X86_64_GOT32, 0, 4, 32, false, 0, complain_overflow_signed,
50 bfd_elf_generic_reloc, "R_X86_64_GOT32", false, 0xffffffff, 0xffffffff,
51 false),
52 HOWTO(R_X86_64_PLT32, 0, 4, 32, true, 0, complain_overflow_signed,
53 bfd_elf_generic_reloc, "R_X86_64_PLT32", false, 0xffffffff, 0xffffffff,
54 true),
55 HOWTO(R_X86_64_COPY, 0, 4, 32, false, 0, complain_overflow_bitfield,
56 bfd_elf_generic_reloc, "R_X86_64_COPY", false, 0xffffffff, 0xffffffff,
57 false),
58 HOWTO(R_X86_64_GLOB_DAT, 0, 4, 64, false, 0, complain_overflow_bitfield,
59 bfd_elf_generic_reloc, "R_X86_64_GLOB_DAT", false, MINUS_ONE,
60 MINUS_ONE, false),
61 HOWTO(R_X86_64_JUMP_SLOT, 0, 4, 64, false, 0, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "R_X86_64_JUMP_SLOT", false, MINUS_ONE,
63 MINUS_ONE, false),
64 HOWTO(R_X86_64_RELATIVE, 0, 4, 64, false, 0, complain_overflow_bitfield,
65 bfd_elf_generic_reloc, "R_X86_64_RELATIVE", false, MINUS_ONE,
66 MINUS_ONE, false),
67 HOWTO(R_X86_64_GOTPCREL, 0, 4, 32, true,0 , complain_overflow_signed,
68 bfd_elf_generic_reloc, "R_X86_64_GOTPCREL", false, 0xffffffff,
69 0xffffffff, true),
70 HOWTO(R_X86_64_32, 0, 4, 32, false, 0, complain_overflow_unsigned,
71 bfd_elf_generic_reloc, "R_X86_64_32", false, 0xffffffff, 0xffffffff,
72 false),
73 HOWTO(R_X86_64_32S, 0, 4, 32, false, 0, complain_overflow_signed,
74 bfd_elf_generic_reloc, "R_X86_64_32S", false, 0xffffffff, 0xffffffff,
75 false),
76 HOWTO(R_X86_64_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_X86_64_16", false, 0xffff, 0xffff, false),
78 HOWTO(R_X86_64_PC16,0, 1, 16, true, 0, complain_overflow_bitfield,
79 bfd_elf_generic_reloc, "R_X86_64_PC16", false, 0xffff, 0xffff, true),
80 HOWTO(R_X86_64_8, 0, 0, 8, false, 0, complain_overflow_signed,
81 bfd_elf_generic_reloc, "R_X86_64_8", false, 0xff, 0xff, false),
82 HOWTO(R_X86_64_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
83 bfd_elf_generic_reloc, "R_X86_64_PC8", false, 0xff, 0xff, true),
84
85 /* GNU extension to record C++ vtable hierarchy. */
86 HOWTO (R_X86_64_GNU_VTINHERIT, 0, 4, 0, false, 0, complain_overflow_dont,
87 NULL, "R_X86_64_GNU_VTINHERIT", false, 0, 0, false),
88
89 /* GNU extension to record C++ vtable member usage. */
90 HOWTO (R_X86_64_GNU_VTENTRY, 0, 4, 0, false, 0, complain_overflow_dont,
91 _bfd_elf_rel_vtable_reloc_fn, "R_X86_64_GNU_VTENTRY", false, 0, 0,
92 false)
93 };
94
95 /* Map BFD relocs to the x86_64 elf relocs. */
96 struct elf_reloc_map
97 {
98 bfd_reloc_code_real_type bfd_reloc_val;
99 unsigned char elf_reloc_val;
100 };
101
102 static const struct elf_reloc_map x86_64_reloc_map[] =
103 {
104 { BFD_RELOC_NONE, R_X86_64_NONE, },
105 { BFD_RELOC_64, R_X86_64_64, },
106 { BFD_RELOC_32_PCREL, R_X86_64_PC32, },
107 { BFD_RELOC_X86_64_GOT32, R_X86_64_GOT32,},
108 { BFD_RELOC_X86_64_PLT32, R_X86_64_PLT32,},
109 { BFD_RELOC_X86_64_COPY, R_X86_64_COPY, },
110 { BFD_RELOC_X86_64_GLOB_DAT, R_X86_64_GLOB_DAT, },
111 { BFD_RELOC_X86_64_JUMP_SLOT, R_X86_64_JUMP_SLOT, },
112 { BFD_RELOC_X86_64_RELATIVE, R_X86_64_RELATIVE, },
113 { BFD_RELOC_X86_64_GOTPCREL, R_X86_64_GOTPCREL, },
114 { BFD_RELOC_32, R_X86_64_32, },
115 { BFD_RELOC_X86_64_32S, R_X86_64_32S, },
116 { BFD_RELOC_16, R_X86_64_16, },
117 { BFD_RELOC_16_PCREL, R_X86_64_PC16, },
118 { BFD_RELOC_8, R_X86_64_8, },
119 { BFD_RELOC_8_PCREL, R_X86_64_PC8, },
120 { BFD_RELOC_VTABLE_INHERIT, R_X86_64_GNU_VTINHERIT, },
121 { BFD_RELOC_VTABLE_ENTRY, R_X86_64_GNU_VTENTRY, },
122 };
123
124 static reloc_howto_type *elf64_x86_64_reloc_type_lookup
125 PARAMS ((bfd *, bfd_reloc_code_real_type));
126 static void elf64_x86_64_info_to_howto
127 PARAMS ((bfd *, arelent *, Elf64_Internal_Rela *));
128 static boolean elf64_x86_64_grok_prstatus
129 PARAMS ((bfd *, Elf_Internal_Note *));
130 static boolean elf64_x86_64_grok_psinfo
131 PARAMS ((bfd *, Elf_Internal_Note *));
132 static struct bfd_link_hash_table *elf64_x86_64_link_hash_table_create
133 PARAMS ((bfd *));
134 static boolean elf64_x86_64_elf_object_p PARAMS ((bfd *abfd));
135 static boolean create_got_section
136 PARAMS((bfd *, struct bfd_link_info *));
137 static boolean elf64_x86_64_create_dynamic_sections
138 PARAMS((bfd *, struct bfd_link_info *));
139 static void elf64_x86_64_copy_indirect_symbol
140 PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
141 static boolean elf64_x86_64_check_relocs
142 PARAMS ((bfd *, struct bfd_link_info *, asection *sec,
143 const Elf_Internal_Rela *));
144 static asection *elf64_x86_64_gc_mark_hook
145 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
146 struct elf_link_hash_entry *, Elf_Internal_Sym *));
147
148 static boolean elf64_x86_64_gc_sweep_hook
149 PARAMS ((bfd *, struct bfd_link_info *, asection *,
150 const Elf_Internal_Rela *));
151
152 static struct bfd_hash_entry *link_hash_newfunc
153 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
154 static boolean elf64_x86_64_adjust_dynamic_symbol
155 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
156
157 static boolean allocate_dynrelocs
158 PARAMS ((struct elf_link_hash_entry *, PTR));
159 static boolean readonly_dynrelocs
160 PARAMS ((struct elf_link_hash_entry *, PTR));
161 static boolean elf64_x86_64_size_dynamic_sections
162 PARAMS ((bfd *, struct bfd_link_info *));
163 static boolean elf64_x86_64_relocate_section
164 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
165 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
166 static boolean elf64_x86_64_finish_dynamic_symbol
167 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
168 Elf_Internal_Sym *sym));
169 static boolean elf64_x86_64_finish_dynamic_sections
170 PARAMS ((bfd *, struct bfd_link_info *));
171 static enum elf_reloc_type_class elf64_x86_64_reloc_type_class
172 PARAMS ((const Elf_Internal_Rela *));
173
174 /* Given a BFD reloc type, return a HOWTO structure. */
175 static reloc_howto_type *
176 elf64_x86_64_reloc_type_lookup (abfd, code)
177 bfd *abfd ATTRIBUTE_UNUSED;
178 bfd_reloc_code_real_type code;
179 {
180 unsigned int i;
181 for (i = 0; i < sizeof (x86_64_reloc_map) / sizeof (struct elf_reloc_map);
182 i++)
183 {
184 if (x86_64_reloc_map[i].bfd_reloc_val == code)
185 return &x86_64_elf_howto_table[i];
186 }
187 return 0;
188 }
189
190 /* Given an x86_64 ELF reloc type, fill in an arelent structure. */
191
192 static void
193 elf64_x86_64_info_to_howto (abfd, cache_ptr, dst)
194 bfd *abfd ATTRIBUTE_UNUSED;
195 arelent *cache_ptr;
196 Elf64_Internal_Rela *dst;
197 {
198 unsigned r_type, i;
199
200 r_type = ELF64_R_TYPE (dst->r_info);
201 if (r_type < (unsigned int) R_X86_64_GNU_VTINHERIT)
202 {
203 BFD_ASSERT (r_type <= (unsigned int) R_X86_64_PC8);
204 i = r_type;
205 }
206 else
207 {
208 BFD_ASSERT (r_type < (unsigned int) R_X86_64_max);
209 i = r_type - ((unsigned int) R_X86_64_GNU_VTINHERIT - R_X86_64_PC8 - 1);
210 }
211 cache_ptr->howto = &x86_64_elf_howto_table[i];
212 BFD_ASSERT (r_type == cache_ptr->howto->type);
213 }
214 \f
215 /* Support for core dump NOTE sections. */
216 static boolean
217 elf64_x86_64_grok_prstatus (abfd, note)
218 bfd *abfd;
219 Elf_Internal_Note *note;
220 {
221 int offset;
222 size_t raw_size;
223
224 switch (note->descsz)
225 {
226 default:
227 return false;
228
229 case 336: /* sizeof(istruct elf_prstatus) on Linux/x86_64 */
230 /* pr_cursig */
231 elf_tdata (abfd)->core_signal
232 = bfd_get_16 (abfd, note->descdata + 12);
233
234 /* pr_pid */
235 elf_tdata (abfd)->core_pid
236 = bfd_get_32 (abfd, note->descdata + 32);
237
238 /* pr_reg */
239 offset = 112;
240 raw_size = 216;
241
242 break;
243 }
244
245 /* Make a ".reg/999" section. */
246 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
247 raw_size, note->descpos + offset);
248 }
249
250 static boolean
251 elf64_x86_64_grok_psinfo (abfd, note)
252 bfd *abfd;
253 Elf_Internal_Note *note;
254 {
255 switch (note->descsz)
256 {
257 default:
258 return false;
259
260 case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */
261 elf_tdata (abfd)->core_program
262 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
263 elf_tdata (abfd)->core_command
264 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
265 }
266
267 /* Note that for some reason, a spurious space is tacked
268 onto the end of the args in some (at least one anyway)
269 implementations, so strip it off if it exists. */
270
271 {
272 char *command = elf_tdata (abfd)->core_command;
273 int n = strlen (command);
274
275 if (0 < n && command[n - 1] == ' ')
276 command[n - 1] = '\0';
277 }
278
279 return true;
280 }
281 \f
282 /* Functions for the x86-64 ELF linker. */
283
284 /* The name of the dynamic interpreter. This is put in the .interp
285 section. */
286
287 #define ELF_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
288
289 /* The size in bytes of an entry in the global offset table. */
290
291 #define GOT_ENTRY_SIZE 8
292
293 /* The size in bytes of an entry in the procedure linkage table. */
294
295 #define PLT_ENTRY_SIZE 16
296
297 /* The first entry in a procedure linkage table looks like this. See the
298 SVR4 ABI i386 supplement and the x86-64 ABI to see how this works. */
299
300 static const bfd_byte elf64_x86_64_plt0_entry[PLT_ENTRY_SIZE] =
301 {
302 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
303 0xff, 0x25, 16, 0, 0, 0, /* jmpq *GOT+16(%rip) */
304 0x90, 0x90, 0x90, 0x90 /* pad out to 16 bytes with nops. */
305 };
306
307 /* Subsequent entries in a procedure linkage table look like this. */
308
309 static const bfd_byte elf64_x86_64_plt_entry[PLT_ENTRY_SIZE] =
310 {
311 0xff, 0x25, /* jmpq *name@GOTPC(%rip) */
312 0, 0, 0, 0, /* replaced with offset to this symbol in .got. */
313 0x68, /* pushq immediate */
314 0, 0, 0, 0, /* replaced with index into relocation table. */
315 0xe9, /* jmp relative */
316 0, 0, 0, 0 /* replaced with offset to start of .plt0. */
317 };
318
319 /* The x86-64 linker needs to keep track of the number of relocs that
320 it decides to copy as dynamic relocs in check_relocs for each symbol.
321 This is so that it can later discard them if they are found to be
322 unnecessary. We store the information in a field extending the
323 regular ELF linker hash table. */
324
325 struct elf64_x86_64_dyn_relocs
326 {
327 /* Next section. */
328 struct elf64_x86_64_dyn_relocs *next;
329
330 /* The input section of the reloc. */
331 asection *sec;
332
333 /* Total number of relocs copied for the input section. */
334 bfd_size_type count;
335
336 /* Number of pc-relative relocs copied for the input section. */
337 bfd_size_type pc_count;
338 };
339
340 /* x86-64 ELF linker hash entry. */
341
342 struct elf64_x86_64_link_hash_entry
343 {
344 struct elf_link_hash_entry elf;
345
346 /* Track dynamic relocs copied for this symbol. */
347 struct elf64_x86_64_dyn_relocs *dyn_relocs;
348 };
349
350 /* x86-64 ELF linker hash table. */
351
352 struct elf64_x86_64_link_hash_table
353 {
354 struct elf_link_hash_table elf;
355
356 /* Short-cuts to get to dynamic linker sections. */
357 asection *sgot;
358 asection *sgotplt;
359 asection *srelgot;
360 asection *splt;
361 asection *srelplt;
362 asection *sdynbss;
363 asection *srelbss;
364
365 /* Small local sym to section mapping cache. */
366 struct sym_sec_cache sym_sec;
367 };
368
369 /* Get the x86-64 ELF linker hash table from a link_info structure. */
370
371 #define elf64_x86_64_hash_table(p) \
372 ((struct elf64_x86_64_link_hash_table *) ((p)->hash))
373
374 /* Create an entry in an x86-64 ELF linker hash table. */
375
376 static struct bfd_hash_entry *
377 link_hash_newfunc (entry, table, string)
378 struct bfd_hash_entry *entry;
379 struct bfd_hash_table *table;
380 const char *string;
381 {
382 /* Allocate the structure if it has not already been allocated by a
383 subclass. */
384 if (entry == NULL)
385 {
386 entry = bfd_hash_allocate (table,
387 sizeof (struct elf64_x86_64_link_hash_entry));
388 if (entry == NULL)
389 return entry;
390 }
391
392 /* Call the allocation method of the superclass. */
393 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
394 if (entry != NULL)
395 {
396 struct elf64_x86_64_link_hash_entry *eh;
397
398 eh = (struct elf64_x86_64_link_hash_entry *) entry;
399 eh->dyn_relocs = NULL;
400 }
401
402 return entry;
403 }
404
405 /* Create an X86-64 ELF linker hash table. */
406
407 static struct bfd_link_hash_table *
408 elf64_x86_64_link_hash_table_create (abfd)
409 bfd *abfd;
410 {
411 struct elf64_x86_64_link_hash_table *ret;
412 bfd_size_type amt = sizeof (struct elf64_x86_64_link_hash_table);
413
414 ret = (struct elf64_x86_64_link_hash_table *) bfd_malloc (amt);
415 if (ret == NULL)
416 return NULL;
417
418 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
419 {
420 free (ret);
421 return NULL;
422 }
423
424 ret->sgot = NULL;
425 ret->sgotplt = NULL;
426 ret->srelgot = NULL;
427 ret->splt = NULL;
428 ret->srelplt = NULL;
429 ret->sdynbss = NULL;
430 ret->srelbss = NULL;
431 ret->sym_sec.abfd = NULL;
432
433 return &ret->elf.root;
434 }
435
436 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
437 shortcuts to them in our hash table. */
438
439 static boolean
440 create_got_section (dynobj, info)
441 bfd *dynobj;
442 struct bfd_link_info *info;
443 {
444 struct elf64_x86_64_link_hash_table *htab;
445
446 if (! _bfd_elf_create_got_section (dynobj, info))
447 return false;
448
449 htab = elf64_x86_64_hash_table (info);
450 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
451 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
452 if (!htab->sgot || !htab->sgotplt)
453 abort ();
454
455 htab->srelgot = bfd_make_section (dynobj, ".rela.got");
456 if (htab->srelgot == NULL
457 || ! bfd_set_section_flags (dynobj, htab->srelgot,
458 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
459 | SEC_IN_MEMORY | SEC_LINKER_CREATED
460 | SEC_READONLY))
461 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
462 return false;
463 return true;
464 }
465
466 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
467 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
468 hash table. */
469
470 static boolean
471 elf64_x86_64_create_dynamic_sections (dynobj, info)
472 bfd *dynobj;
473 struct bfd_link_info *info;
474 {
475 struct elf64_x86_64_link_hash_table *htab;
476
477 htab = elf64_x86_64_hash_table (info);
478 if (!htab->sgot && !create_got_section (dynobj, info))
479 return false;
480
481 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
482 return false;
483
484 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
485 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
486 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
487 if (!info->shared)
488 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
489
490 if (!htab->splt || !htab->srelplt || !htab->sdynbss
491 || (!info->shared && !htab->srelbss))
492 abort ();
493
494 return true;
495 }
496
497 /* Copy the extra info we tack onto an elf_link_hash_entry. */
498
499 static void
500 elf64_x86_64_copy_indirect_symbol (dir, ind)
501 struct elf_link_hash_entry *dir, *ind;
502 {
503 struct elf64_x86_64_link_hash_entry *edir, *eind;
504
505 edir = (struct elf64_x86_64_link_hash_entry *) dir;
506 eind = (struct elf64_x86_64_link_hash_entry *) ind;
507
508 if (eind->dyn_relocs != NULL)
509 {
510 if (edir->dyn_relocs != NULL)
511 {
512 struct elf64_x86_64_dyn_relocs **pp;
513 struct elf64_x86_64_dyn_relocs *p;
514
515 if (ind->root.type == bfd_link_hash_indirect)
516 abort ();
517
518 /* Add reloc counts against the weak sym to the strong sym
519 list. Merge any entries against the same section. */
520 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
521 {
522 struct elf64_x86_64_dyn_relocs *q;
523
524 for (q = edir->dyn_relocs; q != NULL; q = q->next)
525 if (q->sec == p->sec)
526 {
527 q->pc_count += p->pc_count;
528 q->count += p->count;
529 *pp = p->next;
530 break;
531 }
532 if (q == NULL)
533 pp = &p->next;
534 }
535 *pp = edir->dyn_relocs;
536 }
537
538 edir->dyn_relocs = eind->dyn_relocs;
539 eind->dyn_relocs = NULL;
540 }
541
542 _bfd_elf_link_hash_copy_indirect (dir, ind);
543 }
544
545 static boolean
546 elf64_x86_64_elf_object_p (abfd)
547 bfd *abfd;
548 {
549 /* Set the right machine number for an x86-64 elf64 file. */
550 bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_x86_64);
551 return true;
552 }
553
554 /* Look through the relocs for a section during the first phase, and
555 calculate needed space in the global offset table, procedure
556 linkage table, and dynamic reloc sections. */
557
558 static boolean
559 elf64_x86_64_check_relocs (abfd, info, sec, relocs)
560 bfd *abfd;
561 struct bfd_link_info *info;
562 asection *sec;
563 const Elf_Internal_Rela *relocs;
564 {
565 struct elf64_x86_64_link_hash_table *htab;
566 Elf_Internal_Shdr *symtab_hdr;
567 struct elf_link_hash_entry **sym_hashes;
568 const Elf_Internal_Rela *rel;
569 const Elf_Internal_Rela *rel_end;
570 asection *sreloc;
571
572 if (info->relocateable)
573 return true;
574
575 htab = elf64_x86_64_hash_table (info);
576 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
577 sym_hashes = elf_sym_hashes (abfd);
578
579 sreloc = NULL;
580
581 rel_end = relocs + sec->reloc_count;
582 for (rel = relocs; rel < rel_end; rel++)
583 {
584 unsigned long r_symndx;
585 struct elf_link_hash_entry *h;
586
587 r_symndx = ELF64_R_SYM (rel->r_info);
588
589 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
590 {
591 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
592 bfd_archive_filename (abfd),
593 r_symndx);
594 return false;
595 }
596
597 if (r_symndx < symtab_hdr->sh_info)
598 h = NULL;
599 else
600 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
601
602 switch (ELF64_R_TYPE (rel->r_info))
603 {
604 case R_X86_64_GOT32:
605 case R_X86_64_GOTPCREL:
606 /* This symbol requires a global offset table entry. */
607 if (h != NULL)
608 {
609 h->got.refcount += 1;
610 }
611 else
612 {
613 bfd_signed_vma *local_got_refcounts;
614
615 /* This is a global offset table entry for a local symbol. */
616 local_got_refcounts = elf_local_got_refcounts (abfd);
617 if (local_got_refcounts == NULL)
618 {
619 bfd_size_type size;
620
621 size = symtab_hdr->sh_info;
622 size *= sizeof (bfd_signed_vma);
623 local_got_refcounts = ((bfd_signed_vma *)
624 bfd_zalloc (abfd, size));
625 if (local_got_refcounts == NULL)
626 return false;
627 elf_local_got_refcounts (abfd) = local_got_refcounts;
628 }
629 local_got_refcounts[r_symndx] += 1;
630 }
631 /* Fall through */
632
633 //case R_X86_64_GOTPCREL:
634 if (htab->sgot == NULL)
635 {
636 if (htab->elf.dynobj == NULL)
637 htab->elf.dynobj = abfd;
638 if (!create_got_section (htab->elf.dynobj, info))
639 return false;
640 }
641 break;
642
643 case R_X86_64_PLT32:
644 /* This symbol requires a procedure linkage table entry. We
645 actually build the entry in adjust_dynamic_symbol,
646 because this might be a case of linking PIC code which is
647 never referenced by a dynamic object, in which case we
648 don't need to generate a procedure linkage table entry
649 after all. */
650
651 /* If this is a local symbol, we resolve it directly without
652 creating a procedure linkage table entry. */
653 if (h == NULL)
654 continue;
655
656 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
657 h->plt.refcount += 1;
658 break;
659
660 case R_X86_64_8:
661 case R_X86_64_16:
662 case R_X86_64_32:
663 case R_X86_64_64:
664 case R_X86_64_32S:
665 case R_X86_64_PC8:
666 case R_X86_64_PC16:
667 case R_X86_64_PC32:
668 if (h != NULL && !info->shared)
669 {
670 /* If this reloc is in a read-only section, we might
671 need a copy reloc. We can't check reliably at this
672 stage whether the section is read-only, as input
673 sections have not yet been mapped to output sections.
674 Tentatively set the flag for now, and correct in
675 adjust_dynamic_symbol. */
676 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
677
678 /* We may need a .plt entry if the function this reloc
679 refers to is in a shared lib. */
680 h->plt.refcount += 1;
681 }
682
683 /* If we are creating a shared library, and this is a reloc
684 against a global symbol, or a non PC relative reloc
685 against a local symbol, then we need to copy the reloc
686 into the shared library. However, if we are linking with
687 -Bsymbolic, we do not need to copy a reloc against a
688 global symbol which is defined in an object we are
689 including in the link (i.e., DEF_REGULAR is set). At
690 this point we have not seen all the input files, so it is
691 possible that DEF_REGULAR is not set now but will be set
692 later (it is never cleared). In case of a weak definition,
693 DEF_REGULAR may be cleared later by a strong definition in
694 a shared library. We account for that possibility below by
695 storing information in the relocs_copied field of the hash
696 table entry. A similar situation occurs when creating
697 shared libraries and symbol visibility changes render the
698 symbol local.
699
700 If on the other hand, we are creating an executable, we
701 may need to keep relocations for symbols satisfied by a
702 dynamic library if we manage to avoid copy relocs for the
703 symbol. */
704 if ((info->shared
705 && (sec->flags & SEC_ALLOC) != 0
706 && (((ELF64_R_TYPE (rel->r_info) != R_X86_64_PC8)
707 && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC16)
708 && (ELF64_R_TYPE (rel->r_info) != R_X86_64_PC32))
709 || (h != NULL
710 && (! info->symbolic
711 || h->root.type == bfd_link_hash_defweak
712 || (h->elf_link_hash_flags
713 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
714 || (!info->shared
715 && (sec->flags & SEC_ALLOC) != 0
716 && h != NULL
717 && (h->root.type == bfd_link_hash_defweak
718 || (h->elf_link_hash_flags
719 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
720 {
721 struct elf64_x86_64_dyn_relocs *p;
722 struct elf64_x86_64_dyn_relocs **head;
723
724 /* We must copy these reloc types into the output file.
725 Create a reloc section in dynobj and make room for
726 this reloc. */
727 if (sreloc == NULL)
728 {
729 const char *name;
730 bfd *dynobj;
731
732 name = (bfd_elf_string_from_elf_section
733 (abfd,
734 elf_elfheader (abfd)->e_shstrndx,
735 elf_section_data (sec)->rel_hdr.sh_name));
736 if (name == NULL)
737 return false;
738
739 if (strncmp (name, ".rela", 5) != 0
740 || strcmp (bfd_get_section_name (abfd, sec),
741 name + 5) != 0)
742 {
743 (*_bfd_error_handler)
744 (_("%s: bad relocation section name `%s\'"),
745 bfd_archive_filename (abfd), name);
746 }
747
748 if (htab->elf.dynobj == NULL)
749 htab->elf.dynobj = abfd;
750
751 dynobj = htab->elf.dynobj;
752
753 sreloc = bfd_get_section_by_name (dynobj, name);
754 if (sreloc == NULL)
755 {
756 flagword flags;
757
758 sreloc = bfd_make_section (dynobj, name);
759 flags = (SEC_HAS_CONTENTS | SEC_READONLY
760 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
761 if ((sec->flags & SEC_ALLOC) != 0)
762 flags |= SEC_ALLOC | SEC_LOAD;
763 if (sreloc == NULL
764 || ! bfd_set_section_flags (dynobj, sreloc, flags)
765 || ! bfd_set_section_alignment (dynobj, sreloc, 3))
766 return false;
767 }
768 elf_section_data (sec)->sreloc = sreloc;
769 }
770
771 /* If this is a global symbol, we count the number of
772 relocations we need for this symbol. */
773 if (h != NULL)
774 {
775 head = &((struct elf64_x86_64_link_hash_entry *) h)->dyn_relocs;
776 }
777 else
778 {
779 /* Track dynamic relocs needed for local syms too.
780 We really need local syms available to do this
781 easily. Oh well. */
782
783 asection *s;
784 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
785 sec, r_symndx);
786 if (s == NULL)
787 return false;
788
789 head = ((struct elf64_x86_64_dyn_relocs **)
790 &elf_section_data (s)->local_dynrel);
791 }
792
793 p = *head;
794 if (p == NULL || p->sec != sec)
795 {
796 bfd_size_type amt = sizeof *p;
797 p = ((struct elf64_x86_64_dyn_relocs *)
798 bfd_alloc (htab->elf.dynobj, amt));
799 if (p == NULL)
800 return false;
801 p->next = *head;
802 *head = p;
803 p->sec = sec;
804 p->count = 0;
805 p->pc_count = 0;
806 }
807
808 p->count += 1;
809 if (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC8
810 || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC16
811 || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)
812 p->pc_count += 1;
813 }
814 break;
815
816 /* This relocation describes the C++ object vtable hierarchy.
817 Reconstruct it for later use during GC. */
818 case R_X86_64_GNU_VTINHERIT:
819 if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
820 return false;
821 break;
822
823 /* This relocation describes which C++ vtable entries are actually
824 used. Record for later use during GC. */
825 case R_X86_64_GNU_VTENTRY:
826 if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
827 return false;
828 break;
829
830 default:
831 break;
832 }
833 }
834
835 return true;
836 }
837
838 /* Return the section that should be marked against GC for a given
839 relocation. */
840
841 static asection *
842 elf64_x86_64_gc_mark_hook (abfd, info, rel, h, sym)
843 bfd *abfd;
844 struct bfd_link_info *info ATTRIBUTE_UNUSED;
845 Elf_Internal_Rela *rel;
846 struct elf_link_hash_entry *h;
847 Elf_Internal_Sym *sym;
848 {
849 if (h != NULL)
850 {
851 switch (ELF64_R_TYPE (rel->r_info))
852 {
853 case R_X86_64_GNU_VTINHERIT:
854 case R_X86_64_GNU_VTENTRY:
855 break;
856
857 default:
858 switch (h->root.type)
859 {
860 case bfd_link_hash_defined:
861 case bfd_link_hash_defweak:
862 return h->root.u.def.section;
863
864 case bfd_link_hash_common:
865 return h->root.u.c.p->section;
866
867 default:
868 break;
869 }
870 }
871 }
872 else
873 {
874 return bfd_section_from_elf_index (abfd, sym->st_shndx);
875 }
876
877 return NULL;
878 }
879
880 /* Update the got entry reference counts for the section being removed. */
881
882 static boolean
883 elf64_x86_64_gc_sweep_hook (abfd, info, sec, relocs)
884 bfd *abfd;
885 struct bfd_link_info *info;
886 asection *sec;
887 const Elf_Internal_Rela *relocs;
888 {
889 Elf_Internal_Shdr *symtab_hdr;
890 struct elf_link_hash_entry **sym_hashes;
891 bfd_signed_vma *local_got_refcounts;
892 const Elf_Internal_Rela *rel, *relend;
893 unsigned long r_symndx;
894 struct elf_link_hash_entry *h;
895
896 elf_section_data (sec)->local_dynrel = NULL;
897
898 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
899 sym_hashes = elf_sym_hashes (abfd);
900 local_got_refcounts = elf_local_got_refcounts (abfd);
901
902 relend = relocs + sec->reloc_count;
903 for (rel = relocs; rel < relend; rel++)
904 switch (ELF64_R_TYPE (rel->r_info))
905 {
906 case R_X86_64_GOT32:
907 case R_X86_64_GOTPCREL:
908 r_symndx = ELF64_R_SYM (rel->r_info);
909 if (r_symndx >= symtab_hdr->sh_info)
910 {
911 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
912 if (h->got.refcount > 0)
913 h->got.refcount -= 1;
914 }
915 else if (local_got_refcounts != NULL)
916 {
917 if (local_got_refcounts[r_symndx] > 0)
918 local_got_refcounts[r_symndx] -= 1;
919 }
920 break;
921
922 case R_X86_64_8:
923 case R_X86_64_16:
924 case R_X86_64_32:
925 case R_X86_64_64:
926 case R_X86_64_32S:
927 case R_X86_64_PC8:
928 case R_X86_64_PC16:
929 case R_X86_64_PC32:
930 r_symndx = ELF64_R_SYM (rel->r_info);
931 if (r_symndx >= symtab_hdr->sh_info)
932 {
933 struct elf64_x86_64_link_hash_entry *eh;
934 struct elf64_x86_64_dyn_relocs **pp;
935 struct elf64_x86_64_dyn_relocs *p;
936
937 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
938
939 if (!info->shared && h->plt.refcount > 0)
940 h->plt.refcount -= 1;
941
942 eh = (struct elf64_x86_64_link_hash_entry *) h;
943
944 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
945 if (p->sec == sec)
946 {
947 if (ELF64_R_TYPE (rel->r_info) == R_X86_64_PC8
948 || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC16
949 || ELF64_R_TYPE (rel->r_info) == R_X86_64_PC32)
950 p->pc_count -= 1;
951 p->count -= 1;
952 if (p->count == 0)
953 *pp = p->next;
954 break;
955 }
956 }
957 break;
958
959
960 case R_X86_64_PLT32:
961 r_symndx = ELF64_R_SYM (rel->r_info);
962 if (r_symndx >= symtab_hdr->sh_info)
963 {
964 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
965 if (h->plt.refcount > 0)
966 h->plt.refcount -= 1;
967 }
968 break;
969
970 default:
971 break;
972 }
973
974 return true;
975 }
976
977 /* Adjust a symbol defined by a dynamic object and referenced by a
978 regular object. The current definition is in some section of the
979 dynamic object, but we're not including those sections. We have to
980 change the definition to something the rest of the link can
981 understand. */
982
983 static boolean
984 elf64_x86_64_adjust_dynamic_symbol (info, h)
985 struct bfd_link_info *info;
986 struct elf_link_hash_entry *h;
987 {
988 struct elf64_x86_64_link_hash_table *htab;
989 struct elf64_x86_64_link_hash_entry * eh;
990 struct elf64_x86_64_dyn_relocs *p;
991 asection *s;
992 unsigned int power_of_two;
993
994 /* If this is a function, put it in the procedure linkage table. We
995 will fill in the contents of the procedure linkage table later,
996 when we know the address of the .got section. */
997 if (h->type == STT_FUNC
998 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
999 {
1000 if (h->plt.refcount <= 0
1001 || (! info->shared
1002 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1003 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1004 && h->root.type != bfd_link_hash_undefweak
1005 && h->root.type != bfd_link_hash_undefined))
1006 {
1007 /* This case can occur if we saw a PLT32 reloc in an input
1008 file, but the symbol was never referred to by a dynamic
1009 object, or if all references were garbage collected. In
1010 such a case, we don't actually need to build a procedure
1011 linkage table, and we can just do a PC32 reloc instead. */
1012 h->plt.offset = (bfd_vma) -1;
1013 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1014 }
1015
1016 return true;
1017 }
1018 else
1019 /* It's possible that we incorrectly decided a .plt reloc was
1020 needed for an R_X86_64_PC32 reloc to a non-function sym in
1021 check_relocs. We can't decide accurately between function and
1022 non-function syms in check-relocs; Objects loaded later in
1023 the link may change h->type. So fix it now. */
1024 h->plt.offset = (bfd_vma) -1;
1025
1026 /* If this is a weak symbol, and there is a real definition, the
1027 processor independent code will have arranged for us to see the
1028 real definition first, and we can just use the same value. */
1029 if (h->weakdef != NULL)
1030 {
1031 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1032 || h->weakdef->root.type == bfd_link_hash_defweak);
1033 h->root.u.def.section = h->weakdef->root.u.def.section;
1034 h->root.u.def.value = h->weakdef->root.u.def.value;
1035 return true;
1036 }
1037
1038 /* This is a reference to a symbol defined by a dynamic object which
1039 is not a function. */
1040
1041 /* If we are creating a shared library, we must presume that the
1042 only references to the symbol are via the global offset table.
1043 For such cases we need not do anything here; the relocations will
1044 be handled correctly by relocate_section. */
1045 if (info->shared)
1046 return true;
1047
1048 /* If there are no references to this symbol that do not use the
1049 GOT, we don't need to generate a copy reloc. */
1050 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1051 return true;
1052
1053 /* If -z nocopyreloc was given, we won't generate them either. */
1054 if (info->nocopyreloc)
1055 {
1056 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1057 return true;
1058 }
1059
1060 eh = (struct elf64_x86_64_link_hash_entry *) h;
1061 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1062 {
1063 s = p->sec->output_section;
1064 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1065 break;
1066 }
1067
1068 /* If we didn't find any dynamic relocs in read-only sections, then
1069 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1070 if (p == NULL)
1071 {
1072 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1073 return true;
1074 }
1075
1076 /* We must allocate the symbol in our .dynbss section, which will
1077 become part of the .bss section of the executable. There will be
1078 an entry for this symbol in the .dynsym section. The dynamic
1079 object will contain position independent code, so all references
1080 from the dynamic object to this symbol will go through the global
1081 offset table. The dynamic linker will use the .dynsym entry to
1082 determine the address it must put in the global offset table, so
1083 both the dynamic object and the regular object will refer to the
1084 same memory location for the variable. */
1085
1086 htab = elf64_x86_64_hash_table (info);
1087
1088 /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
1089 to copy the initial value out of the dynamic object and into the
1090 runtime process image. */
1091 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1092 {
1093 htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
1094 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1095 }
1096
1097 /* We need to figure out the alignment required for this symbol. I
1098 have no idea how ELF linkers handle this. 16-bytes is the size
1099 of the largest type that requires hard alignment -- long double. */
1100 /* FIXME: This is VERY ugly. Should be fixed for all architectures using
1101 this construct. */
1102 power_of_two = bfd_log2 (h->size);
1103 if (power_of_two > 4)
1104 power_of_two = 4;
1105
1106 /* Apply the required alignment. */
1107 s = htab->sdynbss;
1108 s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
1109 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1110 {
1111 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1112 return false;
1113 }
1114
1115 /* Define the symbol as being at this point in the section. */
1116 h->root.u.def.section = s;
1117 h->root.u.def.value = s->_raw_size;
1118
1119 /* Increment the section size to make room for the symbol. */
1120 s->_raw_size += h->size;
1121
1122 return true;
1123 }
1124
1125 /* This is the condition under which elf64_x86_64_finish_dynamic_symbol
1126 will be called from elflink.h. If elflink.h doesn't call our
1127 finish_dynamic_symbol routine, we'll need to do something about
1128 initializing any .plt and .got entries in elf64_x86_64_relocate_section. */
1129 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1130 ((DYN) \
1131 && ((INFO)->shared \
1132 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1133 && ((H)->dynindx != -1 \
1134 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1135
1136 /* Allocate space in .plt, .got and associated reloc sections for
1137 dynamic relocs. */
1138
1139 static boolean
1140 allocate_dynrelocs (h, inf)
1141 struct elf_link_hash_entry *h;
1142 PTR inf;
1143 {
1144 struct bfd_link_info *info;
1145 struct elf64_x86_64_link_hash_table *htab;
1146 struct elf64_x86_64_link_hash_entry *eh;
1147 struct elf64_x86_64_dyn_relocs *p;
1148
1149 if (h->root.type == bfd_link_hash_indirect)
1150 return true;
1151
1152 if (h->root.type == bfd_link_hash_warning)
1153 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1154
1155 info = (struct bfd_link_info *) inf;
1156 htab = elf64_x86_64_hash_table (info);
1157
1158 if (htab->elf.dynamic_sections_created
1159 && h->plt.refcount > 0)
1160 {
1161 /* Make sure this symbol is output as a dynamic symbol.
1162 Undefined weak syms won't yet be marked as dynamic. */
1163 if (h->dynindx == -1
1164 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1165 {
1166 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1167 return false;
1168 }
1169
1170 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1171 {
1172 asection *s = htab->splt;
1173
1174 /* If this is the first .plt entry, make room for the special
1175 first entry. */
1176 if (s->_raw_size == 0)
1177 s->_raw_size += PLT_ENTRY_SIZE;
1178
1179 h->plt.offset = s->_raw_size;
1180
1181 /* If this symbol is not defined in a regular file, and we are
1182 not generating a shared library, then set the symbol to this
1183 location in the .plt. This is required to make function
1184 pointers compare as equal between the normal executable and
1185 the shared library. */
1186 if (! info->shared
1187 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1188 {
1189 h->root.u.def.section = s;
1190 h->root.u.def.value = h->plt.offset;
1191 }
1192
1193 /* Make room for this entry. */
1194 s->_raw_size += PLT_ENTRY_SIZE;
1195
1196 /* We also need to make an entry in the .got.plt section, which
1197 will be placed in the .got section by the linker script. */
1198 htab->sgotplt->_raw_size += GOT_ENTRY_SIZE;
1199
1200 /* We also need to make an entry in the .rela.plt section. */
1201 htab->srelplt->_raw_size += sizeof (Elf64_External_Rela);
1202 }
1203 else
1204 {
1205 h->plt.offset = (bfd_vma) -1;
1206 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1207 }
1208 }
1209 else
1210 {
1211 h->plt.offset = (bfd_vma) -1;
1212 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1213 }
1214
1215 if (h->got.refcount > 0)
1216 {
1217 asection *s;
1218 boolean dyn;
1219
1220 /* Make sure this symbol is output as a dynamic symbol.
1221 Undefined weak syms won't yet be marked as dynamic. */
1222 if (h->dynindx == -1
1223 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1224 {
1225 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1226 return false;
1227 }
1228
1229 s = htab->sgot;
1230 h->got.offset = s->_raw_size;
1231 s->_raw_size += GOT_ENTRY_SIZE;
1232 dyn = htab->elf.dynamic_sections_created;
1233 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1234 htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
1235 }
1236 else
1237 h->got.offset = (bfd_vma) -1;
1238
1239 eh = (struct elf64_x86_64_link_hash_entry *) h;
1240 if (eh->dyn_relocs == NULL)
1241 return true;
1242
1243 /* In the shared -Bsymbolic case, discard space allocated for
1244 dynamic pc-relative relocs against symbols which turn out to be
1245 defined in regular objects. For the normal shared case, discard
1246 space for pc-relative relocs that have become local due to symbol
1247 visibility changes. */
1248
1249 if (info->shared)
1250 {
1251 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1252 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1253 || info->symbolic))
1254 {
1255 struct elf64_x86_64_dyn_relocs **pp;
1256
1257 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1258 {
1259 p->count -= p->pc_count;
1260 p->pc_count = 0;
1261 if (p->count == 0)
1262 *pp = p->next;
1263 else
1264 pp = &p->next;
1265 }
1266 }
1267 }
1268 else
1269 {
1270 /* For the non-shared case, discard space for relocs against
1271 symbols which turn out to need copy relocs or are not
1272 dynamic. */
1273
1274 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1275 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1276 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1277 || (htab->elf.dynamic_sections_created
1278 && (h->root.type == bfd_link_hash_undefweak
1279 || h->root.type == bfd_link_hash_undefined))))
1280 {
1281 /* Make sure this symbol is output as a dynamic symbol.
1282 Undefined weak syms won't yet be marked as dynamic. */
1283 if (h->dynindx == -1
1284 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1285 {
1286 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1287 return false;
1288 }
1289
1290 /* If that succeeded, we know we'll be keeping all the
1291 relocs. */
1292 if (h->dynindx != -1)
1293 goto keep;
1294 }
1295
1296 eh->dyn_relocs = NULL;
1297
1298 keep: ;
1299 }
1300
1301 /* Finally, allocate space. */
1302 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1303 {
1304 asection *sreloc = elf_section_data (p->sec)->sreloc;
1305 sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
1306 }
1307
1308 return true;
1309 }
1310
1311 /* Find any dynamic relocs that apply to read-only sections. */
1312
1313 static boolean
1314 readonly_dynrelocs (h, inf)
1315 struct elf_link_hash_entry *h;
1316 PTR inf;
1317 {
1318 struct elf64_x86_64_link_hash_entry *eh;
1319 struct elf64_x86_64_dyn_relocs *p;
1320
1321 if (h->root.type == bfd_link_hash_warning)
1322 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1323
1324 eh = (struct elf64_x86_64_link_hash_entry *) h;
1325 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1326 {
1327 asection *s = p->sec->output_section;
1328
1329 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1330 {
1331 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1332
1333 info->flags |= DF_TEXTREL;
1334
1335 /* Not an error, just cut short the traversal. */
1336 return false;
1337 }
1338 }
1339 return true;
1340 }
1341
1342 /* Set the sizes of the dynamic sections. */
1343
1344 static boolean
1345 elf64_x86_64_size_dynamic_sections (output_bfd, info)
1346 bfd *output_bfd ATTRIBUTE_UNUSED;
1347 struct bfd_link_info *info;
1348 {
1349 struct elf64_x86_64_link_hash_table *htab;
1350 bfd *dynobj;
1351 asection *s;
1352 boolean relocs;
1353 bfd *ibfd;
1354
1355 htab = elf64_x86_64_hash_table (info);
1356 dynobj = htab->elf.dynobj;
1357 if (dynobj == NULL)
1358 abort ();
1359
1360 if (htab->elf.dynamic_sections_created)
1361 {
1362 /* Set the contents of the .interp section to the interpreter. */
1363 if (! info->shared)
1364 {
1365 s = bfd_get_section_by_name (dynobj, ".interp");
1366 if (s == NULL)
1367 abort ();
1368 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1369 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1370 }
1371 }
1372
1373 /* Set up .got offsets for local syms, and space for local dynamic
1374 relocs. */
1375 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1376 {
1377 bfd_signed_vma *local_got;
1378 bfd_signed_vma *end_local_got;
1379 bfd_size_type locsymcount;
1380 Elf_Internal_Shdr *symtab_hdr;
1381 asection *srel;
1382
1383 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1384 continue;
1385
1386 for (s = ibfd->sections; s != NULL; s = s->next)
1387 {
1388 struct elf64_x86_64_dyn_relocs *p;
1389
1390 for (p = *((struct elf64_x86_64_dyn_relocs **)
1391 &elf_section_data (s)->local_dynrel);
1392 p != NULL;
1393 p = p->next)
1394 {
1395 if (!bfd_is_abs_section (p->sec)
1396 && bfd_is_abs_section (p->sec->output_section))
1397 {
1398 /* Input section has been discarded, either because
1399 it is a copy of a linkonce section or due to
1400 linker script /DISCARD/, so we'll be discarding
1401 the relocs too. */
1402 }
1403 else if (p->count != 0)
1404 {
1405 srel = elf_section_data (p->sec)->sreloc;
1406 srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
1407 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1408 info->flags |= DF_TEXTREL;
1409
1410 }
1411 }
1412 }
1413
1414 local_got = elf_local_got_refcounts (ibfd);
1415 if (!local_got)
1416 continue;
1417
1418 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1419 locsymcount = symtab_hdr->sh_info;
1420 end_local_got = local_got + locsymcount;
1421 s = htab->sgot;
1422 srel = htab->srelgot;
1423 for (; local_got < end_local_got; ++local_got)
1424 {
1425 if (*local_got > 0)
1426 {
1427 *local_got = s->_raw_size;
1428 s->_raw_size += GOT_ENTRY_SIZE;
1429 if (info->shared)
1430 srel->_raw_size += sizeof (Elf64_External_Rela);
1431 }
1432 else
1433 *local_got = (bfd_vma) -1;
1434 }
1435 }
1436
1437 /* Allocate global sym .plt and .got entries, and space for global
1438 sym dynamic relocs. */
1439 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1440
1441 /* We now have determined the sizes of the various dynamic sections.
1442 Allocate memory for them. */
1443 relocs = false;
1444 for (s = dynobj->sections; s != NULL; s = s->next)
1445 {
1446 if ((s->flags & SEC_LINKER_CREATED) == 0)
1447 continue;
1448
1449 if (s == htab->splt
1450 || s == htab->sgot
1451 || s == htab->sgotplt)
1452 {
1453 /* Strip this section if we don't need it; see the
1454 comment below. */
1455 }
1456 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
1457 {
1458 if (s->_raw_size != 0 && s != htab->srelplt)
1459 relocs = true;
1460
1461 /* We use the reloc_count field as a counter if we need
1462 to copy relocs into the output file. */
1463 s->reloc_count = 0;
1464 }
1465 else
1466 {
1467 /* It's not one of our sections, so don't allocate space. */
1468 continue;
1469 }
1470
1471 if (s->_raw_size == 0)
1472 {
1473 /* If we don't need this section, strip it from the
1474 output file. This is mostly to handle .rela.bss and
1475 .rela.plt. We must create both sections in
1476 create_dynamic_sections, because they must be created
1477 before the linker maps input sections to output
1478 sections. The linker does that before
1479 adjust_dynamic_symbol is called, and it is that
1480 function which decides whether anything needs to go
1481 into these sections. */
1482
1483 _bfd_strip_section_from_output (info, s);
1484 continue;
1485 }
1486
1487 /* Allocate memory for the section contents. We use bfd_zalloc
1488 here in case unused entries are not reclaimed before the
1489 section's contents are written out. This should not happen,
1490 but this way if it does, we get a R_X86_64_NONE reloc instead
1491 of garbage. */
1492 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1493 if (s->contents == NULL)
1494 return false;
1495 }
1496
1497 if (htab->elf.dynamic_sections_created)
1498 {
1499 /* Add some entries to the .dynamic section. We fill in the
1500 values later, in elf64_x86_64_finish_dynamic_sections, but we
1501 must add the entries now so that we get the correct size for
1502 the .dynamic section. The DT_DEBUG entry is filled in by the
1503 dynamic linker and used by the debugger. */
1504 #define add_dynamic_entry(TAG, VAL) \
1505 bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1506
1507 if (! info->shared)
1508 {
1509 if (!add_dynamic_entry (DT_DEBUG, 0))
1510 return false;
1511 }
1512
1513 if (htab->splt->_raw_size != 0)
1514 {
1515 if (!add_dynamic_entry (DT_PLTGOT, 0)
1516 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1517 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1518 || !add_dynamic_entry (DT_JMPREL, 0))
1519 return false;
1520 }
1521
1522 if (relocs)
1523 {
1524 if (!add_dynamic_entry (DT_RELA, 0)
1525 || !add_dynamic_entry (DT_RELASZ, 0)
1526 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1527 return false;
1528
1529 /* If any dynamic relocs apply to a read-only section,
1530 then we need a DT_TEXTREL entry. */
1531 if ((info->flags & DF_TEXTREL) == 0)
1532 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
1533 (PTR) info);
1534
1535 if ((info->flags & DF_TEXTREL) != 0)
1536 {
1537 if (!add_dynamic_entry (DT_TEXTREL, 0))
1538 return false;
1539 }
1540 }
1541 }
1542 #undef add_dynamic_entry
1543
1544 return true;
1545 }
1546
1547 /* Relocate an x86_64 ELF section. */
1548
1549 static boolean
1550 elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
1551 contents, relocs, local_syms, local_sections)
1552 bfd *output_bfd;
1553 struct bfd_link_info *info;
1554 bfd *input_bfd;
1555 asection *input_section;
1556 bfd_byte *contents;
1557 Elf_Internal_Rela *relocs;
1558 Elf_Internal_Sym *local_syms;
1559 asection **local_sections;
1560 {
1561 struct elf64_x86_64_link_hash_table *htab;
1562 Elf_Internal_Shdr *symtab_hdr;
1563 struct elf_link_hash_entry **sym_hashes;
1564 bfd_vma *local_got_offsets;
1565 Elf_Internal_Rela *rel;
1566 Elf_Internal_Rela *relend;
1567
1568 if (info->relocateable)
1569 return true;
1570
1571 htab = elf64_x86_64_hash_table (info);
1572 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1573 sym_hashes = elf_sym_hashes (input_bfd);
1574 local_got_offsets = elf_local_got_offsets (input_bfd);
1575
1576 rel = relocs;
1577 relend = relocs + input_section->reloc_count;
1578 for (; rel < relend; rel++)
1579 {
1580 int r_type;
1581 reloc_howto_type *howto;
1582 unsigned long r_symndx;
1583 struct elf_link_hash_entry *h;
1584 Elf_Internal_Sym *sym;
1585 asection *sec;
1586 bfd_vma off;
1587 bfd_vma relocation;
1588 boolean unresolved_reloc;
1589 bfd_reloc_status_type r;
1590
1591 r_type = ELF64_R_TYPE (rel->r_info);
1592 if (r_type == (int) R_X86_64_GNU_VTINHERIT
1593 || r_type == (int) R_X86_64_GNU_VTENTRY)
1594 continue;
1595
1596 if (r_type < 0 || r_type >= R_X86_64_max)
1597 {
1598 bfd_set_error (bfd_error_bad_value);
1599 return false;
1600 }
1601
1602 howto = x86_64_elf_howto_table + r_type;
1603 r_symndx = ELF64_R_SYM (rel->r_info);
1604 h = NULL;
1605 sym = NULL;
1606 sec = NULL;
1607 unresolved_reloc = false;
1608 if (r_symndx < symtab_hdr->sh_info)
1609 {
1610 sym = local_syms + r_symndx;
1611 sec = local_sections[r_symndx];
1612
1613 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
1614 }
1615 else
1616 {
1617 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1618 while (h->root.type == bfd_link_hash_indirect
1619 || h->root.type == bfd_link_hash_warning)
1620 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1621
1622 if (h->root.type == bfd_link_hash_defined
1623 || h->root.type == bfd_link_hash_defweak)
1624 {
1625 sec = h->root.u.def.section;
1626 if (sec->output_section == NULL)
1627 {
1628 /* Set a flag that will be cleared later if we find a
1629 relocation value for this symbol. output_section
1630 is typically NULL for symbols satisfied by a shared
1631 library. */
1632 unresolved_reloc = true;
1633 relocation = 0;
1634 }
1635 else
1636 relocation = (h->root.u.def.value
1637 + sec->output_section->vma
1638 + sec->output_offset);
1639 }
1640 else if (h->root.type == bfd_link_hash_undefweak)
1641 relocation = 0;
1642 else if (info->shared
1643 && (!info->symbolic || info->allow_shlib_undefined)
1644 && !info->no_undefined
1645 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1646 relocation = 0;
1647 else
1648 {
1649 if (! ((*info->callbacks->undefined_symbol)
1650 (info, h->root.root.string, input_bfd,
1651 input_section, rel->r_offset,
1652 (!info->shared || info->no_undefined
1653 || ELF_ST_VISIBILITY (h->other)))))
1654 return false;
1655 relocation = 0;
1656 }
1657 }
1658 /* When generating a shared object, the relocations handled here are
1659 copied into the output file to be resolved at run time. */
1660 switch (r_type)
1661 {
1662 case R_X86_64_GOT32:
1663 /* Relocation is to the entry for this symbol in the global
1664 offset table. */
1665 case R_X86_64_GOTPCREL:
1666 /* Use global offset table as symbol value. */
1667 if (htab->sgot == NULL)
1668 abort ();
1669
1670 if (h != NULL)
1671 {
1672 boolean dyn;
1673
1674 off = h->got.offset;
1675 dyn = htab->elf.dynamic_sections_created;
1676
1677 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
1678 || (info->shared
1679 && (info->symbolic
1680 || h->dynindx == -1
1681 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
1682 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1683 {
1684 /* This is actually a static link, or it is a -Bsymbolic
1685 link and the symbol is defined locally, or the symbol
1686 was forced to be local because of a version file. We
1687 must initialize this entry in the global offset table.
1688 Since the offset must always be a multiple of 8, we
1689 use the least significant bit to record whether we
1690 have initialized it already.
1691
1692 When doing a dynamic link, we create a .rela.got
1693 relocation entry to initialize the value. This is
1694 done in the finish_dynamic_symbol routine. */
1695 if ((off & 1) != 0)
1696 off &= ~1;
1697 else
1698 {
1699 bfd_put_64 (output_bfd, relocation,
1700 htab->sgot->contents + off);
1701 h->got.offset |= 1;
1702 }
1703 }
1704 else
1705 unresolved_reloc = false;
1706 }
1707 else
1708 {
1709 if (local_got_offsets == NULL)
1710 abort ();
1711
1712 off = local_got_offsets[r_symndx];
1713
1714 /* The offset must always be a multiple of 8. We use
1715 the least significant bit to record whether we have
1716 already generated the necessary reloc. */
1717 if ((off & 1) != 0)
1718 off &= ~1;
1719 else
1720 {
1721 bfd_put_64 (output_bfd, relocation,
1722 htab->sgot->contents + off);
1723
1724 if (info->shared)
1725 {
1726 asection *srelgot;
1727 Elf_Internal_Rela outrel;
1728 Elf64_External_Rela *loc;
1729
1730 /* We need to generate a R_X86_64_RELATIVE reloc
1731 for the dynamic linker. */
1732 srelgot = htab->srelgot;
1733 if (srelgot == NULL)
1734 abort ();
1735
1736 outrel.r_offset = (htab->sgot->output_section->vma
1737 + htab->sgot->output_offset
1738 + off);
1739 outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
1740 outrel.r_addend = relocation;
1741 loc = (Elf64_External_Rela *) srelgot->contents;
1742 loc += srelgot->reloc_count++;
1743 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1744 }
1745
1746 local_got_offsets[r_symndx] |= 1;
1747 }
1748 }
1749
1750 if (off >= (bfd_vma) -2)
1751 abort ();
1752
1753 relocation = htab->sgot->output_offset + off;
1754 if (r_type == R_X86_64_GOTPCREL)
1755 relocation += htab->sgot->output_section->vma;
1756
1757 break;
1758
1759 case R_X86_64_PLT32:
1760 /* Relocation is to the entry for this symbol in the
1761 procedure linkage table. */
1762
1763 /* Resolve a PLT32 reloc against a local symbol directly,
1764 without using the procedure linkage table. */
1765 if (h == NULL)
1766 break;
1767
1768 if (h->plt.offset == (bfd_vma) -1
1769 || htab->splt == NULL)
1770 {
1771 /* We didn't make a PLT entry for this symbol. This
1772 happens when statically linking PIC code, or when
1773 using -Bsymbolic. */
1774 break;
1775 }
1776
1777 relocation = (htab->splt->output_section->vma
1778 + htab->splt->output_offset
1779 + h->plt.offset);
1780 unresolved_reloc = false;
1781 break;
1782
1783 case R_X86_64_PC8:
1784 case R_X86_64_PC16:
1785 case R_X86_64_PC32:
1786 case R_X86_64_8:
1787 case R_X86_64_16:
1788 case R_X86_64_32:
1789 case R_X86_64_64:
1790 /* FIXME: The ABI says the linker should make sure the value is
1791 the same when it's zeroextended to 64 bit. */
1792
1793 /* r_symndx will be zero only for relocs against symbols
1794 from removed linkonce sections, or sections discarded by
1795 a linker script. */
1796 if (r_symndx == 0
1797 || (input_section->flags & SEC_ALLOC) == 0)
1798 break;
1799
1800 if ((info->shared
1801 && ((r_type != R_X86_64_PC8
1802 && r_type != R_X86_64_PC16
1803 && r_type != R_X86_64_PC32)
1804 || (h != NULL
1805 && h->dynindx != -1
1806 && (! info->symbolic
1807 || (h->elf_link_hash_flags
1808 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1809 || (!info->shared
1810 && h != NULL
1811 && h->dynindx != -1
1812 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1813 && (((h->elf_link_hash_flags
1814 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1815 && (h->elf_link_hash_flags
1816 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1817 || h->root.type == bfd_link_hash_undefweak
1818 || h->root.type == bfd_link_hash_undefined)))
1819 {
1820 Elf_Internal_Rela outrel;
1821 boolean skip, relocate;
1822 asection *sreloc;
1823 Elf64_External_Rela *loc;
1824
1825 /* When generating a shared object, these relocations
1826 are copied into the output file to be resolved at run
1827 time. */
1828
1829 skip = false;
1830 relocate = false;
1831
1832 outrel.r_offset =
1833 _bfd_elf_section_offset (output_bfd, info, input_section,
1834 rel->r_offset);
1835 if (outrel.r_offset == (bfd_vma) -1)
1836 skip = true;
1837 else if (outrel.r_offset == (bfd_vma) -2)
1838 skip = true, relocate = true;
1839
1840 outrel.r_offset += (input_section->output_section->vma
1841 + input_section->output_offset);
1842
1843 if (skip)
1844 memset (&outrel, 0, sizeof outrel);
1845
1846 /* h->dynindx may be -1 if this symbol was marked to
1847 become local. */
1848 else if (h != NULL
1849 && h->dynindx != -1
1850 && (r_type == R_X86_64_PC8
1851 || r_type == R_X86_64_PC16
1852 || r_type == R_X86_64_PC32
1853 || !info->shared
1854 || !info->symbolic
1855 || (h->elf_link_hash_flags
1856 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1857 {
1858 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
1859 outrel.r_addend = rel->r_addend;
1860 }
1861 else
1862 {
1863 /* This symbol is local, or marked to become local. */
1864 relocate = true;
1865 outrel.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
1866 outrel.r_addend = relocation + rel->r_addend;
1867 }
1868
1869 sreloc = elf_section_data (input_section)->sreloc;
1870 if (sreloc == NULL)
1871 abort ();
1872
1873 loc = (Elf64_External_Rela *) sreloc->contents;
1874 loc += sreloc->reloc_count++;
1875 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1876
1877 /* If this reloc is against an external symbol, we do
1878 not want to fiddle with the addend. Otherwise, we
1879 need to include the symbol value so that it becomes
1880 an addend for the dynamic reloc. */
1881 if (! relocate)
1882 continue;
1883 }
1884
1885 break;
1886
1887 default:
1888 break;
1889 }
1890
1891 /* FIXME: Why do we allow debugging sections to escape this error?
1892 More importantly, why do we not emit dynamic relocs for
1893 R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
1894 If we had emitted the dynamic reloc, we could remove the
1895 fudge here. */
1896 if (unresolved_reloc
1897 && !(info->shared
1898 && (input_section->flags & SEC_DEBUGGING) != 0
1899 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
1900 (*_bfd_error_handler)
1901 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
1902 bfd_archive_filename (input_bfd),
1903 bfd_get_section_name (input_bfd, input_section),
1904 (long) rel->r_offset,
1905 h->root.root.string);
1906
1907 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1908 contents, rel->r_offset,
1909 relocation, rel->r_addend);
1910
1911 if (r != bfd_reloc_ok)
1912 {
1913 const char *name;
1914
1915 if (h != NULL)
1916 name = h->root.root.string;
1917 else
1918 {
1919 name = bfd_elf_string_from_elf_section (input_bfd,
1920 symtab_hdr->sh_link,
1921 sym->st_name);
1922 if (name == NULL)
1923 return false;
1924 if (*name == '\0')
1925 name = bfd_section_name (input_bfd, sec);
1926 }
1927
1928 if (r == bfd_reloc_overflow)
1929 {
1930
1931 if (! ((*info->callbacks->reloc_overflow)
1932 (info, name, howto->name, (bfd_vma) 0,
1933 input_bfd, input_section, rel->r_offset)))
1934 return false;
1935 }
1936 else
1937 {
1938 (*_bfd_error_handler)
1939 (_("%s(%s+0x%lx): reloc against `%s': error %d"),
1940 bfd_archive_filename (input_bfd),
1941 bfd_get_section_name (input_bfd, input_section),
1942 (long) rel->r_offset, name, (int) r);
1943 return false;
1944 }
1945 }
1946 }
1947
1948 return true;
1949 }
1950
1951 /* Finish up dynamic symbol handling. We set the contents of various
1952 dynamic sections here. */
1953
1954 static boolean
1955 elf64_x86_64_finish_dynamic_symbol (output_bfd, info, h, sym)
1956 bfd *output_bfd;
1957 struct bfd_link_info *info;
1958 struct elf_link_hash_entry *h;
1959 Elf_Internal_Sym *sym;
1960 {
1961 struct elf64_x86_64_link_hash_table *htab;
1962
1963 htab = elf64_x86_64_hash_table (info);
1964
1965 if (h->plt.offset != (bfd_vma) -1)
1966 {
1967 bfd_vma plt_index;
1968 bfd_vma got_offset;
1969 Elf_Internal_Rela rela;
1970 Elf64_External_Rela *loc;
1971
1972 /* This symbol has an entry in the procedure linkage table. Set
1973 it up. */
1974
1975 if (h->dynindx == -1
1976 || htab->splt == NULL
1977 || htab->sgotplt == NULL
1978 || htab->srelplt == NULL)
1979 abort ();
1980
1981 /* Get the index in the procedure linkage table which
1982 corresponds to this symbol. This is the index of this symbol
1983 in all the symbols for which we are making plt entries. The
1984 first entry in the procedure linkage table is reserved. */
1985 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1986
1987 /* Get the offset into the .got table of the entry that
1988 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
1989 bytes. The first three are reserved for the dynamic linker. */
1990 got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
1991
1992 /* Fill in the entry in the procedure linkage table. */
1993 memcpy (htab->splt->contents + h->plt.offset, elf64_x86_64_plt_entry,
1994 PLT_ENTRY_SIZE);
1995
1996 /* Insert the relocation positions of the plt section. The magic
1997 numbers at the end of the statements are the positions of the
1998 relocations in the plt section. */
1999 /* Put offset for jmp *name@GOTPCREL(%rip), since the
2000 instruction uses 6 bytes, subtract this value. */
2001 bfd_put_32 (output_bfd,
2002 (htab->sgotplt->output_section->vma
2003 + htab->sgotplt->output_offset
2004 + got_offset
2005 - htab->splt->output_section->vma
2006 - htab->splt->output_offset
2007 - h->plt.offset
2008 - 6),
2009 htab->splt->contents + h->plt.offset + 2);
2010 /* Put relocation index. */
2011 bfd_put_32 (output_bfd, plt_index,
2012 htab->splt->contents + h->plt.offset + 7);
2013 /* Put offset for jmp .PLT0. */
2014 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
2015 htab->splt->contents + h->plt.offset + 12);
2016
2017 /* Fill in the entry in the global offset table, initially this
2018 points to the pushq instruction in the PLT which is at offset 6. */
2019 bfd_put_64 (output_bfd, (htab->splt->output_section->vma
2020 + htab->splt->output_offset
2021 + h->plt.offset + 6),
2022 htab->sgotplt->contents + got_offset);
2023
2024 /* Fill in the entry in the .rela.plt section. */
2025 rela.r_offset = (htab->sgotplt->output_section->vma
2026 + htab->sgotplt->output_offset
2027 + got_offset);
2028 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_JUMP_SLOT);
2029 rela.r_addend = 0;
2030 loc = (Elf64_External_Rela *) htab->srelplt->contents + plt_index;
2031 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2032
2033 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2034 {
2035 /* Mark the symbol as undefined, rather than as defined in
2036 the .plt section. Leave the value alone. This is a clue
2037 for the dynamic linker, to make function pointer
2038 comparisons work between an application and shared
2039 library. */
2040 sym->st_shndx = SHN_UNDEF;
2041 }
2042 }
2043
2044 if (h->got.offset != (bfd_vma) -1)
2045 {
2046 Elf_Internal_Rela rela;
2047 Elf64_External_Rela *loc;
2048
2049 /* This symbol has an entry in the global offset table. Set it
2050 up. */
2051
2052 if (htab->sgot == NULL || htab->srelgot == NULL)
2053 abort ();
2054
2055 rela.r_offset = (htab->sgot->output_section->vma
2056 + htab->sgot->output_offset
2057 + (h->got.offset &~ (bfd_vma) 1));
2058
2059 /* If this is a static link, or it is a -Bsymbolic link and the
2060 symbol is defined locally or was forced to be local because
2061 of a version file, we just want to emit a RELATIVE reloc.
2062 The entry in the global offset table will already have been
2063 initialized in the relocate_section function. */
2064 if (info->shared
2065 && (info->symbolic
2066 || h->dynindx == -1
2067 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2068 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2069 {
2070 BFD_ASSERT((h->got.offset & 1) != 0);
2071 rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
2072 rela.r_addend = (h->root.u.def.value
2073 + h->root.u.def.section->output_section->vma
2074 + h->root.u.def.section->output_offset);
2075 }
2076 else
2077 {
2078 BFD_ASSERT((h->got.offset & 1) == 0);
2079 bfd_put_64 (output_bfd, (bfd_vma) 0,
2080 htab->sgot->contents + h->got.offset);
2081 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_GLOB_DAT);
2082 rela.r_addend = 0;
2083 }
2084
2085 loc = (Elf64_External_Rela *) htab->srelgot->contents;
2086 loc += htab->srelgot->reloc_count++;
2087 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2088 }
2089
2090 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2091 {
2092 Elf_Internal_Rela rela;
2093 Elf64_External_Rela *loc;
2094
2095 /* This symbol needs a copy reloc. Set it up. */
2096
2097 if (h->dynindx == -1
2098 || (h->root.type != bfd_link_hash_defined
2099 && h->root.type != bfd_link_hash_defweak)
2100 || htab->srelbss == NULL)
2101 abort ();
2102
2103 rela.r_offset = (h->root.u.def.value
2104 + h->root.u.def.section->output_section->vma
2105 + h->root.u.def.section->output_offset);
2106 rela.r_info = ELF64_R_INFO (h->dynindx, R_X86_64_COPY);
2107 rela.r_addend = 0;
2108 loc = (Elf64_External_Rela *) htab->srelbss->contents;
2109 loc += htab->srelbss->reloc_count++;
2110 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2111 }
2112
2113 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2114 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2115 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2116 sym->st_shndx = SHN_ABS;
2117
2118 return true;
2119 }
2120
2121 /* Used to decide how to sort relocs in an optimal manner for the
2122 dynamic linker, before writing them out. */
2123
2124 static enum elf_reloc_type_class
2125 elf64_x86_64_reloc_type_class (rela)
2126 const Elf_Internal_Rela *rela;
2127 {
2128 switch ((int) ELF64_R_TYPE (rela->r_info))
2129 {
2130 case R_X86_64_RELATIVE:
2131 return reloc_class_relative;
2132 case R_X86_64_JUMP_SLOT:
2133 return reloc_class_plt;
2134 case R_X86_64_COPY:
2135 return reloc_class_copy;
2136 default:
2137 return reloc_class_normal;
2138 }
2139 }
2140
2141 /* Finish up the dynamic sections. */
2142
2143 static boolean
2144 elf64_x86_64_finish_dynamic_sections (output_bfd, info)
2145 bfd *output_bfd;
2146 struct bfd_link_info *info;
2147 {
2148 struct elf64_x86_64_link_hash_table *htab;
2149 bfd *dynobj;
2150 asection *sdyn;
2151
2152 htab = elf64_x86_64_hash_table (info);
2153 dynobj = htab->elf.dynobj;
2154 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2155
2156 if (htab->elf.dynamic_sections_created)
2157 {
2158 Elf64_External_Dyn *dyncon, *dynconend;
2159
2160 if (sdyn == NULL || htab->sgot == NULL)
2161 abort ();
2162
2163 dyncon = (Elf64_External_Dyn *) sdyn->contents;
2164 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2165 for (; dyncon < dynconend; dyncon++)
2166 {
2167 Elf_Internal_Dyn dyn;
2168 asection *s;
2169
2170 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2171
2172 switch (dyn.d_tag)
2173 {
2174 default:
2175 continue;
2176
2177 case DT_PLTGOT:
2178 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2179 break;
2180
2181 case DT_JMPREL:
2182 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
2183 break;
2184
2185 case DT_PLTRELSZ:
2186 s = htab->srelplt->output_section;
2187 if (s->_cooked_size != 0)
2188 dyn.d_un.d_val = s->_cooked_size;
2189 else
2190 dyn.d_un.d_val = s->_raw_size;
2191 break;
2192
2193 case DT_RELASZ:
2194 /* The procedure linkage table relocs (DT_JMPREL) should
2195 not be included in the overall relocs (DT_RELA).
2196 Therefore, we override the DT_RELASZ entry here to
2197 make it not include the JMPREL relocs. Since the
2198 linker script arranges for .rela.plt to follow all
2199 other relocation sections, we don't have to worry
2200 about changing the DT_RELA entry. */
2201 if (htab->srelplt != NULL)
2202 {
2203 s = htab->srelplt->output_section;
2204 if (s->_cooked_size != 0)
2205 dyn.d_un.d_val -= s->_cooked_size;
2206 else
2207 dyn.d_un.d_val -= s->_raw_size;
2208 }
2209 break;
2210 }
2211
2212 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2213 }
2214
2215 /* Fill in the special first entry in the procedure linkage table. */
2216 if (htab->splt && htab->splt->_raw_size > 0)
2217 {
2218 /* Fill in the first entry in the procedure linkage table. */
2219 memcpy (htab->splt->contents, elf64_x86_64_plt0_entry,
2220 PLT_ENTRY_SIZE);
2221 /* Add offset for pushq GOT+8(%rip), since the instruction
2222 uses 6 bytes subtract this value. */
2223 bfd_put_32 (output_bfd,
2224 (htab->sgotplt->output_section->vma
2225 + htab->sgotplt->output_offset
2226 + 8
2227 - htab->splt->output_section->vma
2228 - htab->splt->output_offset
2229 - 6),
2230 htab->splt->contents + 2);
2231 /* Add offset for jmp *GOT+16(%rip). The 12 is the offset to
2232 the end of the instruction. */
2233 bfd_put_32 (output_bfd,
2234 (htab->sgotplt->output_section->vma
2235 + htab->sgotplt->output_offset
2236 + 16
2237 - htab->splt->output_section->vma
2238 - htab->splt->output_offset
2239 - 12),
2240 htab->splt->contents + 8);
2241
2242 elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize =
2243 PLT_ENTRY_SIZE;
2244 }
2245 }
2246
2247 if (htab->sgotplt)
2248 {
2249 /* Fill in the first three entries in the global offset table. */
2250 if (htab->sgotplt->_raw_size > 0)
2251 {
2252 /* Set the first entry in the global offset table to the address of
2253 the dynamic section. */
2254 if (sdyn == NULL)
2255 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents);
2256 else
2257 bfd_put_64 (output_bfd,
2258 sdyn->output_section->vma + sdyn->output_offset,
2259 htab->sgotplt->contents);
2260 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
2261 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE);
2262 bfd_put_64 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + GOT_ENTRY_SIZE*2);
2263 }
2264
2265 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize =
2266 GOT_ENTRY_SIZE;
2267 }
2268
2269 return true;
2270 }
2271
2272
2273 #define TARGET_LITTLE_SYM bfd_elf64_x86_64_vec
2274 #define TARGET_LITTLE_NAME "elf64-x86-64"
2275 #define ELF_ARCH bfd_arch_i386
2276 #define ELF_MACHINE_CODE EM_X86_64
2277 #define ELF_MAXPAGESIZE 0x100000
2278
2279 #define elf_backend_can_gc_sections 1
2280 #define elf_backend_can_refcount 1
2281 #define elf_backend_want_got_plt 1
2282 #define elf_backend_plt_readonly 1
2283 #define elf_backend_want_plt_sym 0
2284 #define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
2285 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
2286 #define elf_backend_rela_normal 1
2287
2288 #define elf_info_to_howto elf64_x86_64_info_to_howto
2289
2290 #define bfd_elf64_bfd_link_hash_table_create \
2291 elf64_x86_64_link_hash_table_create
2292 #define bfd_elf64_bfd_reloc_type_lookup elf64_x86_64_reloc_type_lookup
2293
2294 #define elf_backend_adjust_dynamic_symbol elf64_x86_64_adjust_dynamic_symbol
2295 #define elf_backend_check_relocs elf64_x86_64_check_relocs
2296 #define elf_backend_copy_indirect_symbol elf64_x86_64_copy_indirect_symbol
2297 #define elf_backend_create_dynamic_sections elf64_x86_64_create_dynamic_sections
2298 #define elf_backend_finish_dynamic_sections elf64_x86_64_finish_dynamic_sections
2299 #define elf_backend_finish_dynamic_symbol elf64_x86_64_finish_dynamic_symbol
2300 #define elf_backend_gc_mark_hook elf64_x86_64_gc_mark_hook
2301 #define elf_backend_gc_sweep_hook elf64_x86_64_gc_sweep_hook
2302 #define elf_backend_grok_prstatus elf64_x86_64_grok_prstatus
2303 #define elf_backend_grok_psinfo elf64_x86_64_grok_psinfo
2304 #define elf_backend_reloc_type_class elf64_x86_64_reloc_type_class
2305 #define elf_backend_relocate_section elf64_x86_64_relocate_section
2306 #define elf_backend_size_dynamic_sections elf64_x86_64_size_dynamic_sections
2307 #define elf_backend_object_p elf64_x86_64_elf_object_p
2308
2309 #include "elf64-target.h"
This page took 0.078271 seconds and 4 git commands to generate.