.plt stub for lazy linking, --stub-group-size=N ld switch,
[deliverable/binutils-gdb.git] / bfd / elf64-hppa.c
1 /* Generic support for 64-bit ELF
2 Copyright 1999, 2000 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libbfd.h"
23 #include "elf-bfd.h"
24 #include "elf/hppa.h"
25 #include "libhppa.h"
26 #include "elf64-hppa.h"
27 #define ARCH_SIZE 64
28
29 #define PLT_ENTRY_SIZE 0x10
30 #define DLT_ENTRY_SIZE 0x8
31 #define OPD_ENTRY_SIZE 0x20
32
33 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
34
35 /* The stub is supposed to load the target address and target's DP
36 value out of the PLT, then do an external branch to the target
37 address.
38
39 LDD PLTOFF(%r27),%r1
40 BVE (%r1)
41 LDD PLTOFF+8(%r27),%r27
42
43 Note that we must use the LDD with a 14 bit displacement, not the one
44 with a 5 bit displacement. */
45 static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
46 0x53, 0x7b, 0x00, 0x00 };
47
48 struct elf64_hppa_dyn_hash_entry
49 {
50 struct bfd_hash_entry root;
51
52 /* Offsets for this symbol in various linker sections. */
53 bfd_vma dlt_offset;
54 bfd_vma plt_offset;
55 bfd_vma opd_offset;
56 bfd_vma stub_offset;
57
58 /* The symbol table entry, if any, that this was derived from. */
59 struct elf_link_hash_entry *h;
60
61 /* The index of the (possibly local) symbol in the input bfd and its
62 associated BFD. Needed so that we can have relocs against local
63 symbols in shared libraries. */
64 unsigned long sym_indx;
65 bfd *owner;
66
67 /* Dynamic symbols may need to have two different values. One for
68 the dynamic symbol table, one for the normal symbol table.
69
70 In such cases we store the symbol's real value and section
71 index here so we can restore the real value before we write
72 the normal symbol table. */
73 bfd_vma st_value;
74 int st_shndx;
75
76 /* Used to count non-got, non-plt relocations for delayed sizing
77 of relocation sections. */
78 struct elf64_hppa_dyn_reloc_entry
79 {
80 /* Next relocation in the chain. */
81 struct elf64_hppa_dyn_reloc_entry *next;
82
83 /* The type of the relocation. */
84 int type;
85
86 /* The input section of the relocation. */
87 asection *sec;
88
89 /* The index of the section symbol for the input section of
90 the relocation. Only needed when building shared libraries. */
91 int sec_symndx;
92
93 /* The offset within the input section of the relocation. */
94 bfd_vma offset;
95
96 /* The addend for the relocation. */
97 bfd_vma addend;
98
99 } *reloc_entries;
100
101 /* Nonzero if this symbol needs an entry in one of the linker
102 sections. */
103 unsigned want_dlt;
104 unsigned want_plt;
105 unsigned want_opd;
106 unsigned want_stub;
107 };
108
109 struct elf64_hppa_dyn_hash_table
110 {
111 struct bfd_hash_table root;
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 struct elf64_hppa_dyn_hash_table dyn_hash_table;
141
142 /* We build tables to map from an input section back to its
143 symbol index. This is the BFD for which we currently have
144 a map. */
145 bfd *section_syms_bfd;
146
147 /* Array of symbol numbers for each input section attached to the
148 current BFD. */
149 int *section_syms;
150 };
151
152 #define elf64_hppa_hash_table(p) \
153 ((struct elf64_hppa_link_hash_table *) ((p)->hash))
154
155 typedef struct bfd_hash_entry *(*new_hash_entry_func)
156 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
157
158 static boolean elf64_hppa_dyn_hash_table_init
159 PARAMS ((struct elf64_hppa_dyn_hash_table *ht, bfd *abfd,
160 new_hash_entry_func new));
161 static struct bfd_hash_entry *elf64_hppa_new_dyn_hash_entry
162 PARAMS ((struct bfd_hash_entry *entry, struct bfd_hash_table *table,
163 const char *string));
164 static struct bfd_link_hash_table *elf64_hppa_hash_table_create
165 PARAMS ((bfd *abfd));
166 static struct elf64_hppa_dyn_hash_entry *elf64_hppa_dyn_hash_lookup
167 PARAMS ((struct elf64_hppa_dyn_hash_table *table, const char *string,
168 boolean create, boolean copy));
169 static void elf64_hppa_dyn_hash_traverse
170 PARAMS ((struct elf64_hppa_dyn_hash_table *table,
171 boolean (*func)(struct elf64_hppa_dyn_hash_entry *, PTR),
172 PTR info));
173
174 static const char *get_dyn_name
175 PARAMS ((asection *, struct elf_link_hash_entry *,
176 const Elf_Internal_Rela *, char **, size_t *));
177
178
179 /* This must follow the definitions of the various derived linker
180 hash tables and shared functions. */
181 #include "elf-hppa.h"
182
183
184 static boolean elf64_hppa_object_p
185 PARAMS ((bfd *));
186
187 static boolean elf64_hppa_section_from_shdr
188 PARAMS ((bfd *, Elf64_Internal_Shdr *, char *));
189
190 static void elf64_hppa_post_process_headers
191 PARAMS ((bfd *, struct bfd_link_info *));
192
193 static boolean elf64_hppa_create_dynamic_sections
194 PARAMS ((bfd *, struct bfd_link_info *));
195
196 static boolean elf64_hppa_adjust_dynamic_symbol
197 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
198
199 static boolean elf64_hppa_size_dynamic_sections
200 PARAMS ((bfd *, struct bfd_link_info *));
201
202 static boolean elf64_hppa_finish_dynamic_symbol
203 PARAMS ((bfd *, struct bfd_link_info *,
204 struct elf_link_hash_entry *, Elf_Internal_Sym *));
205
206 static boolean elf64_hppa_finish_dynamic_sections
207 PARAMS ((bfd *, struct bfd_link_info *));
208
209 static boolean elf64_hppa_check_relocs
210 PARAMS ((bfd *, struct bfd_link_info *,
211 asection *, const Elf_Internal_Rela *));
212
213 static boolean elf64_hppa_dynamic_symbol_p
214 PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
215
216 static boolean elf64_hppa_mark_exported_functions
217 PARAMS ((struct elf_link_hash_entry *, PTR));
218
219 static boolean elf64_hppa_finalize_opd
220 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
221
222 static boolean elf64_hppa_finalize_dlt
223 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
224
225 static boolean allocate_global_data_dlt
226 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
227
228 static boolean allocate_global_data_plt
229 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
230
231 static boolean allocate_global_data_stub
232 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
233
234 static boolean allocate_global_data_opd
235 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
236
237 static boolean get_reloc_section
238 PARAMS ((bfd *, struct elf64_hppa_link_hash_table *, asection *));
239
240 static boolean count_dyn_reloc
241 PARAMS ((bfd *, struct elf64_hppa_dyn_hash_entry *,
242 int, asection *, int, bfd_vma, bfd_vma));
243
244 static boolean allocate_dynrel_entries
245 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
246
247 static boolean elf64_hppa_finalize_dynreloc
248 PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
249
250 static boolean get_opd
251 PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
252
253 static boolean get_plt
254 PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
255
256 static boolean get_dlt
257 PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
258
259 static boolean get_stub
260 PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
261
262 static boolean
263 elf64_hppa_dyn_hash_table_init (ht, abfd, new)
264 struct elf64_hppa_dyn_hash_table *ht;
265 bfd *abfd ATTRIBUTE_UNUSED;
266 new_hash_entry_func new;
267 {
268 memset (ht, 0, sizeof(*ht));
269 return bfd_hash_table_init (&ht->root, new);
270 }
271
272 static struct bfd_hash_entry*
273 elf64_hppa_new_dyn_hash_entry (entry, table, string)
274 struct bfd_hash_entry *entry;
275 struct bfd_hash_table *table;
276 const char *string;
277 {
278 struct elf64_hppa_dyn_hash_entry *ret;
279 ret = (struct elf64_hppa_dyn_hash_entry *) entry;
280
281 /* Allocate the structure if it has not already been allocated by a
282 subclass. */
283 if (!ret)
284 ret = bfd_hash_allocate (table, sizeof (*ret));
285
286 if (!ret)
287 return 0;
288
289 /* Initialize our local data. All zeros, and definitely easier
290 than setting 8 bit fields. */
291 memset (ret, 0, sizeof(*ret));
292
293 /* Call the allocation method of the superclass. */
294 ret = ((struct elf64_hppa_dyn_hash_entry *)
295 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
296
297 return &ret->root;
298 }
299
300 /* Create the derived linker hash table. The PA64 ELF port uses this
301 derived hash table to keep information specific to the PA ElF
302 linker (without using static variables). */
303
304 static struct bfd_link_hash_table*
305 elf64_hppa_hash_table_create (abfd)
306 bfd *abfd;
307 {
308 struct elf64_hppa_link_hash_table *ret;
309
310 ret = bfd_zalloc (abfd, sizeof (*ret));
311 if (!ret)
312 return 0;
313 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
314 _bfd_elf_link_hash_newfunc))
315 {
316 bfd_release (abfd, ret);
317 return 0;
318 }
319
320 if (!elf64_hppa_dyn_hash_table_init (&ret->dyn_hash_table, abfd,
321 elf64_hppa_new_dyn_hash_entry))
322 return 0;
323 return &ret->root.root;
324 }
325
326 /* Look up an entry in a PA64 ELF linker hash table. */
327
328 static struct elf64_hppa_dyn_hash_entry *
329 elf64_hppa_dyn_hash_lookup(table, string, create, copy)
330 struct elf64_hppa_dyn_hash_table *table;
331 const char *string;
332 boolean create, copy;
333 {
334 return ((struct elf64_hppa_dyn_hash_entry *)
335 bfd_hash_lookup (&table->root, string, create, copy));
336 }
337
338 /* Traverse a PA64 ELF linker hash table. */
339
340 static void
341 elf64_hppa_dyn_hash_traverse (table, func, info)
342 struct elf64_hppa_dyn_hash_table *table;
343 boolean (*func) PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
344 PTR info;
345 {
346 (bfd_hash_traverse
347 (&table->root,
348 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) func,
349 info));
350 }
351 \f
352 /* Return nonzero if ABFD represents a PA2.0 ELF64 file.
353
354 Additionally we set the default architecture and machine. */
355 static boolean
356 elf64_hppa_object_p (abfd)
357 bfd *abfd;
358 {
359 /* Set the right machine number for an HPPA ELF file. */
360 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
361 }
362
363 /* Given section type (hdr->sh_type), return a boolean indicating
364 whether or not the section is an elf64-hppa specific section. */
365 static boolean
366 elf64_hppa_section_from_shdr (abfd, hdr, name)
367 bfd *abfd;
368 Elf64_Internal_Shdr *hdr;
369 char *name;
370 {
371 asection *newsect;
372
373 switch (hdr->sh_type)
374 {
375 case SHT_PARISC_EXT:
376 if (strcmp (name, ".PARISC.archext") != 0)
377 return false;
378 break;
379 case SHT_PARISC_UNWIND:
380 if (strcmp (name, ".PARISC.unwind") != 0)
381 return false;
382 break;
383 case SHT_PARISC_DOC:
384 case SHT_PARISC_ANNOT:
385 default:
386 return false;
387 }
388
389 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
390 return false;
391 newsect = hdr->bfd_section;
392
393 return true;
394 }
395
396
397 /* Construct a string for use in the elf64_hppa_dyn_hash_table. The
398 name describes what was once potentially anonymous memory. We
399 allocate memory as necessary, possibly reusing PBUF/PLEN. */
400
401 static const char *
402 get_dyn_name (sec, h, rel, pbuf, plen)
403 asection *sec;
404 struct elf_link_hash_entry *h;
405 const Elf_Internal_Rela *rel;
406 char **pbuf;
407 size_t *plen;
408 {
409 size_t nlen, tlen;
410 char *buf;
411 size_t len;
412
413 if (h && rel->r_addend == 0)
414 return h->root.root.string;
415
416 if (h)
417 nlen = strlen (h->root.root.string);
418 else
419 nlen = 8 + 1 + sizeof (rel->r_info) * 2 - 8;
420 tlen = nlen + 1 + sizeof (rel->r_addend) * 2 + 1;
421
422 len = *plen;
423 buf = *pbuf;
424 if (len < tlen)
425 {
426 if (buf)
427 free (buf);
428 *pbuf = buf = malloc (tlen);
429 *plen = len = tlen;
430 if (!buf)
431 return NULL;
432 }
433
434 if (h)
435 {
436 memcpy (buf, h->root.root.string, nlen);
437 buf[nlen++] = '+';
438 sprintf_vma (buf + nlen, rel->r_addend);
439 }
440 else
441 {
442 nlen = sprintf (buf, "%x:%lx",
443 sec->id & 0xffffffff,
444 (long) ELF64_R_SYM (rel->r_info));
445 if (rel->r_addend)
446 {
447 buf[nlen++] = '+';
448 sprintf_vma (buf + nlen, rel->r_addend);
449 }
450 }
451
452 return buf;
453 }
454
455 /* SEC is a section containing relocs for an input BFD when linking; return
456 a suitable section for holding relocs in the output BFD for a link. */
457
458 static boolean
459 get_reloc_section (abfd, hppa_info, sec)
460 bfd *abfd;
461 struct elf64_hppa_link_hash_table *hppa_info;
462 asection *sec;
463 {
464 const char *srel_name;
465 asection *srel;
466 bfd *dynobj;
467
468 srel_name = (bfd_elf_string_from_elf_section
469 (abfd, elf_elfheader(abfd)->e_shstrndx,
470 elf_section_data(sec)->rel_hdr.sh_name));
471 if (srel_name == NULL)
472 return false;
473
474 BFD_ASSERT ((strncmp (srel_name, ".rela", 5) == 0
475 && strcmp (bfd_get_section_name (abfd, sec),
476 srel_name+5) == 0)
477 || (strncmp (srel_name, ".rel", 4) == 0
478 && strcmp (bfd_get_section_name (abfd, sec),
479 srel_name+4) == 0));
480
481 dynobj = hppa_info->root.dynobj;
482 if (!dynobj)
483 hppa_info->root.dynobj = dynobj = abfd;
484
485 srel = bfd_get_section_by_name (dynobj, srel_name);
486 if (srel == NULL)
487 {
488 srel = bfd_make_section (dynobj, srel_name);
489 if (srel == NULL
490 || !bfd_set_section_flags (dynobj, srel,
491 (SEC_ALLOC
492 | SEC_LOAD
493 | SEC_HAS_CONTENTS
494 | SEC_IN_MEMORY
495 | SEC_LINKER_CREATED
496 | SEC_READONLY))
497 || !bfd_set_section_alignment (dynobj, srel, 3))
498 return false;
499 }
500
501 hppa_info->other_rel_sec = srel;
502 return true;
503 }
504
505 /* Add a new entry to the list of dynamic relocations against DYN_H.
506
507 We use this to keep a record of all the FPTR relocations against a
508 particular symbol so that we can create FPTR relocations in the
509 output file. */
510
511 static boolean
512 count_dyn_reloc (abfd, dyn_h, type, sec, sec_symndx, offset, addend)
513 bfd *abfd;
514 struct elf64_hppa_dyn_hash_entry *dyn_h;
515 int type;
516 asection *sec;
517 int sec_symndx;
518 bfd_vma offset;
519 bfd_vma addend;
520 {
521 struct elf64_hppa_dyn_reloc_entry *rent;
522
523 rent = (struct elf64_hppa_dyn_reloc_entry *)
524 bfd_alloc (abfd, sizeof (*rent));
525 if (!rent)
526 return false;
527
528 rent->next = dyn_h->reloc_entries;
529 rent->type = type;
530 rent->sec = sec;
531 rent->sec_symndx = sec_symndx;
532 rent->offset = offset;
533 rent->addend = addend;
534 dyn_h->reloc_entries = rent;
535
536 return true;
537 }
538
539 /* Scan the RELOCS and record the type of dynamic entries that each
540 referenced symbol needs. */
541
542 static boolean
543 elf64_hppa_check_relocs (abfd, info, sec, relocs)
544 bfd *abfd;
545 struct bfd_link_info *info;
546 asection *sec;
547 const Elf_Internal_Rela *relocs;
548 {
549 struct elf64_hppa_link_hash_table *hppa_info;
550 const Elf_Internal_Rela *relend;
551 Elf_Internal_Shdr *symtab_hdr;
552 const Elf_Internal_Rela *rel;
553 asection *dlt, *plt, *stubs;
554 char *buf;
555 size_t buf_len;
556 int sec_symndx;
557
558 if (info->relocateable)
559 return true;
560
561 /* If this is the first dynamic object found in the link, create
562 the special sections required for dynamic linking. */
563 if (! elf_hash_table (info)->dynamic_sections_created)
564 {
565 if (! bfd_elf64_link_create_dynamic_sections (abfd, info))
566 return false;
567 }
568
569 hppa_info = elf64_hppa_hash_table (info);
570 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
571
572 /* If necessary, build a new table holding section symbols indices
573 for this BFD. This is disgusting. */
574
575 if (info->shared && hppa_info->section_syms_bfd != abfd)
576 {
577 unsigned long i;
578 int highest_shndx;
579 Elf_Internal_Sym *local_syms, *isym;
580 Elf64_External_Sym *ext_syms, *esym;
581
582 /* We're done with the old cache of section index to section symbol
583 index information. Free it.
584
585 ?!? Note we leak the last section_syms array. Presumably we
586 could free it in one of the later routines in this file. */
587 if (hppa_info->section_syms)
588 free (hppa_info->section_syms);
589
590 /* Allocate memory for the internal and external symbols. */
591 local_syms
592 = (Elf_Internal_Sym *) bfd_malloc (symtab_hdr->sh_info
593 * sizeof (Elf_Internal_Sym));
594 if (local_syms == NULL)
595 return false;
596
597 ext_syms
598 = (Elf64_External_Sym *) bfd_malloc (symtab_hdr->sh_info
599 * sizeof (Elf64_External_Sym));
600 if (ext_syms == NULL)
601 {
602 free (local_syms);
603 return false;
604 }
605
606 /* Read in the local symbols. */
607 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
608 || bfd_read (ext_syms, 1,
609 (symtab_hdr->sh_info
610 * sizeof (Elf64_External_Sym)), abfd)
611 != (symtab_hdr->sh_info * sizeof (Elf64_External_Sym)))
612 {
613 free (local_syms);
614 free (ext_syms);
615 return false;
616 }
617
618 /* Swap in the local symbols, also record the highest section index
619 referenced by the local symbols. */
620 isym = local_syms;
621 esym = ext_syms;
622 highest_shndx = 0;
623 for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++)
624 {
625 bfd_elf64_swap_symbol_in (abfd, esym, isym);
626 if (isym->st_shndx > highest_shndx)
627 highest_shndx = isym->st_shndx;
628 }
629
630 /* Now we can free the external symbols. */
631 free (ext_syms);
632
633 /* Allocate an array to hold the section index to section symbol index
634 mapping. Bump by one since we start counting at zero. */
635 highest_shndx++;
636 hppa_info->section_syms = (int *) bfd_malloc (highest_shndx
637 * sizeof (int));
638
639 /* Now walk the local symbols again. If we find a section symbol,
640 record the index of the symbol into the section_syms array. */
641 for (isym = local_syms, i = 0; i < symtab_hdr->sh_info; i++, isym++)
642 {
643 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
644 hppa_info->section_syms[isym->st_shndx] = i;
645 }
646
647 /* We are finished with the local symbols. Get rid of them. */
648 free (local_syms);
649
650 /* Record which BFD we built the section_syms mapping for. */
651 hppa_info->section_syms_bfd = abfd;
652 }
653
654 /* Record the symbol index for this input section. We may need it for
655 relocations when building shared libraries. When not building shared
656 libraries this value is never really used, but assign it to zero to
657 prevent out of bounds memory accesses in other routines. */
658 if (info->shared)
659 {
660 sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
661
662 /* If we did not find a section symbol for this section, then
663 something went terribly wrong above. */
664 if (sec_symndx == -1)
665 return false;
666
667 sec_symndx = hppa_info->section_syms[sec_symndx];
668 }
669 else
670 sec_symndx = 0;
671
672 dlt = plt = stubs = NULL;
673 buf = NULL;
674 buf_len = 0;
675
676 relend = relocs + sec->reloc_count;
677 for (rel = relocs; rel < relend; ++rel)
678 {
679 enum {
680 NEED_DLT = 1,
681 NEED_PLT = 2,
682 NEED_STUB = 4,
683 NEED_OPD = 8,
684 NEED_DYNREL = 16,
685 };
686
687 struct elf_link_hash_entry *h = NULL;
688 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
689 struct elf64_hppa_dyn_hash_entry *dyn_h;
690 int need_entry;
691 const char *addr_name;
692 boolean maybe_dynamic;
693 int dynrel_type = R_PARISC_NONE;
694 static reloc_howto_type *howto;
695
696 if (r_symndx >= symtab_hdr->sh_info)
697 {
698 /* We're dealing with a global symbol -- find its hash entry
699 and mark it as being referenced. */
700 long indx = r_symndx - symtab_hdr->sh_info;
701 h = elf_sym_hashes (abfd)[indx];
702 while (h->root.type == bfd_link_hash_indirect
703 || h->root.type == bfd_link_hash_warning)
704 h = (struct elf_link_hash_entry *) h->root.u.i.link;
705
706 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
707 }
708
709 /* We can only get preliminary data on whether a symbol is
710 locally or externally defined, as not all of the input files
711 have yet been processed. Do something with what we know, as
712 this may help reduce memory usage and processing time later. */
713 maybe_dynamic = false;
714 if (h && ((info->shared && ! info->symbolic)
715 || ! (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
716 || h->root.type == bfd_link_hash_defweak))
717 maybe_dynamic = true;
718
719 howto = elf_hppa_howto_table + ELF64_R_TYPE (rel->r_info);
720 need_entry = 0;
721 switch (howto->type)
722 {
723 /* These are simple indirect references to symbols through the
724 DLT. We need to create a DLT entry for any symbols which
725 appears in a DLTIND relocation. */
726 case R_PARISC_DLTIND21L:
727 case R_PARISC_DLTIND14R:
728 case R_PARISC_DLTIND14F:
729 case R_PARISC_DLTIND14WR:
730 case R_PARISC_DLTIND14DR:
731 need_entry = NEED_DLT;
732 break;
733
734 /* ?!? These need a DLT entry. But I have no idea what to do with
735 the "link time TP value. */
736 case R_PARISC_LTOFF_TP21L:
737 case R_PARISC_LTOFF_TP14R:
738 case R_PARISC_LTOFF_TP14F:
739 case R_PARISC_LTOFF_TP64:
740 case R_PARISC_LTOFF_TP14WR:
741 case R_PARISC_LTOFF_TP14DR:
742 case R_PARISC_LTOFF_TP16F:
743 case R_PARISC_LTOFF_TP16WF:
744 case R_PARISC_LTOFF_TP16DF:
745 need_entry = NEED_DLT;
746 break;
747
748 /* These are function calls. Depending on their precise target we
749 may need to make a stub for them. The stub uses the PLT, so we
750 need to create PLT entries for these symbols too. */
751 case R_PARISC_PCREL12F:
752 case R_PARISC_PCREL17F:
753 case R_PARISC_PCREL22F:
754 case R_PARISC_PCREL32:
755 case R_PARISC_PCREL64:
756 case R_PARISC_PCREL21L:
757 case R_PARISC_PCREL17R:
758 case R_PARISC_PCREL17C:
759 case R_PARISC_PCREL14R:
760 case R_PARISC_PCREL14F:
761 case R_PARISC_PCREL22C:
762 case R_PARISC_PCREL14WR:
763 case R_PARISC_PCREL14DR:
764 case R_PARISC_PCREL16F:
765 case R_PARISC_PCREL16WF:
766 case R_PARISC_PCREL16DF:
767 need_entry = (NEED_PLT | NEED_STUB);
768 break;
769
770 case R_PARISC_PLTOFF21L:
771 case R_PARISC_PLTOFF14R:
772 case R_PARISC_PLTOFF14F:
773 case R_PARISC_PLTOFF14WR:
774 case R_PARISC_PLTOFF14DR:
775 case R_PARISC_PLTOFF16F:
776 case R_PARISC_PLTOFF16WF:
777 case R_PARISC_PLTOFF16DF:
778 need_entry = (NEED_PLT);
779 break;
780
781 case R_PARISC_DIR64:
782 if (info->shared || maybe_dynamic)
783 need_entry = (NEED_DYNREL);
784 dynrel_type = R_PARISC_DIR64;
785 break;
786
787 /* This is an indirect reference through the DLT to get the address
788 of a OPD descriptor. Thus we need to make a DLT entry that points
789 to an OPD entry. */
790 case R_PARISC_LTOFF_FPTR21L:
791 case R_PARISC_LTOFF_FPTR14R:
792 case R_PARISC_LTOFF_FPTR14WR:
793 case R_PARISC_LTOFF_FPTR14DR:
794 case R_PARISC_LTOFF_FPTR32:
795 case R_PARISC_LTOFF_FPTR64:
796 case R_PARISC_LTOFF_FPTR16F:
797 case R_PARISC_LTOFF_FPTR16WF:
798 case R_PARISC_LTOFF_FPTR16DF:
799 if (info->shared || maybe_dynamic)
800 need_entry = (NEED_DLT | NEED_OPD);
801 else
802 need_entry = (NEED_DLT | NEED_OPD);
803 dynrel_type = R_PARISC_FPTR64;
804 break;
805
806 /* This is a simple OPD entry. */
807 case R_PARISC_FPTR64:
808 if (info->shared || maybe_dynamic)
809 need_entry = (NEED_OPD | NEED_DYNREL);
810 else
811 need_entry = (NEED_OPD);
812 dynrel_type = R_PARISC_FPTR64;
813 break;
814
815 /* Add more cases as needed. */
816 }
817
818 if (!need_entry)
819 continue;
820
821 /* Collect a canonical name for this address. */
822 addr_name = get_dyn_name (sec, h, rel, &buf, &buf_len);
823
824 /* Collect the canonical entry data for this address. */
825 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
826 addr_name, true, true);
827 BFD_ASSERT (dyn_h);
828
829 /* Stash away enough information to be able to find this symbol
830 regardless of whether or not it is local or global. */
831 dyn_h->h = h;
832 dyn_h->owner = abfd;
833 dyn_h->sym_indx = r_symndx;
834
835 /* ?!? We may need to do some error checking in here. */
836 /* Create what's needed. */
837 if (need_entry & NEED_DLT)
838 {
839 if (! hppa_info->dlt_sec
840 && ! get_dlt (abfd, info, hppa_info))
841 goto err_out;
842 dyn_h->want_dlt = 1;
843 }
844
845 if (need_entry & NEED_PLT)
846 {
847 if (! hppa_info->plt_sec
848 && ! get_plt (abfd, info, hppa_info))
849 goto err_out;
850 dyn_h->want_plt = 1;
851 }
852
853 if (need_entry & NEED_STUB)
854 {
855 if (! hppa_info->stub_sec
856 && ! get_stub (abfd, info, hppa_info))
857 goto err_out;
858 dyn_h->want_stub = 1;
859 }
860
861 if (need_entry & NEED_OPD)
862 {
863 if (! hppa_info->opd_sec
864 && ! get_opd (abfd, info, hppa_info))
865 goto err_out;
866
867 dyn_h->want_opd = 1;
868
869 /* FPTRs are not allocated by the dynamic linker for PA64, though
870 it is possible that will change in the future. */
871
872 /* This could be a local function that had its address taken, in
873 which case H will be NULL. */
874 if (h)
875 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
876 }
877
878 /* Add a new dynamic relocation to the chain of dynamic
879 relocations for this symbol. */
880 if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
881 {
882 if (! hppa_info->other_rel_sec
883 && ! get_reloc_section (abfd, hppa_info, sec))
884 goto err_out;
885
886 if (!count_dyn_reloc (abfd, dyn_h, dynrel_type, sec,
887 sec_symndx, rel->r_offset, rel->r_addend))
888 goto err_out;
889
890 /* If we are building a shared library and we just recorded
891 a dynamic R_PARISC_FPTR64 relocation, then make sure the
892 section symbol for this section ends up in the dynamic
893 symbol table. */
894 if (info->shared && dynrel_type == R_PARISC_FPTR64
895 && ! (_bfd_elf64_link_record_local_dynamic_symbol
896 (info, abfd, sec_symndx)))
897 return false;
898 }
899 }
900
901 if (buf)
902 free (buf);
903 return true;
904
905 err_out:
906 if (buf)
907 free (buf);
908 return false;
909 }
910
911 struct elf64_hppa_allocate_data
912 {
913 struct bfd_link_info *info;
914 bfd_size_type ofs;
915 };
916
917 /* Should we do dynamic things to this symbol? */
918
919 static boolean
920 elf64_hppa_dynamic_symbol_p (h, info)
921 struct elf_link_hash_entry *h;
922 struct bfd_link_info *info;
923 {
924 if (h == NULL)
925 return false;
926
927 while (h->root.type == bfd_link_hash_indirect
928 || h->root.type == bfd_link_hash_warning)
929 h = (struct elf_link_hash_entry *) h->root.u.i.link;
930
931 if (h->dynindx == -1)
932 return false;
933
934 if (h->root.type == bfd_link_hash_undefweak
935 || h->root.type == bfd_link_hash_defweak)
936 return true;
937
938 if (h->root.root.string[0] == '$' && h->root.root.string[1] == '$')
939 return false;
940
941 if ((info->shared && !info->symbolic)
942 || ((h->elf_link_hash_flags
943 & (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR))
944 == (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR)))
945 return true;
946
947 return false;
948 }
949
950 /* Mark all funtions exported by this file so that we can later allocate
951 entries in .opd for them. */
952
953 static boolean
954 elf64_hppa_mark_exported_functions (h, data)
955 struct elf_link_hash_entry *h;
956 PTR data;
957 {
958 struct bfd_link_info *info = (struct bfd_link_info *)data;
959 struct elf64_hppa_link_hash_table *hppa_info;
960
961 hppa_info = elf64_hppa_hash_table (info);
962
963 if (h
964 && (h->root.type == bfd_link_hash_defined
965 || h->root.type == bfd_link_hash_defweak)
966 && h->root.u.def.section->output_section != NULL
967 && h->type == STT_FUNC)
968 {
969 struct elf64_hppa_dyn_hash_entry *dyn_h;
970
971 /* Add this symbol to the PA64 linker hash table. */
972 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
973 h->root.root.string, true, true);
974 BFD_ASSERT (dyn_h);
975 dyn_h->h = h;
976
977 if (! hppa_info->opd_sec
978 && ! get_opd (hppa_info->root.dynobj, info, hppa_info))
979 return false;
980
981 dyn_h->want_opd = 1;
982 /* Put a flag here for output_symbol_hook. */
983 dyn_h->st_shndx = -1;
984 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
985 }
986
987 return true;
988 }
989
990 /* Allocate space for a DLT entry. */
991
992 static boolean
993 allocate_global_data_dlt (dyn_h, data)
994 struct elf64_hppa_dyn_hash_entry *dyn_h;
995 PTR data;
996 {
997 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
998
999 if (dyn_h->want_dlt)
1000 {
1001 struct elf_link_hash_entry *h = dyn_h->h;
1002
1003 if (x->info->shared)
1004 {
1005 /* Possibly add the symbol to the local dynamic symbol
1006 table since we might need to create a dynamic relocation
1007 against it. */
1008 if (! h
1009 || (h && h->dynindx == -1))
1010 {
1011 bfd *owner;
1012 owner = (h ? h->root.u.def.section->owner : dyn_h->owner);
1013
1014 if (!_bfd_elf64_link_record_local_dynamic_symbol
1015 (x->info, owner, dyn_h->sym_indx))
1016 return false;
1017 }
1018 }
1019
1020 dyn_h->dlt_offset = x->ofs;
1021 x->ofs += DLT_ENTRY_SIZE;
1022 }
1023 return true;
1024 }
1025
1026 /* Allocate space for a DLT.PLT entry. */
1027
1028 static boolean
1029 allocate_global_data_plt (dyn_h, data)
1030 struct elf64_hppa_dyn_hash_entry *dyn_h;
1031 PTR data;
1032 {
1033 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1034
1035 if (dyn_h->want_plt
1036 && elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info)
1037 && !((dyn_h->h->root.type == bfd_link_hash_defined
1038 || dyn_h->h->root.type == bfd_link_hash_defweak)
1039 && dyn_h->h->root.u.def.section->output_section != NULL))
1040 {
1041 dyn_h->plt_offset = x->ofs;
1042 x->ofs += PLT_ENTRY_SIZE;
1043 if (dyn_h->plt_offset < 0x2000)
1044 elf64_hppa_hash_table (x->info)->gp_offset = dyn_h->plt_offset;
1045 }
1046 else
1047 dyn_h->want_plt = 0;
1048
1049 return true;
1050 }
1051
1052 /* Allocate space for a STUB entry. */
1053
1054 static boolean
1055 allocate_global_data_stub (dyn_h, data)
1056 struct elf64_hppa_dyn_hash_entry *dyn_h;
1057 PTR data;
1058 {
1059 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1060
1061 if (dyn_h->want_stub
1062 && elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info)
1063 && !((dyn_h->h->root.type == bfd_link_hash_defined
1064 || dyn_h->h->root.type == bfd_link_hash_defweak)
1065 && dyn_h->h->root.u.def.section->output_section != NULL))
1066 {
1067 dyn_h->stub_offset = x->ofs;
1068 x->ofs += sizeof (plt_stub);
1069 }
1070 else
1071 dyn_h->want_stub = 0;
1072 return true;
1073 }
1074
1075 /* Allocate space for a FPTR entry. */
1076
1077 static boolean
1078 allocate_global_data_opd (dyn_h, data)
1079 struct elf64_hppa_dyn_hash_entry *dyn_h;
1080 PTR data;
1081 {
1082 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1083
1084 if (dyn_h->want_opd)
1085 {
1086 struct elf_link_hash_entry *h = dyn_h->h;
1087
1088 if (h)
1089 while (h->root.type == bfd_link_hash_indirect
1090 || h->root.type == bfd_link_hash_warning)
1091 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1092
1093 /* We never need an opd entry for a symbol which is not
1094 defined by this output file. */
1095 if (h && h->root.type == bfd_link_hash_undefined)
1096 dyn_h->want_opd = 0;
1097
1098 /* If we are creating a shared library, took the address of a local
1099 function or might export this function from this object file, then
1100 we have to create an opd descriptor. */
1101 else if (x->info->shared
1102 || h == NULL
1103 || h->dynindx == -1
1104 || ((h->root.type == bfd_link_hash_defined
1105 || h->root.type == bfd_link_hash_defweak)
1106 && h->root.u.def.section->output_section != NULL))
1107 {
1108 /* If we are creating a shared library, then we will have to
1109 create a runtime relocation for the symbol to properly
1110 initialize the .opd entry. Make sure the symbol gets
1111 added to the dynamic symbol table. */
1112 if (x->info->shared
1113 && (h == NULL || (h->dynindx == -1)))
1114 {
1115 bfd *owner;
1116 owner = (h ? h->root.u.def.section->owner : dyn_h->owner);
1117
1118 if (!_bfd_elf64_link_record_local_dynamic_symbol
1119 (x->info, owner, dyn_h->sym_indx))
1120 return false;
1121 }
1122
1123 /* This may not be necessary or desirable anymore now that
1124 we have some support for dealing with section symbols
1125 in dynamic relocs. But name munging does make the result
1126 much easier to debug. ie, the EPLT reloc will reference
1127 a symbol like .foobar, instead of .text + offset. */
1128 if (x->info->shared && h)
1129 {
1130 char *new_name;
1131 struct elf_link_hash_entry *nh;
1132
1133 new_name = alloca (strlen (h->root.root.string) + 2);
1134 new_name[0] = '.';
1135 strcpy (new_name + 1, h->root.root.string);
1136
1137 nh = elf_link_hash_lookup (elf_hash_table (x->info),
1138 new_name, true, true, true);
1139
1140 nh->root.type = h->root.type;
1141 nh->root.u.def.value = h->root.u.def.value;
1142 nh->root.u.def.section = h->root.u.def.section;
1143
1144 if (! bfd_elf64_link_record_dynamic_symbol (x->info, nh))
1145 return false;
1146
1147 }
1148 dyn_h->opd_offset = x->ofs;
1149 x->ofs += OPD_ENTRY_SIZE;
1150 }
1151
1152 /* Otherwise we do not need an opd entry. */
1153 else
1154 dyn_h->want_opd = 0;
1155 }
1156 return true;
1157 }
1158
1159 /* HP requires the EI_OSABI field to be filled in. The assignment to
1160 EI_ABIVERSION may not be strictly necessary. */
1161
1162 static void
1163 elf64_hppa_post_process_headers (abfd, link_info)
1164 bfd * abfd;
1165 struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
1166 {
1167 Elf_Internal_Ehdr * i_ehdrp;
1168
1169 i_ehdrp = elf_elfheader (abfd);
1170
1171 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
1172 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
1173 }
1174
1175 /* Create function descriptor section (.opd). This section is called .opd
1176 because it contains "official prodecure descriptors". The "official"
1177 refers to the fact that these descriptors are used when taking the address
1178 of a procedure, thus ensuring a unique address for each procedure. */
1179
1180 static boolean
1181 get_opd (abfd, info, hppa_info)
1182 bfd *abfd;
1183 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1184 struct elf64_hppa_link_hash_table *hppa_info;
1185 {
1186 asection *opd;
1187 bfd *dynobj;
1188
1189 opd = hppa_info->opd_sec;
1190 if (!opd)
1191 {
1192 dynobj = hppa_info->root.dynobj;
1193 if (!dynobj)
1194 hppa_info->root.dynobj = dynobj = abfd;
1195
1196 opd = bfd_make_section (dynobj, ".opd");
1197 if (!opd
1198 || !bfd_set_section_flags (dynobj, opd,
1199 (SEC_ALLOC
1200 | SEC_LOAD
1201 | SEC_HAS_CONTENTS
1202 | SEC_IN_MEMORY
1203 | SEC_LINKER_CREATED))
1204 || !bfd_set_section_alignment (abfd, opd, 3))
1205 {
1206 BFD_ASSERT (0);
1207 return false;
1208 }
1209
1210 hppa_info->opd_sec = opd;
1211 }
1212
1213 return true;
1214 }
1215
1216 /* Create the PLT section. */
1217
1218 static boolean
1219 get_plt (abfd, info, hppa_info)
1220 bfd *abfd;
1221 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1222 struct elf64_hppa_link_hash_table *hppa_info;
1223 {
1224 asection *plt;
1225 bfd *dynobj;
1226
1227 plt = hppa_info->plt_sec;
1228 if (!plt)
1229 {
1230 dynobj = hppa_info->root.dynobj;
1231 if (!dynobj)
1232 hppa_info->root.dynobj = dynobj = abfd;
1233
1234 plt = bfd_make_section (dynobj, ".plt");
1235 if (!plt
1236 || !bfd_set_section_flags (dynobj, plt,
1237 (SEC_ALLOC
1238 | SEC_LOAD
1239 | SEC_HAS_CONTENTS
1240 | SEC_IN_MEMORY
1241 | SEC_LINKER_CREATED))
1242 || !bfd_set_section_alignment (abfd, plt, 3))
1243 {
1244 BFD_ASSERT (0);
1245 return false;
1246 }
1247
1248 hppa_info->plt_sec = plt;
1249 }
1250
1251 return true;
1252 }
1253
1254 /* Create the DLT section. */
1255
1256 static boolean
1257 get_dlt (abfd, info, hppa_info)
1258 bfd *abfd;
1259 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1260 struct elf64_hppa_link_hash_table *hppa_info;
1261 {
1262 asection *dlt;
1263 bfd *dynobj;
1264
1265 dlt = hppa_info->dlt_sec;
1266 if (!dlt)
1267 {
1268 dynobj = hppa_info->root.dynobj;
1269 if (!dynobj)
1270 hppa_info->root.dynobj = dynobj = abfd;
1271
1272 dlt = bfd_make_section (dynobj, ".dlt");
1273 if (!dlt
1274 || !bfd_set_section_flags (dynobj, dlt,
1275 (SEC_ALLOC
1276 | SEC_LOAD
1277 | SEC_HAS_CONTENTS
1278 | SEC_IN_MEMORY
1279 | SEC_LINKER_CREATED))
1280 || !bfd_set_section_alignment (abfd, dlt, 3))
1281 {
1282 BFD_ASSERT (0);
1283 return false;
1284 }
1285
1286 hppa_info->dlt_sec = dlt;
1287 }
1288
1289 return true;
1290 }
1291
1292 /* Create the stubs section. */
1293
1294 static boolean
1295 get_stub (abfd, info, hppa_info)
1296 bfd *abfd;
1297 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1298 struct elf64_hppa_link_hash_table *hppa_info;
1299 {
1300 asection *stub;
1301 bfd *dynobj;
1302
1303 stub = hppa_info->stub_sec;
1304 if (!stub)
1305 {
1306 dynobj = hppa_info->root.dynobj;
1307 if (!dynobj)
1308 hppa_info->root.dynobj = dynobj = abfd;
1309
1310 stub = bfd_make_section (dynobj, ".stub");
1311 if (!stub
1312 || !bfd_set_section_flags (dynobj, stub,
1313 (SEC_ALLOC
1314 | SEC_LOAD
1315 | SEC_HAS_CONTENTS
1316 | SEC_IN_MEMORY
1317 | SEC_READONLY
1318 | SEC_LINKER_CREATED))
1319 || !bfd_set_section_alignment (abfd, stub, 3))
1320 {
1321 BFD_ASSERT (0);
1322 return false;
1323 }
1324
1325 hppa_info->stub_sec = stub;
1326 }
1327
1328 return true;
1329 }
1330
1331 /* Create sections necessary for dynamic linking. This is only a rough
1332 cut and will likely change as we learn more about the somewhat
1333 unusual dynamic linking scheme HP uses.
1334
1335 .stub:
1336 Contains code to implement cross-space calls. The first time one
1337 of the stubs is used it will call into the dynamic linker, later
1338 calls will go straight to the target.
1339
1340 The only stub we support right now looks like
1341
1342 ldd OFFSET(%dp),%r1
1343 bve %r0(%r1)
1344 ldd OFFSET+8(%dp),%dp
1345
1346 Other stubs may be needed in the future. We may want the remove
1347 the break/nop instruction. It is only used right now to keep the
1348 offset of a .plt entry and a .stub entry in sync.
1349
1350 .dlt:
1351 This is what most people call the .got. HP used a different name.
1352 Losers.
1353
1354 .rela.dlt:
1355 Relocations for the DLT.
1356
1357 .plt:
1358 Function pointers as address,gp pairs.
1359
1360 .rela.plt:
1361 Should contain dynamic IPLT (and EPLT?) relocations.
1362
1363 .opd:
1364 FPTRS
1365
1366 .rela.opd:
1367 EPLT relocations for symbols exported from shared libraries. */
1368
1369 static boolean
1370 elf64_hppa_create_dynamic_sections (abfd, info)
1371 bfd *abfd;
1372 struct bfd_link_info *info;
1373 {
1374 asection *s;
1375
1376 if (! get_stub (abfd, info, elf64_hppa_hash_table (info)))
1377 return false;
1378
1379 if (! get_dlt (abfd, info, elf64_hppa_hash_table (info)))
1380 return false;
1381
1382 if (! get_plt (abfd, info, elf64_hppa_hash_table (info)))
1383 return false;
1384
1385 if (! get_opd (abfd, info, elf64_hppa_hash_table (info)))
1386 return false;
1387
1388 s = bfd_make_section(abfd, ".rela.dlt");
1389 if (s == NULL
1390 || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1391 | SEC_HAS_CONTENTS
1392 | SEC_IN_MEMORY
1393 | SEC_READONLY
1394 | SEC_LINKER_CREATED))
1395 || !bfd_set_section_alignment (abfd, s, 3))
1396 return false;
1397 elf64_hppa_hash_table (info)->dlt_rel_sec = s;
1398
1399 s = bfd_make_section(abfd, ".rela.plt");
1400 if (s == NULL
1401 || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1402 | SEC_HAS_CONTENTS
1403 | SEC_IN_MEMORY
1404 | SEC_READONLY
1405 | SEC_LINKER_CREATED))
1406 || !bfd_set_section_alignment (abfd, s, 3))
1407 return false;
1408 elf64_hppa_hash_table (info)->plt_rel_sec = s;
1409
1410 s = bfd_make_section(abfd, ".rela.data");
1411 if (s == NULL
1412 || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1413 | SEC_HAS_CONTENTS
1414 | SEC_IN_MEMORY
1415 | SEC_READONLY
1416 | SEC_LINKER_CREATED))
1417 || !bfd_set_section_alignment (abfd, s, 3))
1418 return false;
1419 elf64_hppa_hash_table (info)->other_rel_sec = s;
1420
1421 s = bfd_make_section(abfd, ".rela.opd");
1422 if (s == NULL
1423 || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1424 | SEC_HAS_CONTENTS
1425 | SEC_IN_MEMORY
1426 | SEC_READONLY
1427 | SEC_LINKER_CREATED))
1428 || !bfd_set_section_alignment (abfd, s, 3))
1429 return false;
1430 elf64_hppa_hash_table (info)->opd_rel_sec = s;
1431
1432 return true;
1433 }
1434
1435 /* Allocate dynamic relocations for those symbols that turned out
1436 to be dynamic. */
1437
1438 static boolean
1439 allocate_dynrel_entries (dyn_h, data)
1440 struct elf64_hppa_dyn_hash_entry *dyn_h;
1441 PTR data;
1442 {
1443 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1444 struct elf64_hppa_link_hash_table *hppa_info;
1445 struct elf64_hppa_dyn_reloc_entry *rent;
1446 boolean dynamic_symbol, shared;
1447
1448 hppa_info = elf64_hppa_hash_table (x->info);
1449 dynamic_symbol = elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info);
1450 shared = x->info->shared;
1451
1452 /* We may need to allocate relocations for a non-dynamic symbol
1453 when creating a shared library. */
1454 if (!dynamic_symbol && !shared)
1455 return true;
1456
1457 /* Take care of the normal data relocations. */
1458
1459 for (rent = dyn_h->reloc_entries; rent; rent = rent->next)
1460 {
1461 switch (rent->type)
1462 {
1463 case R_PARISC_FPTR64:
1464 /* Allocate one iff we are not building a shared library and
1465 !want_opd, which by this point will be true only if we're
1466 actually allocating one statically in the main executable. */
1467 if (!x->info->shared && dyn_h->want_opd)
1468 continue;
1469 break;
1470 }
1471 hppa_info->other_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1472
1473 /* Make sure this symbol gets into the dynamic symbol table if it is
1474 not already recorded. ?!? This should not be in the loop since
1475 the symbol need only be added once. */
1476 if (dyn_h->h == 0 || dyn_h->h->dynindx == -1)
1477 if (!_bfd_elf64_link_record_local_dynamic_symbol
1478 (x->info, rent->sec->owner, dyn_h->sym_indx))
1479 return false;
1480 }
1481
1482 /* Take care of the GOT and PLT relocations. */
1483
1484 if ((dynamic_symbol || shared) && dyn_h->want_dlt)
1485 hppa_info->dlt_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1486
1487 /* If we are building a shared library, then every symbol that has an
1488 opd entry will need an EPLT relocation to relocate the symbol's address
1489 and __gp value based on the runtime load address. */
1490 if (shared && dyn_h->want_opd)
1491 hppa_info->opd_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1492
1493 if (dyn_h->want_plt && dynamic_symbol)
1494 {
1495 bfd_size_type t = 0;
1496
1497 /* Dynamic symbols get one IPLT relocation. Local symbols in
1498 shared libraries get two REL relocations. Local symbols in
1499 main applications get nothing. */
1500 if (dynamic_symbol)
1501 t = sizeof (Elf64_External_Rela);
1502 else if (shared)
1503 t = 2 * sizeof (Elf64_External_Rela);
1504
1505 hppa_info->plt_rel_sec->_raw_size += t;
1506 }
1507
1508 return true;
1509 }
1510
1511 /* Adjust a symbol defined by a dynamic object and referenced by a
1512 regular object. */
1513
1514 static boolean
1515 elf64_hppa_adjust_dynamic_symbol (info, h)
1516 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1517 struct elf_link_hash_entry *h;
1518 {
1519 /* ??? Undefined symbols with PLT entries should be re-defined
1520 to be the PLT entry. */
1521
1522 /* If this is a weak symbol, and there is a real definition, the
1523 processor independent code will have arranged for us to see the
1524 real definition first, and we can just use the same value. */
1525 if (h->weakdef != NULL)
1526 {
1527 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1528 || h->weakdef->root.type == bfd_link_hash_defweak);
1529 h->root.u.def.section = h->weakdef->root.u.def.section;
1530 h->root.u.def.value = h->weakdef->root.u.def.value;
1531 return true;
1532 }
1533
1534 /* If this is a reference to a symbol defined by a dynamic object which
1535 is not a function, we might allocate the symbol in our .dynbss section
1536 and allocate a COPY dynamic relocation.
1537
1538 But PA64 code is canonically PIC, so as a rule we can avoid this sort
1539 of hackery. */
1540
1541 return true;
1542 }
1543
1544 /* Set the final sizes of the dynamic sections and allocate memory for
1545 the contents of our special sections. */
1546
1547 static boolean
1548 elf64_hppa_size_dynamic_sections (output_bfd, info)
1549 bfd *output_bfd;
1550 struct bfd_link_info *info;
1551 {
1552 bfd *dynobj;
1553 asection *s;
1554 boolean plt;
1555 boolean relocs;
1556 boolean reltext;
1557 struct elf64_hppa_allocate_data data;
1558 struct elf64_hppa_link_hash_table *hppa_info;
1559
1560 hppa_info = elf64_hppa_hash_table (info);
1561
1562 dynobj = elf_hash_table (info)->dynobj;
1563 BFD_ASSERT (dynobj != NULL);
1564
1565 if (elf_hash_table (info)->dynamic_sections_created)
1566 {
1567 /* Set the contents of the .interp section to the interpreter. */
1568 if (! info->shared)
1569 {
1570 s = bfd_get_section_by_name (dynobj, ".interp");
1571 BFD_ASSERT (s != NULL);
1572 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1573 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1574 }
1575 }
1576 else
1577 {
1578 /* We may have created entries in the .rela.got section.
1579 However, if we are not creating the dynamic sections, we will
1580 not actually use these entries. Reset the size of .rela.dlt,
1581 which will cause it to get stripped from the output file
1582 below. */
1583 s = bfd_get_section_by_name (dynobj, ".rela.dlt");
1584 if (s != NULL)
1585 s->_raw_size = 0;
1586 }
1587
1588 /* Allocate the GOT entries. */
1589
1590 data.info = info;
1591 if (elf64_hppa_hash_table (info)->dlt_sec)
1592 {
1593 data.ofs = 0x0;
1594 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1595 allocate_global_data_dlt, &data);
1596 hppa_info->dlt_sec->_raw_size = data.ofs;
1597
1598 data.ofs = 0x0;
1599 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1600 allocate_global_data_plt, &data);
1601 hppa_info->plt_sec->_raw_size = data.ofs;
1602
1603 data.ofs = 0x0;
1604 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1605 allocate_global_data_stub, &data);
1606 hppa_info->stub_sec->_raw_size = data.ofs;
1607 }
1608
1609 /* Mark each function this program exports so that we will allocate
1610 space in the .opd section for each function's FPTR.
1611
1612 We have to traverse the main linker hash table since we have to
1613 find functions which may not have been mentioned in any relocs. */
1614 elf_link_hash_traverse (elf_hash_table (info),
1615 elf64_hppa_mark_exported_functions,
1616 info);
1617
1618 /* Allocate space for entries in the .opd section. */
1619 if (elf64_hppa_hash_table (info)->opd_sec)
1620 {
1621 data.ofs = 0;
1622 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1623 allocate_global_data_opd, &data);
1624 hppa_info->opd_sec->_raw_size = data.ofs;
1625 }
1626
1627 /* Now allocate space for dynamic relocations, if necessary. */
1628 if (hppa_info->root.dynamic_sections_created)
1629 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1630 allocate_dynrel_entries, &data);
1631
1632 /* The sizes of all the sections are set. Allocate memory for them. */
1633 plt = false;
1634 relocs = false;
1635 reltext = false;
1636 for (s = dynobj->sections; s != NULL; s = s->next)
1637 {
1638 const char *name;
1639 boolean strip;
1640
1641 if ((s->flags & SEC_LINKER_CREATED) == 0)
1642 continue;
1643
1644 /* It's OK to base decisions on the section name, because none
1645 of the dynobj section names depend upon the input files. */
1646 name = bfd_get_section_name (dynobj, s);
1647
1648 strip = 0;
1649
1650 if (strcmp (name, ".plt") == 0)
1651 {
1652 if (s->_raw_size == 0)
1653 {
1654 /* Strip this section if we don't need it; see the
1655 comment below. */
1656 strip = true;
1657 }
1658 else
1659 {
1660 /* Remember whether there is a PLT. */
1661 plt = true;
1662 }
1663 }
1664 else if (strcmp (name, ".dlt") == 0)
1665 {
1666 if (s->_raw_size == 0)
1667 {
1668 /* Strip this section if we don't need it; see the
1669 comment below. */
1670 strip = true;
1671 }
1672 }
1673 else if (strcmp (name, ".opd") == 0)
1674 {
1675 if (s->_raw_size == 0)
1676 {
1677 /* Strip this section if we don't need it; see the
1678 comment below. */
1679 strip = true;
1680 }
1681 }
1682 else if (strncmp (name, ".rela", 4) == 0)
1683 {
1684 if (s->_raw_size == 0)
1685 {
1686 /* If we don't need this section, strip it from the
1687 output file. This is mostly to handle .rela.bss and
1688 .rela.plt. We must create both sections in
1689 create_dynamic_sections, because they must be created
1690 before the linker maps input sections to output
1691 sections. The linker does that before
1692 adjust_dynamic_symbol is called, and it is that
1693 function which decides whether anything needs to go
1694 into these sections. */
1695 strip = true;
1696 }
1697 else
1698 {
1699 asection *target;
1700
1701 /* Remember whether there are any reloc sections other
1702 than .rela.plt. */
1703 if (strcmp (name, ".rela.plt") != 0)
1704 {
1705 const char *outname;
1706
1707 relocs = true;
1708
1709 /* If this relocation section applies to a read only
1710 section, then we probably need a DT_TEXTREL
1711 entry. The entries in the .rela.plt section
1712 really apply to the .got section, which we
1713 created ourselves and so know is not readonly. */
1714 outname = bfd_get_section_name (output_bfd,
1715 s->output_section);
1716 target = bfd_get_section_by_name (output_bfd, outname + 4);
1717 if (target != NULL
1718 && (target->flags & SEC_READONLY) != 0
1719 && (target->flags & SEC_ALLOC) != 0)
1720 reltext = true;
1721 }
1722
1723 /* We use the reloc_count field as a counter if we need
1724 to copy relocs into the output file. */
1725 s->reloc_count = 0;
1726 }
1727 }
1728 else if (strncmp (name, ".dlt", 4) != 0
1729 && strcmp (name, ".stub") != 0
1730 && strcmp (name, ".got") != 0)
1731 {
1732 /* It's not one of our sections, so don't allocate space. */
1733 continue;
1734 }
1735
1736 if (strip)
1737 {
1738 _bfd_strip_section_from_output (info, s);
1739 continue;
1740 }
1741
1742 /* Allocate memory for the section contents if it has not
1743 been allocated already. We use bfd_zalloc here in case
1744 unused entries are not reclaimed before the section's
1745 contents are written out. This should not happen, but this
1746 way if it does, we get a R_PARISC_NONE reloc instead of
1747 garbage. */
1748 if (s->contents == NULL)
1749 {
1750 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1751 if (s->contents == NULL && s->_raw_size != 0)
1752 return false;
1753 }
1754 }
1755
1756 if (elf_hash_table (info)->dynamic_sections_created)
1757 {
1758 /* Always create a DT_PLTGOT. It actually has nothing to do with
1759 the PLT, it is how we communicate the __gp value of a load
1760 module to the dynamic linker. */
1761 if (! bfd_elf64_add_dynamic_entry (info, DT_HP_DLD_FLAGS, 0)
1762 || ! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0))
1763 return false;
1764
1765 /* Add some entries to the .dynamic section. We fill in the
1766 values later, in elf64_hppa_finish_dynamic_sections, but we
1767 must add the entries now so that we get the correct size for
1768 the .dynamic section. The DT_DEBUG entry is filled in by the
1769 dynamic linker and used by the debugger. */
1770 if (! info->shared)
1771 {
1772 if (! bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0)
1773 || ! bfd_elf64_add_dynamic_entry (info, DT_HP_DLD_HOOK, 0)
1774 || ! bfd_elf64_add_dynamic_entry (info, DT_HP_LOAD_MAP, 0))
1775 return false;
1776 }
1777
1778 if (plt)
1779 {
1780 if (! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1781 || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1782 || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
1783 return false;
1784 }
1785
1786 if (relocs)
1787 {
1788 if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
1789 || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
1790 || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
1791 sizeof (Elf64_External_Rela)))
1792 return false;
1793 }
1794
1795 if (reltext)
1796 {
1797 if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
1798 return false;
1799 info->flags |= DF_TEXTREL;
1800 }
1801 }
1802
1803 return true;
1804 }
1805
1806 /* Called after we have output the symbol into the dynamic symbol
1807 table, but before we output the symbol into the normal symbol
1808 table.
1809
1810 For some symbols we had to change their address when outputting
1811 the dynamic symbol table. We undo that change here so that
1812 the symbols have their expected value in the normal symbol
1813 table. Ick. */
1814
1815 static boolean
1816 elf64_hppa_link_output_symbol_hook (abfd, info, name, sym, input_sec)
1817 bfd *abfd ATTRIBUTE_UNUSED;
1818 struct bfd_link_info *info;
1819 const char *name;
1820 Elf_Internal_Sym *sym;
1821 asection *input_sec ATTRIBUTE_UNUSED;
1822 {
1823 struct elf64_hppa_link_hash_table *hppa_info;
1824 struct elf64_hppa_dyn_hash_entry *dyn_h;
1825
1826 /* We may be called with the file symbol or section symbols.
1827 They never need munging, so it is safe to ignore them. */
1828 if (!name)
1829 return true;
1830
1831 /* Get the PA dyn_symbol (if any) associated with NAME. */
1832 hppa_info = elf64_hppa_hash_table (info);
1833 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1834 name, false, false);
1835
1836 /* Function symbols for which we created .opd entries *may* have been
1837 munged by finish_dynamic_symbol and have to be un-munged here.
1838
1839 Note that finish_dynamic_symbol sometimes turns dynamic symbols
1840 into non-dynamic ones, so we initialize st_shndx to -1 in
1841 mark_exported_functions and check to see if it was overwritten
1842 here instead of just checking dyn_h->h->dynindx. */
1843 if (dyn_h && dyn_h->want_opd && dyn_h->st_shndx != -1)
1844 {
1845 /* Restore the saved value and section index. */
1846 sym->st_value = dyn_h->st_value;
1847 sym->st_shndx = dyn_h->st_shndx;
1848 }
1849
1850 return true;
1851 }
1852
1853 /* Finish up dynamic symbol handling. We set the contents of various
1854 dynamic sections here. */
1855
1856 static boolean
1857 elf64_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
1858 bfd *output_bfd;
1859 struct bfd_link_info *info;
1860 struct elf_link_hash_entry *h;
1861 Elf_Internal_Sym *sym;
1862 {
1863 asection *stub, *splt, *sdlt, *sopd, *spltrel, *sdltrel;
1864 struct elf64_hppa_link_hash_table *hppa_info;
1865 struct elf64_hppa_dyn_hash_entry *dyn_h;
1866
1867 hppa_info = elf64_hppa_hash_table (info);
1868 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1869 h->root.root.string, false, false);
1870
1871 stub = hppa_info->stub_sec;
1872 splt = hppa_info->plt_sec;
1873 sdlt = hppa_info->dlt_sec;
1874 sopd = hppa_info->opd_sec;
1875 spltrel = hppa_info->plt_rel_sec;
1876 sdltrel = hppa_info->dlt_rel_sec;
1877
1878 BFD_ASSERT (stub != NULL && splt != NULL
1879 && sopd != NULL && sdlt != NULL)
1880
1881 /* Incredible. It is actually necessary to NOT use the symbol's real
1882 value when building the dynamic symbol table for a shared library.
1883 At least for symbols that refer to functions.
1884
1885 We will store a new value and section index into the symbol long
1886 enough to output it into the dynamic symbol table, then we restore
1887 the original values (in elf64_hppa_link_output_symbol_hook). */
1888 if (dyn_h && dyn_h->want_opd)
1889 {
1890 /* Save away the original value and section index so that we
1891 can restore them later. */
1892 dyn_h->st_value = sym->st_value;
1893 dyn_h->st_shndx = sym->st_shndx;
1894
1895 /* For the dynamic symbol table entry, we want the value to be
1896 address of this symbol's entry within the .opd section. */
1897 sym->st_value = (dyn_h->opd_offset
1898 + sopd->output_offset
1899 + sopd->output_section->vma);
1900 sym->st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
1901 sopd->output_section);
1902 }
1903
1904 /* Initialize a .plt entry if requested. */
1905 if (dyn_h && dyn_h->want_plt
1906 && elf64_hppa_dynamic_symbol_p (dyn_h->h, info))
1907 {
1908 bfd_vma value;
1909 Elf_Internal_Rela rel;
1910
1911 /* We do not actually care about the value in the PLT entry
1912 if we are creating a shared library and the symbol is
1913 still undefined, we create a dynamic relocation to fill
1914 in the correct value. */
1915 if (info->shared && h->root.type == bfd_link_hash_undefined)
1916 value = 0;
1917 else
1918 value = (h->root.u.def.value + h->root.u.def.section->vma);
1919
1920 /* Fill in the entry in the procedure linkage table.
1921
1922 The format of a plt entry is
1923 <funcaddr> <__gp>.
1924
1925 plt_offset is the offset within the PLT section at which to
1926 install the PLT entry.
1927
1928 We are modifying the in-memory PLT contents here, so we do not add
1929 in the output_offset of the PLT section. */
1930
1931 bfd_put_64 (splt->owner, value, splt->contents + dyn_h->plt_offset);
1932 value = _bfd_get_gp_value (splt->output_section->owner);
1933 bfd_put_64 (splt->owner, value, splt->contents + dyn_h->plt_offset + 0x8);
1934
1935 /* Create a dynamic IPLT relocation for this entry.
1936
1937 We are creating a relocation in the output file's PLT section,
1938 which is included within the DLT secton. So we do need to include
1939 the PLT's output_offset in the computation of the relocation's
1940 address. */
1941 rel.r_offset = (dyn_h->plt_offset + splt->output_offset
1942 + splt->output_section->vma);
1943 rel.r_info = ELF64_R_INFO (h->dynindx, R_PARISC_IPLT);
1944 rel.r_addend = 0;
1945
1946 bfd_elf64_swap_reloca_out (splt->output_section->owner, &rel,
1947 (((Elf64_External_Rela *)
1948 spltrel->contents)
1949 + spltrel->reloc_count));
1950 spltrel->reloc_count++;
1951 }
1952
1953 /* Initialize an external call stub entry if requested. */
1954 if (dyn_h && dyn_h->want_stub
1955 && elf64_hppa_dynamic_symbol_p (dyn_h->h, info))
1956 {
1957 bfd_vma value;
1958 int insn;
1959
1960 /* Install the generic stub template.
1961
1962 We are modifying the contents of the stub section, so we do not
1963 need to include the stub section's output_offset here. */
1964 memcpy (stub->contents + dyn_h->stub_offset, plt_stub, sizeof (plt_stub));
1965
1966 /* Fix up the first ldd instruction.
1967
1968 We are modifying the contents of the STUB section in memory,
1969 so we do not need to include its output offset in this computation.
1970
1971 Note the plt_offset value is the value of the PLT entry relative to
1972 the start of the PLT section. These instructions will reference
1973 data relative to the value of __gp, which may not necessarily have
1974 the same address as the start of the PLT section.
1975
1976 gp_offset contains the offset of __gp within the PLT section. */
1977 value = dyn_h->plt_offset - hppa_info->gp_offset;
1978
1979 insn = bfd_get_32 (stub->owner, stub->contents + dyn_h->stub_offset);
1980 insn &= 0xffffc00e;
1981 insn |= ((value & 0x2000) >> 13);
1982 value &= 0x1ff8;
1983 value <<= 1;
1984 bfd_put_32 (stub->owner, (insn | value),
1985 stub->contents + dyn_h->stub_offset);
1986
1987 /* Fix up the second ldd instruction. */
1988 value = dyn_h->plt_offset - hppa_info->gp_offset + 8;
1989
1990 insn = bfd_get_32 (stub->owner, stub->contents + dyn_h->stub_offset + 8);
1991 insn &= 0xffffc00e;
1992 insn |= ((value & 0x2000) >> 13);
1993 value &= 0x1ff8;
1994 value <<= 1;
1995 bfd_put_32 (stub->owner, (insn | value),
1996 stub->contents + dyn_h->stub_offset + 8);
1997 }
1998
1999 /* Millicode symbols should not be put in the dynamic
2000 symbol table under any circumstances. */
2001 if (ELF_ST_TYPE (sym->st_info) == STT_PARISC_MILLI)
2002 h->dynindx = -1;
2003
2004 return true;
2005 }
2006
2007 /* The .opd section contains FPTRs for each function this file
2008 exports. Initialize the FPTR entries. */
2009
2010 static boolean
2011 elf64_hppa_finalize_opd (dyn_h, data)
2012 struct elf64_hppa_dyn_hash_entry *dyn_h;
2013 PTR data;
2014 {
2015 struct bfd_link_info *info = (struct bfd_link_info *)data;
2016 struct elf64_hppa_link_hash_table *hppa_info;
2017 struct elf_link_hash_entry *h = dyn_h->h;
2018 asection *sopd;
2019 asection *sopdrel;
2020
2021 hppa_info = elf64_hppa_hash_table (info);
2022 sopd = hppa_info->opd_sec;
2023 sopdrel = hppa_info->opd_rel_sec;
2024
2025 if (h && dyn_h && dyn_h->want_opd)
2026 {
2027 bfd_vma value;
2028
2029 /* The first two words of an .opd entry are zero.
2030
2031 We are modifying the contents of the OPD section in memory, so we
2032 do not need to include its output offset in this computation. */
2033 memset (sopd->contents + dyn_h->opd_offset, 0, 16);
2034
2035 value = (h->root.u.def.value
2036 + h->root.u.def.section->output_section->vma
2037 + h->root.u.def.section->output_offset);
2038
2039 /* The next word is the address of the function. */
2040 bfd_put_64 (sopd->owner, value, sopd->contents + dyn_h->opd_offset + 16);
2041
2042 /* The last word is our local __gp value. */
2043 value = _bfd_get_gp_value (sopd->output_section->owner);
2044 bfd_put_64 (sopd->owner, value, sopd->contents + dyn_h->opd_offset + 24);
2045 }
2046
2047 /* If we are generating a shared library, we must generate EPLT relocations
2048 for each entry in the .opd, even for static functions (they may have
2049 had their address taken). */
2050 if (info->shared && dyn_h && dyn_h->want_opd)
2051 {
2052 Elf64_Internal_Rela rel;
2053 int dynindx;
2054
2055 /* We may need to do a relocation against a local symbol, in
2056 which case we have to look up it's dynamic symbol index off
2057 the local symbol hash table. */
2058 if (h && h->dynindx != -1)
2059 dynindx = h->dynindx;
2060 else
2061 dynindx
2062 = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2063 dyn_h->sym_indx);
2064
2065 /* The offset of this relocation is the absolute address of the
2066 .opd entry for this symbol. */
2067 rel.r_offset = (dyn_h->opd_offset + sopd->output_offset
2068 + sopd->output_section->vma);
2069
2070 /* If H is non-null, then we have an external symbol.
2071
2072 It is imperative that we use a different dynamic symbol for the
2073 EPLT relocation if the symbol has global scope.
2074
2075 In the dynamic symbol table, the function symbol will have a value
2076 which is address of the function's .opd entry.
2077
2078 Thus, we can not use that dynamic symbol for the EPLT relocation
2079 (if we did, the data in the .opd would reference itself rather
2080 than the actual address of the function). Instead we have to use
2081 a new dynamic symbol which has the same value as the original global
2082 function symbol.
2083
2084 We prefix the original symbol with a "." and use the new symbol in
2085 the EPLT relocation. This new symbol has already been recorded in
2086 the symbol table, we just have to look it up and use it.
2087
2088 We do not have such problems with static functions because we do
2089 not make their addresses in the dynamic symbol table point to
2090 the .opd entry. Ultimately this should be safe since a static
2091 function can not be directly referenced outside of its shared
2092 library.
2093
2094 We do have to play similar games for FPTR relocations in shared
2095 libraries, including those for static symbols. See the FPTR
2096 handling in elf64_hppa_finalize_dynreloc. */
2097 if (h)
2098 {
2099 char *new_name;
2100 struct elf_link_hash_entry *nh;
2101
2102 new_name = alloca (strlen (h->root.root.string) + 2);
2103 new_name[0] = '.';
2104 strcpy (new_name + 1, h->root.root.string);
2105
2106 nh = elf_link_hash_lookup (elf_hash_table (info),
2107 new_name, false, false, false);
2108
2109 /* All we really want from the new symbol is its dynamic
2110 symbol index. */
2111 dynindx = nh->dynindx;
2112 }
2113
2114 rel.r_addend = 0;
2115 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_EPLT);
2116
2117 bfd_elf64_swap_reloca_out (sopd->output_section->owner, &rel,
2118 (((Elf64_External_Rela *)
2119 sopdrel->contents)
2120 + sopdrel->reloc_count));
2121 sopdrel->reloc_count++;
2122 }
2123 return true;
2124 }
2125
2126 /* The .dlt section contains addresses for items referenced through the
2127 dlt. Note that we can have a DLTIND relocation for a local symbol, thus
2128 we can not depend on finish_dynamic_symbol to initialize the .dlt. */
2129
2130 static boolean
2131 elf64_hppa_finalize_dlt (dyn_h, data)
2132 struct elf64_hppa_dyn_hash_entry *dyn_h;
2133 PTR data;
2134 {
2135 struct bfd_link_info *info = (struct bfd_link_info *)data;
2136 struct elf64_hppa_link_hash_table *hppa_info;
2137 asection *sdlt, *sdltrel;
2138 struct elf_link_hash_entry *h = dyn_h->h;
2139
2140 hppa_info = elf64_hppa_hash_table (info);
2141
2142 sdlt = hppa_info->dlt_sec;
2143 sdltrel = hppa_info->dlt_rel_sec;
2144
2145 /* H/DYN_H may refer to a local variable and we know it's
2146 address, so there is no need to create a relocation. Just install
2147 the proper value into the DLT, note this shortcut can not be
2148 skipped when building a shared library. */
2149 if (! info->shared && h && dyn_h && dyn_h->want_dlt)
2150 {
2151 bfd_vma value;
2152
2153 /* If we had an LTOFF_FPTR style relocation we want the DLT entry
2154 to point to the FPTR entry in the .opd section.
2155
2156 We include the OPD's output offset in this computation as
2157 we are referring to an absolute address in the resulting
2158 object file. */
2159 if (dyn_h->want_opd)
2160 {
2161 value = (dyn_h->opd_offset
2162 + hppa_info->opd_sec->output_offset
2163 + hppa_info->opd_sec->output_section->vma);
2164 }
2165 else
2166 {
2167 value = (h->root.u.def.value
2168 + h->root.u.def.section->output_offset);
2169
2170 if (h->root.u.def.section->output_section)
2171 value += h->root.u.def.section->output_section->vma;
2172 else
2173 value += h->root.u.def.section->vma;
2174 }
2175
2176 /* We do not need to include the output offset of the DLT section
2177 here because we are modifying the in-memory contents. */
2178 bfd_put_64 (sdlt->owner, value, sdlt->contents + dyn_h->dlt_offset);
2179 }
2180
2181 /* Create a relocation for the DLT entry assocated with this symbol.
2182 When building a shared library the symbol does not have to be dynamic. */
2183 if (dyn_h->want_dlt
2184 && (elf64_hppa_dynamic_symbol_p (dyn_h->h, info) || info->shared))
2185 {
2186 Elf64_Internal_Rela rel;
2187 int dynindx;
2188
2189 /* We may need to do a relocation against a local symbol, in
2190 which case we have to look up it's dynamic symbol index off
2191 the local symbol hash table. */
2192 if (h && h->dynindx != -1)
2193 dynindx = h->dynindx;
2194 else
2195 dynindx
2196 = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2197 dyn_h->sym_indx);
2198
2199
2200 /* Create a dynamic relocation for this entry. Do include the output
2201 offset of the DLT entry since we need an absolute address in the
2202 resulting object file. */
2203 rel.r_offset = (dyn_h->dlt_offset + sdlt->output_offset
2204 + sdlt->output_section->vma);
2205 if (h && h->type == STT_FUNC)
2206 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_FPTR64);
2207 else
2208 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_DIR64);
2209 rel.r_addend = 0;
2210
2211 bfd_elf64_swap_reloca_out (sdlt->output_section->owner, &rel,
2212 (((Elf64_External_Rela *)
2213 sdltrel->contents)
2214 + sdltrel->reloc_count));
2215 sdltrel->reloc_count++;
2216 }
2217 return true;
2218 }
2219
2220 /* Finalize the dynamic relocations. Specifically the FPTR relocations
2221 for dynamic functions used to initialize static data. */
2222
2223 static boolean
2224 elf64_hppa_finalize_dynreloc (dyn_h, data)
2225 struct elf64_hppa_dyn_hash_entry *dyn_h;
2226 PTR data;
2227 {
2228 struct bfd_link_info *info = (struct bfd_link_info *)data;
2229 struct elf64_hppa_link_hash_table *hppa_info;
2230 struct elf_link_hash_entry *h;
2231 int dynamic_symbol;
2232
2233 dynamic_symbol = elf64_hppa_dynamic_symbol_p (dyn_h->h, info);
2234
2235 if (!dynamic_symbol && !info->shared)
2236 return true;
2237
2238 if (dyn_h->reloc_entries)
2239 {
2240 struct elf64_hppa_dyn_reloc_entry *rent;
2241 int dynindx;
2242
2243 hppa_info = elf64_hppa_hash_table (info);
2244 h = dyn_h->h;
2245
2246 /* We may need to do a relocation against a local symbol, in
2247 which case we have to look up it's dynamic symbol index off
2248 the local symbol hash table. */
2249 if (h && h->dynindx != -1)
2250 dynindx = h->dynindx;
2251 else
2252 dynindx
2253 = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2254 dyn_h->sym_indx);
2255
2256 for (rent = dyn_h->reloc_entries; rent; rent = rent->next)
2257 {
2258 Elf64_Internal_Rela rel;
2259
2260 switch (rent->type)
2261 {
2262 case R_PARISC_FPTR64:
2263 /* Allocate one iff we are not building a shared library and
2264 !want_opd, which by this point will be true only if we're
2265 actually allocating one statically in the main executable. */
2266 if (!info->shared && dyn_h->want_opd)
2267 continue;
2268 break;
2269 }
2270
2271 /* Create a dynamic relocation for this entry.
2272
2273 We need the output offset for the reloc's section because
2274 we are creating an absolute address in the resulting object
2275 file. */
2276 rel.r_offset = (rent->offset + rent->sec->output_offset
2277 + rent->sec->output_section->vma);
2278
2279 /* An FPTR64 relocation implies that we took the address of
2280 a function and that the function has an entry in the .opd
2281 section. We want the FPTR64 relocation to reference the
2282 entry in .opd.
2283
2284 We could munge the symbol value in the dynamic symbol table
2285 (in fact we already do for functions with global scope) to point
2286 to the .opd entry. Then we could use that dynamic symbol in
2287 this relocation.
2288
2289 Or we could do something sensible, not munge the symbol's
2290 address and instead just use a different symbol to reference
2291 the .opd entry. At least that seems sensible until you
2292 realize there's no local dynamic symbols we can use for that
2293 purpose. Thus the hair in the check_relocs routine.
2294
2295 We use a section symbol recorded by check_relocs as the
2296 base symbol for the relocation. The addend is the difference
2297 between the section symbol and the address of the .opd entry. */
2298 if (info->shared && rent->type == R_PARISC_FPTR64)
2299 {
2300 bfd_vma value, value2;
2301
2302 /* First compute the address of the opd entry for this symbol. */
2303 value = (dyn_h->opd_offset
2304 + hppa_info->opd_sec->output_section->vma
2305 + hppa_info->opd_sec->output_offset);
2306
2307 /* Compute the value of the start of the section with
2308 the relocation. */
2309 value2 = (rent->sec->output_section->vma
2310 + rent->sec->output_offset);
2311
2312 /* Compute the difference between the start of the section
2313 with the relocation and the opd entry. */
2314 value -= value2;
2315
2316 /* The result becomes the addend of the relocation. */
2317 rel.r_addend = value;
2318
2319 /* The section symbol becomes the symbol for the dynamic
2320 relocation. */
2321 dynindx
2322 = _bfd_elf_link_lookup_local_dynindx (info,
2323 rent->sec->owner,
2324 rent->sec_symndx);
2325 }
2326 else
2327 rel.r_addend = rent->addend;
2328
2329 rel.r_info = ELF64_R_INFO (dynindx, rent->type);
2330
2331 bfd_elf64_swap_reloca_out (hppa_info->other_rel_sec->output_section->owner,
2332 &rel,
2333 (((Elf64_External_Rela *)
2334 hppa_info->other_rel_sec->contents)
2335 + hppa_info->other_rel_sec->reloc_count));
2336 hppa_info->other_rel_sec->reloc_count++;
2337 }
2338 }
2339
2340 return true;
2341 }
2342
2343 /* Finish up the dynamic sections. */
2344
2345 static boolean
2346 elf64_hppa_finish_dynamic_sections (output_bfd, info)
2347 bfd *output_bfd;
2348 struct bfd_link_info *info;
2349 {
2350 bfd *dynobj;
2351 asection *sdyn;
2352 struct elf64_hppa_link_hash_table *hppa_info;
2353
2354 hppa_info = elf64_hppa_hash_table (info);
2355
2356 /* Finalize the contents of the .opd section. */
2357 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2358 elf64_hppa_finalize_opd,
2359 info);
2360
2361 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2362 elf64_hppa_finalize_dynreloc,
2363 info);
2364
2365 /* Finalize the contents of the .dlt section. */
2366 dynobj = elf_hash_table (info)->dynobj;
2367 /* Finalize the contents of the .dlt section. */
2368 elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2369 elf64_hppa_finalize_dlt,
2370 info);
2371
2372
2373 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2374
2375 if (elf_hash_table (info)->dynamic_sections_created)
2376 {
2377 Elf64_External_Dyn *dyncon, *dynconend;
2378
2379 BFD_ASSERT (sdyn != NULL);
2380
2381 dyncon = (Elf64_External_Dyn *) sdyn->contents;
2382 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2383 for (; dyncon < dynconend; dyncon++)
2384 {
2385 Elf_Internal_Dyn dyn;
2386 asection *s;
2387
2388 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2389
2390 switch (dyn.d_tag)
2391 {
2392 default:
2393 break;
2394
2395 case DT_HP_LOAD_MAP:
2396 /* Compute the absolute address of 16byte scratchpad area
2397 for the dynamic linker.
2398
2399 By convention the linker script will allocate the scratchpad
2400 area at the start of the .data section. So all we have to
2401 to is find the start of the .data section. */
2402 s = bfd_get_section_by_name (output_bfd, ".data");
2403 dyn.d_un.d_ptr = s->vma;
2404 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2405 break;
2406
2407 case DT_PLTGOT:
2408 /* HP's use PLTGOT to set the GOT register. */
2409 dyn.d_un.d_ptr = _bfd_get_gp_value (output_bfd);
2410 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2411 break;
2412
2413 case DT_JMPREL:
2414 s = hppa_info->plt_rel_sec;
2415 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2416 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2417 break;
2418
2419 case DT_PLTRELSZ:
2420 s = hppa_info->plt_rel_sec;
2421 dyn.d_un.d_val = s->_raw_size;
2422 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2423 break;
2424
2425 case DT_RELA:
2426 s = hppa_info->other_rel_sec;
2427 if (! s)
2428 s = hppa_info->dlt_rel_sec;
2429 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2430 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2431 break;
2432
2433 case DT_RELASZ:
2434 s = hppa_info->other_rel_sec;
2435 dyn.d_un.d_val = s->_raw_size;
2436 s = hppa_info->dlt_rel_sec;
2437 dyn.d_un.d_val += s->_raw_size;
2438 s = hppa_info->opd_rel_sec;
2439 dyn.d_un.d_val += s->_raw_size;
2440 /* There is some question about whether or not the size of
2441 the PLT relocs should be included here. HP's tools do
2442 it, so we'll emulate them. */
2443 s = hppa_info->plt_rel_sec;
2444 dyn.d_un.d_val += s->_raw_size;
2445 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2446 break;
2447
2448 }
2449 }
2450 }
2451
2452 return true;
2453 }
2454
2455
2456 /* Return the number of additional phdrs we will need.
2457
2458 The generic ELF code only creates PT_PHDRs for executables. The HP
2459 dynamic linker requires PT_PHDRs for dynamic libraries too.
2460
2461 This routine indicates that the backend needs one additional program
2462 header for that case.
2463
2464 Note we do not have access to the link info structure here, so we have
2465 to guess whether or not we are building a shared library based on the
2466 existence of a .interp section. */
2467
2468 static int
2469 elf64_hppa_additional_program_headers (abfd)
2470 bfd *abfd;
2471 {
2472 asection *s;
2473
2474 /* If we are creating a shared library, then we have to create a
2475 PT_PHDR segment. HP's dynamic linker chokes without it. */
2476 s = bfd_get_section_by_name (abfd, ".interp");
2477 if (! s)
2478 return 1;
2479 return 0;
2480 }
2481
2482 /* Allocate and initialize any program headers required by this
2483 specific backend.
2484
2485 The generic ELF code only creates PT_PHDRs for executables. The HP
2486 dynamic linker requires PT_PHDRs for dynamic libraries too.
2487
2488 This allocates the PT_PHDR and initializes it in a manner suitable
2489 for the HP linker.
2490
2491 Note we do not have access to the link info structure here, so we have
2492 to guess whether or not we are building a shared library based on the
2493 existence of a .interp section. */
2494
2495 static boolean
2496 elf64_hppa_modify_segment_map (abfd)
2497 bfd *abfd;
2498 {
2499 struct elf_segment_map *m;
2500 asection *s;
2501
2502 s = bfd_get_section_by_name (abfd, ".interp");
2503 if (! s)
2504 {
2505 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2506 if (m->p_type == PT_PHDR)
2507 break;
2508 if (m == NULL)
2509 {
2510 m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2511 if (m == NULL)
2512 return false;
2513
2514 m->p_type = PT_PHDR;
2515 m->p_flags = PF_R | PF_X;
2516 m->p_flags_valid = 1;
2517 m->p_paddr_valid = 1;
2518 m->includes_phdrs = 1;
2519
2520 m->next = elf_tdata (abfd)->segment_map;
2521 elf_tdata (abfd)->segment_map = m;
2522 }
2523 }
2524
2525 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2526 if (m->p_type == PT_LOAD)
2527 {
2528 unsigned int i;
2529
2530 for (i = 0; i < m->count; i++)
2531 {
2532 /* The code "hint" is not really a hint. It is a requirement
2533 for certain versions of the HP dynamic linker. Worse yet,
2534 it must be set even if the shared library does not have
2535 any code in its "text" segment (thus the check for .hash
2536 to catch this situation). */
2537 if (m->sections[i]->flags & SEC_CODE
2538 || (strcmp (m->sections[i]->name, ".hash") == 0))
2539 m->p_flags |= (PF_X | PF_HP_CODE);
2540 }
2541 }
2542
2543 return true;
2544 }
2545
2546 /* The hash bucket size is the standard one, namely 4. */
2547
2548 const struct elf_size_info hppa64_elf_size_info =
2549 {
2550 sizeof (Elf64_External_Ehdr),
2551 sizeof (Elf64_External_Phdr),
2552 sizeof (Elf64_External_Shdr),
2553 sizeof (Elf64_External_Rel),
2554 sizeof (Elf64_External_Rela),
2555 sizeof (Elf64_External_Sym),
2556 sizeof (Elf64_External_Dyn),
2557 sizeof (Elf_External_Note),
2558 4,
2559 1,
2560 64, 8,
2561 ELFCLASS64, EV_CURRENT,
2562 bfd_elf64_write_out_phdrs,
2563 bfd_elf64_write_shdrs_and_ehdr,
2564 bfd_elf64_write_relocs,
2565 bfd_elf64_swap_symbol_out,
2566 bfd_elf64_slurp_reloc_table,
2567 bfd_elf64_slurp_symbol_table,
2568 bfd_elf64_swap_dyn_in,
2569 bfd_elf64_swap_dyn_out,
2570 NULL,
2571 NULL,
2572 NULL,
2573 NULL
2574 };
2575
2576 #define TARGET_BIG_SYM bfd_elf64_hppa_vec
2577 #define TARGET_BIG_NAME "elf64-hppa"
2578 #define ELF_ARCH bfd_arch_hppa
2579 #define ELF_MACHINE_CODE EM_PARISC
2580 /* This is not strictly correct. The maximum page size for PA2.0 is
2581 64M. But everything still uses 4k. */
2582 #define ELF_MAXPAGESIZE 0x1000
2583 #define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
2584 #define bfd_elf64_bfd_is_local_label_name elf_hppa_is_local_label_name
2585 #define elf_info_to_howto elf_hppa_info_to_howto
2586 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
2587
2588 #define elf_backend_section_from_shdr elf64_hppa_section_from_shdr
2589 #define elf_backend_object_p elf64_hppa_object_p
2590 #define elf_backend_final_write_processing \
2591 elf_hppa_final_write_processing
2592 #define elf_backend_fake_sections elf_hppa_fake_sections
2593 #define elf_backend_add_symbol_hook elf_hppa_add_symbol_hook
2594
2595 #define elf_backend_relocate_section elf_hppa_relocate_section
2596
2597 #define bfd_elf64_bfd_final_link elf_hppa_final_link
2598
2599 #define elf_backend_create_dynamic_sections \
2600 elf64_hppa_create_dynamic_sections
2601 #define elf_backend_post_process_headers elf64_hppa_post_process_headers
2602
2603 #define elf_backend_adjust_dynamic_symbol \
2604 elf64_hppa_adjust_dynamic_symbol
2605
2606 #define elf_backend_size_dynamic_sections \
2607 elf64_hppa_size_dynamic_sections
2608
2609 #define elf_backend_finish_dynamic_symbol \
2610 elf64_hppa_finish_dynamic_symbol
2611 #define elf_backend_finish_dynamic_sections \
2612 elf64_hppa_finish_dynamic_sections
2613
2614 /* Stuff for the BFD linker: */
2615 #define bfd_elf64_bfd_link_hash_table_create \
2616 elf64_hppa_hash_table_create
2617
2618 #define elf_backend_check_relocs \
2619 elf64_hppa_check_relocs
2620
2621 #define elf_backend_size_info \
2622 hppa64_elf_size_info
2623
2624 #define elf_backend_additional_program_headers \
2625 elf64_hppa_additional_program_headers
2626
2627 #define elf_backend_modify_segment_map \
2628 elf64_hppa_modify_segment_map
2629
2630 #define elf_backend_link_output_symbol_hook \
2631 elf64_hppa_link_output_symbol_hook
2632
2633
2634 #define elf_backend_want_got_plt 0
2635 #define elf_backend_plt_readonly 0
2636 #define elf_backend_want_plt_sym 0
2637 #define elf_backend_got_header_size 0
2638 #define elf_backend_plt_header_size 0
2639 #define elf_backend_type_change_ok true
2640
2641 #include "elf64-target.h"
This page took 0.082044 seconds and 4 git commands to generate.