* linker.c (bfd_link_hash_traverse): Follow warning symbol link.
[deliverable/binutils-gdb.git] / bfd / elf64-hppa.c
1 /* Support for HPPA 64-bit ELF
2 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011 Free Software Foundation, Inc.
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 #include "alloca-conf.h"
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/hppa.h"
28 #include "libhppa.h"
29 #include "elf64-hppa.h"
30
31
32 #define ARCH_SIZE 64
33
34 #define PLT_ENTRY_SIZE 0x10
35 #define DLT_ENTRY_SIZE 0x8
36 #define OPD_ENTRY_SIZE 0x20
37
38 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
39
40 /* The stub is supposed to load the target address and target's DP
41 value out of the PLT, then do an external branch to the target
42 address.
43
44 LDD PLTOFF(%r27),%r1
45 BVE (%r1)
46 LDD PLTOFF+8(%r27),%r27
47
48 Note that we must use the LDD with a 14 bit displacement, not the one
49 with a 5 bit displacement. */
50 static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
51 0x53, 0x7b, 0x00, 0x00 };
52
53 struct elf64_hppa_link_hash_entry
54 {
55 struct elf_link_hash_entry eh;
56
57 /* Offsets for this symbol in various linker sections. */
58 bfd_vma dlt_offset;
59 bfd_vma plt_offset;
60 bfd_vma opd_offset;
61 bfd_vma stub_offset;
62
63 /* The index of the (possibly local) symbol in the input bfd and its
64 associated BFD. Needed so that we can have relocs against local
65 symbols in shared libraries. */
66 long sym_indx;
67 bfd *owner;
68
69 /* Dynamic symbols may need to have two different values. One for
70 the dynamic symbol table, one for the normal symbol table.
71
72 In such cases we store the symbol's real value and section
73 index here so we can restore the real value before we write
74 the normal symbol table. */
75 bfd_vma st_value;
76 int st_shndx;
77
78 /* Used to count non-got, non-plt relocations for delayed sizing
79 of relocation sections. */
80 struct elf64_hppa_dyn_reloc_entry
81 {
82 /* Next relocation in the chain. */
83 struct elf64_hppa_dyn_reloc_entry *next;
84
85 /* The type of the relocation. */
86 int type;
87
88 /* The input section of the relocation. */
89 asection *sec;
90
91 /* Number of relocs copied in this section. */
92 bfd_size_type count;
93
94 /* The index of the section symbol for the input section of
95 the relocation. Only needed when building shared libraries. */
96 int sec_symndx;
97
98 /* The offset within the input section of the relocation. */
99 bfd_vma offset;
100
101 /* The addend for the relocation. */
102 bfd_vma addend;
103
104 } *reloc_entries;
105
106 /* Nonzero if this symbol needs an entry in one of the linker
107 sections. */
108 unsigned want_dlt;
109 unsigned want_plt;
110 unsigned want_opd;
111 unsigned want_stub;
112 };
113
114 struct elf64_hppa_link_hash_table
115 {
116 struct elf_link_hash_table root;
117
118 /* Shortcuts to get to the various linker defined sections. */
119 asection *dlt_sec;
120 asection *dlt_rel_sec;
121 asection *plt_sec;
122 asection *plt_rel_sec;
123 asection *opd_sec;
124 asection *opd_rel_sec;
125 asection *other_rel_sec;
126
127 /* Offset of __gp within .plt section. When the PLT gets large we want
128 to slide __gp into the PLT section so that we can continue to use
129 single DP relative instructions to load values out of the PLT. */
130 bfd_vma gp_offset;
131
132 /* Note this is not strictly correct. We should create a stub section for
133 each input section with calls. The stub section should be placed before
134 the section with the call. */
135 asection *stub_sec;
136
137 bfd_vma text_segment_base;
138 bfd_vma data_segment_base;
139
140 /* We build tables to map from an input section back to its
141 symbol index. This is the BFD for which we currently have
142 a map. */
143 bfd *section_syms_bfd;
144
145 /* Array of symbol numbers for each input section attached to the
146 current BFD. */
147 int *section_syms;
148 };
149
150 #define hppa_link_hash_table(p) \
151 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
152 == HPPA64_ELF_DATA ? ((struct elf64_hppa_link_hash_table *) ((p)->hash)) : NULL)
153
154 #define hppa_elf_hash_entry(ent) \
155 ((struct elf64_hppa_link_hash_entry *)(ent))
156
157 #define eh_name(eh) \
158 (eh ? eh->root.root.string : "<undef>")
159
160 typedef struct bfd_hash_entry *(*new_hash_entry_func)
161 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
162
163 static struct bfd_link_hash_table *elf64_hppa_hash_table_create
164 (bfd *abfd);
165
166 /* This must follow the definitions of the various derived linker
167 hash tables and shared functions. */
168 #include "elf-hppa.h"
169
170 static bfd_boolean elf64_hppa_object_p
171 (bfd *);
172
173 static void elf64_hppa_post_process_headers
174 (bfd *, struct bfd_link_info *);
175
176 static bfd_boolean elf64_hppa_create_dynamic_sections
177 (bfd *, struct bfd_link_info *);
178
179 static bfd_boolean elf64_hppa_adjust_dynamic_symbol
180 (struct bfd_link_info *, struct elf_link_hash_entry *);
181
182 static bfd_boolean elf64_hppa_mark_milli_and_exported_functions
183 (struct elf_link_hash_entry *, void *);
184
185 static bfd_boolean elf64_hppa_size_dynamic_sections
186 (bfd *, struct bfd_link_info *);
187
188 static int elf64_hppa_link_output_symbol_hook
189 (struct bfd_link_info *, const char *, Elf_Internal_Sym *,
190 asection *, struct elf_link_hash_entry *);
191
192 static bfd_boolean elf64_hppa_finish_dynamic_symbol
193 (bfd *, struct bfd_link_info *,
194 struct elf_link_hash_entry *, Elf_Internal_Sym *);
195
196 static enum elf_reloc_type_class elf64_hppa_reloc_type_class
197 (const Elf_Internal_Rela *);
198
199 static bfd_boolean elf64_hppa_finish_dynamic_sections
200 (bfd *, struct bfd_link_info *);
201
202 static bfd_boolean elf64_hppa_check_relocs
203 (bfd *, struct bfd_link_info *,
204 asection *, const Elf_Internal_Rela *);
205
206 static bfd_boolean elf64_hppa_dynamic_symbol_p
207 (struct elf_link_hash_entry *, struct bfd_link_info *);
208
209 static bfd_boolean elf64_hppa_mark_exported_functions
210 (struct elf_link_hash_entry *, void *);
211
212 static bfd_boolean elf64_hppa_finalize_opd
213 (struct elf_link_hash_entry *, void *);
214
215 static bfd_boolean elf64_hppa_finalize_dlt
216 (struct elf_link_hash_entry *, void *);
217
218 static bfd_boolean allocate_global_data_dlt
219 (struct elf_link_hash_entry *, void *);
220
221 static bfd_boolean allocate_global_data_plt
222 (struct elf_link_hash_entry *, void *);
223
224 static bfd_boolean allocate_global_data_stub
225 (struct elf_link_hash_entry *, void *);
226
227 static bfd_boolean allocate_global_data_opd
228 (struct elf_link_hash_entry *, void *);
229
230 static bfd_boolean get_reloc_section
231 (bfd *, struct elf64_hppa_link_hash_table *, asection *);
232
233 static bfd_boolean count_dyn_reloc
234 (bfd *, struct elf64_hppa_link_hash_entry *,
235 int, asection *, int, bfd_vma, bfd_vma);
236
237 static bfd_boolean allocate_dynrel_entries
238 (struct elf_link_hash_entry *, void *);
239
240 static bfd_boolean elf64_hppa_finalize_dynreloc
241 (struct elf_link_hash_entry *, void *);
242
243 static bfd_boolean get_opd
244 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
245
246 static bfd_boolean get_plt
247 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
248
249 static bfd_boolean get_dlt
250 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
251
252 static bfd_boolean get_stub
253 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
254
255 static int elf64_hppa_elf_get_symbol_type
256 (Elf_Internal_Sym *, int);
257
258 /* Initialize an entry in the link hash table. */
259
260 static struct bfd_hash_entry *
261 hppa64_link_hash_newfunc (struct bfd_hash_entry *entry,
262 struct bfd_hash_table *table,
263 const char *string)
264 {
265 /* Allocate the structure if it has not already been allocated by a
266 subclass. */
267 if (entry == NULL)
268 {
269 entry = bfd_hash_allocate (table,
270 sizeof (struct elf64_hppa_link_hash_entry));
271 if (entry == NULL)
272 return entry;
273 }
274
275 /* Call the allocation method of the superclass. */
276 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
277 if (entry != NULL)
278 {
279 struct elf64_hppa_link_hash_entry *hh;
280
281 /* Initialize our local data. All zeros. */
282 hh = hppa_elf_hash_entry (entry);
283 memset (&hh->dlt_offset, 0,
284 (sizeof (struct elf64_hppa_link_hash_entry)
285 - offsetof (struct elf64_hppa_link_hash_entry, dlt_offset)));
286 }
287
288 return entry;
289 }
290
291 /* Create the derived linker hash table. The PA64 ELF port uses this
292 derived hash table to keep information specific to the PA ElF
293 linker (without using static variables). */
294
295 static struct bfd_link_hash_table*
296 elf64_hppa_hash_table_create (bfd *abfd)
297 {
298 struct elf64_hppa_link_hash_table *htab;
299 bfd_size_type amt = sizeof (*htab);
300
301 htab = bfd_zalloc (abfd, amt);
302 if (htab == NULL)
303 return NULL;
304
305 if (!_bfd_elf_link_hash_table_init (&htab->root, abfd,
306 hppa64_link_hash_newfunc,
307 sizeof (struct elf64_hppa_link_hash_entry),
308 HPPA64_ELF_DATA))
309 {
310 bfd_release (abfd, htab);
311 return NULL;
312 }
313
314 htab->text_segment_base = (bfd_vma) -1;
315 htab->data_segment_base = (bfd_vma) -1;
316
317 return &htab->root.root;
318 }
319 \f
320 /* Return nonzero if ABFD represents a PA2.0 ELF64 file.
321
322 Additionally we set the default architecture and machine. */
323 static bfd_boolean
324 elf64_hppa_object_p (bfd *abfd)
325 {
326 Elf_Internal_Ehdr * i_ehdrp;
327 unsigned int flags;
328
329 i_ehdrp = elf_elfheader (abfd);
330 if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
331 {
332 /* GCC on hppa-linux produces binaries with OSABI=Linux,
333 but the kernel produces corefiles with OSABI=SysV. */
334 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX
335 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
336 return FALSE;
337 }
338 else
339 {
340 /* HPUX produces binaries with OSABI=HPUX,
341 but the kernel produces corefiles with OSABI=SysV. */
342 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX
343 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
344 return FALSE;
345 }
346
347 flags = i_ehdrp->e_flags;
348 switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
349 {
350 case EFA_PARISC_1_0:
351 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
352 case EFA_PARISC_1_1:
353 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
354 case EFA_PARISC_2_0:
355 if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
356 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
357 else
358 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
359 case EFA_PARISC_2_0 | EF_PARISC_WIDE:
360 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
361 }
362 /* Don't be fussy. */
363 return TRUE;
364 }
365
366 /* Given section type (hdr->sh_type), return a boolean indicating
367 whether or not the section is an elf64-hppa specific section. */
368 static bfd_boolean
369 elf64_hppa_section_from_shdr (bfd *abfd,
370 Elf_Internal_Shdr *hdr,
371 const char *name,
372 int shindex)
373 {
374 switch (hdr->sh_type)
375 {
376 case SHT_PARISC_EXT:
377 if (strcmp (name, ".PARISC.archext") != 0)
378 return FALSE;
379 break;
380 case SHT_PARISC_UNWIND:
381 if (strcmp (name, ".PARISC.unwind") != 0)
382 return FALSE;
383 break;
384 case SHT_PARISC_DOC:
385 case SHT_PARISC_ANNOT:
386 default:
387 return FALSE;
388 }
389
390 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
391 return FALSE;
392
393 return TRUE;
394 }
395
396 /* SEC is a section containing relocs for an input BFD when linking; return
397 a suitable section for holding relocs in the output BFD for a link. */
398
399 static bfd_boolean
400 get_reloc_section (bfd *abfd,
401 struct elf64_hppa_link_hash_table *hppa_info,
402 asection *sec)
403 {
404 const char *srel_name;
405 asection *srel;
406 bfd *dynobj;
407
408 srel_name = (bfd_elf_string_from_elf_section
409 (abfd, elf_elfheader(abfd)->e_shstrndx,
410 _bfd_elf_single_rel_hdr(sec)->sh_name));
411 if (srel_name == NULL)
412 return FALSE;
413
414 dynobj = hppa_info->root.dynobj;
415 if (!dynobj)
416 hppa_info->root.dynobj = dynobj = abfd;
417
418 srel = bfd_get_section_by_name (dynobj, srel_name);
419 if (srel == NULL)
420 {
421 srel = bfd_make_section_with_flags (dynobj, srel_name,
422 (SEC_ALLOC
423 | SEC_LOAD
424 | SEC_HAS_CONTENTS
425 | SEC_IN_MEMORY
426 | SEC_LINKER_CREATED
427 | SEC_READONLY));
428 if (srel == NULL
429 || !bfd_set_section_alignment (dynobj, srel, 3))
430 return FALSE;
431 }
432
433 hppa_info->other_rel_sec = srel;
434 return TRUE;
435 }
436
437 /* Add a new entry to the list of dynamic relocations against DYN_H.
438
439 We use this to keep a record of all the FPTR relocations against a
440 particular symbol so that we can create FPTR relocations in the
441 output file. */
442
443 static bfd_boolean
444 count_dyn_reloc (bfd *abfd,
445 struct elf64_hppa_link_hash_entry *hh,
446 int type,
447 asection *sec,
448 int sec_symndx,
449 bfd_vma offset,
450 bfd_vma addend)
451 {
452 struct elf64_hppa_dyn_reloc_entry *rent;
453
454 rent = (struct elf64_hppa_dyn_reloc_entry *)
455 bfd_alloc (abfd, (bfd_size_type) sizeof (*rent));
456 if (!rent)
457 return FALSE;
458
459 rent->next = hh->reloc_entries;
460 rent->type = type;
461 rent->sec = sec;
462 rent->sec_symndx = sec_symndx;
463 rent->offset = offset;
464 rent->addend = addend;
465 hh->reloc_entries = rent;
466
467 return TRUE;
468 }
469
470 /* Return a pointer to the local DLT, PLT and OPD reference counts
471 for ABFD. Returns NULL if the storage allocation fails. */
472
473 static bfd_signed_vma *
474 hppa64_elf_local_refcounts (bfd *abfd)
475 {
476 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
477 bfd_signed_vma *local_refcounts;
478
479 local_refcounts = elf_local_got_refcounts (abfd);
480 if (local_refcounts == NULL)
481 {
482 bfd_size_type size;
483
484 /* Allocate space for local DLT, PLT and OPD reference
485 counts. Done this way to save polluting elf_obj_tdata
486 with another target specific pointer. */
487 size = symtab_hdr->sh_info;
488 size *= 3 * sizeof (bfd_signed_vma);
489 local_refcounts = bfd_zalloc (abfd, size);
490 elf_local_got_refcounts (abfd) = local_refcounts;
491 }
492 return local_refcounts;
493 }
494
495 /* Scan the RELOCS and record the type of dynamic entries that each
496 referenced symbol needs. */
497
498 static bfd_boolean
499 elf64_hppa_check_relocs (bfd *abfd,
500 struct bfd_link_info *info,
501 asection *sec,
502 const Elf_Internal_Rela *relocs)
503 {
504 struct elf64_hppa_link_hash_table *hppa_info;
505 const Elf_Internal_Rela *relend;
506 Elf_Internal_Shdr *symtab_hdr;
507 const Elf_Internal_Rela *rel;
508 unsigned int sec_symndx;
509
510 if (info->relocatable)
511 return TRUE;
512
513 /* If this is the first dynamic object found in the link, create
514 the special sections required for dynamic linking. */
515 if (! elf_hash_table (info)->dynamic_sections_created)
516 {
517 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
518 return FALSE;
519 }
520
521 hppa_info = hppa_link_hash_table (info);
522 if (hppa_info == NULL)
523 return FALSE;
524 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
525
526 /* If necessary, build a new table holding section symbols indices
527 for this BFD. */
528
529 if (info->shared && hppa_info->section_syms_bfd != abfd)
530 {
531 unsigned long i;
532 unsigned int highest_shndx;
533 Elf_Internal_Sym *local_syms = NULL;
534 Elf_Internal_Sym *isym, *isymend;
535 bfd_size_type amt;
536
537 /* We're done with the old cache of section index to section symbol
538 index information. Free it.
539
540 ?!? Note we leak the last section_syms array. Presumably we
541 could free it in one of the later routines in this file. */
542 if (hppa_info->section_syms)
543 free (hppa_info->section_syms);
544
545 /* Read this BFD's local symbols. */
546 if (symtab_hdr->sh_info != 0)
547 {
548 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
549 if (local_syms == NULL)
550 local_syms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
551 symtab_hdr->sh_info, 0,
552 NULL, NULL, NULL);
553 if (local_syms == NULL)
554 return FALSE;
555 }
556
557 /* Record the highest section index referenced by the local symbols. */
558 highest_shndx = 0;
559 isymend = local_syms + symtab_hdr->sh_info;
560 for (isym = local_syms; isym < isymend; isym++)
561 {
562 if (isym->st_shndx > highest_shndx
563 && isym->st_shndx < SHN_LORESERVE)
564 highest_shndx = isym->st_shndx;
565 }
566
567 /* Allocate an array to hold the section index to section symbol index
568 mapping. Bump by one since we start counting at zero. */
569 highest_shndx++;
570 amt = highest_shndx;
571 amt *= sizeof (int);
572 hppa_info->section_syms = (int *) bfd_malloc (amt);
573
574 /* Now walk the local symbols again. If we find a section symbol,
575 record the index of the symbol into the section_syms array. */
576 for (i = 0, isym = local_syms; isym < isymend; i++, isym++)
577 {
578 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
579 hppa_info->section_syms[isym->st_shndx] = i;
580 }
581
582 /* We are finished with the local symbols. */
583 if (local_syms != NULL
584 && symtab_hdr->contents != (unsigned char *) local_syms)
585 {
586 if (! info->keep_memory)
587 free (local_syms);
588 else
589 {
590 /* Cache the symbols for elf_link_input_bfd. */
591 symtab_hdr->contents = (unsigned char *) local_syms;
592 }
593 }
594
595 /* Record which BFD we built the section_syms mapping for. */
596 hppa_info->section_syms_bfd = abfd;
597 }
598
599 /* Record the symbol index for this input section. We may need it for
600 relocations when building shared libraries. When not building shared
601 libraries this value is never really used, but assign it to zero to
602 prevent out of bounds memory accesses in other routines. */
603 if (info->shared)
604 {
605 sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
606
607 /* If we did not find a section symbol for this section, then
608 something went terribly wrong above. */
609 if (sec_symndx == SHN_BAD)
610 return FALSE;
611
612 if (sec_symndx < SHN_LORESERVE)
613 sec_symndx = hppa_info->section_syms[sec_symndx];
614 else
615 sec_symndx = 0;
616 }
617 else
618 sec_symndx = 0;
619
620 relend = relocs + sec->reloc_count;
621 for (rel = relocs; rel < relend; ++rel)
622 {
623 enum
624 {
625 NEED_DLT = 1,
626 NEED_PLT = 2,
627 NEED_STUB = 4,
628 NEED_OPD = 8,
629 NEED_DYNREL = 16,
630 };
631
632 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
633 struct elf64_hppa_link_hash_entry *hh;
634 int need_entry;
635 bfd_boolean maybe_dynamic;
636 int dynrel_type = R_PARISC_NONE;
637 static reloc_howto_type *howto;
638
639 if (r_symndx >= symtab_hdr->sh_info)
640 {
641 /* We're dealing with a global symbol -- find its hash entry
642 and mark it as being referenced. */
643 long indx = r_symndx - symtab_hdr->sh_info;
644 hh = hppa_elf_hash_entry (elf_sym_hashes (abfd)[indx]);
645 while (hh->eh.root.type == bfd_link_hash_indirect
646 || hh->eh.root.type == bfd_link_hash_warning)
647 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
648
649 hh->eh.ref_regular = 1;
650 }
651 else
652 hh = NULL;
653
654 /* We can only get preliminary data on whether a symbol is
655 locally or externally defined, as not all of the input files
656 have yet been processed. Do something with what we know, as
657 this may help reduce memory usage and processing time later. */
658 maybe_dynamic = FALSE;
659 if (hh && ((info->shared
660 && (!info->symbolic
661 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
662 || !hh->eh.def_regular
663 || hh->eh.root.type == bfd_link_hash_defweak))
664 maybe_dynamic = TRUE;
665
666 howto = elf_hppa_howto_table + ELF64_R_TYPE (rel->r_info);
667 need_entry = 0;
668 switch (howto->type)
669 {
670 /* These are simple indirect references to symbols through the
671 DLT. We need to create a DLT entry for any symbols which
672 appears in a DLTIND relocation. */
673 case R_PARISC_DLTIND21L:
674 case R_PARISC_DLTIND14R:
675 case R_PARISC_DLTIND14F:
676 case R_PARISC_DLTIND14WR:
677 case R_PARISC_DLTIND14DR:
678 need_entry = NEED_DLT;
679 break;
680
681 /* ?!? These need a DLT entry. But I have no idea what to do with
682 the "link time TP value. */
683 case R_PARISC_LTOFF_TP21L:
684 case R_PARISC_LTOFF_TP14R:
685 case R_PARISC_LTOFF_TP14F:
686 case R_PARISC_LTOFF_TP64:
687 case R_PARISC_LTOFF_TP14WR:
688 case R_PARISC_LTOFF_TP14DR:
689 case R_PARISC_LTOFF_TP16F:
690 case R_PARISC_LTOFF_TP16WF:
691 case R_PARISC_LTOFF_TP16DF:
692 need_entry = NEED_DLT;
693 break;
694
695 /* These are function calls. Depending on their precise target we
696 may need to make a stub for them. The stub uses the PLT, so we
697 need to create PLT entries for these symbols too. */
698 case R_PARISC_PCREL12F:
699 case R_PARISC_PCREL17F:
700 case R_PARISC_PCREL22F:
701 case R_PARISC_PCREL32:
702 case R_PARISC_PCREL64:
703 case R_PARISC_PCREL21L:
704 case R_PARISC_PCREL17R:
705 case R_PARISC_PCREL17C:
706 case R_PARISC_PCREL14R:
707 case R_PARISC_PCREL14F:
708 case R_PARISC_PCREL22C:
709 case R_PARISC_PCREL14WR:
710 case R_PARISC_PCREL14DR:
711 case R_PARISC_PCREL16F:
712 case R_PARISC_PCREL16WF:
713 case R_PARISC_PCREL16DF:
714 /* Function calls might need to go through the .plt, and
715 might need a long branch stub. */
716 if (hh != NULL && hh->eh.type != STT_PARISC_MILLI)
717 need_entry = (NEED_PLT | NEED_STUB);
718 else
719 need_entry = 0;
720 break;
721
722 case R_PARISC_PLTOFF21L:
723 case R_PARISC_PLTOFF14R:
724 case R_PARISC_PLTOFF14F:
725 case R_PARISC_PLTOFF14WR:
726 case R_PARISC_PLTOFF14DR:
727 case R_PARISC_PLTOFF16F:
728 case R_PARISC_PLTOFF16WF:
729 case R_PARISC_PLTOFF16DF:
730 need_entry = (NEED_PLT);
731 break;
732
733 case R_PARISC_DIR64:
734 if (info->shared || maybe_dynamic)
735 need_entry = (NEED_DYNREL);
736 dynrel_type = R_PARISC_DIR64;
737 break;
738
739 /* This is an indirect reference through the DLT to get the address
740 of a OPD descriptor. Thus we need to make a DLT entry that points
741 to an OPD entry. */
742 case R_PARISC_LTOFF_FPTR21L:
743 case R_PARISC_LTOFF_FPTR14R:
744 case R_PARISC_LTOFF_FPTR14WR:
745 case R_PARISC_LTOFF_FPTR14DR:
746 case R_PARISC_LTOFF_FPTR32:
747 case R_PARISC_LTOFF_FPTR64:
748 case R_PARISC_LTOFF_FPTR16F:
749 case R_PARISC_LTOFF_FPTR16WF:
750 case R_PARISC_LTOFF_FPTR16DF:
751 if (info->shared || maybe_dynamic)
752 need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
753 else
754 need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
755 dynrel_type = R_PARISC_FPTR64;
756 break;
757
758 /* This is a simple OPD entry. */
759 case R_PARISC_FPTR64:
760 if (info->shared || maybe_dynamic)
761 need_entry = (NEED_OPD | NEED_PLT | NEED_DYNREL);
762 else
763 need_entry = (NEED_OPD | NEED_PLT);
764 dynrel_type = R_PARISC_FPTR64;
765 break;
766
767 /* Add more cases as needed. */
768 }
769
770 if (!need_entry)
771 continue;
772
773 if (hh)
774 {
775 /* Stash away enough information to be able to find this symbol
776 regardless of whether or not it is local or global. */
777 hh->owner = abfd;
778 hh->sym_indx = r_symndx;
779 }
780
781 /* Create what's needed. */
782 if (need_entry & NEED_DLT)
783 {
784 /* Allocate space for a DLT entry, as well as a dynamic
785 relocation for this entry. */
786 if (! hppa_info->dlt_sec
787 && ! get_dlt (abfd, info, hppa_info))
788 goto err_out;
789
790 if (hh != NULL)
791 {
792 hh->want_dlt = 1;
793 hh->eh.got.refcount += 1;
794 }
795 else
796 {
797 bfd_signed_vma *local_dlt_refcounts;
798
799 /* This is a DLT entry for a local symbol. */
800 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
801 if (local_dlt_refcounts == NULL)
802 return FALSE;
803 local_dlt_refcounts[r_symndx] += 1;
804 }
805 }
806
807 if (need_entry & NEED_PLT)
808 {
809 if (! hppa_info->plt_sec
810 && ! get_plt (abfd, info, hppa_info))
811 goto err_out;
812
813 if (hh != NULL)
814 {
815 hh->want_plt = 1;
816 hh->eh.needs_plt = 1;
817 hh->eh.plt.refcount += 1;
818 }
819 else
820 {
821 bfd_signed_vma *local_dlt_refcounts;
822 bfd_signed_vma *local_plt_refcounts;
823
824 /* This is a PLT entry for a local symbol. */
825 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
826 if (local_dlt_refcounts == NULL)
827 return FALSE;
828 local_plt_refcounts = local_dlt_refcounts + symtab_hdr->sh_info;
829 local_plt_refcounts[r_symndx] += 1;
830 }
831 }
832
833 if (need_entry & NEED_STUB)
834 {
835 if (! hppa_info->stub_sec
836 && ! get_stub (abfd, info, hppa_info))
837 goto err_out;
838 if (hh)
839 hh->want_stub = 1;
840 }
841
842 if (need_entry & NEED_OPD)
843 {
844 if (! hppa_info->opd_sec
845 && ! get_opd (abfd, info, hppa_info))
846 goto err_out;
847
848 /* FPTRs are not allocated by the dynamic linker for PA64,
849 though it is possible that will change in the future. */
850
851 if (hh != NULL)
852 hh->want_opd = 1;
853 else
854 {
855 bfd_signed_vma *local_dlt_refcounts;
856 bfd_signed_vma *local_opd_refcounts;
857
858 /* This is a OPD for a local symbol. */
859 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
860 if (local_dlt_refcounts == NULL)
861 return FALSE;
862 local_opd_refcounts = (local_dlt_refcounts
863 + 2 * symtab_hdr->sh_info);
864 local_opd_refcounts[r_symndx] += 1;
865 }
866 }
867
868 /* Add a new dynamic relocation to the chain of dynamic
869 relocations for this symbol. */
870 if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
871 {
872 if (! hppa_info->other_rel_sec
873 && ! get_reloc_section (abfd, hppa_info, sec))
874 goto err_out;
875
876 /* Count dynamic relocations against global symbols. */
877 if (hh != NULL
878 && !count_dyn_reloc (abfd, hh, dynrel_type, sec,
879 sec_symndx, rel->r_offset, rel->r_addend))
880 goto err_out;
881
882 /* If we are building a shared library and we just recorded
883 a dynamic R_PARISC_FPTR64 relocation, then make sure the
884 section symbol for this section ends up in the dynamic
885 symbol table. */
886 if (info->shared && dynrel_type == R_PARISC_FPTR64
887 && ! (bfd_elf_link_record_local_dynamic_symbol
888 (info, abfd, sec_symndx)))
889 return FALSE;
890 }
891 }
892
893 return TRUE;
894
895 err_out:
896 return FALSE;
897 }
898
899 struct elf64_hppa_allocate_data
900 {
901 struct bfd_link_info *info;
902 bfd_size_type ofs;
903 };
904
905 /* Should we do dynamic things to this symbol? */
906
907 static bfd_boolean
908 elf64_hppa_dynamic_symbol_p (struct elf_link_hash_entry *eh,
909 struct bfd_link_info *info)
910 {
911 /* ??? What, if anything, needs to happen wrt STV_PROTECTED symbols
912 and relocations that retrieve a function descriptor? Assume the
913 worst for now. */
914 if (_bfd_elf_dynamic_symbol_p (eh, info, 1))
915 {
916 /* ??? Why is this here and not elsewhere is_local_label_name. */
917 if (eh->root.root.string[0] == '$' && eh->root.root.string[1] == '$')
918 return FALSE;
919
920 return TRUE;
921 }
922 else
923 return FALSE;
924 }
925
926 /* Mark all functions exported by this file so that we can later allocate
927 entries in .opd for them. */
928
929 static bfd_boolean
930 elf64_hppa_mark_exported_functions (struct elf_link_hash_entry *eh, void *data)
931 {
932 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
933 struct bfd_link_info *info = (struct bfd_link_info *)data;
934 struct elf64_hppa_link_hash_table *hppa_info;
935
936 hppa_info = hppa_link_hash_table (info);
937 if (hppa_info == NULL)
938 return FALSE;
939
940 if (eh
941 && (eh->root.type == bfd_link_hash_defined
942 || eh->root.type == bfd_link_hash_defweak)
943 && eh->root.u.def.section->output_section != NULL
944 && eh->type == STT_FUNC)
945 {
946 if (! hppa_info->opd_sec
947 && ! get_opd (hppa_info->root.dynobj, info, hppa_info))
948 return FALSE;
949
950 hh->want_opd = 1;
951
952 /* Put a flag here for output_symbol_hook. */
953 hh->st_shndx = -1;
954 eh->needs_plt = 1;
955 }
956
957 return TRUE;
958 }
959
960 /* Allocate space for a DLT entry. */
961
962 static bfd_boolean
963 allocate_global_data_dlt (struct elf_link_hash_entry *eh, void *data)
964 {
965 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
966 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
967
968 if (hh->want_dlt)
969 {
970 if (x->info->shared)
971 {
972 /* Possibly add the symbol to the local dynamic symbol
973 table since we might need to create a dynamic relocation
974 against it. */
975 if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
976 {
977 bfd *owner = eh->root.u.def.section->owner;
978
979 if (! (bfd_elf_link_record_local_dynamic_symbol
980 (x->info, owner, hh->sym_indx)))
981 return FALSE;
982 }
983 }
984
985 hh->dlt_offset = x->ofs;
986 x->ofs += DLT_ENTRY_SIZE;
987 }
988 return TRUE;
989 }
990
991 /* Allocate space for a DLT.PLT entry. */
992
993 static bfd_boolean
994 allocate_global_data_plt (struct elf_link_hash_entry *eh, void *data)
995 {
996 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
997 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *) data;
998
999 if (hh->want_plt
1000 && elf64_hppa_dynamic_symbol_p (eh, x->info)
1001 && !((eh->root.type == bfd_link_hash_defined
1002 || eh->root.type == bfd_link_hash_defweak)
1003 && eh->root.u.def.section->output_section != NULL))
1004 {
1005 hh->plt_offset = x->ofs;
1006 x->ofs += PLT_ENTRY_SIZE;
1007 if (hh->plt_offset < 0x2000)
1008 {
1009 struct elf64_hppa_link_hash_table *hppa_info;
1010
1011 hppa_info = hppa_link_hash_table (x->info);
1012 if (hppa_info == NULL)
1013 return FALSE;
1014
1015 hppa_info->gp_offset = hh->plt_offset;
1016 }
1017 }
1018 else
1019 hh->want_plt = 0;
1020
1021 return TRUE;
1022 }
1023
1024 /* Allocate space for a STUB entry. */
1025
1026 static bfd_boolean
1027 allocate_global_data_stub (struct elf_link_hash_entry *eh, void *data)
1028 {
1029 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1030 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1031
1032 if (hh->want_stub
1033 && elf64_hppa_dynamic_symbol_p (eh, x->info)
1034 && !((eh->root.type == bfd_link_hash_defined
1035 || eh->root.type == bfd_link_hash_defweak)
1036 && eh->root.u.def.section->output_section != NULL))
1037 {
1038 hh->stub_offset = x->ofs;
1039 x->ofs += sizeof (plt_stub);
1040 }
1041 else
1042 hh->want_stub = 0;
1043 return TRUE;
1044 }
1045
1046 /* Allocate space for a FPTR entry. */
1047
1048 static bfd_boolean
1049 allocate_global_data_opd (struct elf_link_hash_entry *eh, void *data)
1050 {
1051 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1052 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1053
1054 if (hh && hh->want_opd)
1055 {
1056 /* We never need an opd entry for a symbol which is not
1057 defined by this output file. */
1058 if (hh && (hh->eh.root.type == bfd_link_hash_undefined
1059 || hh->eh.root.type == bfd_link_hash_undefweak
1060 || hh->eh.root.u.def.section->output_section == NULL))
1061 hh->want_opd = 0;
1062
1063 /* If we are creating a shared library, took the address of a local
1064 function or might export this function from this object file, then
1065 we have to create an opd descriptor. */
1066 else if (x->info->shared
1067 || hh == NULL
1068 || (hh->eh.dynindx == -1 && hh->eh.type != STT_PARISC_MILLI)
1069 || (hh->eh.root.type == bfd_link_hash_defined
1070 || hh->eh.root.type == bfd_link_hash_defweak))
1071 {
1072 /* If we are creating a shared library, then we will have to
1073 create a runtime relocation for the symbol to properly
1074 initialize the .opd entry. Make sure the symbol gets
1075 added to the dynamic symbol table. */
1076 if (x->info->shared
1077 && (hh == NULL || (hh->eh.dynindx == -1)))
1078 {
1079 bfd *owner;
1080 /* PR 6511: Default to using the dynamic symbol table. */
1081 owner = (hh->owner ? hh->owner: eh->root.u.def.section->owner);
1082
1083 if (!bfd_elf_link_record_local_dynamic_symbol
1084 (x->info, owner, hh->sym_indx))
1085 return FALSE;
1086 }
1087
1088 /* This may not be necessary or desirable anymore now that
1089 we have some support for dealing with section symbols
1090 in dynamic relocs. But name munging does make the result
1091 much easier to debug. ie, the EPLT reloc will reference
1092 a symbol like .foobar, instead of .text + offset. */
1093 if (x->info->shared && eh)
1094 {
1095 char *new_name;
1096 struct elf_link_hash_entry *nh;
1097
1098 new_name = alloca (strlen (eh->root.root.string) + 2);
1099 new_name[0] = '.';
1100 strcpy (new_name + 1, eh->root.root.string);
1101
1102 nh = elf_link_hash_lookup (elf_hash_table (x->info),
1103 new_name, TRUE, TRUE, TRUE);
1104
1105 nh->root.type = eh->root.type;
1106 nh->root.u.def.value = eh->root.u.def.value;
1107 nh->root.u.def.section = eh->root.u.def.section;
1108
1109 if (! bfd_elf_link_record_dynamic_symbol (x->info, nh))
1110 return FALSE;
1111
1112 }
1113 hh->opd_offset = x->ofs;
1114 x->ofs += OPD_ENTRY_SIZE;
1115 }
1116
1117 /* Otherwise we do not need an opd entry. */
1118 else
1119 hh->want_opd = 0;
1120 }
1121 return TRUE;
1122 }
1123
1124 /* HP requires the EI_OSABI field to be filled in. The assignment to
1125 EI_ABIVERSION may not be strictly necessary. */
1126
1127 static void
1128 elf64_hppa_post_process_headers (bfd *abfd,
1129 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1130 {
1131 Elf_Internal_Ehdr * i_ehdrp;
1132
1133 i_ehdrp = elf_elfheader (abfd);
1134
1135 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
1136 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
1137 }
1138
1139 /* Create function descriptor section (.opd). This section is called .opd
1140 because it contains "official procedure descriptors". The "official"
1141 refers to the fact that these descriptors are used when taking the address
1142 of a procedure, thus ensuring a unique address for each procedure. */
1143
1144 static bfd_boolean
1145 get_opd (bfd *abfd,
1146 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1147 struct elf64_hppa_link_hash_table *hppa_info)
1148 {
1149 asection *opd;
1150 bfd *dynobj;
1151
1152 opd = hppa_info->opd_sec;
1153 if (!opd)
1154 {
1155 dynobj = hppa_info->root.dynobj;
1156 if (!dynobj)
1157 hppa_info->root.dynobj = dynobj = abfd;
1158
1159 opd = bfd_make_section_with_flags (dynobj, ".opd",
1160 (SEC_ALLOC
1161 | SEC_LOAD
1162 | SEC_HAS_CONTENTS
1163 | SEC_IN_MEMORY
1164 | SEC_LINKER_CREATED));
1165 if (!opd
1166 || !bfd_set_section_alignment (abfd, opd, 3))
1167 {
1168 BFD_ASSERT (0);
1169 return FALSE;
1170 }
1171
1172 hppa_info->opd_sec = opd;
1173 }
1174
1175 return TRUE;
1176 }
1177
1178 /* Create the PLT section. */
1179
1180 static bfd_boolean
1181 get_plt (bfd *abfd,
1182 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1183 struct elf64_hppa_link_hash_table *hppa_info)
1184 {
1185 asection *plt;
1186 bfd *dynobj;
1187
1188 plt = hppa_info->plt_sec;
1189 if (!plt)
1190 {
1191 dynobj = hppa_info->root.dynobj;
1192 if (!dynobj)
1193 hppa_info->root.dynobj = dynobj = abfd;
1194
1195 plt = bfd_make_section_with_flags (dynobj, ".plt",
1196 (SEC_ALLOC
1197 | SEC_LOAD
1198 | SEC_HAS_CONTENTS
1199 | SEC_IN_MEMORY
1200 | SEC_LINKER_CREATED));
1201 if (!plt
1202 || !bfd_set_section_alignment (abfd, plt, 3))
1203 {
1204 BFD_ASSERT (0);
1205 return FALSE;
1206 }
1207
1208 hppa_info->plt_sec = plt;
1209 }
1210
1211 return TRUE;
1212 }
1213
1214 /* Create the DLT section. */
1215
1216 static bfd_boolean
1217 get_dlt (bfd *abfd,
1218 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1219 struct elf64_hppa_link_hash_table *hppa_info)
1220 {
1221 asection *dlt;
1222 bfd *dynobj;
1223
1224 dlt = hppa_info->dlt_sec;
1225 if (!dlt)
1226 {
1227 dynobj = hppa_info->root.dynobj;
1228 if (!dynobj)
1229 hppa_info->root.dynobj = dynobj = abfd;
1230
1231 dlt = bfd_make_section_with_flags (dynobj, ".dlt",
1232 (SEC_ALLOC
1233 | SEC_LOAD
1234 | SEC_HAS_CONTENTS
1235 | SEC_IN_MEMORY
1236 | SEC_LINKER_CREATED));
1237 if (!dlt
1238 || !bfd_set_section_alignment (abfd, dlt, 3))
1239 {
1240 BFD_ASSERT (0);
1241 return FALSE;
1242 }
1243
1244 hppa_info->dlt_sec = dlt;
1245 }
1246
1247 return TRUE;
1248 }
1249
1250 /* Create the stubs section. */
1251
1252 static bfd_boolean
1253 get_stub (bfd *abfd,
1254 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1255 struct elf64_hppa_link_hash_table *hppa_info)
1256 {
1257 asection *stub;
1258 bfd *dynobj;
1259
1260 stub = hppa_info->stub_sec;
1261 if (!stub)
1262 {
1263 dynobj = hppa_info->root.dynobj;
1264 if (!dynobj)
1265 hppa_info->root.dynobj = dynobj = abfd;
1266
1267 stub = bfd_make_section_with_flags (dynobj, ".stub",
1268 (SEC_ALLOC | SEC_LOAD
1269 | SEC_HAS_CONTENTS
1270 | SEC_IN_MEMORY
1271 | SEC_READONLY
1272 | SEC_LINKER_CREATED));
1273 if (!stub
1274 || !bfd_set_section_alignment (abfd, stub, 3))
1275 {
1276 BFD_ASSERT (0);
1277 return FALSE;
1278 }
1279
1280 hppa_info->stub_sec = stub;
1281 }
1282
1283 return TRUE;
1284 }
1285
1286 /* Create sections necessary for dynamic linking. This is only a rough
1287 cut and will likely change as we learn more about the somewhat
1288 unusual dynamic linking scheme HP uses.
1289
1290 .stub:
1291 Contains code to implement cross-space calls. The first time one
1292 of the stubs is used it will call into the dynamic linker, later
1293 calls will go straight to the target.
1294
1295 The only stub we support right now looks like
1296
1297 ldd OFFSET(%dp),%r1
1298 bve %r0(%r1)
1299 ldd OFFSET+8(%dp),%dp
1300
1301 Other stubs may be needed in the future. We may want the remove
1302 the break/nop instruction. It is only used right now to keep the
1303 offset of a .plt entry and a .stub entry in sync.
1304
1305 .dlt:
1306 This is what most people call the .got. HP used a different name.
1307 Losers.
1308
1309 .rela.dlt:
1310 Relocations for the DLT.
1311
1312 .plt:
1313 Function pointers as address,gp pairs.
1314
1315 .rela.plt:
1316 Should contain dynamic IPLT (and EPLT?) relocations.
1317
1318 .opd:
1319 FPTRS
1320
1321 .rela.opd:
1322 EPLT relocations for symbols exported from shared libraries. */
1323
1324 static bfd_boolean
1325 elf64_hppa_create_dynamic_sections (bfd *abfd,
1326 struct bfd_link_info *info)
1327 {
1328 asection *s;
1329 struct elf64_hppa_link_hash_table *hppa_info;
1330
1331 hppa_info = hppa_link_hash_table (info);
1332 if (hppa_info == NULL)
1333 return FALSE;
1334
1335 if (! get_stub (abfd, info, hppa_info))
1336 return FALSE;
1337
1338 if (! get_dlt (abfd, info, hppa_info))
1339 return FALSE;
1340
1341 if (! get_plt (abfd, info, hppa_info))
1342 return FALSE;
1343
1344 if (! get_opd (abfd, info, hppa_info))
1345 return FALSE;
1346
1347 s = bfd_make_section_with_flags (abfd, ".rela.dlt",
1348 (SEC_ALLOC | SEC_LOAD
1349 | SEC_HAS_CONTENTS
1350 | SEC_IN_MEMORY
1351 | SEC_READONLY
1352 | SEC_LINKER_CREATED));
1353 if (s == NULL
1354 || !bfd_set_section_alignment (abfd, s, 3))
1355 return FALSE;
1356 hppa_info->dlt_rel_sec = s;
1357
1358 s = bfd_make_section_with_flags (abfd, ".rela.plt",
1359 (SEC_ALLOC | SEC_LOAD
1360 | SEC_HAS_CONTENTS
1361 | SEC_IN_MEMORY
1362 | SEC_READONLY
1363 | SEC_LINKER_CREATED));
1364 if (s == NULL
1365 || !bfd_set_section_alignment (abfd, s, 3))
1366 return FALSE;
1367 hppa_info->plt_rel_sec = s;
1368
1369 s = bfd_make_section_with_flags (abfd, ".rela.data",
1370 (SEC_ALLOC | SEC_LOAD
1371 | SEC_HAS_CONTENTS
1372 | SEC_IN_MEMORY
1373 | SEC_READONLY
1374 | SEC_LINKER_CREATED));
1375 if (s == NULL
1376 || !bfd_set_section_alignment (abfd, s, 3))
1377 return FALSE;
1378 hppa_info->other_rel_sec = s;
1379
1380 s = bfd_make_section_with_flags (abfd, ".rela.opd",
1381 (SEC_ALLOC | SEC_LOAD
1382 | SEC_HAS_CONTENTS
1383 | SEC_IN_MEMORY
1384 | SEC_READONLY
1385 | SEC_LINKER_CREATED));
1386 if (s == NULL
1387 || !bfd_set_section_alignment (abfd, s, 3))
1388 return FALSE;
1389 hppa_info->opd_rel_sec = s;
1390
1391 return TRUE;
1392 }
1393
1394 /* Allocate dynamic relocations for those symbols that turned out
1395 to be dynamic. */
1396
1397 static bfd_boolean
1398 allocate_dynrel_entries (struct elf_link_hash_entry *eh, void *data)
1399 {
1400 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1401 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1402 struct elf64_hppa_link_hash_table *hppa_info;
1403 struct elf64_hppa_dyn_reloc_entry *rent;
1404 bfd_boolean dynamic_symbol, shared;
1405
1406 hppa_info = hppa_link_hash_table (x->info);
1407 if (hppa_info == NULL)
1408 return FALSE;
1409
1410 dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, x->info);
1411 shared = x->info->shared;
1412
1413 /* We may need to allocate relocations for a non-dynamic symbol
1414 when creating a shared library. */
1415 if (!dynamic_symbol && !shared)
1416 return TRUE;
1417
1418 /* Take care of the normal data relocations. */
1419
1420 for (rent = hh->reloc_entries; rent; rent = rent->next)
1421 {
1422 /* Allocate one iff we are building a shared library, the relocation
1423 isn't a R_PARISC_FPTR64, or we don't want an opd entry. */
1424 if (!shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
1425 continue;
1426
1427 hppa_info->other_rel_sec->size += sizeof (Elf64_External_Rela);
1428
1429 /* Make sure this symbol gets into the dynamic symbol table if it is
1430 not already recorded. ?!? This should not be in the loop since
1431 the symbol need only be added once. */
1432 if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
1433 if (!bfd_elf_link_record_local_dynamic_symbol
1434 (x->info, rent->sec->owner, hh->sym_indx))
1435 return FALSE;
1436 }
1437
1438 /* Take care of the GOT and PLT relocations. */
1439
1440 if ((dynamic_symbol || shared) && hh->want_dlt)
1441 hppa_info->dlt_rel_sec->size += sizeof (Elf64_External_Rela);
1442
1443 /* If we are building a shared library, then every symbol that has an
1444 opd entry will need an EPLT relocation to relocate the symbol's address
1445 and __gp value based on the runtime load address. */
1446 if (shared && hh->want_opd)
1447 hppa_info->opd_rel_sec->size += sizeof (Elf64_External_Rela);
1448
1449 if (hh->want_plt && dynamic_symbol)
1450 {
1451 bfd_size_type t = 0;
1452
1453 /* Dynamic symbols get one IPLT relocation. Local symbols in
1454 shared libraries get two REL relocations. Local symbols in
1455 main applications get nothing. */
1456 if (dynamic_symbol)
1457 t = sizeof (Elf64_External_Rela);
1458 else if (shared)
1459 t = 2 * sizeof (Elf64_External_Rela);
1460
1461 hppa_info->plt_rel_sec->size += t;
1462 }
1463
1464 return TRUE;
1465 }
1466
1467 /* Adjust a symbol defined by a dynamic object and referenced by a
1468 regular object. */
1469
1470 static bfd_boolean
1471 elf64_hppa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1472 struct elf_link_hash_entry *eh)
1473 {
1474 /* ??? Undefined symbols with PLT entries should be re-defined
1475 to be the PLT entry. */
1476
1477 /* If this is a weak symbol, and there is a real definition, the
1478 processor independent code will have arranged for us to see the
1479 real definition first, and we can just use the same value. */
1480 if (eh->u.weakdef != NULL)
1481 {
1482 BFD_ASSERT (eh->u.weakdef->root.type == bfd_link_hash_defined
1483 || eh->u.weakdef->root.type == bfd_link_hash_defweak);
1484 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1485 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1486 return TRUE;
1487 }
1488
1489 /* If this is a reference to a symbol defined by a dynamic object which
1490 is not a function, we might allocate the symbol in our .dynbss section
1491 and allocate a COPY dynamic relocation.
1492
1493 But PA64 code is canonically PIC, so as a rule we can avoid this sort
1494 of hackery. */
1495
1496 return TRUE;
1497 }
1498
1499 /* This function is called via elf_link_hash_traverse to mark millicode
1500 symbols with a dynindx of -1 and to remove the string table reference
1501 from the dynamic symbol table. If the symbol is not a millicode symbol,
1502 elf64_hppa_mark_exported_functions is called. */
1503
1504 static bfd_boolean
1505 elf64_hppa_mark_milli_and_exported_functions (struct elf_link_hash_entry *eh,
1506 void *data)
1507 {
1508 struct bfd_link_info *info = (struct bfd_link_info *) data;
1509
1510 if (eh->type == STT_PARISC_MILLI)
1511 {
1512 if (eh->dynindx != -1)
1513 {
1514 eh->dynindx = -1;
1515 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1516 eh->dynstr_index);
1517 }
1518 return TRUE;
1519 }
1520
1521 return elf64_hppa_mark_exported_functions (eh, data);
1522 }
1523
1524 /* Set the final sizes of the dynamic sections and allocate memory for
1525 the contents of our special sections. */
1526
1527 static bfd_boolean
1528 elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1529 {
1530 struct elf64_hppa_link_hash_table *hppa_info;
1531 struct elf64_hppa_allocate_data data;
1532 bfd *dynobj;
1533 bfd *ibfd;
1534 asection *sec;
1535 bfd_boolean plt;
1536 bfd_boolean relocs;
1537 bfd_boolean reltext;
1538
1539 hppa_info = hppa_link_hash_table (info);
1540 if (hppa_info == NULL)
1541 return FALSE;
1542
1543 dynobj = elf_hash_table (info)->dynobj;
1544 BFD_ASSERT (dynobj != NULL);
1545
1546 /* Mark each function this program exports so that we will allocate
1547 space in the .opd section for each function's FPTR. If we are
1548 creating dynamic sections, change the dynamic index of millicode
1549 symbols to -1 and remove them from the string table for .dynstr.
1550
1551 We have to traverse the main linker hash table since we have to
1552 find functions which may not have been mentioned in any relocs. */
1553 elf_link_hash_traverse (elf_hash_table (info),
1554 (elf_hash_table (info)->dynamic_sections_created
1555 ? elf64_hppa_mark_milli_and_exported_functions
1556 : elf64_hppa_mark_exported_functions),
1557 info);
1558
1559 if (elf_hash_table (info)->dynamic_sections_created)
1560 {
1561 /* Set the contents of the .interp section to the interpreter. */
1562 if (info->executable)
1563 {
1564 sec = bfd_get_section_by_name (dynobj, ".interp");
1565 BFD_ASSERT (sec != NULL);
1566 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
1567 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1568 }
1569 }
1570 else
1571 {
1572 /* We may have created entries in the .rela.got section.
1573 However, if we are not creating the dynamic sections, we will
1574 not actually use these entries. Reset the size of .rela.dlt,
1575 which will cause it to get stripped from the output file
1576 below. */
1577 sec = bfd_get_section_by_name (dynobj, ".rela.dlt");
1578 if (sec != NULL)
1579 sec->size = 0;
1580 }
1581
1582 /* Set up DLT, PLT and OPD offsets for local syms, and space for local
1583 dynamic relocs. */
1584 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1585 {
1586 bfd_signed_vma *local_dlt;
1587 bfd_signed_vma *end_local_dlt;
1588 bfd_signed_vma *local_plt;
1589 bfd_signed_vma *end_local_plt;
1590 bfd_signed_vma *local_opd;
1591 bfd_signed_vma *end_local_opd;
1592 bfd_size_type locsymcount;
1593 Elf_Internal_Shdr *symtab_hdr;
1594 asection *srel;
1595
1596 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1597 continue;
1598
1599 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
1600 {
1601 struct elf64_hppa_dyn_reloc_entry *hdh_p;
1602
1603 for (hdh_p = ((struct elf64_hppa_dyn_reloc_entry *)
1604 elf_section_data (sec)->local_dynrel);
1605 hdh_p != NULL;
1606 hdh_p = hdh_p->next)
1607 {
1608 if (!bfd_is_abs_section (hdh_p->sec)
1609 && bfd_is_abs_section (hdh_p->sec->output_section))
1610 {
1611 /* Input section has been discarded, either because
1612 it is a copy of a linkonce section or due to
1613 linker script /DISCARD/, so we'll be discarding
1614 the relocs too. */
1615 }
1616 else if (hdh_p->count != 0)
1617 {
1618 srel = elf_section_data (hdh_p->sec)->sreloc;
1619 srel->size += hdh_p->count * sizeof (Elf64_External_Rela);
1620 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
1621 info->flags |= DF_TEXTREL;
1622 }
1623 }
1624 }
1625
1626 local_dlt = elf_local_got_refcounts (ibfd);
1627 if (!local_dlt)
1628 continue;
1629
1630 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1631 locsymcount = symtab_hdr->sh_info;
1632 end_local_dlt = local_dlt + locsymcount;
1633 sec = hppa_info->dlt_sec;
1634 srel = hppa_info->dlt_rel_sec;
1635 for (; local_dlt < end_local_dlt; ++local_dlt)
1636 {
1637 if (*local_dlt > 0)
1638 {
1639 *local_dlt = sec->size;
1640 sec->size += DLT_ENTRY_SIZE;
1641 if (info->shared)
1642 {
1643 srel->size += sizeof (Elf64_External_Rela);
1644 }
1645 }
1646 else
1647 *local_dlt = (bfd_vma) -1;
1648 }
1649
1650 local_plt = end_local_dlt;
1651 end_local_plt = local_plt + locsymcount;
1652 if (! hppa_info->root.dynamic_sections_created)
1653 {
1654 /* Won't be used, but be safe. */
1655 for (; local_plt < end_local_plt; ++local_plt)
1656 *local_plt = (bfd_vma) -1;
1657 }
1658 else
1659 {
1660 sec = hppa_info->plt_sec;
1661 srel = hppa_info->plt_rel_sec;
1662 for (; local_plt < end_local_plt; ++local_plt)
1663 {
1664 if (*local_plt > 0)
1665 {
1666 *local_plt = sec->size;
1667 sec->size += PLT_ENTRY_SIZE;
1668 if (info->shared)
1669 srel->size += sizeof (Elf64_External_Rela);
1670 }
1671 else
1672 *local_plt = (bfd_vma) -1;
1673 }
1674 }
1675
1676 local_opd = end_local_plt;
1677 end_local_opd = local_opd + locsymcount;
1678 if (! hppa_info->root.dynamic_sections_created)
1679 {
1680 /* Won't be used, but be safe. */
1681 for (; local_opd < end_local_opd; ++local_opd)
1682 *local_opd = (bfd_vma) -1;
1683 }
1684 else
1685 {
1686 sec = hppa_info->opd_sec;
1687 srel = hppa_info->opd_rel_sec;
1688 for (; local_opd < end_local_opd; ++local_opd)
1689 {
1690 if (*local_opd > 0)
1691 {
1692 *local_opd = sec->size;
1693 sec->size += OPD_ENTRY_SIZE;
1694 if (info->shared)
1695 srel->size += sizeof (Elf64_External_Rela);
1696 }
1697 else
1698 *local_opd = (bfd_vma) -1;
1699 }
1700 }
1701 }
1702
1703 /* Allocate the GOT entries. */
1704
1705 data.info = info;
1706 if (hppa_info->dlt_sec)
1707 {
1708 data.ofs = hppa_info->dlt_sec->size;
1709 elf_link_hash_traverse (elf_hash_table (info),
1710 allocate_global_data_dlt, &data);
1711 hppa_info->dlt_sec->size = data.ofs;
1712 }
1713
1714 if (hppa_info->plt_sec)
1715 {
1716 data.ofs = hppa_info->plt_sec->size;
1717 elf_link_hash_traverse (elf_hash_table (info),
1718 allocate_global_data_plt, &data);
1719 hppa_info->plt_sec->size = data.ofs;
1720 }
1721
1722 if (hppa_info->stub_sec)
1723 {
1724 data.ofs = 0x0;
1725 elf_link_hash_traverse (elf_hash_table (info),
1726 allocate_global_data_stub, &data);
1727 hppa_info->stub_sec->size = data.ofs;
1728 }
1729
1730 /* Allocate space for entries in the .opd section. */
1731 if (hppa_info->opd_sec)
1732 {
1733 data.ofs = hppa_info->opd_sec->size;
1734 elf_link_hash_traverse (elf_hash_table (info),
1735 allocate_global_data_opd, &data);
1736 hppa_info->opd_sec->size = data.ofs;
1737 }
1738
1739 /* Now allocate space for dynamic relocations, if necessary. */
1740 if (hppa_info->root.dynamic_sections_created)
1741 elf_link_hash_traverse (elf_hash_table (info),
1742 allocate_dynrel_entries, &data);
1743
1744 /* The sizes of all the sections are set. Allocate memory for them. */
1745 plt = FALSE;
1746 relocs = FALSE;
1747 reltext = FALSE;
1748 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
1749 {
1750 const char *name;
1751
1752 if ((sec->flags & SEC_LINKER_CREATED) == 0)
1753 continue;
1754
1755 /* It's OK to base decisions on the section name, because none
1756 of the dynobj section names depend upon the input files. */
1757 name = bfd_get_section_name (dynobj, sec);
1758
1759 if (strcmp (name, ".plt") == 0)
1760 {
1761 /* Remember whether there is a PLT. */
1762 plt = sec->size != 0;
1763 }
1764 else if (strcmp (name, ".opd") == 0
1765 || CONST_STRNEQ (name, ".dlt")
1766 || strcmp (name, ".stub") == 0
1767 || strcmp (name, ".got") == 0)
1768 {
1769 /* Strip this section if we don't need it; see the comment below. */
1770 }
1771 else if (CONST_STRNEQ (name, ".rela"))
1772 {
1773 if (sec->size != 0)
1774 {
1775 asection *target;
1776
1777 /* Remember whether there are any reloc sections other
1778 than .rela.plt. */
1779 if (strcmp (name, ".rela.plt") != 0)
1780 {
1781 const char *outname;
1782
1783 relocs = TRUE;
1784
1785 /* If this relocation section applies to a read only
1786 section, then we probably need a DT_TEXTREL
1787 entry. The entries in the .rela.plt section
1788 really apply to the .got section, which we
1789 created ourselves and so know is not readonly. */
1790 outname = bfd_get_section_name (output_bfd,
1791 sec->output_section);
1792 target = bfd_get_section_by_name (output_bfd, outname + 4);
1793 if (target != NULL
1794 && (target->flags & SEC_READONLY) != 0
1795 && (target->flags & SEC_ALLOC) != 0)
1796 reltext = TRUE;
1797 }
1798
1799 /* We use the reloc_count field as a counter if we need
1800 to copy relocs into the output file. */
1801 sec->reloc_count = 0;
1802 }
1803 }
1804 else
1805 {
1806 /* It's not one of our sections, so don't allocate space. */
1807 continue;
1808 }
1809
1810 if (sec->size == 0)
1811 {
1812 /* If we don't need this section, strip it from the
1813 output file. This is mostly to handle .rela.bss and
1814 .rela.plt. We must create both sections in
1815 create_dynamic_sections, because they must be created
1816 before the linker maps input sections to output
1817 sections. The linker does that before
1818 adjust_dynamic_symbol is called, and it is that
1819 function which decides whether anything needs to go
1820 into these sections. */
1821 sec->flags |= SEC_EXCLUDE;
1822 continue;
1823 }
1824
1825 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
1826 continue;
1827
1828 /* Allocate memory for the section contents if it has not
1829 been allocated already. We use bfd_zalloc here in case
1830 unused entries are not reclaimed before the section's
1831 contents are written out. This should not happen, but this
1832 way if it does, we get a R_PARISC_NONE reloc instead of
1833 garbage. */
1834 if (sec->contents == NULL)
1835 {
1836 sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
1837 if (sec->contents == NULL)
1838 return FALSE;
1839 }
1840 }
1841
1842 if (elf_hash_table (info)->dynamic_sections_created)
1843 {
1844 /* Always create a DT_PLTGOT. It actually has nothing to do with
1845 the PLT, it is how we communicate the __gp value of a load
1846 module to the dynamic linker. */
1847 #define add_dynamic_entry(TAG, VAL) \
1848 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1849
1850 if (!add_dynamic_entry (DT_HP_DLD_FLAGS, 0)
1851 || !add_dynamic_entry (DT_PLTGOT, 0))
1852 return FALSE;
1853
1854 /* Add some entries to the .dynamic section. We fill in the
1855 values later, in elf64_hppa_finish_dynamic_sections, but we
1856 must add the entries now so that we get the correct size for
1857 the .dynamic section. The DT_DEBUG entry is filled in by the
1858 dynamic linker and used by the debugger. */
1859 if (! info->shared)
1860 {
1861 if (!add_dynamic_entry (DT_DEBUG, 0)
1862 || !add_dynamic_entry (DT_HP_DLD_HOOK, 0)
1863 || !add_dynamic_entry (DT_HP_LOAD_MAP, 0))
1864 return FALSE;
1865 }
1866
1867 /* Force DT_FLAGS to always be set.
1868 Required by HPUX 11.00 patch PHSS_26559. */
1869 if (!add_dynamic_entry (DT_FLAGS, (info)->flags))
1870 return FALSE;
1871
1872 if (plt)
1873 {
1874 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1875 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1876 || !add_dynamic_entry (DT_JMPREL, 0))
1877 return FALSE;
1878 }
1879
1880 if (relocs)
1881 {
1882 if (!add_dynamic_entry (DT_RELA, 0)
1883 || !add_dynamic_entry (DT_RELASZ, 0)
1884 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1885 return FALSE;
1886 }
1887
1888 if (reltext)
1889 {
1890 if (!add_dynamic_entry (DT_TEXTREL, 0))
1891 return FALSE;
1892 info->flags |= DF_TEXTREL;
1893 }
1894 }
1895 #undef add_dynamic_entry
1896
1897 return TRUE;
1898 }
1899
1900 /* Called after we have output the symbol into the dynamic symbol
1901 table, but before we output the symbol into the normal symbol
1902 table.
1903
1904 For some symbols we had to change their address when outputting
1905 the dynamic symbol table. We undo that change here so that
1906 the symbols have their expected value in the normal symbol
1907 table. Ick. */
1908
1909 static int
1910 elf64_hppa_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1911 const char *name,
1912 Elf_Internal_Sym *sym,
1913 asection *input_sec ATTRIBUTE_UNUSED,
1914 struct elf_link_hash_entry *eh)
1915 {
1916 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1917
1918 /* We may be called with the file symbol or section symbols.
1919 They never need munging, so it is safe to ignore them. */
1920 if (!name || !eh)
1921 return 1;
1922
1923 /* Function symbols for which we created .opd entries *may* have been
1924 munged by finish_dynamic_symbol and have to be un-munged here.
1925
1926 Note that finish_dynamic_symbol sometimes turns dynamic symbols
1927 into non-dynamic ones, so we initialize st_shndx to -1 in
1928 mark_exported_functions and check to see if it was overwritten
1929 here instead of just checking eh->dynindx. */
1930 if (hh->want_opd && hh->st_shndx != -1)
1931 {
1932 /* Restore the saved value and section index. */
1933 sym->st_value = hh->st_value;
1934 sym->st_shndx = hh->st_shndx;
1935 }
1936
1937 return 1;
1938 }
1939
1940 /* Finish up dynamic symbol handling. We set the contents of various
1941 dynamic sections here. */
1942
1943 static bfd_boolean
1944 elf64_hppa_finish_dynamic_symbol (bfd *output_bfd,
1945 struct bfd_link_info *info,
1946 struct elf_link_hash_entry *eh,
1947 Elf_Internal_Sym *sym)
1948 {
1949 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1950 asection *stub, *splt, *sopd, *spltrel;
1951 struct elf64_hppa_link_hash_table *hppa_info;
1952
1953 hppa_info = hppa_link_hash_table (info);
1954 if (hppa_info == NULL)
1955 return FALSE;
1956
1957 stub = hppa_info->stub_sec;
1958 splt = hppa_info->plt_sec;
1959 sopd = hppa_info->opd_sec;
1960 spltrel = hppa_info->plt_rel_sec;
1961
1962 /* Incredible. It is actually necessary to NOT use the symbol's real
1963 value when building the dynamic symbol table for a shared library.
1964 At least for symbols that refer to functions.
1965
1966 We will store a new value and section index into the symbol long
1967 enough to output it into the dynamic symbol table, then we restore
1968 the original values (in elf64_hppa_link_output_symbol_hook). */
1969 if (hh->want_opd)
1970 {
1971 BFD_ASSERT (sopd != NULL);
1972
1973 /* Save away the original value and section index so that we
1974 can restore them later. */
1975 hh->st_value = sym->st_value;
1976 hh->st_shndx = sym->st_shndx;
1977
1978 /* For the dynamic symbol table entry, we want the value to be
1979 address of this symbol's entry within the .opd section. */
1980 sym->st_value = (hh->opd_offset
1981 + sopd->output_offset
1982 + sopd->output_section->vma);
1983 sym->st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
1984 sopd->output_section);
1985 }
1986
1987 /* Initialize a .plt entry if requested. */
1988 if (hh->want_plt
1989 && elf64_hppa_dynamic_symbol_p (eh, info))
1990 {
1991 bfd_vma value;
1992 Elf_Internal_Rela rel;
1993 bfd_byte *loc;
1994
1995 BFD_ASSERT (splt != NULL && spltrel != NULL);
1996
1997 /* We do not actually care about the value in the PLT entry
1998 if we are creating a shared library and the symbol is
1999 still undefined, we create a dynamic relocation to fill
2000 in the correct value. */
2001 if (info->shared && eh->root.type == bfd_link_hash_undefined)
2002 value = 0;
2003 else
2004 value = (eh->root.u.def.value + eh->root.u.def.section->vma);
2005
2006 /* Fill in the entry in the procedure linkage table.
2007
2008 The format of a plt entry is
2009 <funcaddr> <__gp>.
2010
2011 plt_offset is the offset within the PLT section at which to
2012 install the PLT entry.
2013
2014 We are modifying the in-memory PLT contents here, so we do not add
2015 in the output_offset of the PLT section. */
2016
2017 bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset);
2018 value = _bfd_get_gp_value (splt->output_section->owner);
2019 bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset + 0x8);
2020
2021 /* Create a dynamic IPLT relocation for this entry.
2022
2023 We are creating a relocation in the output file's PLT section,
2024 which is included within the DLT secton. So we do need to include
2025 the PLT's output_offset in the computation of the relocation's
2026 address. */
2027 rel.r_offset = (hh->plt_offset + splt->output_offset
2028 + splt->output_section->vma);
2029 rel.r_info = ELF64_R_INFO (hh->eh.dynindx, R_PARISC_IPLT);
2030 rel.r_addend = 0;
2031
2032 loc = spltrel->contents;
2033 loc += spltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2034 bfd_elf64_swap_reloca_out (splt->output_section->owner, &rel, loc);
2035 }
2036
2037 /* Initialize an external call stub entry if requested. */
2038 if (hh->want_stub
2039 && elf64_hppa_dynamic_symbol_p (eh, info))
2040 {
2041 bfd_vma value;
2042 int insn;
2043 unsigned int max_offset;
2044
2045 BFD_ASSERT (stub != NULL);
2046
2047 /* Install the generic stub template.
2048
2049 We are modifying the contents of the stub section, so we do not
2050 need to include the stub section's output_offset here. */
2051 memcpy (stub->contents + hh->stub_offset, plt_stub, sizeof (plt_stub));
2052
2053 /* Fix up the first ldd instruction.
2054
2055 We are modifying the contents of the STUB section in memory,
2056 so we do not need to include its output offset in this computation.
2057
2058 Note the plt_offset value is the value of the PLT entry relative to
2059 the start of the PLT section. These instructions will reference
2060 data relative to the value of __gp, which may not necessarily have
2061 the same address as the start of the PLT section.
2062
2063 gp_offset contains the offset of __gp within the PLT section. */
2064 value = hh->plt_offset - hppa_info->gp_offset;
2065
2066 insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset);
2067 if (output_bfd->arch_info->mach >= 25)
2068 {
2069 /* Wide mode allows 16 bit offsets. */
2070 max_offset = 32768;
2071 insn &= ~ 0xfff1;
2072 insn |= re_assemble_16 ((int) value);
2073 }
2074 else
2075 {
2076 max_offset = 8192;
2077 insn &= ~ 0x3ff1;
2078 insn |= re_assemble_14 ((int) value);
2079 }
2080
2081 if ((value & 7) || value + max_offset >= 2*max_offset - 8)
2082 {
2083 (*_bfd_error_handler) (_("stub entry for %s cannot load .plt, dp offset = %ld"),
2084 hh->eh.root.root.string,
2085 (long) value);
2086 return FALSE;
2087 }
2088
2089 bfd_put_32 (stub->owner, (bfd_vma) insn,
2090 stub->contents + hh->stub_offset);
2091
2092 /* Fix up the second ldd instruction. */
2093 value += 8;
2094 insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset + 8);
2095 if (output_bfd->arch_info->mach >= 25)
2096 {
2097 insn &= ~ 0xfff1;
2098 insn |= re_assemble_16 ((int) value);
2099 }
2100 else
2101 {
2102 insn &= ~ 0x3ff1;
2103 insn |= re_assemble_14 ((int) value);
2104 }
2105 bfd_put_32 (stub->owner, (bfd_vma) insn,
2106 stub->contents + hh->stub_offset + 8);
2107 }
2108
2109 return TRUE;
2110 }
2111
2112 /* The .opd section contains FPTRs for each function this file
2113 exports. Initialize the FPTR entries. */
2114
2115 static bfd_boolean
2116 elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data)
2117 {
2118 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2119 struct bfd_link_info *info = (struct bfd_link_info *)data;
2120 struct elf64_hppa_link_hash_table *hppa_info;
2121 asection *sopd;
2122 asection *sopdrel;
2123
2124 hppa_info = hppa_link_hash_table (info);
2125 if (hppa_info == NULL)
2126 return FALSE;
2127
2128 sopd = hppa_info->opd_sec;
2129 sopdrel = hppa_info->opd_rel_sec;
2130
2131 if (hh->want_opd)
2132 {
2133 bfd_vma value;
2134
2135 /* The first two words of an .opd entry are zero.
2136
2137 We are modifying the contents of the OPD section in memory, so we
2138 do not need to include its output offset in this computation. */
2139 memset (sopd->contents + hh->opd_offset, 0, 16);
2140
2141 value = (eh->root.u.def.value
2142 + eh->root.u.def.section->output_section->vma
2143 + eh->root.u.def.section->output_offset);
2144
2145 /* The next word is the address of the function. */
2146 bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 16);
2147
2148 /* The last word is our local __gp value. */
2149 value = _bfd_get_gp_value (sopd->output_section->owner);
2150 bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 24);
2151 }
2152
2153 /* If we are generating a shared library, we must generate EPLT relocations
2154 for each entry in the .opd, even for static functions (they may have
2155 had their address taken). */
2156 if (info->shared && hh->want_opd)
2157 {
2158 Elf_Internal_Rela rel;
2159 bfd_byte *loc;
2160 int dynindx;
2161
2162 /* We may need to do a relocation against a local symbol, in
2163 which case we have to look up it's dynamic symbol index off
2164 the local symbol hash table. */
2165 if (eh->dynindx != -1)
2166 dynindx = eh->dynindx;
2167 else
2168 dynindx
2169 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2170 hh->sym_indx);
2171
2172 /* The offset of this relocation is the absolute address of the
2173 .opd entry for this symbol. */
2174 rel.r_offset = (hh->opd_offset + sopd->output_offset
2175 + sopd->output_section->vma);
2176
2177 /* If H is non-null, then we have an external symbol.
2178
2179 It is imperative that we use a different dynamic symbol for the
2180 EPLT relocation if the symbol has global scope.
2181
2182 In the dynamic symbol table, the function symbol will have a value
2183 which is address of the function's .opd entry.
2184
2185 Thus, we can not use that dynamic symbol for the EPLT relocation
2186 (if we did, the data in the .opd would reference itself rather
2187 than the actual address of the function). Instead we have to use
2188 a new dynamic symbol which has the same value as the original global
2189 function symbol.
2190
2191 We prefix the original symbol with a "." and use the new symbol in
2192 the EPLT relocation. This new symbol has already been recorded in
2193 the symbol table, we just have to look it up and use it.
2194
2195 We do not have such problems with static functions because we do
2196 not make their addresses in the dynamic symbol table point to
2197 the .opd entry. Ultimately this should be safe since a static
2198 function can not be directly referenced outside of its shared
2199 library.
2200
2201 We do have to play similar games for FPTR relocations in shared
2202 libraries, including those for static symbols. See the FPTR
2203 handling in elf64_hppa_finalize_dynreloc. */
2204 if (eh)
2205 {
2206 char *new_name;
2207 struct elf_link_hash_entry *nh;
2208
2209 new_name = alloca (strlen (eh->root.root.string) + 2);
2210 new_name[0] = '.';
2211 strcpy (new_name + 1, eh->root.root.string);
2212
2213 nh = elf_link_hash_lookup (elf_hash_table (info),
2214 new_name, TRUE, TRUE, FALSE);
2215
2216 /* All we really want from the new symbol is its dynamic
2217 symbol index. */
2218 if (nh)
2219 dynindx = nh->dynindx;
2220 }
2221
2222 rel.r_addend = 0;
2223 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_EPLT);
2224
2225 loc = sopdrel->contents;
2226 loc += sopdrel->reloc_count++ * sizeof (Elf64_External_Rela);
2227 bfd_elf64_swap_reloca_out (sopd->output_section->owner, &rel, loc);
2228 }
2229 return TRUE;
2230 }
2231
2232 /* The .dlt section contains addresses for items referenced through the
2233 dlt. Note that we can have a DLTIND relocation for a local symbol, thus
2234 we can not depend on finish_dynamic_symbol to initialize the .dlt. */
2235
2236 static bfd_boolean
2237 elf64_hppa_finalize_dlt (struct elf_link_hash_entry *eh, void *data)
2238 {
2239 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2240 struct bfd_link_info *info = (struct bfd_link_info *)data;
2241 struct elf64_hppa_link_hash_table *hppa_info;
2242 asection *sdlt, *sdltrel;
2243
2244 hppa_info = hppa_link_hash_table (info);
2245 if (hppa_info == NULL)
2246 return FALSE;
2247
2248 sdlt = hppa_info->dlt_sec;
2249 sdltrel = hppa_info->dlt_rel_sec;
2250
2251 /* H/DYN_H may refer to a local variable and we know it's
2252 address, so there is no need to create a relocation. Just install
2253 the proper value into the DLT, note this shortcut can not be
2254 skipped when building a shared library. */
2255 if (! info->shared && hh && hh->want_dlt)
2256 {
2257 bfd_vma value;
2258
2259 /* If we had an LTOFF_FPTR style relocation we want the DLT entry
2260 to point to the FPTR entry in the .opd section.
2261
2262 We include the OPD's output offset in this computation as
2263 we are referring to an absolute address in the resulting
2264 object file. */
2265 if (hh->want_opd)
2266 {
2267 value = (hh->opd_offset
2268 + hppa_info->opd_sec->output_offset
2269 + hppa_info->opd_sec->output_section->vma);
2270 }
2271 else if ((eh->root.type == bfd_link_hash_defined
2272 || eh->root.type == bfd_link_hash_defweak)
2273 && eh->root.u.def.section)
2274 {
2275 value = eh->root.u.def.value + eh->root.u.def.section->output_offset;
2276 if (eh->root.u.def.section->output_section)
2277 value += eh->root.u.def.section->output_section->vma;
2278 else
2279 value += eh->root.u.def.section->vma;
2280 }
2281 else
2282 /* We have an undefined function reference. */
2283 value = 0;
2284
2285 /* We do not need to include the output offset of the DLT section
2286 here because we are modifying the in-memory contents. */
2287 bfd_put_64 (sdlt->owner, value, sdlt->contents + hh->dlt_offset);
2288 }
2289
2290 /* Create a relocation for the DLT entry associated with this symbol.
2291 When building a shared library the symbol does not have to be dynamic. */
2292 if (hh->want_dlt
2293 && (elf64_hppa_dynamic_symbol_p (eh, info) || info->shared))
2294 {
2295 Elf_Internal_Rela rel;
2296 bfd_byte *loc;
2297 int dynindx;
2298
2299 /* We may need to do a relocation against a local symbol, in
2300 which case we have to look up it's dynamic symbol index off
2301 the local symbol hash table. */
2302 if (eh && eh->dynindx != -1)
2303 dynindx = eh->dynindx;
2304 else
2305 dynindx
2306 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2307 hh->sym_indx);
2308
2309 /* Create a dynamic relocation for this entry. Do include the output
2310 offset of the DLT entry since we need an absolute address in the
2311 resulting object file. */
2312 rel.r_offset = (hh->dlt_offset + sdlt->output_offset
2313 + sdlt->output_section->vma);
2314 if (eh && eh->type == STT_FUNC)
2315 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_FPTR64);
2316 else
2317 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_DIR64);
2318 rel.r_addend = 0;
2319
2320 loc = sdltrel->contents;
2321 loc += sdltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2322 bfd_elf64_swap_reloca_out (sdlt->output_section->owner, &rel, loc);
2323 }
2324 return TRUE;
2325 }
2326
2327 /* Finalize the dynamic relocations. Specifically the FPTR relocations
2328 for dynamic functions used to initialize static data. */
2329
2330 static bfd_boolean
2331 elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
2332 void *data)
2333 {
2334 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2335 struct bfd_link_info *info = (struct bfd_link_info *)data;
2336 struct elf64_hppa_link_hash_table *hppa_info;
2337 int dynamic_symbol;
2338
2339 dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, info);
2340
2341 if (!dynamic_symbol && !info->shared)
2342 return TRUE;
2343
2344 if (hh->reloc_entries)
2345 {
2346 struct elf64_hppa_dyn_reloc_entry *rent;
2347 int dynindx;
2348
2349 hppa_info = hppa_link_hash_table (info);
2350 if (hppa_info == NULL)
2351 return FALSE;
2352
2353 /* We may need to do a relocation against a local symbol, in
2354 which case we have to look up it's dynamic symbol index off
2355 the local symbol hash table. */
2356 if (eh->dynindx != -1)
2357 dynindx = eh->dynindx;
2358 else
2359 dynindx
2360 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2361 hh->sym_indx);
2362
2363 for (rent = hh->reloc_entries; rent; rent = rent->next)
2364 {
2365 Elf_Internal_Rela rel;
2366 bfd_byte *loc;
2367
2368 /* Allocate one iff we are building a shared library, the relocation
2369 isn't a R_PARISC_FPTR64, or we don't want an opd entry. */
2370 if (!info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2371 continue;
2372
2373 /* Create a dynamic relocation for this entry.
2374
2375 We need the output offset for the reloc's section because
2376 we are creating an absolute address in the resulting object
2377 file. */
2378 rel.r_offset = (rent->offset + rent->sec->output_offset
2379 + rent->sec->output_section->vma);
2380
2381 /* An FPTR64 relocation implies that we took the address of
2382 a function and that the function has an entry in the .opd
2383 section. We want the FPTR64 relocation to reference the
2384 entry in .opd.
2385
2386 We could munge the symbol value in the dynamic symbol table
2387 (in fact we already do for functions with global scope) to point
2388 to the .opd entry. Then we could use that dynamic symbol in
2389 this relocation.
2390
2391 Or we could do something sensible, not munge the symbol's
2392 address and instead just use a different symbol to reference
2393 the .opd entry. At least that seems sensible until you
2394 realize there's no local dynamic symbols we can use for that
2395 purpose. Thus the hair in the check_relocs routine.
2396
2397 We use a section symbol recorded by check_relocs as the
2398 base symbol for the relocation. The addend is the difference
2399 between the section symbol and the address of the .opd entry. */
2400 if (info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2401 {
2402 bfd_vma value, value2;
2403
2404 /* First compute the address of the opd entry for this symbol. */
2405 value = (hh->opd_offset
2406 + hppa_info->opd_sec->output_section->vma
2407 + hppa_info->opd_sec->output_offset);
2408
2409 /* Compute the value of the start of the section with
2410 the relocation. */
2411 value2 = (rent->sec->output_section->vma
2412 + rent->sec->output_offset);
2413
2414 /* Compute the difference between the start of the section
2415 with the relocation and the opd entry. */
2416 value -= value2;
2417
2418 /* The result becomes the addend of the relocation. */
2419 rel.r_addend = value;
2420
2421 /* The section symbol becomes the symbol for the dynamic
2422 relocation. */
2423 dynindx
2424 = _bfd_elf_link_lookup_local_dynindx (info,
2425 rent->sec->owner,
2426 rent->sec_symndx);
2427 }
2428 else
2429 rel.r_addend = rent->addend;
2430
2431 rel.r_info = ELF64_R_INFO (dynindx, rent->type);
2432
2433 loc = hppa_info->other_rel_sec->contents;
2434 loc += (hppa_info->other_rel_sec->reloc_count++
2435 * sizeof (Elf64_External_Rela));
2436 bfd_elf64_swap_reloca_out (hppa_info->other_rel_sec->output_section->owner,
2437 &rel, loc);
2438 }
2439 }
2440
2441 return TRUE;
2442 }
2443
2444 /* Used to decide how to sort relocs in an optimal manner for the
2445 dynamic linker, before writing them out. */
2446
2447 static enum elf_reloc_type_class
2448 elf64_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
2449 {
2450 if (ELF64_R_SYM (rela->r_info) == STN_UNDEF)
2451 return reloc_class_relative;
2452
2453 switch ((int) ELF64_R_TYPE (rela->r_info))
2454 {
2455 case R_PARISC_IPLT:
2456 return reloc_class_plt;
2457 case R_PARISC_COPY:
2458 return reloc_class_copy;
2459 default:
2460 return reloc_class_normal;
2461 }
2462 }
2463
2464 /* Finish up the dynamic sections. */
2465
2466 static bfd_boolean
2467 elf64_hppa_finish_dynamic_sections (bfd *output_bfd,
2468 struct bfd_link_info *info)
2469 {
2470 bfd *dynobj;
2471 asection *sdyn;
2472 struct elf64_hppa_link_hash_table *hppa_info;
2473
2474 hppa_info = hppa_link_hash_table (info);
2475 if (hppa_info == NULL)
2476 return FALSE;
2477
2478 /* Finalize the contents of the .opd section. */
2479 elf_link_hash_traverse (elf_hash_table (info),
2480 elf64_hppa_finalize_opd,
2481 info);
2482
2483 elf_link_hash_traverse (elf_hash_table (info),
2484 elf64_hppa_finalize_dynreloc,
2485 info);
2486
2487 /* Finalize the contents of the .dlt section. */
2488 dynobj = elf_hash_table (info)->dynobj;
2489 /* Finalize the contents of the .dlt section. */
2490 elf_link_hash_traverse (elf_hash_table (info),
2491 elf64_hppa_finalize_dlt,
2492 info);
2493
2494 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2495
2496 if (elf_hash_table (info)->dynamic_sections_created)
2497 {
2498 Elf64_External_Dyn *dyncon, *dynconend;
2499
2500 BFD_ASSERT (sdyn != NULL);
2501
2502 dyncon = (Elf64_External_Dyn *) sdyn->contents;
2503 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
2504 for (; dyncon < dynconend; dyncon++)
2505 {
2506 Elf_Internal_Dyn dyn;
2507 asection *s;
2508
2509 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2510
2511 switch (dyn.d_tag)
2512 {
2513 default:
2514 break;
2515
2516 case DT_HP_LOAD_MAP:
2517 /* Compute the absolute address of 16byte scratchpad area
2518 for the dynamic linker.
2519
2520 By convention the linker script will allocate the scratchpad
2521 area at the start of the .data section. So all we have to
2522 to is find the start of the .data section. */
2523 s = bfd_get_section_by_name (output_bfd, ".data");
2524 dyn.d_un.d_ptr = s->vma;
2525 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2526 break;
2527
2528 case DT_PLTGOT:
2529 /* HP's use PLTGOT to set the GOT register. */
2530 dyn.d_un.d_ptr = _bfd_get_gp_value (output_bfd);
2531 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2532 break;
2533
2534 case DT_JMPREL:
2535 s = hppa_info->plt_rel_sec;
2536 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2537 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2538 break;
2539
2540 case DT_PLTRELSZ:
2541 s = hppa_info->plt_rel_sec;
2542 dyn.d_un.d_val = s->size;
2543 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2544 break;
2545
2546 case DT_RELA:
2547 s = hppa_info->other_rel_sec;
2548 if (! s || ! s->size)
2549 s = hppa_info->dlt_rel_sec;
2550 if (! s || ! s->size)
2551 s = hppa_info->opd_rel_sec;
2552 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2553 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2554 break;
2555
2556 case DT_RELASZ:
2557 s = hppa_info->other_rel_sec;
2558 dyn.d_un.d_val = s->size;
2559 s = hppa_info->dlt_rel_sec;
2560 dyn.d_un.d_val += s->size;
2561 s = hppa_info->opd_rel_sec;
2562 dyn.d_un.d_val += s->size;
2563 /* There is some question about whether or not the size of
2564 the PLT relocs should be included here. HP's tools do
2565 it, so we'll emulate them. */
2566 s = hppa_info->plt_rel_sec;
2567 dyn.d_un.d_val += s->size;
2568 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2569 break;
2570
2571 }
2572 }
2573 }
2574
2575 return TRUE;
2576 }
2577
2578 /* Support for core dump NOTE sections. */
2579
2580 static bfd_boolean
2581 elf64_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2582 {
2583 int offset;
2584 size_t size;
2585
2586 switch (note->descsz)
2587 {
2588 default:
2589 return FALSE;
2590
2591 case 760: /* Linux/hppa */
2592 /* pr_cursig */
2593 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2594
2595 /* pr_pid */
2596 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2597
2598 /* pr_reg */
2599 offset = 112;
2600 size = 640;
2601
2602 break;
2603 }
2604
2605 /* Make a ".reg/999" section. */
2606 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2607 size, note->descpos + offset);
2608 }
2609
2610 static bfd_boolean
2611 elf64_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2612 {
2613 char * command;
2614 int n;
2615
2616 switch (note->descsz)
2617 {
2618 default:
2619 return FALSE;
2620
2621 case 136: /* Linux/hppa elf_prpsinfo. */
2622 elf_tdata (abfd)->core_program
2623 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2624 elf_tdata (abfd)->core_command
2625 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2626 }
2627
2628 /* Note that for some reason, a spurious space is tacked
2629 onto the end of the args in some (at least one anyway)
2630 implementations, so strip it off if it exists. */
2631 command = elf_tdata (abfd)->core_command;
2632 n = strlen (command);
2633
2634 if (0 < n && command[n - 1] == ' ')
2635 command[n - 1] = '\0';
2636
2637 return TRUE;
2638 }
2639
2640 /* Return the number of additional phdrs we will need.
2641
2642 The generic ELF code only creates PT_PHDRs for executables. The HP
2643 dynamic linker requires PT_PHDRs for dynamic libraries too.
2644
2645 This routine indicates that the backend needs one additional program
2646 header for that case.
2647
2648 Note we do not have access to the link info structure here, so we have
2649 to guess whether or not we are building a shared library based on the
2650 existence of a .interp section. */
2651
2652 static int
2653 elf64_hppa_additional_program_headers (bfd *abfd,
2654 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2655 {
2656 asection *s;
2657
2658 /* If we are creating a shared library, then we have to create a
2659 PT_PHDR segment. HP's dynamic linker chokes without it. */
2660 s = bfd_get_section_by_name (abfd, ".interp");
2661 if (! s)
2662 return 1;
2663 return 0;
2664 }
2665
2666 /* Allocate and initialize any program headers required by this
2667 specific backend.
2668
2669 The generic ELF code only creates PT_PHDRs for executables. The HP
2670 dynamic linker requires PT_PHDRs for dynamic libraries too.
2671
2672 This allocates the PT_PHDR and initializes it in a manner suitable
2673 for the HP linker.
2674
2675 Note we do not have access to the link info structure here, so we have
2676 to guess whether or not we are building a shared library based on the
2677 existence of a .interp section. */
2678
2679 static bfd_boolean
2680 elf64_hppa_modify_segment_map (bfd *abfd,
2681 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2682 {
2683 struct elf_segment_map *m;
2684 asection *s;
2685
2686 s = bfd_get_section_by_name (abfd, ".interp");
2687 if (! s)
2688 {
2689 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2690 if (m->p_type == PT_PHDR)
2691 break;
2692 if (m == NULL)
2693 {
2694 m = ((struct elf_segment_map *)
2695 bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
2696 if (m == NULL)
2697 return FALSE;
2698
2699 m->p_type = PT_PHDR;
2700 m->p_flags = PF_R | PF_X;
2701 m->p_flags_valid = 1;
2702 m->p_paddr_valid = 1;
2703 m->includes_phdrs = 1;
2704
2705 m->next = elf_tdata (abfd)->segment_map;
2706 elf_tdata (abfd)->segment_map = m;
2707 }
2708 }
2709
2710 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2711 if (m->p_type == PT_LOAD)
2712 {
2713 unsigned int i;
2714
2715 for (i = 0; i < m->count; i++)
2716 {
2717 /* The code "hint" is not really a hint. It is a requirement
2718 for certain versions of the HP dynamic linker. Worse yet,
2719 it must be set even if the shared library does not have
2720 any code in its "text" segment (thus the check for .hash
2721 to catch this situation). */
2722 if (m->sections[i]->flags & SEC_CODE
2723 || (strcmp (m->sections[i]->name, ".hash") == 0))
2724 m->p_flags |= (PF_X | PF_HP_CODE);
2725 }
2726 }
2727
2728 return TRUE;
2729 }
2730
2731 /* Called when writing out an object file to decide the type of a
2732 symbol. */
2733 static int
2734 elf64_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym,
2735 int type)
2736 {
2737 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
2738 return STT_PARISC_MILLI;
2739 else
2740 return type;
2741 }
2742
2743 /* Support HP specific sections for core files. */
2744
2745 static bfd_boolean
2746 elf64_hppa_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int sec_index,
2747 const char *typename)
2748 {
2749 if (hdr->p_type == PT_HP_CORE_KERNEL)
2750 {
2751 asection *sect;
2752
2753 if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2754 return FALSE;
2755
2756 sect = bfd_make_section_anyway (abfd, ".kernel");
2757 if (sect == NULL)
2758 return FALSE;
2759 sect->size = hdr->p_filesz;
2760 sect->filepos = hdr->p_offset;
2761 sect->flags = SEC_HAS_CONTENTS | SEC_READONLY;
2762 return TRUE;
2763 }
2764
2765 if (hdr->p_type == PT_HP_CORE_PROC)
2766 {
2767 int sig;
2768
2769 if (bfd_seek (abfd, hdr->p_offset, SEEK_SET) != 0)
2770 return FALSE;
2771 if (bfd_bread (&sig, 4, abfd) != 4)
2772 return FALSE;
2773
2774 elf_tdata (abfd)->core_signal = sig;
2775
2776 if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2777 return FALSE;
2778
2779 /* GDB uses the ".reg" section to read register contents. */
2780 return _bfd_elfcore_make_pseudosection (abfd, ".reg", hdr->p_filesz,
2781 hdr->p_offset);
2782 }
2783
2784 if (hdr->p_type == PT_HP_CORE_LOADABLE
2785 || hdr->p_type == PT_HP_CORE_STACK
2786 || hdr->p_type == PT_HP_CORE_MMF)
2787 hdr->p_type = PT_LOAD;
2788
2789 return _bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename);
2790 }
2791
2792 /* Hook called by the linker routine which adds symbols from an object
2793 file. HP's libraries define symbols with HP specific section
2794 indices, which we have to handle. */
2795
2796 static bfd_boolean
2797 elf_hppa_add_symbol_hook (bfd *abfd,
2798 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2799 Elf_Internal_Sym *sym,
2800 const char **namep ATTRIBUTE_UNUSED,
2801 flagword *flagsp ATTRIBUTE_UNUSED,
2802 asection **secp,
2803 bfd_vma *valp)
2804 {
2805 unsigned int sec_index = sym->st_shndx;
2806
2807 switch (sec_index)
2808 {
2809 case SHN_PARISC_ANSI_COMMON:
2810 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
2811 (*secp)->flags |= SEC_IS_COMMON;
2812 *valp = sym->st_size;
2813 break;
2814
2815 case SHN_PARISC_HUGE_COMMON:
2816 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
2817 (*secp)->flags |= SEC_IS_COMMON;
2818 *valp = sym->st_size;
2819 break;
2820 }
2821
2822 return TRUE;
2823 }
2824
2825 static bfd_boolean
2826 elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2827 void *data)
2828 {
2829 struct bfd_link_info *info = data;
2830
2831 /* If we are not creating a shared library, and this symbol is
2832 referenced by a shared library but is not defined anywhere, then
2833 the generic code will warn that it is undefined.
2834
2835 This behavior is undesirable on HPs since the standard shared
2836 libraries contain references to undefined symbols.
2837
2838 So we twiddle the flags associated with such symbols so that they
2839 will not trigger the warning. ?!? FIXME. This is horribly fragile.
2840
2841 Ultimately we should have better controls over the generic ELF BFD
2842 linker code. */
2843 if (! info->relocatable
2844 && info->unresolved_syms_in_shared_libs != RM_IGNORE
2845 && h->root.type == bfd_link_hash_undefined
2846 && h->ref_dynamic
2847 && !h->ref_regular)
2848 {
2849 h->ref_dynamic = 0;
2850 h->pointer_equality_needed = 1;
2851 }
2852
2853 return TRUE;
2854 }
2855
2856 static bfd_boolean
2857 elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2858 void *data)
2859 {
2860 struct bfd_link_info *info = data;
2861
2862 /* If we are not creating a shared library, and this symbol is
2863 referenced by a shared library but is not defined anywhere, then
2864 the generic code will warn that it is undefined.
2865
2866 This behavior is undesirable on HPs since the standard shared
2867 libraries contain references to undefined symbols.
2868
2869 So we twiddle the flags associated with such symbols so that they
2870 will not trigger the warning. ?!? FIXME. This is horribly fragile.
2871
2872 Ultimately we should have better controls over the generic ELF BFD
2873 linker code. */
2874 if (! info->relocatable
2875 && info->unresolved_syms_in_shared_libs != RM_IGNORE
2876 && h->root.type == bfd_link_hash_undefined
2877 && !h->ref_dynamic
2878 && !h->ref_regular
2879 && h->pointer_equality_needed)
2880 {
2881 h->ref_dynamic = 1;
2882 h->pointer_equality_needed = 0;
2883 }
2884
2885 return TRUE;
2886 }
2887
2888 static bfd_boolean
2889 elf_hppa_is_dynamic_loader_symbol (const char *name)
2890 {
2891 return (! strcmp (name, "__CPU_REVISION")
2892 || ! strcmp (name, "__CPU_KEYBITS_1")
2893 || ! strcmp (name, "__SYSTEM_ID_D")
2894 || ! strcmp (name, "__FPU_MODEL")
2895 || ! strcmp (name, "__FPU_REVISION")
2896 || ! strcmp (name, "__ARGC")
2897 || ! strcmp (name, "__ARGV")
2898 || ! strcmp (name, "__ENVP")
2899 || ! strcmp (name, "__TLS_SIZE_D")
2900 || ! strcmp (name, "__LOAD_INFO")
2901 || ! strcmp (name, "__systab"));
2902 }
2903
2904 /* Record the lowest address for the data and text segments. */
2905 static void
2906 elf_hppa_record_segment_addrs (bfd *abfd,
2907 asection *section,
2908 void *data)
2909 {
2910 struct elf64_hppa_link_hash_table *hppa_info = data;
2911
2912 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2913 {
2914 bfd_vma value;
2915 Elf_Internal_Phdr *p;
2916
2917 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
2918 BFD_ASSERT (p != NULL);
2919 value = p->p_vaddr;
2920
2921 if (section->flags & SEC_READONLY)
2922 {
2923 if (value < hppa_info->text_segment_base)
2924 hppa_info->text_segment_base = value;
2925 }
2926 else
2927 {
2928 if (value < hppa_info->data_segment_base)
2929 hppa_info->data_segment_base = value;
2930 }
2931 }
2932 }
2933
2934 /* Called after we have seen all the input files/sections, but before
2935 final symbol resolution and section placement has been determined.
2936
2937 We use this hook to (possibly) provide a value for __gp, then we
2938 fall back to the generic ELF final link routine. */
2939
2940 static bfd_boolean
2941 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
2942 {
2943 bfd_boolean retval;
2944 struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
2945
2946 if (hppa_info == NULL)
2947 return FALSE;
2948
2949 if (! info->relocatable)
2950 {
2951 struct elf_link_hash_entry *gp;
2952 bfd_vma gp_val;
2953
2954 /* The linker script defines a value for __gp iff it was referenced
2955 by one of the objects being linked. First try to find the symbol
2956 in the hash table. If that fails, just compute the value __gp
2957 should have had. */
2958 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
2959 FALSE, FALSE);
2960
2961 if (gp)
2962 {
2963
2964 /* Adjust the value of __gp as we may want to slide it into the
2965 .plt section so that the stubs can access PLT entries without
2966 using an addil sequence. */
2967 gp->root.u.def.value += hppa_info->gp_offset;
2968
2969 gp_val = (gp->root.u.def.section->output_section->vma
2970 + gp->root.u.def.section->output_offset
2971 + gp->root.u.def.value);
2972 }
2973 else
2974 {
2975 asection *sec;
2976
2977 /* First look for a .plt section. If found, then __gp is the
2978 address of the .plt + gp_offset.
2979
2980 If no .plt is found, then look for .dlt, .opd and .data (in
2981 that order) and set __gp to the base address of whichever
2982 section is found first. */
2983
2984 sec = hppa_info->plt_sec;
2985 if (sec && ! (sec->flags & SEC_EXCLUDE))
2986 gp_val = (sec->output_offset
2987 + sec->output_section->vma
2988 + hppa_info->gp_offset);
2989 else
2990 {
2991 sec = hppa_info->dlt_sec;
2992 if (!sec || (sec->flags & SEC_EXCLUDE))
2993 sec = hppa_info->opd_sec;
2994 if (!sec || (sec->flags & SEC_EXCLUDE))
2995 sec = bfd_get_section_by_name (abfd, ".data");
2996 if (!sec || (sec->flags & SEC_EXCLUDE))
2997 gp_val = 0;
2998 else
2999 gp_val = sec->output_offset + sec->output_section->vma;
3000 }
3001 }
3002
3003 /* Install whatever value we found/computed for __gp. */
3004 _bfd_set_gp_value (abfd, gp_val);
3005 }
3006
3007 /* We need to know the base of the text and data segments so that we
3008 can perform SEGREL relocations. We will record the base addresses
3009 when we encounter the first SEGREL relocation. */
3010 hppa_info->text_segment_base = (bfd_vma)-1;
3011 hppa_info->data_segment_base = (bfd_vma)-1;
3012
3013 /* HP's shared libraries have references to symbols that are not
3014 defined anywhere. The generic ELF BFD linker code will complain
3015 about such symbols.
3016
3017 So we detect the losing case and arrange for the flags on the symbol
3018 to indicate that it was never referenced. This keeps the generic
3019 ELF BFD link code happy and appears to not create any secondary
3020 problems. Ultimately we need a way to control the behavior of the
3021 generic ELF BFD link code better. */
3022 elf_link_hash_traverse (elf_hash_table (info),
3023 elf_hppa_unmark_useless_dynamic_symbols,
3024 info);
3025
3026 /* Invoke the regular ELF backend linker to do all the work. */
3027 retval = bfd_elf_final_link (abfd, info);
3028
3029 elf_link_hash_traverse (elf_hash_table (info),
3030 elf_hppa_remark_useless_dynamic_symbols,
3031 info);
3032
3033 /* If we're producing a final executable, sort the contents of the
3034 unwind section. */
3035 if (retval && !info->relocatable)
3036 retval = elf_hppa_sort_unwind (abfd);
3037
3038 return retval;
3039 }
3040
3041 /* Relocate the given INSN. VALUE should be the actual value we want
3042 to insert into the instruction, ie by this point we should not be
3043 concerned with computing an offset relative to the DLT, PC, etc.
3044 Instead this routine is meant to handle the bit manipulations needed
3045 to insert the relocation into the given instruction. */
3046
3047 static int
3048 elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
3049 {
3050 switch (r_type)
3051 {
3052 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
3053 the "B" instruction. */
3054 case R_PARISC_PCREL22F:
3055 case R_PARISC_PCREL22C:
3056 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
3057
3058 /* This is any 12 bit branch. */
3059 case R_PARISC_PCREL12F:
3060 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
3061
3062 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
3063 to the "B" instruction as well as BE. */
3064 case R_PARISC_PCREL17F:
3065 case R_PARISC_DIR17F:
3066 case R_PARISC_DIR17R:
3067 case R_PARISC_PCREL17C:
3068 case R_PARISC_PCREL17R:
3069 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
3070
3071 /* ADDIL or LDIL instructions. */
3072 case R_PARISC_DLTREL21L:
3073 case R_PARISC_DLTIND21L:
3074 case R_PARISC_LTOFF_FPTR21L:
3075 case R_PARISC_PCREL21L:
3076 case R_PARISC_LTOFF_TP21L:
3077 case R_PARISC_DPREL21L:
3078 case R_PARISC_PLTOFF21L:
3079 case R_PARISC_DIR21L:
3080 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
3081
3082 /* LDO and integer loads/stores with 14 bit displacements. */
3083 case R_PARISC_DLTREL14R:
3084 case R_PARISC_DLTREL14F:
3085 case R_PARISC_DLTIND14R:
3086 case R_PARISC_DLTIND14F:
3087 case R_PARISC_LTOFF_FPTR14R:
3088 case R_PARISC_PCREL14R:
3089 case R_PARISC_PCREL14F:
3090 case R_PARISC_LTOFF_TP14R:
3091 case R_PARISC_LTOFF_TP14F:
3092 case R_PARISC_DPREL14R:
3093 case R_PARISC_DPREL14F:
3094 case R_PARISC_PLTOFF14R:
3095 case R_PARISC_PLTOFF14F:
3096 case R_PARISC_DIR14R:
3097 case R_PARISC_DIR14F:
3098 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
3099
3100 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
3101 case R_PARISC_LTOFF_FPTR16F:
3102 case R_PARISC_PCREL16F:
3103 case R_PARISC_LTOFF_TP16F:
3104 case R_PARISC_GPREL16F:
3105 case R_PARISC_PLTOFF16F:
3106 case R_PARISC_DIR16F:
3107 case R_PARISC_LTOFF16F:
3108 return (insn & ~0xffff) | re_assemble_16 (sym_value);
3109
3110 /* Doubleword loads and stores with a 14 bit displacement. */
3111 case R_PARISC_DLTREL14DR:
3112 case R_PARISC_DLTIND14DR:
3113 case R_PARISC_LTOFF_FPTR14DR:
3114 case R_PARISC_LTOFF_FPTR16DF:
3115 case R_PARISC_PCREL14DR:
3116 case R_PARISC_PCREL16DF:
3117 case R_PARISC_LTOFF_TP14DR:
3118 case R_PARISC_LTOFF_TP16DF:
3119 case R_PARISC_DPREL14DR:
3120 case R_PARISC_GPREL16DF:
3121 case R_PARISC_PLTOFF14DR:
3122 case R_PARISC_PLTOFF16DF:
3123 case R_PARISC_DIR14DR:
3124 case R_PARISC_DIR16DF:
3125 case R_PARISC_LTOFF16DF:
3126 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
3127 | ((sym_value & 0x1ff8) << 1));
3128
3129 /* Floating point single word load/store instructions. */
3130 case R_PARISC_DLTREL14WR:
3131 case R_PARISC_DLTIND14WR:
3132 case R_PARISC_LTOFF_FPTR14WR:
3133 case R_PARISC_LTOFF_FPTR16WF:
3134 case R_PARISC_PCREL14WR:
3135 case R_PARISC_PCREL16WF:
3136 case R_PARISC_LTOFF_TP14WR:
3137 case R_PARISC_LTOFF_TP16WF:
3138 case R_PARISC_DPREL14WR:
3139 case R_PARISC_GPREL16WF:
3140 case R_PARISC_PLTOFF14WR:
3141 case R_PARISC_PLTOFF16WF:
3142 case R_PARISC_DIR16WF:
3143 case R_PARISC_DIR14WR:
3144 case R_PARISC_LTOFF16WF:
3145 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
3146 | ((sym_value & 0x1ffc) << 1));
3147
3148 default:
3149 return insn;
3150 }
3151 }
3152
3153 /* Compute the value for a relocation (REL) during a final link stage,
3154 then insert the value into the proper location in CONTENTS.
3155
3156 VALUE is a tentative value for the relocation and may be overridden
3157 and modified here based on the specific relocation to be performed.
3158
3159 For example we do conversions for PC-relative branches in this routine
3160 or redirection of calls to external routines to stubs.
3161
3162 The work of actually applying the relocation is left to a helper
3163 routine in an attempt to reduce the complexity and size of this
3164 function. */
3165
3166 static bfd_reloc_status_type
3167 elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
3168 bfd *input_bfd,
3169 bfd *output_bfd,
3170 asection *input_section,
3171 bfd_byte *contents,
3172 bfd_vma value,
3173 struct bfd_link_info *info,
3174 asection *sym_sec,
3175 struct elf_link_hash_entry *eh)
3176 {
3177 struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
3178 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
3179 bfd_vma *local_offsets;
3180 Elf_Internal_Shdr *symtab_hdr;
3181 int insn;
3182 bfd_vma max_branch_offset = 0;
3183 bfd_vma offset = rel->r_offset;
3184 bfd_signed_vma addend = rel->r_addend;
3185 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3186 unsigned int r_symndx = ELF_R_SYM (rel->r_info);
3187 unsigned int r_type = howto->type;
3188 bfd_byte *hit_data = contents + offset;
3189
3190 if (hppa_info == NULL)
3191 return bfd_reloc_notsupported;
3192
3193 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3194 local_offsets = elf_local_got_offsets (input_bfd);
3195 insn = bfd_get_32 (input_bfd, hit_data);
3196
3197 switch (r_type)
3198 {
3199 case R_PARISC_NONE:
3200 break;
3201
3202 /* Basic function call support.
3203
3204 Note for a call to a function defined in another dynamic library
3205 we want to redirect the call to a stub. */
3206
3207 /* PC relative relocs without an implicit offset. */
3208 case R_PARISC_PCREL21L:
3209 case R_PARISC_PCREL14R:
3210 case R_PARISC_PCREL14F:
3211 case R_PARISC_PCREL14WR:
3212 case R_PARISC_PCREL14DR:
3213 case R_PARISC_PCREL16F:
3214 case R_PARISC_PCREL16WF:
3215 case R_PARISC_PCREL16DF:
3216 {
3217 /* If this is a call to a function defined in another dynamic
3218 library, then redirect the call to the local stub for this
3219 function. */
3220 if (sym_sec == NULL || sym_sec->output_section == NULL)
3221 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3222 + hppa_info->stub_sec->output_section->vma);
3223
3224 /* Turn VALUE into a proper PC relative address. */
3225 value -= (offset + input_section->output_offset
3226 + input_section->output_section->vma);
3227
3228 /* Adjust for any field selectors. */
3229 if (r_type == R_PARISC_PCREL21L)
3230 value = hppa_field_adjust (value, -8 + addend, e_lsel);
3231 else if (r_type == R_PARISC_PCREL14F
3232 || r_type == R_PARISC_PCREL16F
3233 || r_type == R_PARISC_PCREL16WF
3234 || r_type == R_PARISC_PCREL16DF)
3235 value = hppa_field_adjust (value, -8 + addend, e_fsel);
3236 else
3237 value = hppa_field_adjust (value, -8 + addend, e_rsel);
3238
3239 /* Apply the relocation to the given instruction. */
3240 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3241 break;
3242 }
3243
3244 case R_PARISC_PCREL12F:
3245 case R_PARISC_PCREL22F:
3246 case R_PARISC_PCREL17F:
3247 case R_PARISC_PCREL22C:
3248 case R_PARISC_PCREL17C:
3249 case R_PARISC_PCREL17R:
3250 {
3251 /* If this is a call to a function defined in another dynamic
3252 library, then redirect the call to the local stub for this
3253 function. */
3254 if (sym_sec == NULL || sym_sec->output_section == NULL)
3255 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3256 + hppa_info->stub_sec->output_section->vma);
3257
3258 /* Turn VALUE into a proper PC relative address. */
3259 value -= (offset + input_section->output_offset
3260 + input_section->output_section->vma);
3261 addend -= 8;
3262
3263 if (r_type == (unsigned int) R_PARISC_PCREL22F)
3264 max_branch_offset = (1 << (22-1)) << 2;
3265 else if (r_type == (unsigned int) R_PARISC_PCREL17F)
3266 max_branch_offset = (1 << (17-1)) << 2;
3267 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3268 max_branch_offset = (1 << (12-1)) << 2;
3269
3270 /* Make sure we can reach the branch target. */
3271 if (max_branch_offset != 0
3272 && value + addend + max_branch_offset >= 2*max_branch_offset)
3273 {
3274 (*_bfd_error_handler)
3275 (_("%B(%A+0x%lx): cannot reach %s"),
3276 input_bfd,
3277 input_section,
3278 offset,
3279 eh->root.root.string);
3280 bfd_set_error (bfd_error_bad_value);
3281 return bfd_reloc_notsupported;
3282 }
3283
3284 /* Adjust for any field selectors. */
3285 if (r_type == R_PARISC_PCREL17R)
3286 value = hppa_field_adjust (value, addend, e_rsel);
3287 else
3288 value = hppa_field_adjust (value, addend, e_fsel);
3289
3290 /* All branches are implicitly shifted by 2 places. */
3291 value >>= 2;
3292
3293 /* Apply the relocation to the given instruction. */
3294 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3295 break;
3296 }
3297
3298 /* Indirect references to data through the DLT. */
3299 case R_PARISC_DLTIND14R:
3300 case R_PARISC_DLTIND14F:
3301 case R_PARISC_DLTIND14DR:
3302 case R_PARISC_DLTIND14WR:
3303 case R_PARISC_DLTIND21L:
3304 case R_PARISC_LTOFF_FPTR14R:
3305 case R_PARISC_LTOFF_FPTR14DR:
3306 case R_PARISC_LTOFF_FPTR14WR:
3307 case R_PARISC_LTOFF_FPTR21L:
3308 case R_PARISC_LTOFF_FPTR16F:
3309 case R_PARISC_LTOFF_FPTR16WF:
3310 case R_PARISC_LTOFF_FPTR16DF:
3311 case R_PARISC_LTOFF_TP21L:
3312 case R_PARISC_LTOFF_TP14R:
3313 case R_PARISC_LTOFF_TP14F:
3314 case R_PARISC_LTOFF_TP14WR:
3315 case R_PARISC_LTOFF_TP14DR:
3316 case R_PARISC_LTOFF_TP16F:
3317 case R_PARISC_LTOFF_TP16WF:
3318 case R_PARISC_LTOFF_TP16DF:
3319 case R_PARISC_LTOFF16F:
3320 case R_PARISC_LTOFF16WF:
3321 case R_PARISC_LTOFF16DF:
3322 {
3323 bfd_vma off;
3324
3325 /* If this relocation was against a local symbol, then we still
3326 have not set up the DLT entry (it's not convenient to do so
3327 in the "finalize_dlt" routine because it is difficult to get
3328 to the local symbol's value).
3329
3330 So, if this is a local symbol (h == NULL), then we need to
3331 fill in its DLT entry.
3332
3333 Similarly we may still need to set up an entry in .opd for
3334 a local function which had its address taken. */
3335 if (hh == NULL)
3336 {
3337 bfd_vma *local_opd_offsets, *local_dlt_offsets;
3338
3339 if (local_offsets == NULL)
3340 abort ();
3341
3342 /* Now do .opd creation if needed. */
3343 if (r_type == R_PARISC_LTOFF_FPTR14R
3344 || r_type == R_PARISC_LTOFF_FPTR14DR
3345 || r_type == R_PARISC_LTOFF_FPTR14WR
3346 || r_type == R_PARISC_LTOFF_FPTR21L
3347 || r_type == R_PARISC_LTOFF_FPTR16F
3348 || r_type == R_PARISC_LTOFF_FPTR16WF
3349 || r_type == R_PARISC_LTOFF_FPTR16DF)
3350 {
3351 local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3352 off = local_opd_offsets[r_symndx];
3353
3354 /* The last bit records whether we've already initialised
3355 this local .opd entry. */
3356 if ((off & 1) != 0)
3357 {
3358 BFD_ASSERT (off != (bfd_vma) -1);
3359 off &= ~1;
3360 }
3361 else
3362 {
3363 local_opd_offsets[r_symndx] |= 1;
3364
3365 /* The first two words of an .opd entry are zero. */
3366 memset (hppa_info->opd_sec->contents + off, 0, 16);
3367
3368 /* The next word is the address of the function. */
3369 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3370 (hppa_info->opd_sec->contents + off + 16));
3371
3372 /* The last word is our local __gp value. */
3373 value = _bfd_get_gp_value
3374 (hppa_info->opd_sec->output_section->owner);
3375 bfd_put_64 (hppa_info->opd_sec->owner, value,
3376 (hppa_info->opd_sec->contents + off + 24));
3377 }
3378
3379 /* The DLT value is the address of the .opd entry. */
3380 value = (off
3381 + hppa_info->opd_sec->output_offset
3382 + hppa_info->opd_sec->output_section->vma);
3383 addend = 0;
3384 }
3385
3386 local_dlt_offsets = local_offsets;
3387 off = local_dlt_offsets[r_symndx];
3388
3389 if ((off & 1) != 0)
3390 {
3391 BFD_ASSERT (off != (bfd_vma) -1);
3392 off &= ~1;
3393 }
3394 else
3395 {
3396 local_dlt_offsets[r_symndx] |= 1;
3397 bfd_put_64 (hppa_info->dlt_sec->owner,
3398 value + addend,
3399 hppa_info->dlt_sec->contents + off);
3400 }
3401 }
3402 else
3403 off = hh->dlt_offset;
3404
3405 /* We want the value of the DLT offset for this symbol, not
3406 the symbol's actual address. Note that __gp may not point
3407 to the start of the DLT, so we have to compute the absolute
3408 address, then subtract out the value of __gp. */
3409 value = (off
3410 + hppa_info->dlt_sec->output_offset
3411 + hppa_info->dlt_sec->output_section->vma);
3412 value -= _bfd_get_gp_value (output_bfd);
3413
3414 /* All DLTIND relocations are basically the same at this point,
3415 except that we need different field selectors for the 21bit
3416 version vs the 14bit versions. */
3417 if (r_type == R_PARISC_DLTIND21L
3418 || r_type == R_PARISC_LTOFF_FPTR21L
3419 || r_type == R_PARISC_LTOFF_TP21L)
3420 value = hppa_field_adjust (value, 0, e_lsel);
3421 else if (r_type == R_PARISC_DLTIND14F
3422 || r_type == R_PARISC_LTOFF_FPTR16F
3423 || r_type == R_PARISC_LTOFF_FPTR16WF
3424 || r_type == R_PARISC_LTOFF_FPTR16DF
3425 || r_type == R_PARISC_LTOFF16F
3426 || r_type == R_PARISC_LTOFF16DF
3427 || r_type == R_PARISC_LTOFF16WF
3428 || r_type == R_PARISC_LTOFF_TP16F
3429 || r_type == R_PARISC_LTOFF_TP16WF
3430 || r_type == R_PARISC_LTOFF_TP16DF)
3431 value = hppa_field_adjust (value, 0, e_fsel);
3432 else
3433 value = hppa_field_adjust (value, 0, e_rsel);
3434
3435 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3436 break;
3437 }
3438
3439 case R_PARISC_DLTREL14R:
3440 case R_PARISC_DLTREL14F:
3441 case R_PARISC_DLTREL14DR:
3442 case R_PARISC_DLTREL14WR:
3443 case R_PARISC_DLTREL21L:
3444 case R_PARISC_DPREL21L:
3445 case R_PARISC_DPREL14WR:
3446 case R_PARISC_DPREL14DR:
3447 case R_PARISC_DPREL14R:
3448 case R_PARISC_DPREL14F:
3449 case R_PARISC_GPREL16F:
3450 case R_PARISC_GPREL16WF:
3451 case R_PARISC_GPREL16DF:
3452 {
3453 /* Subtract out the global pointer value to make value a DLT
3454 relative address. */
3455 value -= _bfd_get_gp_value (output_bfd);
3456
3457 /* All DLTREL relocations are basically the same at this point,
3458 except that we need different field selectors for the 21bit
3459 version vs the 14bit versions. */
3460 if (r_type == R_PARISC_DLTREL21L
3461 || r_type == R_PARISC_DPREL21L)
3462 value = hppa_field_adjust (value, addend, e_lrsel);
3463 else if (r_type == R_PARISC_DLTREL14F
3464 || r_type == R_PARISC_DPREL14F
3465 || r_type == R_PARISC_GPREL16F
3466 || r_type == R_PARISC_GPREL16WF
3467 || r_type == R_PARISC_GPREL16DF)
3468 value = hppa_field_adjust (value, addend, e_fsel);
3469 else
3470 value = hppa_field_adjust (value, addend, e_rrsel);
3471
3472 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3473 break;
3474 }
3475
3476 case R_PARISC_DIR21L:
3477 case R_PARISC_DIR17R:
3478 case R_PARISC_DIR17F:
3479 case R_PARISC_DIR14R:
3480 case R_PARISC_DIR14F:
3481 case R_PARISC_DIR14WR:
3482 case R_PARISC_DIR14DR:
3483 case R_PARISC_DIR16F:
3484 case R_PARISC_DIR16WF:
3485 case R_PARISC_DIR16DF:
3486 {
3487 /* All DIR relocations are basically the same at this point,
3488 except that branch offsets need to be divided by four, and
3489 we need different field selectors. Note that we don't
3490 redirect absolute calls to local stubs. */
3491
3492 if (r_type == R_PARISC_DIR21L)
3493 value = hppa_field_adjust (value, addend, e_lrsel);
3494 else if (r_type == R_PARISC_DIR17F
3495 || r_type == R_PARISC_DIR16F
3496 || r_type == R_PARISC_DIR16WF
3497 || r_type == R_PARISC_DIR16DF
3498 || r_type == R_PARISC_DIR14F)
3499 value = hppa_field_adjust (value, addend, e_fsel);
3500 else
3501 value = hppa_field_adjust (value, addend, e_rrsel);
3502
3503 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
3504 /* All branches are implicitly shifted by 2 places. */
3505 value >>= 2;
3506
3507 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3508 break;
3509 }
3510
3511 case R_PARISC_PLTOFF21L:
3512 case R_PARISC_PLTOFF14R:
3513 case R_PARISC_PLTOFF14F:
3514 case R_PARISC_PLTOFF14WR:
3515 case R_PARISC_PLTOFF14DR:
3516 case R_PARISC_PLTOFF16F:
3517 case R_PARISC_PLTOFF16WF:
3518 case R_PARISC_PLTOFF16DF:
3519 {
3520 /* We want the value of the PLT offset for this symbol, not
3521 the symbol's actual address. Note that __gp may not point
3522 to the start of the DLT, so we have to compute the absolute
3523 address, then subtract out the value of __gp. */
3524 value = (hh->plt_offset
3525 + hppa_info->plt_sec->output_offset
3526 + hppa_info->plt_sec->output_section->vma);
3527 value -= _bfd_get_gp_value (output_bfd);
3528
3529 /* All PLTOFF relocations are basically the same at this point,
3530 except that we need different field selectors for the 21bit
3531 version vs the 14bit versions. */
3532 if (r_type == R_PARISC_PLTOFF21L)
3533 value = hppa_field_adjust (value, addend, e_lrsel);
3534 else if (r_type == R_PARISC_PLTOFF14F
3535 || r_type == R_PARISC_PLTOFF16F
3536 || r_type == R_PARISC_PLTOFF16WF
3537 || r_type == R_PARISC_PLTOFF16DF)
3538 value = hppa_field_adjust (value, addend, e_fsel);
3539 else
3540 value = hppa_field_adjust (value, addend, e_rrsel);
3541
3542 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3543 break;
3544 }
3545
3546 case R_PARISC_LTOFF_FPTR32:
3547 {
3548 /* We may still need to create the FPTR itself if it was for
3549 a local symbol. */
3550 if (hh == NULL)
3551 {
3552 /* The first two words of an .opd entry are zero. */
3553 memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3554
3555 /* The next word is the address of the function. */
3556 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3557 (hppa_info->opd_sec->contents
3558 + hh->opd_offset + 16));
3559
3560 /* The last word is our local __gp value. */
3561 value = _bfd_get_gp_value
3562 (hppa_info->opd_sec->output_section->owner);
3563 bfd_put_64 (hppa_info->opd_sec->owner, value,
3564 hppa_info->opd_sec->contents + hh->opd_offset + 24);
3565
3566 /* The DLT value is the address of the .opd entry. */
3567 value = (hh->opd_offset
3568 + hppa_info->opd_sec->output_offset
3569 + hppa_info->opd_sec->output_section->vma);
3570
3571 bfd_put_64 (hppa_info->dlt_sec->owner,
3572 value,
3573 hppa_info->dlt_sec->contents + hh->dlt_offset);
3574 }
3575
3576 /* We want the value of the DLT offset for this symbol, not
3577 the symbol's actual address. Note that __gp may not point
3578 to the start of the DLT, so we have to compute the absolute
3579 address, then subtract out the value of __gp. */
3580 value = (hh->dlt_offset
3581 + hppa_info->dlt_sec->output_offset
3582 + hppa_info->dlt_sec->output_section->vma);
3583 value -= _bfd_get_gp_value (output_bfd);
3584 bfd_put_32 (input_bfd, value, hit_data);
3585 return bfd_reloc_ok;
3586 }
3587
3588 case R_PARISC_LTOFF_FPTR64:
3589 case R_PARISC_LTOFF_TP64:
3590 {
3591 /* We may still need to create the FPTR itself if it was for
3592 a local symbol. */
3593 if (eh == NULL && r_type == R_PARISC_LTOFF_FPTR64)
3594 {
3595 /* The first two words of an .opd entry are zero. */
3596 memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3597
3598 /* The next word is the address of the function. */
3599 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3600 (hppa_info->opd_sec->contents
3601 + hh->opd_offset + 16));
3602
3603 /* The last word is our local __gp value. */
3604 value = _bfd_get_gp_value
3605 (hppa_info->opd_sec->output_section->owner);
3606 bfd_put_64 (hppa_info->opd_sec->owner, value,
3607 hppa_info->opd_sec->contents + hh->opd_offset + 24);
3608
3609 /* The DLT value is the address of the .opd entry. */
3610 value = (hh->opd_offset
3611 + hppa_info->opd_sec->output_offset
3612 + hppa_info->opd_sec->output_section->vma);
3613
3614 bfd_put_64 (hppa_info->dlt_sec->owner,
3615 value,
3616 hppa_info->dlt_sec->contents + hh->dlt_offset);
3617 }
3618
3619 /* We want the value of the DLT offset for this symbol, not
3620 the symbol's actual address. Note that __gp may not point
3621 to the start of the DLT, so we have to compute the absolute
3622 address, then subtract out the value of __gp. */
3623 value = (hh->dlt_offset
3624 + hppa_info->dlt_sec->output_offset
3625 + hppa_info->dlt_sec->output_section->vma);
3626 value -= _bfd_get_gp_value (output_bfd);
3627 bfd_put_64 (input_bfd, value, hit_data);
3628 return bfd_reloc_ok;
3629 }
3630
3631 case R_PARISC_DIR32:
3632 bfd_put_32 (input_bfd, value + addend, hit_data);
3633 return bfd_reloc_ok;
3634
3635 case R_PARISC_DIR64:
3636 bfd_put_64 (input_bfd, value + addend, hit_data);
3637 return bfd_reloc_ok;
3638
3639 case R_PARISC_GPREL64:
3640 /* Subtract out the global pointer value to make value a DLT
3641 relative address. */
3642 value -= _bfd_get_gp_value (output_bfd);
3643
3644 bfd_put_64 (input_bfd, value + addend, hit_data);
3645 return bfd_reloc_ok;
3646
3647 case R_PARISC_LTOFF64:
3648 /* We want the value of the DLT offset for this symbol, not
3649 the symbol's actual address. Note that __gp may not point
3650 to the start of the DLT, so we have to compute the absolute
3651 address, then subtract out the value of __gp. */
3652 value = (hh->dlt_offset
3653 + hppa_info->dlt_sec->output_offset
3654 + hppa_info->dlt_sec->output_section->vma);
3655 value -= _bfd_get_gp_value (output_bfd);
3656
3657 bfd_put_64 (input_bfd, value + addend, hit_data);
3658 return bfd_reloc_ok;
3659
3660 case R_PARISC_PCREL32:
3661 {
3662 /* If this is a call to a function defined in another dynamic
3663 library, then redirect the call to the local stub for this
3664 function. */
3665 if (sym_sec == NULL || sym_sec->output_section == NULL)
3666 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3667 + hppa_info->stub_sec->output_section->vma);
3668
3669 /* Turn VALUE into a proper PC relative address. */
3670 value -= (offset + input_section->output_offset
3671 + input_section->output_section->vma);
3672
3673 value += addend;
3674 value -= 8;
3675 bfd_put_32 (input_bfd, value, hit_data);
3676 return bfd_reloc_ok;
3677 }
3678
3679 case R_PARISC_PCREL64:
3680 {
3681 /* If this is a call to a function defined in another dynamic
3682 library, then redirect the call to the local stub for this
3683 function. */
3684 if (sym_sec == NULL || sym_sec->output_section == NULL)
3685 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3686 + hppa_info->stub_sec->output_section->vma);
3687
3688 /* Turn VALUE into a proper PC relative address. */
3689 value -= (offset + input_section->output_offset
3690 + input_section->output_section->vma);
3691
3692 value += addend;
3693 value -= 8;
3694 bfd_put_64 (input_bfd, value, hit_data);
3695 return bfd_reloc_ok;
3696 }
3697
3698 case R_PARISC_FPTR64:
3699 {
3700 bfd_vma off;
3701
3702 /* We may still need to create the FPTR itself if it was for
3703 a local symbol. */
3704 if (hh == NULL)
3705 {
3706 bfd_vma *local_opd_offsets;
3707
3708 if (local_offsets == NULL)
3709 abort ();
3710
3711 local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3712 off = local_opd_offsets[r_symndx];
3713
3714 /* The last bit records whether we've already initialised
3715 this local .opd entry. */
3716 if ((off & 1) != 0)
3717 {
3718 BFD_ASSERT (off != (bfd_vma) -1);
3719 off &= ~1;
3720 }
3721 else
3722 {
3723 /* The first two words of an .opd entry are zero. */
3724 memset (hppa_info->opd_sec->contents + off, 0, 16);
3725
3726 /* The next word is the address of the function. */
3727 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3728 (hppa_info->opd_sec->contents + off + 16));
3729
3730 /* The last word is our local __gp value. */
3731 value = _bfd_get_gp_value
3732 (hppa_info->opd_sec->output_section->owner);
3733 bfd_put_64 (hppa_info->opd_sec->owner, value,
3734 hppa_info->opd_sec->contents + off + 24);
3735 }
3736 }
3737 else
3738 off = hh->opd_offset;
3739
3740 if (hh == NULL || hh->want_opd)
3741 /* We want the value of the OPD offset for this symbol. */
3742 value = (off
3743 + hppa_info->opd_sec->output_offset
3744 + hppa_info->opd_sec->output_section->vma);
3745 else
3746 /* We want the address of the symbol. */
3747 value += addend;
3748
3749 bfd_put_64 (input_bfd, value, hit_data);
3750 return bfd_reloc_ok;
3751 }
3752
3753 case R_PARISC_SECREL32:
3754 if (sym_sec)
3755 value -= sym_sec->output_section->vma;
3756 bfd_put_32 (input_bfd, value + addend, hit_data);
3757 return bfd_reloc_ok;
3758
3759 case R_PARISC_SEGREL32:
3760 case R_PARISC_SEGREL64:
3761 {
3762 /* If this is the first SEGREL relocation, then initialize
3763 the segment base values. */
3764 if (hppa_info->text_segment_base == (bfd_vma) -1)
3765 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
3766 hppa_info);
3767
3768 /* VALUE holds the absolute address. We want to include the
3769 addend, then turn it into a segment relative address.
3770
3771 The segment is derived from SYM_SEC. We assume that there are
3772 only two segments of note in the resulting executable/shlib.
3773 A readonly segment (.text) and a readwrite segment (.data). */
3774 value += addend;
3775
3776 if (sym_sec->flags & SEC_CODE)
3777 value -= hppa_info->text_segment_base;
3778 else
3779 value -= hppa_info->data_segment_base;
3780
3781 if (r_type == R_PARISC_SEGREL32)
3782 bfd_put_32 (input_bfd, value, hit_data);
3783 else
3784 bfd_put_64 (input_bfd, value, hit_data);
3785 return bfd_reloc_ok;
3786 }
3787
3788 /* Something we don't know how to handle. */
3789 default:
3790 return bfd_reloc_notsupported;
3791 }
3792
3793 /* Update the instruction word. */
3794 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3795 return bfd_reloc_ok;
3796 }
3797
3798 /* Relocate an HPPA ELF section. */
3799
3800 static bfd_boolean
3801 elf64_hppa_relocate_section (bfd *output_bfd,
3802 struct bfd_link_info *info,
3803 bfd *input_bfd,
3804 asection *input_section,
3805 bfd_byte *contents,
3806 Elf_Internal_Rela *relocs,
3807 Elf_Internal_Sym *local_syms,
3808 asection **local_sections)
3809 {
3810 Elf_Internal_Shdr *symtab_hdr;
3811 Elf_Internal_Rela *rel;
3812 Elf_Internal_Rela *relend;
3813 struct elf64_hppa_link_hash_table *hppa_info;
3814
3815 hppa_info = hppa_link_hash_table (info);
3816 if (hppa_info == NULL)
3817 return FALSE;
3818
3819 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3820
3821 rel = relocs;
3822 relend = relocs + input_section->reloc_count;
3823 for (; rel < relend; rel++)
3824 {
3825 int r_type;
3826 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3827 unsigned long r_symndx;
3828 struct elf_link_hash_entry *eh;
3829 Elf_Internal_Sym *sym;
3830 asection *sym_sec;
3831 bfd_vma relocation;
3832 bfd_reloc_status_type r;
3833
3834 r_type = ELF_R_TYPE (rel->r_info);
3835 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
3836 {
3837 bfd_set_error (bfd_error_bad_value);
3838 return FALSE;
3839 }
3840 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3841 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3842 continue;
3843
3844 /* This is a final link. */
3845 r_symndx = ELF_R_SYM (rel->r_info);
3846 eh = NULL;
3847 sym = NULL;
3848 sym_sec = NULL;
3849 if (r_symndx < symtab_hdr->sh_info)
3850 {
3851 /* This is a local symbol, hh defaults to NULL. */
3852 sym = local_syms + r_symndx;
3853 sym_sec = local_sections[r_symndx];
3854 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
3855 }
3856 else
3857 {
3858 /* This is not a local symbol. */
3859 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3860
3861 /* It seems this can happen with erroneous or unsupported
3862 input (mixing a.out and elf in an archive, for example.) */
3863 if (sym_hashes == NULL)
3864 return FALSE;
3865
3866 eh = sym_hashes[r_symndx - symtab_hdr->sh_info];
3867
3868 while (eh->root.type == bfd_link_hash_indirect
3869 || eh->root.type == bfd_link_hash_warning)
3870 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
3871
3872 relocation = 0;
3873 if (eh->root.type == bfd_link_hash_defined
3874 || eh->root.type == bfd_link_hash_defweak)
3875 {
3876 sym_sec = eh->root.u.def.section;
3877 if (sym_sec != NULL
3878 && sym_sec->output_section != NULL)
3879 relocation = (eh->root.u.def.value
3880 + sym_sec->output_section->vma
3881 + sym_sec->output_offset);
3882 }
3883 else if (eh->root.type == bfd_link_hash_undefweak)
3884 ;
3885 else if (info->unresolved_syms_in_objects == RM_IGNORE
3886 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
3887 ;
3888 else if (!info->relocatable
3889 && elf_hppa_is_dynamic_loader_symbol (eh->root.root.string))
3890 continue;
3891 else if (!info->relocatable)
3892 {
3893 bfd_boolean err;
3894 err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
3895 || ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT);
3896 if (!info->callbacks->undefined_symbol (info,
3897 eh->root.root.string,
3898 input_bfd,
3899 input_section,
3900 rel->r_offset, err))
3901 return FALSE;
3902 }
3903
3904 if (!info->relocatable
3905 && relocation == 0
3906 && eh->root.type != bfd_link_hash_defined
3907 && eh->root.type != bfd_link_hash_defweak
3908 && eh->root.type != bfd_link_hash_undefweak)
3909 {
3910 if (info->unresolved_syms_in_objects == RM_IGNORE
3911 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3912 && eh->type == STT_PARISC_MILLI)
3913 {
3914 if (! info->callbacks->undefined_symbol
3915 (info, eh_name (eh), input_bfd,
3916 input_section, rel->r_offset, FALSE))
3917 return FALSE;
3918 }
3919 }
3920 }
3921
3922 if (sym_sec != NULL && elf_discarded_section (sym_sec))
3923 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3924 rel, relend, howto, contents);
3925
3926 if (info->relocatable)
3927 continue;
3928
3929 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
3930 input_section, contents,
3931 relocation, info, sym_sec,
3932 eh);
3933
3934 if (r != bfd_reloc_ok)
3935 {
3936 switch (r)
3937 {
3938 default:
3939 abort ();
3940 case bfd_reloc_overflow:
3941 {
3942 const char *sym_name;
3943
3944 if (eh != NULL)
3945 sym_name = NULL;
3946 else
3947 {
3948 sym_name = bfd_elf_string_from_elf_section (input_bfd,
3949 symtab_hdr->sh_link,
3950 sym->st_name);
3951 if (sym_name == NULL)
3952 return FALSE;
3953 if (*sym_name == '\0')
3954 sym_name = bfd_section_name (input_bfd, sym_sec);
3955 }
3956
3957 if (!((*info->callbacks->reloc_overflow)
3958 (info, (eh ? &eh->root : NULL), sym_name,
3959 howto->name, (bfd_vma) 0, input_bfd,
3960 input_section, rel->r_offset)))
3961 return FALSE;
3962 }
3963 break;
3964 }
3965 }
3966 }
3967 return TRUE;
3968 }
3969
3970 static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
3971 {
3972 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3973 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3974 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3975 { STRING_COMMA_LEN (".dlt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3976 { STRING_COMMA_LEN (".sdata"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3977 { STRING_COMMA_LEN (".sbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3978 { STRING_COMMA_LEN (".tbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_HP_TLS },
3979 { NULL, 0, 0, 0, 0 }
3980 };
3981
3982 /* The hash bucket size is the standard one, namely 4. */
3983
3984 const struct elf_size_info hppa64_elf_size_info =
3985 {
3986 sizeof (Elf64_External_Ehdr),
3987 sizeof (Elf64_External_Phdr),
3988 sizeof (Elf64_External_Shdr),
3989 sizeof (Elf64_External_Rel),
3990 sizeof (Elf64_External_Rela),
3991 sizeof (Elf64_External_Sym),
3992 sizeof (Elf64_External_Dyn),
3993 sizeof (Elf_External_Note),
3994 4,
3995 1,
3996 64, 3,
3997 ELFCLASS64, EV_CURRENT,
3998 bfd_elf64_write_out_phdrs,
3999 bfd_elf64_write_shdrs_and_ehdr,
4000 bfd_elf64_checksum_contents,
4001 bfd_elf64_write_relocs,
4002 bfd_elf64_swap_symbol_in,
4003 bfd_elf64_swap_symbol_out,
4004 bfd_elf64_slurp_reloc_table,
4005 bfd_elf64_slurp_symbol_table,
4006 bfd_elf64_swap_dyn_in,
4007 bfd_elf64_swap_dyn_out,
4008 bfd_elf64_swap_reloc_in,
4009 bfd_elf64_swap_reloc_out,
4010 bfd_elf64_swap_reloca_in,
4011 bfd_elf64_swap_reloca_out
4012 };
4013
4014 #define TARGET_BIG_SYM bfd_elf64_hppa_vec
4015 #define TARGET_BIG_NAME "elf64-hppa"
4016 #define ELF_ARCH bfd_arch_hppa
4017 #define ELF_TARGET_ID HPPA64_ELF_DATA
4018 #define ELF_MACHINE_CODE EM_PARISC
4019 /* This is not strictly correct. The maximum page size for PA2.0 is
4020 64M. But everything still uses 4k. */
4021 #define ELF_MAXPAGESIZE 0x1000
4022 #define ELF_OSABI ELFOSABI_HPUX
4023
4024 #define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4025 #define bfd_elf64_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4026 #define bfd_elf64_bfd_is_local_label_name elf_hppa_is_local_label_name
4027 #define elf_info_to_howto elf_hppa_info_to_howto
4028 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4029
4030 #define elf_backend_section_from_shdr elf64_hppa_section_from_shdr
4031 #define elf_backend_object_p elf64_hppa_object_p
4032 #define elf_backend_final_write_processing \
4033 elf_hppa_final_write_processing
4034 #define elf_backend_fake_sections elf_hppa_fake_sections
4035 #define elf_backend_add_symbol_hook elf_hppa_add_symbol_hook
4036
4037 #define elf_backend_relocate_section elf_hppa_relocate_section
4038
4039 #define bfd_elf64_bfd_final_link elf_hppa_final_link
4040
4041 #define elf_backend_create_dynamic_sections \
4042 elf64_hppa_create_dynamic_sections
4043 #define elf_backend_post_process_headers elf64_hppa_post_process_headers
4044
4045 #define elf_backend_omit_section_dynsym \
4046 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4047 #define elf_backend_adjust_dynamic_symbol \
4048 elf64_hppa_adjust_dynamic_symbol
4049
4050 #define elf_backend_size_dynamic_sections \
4051 elf64_hppa_size_dynamic_sections
4052
4053 #define elf_backend_finish_dynamic_symbol \
4054 elf64_hppa_finish_dynamic_symbol
4055 #define elf_backend_finish_dynamic_sections \
4056 elf64_hppa_finish_dynamic_sections
4057 #define elf_backend_grok_prstatus elf64_hppa_grok_prstatus
4058 #define elf_backend_grok_psinfo elf64_hppa_grok_psinfo
4059
4060 /* Stuff for the BFD linker: */
4061 #define bfd_elf64_bfd_link_hash_table_create \
4062 elf64_hppa_hash_table_create
4063
4064 #define elf_backend_check_relocs \
4065 elf64_hppa_check_relocs
4066
4067 #define elf_backend_size_info \
4068 hppa64_elf_size_info
4069
4070 #define elf_backend_additional_program_headers \
4071 elf64_hppa_additional_program_headers
4072
4073 #define elf_backend_modify_segment_map \
4074 elf64_hppa_modify_segment_map
4075
4076 #define elf_backend_link_output_symbol_hook \
4077 elf64_hppa_link_output_symbol_hook
4078
4079 #define elf_backend_want_got_plt 0
4080 #define elf_backend_plt_readonly 0
4081 #define elf_backend_want_plt_sym 0
4082 #define elf_backend_got_header_size 0
4083 #define elf_backend_type_change_ok TRUE
4084 #define elf_backend_get_symbol_type elf64_hppa_elf_get_symbol_type
4085 #define elf_backend_reloc_type_class elf64_hppa_reloc_type_class
4086 #define elf_backend_rela_normal 1
4087 #define elf_backend_special_sections elf64_hppa_special_sections
4088 #define elf_backend_action_discarded elf_hppa_action_discarded
4089 #define elf_backend_section_from_phdr elf64_hppa_section_from_phdr
4090
4091 #define elf64_bed elf64_hppa_hpux_bed
4092
4093 #include "elf64-target.h"
4094
4095 #undef TARGET_BIG_SYM
4096 #define TARGET_BIG_SYM bfd_elf64_hppa_linux_vec
4097 #undef TARGET_BIG_NAME
4098 #define TARGET_BIG_NAME "elf64-hppa-linux"
4099 #undef ELF_OSABI
4100 #define ELF_OSABI ELFOSABI_LINUX
4101 #undef elf_backend_post_process_headers
4102 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4103 #undef elf64_bed
4104 #define elf64_bed elf64_hppa_linux_bed
4105
4106 #include "elf64-target.h"
This page took 0.167464 seconds and 5 git commands to generate.