daily update
[binutils.git] / bfd / elf32-hppa.c
blob32a374fbc512632e08eb7cd4df7e00423c75b17b
1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 Original code by
7 Center for Software Science
8 Department of Computer Science
9 University of Utah
10 Largely rewritten by Alan Modra <alan@linuxcare.com.au>
11 Naming cleanup by Carlos O'Donell <carlos@systemhalted.org>
12 TLS support written by Randolph Chung <tausq@debian.org>
14 This file is part of BFD, the Binary File Descriptor library.
16 This program is free software; you can redistribute it and/or modify
17 it under the terms of the GNU General Public License as published by
18 the Free Software Foundation; either version 3 of the License, or
19 (at your option) any later version.
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
29 MA 02110-1301, USA. */
31 #include "sysdep.h"
32 #include "bfd.h"
33 #include "libbfd.h"
34 #include "elf-bfd.h"
35 #include "elf/hppa.h"
36 #include "libhppa.h"
37 #include "elf32-hppa.h"
38 #define ARCH_SIZE 32
39 #include "elf32-hppa.h"
40 #include "elf-hppa.h"
42 /* In order to gain some understanding of code in this file without
43 knowing all the intricate details of the linker, note the
44 following:
46 Functions named elf32_hppa_* are called by external routines, other
47 functions are only called locally. elf32_hppa_* functions appear
48 in this file more or less in the order in which they are called
49 from external routines. eg. elf32_hppa_check_relocs is called
50 early in the link process, elf32_hppa_finish_dynamic_sections is
51 one of the last functions. */
53 /* We use two hash tables to hold information for linking PA ELF objects.
55 The first is the elf32_hppa_link_hash_table which is derived
56 from the standard ELF linker hash table. We use this as a place to
57 attach other hash tables and static information.
59 The second is the stub hash table which is derived from the
60 base BFD hash table. The stub hash table holds the information
61 necessary to build the linker stubs during a link.
63 There are a number of different stubs generated by the linker.
65 Long branch stub:
66 : ldil LR'X,%r1
67 : be,n RR'X(%sr4,%r1)
69 PIC long branch stub:
70 : b,l .+8,%r1
71 : addil LR'X - ($PIC_pcrel$0 - 4),%r1
72 : be,n RR'X - ($PIC_pcrel$0 - 8)(%sr4,%r1)
74 Import stub to call shared library routine from normal object file
75 (single sub-space version)
76 : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
77 : ldw RR'lt_ptr+ltoff(%r1),%r21
78 : bv %r0(%r21)
79 : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
81 Import stub to call shared library routine from shared library
82 (single sub-space version)
83 : addil LR'ltoff,%r19 ; get procedure entry point
84 : ldw RR'ltoff(%r1),%r21
85 : bv %r0(%r21)
86 : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
88 Import stub to call shared library routine from normal object file
89 (multiple sub-space support)
90 : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
91 : ldw RR'lt_ptr+ltoff(%r1),%r21
92 : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
93 : ldsid (%r21),%r1
94 : mtsp %r1,%sr0
95 : be 0(%sr0,%r21) ; branch to target
96 : stw %rp,-24(%sp) ; save rp
98 Import stub to call shared library routine from shared library
99 (multiple sub-space support)
100 : addil LR'ltoff,%r19 ; get procedure entry point
101 : ldw RR'ltoff(%r1),%r21
102 : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
103 : ldsid (%r21),%r1
104 : mtsp %r1,%sr0
105 : be 0(%sr0,%r21) ; branch to target
106 : stw %rp,-24(%sp) ; save rp
108 Export stub to return from shared lib routine (multiple sub-space support)
109 One of these is created for each exported procedure in a shared
110 library (and stored in the shared lib). Shared lib routines are
111 called via the first instruction in the export stub so that we can
112 do an inter-space return. Not required for single sub-space.
113 : bl,n X,%rp ; trap the return
114 : nop
115 : ldw -24(%sp),%rp ; restore the original rp
116 : ldsid (%rp),%r1
117 : mtsp %r1,%sr0
118 : be,n 0(%sr0,%rp) ; inter-space return. */
121 /* Variable names follow a coding style.
122 Please follow this (Apps Hungarian) style:
124 Structure/Variable Prefix
125 elf_link_hash_table "etab"
126 elf_link_hash_entry "eh"
128 elf32_hppa_link_hash_table "htab"
129 elf32_hppa_link_hash_entry "hh"
131 bfd_hash_table "btab"
132 bfd_hash_entry "bh"
134 bfd_hash_table containing stubs "bstab"
135 elf32_hppa_stub_hash_entry "hsh"
137 elf32_hppa_dyn_reloc_entry "hdh"
139 Always remember to use GNU Coding Style. */
141 #define PLT_ENTRY_SIZE 8
142 #define GOT_ENTRY_SIZE 4
143 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
145 static const bfd_byte plt_stub[] =
147 0x0e, 0x80, 0x10, 0x96, /* 1: ldw 0(%r20),%r22 */
148 0xea, 0xc0, 0xc0, 0x00, /* bv %r0(%r22) */
149 0x0e, 0x88, 0x10, 0x95, /* ldw 4(%r20),%r21 */
150 #define PLT_STUB_ENTRY (3*4)
151 0xea, 0x9f, 0x1f, 0xdd, /* b,l 1b,%r20 */
152 0xd6, 0x80, 0x1c, 0x1e, /* depi 0,31,2,%r20 */
153 0x00, 0xc0, 0xff, 0xee, /* 9: .word fixup_func */
154 0xde, 0xad, 0xbe, 0xef /* .word fixup_ltp */
157 /* Section name for stubs is the associated section name plus this
158 string. */
159 #define STUB_SUFFIX ".stub"
161 /* We don't need to copy certain PC- or GP-relative dynamic relocs
162 into a shared object's dynamic section. All the relocs of the
163 limited class we are interested in, are absolute. */
164 #ifndef RELATIVE_DYNRELOCS
165 #define RELATIVE_DYNRELOCS 0
166 #define IS_ABSOLUTE_RELOC(r_type) 1
167 #endif
169 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
170 copying dynamic variables from a shared lib into an app's dynbss
171 section, and instead use a dynamic relocation to point into the
172 shared lib. */
173 #define ELIMINATE_COPY_RELOCS 1
175 enum elf32_hppa_stub_type
177 hppa_stub_long_branch,
178 hppa_stub_long_branch_shared,
179 hppa_stub_import,
180 hppa_stub_import_shared,
181 hppa_stub_export,
182 hppa_stub_none
185 struct elf32_hppa_stub_hash_entry
187 /* Base hash table entry structure. */
188 struct bfd_hash_entry bh_root;
190 /* The stub section. */
191 asection *stub_sec;
193 /* Offset within stub_sec of the beginning of this stub. */
194 bfd_vma stub_offset;
196 /* Given the symbol's value and its section we can determine its final
197 value when building the stubs (so the stub knows where to jump. */
198 bfd_vma target_value;
199 asection *target_section;
201 enum elf32_hppa_stub_type stub_type;
203 /* The symbol table entry, if any, that this was derived from. */
204 struct elf32_hppa_link_hash_entry *hh;
206 /* Where this stub is being called from, or, in the case of combined
207 stub sections, the first input section in the group. */
208 asection *id_sec;
211 struct elf32_hppa_link_hash_entry
213 struct elf_link_hash_entry eh;
215 /* A pointer to the most recently used stub hash entry against this
216 symbol. */
217 struct elf32_hppa_stub_hash_entry *hsh_cache;
219 /* Used to count relocations for delayed sizing of relocation
220 sections. */
221 struct elf32_hppa_dyn_reloc_entry
223 /* Next relocation in the chain. */
224 struct elf32_hppa_dyn_reloc_entry *hdh_next;
226 /* The input section of the reloc. */
227 asection *sec;
229 /* Number of relocs copied in this section. */
230 bfd_size_type count;
232 #if RELATIVE_DYNRELOCS
233 /* Number of relative relocs copied for the input section. */
234 bfd_size_type relative_count;
235 #endif
236 } *dyn_relocs;
238 enum
240 GOT_UNKNOWN = 0, GOT_NORMAL = 1, GOT_TLS_GD = 2, GOT_TLS_LDM = 4, GOT_TLS_IE = 8
241 } tls_type;
243 /* Set if this symbol is used by a plabel reloc. */
244 unsigned int plabel:1;
247 struct elf32_hppa_link_hash_table
249 /* The main hash table. */
250 struct elf_link_hash_table etab;
252 /* The stub hash table. */
253 struct bfd_hash_table bstab;
255 /* Linker stub bfd. */
256 bfd *stub_bfd;
258 /* Linker call-backs. */
259 asection * (*add_stub_section) (const char *, asection *);
260 void (*layout_sections_again) (void);
262 /* Array to keep track of which stub sections have been created, and
263 information on stub grouping. */
264 struct map_stub
266 /* This is the section to which stubs in the group will be
267 attached. */
268 asection *link_sec;
269 /* The stub section. */
270 asection *stub_sec;
271 } *stub_group;
273 /* Assorted information used by elf32_hppa_size_stubs. */
274 unsigned int bfd_count;
275 int top_index;
276 asection **input_list;
277 Elf_Internal_Sym **all_local_syms;
279 /* Short-cuts to get to dynamic linker sections. */
280 asection *sgot;
281 asection *srelgot;
282 asection *splt;
283 asection *srelplt;
284 asection *sdynbss;
285 asection *srelbss;
287 /* Used during a final link to store the base of the text and data
288 segments so that we can perform SEGREL relocations. */
289 bfd_vma text_segment_base;
290 bfd_vma data_segment_base;
292 /* Whether we support multiple sub-spaces for shared libs. */
293 unsigned int multi_subspace:1;
295 /* Flags set when various size branches are detected. Used to
296 select suitable defaults for the stub group size. */
297 unsigned int has_12bit_branch:1;
298 unsigned int has_17bit_branch:1;
299 unsigned int has_22bit_branch:1;
301 /* Set if we need a .plt stub to support lazy dynamic linking. */
302 unsigned int need_plt_stub:1;
304 /* Small local sym cache. */
305 struct sym_cache sym_cache;
307 /* Data for LDM relocations. */
308 union
310 bfd_signed_vma refcount;
311 bfd_vma offset;
312 } tls_ldm_got;
315 /* Various hash macros and functions. */
316 #define hppa_link_hash_table(p) \
317 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
318 == HPPA32_ELF_DATA ? ((struct elf32_hppa_link_hash_table *) ((p)->hash)) : NULL)
320 #define hppa_elf_hash_entry(ent) \
321 ((struct elf32_hppa_link_hash_entry *)(ent))
323 #define hppa_stub_hash_entry(ent) \
324 ((struct elf32_hppa_stub_hash_entry *)(ent))
326 #define hppa_stub_hash_lookup(table, string, create, copy) \
327 ((struct elf32_hppa_stub_hash_entry *) \
328 bfd_hash_lookup ((table), (string), (create), (copy)))
330 #define hppa_elf_local_got_tls_type(abfd) \
331 ((char *)(elf_local_got_offsets (abfd) + (elf_tdata (abfd)->symtab_hdr.sh_info * 2)))
333 #define hh_name(hh) \
334 (hh ? hh->eh.root.root.string : "<undef>")
336 #define eh_name(eh) \
337 (eh ? eh->root.root.string : "<undef>")
339 /* Override the generic function because we want to mark our BFDs. */
341 static bfd_boolean
342 elf32_hppa_mkobject (bfd *abfd)
344 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
345 HPPA32_ELF_DATA);
348 /* Assorted hash table functions. */
350 /* Initialize an entry in the stub hash table. */
352 static struct bfd_hash_entry *
353 stub_hash_newfunc (struct bfd_hash_entry *entry,
354 struct bfd_hash_table *table,
355 const char *string)
357 /* Allocate the structure if it has not already been allocated by a
358 subclass. */
359 if (entry == NULL)
361 entry = bfd_hash_allocate (table,
362 sizeof (struct elf32_hppa_stub_hash_entry));
363 if (entry == NULL)
364 return entry;
367 /* Call the allocation method of the superclass. */
368 entry = bfd_hash_newfunc (entry, table, string);
369 if (entry != NULL)
371 struct elf32_hppa_stub_hash_entry *hsh;
373 /* Initialize the local fields. */
374 hsh = hppa_stub_hash_entry (entry);
375 hsh->stub_sec = NULL;
376 hsh->stub_offset = 0;
377 hsh->target_value = 0;
378 hsh->target_section = NULL;
379 hsh->stub_type = hppa_stub_long_branch;
380 hsh->hh = NULL;
381 hsh->id_sec = NULL;
384 return entry;
387 /* Initialize an entry in the link hash table. */
389 static struct bfd_hash_entry *
390 hppa_link_hash_newfunc (struct bfd_hash_entry *entry,
391 struct bfd_hash_table *table,
392 const char *string)
394 /* Allocate the structure if it has not already been allocated by a
395 subclass. */
396 if (entry == NULL)
398 entry = bfd_hash_allocate (table,
399 sizeof (struct elf32_hppa_link_hash_entry));
400 if (entry == NULL)
401 return entry;
404 /* Call the allocation method of the superclass. */
405 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
406 if (entry != NULL)
408 struct elf32_hppa_link_hash_entry *hh;
410 /* Initialize the local fields. */
411 hh = hppa_elf_hash_entry (entry);
412 hh->hsh_cache = NULL;
413 hh->dyn_relocs = NULL;
414 hh->plabel = 0;
415 hh->tls_type = GOT_UNKNOWN;
418 return entry;
421 /* Create the derived linker hash table. The PA ELF port uses the derived
422 hash table to keep information specific to the PA ELF linker (without
423 using static variables). */
425 static struct bfd_link_hash_table *
426 elf32_hppa_link_hash_table_create (bfd *abfd)
428 struct elf32_hppa_link_hash_table *htab;
429 bfd_size_type amt = sizeof (*htab);
431 htab = bfd_malloc (amt);
432 if (htab == NULL)
433 return NULL;
435 if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd, hppa_link_hash_newfunc,
436 sizeof (struct elf32_hppa_link_hash_entry),
437 HPPA32_ELF_DATA))
439 free (htab);
440 return NULL;
443 /* Init the stub hash table too. */
444 if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
445 sizeof (struct elf32_hppa_stub_hash_entry)))
446 return NULL;
448 htab->stub_bfd = NULL;
449 htab->add_stub_section = NULL;
450 htab->layout_sections_again = NULL;
451 htab->stub_group = NULL;
452 htab->sgot = NULL;
453 htab->srelgot = NULL;
454 htab->splt = NULL;
455 htab->srelplt = NULL;
456 htab->sdynbss = NULL;
457 htab->srelbss = NULL;
458 htab->text_segment_base = (bfd_vma) -1;
459 htab->data_segment_base = (bfd_vma) -1;
460 htab->multi_subspace = 0;
461 htab->has_12bit_branch = 0;
462 htab->has_17bit_branch = 0;
463 htab->has_22bit_branch = 0;
464 htab->need_plt_stub = 0;
465 htab->sym_cache.abfd = NULL;
466 htab->tls_ldm_got.refcount = 0;
468 return &htab->etab.root;
471 /* Free the derived linker hash table. */
473 static void
474 elf32_hppa_link_hash_table_free (struct bfd_link_hash_table *btab)
476 struct elf32_hppa_link_hash_table *htab
477 = (struct elf32_hppa_link_hash_table *) btab;
479 bfd_hash_table_free (&htab->bstab);
480 _bfd_generic_link_hash_table_free (btab);
483 /* Build a name for an entry in the stub hash table. */
485 static char *
486 hppa_stub_name (const asection *input_section,
487 const asection *sym_sec,
488 const struct elf32_hppa_link_hash_entry *hh,
489 const Elf_Internal_Rela *rela)
491 char *stub_name;
492 bfd_size_type len;
494 if (hh)
496 len = 8 + 1 + strlen (hh_name (hh)) + 1 + 8 + 1;
497 stub_name = bfd_malloc (len);
498 if (stub_name != NULL)
499 sprintf (stub_name, "%08x_%s+%x",
500 input_section->id & 0xffffffff,
501 hh_name (hh),
502 (int) rela->r_addend & 0xffffffff);
504 else
506 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
507 stub_name = bfd_malloc (len);
508 if (stub_name != NULL)
509 sprintf (stub_name, "%08x_%x:%x+%x",
510 input_section->id & 0xffffffff,
511 sym_sec->id & 0xffffffff,
512 (int) ELF32_R_SYM (rela->r_info) & 0xffffffff,
513 (int) rela->r_addend & 0xffffffff);
515 return stub_name;
518 /* Look up an entry in the stub hash. Stub entries are cached because
519 creating the stub name takes a bit of time. */
521 static struct elf32_hppa_stub_hash_entry *
522 hppa_get_stub_entry (const asection *input_section,
523 const asection *sym_sec,
524 struct elf32_hppa_link_hash_entry *hh,
525 const Elf_Internal_Rela *rela,
526 struct elf32_hppa_link_hash_table *htab)
528 struct elf32_hppa_stub_hash_entry *hsh_entry;
529 const asection *id_sec;
531 /* If this input section is part of a group of sections sharing one
532 stub section, then use the id of the first section in the group.
533 Stub names need to include a section id, as there may well be
534 more than one stub used to reach say, printf, and we need to
535 distinguish between them. */
536 id_sec = htab->stub_group[input_section->id].link_sec;
538 if (hh != NULL && hh->hsh_cache != NULL
539 && hh->hsh_cache->hh == hh
540 && hh->hsh_cache->id_sec == id_sec)
542 hsh_entry = hh->hsh_cache;
544 else
546 char *stub_name;
548 stub_name = hppa_stub_name (id_sec, sym_sec, hh, rela);
549 if (stub_name == NULL)
550 return NULL;
552 hsh_entry = hppa_stub_hash_lookup (&htab->bstab,
553 stub_name, FALSE, FALSE);
554 if (hh != NULL)
555 hh->hsh_cache = hsh_entry;
557 free (stub_name);
560 return hsh_entry;
563 /* Add a new stub entry to the stub hash. Not all fields of the new
564 stub entry are initialised. */
566 static struct elf32_hppa_stub_hash_entry *
567 hppa_add_stub (const char *stub_name,
568 asection *section,
569 struct elf32_hppa_link_hash_table *htab)
571 asection *link_sec;
572 asection *stub_sec;
573 struct elf32_hppa_stub_hash_entry *hsh;
575 link_sec = htab->stub_group[section->id].link_sec;
576 stub_sec = htab->stub_group[section->id].stub_sec;
577 if (stub_sec == NULL)
579 stub_sec = htab->stub_group[link_sec->id].stub_sec;
580 if (stub_sec == NULL)
582 size_t namelen;
583 bfd_size_type len;
584 char *s_name;
586 namelen = strlen (link_sec->name);
587 len = namelen + sizeof (STUB_SUFFIX);
588 s_name = bfd_alloc (htab->stub_bfd, len);
589 if (s_name == NULL)
590 return NULL;
592 memcpy (s_name, link_sec->name, namelen);
593 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
594 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
595 if (stub_sec == NULL)
596 return NULL;
597 htab->stub_group[link_sec->id].stub_sec = stub_sec;
599 htab->stub_group[section->id].stub_sec = stub_sec;
602 /* Enter this entry into the linker stub hash table. */
603 hsh = hppa_stub_hash_lookup (&htab->bstab, stub_name,
604 TRUE, FALSE);
605 if (hsh == NULL)
607 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
608 section->owner,
609 stub_name);
610 return NULL;
613 hsh->stub_sec = stub_sec;
614 hsh->stub_offset = 0;
615 hsh->id_sec = link_sec;
616 return hsh;
619 /* Determine the type of stub needed, if any, for a call. */
621 static enum elf32_hppa_stub_type
622 hppa_type_of_stub (asection *input_sec,
623 const Elf_Internal_Rela *rela,
624 struct elf32_hppa_link_hash_entry *hh,
625 bfd_vma destination,
626 struct bfd_link_info *info)
628 bfd_vma location;
629 bfd_vma branch_offset;
630 bfd_vma max_branch_offset;
631 unsigned int r_type;
633 if (hh != NULL
634 && hh->eh.plt.offset != (bfd_vma) -1
635 && hh->eh.dynindx != -1
636 && !hh->plabel
637 && (info->shared
638 || !hh->eh.def_regular
639 || hh->eh.root.type == bfd_link_hash_defweak))
641 /* We need an import stub. Decide between hppa_stub_import
642 and hppa_stub_import_shared later. */
643 return hppa_stub_import;
646 /* Determine where the call point is. */
647 location = (input_sec->output_offset
648 + input_sec->output_section->vma
649 + rela->r_offset);
651 branch_offset = destination - location - 8;
652 r_type = ELF32_R_TYPE (rela->r_info);
654 /* Determine if a long branch stub is needed. parisc branch offsets
655 are relative to the second instruction past the branch, ie. +8
656 bytes on from the branch instruction location. The offset is
657 signed and counts in units of 4 bytes. */
658 if (r_type == (unsigned int) R_PARISC_PCREL17F)
659 max_branch_offset = (1 << (17 - 1)) << 2;
661 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
662 max_branch_offset = (1 << (12 - 1)) << 2;
664 else /* R_PARISC_PCREL22F. */
665 max_branch_offset = (1 << (22 - 1)) << 2;
667 if (branch_offset + max_branch_offset >= 2*max_branch_offset)
668 return hppa_stub_long_branch;
670 return hppa_stub_none;
673 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
674 IN_ARG contains the link info pointer. */
676 #define LDIL_R1 0x20200000 /* ldil LR'XXX,%r1 */
677 #define BE_SR4_R1 0xe0202002 /* be,n RR'XXX(%sr4,%r1) */
679 #define BL_R1 0xe8200000 /* b,l .+8,%r1 */
680 #define ADDIL_R1 0x28200000 /* addil LR'XXX,%r1,%r1 */
681 #define DEPI_R1 0xd4201c1e /* depi 0,31,2,%r1 */
683 #define ADDIL_DP 0x2b600000 /* addil LR'XXX,%dp,%r1 */
684 #define LDW_R1_R21 0x48350000 /* ldw RR'XXX(%sr0,%r1),%r21 */
685 #define BV_R0_R21 0xeaa0c000 /* bv %r0(%r21) */
686 #define LDW_R1_R19 0x48330000 /* ldw RR'XXX(%sr0,%r1),%r19 */
688 #define ADDIL_R19 0x2a600000 /* addil LR'XXX,%r19,%r1 */
689 #define LDW_R1_DP 0x483b0000 /* ldw RR'XXX(%sr0,%r1),%dp */
691 #define LDSID_R21_R1 0x02a010a1 /* ldsid (%sr0,%r21),%r1 */
692 #define MTSP_R1 0x00011820 /* mtsp %r1,%sr0 */
693 #define BE_SR0_R21 0xe2a00000 /* be 0(%sr0,%r21) */
694 #define STW_RP 0x6bc23fd1 /* stw %rp,-24(%sr0,%sp) */
696 #define BL22_RP 0xe800a002 /* b,l,n XXX,%rp */
697 #define BL_RP 0xe8400002 /* b,l,n XXX,%rp */
698 #define NOP 0x08000240 /* nop */
699 #define LDW_RP 0x4bc23fd1 /* ldw -24(%sr0,%sp),%rp */
700 #define LDSID_RP_R1 0x004010a1 /* ldsid (%sr0,%rp),%r1 */
701 #define BE_SR0_RP 0xe0400002 /* be,n 0(%sr0,%rp) */
703 #ifndef R19_STUBS
704 #define R19_STUBS 1
705 #endif
707 #if R19_STUBS
708 #define LDW_R1_DLT LDW_R1_R19
709 #else
710 #define LDW_R1_DLT LDW_R1_DP
711 #endif
713 static bfd_boolean
714 hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
716 struct elf32_hppa_stub_hash_entry *hsh;
717 struct bfd_link_info *info;
718 struct elf32_hppa_link_hash_table *htab;
719 asection *stub_sec;
720 bfd *stub_bfd;
721 bfd_byte *loc;
722 bfd_vma sym_value;
723 bfd_vma insn;
724 bfd_vma off;
725 int val;
726 int size;
728 /* Massage our args to the form they really have. */
729 hsh = hppa_stub_hash_entry (bh);
730 info = (struct bfd_link_info *)in_arg;
732 htab = hppa_link_hash_table (info);
733 if (htab == NULL)
734 return FALSE;
736 stub_sec = hsh->stub_sec;
738 /* Make a note of the offset within the stubs for this entry. */
739 hsh->stub_offset = stub_sec->size;
740 loc = stub_sec->contents + hsh->stub_offset;
742 stub_bfd = stub_sec->owner;
744 switch (hsh->stub_type)
746 case hppa_stub_long_branch:
747 /* Create the long branch. A long branch is formed with "ldil"
748 loading the upper bits of the target address into a register,
749 then branching with "be" which adds in the lower bits.
750 The "be" has its delay slot nullified. */
751 sym_value = (hsh->target_value
752 + hsh->target_section->output_offset
753 + hsh->target_section->output_section->vma);
755 val = hppa_field_adjust (sym_value, 0, e_lrsel);
756 insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
757 bfd_put_32 (stub_bfd, insn, loc);
759 val = hppa_field_adjust (sym_value, 0, e_rrsel) >> 2;
760 insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
761 bfd_put_32 (stub_bfd, insn, loc + 4);
763 size = 8;
764 break;
766 case hppa_stub_long_branch_shared:
767 /* Branches are relative. This is where we are going to. */
768 sym_value = (hsh->target_value
769 + hsh->target_section->output_offset
770 + hsh->target_section->output_section->vma);
772 /* And this is where we are coming from, more or less. */
773 sym_value -= (hsh->stub_offset
774 + stub_sec->output_offset
775 + stub_sec->output_section->vma);
777 bfd_put_32 (stub_bfd, (bfd_vma) BL_R1, loc);
778 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_lrsel);
779 insn = hppa_rebuild_insn ((int) ADDIL_R1, val, 21);
780 bfd_put_32 (stub_bfd, insn, loc + 4);
782 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_rrsel) >> 2;
783 insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
784 bfd_put_32 (stub_bfd, insn, loc + 8);
785 size = 12;
786 break;
788 case hppa_stub_import:
789 case hppa_stub_import_shared:
790 off = hsh->hh->eh.plt.offset;
791 if (off >= (bfd_vma) -2)
792 abort ();
794 off &= ~ (bfd_vma) 1;
795 sym_value = (off
796 + htab->splt->output_offset
797 + htab->splt->output_section->vma
798 - elf_gp (htab->splt->output_section->owner));
800 insn = ADDIL_DP;
801 #if R19_STUBS
802 if (hsh->stub_type == hppa_stub_import_shared)
803 insn = ADDIL_R19;
804 #endif
805 val = hppa_field_adjust (sym_value, 0, e_lrsel),
806 insn = hppa_rebuild_insn ((int) insn, val, 21);
807 bfd_put_32 (stub_bfd, insn, loc);
809 /* It is critical to use lrsel/rrsel here because we are using
810 two different offsets (+0 and +4) from sym_value. If we use
811 lsel/rsel then with unfortunate sym_values we will round
812 sym_value+4 up to the next 2k block leading to a mis-match
813 between the lsel and rsel value. */
814 val = hppa_field_adjust (sym_value, 0, e_rrsel);
815 insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14);
816 bfd_put_32 (stub_bfd, insn, loc + 4);
818 if (htab->multi_subspace)
820 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
821 insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
822 bfd_put_32 (stub_bfd, insn, loc + 8);
824 bfd_put_32 (stub_bfd, (bfd_vma) LDSID_R21_R1, loc + 12);
825 bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
826 bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_R21, loc + 20);
827 bfd_put_32 (stub_bfd, (bfd_vma) STW_RP, loc + 24);
829 size = 28;
831 else
833 bfd_put_32 (stub_bfd, (bfd_vma) BV_R0_R21, loc + 8);
834 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
835 insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
836 bfd_put_32 (stub_bfd, insn, loc + 12);
838 size = 16;
841 break;
843 case hppa_stub_export:
844 /* Branches are relative. This is where we are going to. */
845 sym_value = (hsh->target_value
846 + hsh->target_section->output_offset
847 + hsh->target_section->output_section->vma);
849 /* And this is where we are coming from. */
850 sym_value -= (hsh->stub_offset
851 + stub_sec->output_offset
852 + stub_sec->output_section->vma);
854 if (sym_value - 8 + (1 << (17 + 1)) >= (1 << (17 + 2))
855 && (!htab->has_22bit_branch
856 || sym_value - 8 + (1 << (22 + 1)) >= (1 << (22 + 2))))
858 (*_bfd_error_handler)
859 (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
860 hsh->target_section->owner,
861 stub_sec,
862 (long) hsh->stub_offset,
863 hsh->bh_root.string);
864 bfd_set_error (bfd_error_bad_value);
865 return FALSE;
868 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_fsel) >> 2;
869 if (!htab->has_22bit_branch)
870 insn = hppa_rebuild_insn ((int) BL_RP, val, 17);
871 else
872 insn = hppa_rebuild_insn ((int) BL22_RP, val, 22);
873 bfd_put_32 (stub_bfd, insn, loc);
875 bfd_put_32 (stub_bfd, (bfd_vma) NOP, loc + 4);
876 bfd_put_32 (stub_bfd, (bfd_vma) LDW_RP, loc + 8);
877 bfd_put_32 (stub_bfd, (bfd_vma) LDSID_RP_R1, loc + 12);
878 bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
879 bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_RP, loc + 20);
881 /* Point the function symbol at the stub. */
882 hsh->hh->eh.root.u.def.section = stub_sec;
883 hsh->hh->eh.root.u.def.value = stub_sec->size;
885 size = 24;
886 break;
888 default:
889 BFD_FAIL ();
890 return FALSE;
893 stub_sec->size += size;
894 return TRUE;
897 #undef LDIL_R1
898 #undef BE_SR4_R1
899 #undef BL_R1
900 #undef ADDIL_R1
901 #undef DEPI_R1
902 #undef LDW_R1_R21
903 #undef LDW_R1_DLT
904 #undef LDW_R1_R19
905 #undef ADDIL_R19
906 #undef LDW_R1_DP
907 #undef LDSID_R21_R1
908 #undef MTSP_R1
909 #undef BE_SR0_R21
910 #undef STW_RP
911 #undef BV_R0_R21
912 #undef BL_RP
913 #undef NOP
914 #undef LDW_RP
915 #undef LDSID_RP_R1
916 #undef BE_SR0_RP
918 /* As above, but don't actually build the stub. Just bump offset so
919 we know stub section sizes. */
921 static bfd_boolean
922 hppa_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
924 struct elf32_hppa_stub_hash_entry *hsh;
925 struct elf32_hppa_link_hash_table *htab;
926 int size;
928 /* Massage our args to the form they really have. */
929 hsh = hppa_stub_hash_entry (bh);
930 htab = in_arg;
932 if (hsh->stub_type == hppa_stub_long_branch)
933 size = 8;
934 else if (hsh->stub_type == hppa_stub_long_branch_shared)
935 size = 12;
936 else if (hsh->stub_type == hppa_stub_export)
937 size = 24;
938 else /* hppa_stub_import or hppa_stub_import_shared. */
940 if (htab->multi_subspace)
941 size = 28;
942 else
943 size = 16;
946 hsh->stub_sec->size += size;
947 return TRUE;
950 /* Return nonzero if ABFD represents an HPPA ELF32 file.
951 Additionally we set the default architecture and machine. */
953 static bfd_boolean
954 elf32_hppa_object_p (bfd *abfd)
956 Elf_Internal_Ehdr * i_ehdrp;
957 unsigned int flags;
959 i_ehdrp = elf_elfheader (abfd);
960 if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
962 /* GCC on hppa-linux produces binaries with OSABI=Linux,
963 but the kernel produces corefiles with OSABI=SysV. */
964 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX &&
965 i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
966 return FALSE;
968 else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
970 /* GCC on hppa-netbsd produces binaries with OSABI=NetBSD,
971 but the kernel produces corefiles with OSABI=SysV. */
972 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NETBSD &&
973 i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
974 return FALSE;
976 else
978 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
979 return FALSE;
982 flags = i_ehdrp->e_flags;
983 switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
985 case EFA_PARISC_1_0:
986 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
987 case EFA_PARISC_1_1:
988 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
989 case EFA_PARISC_2_0:
990 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
991 case EFA_PARISC_2_0 | EF_PARISC_WIDE:
992 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
994 return TRUE;
997 /* Create the .plt and .got sections, and set up our hash table
998 short-cuts to various dynamic sections. */
1000 static bfd_boolean
1001 elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
1003 struct elf32_hppa_link_hash_table *htab;
1004 struct elf_link_hash_entry *eh;
1006 /* Don't try to create the .plt and .got twice. */
1007 htab = hppa_link_hash_table (info);
1008 if (htab == NULL)
1009 return FALSE;
1010 if (htab->splt != NULL)
1011 return TRUE;
1013 /* Call the generic code to do most of the work. */
1014 if (! _bfd_elf_create_dynamic_sections (abfd, info))
1015 return FALSE;
1017 htab->splt = bfd_get_section_by_name (abfd, ".plt");
1018 htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
1020 htab->sgot = bfd_get_section_by_name (abfd, ".got");
1021 htab->srelgot = bfd_get_section_by_name (abfd, ".rela.got");
1023 htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
1024 htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
1026 /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main
1027 application, because __canonicalize_funcptr_for_compare needs it. */
1028 eh = elf_hash_table (info)->hgot;
1029 eh->forced_local = 0;
1030 eh->other = STV_DEFAULT;
1031 return bfd_elf_link_record_dynamic_symbol (info, eh);
1034 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1036 static void
1037 elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
1038 struct elf_link_hash_entry *eh_dir,
1039 struct elf_link_hash_entry *eh_ind)
1041 struct elf32_hppa_link_hash_entry *hh_dir, *hh_ind;
1043 hh_dir = hppa_elf_hash_entry (eh_dir);
1044 hh_ind = hppa_elf_hash_entry (eh_ind);
1046 if (hh_ind->dyn_relocs != NULL)
1048 if (hh_dir->dyn_relocs != NULL)
1050 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1051 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1053 /* Add reloc counts against the indirect sym to the direct sym
1054 list. Merge any entries against the same section. */
1055 for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
1057 struct elf32_hppa_dyn_reloc_entry *hdh_q;
1059 for (hdh_q = hh_dir->dyn_relocs;
1060 hdh_q != NULL;
1061 hdh_q = hdh_q->hdh_next)
1062 if (hdh_q->sec == hdh_p->sec)
1064 #if RELATIVE_DYNRELOCS
1065 hdh_q->relative_count += hdh_p->relative_count;
1066 #endif
1067 hdh_q->count += hdh_p->count;
1068 *hdh_pp = hdh_p->hdh_next;
1069 break;
1071 if (hdh_q == NULL)
1072 hdh_pp = &hdh_p->hdh_next;
1074 *hdh_pp = hh_dir->dyn_relocs;
1077 hh_dir->dyn_relocs = hh_ind->dyn_relocs;
1078 hh_ind->dyn_relocs = NULL;
1081 if (ELIMINATE_COPY_RELOCS
1082 && eh_ind->root.type != bfd_link_hash_indirect
1083 && eh_dir->dynamic_adjusted)
1085 /* If called to transfer flags for a weakdef during processing
1086 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1087 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
1088 eh_dir->ref_dynamic |= eh_ind->ref_dynamic;
1089 eh_dir->ref_regular |= eh_ind->ref_regular;
1090 eh_dir->ref_regular_nonweak |= eh_ind->ref_regular_nonweak;
1091 eh_dir->needs_plt |= eh_ind->needs_plt;
1093 else
1095 if (eh_ind->root.type == bfd_link_hash_indirect
1096 && eh_dir->got.refcount <= 0)
1098 hh_dir->tls_type = hh_ind->tls_type;
1099 hh_ind->tls_type = GOT_UNKNOWN;
1102 _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
1106 static int
1107 elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1108 int r_type, int is_local ATTRIBUTE_UNUSED)
1110 /* For now we don't support linker optimizations. */
1111 return r_type;
1114 /* Return a pointer to the local GOT, PLT and TLS reference counts
1115 for ABFD. Returns NULL if the storage allocation fails. */
1117 static bfd_signed_vma *
1118 hppa32_elf_local_refcounts (bfd *abfd)
1120 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1121 bfd_signed_vma *local_refcounts;
1123 local_refcounts = elf_local_got_refcounts (abfd);
1124 if (local_refcounts == NULL)
1126 bfd_size_type size;
1128 /* Allocate space for local GOT and PLT reference
1129 counts. Done this way to save polluting elf_obj_tdata
1130 with another target specific pointer. */
1131 size = symtab_hdr->sh_info;
1132 size *= 2 * sizeof (bfd_signed_vma);
1133 /* Add in space to store the local GOT TLS types. */
1134 size += symtab_hdr->sh_info;
1135 local_refcounts = bfd_zalloc (abfd, size);
1136 if (local_refcounts == NULL)
1137 return NULL;
1138 elf_local_got_refcounts (abfd) = local_refcounts;
1139 memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN,
1140 symtab_hdr->sh_info);
1142 return local_refcounts;
1146 /* Look through the relocs for a section during the first phase, and
1147 calculate needed space in the global offset table, procedure linkage
1148 table, and dynamic reloc sections. At this point we haven't
1149 necessarily read all the input files. */
1151 static bfd_boolean
1152 elf32_hppa_check_relocs (bfd *abfd,
1153 struct bfd_link_info *info,
1154 asection *sec,
1155 const Elf_Internal_Rela *relocs)
1157 Elf_Internal_Shdr *symtab_hdr;
1158 struct elf_link_hash_entry **eh_syms;
1159 const Elf_Internal_Rela *rela;
1160 const Elf_Internal_Rela *rela_end;
1161 struct elf32_hppa_link_hash_table *htab;
1162 asection *sreloc;
1163 int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
1165 if (info->relocatable)
1166 return TRUE;
1168 htab = hppa_link_hash_table (info);
1169 if (htab == NULL)
1170 return FALSE;
1171 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1172 eh_syms = elf_sym_hashes (abfd);
1173 sreloc = NULL;
1175 rela_end = relocs + sec->reloc_count;
1176 for (rela = relocs; rela < rela_end; rela++)
1178 enum {
1179 NEED_GOT = 1,
1180 NEED_PLT = 2,
1181 NEED_DYNREL = 4,
1182 PLT_PLABEL = 8
1185 unsigned int r_symndx, r_type;
1186 struct elf32_hppa_link_hash_entry *hh;
1187 int need_entry = 0;
1189 r_symndx = ELF32_R_SYM (rela->r_info);
1191 if (r_symndx < symtab_hdr->sh_info)
1192 hh = NULL;
1193 else
1195 hh = hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1196 while (hh->eh.root.type == bfd_link_hash_indirect
1197 || hh->eh.root.type == bfd_link_hash_warning)
1198 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1201 r_type = ELF32_R_TYPE (rela->r_info);
1202 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1204 switch (r_type)
1206 case R_PARISC_DLTIND14F:
1207 case R_PARISC_DLTIND14R:
1208 case R_PARISC_DLTIND21L:
1209 /* This symbol requires a global offset table entry. */
1210 need_entry = NEED_GOT;
1211 break;
1213 case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1214 case R_PARISC_PLABEL21L:
1215 case R_PARISC_PLABEL32:
1216 /* If the addend is non-zero, we break badly. */
1217 if (rela->r_addend != 0)
1218 abort ();
1220 /* If we are creating a shared library, then we need to
1221 create a PLT entry for all PLABELs, because PLABELs with
1222 local symbols may be passed via a pointer to another
1223 object. Additionally, output a dynamic relocation
1224 pointing to the PLT entry.
1226 For executables, the original 32-bit ABI allowed two
1227 different styles of PLABELs (function pointers): For
1228 global functions, the PLABEL word points into the .plt
1229 two bytes past a (function address, gp) pair, and for
1230 local functions the PLABEL points directly at the
1231 function. The magic +2 for the first type allows us to
1232 differentiate between the two. As you can imagine, this
1233 is a real pain when it comes to generating code to call
1234 functions indirectly or to compare function pointers.
1235 We avoid the mess by always pointing a PLABEL into the
1236 .plt, even for local functions. */
1237 need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
1238 break;
1240 case R_PARISC_PCREL12F:
1241 htab->has_12bit_branch = 1;
1242 goto branch_common;
1244 case R_PARISC_PCREL17C:
1245 case R_PARISC_PCREL17F:
1246 htab->has_17bit_branch = 1;
1247 goto branch_common;
1249 case R_PARISC_PCREL22F:
1250 htab->has_22bit_branch = 1;
1251 branch_common:
1252 /* Function calls might need to go through the .plt, and
1253 might require long branch stubs. */
1254 if (hh == NULL)
1256 /* We know local syms won't need a .plt entry, and if
1257 they need a long branch stub we can't guarantee that
1258 we can reach the stub. So just flag an error later
1259 if we're doing a shared link and find we need a long
1260 branch stub. */
1261 continue;
1263 else
1265 /* Global symbols will need a .plt entry if they remain
1266 global, and in most cases won't need a long branch
1267 stub. Unfortunately, we have to cater for the case
1268 where a symbol is forced local by versioning, or due
1269 to symbolic linking, and we lose the .plt entry. */
1270 need_entry = NEED_PLT;
1271 if (hh->eh.type == STT_PARISC_MILLI)
1272 need_entry = 0;
1274 break;
1276 case R_PARISC_SEGBASE: /* Used to set segment base. */
1277 case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
1278 case R_PARISC_PCREL14F: /* PC relative load/store. */
1279 case R_PARISC_PCREL14R:
1280 case R_PARISC_PCREL17R: /* External branches. */
1281 case R_PARISC_PCREL21L: /* As above, and for load/store too. */
1282 case R_PARISC_PCREL32:
1283 /* We don't need to propagate the relocation if linking a
1284 shared object since these are section relative. */
1285 continue;
1287 case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1288 case R_PARISC_DPREL14R:
1289 case R_PARISC_DPREL21L:
1290 if (info->shared)
1292 (*_bfd_error_handler)
1293 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1294 abfd,
1295 elf_hppa_howto_table[r_type].name);
1296 bfd_set_error (bfd_error_bad_value);
1297 return FALSE;
1299 /* Fall through. */
1301 case R_PARISC_DIR17F: /* Used for external branches. */
1302 case R_PARISC_DIR17R:
1303 case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1304 case R_PARISC_DIR14R:
1305 case R_PARISC_DIR21L: /* As above, and for ext branches too. */
1306 case R_PARISC_DIR32: /* .word relocs. */
1307 /* We may want to output a dynamic relocation later. */
1308 need_entry = NEED_DYNREL;
1309 break;
1311 /* This relocation describes the C++ object vtable hierarchy.
1312 Reconstruct it for later use during GC. */
1313 case R_PARISC_GNU_VTINHERIT:
1314 if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1315 return FALSE;
1316 continue;
1318 /* This relocation describes which C++ vtable entries are actually
1319 used. Record for later use during GC. */
1320 case R_PARISC_GNU_VTENTRY:
1321 BFD_ASSERT (hh != NULL);
1322 if (hh != NULL
1323 && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1324 return FALSE;
1325 continue;
1327 case R_PARISC_TLS_GD21L:
1328 case R_PARISC_TLS_GD14R:
1329 case R_PARISC_TLS_LDM21L:
1330 case R_PARISC_TLS_LDM14R:
1331 need_entry = NEED_GOT;
1332 break;
1334 case R_PARISC_TLS_IE21L:
1335 case R_PARISC_TLS_IE14R:
1336 if (info->shared)
1337 info->flags |= DF_STATIC_TLS;
1338 need_entry = NEED_GOT;
1339 break;
1341 default:
1342 continue;
1345 /* Now carry out our orders. */
1346 if (need_entry & NEED_GOT)
1348 switch (r_type)
1350 default:
1351 tls_type = GOT_NORMAL;
1352 break;
1353 case R_PARISC_TLS_GD21L:
1354 case R_PARISC_TLS_GD14R:
1355 tls_type |= GOT_TLS_GD;
1356 break;
1357 case R_PARISC_TLS_LDM21L:
1358 case R_PARISC_TLS_LDM14R:
1359 tls_type |= GOT_TLS_LDM;
1360 break;
1361 case R_PARISC_TLS_IE21L:
1362 case R_PARISC_TLS_IE14R:
1363 tls_type |= GOT_TLS_IE;
1364 break;
1367 /* Allocate space for a GOT entry, as well as a dynamic
1368 relocation for this entry. */
1369 if (htab->sgot == NULL)
1371 if (htab->etab.dynobj == NULL)
1372 htab->etab.dynobj = abfd;
1373 if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1374 return FALSE;
1377 if (r_type == R_PARISC_TLS_LDM21L
1378 || r_type == R_PARISC_TLS_LDM14R)
1379 htab->tls_ldm_got.refcount += 1;
1380 else
1382 if (hh != NULL)
1384 hh->eh.got.refcount += 1;
1385 old_tls_type = hh->tls_type;
1387 else
1389 bfd_signed_vma *local_got_refcounts;
1391 /* This is a global offset table entry for a local symbol. */
1392 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1393 if (local_got_refcounts == NULL)
1394 return FALSE;
1395 local_got_refcounts[r_symndx] += 1;
1397 old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1400 tls_type |= old_tls_type;
1402 if (old_tls_type != tls_type)
1404 if (hh != NULL)
1405 hh->tls_type = tls_type;
1406 else
1407 hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1413 if (need_entry & NEED_PLT)
1415 /* If we are creating a shared library, and this is a reloc
1416 against a weak symbol or a global symbol in a dynamic
1417 object, then we will be creating an import stub and a
1418 .plt entry for the symbol. Similarly, on a normal link
1419 to symbols defined in a dynamic object we'll need the
1420 import stub and a .plt entry. We don't know yet whether
1421 the symbol is defined or not, so make an entry anyway and
1422 clean up later in adjust_dynamic_symbol. */
1423 if ((sec->flags & SEC_ALLOC) != 0)
1425 if (hh != NULL)
1427 hh->eh.needs_plt = 1;
1428 hh->eh.plt.refcount += 1;
1430 /* If this .plt entry is for a plabel, mark it so
1431 that adjust_dynamic_symbol will keep the entry
1432 even if it appears to be local. */
1433 if (need_entry & PLT_PLABEL)
1434 hh->plabel = 1;
1436 else if (need_entry & PLT_PLABEL)
1438 bfd_signed_vma *local_got_refcounts;
1439 bfd_signed_vma *local_plt_refcounts;
1441 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1442 if (local_got_refcounts == NULL)
1443 return FALSE;
1444 local_plt_refcounts = (local_got_refcounts
1445 + symtab_hdr->sh_info);
1446 local_plt_refcounts[r_symndx] += 1;
1451 if (need_entry & NEED_DYNREL)
1453 /* Flag this symbol as having a non-got, non-plt reference
1454 so that we generate copy relocs if it turns out to be
1455 dynamic. */
1456 if (hh != NULL && !info->shared)
1457 hh->eh.non_got_ref = 1;
1459 /* If we are creating a shared library then we need to copy
1460 the reloc into the shared library. However, if we are
1461 linking with -Bsymbolic, we need only copy absolute
1462 relocs or relocs against symbols that are not defined in
1463 an object we are including in the link. PC- or DP- or
1464 DLT-relative relocs against any local sym or global sym
1465 with DEF_REGULAR set, can be discarded. At this point we
1466 have not seen all the input files, so it is possible that
1467 DEF_REGULAR is not set now but will be set later (it is
1468 never cleared). We account for that possibility below by
1469 storing information in the dyn_relocs field of the
1470 hash table entry.
1472 A similar situation to the -Bsymbolic case occurs when
1473 creating shared libraries and symbol visibility changes
1474 render the symbol local.
1476 As it turns out, all the relocs we will be creating here
1477 are absolute, so we cannot remove them on -Bsymbolic
1478 links or visibility changes anyway. A STUB_REL reloc
1479 is absolute too, as in that case it is the reloc in the
1480 stub we will be creating, rather than copying the PCREL
1481 reloc in the branch.
1483 If on the other hand, we are creating an executable, we
1484 may need to keep relocations for symbols satisfied by a
1485 dynamic library if we manage to avoid copy relocs for the
1486 symbol. */
1487 if ((info->shared
1488 && (sec->flags & SEC_ALLOC) != 0
1489 && (IS_ABSOLUTE_RELOC (r_type)
1490 || (hh != NULL
1491 && (!info->symbolic
1492 || hh->eh.root.type == bfd_link_hash_defweak
1493 || !hh->eh.def_regular))))
1494 || (ELIMINATE_COPY_RELOCS
1495 && !info->shared
1496 && (sec->flags & SEC_ALLOC) != 0
1497 && hh != NULL
1498 && (hh->eh.root.type == bfd_link_hash_defweak
1499 || !hh->eh.def_regular)))
1501 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1502 struct elf32_hppa_dyn_reloc_entry **hdh_head;
1504 /* Create a reloc section in dynobj and make room for
1505 this reloc. */
1506 if (sreloc == NULL)
1508 if (htab->etab.dynobj == NULL)
1509 htab->etab.dynobj = abfd;
1511 sreloc = _bfd_elf_make_dynamic_reloc_section
1512 (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1514 if (sreloc == NULL)
1516 bfd_set_error (bfd_error_bad_value);
1517 return FALSE;
1521 /* If this is a global symbol, we count the number of
1522 relocations we need for this symbol. */
1523 if (hh != NULL)
1525 hdh_head = &hh->dyn_relocs;
1527 else
1529 /* Track dynamic relocs needed for local syms too.
1530 We really need local syms available to do this
1531 easily. Oh well. */
1532 asection *sr;
1533 void *vpp;
1534 Elf_Internal_Sym *isym;
1536 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1537 abfd, r_symndx);
1538 if (isym == NULL)
1539 return FALSE;
1541 sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1542 if (sr == NULL)
1543 sr = sec;
1545 vpp = &elf_section_data (sr)->local_dynrel;
1546 hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
1549 hdh_p = *hdh_head;
1550 if (hdh_p == NULL || hdh_p->sec != sec)
1552 hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1553 if (hdh_p == NULL)
1554 return FALSE;
1555 hdh_p->hdh_next = *hdh_head;
1556 *hdh_head = hdh_p;
1557 hdh_p->sec = sec;
1558 hdh_p->count = 0;
1559 #if RELATIVE_DYNRELOCS
1560 hdh_p->relative_count = 0;
1561 #endif
1564 hdh_p->count += 1;
1565 #if RELATIVE_DYNRELOCS
1566 if (!IS_ABSOLUTE_RELOC (rtype))
1567 hdh_p->relative_count += 1;
1568 #endif
1573 return TRUE;
1576 /* Return the section that should be marked against garbage collection
1577 for a given relocation. */
1579 static asection *
1580 elf32_hppa_gc_mark_hook (asection *sec,
1581 struct bfd_link_info *info,
1582 Elf_Internal_Rela *rela,
1583 struct elf_link_hash_entry *hh,
1584 Elf_Internal_Sym *sym)
1586 if (hh != NULL)
1587 switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1589 case R_PARISC_GNU_VTINHERIT:
1590 case R_PARISC_GNU_VTENTRY:
1591 return NULL;
1594 return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1597 /* Update the got and plt entry reference counts for the section being
1598 removed. */
1600 static bfd_boolean
1601 elf32_hppa_gc_sweep_hook (bfd *abfd,
1602 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1603 asection *sec,
1604 const Elf_Internal_Rela *relocs)
1606 Elf_Internal_Shdr *symtab_hdr;
1607 struct elf_link_hash_entry **eh_syms;
1608 bfd_signed_vma *local_got_refcounts;
1609 bfd_signed_vma *local_plt_refcounts;
1610 const Elf_Internal_Rela *rela, *relend;
1611 struct elf32_hppa_link_hash_table *htab;
1613 if (info->relocatable)
1614 return TRUE;
1616 htab = hppa_link_hash_table (info);
1617 if (htab == NULL)
1618 return FALSE;
1620 elf_section_data (sec)->local_dynrel = NULL;
1622 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1623 eh_syms = elf_sym_hashes (abfd);
1624 local_got_refcounts = elf_local_got_refcounts (abfd);
1625 local_plt_refcounts = local_got_refcounts;
1626 if (local_plt_refcounts != NULL)
1627 local_plt_refcounts += symtab_hdr->sh_info;
1629 relend = relocs + sec->reloc_count;
1630 for (rela = relocs; rela < relend; rela++)
1632 unsigned long r_symndx;
1633 unsigned int r_type;
1634 struct elf_link_hash_entry *eh = NULL;
1636 r_symndx = ELF32_R_SYM (rela->r_info);
1637 if (r_symndx >= symtab_hdr->sh_info)
1639 struct elf32_hppa_link_hash_entry *hh;
1640 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1641 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1643 eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1644 while (eh->root.type == bfd_link_hash_indirect
1645 || eh->root.type == bfd_link_hash_warning)
1646 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1647 hh = hppa_elf_hash_entry (eh);
1649 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
1650 if (hdh_p->sec == sec)
1652 /* Everything must go for SEC. */
1653 *hdh_pp = hdh_p->hdh_next;
1654 break;
1658 r_type = ELF32_R_TYPE (rela->r_info);
1659 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1661 switch (r_type)
1663 case R_PARISC_DLTIND14F:
1664 case R_PARISC_DLTIND14R:
1665 case R_PARISC_DLTIND21L:
1666 case R_PARISC_TLS_GD21L:
1667 case R_PARISC_TLS_GD14R:
1668 case R_PARISC_TLS_IE21L:
1669 case R_PARISC_TLS_IE14R:
1670 if (eh != NULL)
1672 if (eh->got.refcount > 0)
1673 eh->got.refcount -= 1;
1675 else if (local_got_refcounts != NULL)
1677 if (local_got_refcounts[r_symndx] > 0)
1678 local_got_refcounts[r_symndx] -= 1;
1680 break;
1682 case R_PARISC_TLS_LDM21L:
1683 case R_PARISC_TLS_LDM14R:
1684 htab->tls_ldm_got.refcount -= 1;
1685 break;
1687 case R_PARISC_PCREL12F:
1688 case R_PARISC_PCREL17C:
1689 case R_PARISC_PCREL17F:
1690 case R_PARISC_PCREL22F:
1691 if (eh != NULL)
1693 if (eh->plt.refcount > 0)
1694 eh->plt.refcount -= 1;
1696 break;
1698 case R_PARISC_PLABEL14R:
1699 case R_PARISC_PLABEL21L:
1700 case R_PARISC_PLABEL32:
1701 if (eh != NULL)
1703 if (eh->plt.refcount > 0)
1704 eh->plt.refcount -= 1;
1706 else if (local_plt_refcounts != NULL)
1708 if (local_plt_refcounts[r_symndx] > 0)
1709 local_plt_refcounts[r_symndx] -= 1;
1711 break;
1713 default:
1714 break;
1718 return TRUE;
1721 /* Support for core dump NOTE sections. */
1723 static bfd_boolean
1724 elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1726 int offset;
1727 size_t size;
1729 switch (note->descsz)
1731 default:
1732 return FALSE;
1734 case 396: /* Linux/hppa */
1735 /* pr_cursig */
1736 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1738 /* pr_pid */
1739 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1741 /* pr_reg */
1742 offset = 72;
1743 size = 320;
1745 break;
1748 /* Make a ".reg/999" section. */
1749 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1750 size, note->descpos + offset);
1753 static bfd_boolean
1754 elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1756 switch (note->descsz)
1758 default:
1759 return FALSE;
1761 case 124: /* Linux/hppa elf_prpsinfo. */
1762 elf_tdata (abfd)->core_program
1763 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1764 elf_tdata (abfd)->core_command
1765 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1768 /* Note that for some reason, a spurious space is tacked
1769 onto the end of the args in some (at least one anyway)
1770 implementations, so strip it off if it exists. */
1772 char *command = elf_tdata (abfd)->core_command;
1773 int n = strlen (command);
1775 if (0 < n && command[n - 1] == ' ')
1776 command[n - 1] = '\0';
1779 return TRUE;
1782 /* Our own version of hide_symbol, so that we can keep plt entries for
1783 plabels. */
1785 static void
1786 elf32_hppa_hide_symbol (struct bfd_link_info *info,
1787 struct elf_link_hash_entry *eh,
1788 bfd_boolean force_local)
1790 if (force_local)
1792 eh->forced_local = 1;
1793 if (eh->dynindx != -1)
1795 eh->dynindx = -1;
1796 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1797 eh->dynstr_index);
1801 if (! hppa_elf_hash_entry (eh)->plabel)
1803 eh->needs_plt = 0;
1804 eh->plt = elf_hash_table (info)->init_plt_refcount;
1808 /* Adjust a symbol defined by a dynamic object and referenced by a
1809 regular object. The current definition is in some section of the
1810 dynamic object, but we're not including those sections. We have to
1811 change the definition to something the rest of the link can
1812 understand. */
1814 static bfd_boolean
1815 elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1816 struct elf_link_hash_entry *eh)
1818 struct elf32_hppa_link_hash_table *htab;
1819 asection *sec;
1821 /* If this is a function, put it in the procedure linkage table. We
1822 will fill in the contents of the procedure linkage table later. */
1823 if (eh->type == STT_FUNC
1824 || eh->needs_plt)
1826 if (eh->plt.refcount <= 0
1827 || (eh->def_regular
1828 && eh->root.type != bfd_link_hash_defweak
1829 && ! hppa_elf_hash_entry (eh)->plabel
1830 && (!info->shared || info->symbolic)))
1832 /* The .plt entry is not needed when:
1833 a) Garbage collection has removed all references to the
1834 symbol, or
1835 b) We know for certain the symbol is defined in this
1836 object, and it's not a weak definition, nor is the symbol
1837 used by a plabel relocation. Either this object is the
1838 application or we are doing a shared symbolic link. */
1840 eh->plt.offset = (bfd_vma) -1;
1841 eh->needs_plt = 0;
1844 return TRUE;
1846 else
1847 eh->plt.offset = (bfd_vma) -1;
1849 /* If this is a weak symbol, and there is a real definition, the
1850 processor independent code will have arranged for us to see the
1851 real definition first, and we can just use the same value. */
1852 if (eh->u.weakdef != NULL)
1854 if (eh->u.weakdef->root.type != bfd_link_hash_defined
1855 && eh->u.weakdef->root.type != bfd_link_hash_defweak)
1856 abort ();
1857 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1858 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1859 if (ELIMINATE_COPY_RELOCS)
1860 eh->non_got_ref = eh->u.weakdef->non_got_ref;
1861 return TRUE;
1864 /* This is a reference to a symbol defined by a dynamic object which
1865 is not a function. */
1867 /* If we are creating a shared library, we must presume that the
1868 only references to the symbol are via the global offset table.
1869 For such cases we need not do anything here; the relocations will
1870 be handled correctly by relocate_section. */
1871 if (info->shared)
1872 return TRUE;
1874 /* If there are no references to this symbol that do not use the
1875 GOT, we don't need to generate a copy reloc. */
1876 if (!eh->non_got_ref)
1877 return TRUE;
1879 if (ELIMINATE_COPY_RELOCS)
1881 struct elf32_hppa_link_hash_entry *hh;
1882 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1884 hh = hppa_elf_hash_entry (eh);
1885 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
1887 sec = hdh_p->sec->output_section;
1888 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1889 break;
1892 /* If we didn't find any dynamic relocs in read-only sections, then
1893 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1894 if (hdh_p == NULL)
1896 eh->non_got_ref = 0;
1897 return TRUE;
1901 if (eh->size == 0)
1903 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1904 eh->root.root.string);
1905 return TRUE;
1908 /* We must allocate the symbol in our .dynbss section, which will
1909 become part of the .bss section of the executable. There will be
1910 an entry for this symbol in the .dynsym section. The dynamic
1911 object will contain position independent code, so all references
1912 from the dynamic object to this symbol will go through the global
1913 offset table. The dynamic linker will use the .dynsym entry to
1914 determine the address it must put in the global offset table, so
1915 both the dynamic object and the regular object will refer to the
1916 same memory location for the variable. */
1918 htab = hppa_link_hash_table (info);
1919 if (htab == NULL)
1920 return FALSE;
1922 /* We must generate a COPY reloc to tell the dynamic linker to
1923 copy the initial value out of the dynamic object and into the
1924 runtime process image. */
1925 if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
1927 htab->srelbss->size += sizeof (Elf32_External_Rela);
1928 eh->needs_copy = 1;
1931 sec = htab->sdynbss;
1933 return _bfd_elf_adjust_dynamic_copy (eh, sec);
1936 /* Allocate space in the .plt for entries that won't have relocations.
1937 ie. plabel entries. */
1939 static bfd_boolean
1940 allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1942 struct bfd_link_info *info;
1943 struct elf32_hppa_link_hash_table *htab;
1944 struct elf32_hppa_link_hash_entry *hh;
1945 asection *sec;
1947 if (eh->root.type == bfd_link_hash_indirect)
1948 return TRUE;
1950 if (eh->root.type == bfd_link_hash_warning)
1951 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1953 info = (struct bfd_link_info *) inf;
1954 hh = hppa_elf_hash_entry (eh);
1955 htab = hppa_link_hash_table (info);
1956 if (htab == NULL)
1957 return FALSE;
1959 if (htab->etab.dynamic_sections_created
1960 && eh->plt.refcount > 0)
1962 /* Make sure this symbol is output as a dynamic symbol.
1963 Undefined weak syms won't yet be marked as dynamic. */
1964 if (eh->dynindx == -1
1965 && !eh->forced_local
1966 && eh->type != STT_PARISC_MILLI)
1968 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
1969 return FALSE;
1972 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
1974 /* Allocate these later. From this point on, h->plabel
1975 means that the plt entry is only used by a plabel.
1976 We'll be using a normal plt entry for this symbol, so
1977 clear the plabel indicator. */
1979 hh->plabel = 0;
1981 else if (hh->plabel)
1983 /* Make an entry in the .plt section for plabel references
1984 that won't have a .plt entry for other reasons. */
1985 sec = htab->splt;
1986 eh->plt.offset = sec->size;
1987 sec->size += PLT_ENTRY_SIZE;
1989 else
1991 /* No .plt entry needed. */
1992 eh->plt.offset = (bfd_vma) -1;
1993 eh->needs_plt = 0;
1996 else
1998 eh->plt.offset = (bfd_vma) -1;
1999 eh->needs_plt = 0;
2002 return TRUE;
2005 /* Allocate space in .plt, .got and associated reloc sections for
2006 global syms. */
2008 static bfd_boolean
2009 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2011 struct bfd_link_info *info;
2012 struct elf32_hppa_link_hash_table *htab;
2013 asection *sec;
2014 struct elf32_hppa_link_hash_entry *hh;
2015 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2017 if (eh->root.type == bfd_link_hash_indirect)
2018 return TRUE;
2020 if (eh->root.type == bfd_link_hash_warning)
2021 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2023 info = inf;
2024 htab = hppa_link_hash_table (info);
2025 if (htab == NULL)
2026 return FALSE;
2028 hh = hppa_elf_hash_entry (eh);
2030 if (htab->etab.dynamic_sections_created
2031 && eh->plt.offset != (bfd_vma) -1
2032 && !hh->plabel
2033 && eh->plt.refcount > 0)
2035 /* Make an entry in the .plt section. */
2036 sec = htab->splt;
2037 eh->plt.offset = sec->size;
2038 sec->size += PLT_ENTRY_SIZE;
2040 /* We also need to make an entry in the .rela.plt section. */
2041 htab->srelplt->size += sizeof (Elf32_External_Rela);
2042 htab->need_plt_stub = 1;
2045 if (eh->got.refcount > 0)
2047 /* Make sure this symbol is output as a dynamic symbol.
2048 Undefined weak syms won't yet be marked as dynamic. */
2049 if (eh->dynindx == -1
2050 && !eh->forced_local
2051 && eh->type != STT_PARISC_MILLI)
2053 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2054 return FALSE;
2057 sec = htab->sgot;
2058 eh->got.offset = sec->size;
2059 sec->size += GOT_ENTRY_SIZE;
2060 /* R_PARISC_TLS_GD* needs two GOT entries */
2061 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2062 sec->size += GOT_ENTRY_SIZE * 2;
2063 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2064 sec->size += GOT_ENTRY_SIZE;
2065 if (htab->etab.dynamic_sections_created
2066 && (info->shared
2067 || (eh->dynindx != -1
2068 && !eh->forced_local)))
2070 htab->srelgot->size += sizeof (Elf32_External_Rela);
2071 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2072 htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2073 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2074 htab->srelgot->size += sizeof (Elf32_External_Rela);
2077 else
2078 eh->got.offset = (bfd_vma) -1;
2080 if (hh->dyn_relocs == NULL)
2081 return TRUE;
2083 /* If this is a -Bsymbolic shared link, then we need to discard all
2084 space allocated for dynamic pc-relative relocs against symbols
2085 defined in a regular object. For the normal shared case, discard
2086 space for relocs that have become local due to symbol visibility
2087 changes. */
2088 if (info->shared)
2090 #if RELATIVE_DYNRELOCS
2091 if (SYMBOL_CALLS_LOCAL (info, eh))
2093 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
2095 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2097 hdh_p->count -= hdh_p->relative_count;
2098 hdh_p->relative_count = 0;
2099 if (hdh_p->count == 0)
2100 *hdh_pp = hdh_p->hdh_next;
2101 else
2102 hdh_pp = &hdh_p->hdh_next;
2105 #endif
2107 /* Also discard relocs on undefined weak syms with non-default
2108 visibility. */
2109 if (hh->dyn_relocs != NULL
2110 && eh->root.type == bfd_link_hash_undefweak)
2112 if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2113 hh->dyn_relocs = NULL;
2115 /* Make sure undefined weak symbols are output as a dynamic
2116 symbol in PIEs. */
2117 else if (eh->dynindx == -1
2118 && !eh->forced_local)
2120 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2121 return FALSE;
2125 else
2127 /* For the non-shared case, discard space for relocs against
2128 symbols which turn out to need copy relocs or are not
2129 dynamic. */
2131 if (!eh->non_got_ref
2132 && ((ELIMINATE_COPY_RELOCS
2133 && eh->def_dynamic
2134 && !eh->def_regular)
2135 || (htab->etab.dynamic_sections_created
2136 && (eh->root.type == bfd_link_hash_undefweak
2137 || eh->root.type == bfd_link_hash_undefined))))
2139 /* Make sure this symbol is output as a dynamic symbol.
2140 Undefined weak syms won't yet be marked as dynamic. */
2141 if (eh->dynindx == -1
2142 && !eh->forced_local
2143 && eh->type != STT_PARISC_MILLI)
2145 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2146 return FALSE;
2149 /* If that succeeded, we know we'll be keeping all the
2150 relocs. */
2151 if (eh->dynindx != -1)
2152 goto keep;
2155 hh->dyn_relocs = NULL;
2156 return TRUE;
2158 keep: ;
2161 /* Finally, allocate space. */
2162 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2164 asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2165 sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2168 return TRUE;
2171 /* This function is called via elf_link_hash_traverse to force
2172 millicode symbols local so they do not end up as globals in the
2173 dynamic symbol table. We ought to be able to do this in
2174 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2175 for all dynamic symbols. Arguably, this is a bug in
2176 elf_adjust_dynamic_symbol. */
2178 static bfd_boolean
2179 clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2180 struct bfd_link_info *info)
2182 if (eh->root.type == bfd_link_hash_warning)
2183 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2185 if (eh->type == STT_PARISC_MILLI
2186 && !eh->forced_local)
2188 elf32_hppa_hide_symbol (info, eh, TRUE);
2190 return TRUE;
2193 /* Find any dynamic relocs that apply to read-only sections. */
2195 static bfd_boolean
2196 readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2198 struct elf32_hppa_link_hash_entry *hh;
2199 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2201 if (eh->root.type == bfd_link_hash_warning)
2202 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2204 hh = hppa_elf_hash_entry (eh);
2205 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2207 asection *sec = hdh_p->sec->output_section;
2209 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2211 struct bfd_link_info *info = inf;
2213 info->flags |= DF_TEXTREL;
2215 /* Not an error, just cut short the traversal. */
2216 return FALSE;
2219 return TRUE;
2222 /* Set the sizes of the dynamic sections. */
2224 static bfd_boolean
2225 elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2226 struct bfd_link_info *info)
2228 struct elf32_hppa_link_hash_table *htab;
2229 bfd *dynobj;
2230 bfd *ibfd;
2231 asection *sec;
2232 bfd_boolean relocs;
2234 htab = hppa_link_hash_table (info);
2235 if (htab == NULL)
2236 return FALSE;
2238 dynobj = htab->etab.dynobj;
2239 if (dynobj == NULL)
2240 abort ();
2242 if (htab->etab.dynamic_sections_created)
2244 /* Set the contents of the .interp section to the interpreter. */
2245 if (info->executable)
2247 sec = bfd_get_section_by_name (dynobj, ".interp");
2248 if (sec == NULL)
2249 abort ();
2250 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2251 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2254 /* Force millicode symbols local. */
2255 elf_link_hash_traverse (&htab->etab,
2256 clobber_millicode_symbols,
2257 info);
2260 /* Set up .got and .plt offsets for local syms, and space for local
2261 dynamic relocs. */
2262 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2264 bfd_signed_vma *local_got;
2265 bfd_signed_vma *end_local_got;
2266 bfd_signed_vma *local_plt;
2267 bfd_signed_vma *end_local_plt;
2268 bfd_size_type locsymcount;
2269 Elf_Internal_Shdr *symtab_hdr;
2270 asection *srel;
2271 char *local_tls_type;
2273 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2274 continue;
2276 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2278 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2280 for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2281 elf_section_data (sec)->local_dynrel);
2282 hdh_p != NULL;
2283 hdh_p = hdh_p->hdh_next)
2285 if (!bfd_is_abs_section (hdh_p->sec)
2286 && bfd_is_abs_section (hdh_p->sec->output_section))
2288 /* Input section has been discarded, either because
2289 it is a copy of a linkonce section or due to
2290 linker script /DISCARD/, so we'll be discarding
2291 the relocs too. */
2293 else if (hdh_p->count != 0)
2295 srel = elf_section_data (hdh_p->sec)->sreloc;
2296 srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2297 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2298 info->flags |= DF_TEXTREL;
2303 local_got = elf_local_got_refcounts (ibfd);
2304 if (!local_got)
2305 continue;
2307 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2308 locsymcount = symtab_hdr->sh_info;
2309 end_local_got = local_got + locsymcount;
2310 local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2311 sec = htab->sgot;
2312 srel = htab->srelgot;
2313 for (; local_got < end_local_got; ++local_got)
2315 if (*local_got > 0)
2317 *local_got = sec->size;
2318 sec->size += GOT_ENTRY_SIZE;
2319 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2320 sec->size += 2 * GOT_ENTRY_SIZE;
2321 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2322 sec->size += GOT_ENTRY_SIZE;
2323 if (info->shared)
2325 srel->size += sizeof (Elf32_External_Rela);
2326 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2327 srel->size += 2 * sizeof (Elf32_External_Rela);
2328 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2329 srel->size += sizeof (Elf32_External_Rela);
2332 else
2333 *local_got = (bfd_vma) -1;
2335 ++local_tls_type;
2338 local_plt = end_local_got;
2339 end_local_plt = local_plt + locsymcount;
2340 if (! htab->etab.dynamic_sections_created)
2342 /* Won't be used, but be safe. */
2343 for (; local_plt < end_local_plt; ++local_plt)
2344 *local_plt = (bfd_vma) -1;
2346 else
2348 sec = htab->splt;
2349 srel = htab->srelplt;
2350 for (; local_plt < end_local_plt; ++local_plt)
2352 if (*local_plt > 0)
2354 *local_plt = sec->size;
2355 sec->size += PLT_ENTRY_SIZE;
2356 if (info->shared)
2357 srel->size += sizeof (Elf32_External_Rela);
2359 else
2360 *local_plt = (bfd_vma) -1;
2365 if (htab->tls_ldm_got.refcount > 0)
2367 /* Allocate 2 got entries and 1 dynamic reloc for
2368 R_PARISC_TLS_DTPMOD32 relocs. */
2369 htab->tls_ldm_got.offset = htab->sgot->size;
2370 htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2371 htab->srelgot->size += sizeof (Elf32_External_Rela);
2373 else
2374 htab->tls_ldm_got.offset = -1;
2376 /* Do all the .plt entries without relocs first. The dynamic linker
2377 uses the last .plt reloc to find the end of the .plt (and hence
2378 the start of the .got) for lazy linking. */
2379 elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2381 /* Allocate global sym .plt and .got entries, and space for global
2382 sym dynamic relocs. */
2383 elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2385 /* The check_relocs and adjust_dynamic_symbol entry points have
2386 determined the sizes of the various dynamic sections. Allocate
2387 memory for them. */
2388 relocs = FALSE;
2389 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2391 if ((sec->flags & SEC_LINKER_CREATED) == 0)
2392 continue;
2394 if (sec == htab->splt)
2396 if (htab->need_plt_stub)
2398 /* Make space for the plt stub at the end of the .plt
2399 section. We want this stub right at the end, up
2400 against the .got section. */
2401 int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2402 int pltalign = bfd_section_alignment (dynobj, sec);
2403 bfd_size_type mask;
2405 if (gotalign > pltalign)
2406 bfd_set_section_alignment (dynobj, sec, gotalign);
2407 mask = ((bfd_size_type) 1 << gotalign) - 1;
2408 sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2411 else if (sec == htab->sgot
2412 || sec == htab->sdynbss)
2414 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2416 if (sec->size != 0)
2418 /* Remember whether there are any reloc sections other
2419 than .rela.plt. */
2420 if (sec != htab->srelplt)
2421 relocs = TRUE;
2423 /* We use the reloc_count field as a counter if we need
2424 to copy relocs into the output file. */
2425 sec->reloc_count = 0;
2428 else
2430 /* It's not one of our sections, so don't allocate space. */
2431 continue;
2434 if (sec->size == 0)
2436 /* If we don't need this section, strip it from the
2437 output file. This is mostly to handle .rela.bss and
2438 .rela.plt. We must create both sections in
2439 create_dynamic_sections, because they must be created
2440 before the linker maps input sections to output
2441 sections. The linker does that before
2442 adjust_dynamic_symbol is called, and it is that
2443 function which decides whether anything needs to go
2444 into these sections. */
2445 sec->flags |= SEC_EXCLUDE;
2446 continue;
2449 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2450 continue;
2452 /* Allocate memory for the section contents. Zero it, because
2453 we may not fill in all the reloc sections. */
2454 sec->contents = bfd_zalloc (dynobj, sec->size);
2455 if (sec->contents == NULL)
2456 return FALSE;
2459 if (htab->etab.dynamic_sections_created)
2461 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2462 actually has nothing to do with the PLT, it is how we
2463 communicate the LTP value of a load module to the dynamic
2464 linker. */
2465 #define add_dynamic_entry(TAG, VAL) \
2466 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2468 if (!add_dynamic_entry (DT_PLTGOT, 0))
2469 return FALSE;
2471 /* Add some entries to the .dynamic section. We fill in the
2472 values later, in elf32_hppa_finish_dynamic_sections, but we
2473 must add the entries now so that we get the correct size for
2474 the .dynamic section. The DT_DEBUG entry is filled in by the
2475 dynamic linker and used by the debugger. */
2476 if (info->executable)
2478 if (!add_dynamic_entry (DT_DEBUG, 0))
2479 return FALSE;
2482 if (htab->srelplt->size != 0)
2484 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2485 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2486 || !add_dynamic_entry (DT_JMPREL, 0))
2487 return FALSE;
2490 if (relocs)
2492 if (!add_dynamic_entry (DT_RELA, 0)
2493 || !add_dynamic_entry (DT_RELASZ, 0)
2494 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2495 return FALSE;
2497 /* If any dynamic relocs apply to a read-only section,
2498 then we need a DT_TEXTREL entry. */
2499 if ((info->flags & DF_TEXTREL) == 0)
2500 elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2502 if ((info->flags & DF_TEXTREL) != 0)
2504 if (!add_dynamic_entry (DT_TEXTREL, 0))
2505 return FALSE;
2509 #undef add_dynamic_entry
2511 return TRUE;
2514 /* External entry points for sizing and building linker stubs. */
2516 /* Set up various things so that we can make a list of input sections
2517 for each output section included in the link. Returns -1 on error,
2518 0 when no stubs will be needed, and 1 on success. */
2521 elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2523 bfd *input_bfd;
2524 unsigned int bfd_count;
2525 int top_id, top_index;
2526 asection *section;
2527 asection **input_list, **list;
2528 bfd_size_type amt;
2529 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2531 if (htab == NULL)
2532 return -1;
2534 /* Count the number of input BFDs and find the top input section id. */
2535 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2536 input_bfd != NULL;
2537 input_bfd = input_bfd->link_next)
2539 bfd_count += 1;
2540 for (section = input_bfd->sections;
2541 section != NULL;
2542 section = section->next)
2544 if (top_id < section->id)
2545 top_id = section->id;
2548 htab->bfd_count = bfd_count;
2550 amt = sizeof (struct map_stub) * (top_id + 1);
2551 htab->stub_group = bfd_zmalloc (amt);
2552 if (htab->stub_group == NULL)
2553 return -1;
2555 /* We can't use output_bfd->section_count here to find the top output
2556 section index as some sections may have been removed, and
2557 strip_excluded_output_sections doesn't renumber the indices. */
2558 for (section = output_bfd->sections, top_index = 0;
2559 section != NULL;
2560 section = section->next)
2562 if (top_index < section->index)
2563 top_index = section->index;
2566 htab->top_index = top_index;
2567 amt = sizeof (asection *) * (top_index + 1);
2568 input_list = bfd_malloc (amt);
2569 htab->input_list = input_list;
2570 if (input_list == NULL)
2571 return -1;
2573 /* For sections we aren't interested in, mark their entries with a
2574 value we can check later. */
2575 list = input_list + top_index;
2577 *list = bfd_abs_section_ptr;
2578 while (list-- != input_list);
2580 for (section = output_bfd->sections;
2581 section != NULL;
2582 section = section->next)
2584 if ((section->flags & SEC_CODE) != 0)
2585 input_list[section->index] = NULL;
2588 return 1;
2591 /* The linker repeatedly calls this function for each input section,
2592 in the order that input sections are linked into output sections.
2593 Build lists of input sections to determine groupings between which
2594 we may insert linker stubs. */
2596 void
2597 elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2599 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2601 if (htab == NULL)
2602 return;
2604 if (isec->output_section->index <= htab->top_index)
2606 asection **list = htab->input_list + isec->output_section->index;
2607 if (*list != bfd_abs_section_ptr)
2609 /* Steal the link_sec pointer for our list. */
2610 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2611 /* This happens to make the list in reverse order,
2612 which is what we want. */
2613 PREV_SEC (isec) = *list;
2614 *list = isec;
2619 /* See whether we can group stub sections together. Grouping stub
2620 sections may result in fewer stubs. More importantly, we need to
2621 put all .init* and .fini* stubs at the beginning of the .init or
2622 .fini output sections respectively, because glibc splits the
2623 _init and _fini functions into multiple parts. Putting a stub in
2624 the middle of a function is not a good idea. */
2626 static void
2627 group_sections (struct elf32_hppa_link_hash_table *htab,
2628 bfd_size_type stub_group_size,
2629 bfd_boolean stubs_always_before_branch)
2631 asection **list = htab->input_list + htab->top_index;
2634 asection *tail = *list;
2635 if (tail == bfd_abs_section_ptr)
2636 continue;
2637 while (tail != NULL)
2639 asection *curr;
2640 asection *prev;
2641 bfd_size_type total;
2642 bfd_boolean big_sec;
2644 curr = tail;
2645 total = tail->size;
2646 big_sec = total >= stub_group_size;
2648 while ((prev = PREV_SEC (curr)) != NULL
2649 && ((total += curr->output_offset - prev->output_offset)
2650 < stub_group_size))
2651 curr = prev;
2653 /* OK, the size from the start of CURR to the end is less
2654 than 240000 bytes and thus can be handled by one stub
2655 section. (or the tail section is itself larger than
2656 240000 bytes, in which case we may be toast.)
2657 We should really be keeping track of the total size of
2658 stubs added here, as stubs contribute to the final output
2659 section size. That's a little tricky, and this way will
2660 only break if stubs added total more than 22144 bytes, or
2661 2768 long branch stubs. It seems unlikely for more than
2662 2768 different functions to be called, especially from
2663 code only 240000 bytes long. This limit used to be
2664 250000, but c++ code tends to generate lots of little
2665 functions, and sometimes violated the assumption. */
2668 prev = PREV_SEC (tail);
2669 /* Set up this stub group. */
2670 htab->stub_group[tail->id].link_sec = curr;
2672 while (tail != curr && (tail = prev) != NULL);
2674 /* But wait, there's more! Input sections up to 240000
2675 bytes before the stub section can be handled by it too.
2676 Don't do this if we have a really large section after the
2677 stubs, as adding more stubs increases the chance that
2678 branches may not reach into the stub section. */
2679 if (!stubs_always_before_branch && !big_sec)
2681 total = 0;
2682 while (prev != NULL
2683 && ((total += tail->output_offset - prev->output_offset)
2684 < stub_group_size))
2686 tail = prev;
2687 prev = PREV_SEC (tail);
2688 htab->stub_group[tail->id].link_sec = curr;
2691 tail = prev;
2694 while (list-- != htab->input_list);
2695 free (htab->input_list);
2696 #undef PREV_SEC
2699 /* Read in all local syms for all input bfds, and create hash entries
2700 for export stubs if we are building a multi-subspace shared lib.
2701 Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2703 static int
2704 get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2706 unsigned int bfd_indx;
2707 Elf_Internal_Sym *local_syms, **all_local_syms;
2708 int stub_changed = 0;
2709 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2711 if (htab == NULL)
2712 return -1;
2714 /* We want to read in symbol extension records only once. To do this
2715 we need to read in the local symbols in parallel and save them for
2716 later use; so hold pointers to the local symbols in an array. */
2717 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2718 all_local_syms = bfd_zmalloc (amt);
2719 htab->all_local_syms = all_local_syms;
2720 if (all_local_syms == NULL)
2721 return -1;
2723 /* Walk over all the input BFDs, swapping in local symbols.
2724 If we are creating a shared library, create hash entries for the
2725 export stubs. */
2726 for (bfd_indx = 0;
2727 input_bfd != NULL;
2728 input_bfd = input_bfd->link_next, bfd_indx++)
2730 Elf_Internal_Shdr *symtab_hdr;
2732 /* We'll need the symbol table in a second. */
2733 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2734 if (symtab_hdr->sh_info == 0)
2735 continue;
2737 /* We need an array of the local symbols attached to the input bfd. */
2738 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2739 if (local_syms == NULL)
2741 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2742 symtab_hdr->sh_info, 0,
2743 NULL, NULL, NULL);
2744 /* Cache them for elf_link_input_bfd. */
2745 symtab_hdr->contents = (unsigned char *) local_syms;
2747 if (local_syms == NULL)
2748 return -1;
2750 all_local_syms[bfd_indx] = local_syms;
2752 if (info->shared && htab->multi_subspace)
2754 struct elf_link_hash_entry **eh_syms;
2755 struct elf_link_hash_entry **eh_symend;
2756 unsigned int symcount;
2758 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2759 - symtab_hdr->sh_info);
2760 eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2761 eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2763 /* Look through the global syms for functions; We need to
2764 build export stubs for all globally visible functions. */
2765 for (; eh_syms < eh_symend; eh_syms++)
2767 struct elf32_hppa_link_hash_entry *hh;
2769 hh = hppa_elf_hash_entry (*eh_syms);
2771 while (hh->eh.root.type == bfd_link_hash_indirect
2772 || hh->eh.root.type == bfd_link_hash_warning)
2773 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2775 /* At this point in the link, undefined syms have been
2776 resolved, so we need to check that the symbol was
2777 defined in this BFD. */
2778 if ((hh->eh.root.type == bfd_link_hash_defined
2779 || hh->eh.root.type == bfd_link_hash_defweak)
2780 && hh->eh.type == STT_FUNC
2781 && hh->eh.root.u.def.section->output_section != NULL
2782 && (hh->eh.root.u.def.section->output_section->owner
2783 == output_bfd)
2784 && hh->eh.root.u.def.section->owner == input_bfd
2785 && hh->eh.def_regular
2786 && !hh->eh.forced_local
2787 && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2789 asection *sec;
2790 const char *stub_name;
2791 struct elf32_hppa_stub_hash_entry *hsh;
2793 sec = hh->eh.root.u.def.section;
2794 stub_name = hh_name (hh);
2795 hsh = hppa_stub_hash_lookup (&htab->bstab,
2796 stub_name,
2797 FALSE, FALSE);
2798 if (hsh == NULL)
2800 hsh = hppa_add_stub (stub_name, sec, htab);
2801 if (!hsh)
2802 return -1;
2804 hsh->target_value = hh->eh.root.u.def.value;
2805 hsh->target_section = hh->eh.root.u.def.section;
2806 hsh->stub_type = hppa_stub_export;
2807 hsh->hh = hh;
2808 stub_changed = 1;
2810 else
2812 (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2813 input_bfd,
2814 stub_name);
2821 return stub_changed;
2824 /* Determine and set the size of the stub section for a final link.
2826 The basic idea here is to examine all the relocations looking for
2827 PC-relative calls to a target that is unreachable with a "bl"
2828 instruction. */
2830 bfd_boolean
2831 elf32_hppa_size_stubs
2832 (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2833 bfd_boolean multi_subspace, bfd_signed_vma group_size,
2834 asection * (*add_stub_section) (const char *, asection *),
2835 void (*layout_sections_again) (void))
2837 bfd_size_type stub_group_size;
2838 bfd_boolean stubs_always_before_branch;
2839 bfd_boolean stub_changed;
2840 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2842 if (htab == NULL)
2843 return FALSE;
2845 /* Stash our params away. */
2846 htab->stub_bfd = stub_bfd;
2847 htab->multi_subspace = multi_subspace;
2848 htab->add_stub_section = add_stub_section;
2849 htab->layout_sections_again = layout_sections_again;
2850 stubs_always_before_branch = group_size < 0;
2851 if (group_size < 0)
2852 stub_group_size = -group_size;
2853 else
2854 stub_group_size = group_size;
2855 if (stub_group_size == 1)
2857 /* Default values. */
2858 if (stubs_always_before_branch)
2860 stub_group_size = 7680000;
2861 if (htab->has_17bit_branch || htab->multi_subspace)
2862 stub_group_size = 240000;
2863 if (htab->has_12bit_branch)
2864 stub_group_size = 7500;
2866 else
2868 stub_group_size = 6971392;
2869 if (htab->has_17bit_branch || htab->multi_subspace)
2870 stub_group_size = 217856;
2871 if (htab->has_12bit_branch)
2872 stub_group_size = 6808;
2876 group_sections (htab, stub_group_size, stubs_always_before_branch);
2878 switch (get_local_syms (output_bfd, info->input_bfds, info))
2880 default:
2881 if (htab->all_local_syms)
2882 goto error_ret_free_local;
2883 return FALSE;
2885 case 0:
2886 stub_changed = FALSE;
2887 break;
2889 case 1:
2890 stub_changed = TRUE;
2891 break;
2894 while (1)
2896 bfd *input_bfd;
2897 unsigned int bfd_indx;
2898 asection *stub_sec;
2900 for (input_bfd = info->input_bfds, bfd_indx = 0;
2901 input_bfd != NULL;
2902 input_bfd = input_bfd->link_next, bfd_indx++)
2904 Elf_Internal_Shdr *symtab_hdr;
2905 asection *section;
2906 Elf_Internal_Sym *local_syms;
2908 /* We'll need the symbol table in a second. */
2909 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2910 if (symtab_hdr->sh_info == 0)
2911 continue;
2913 local_syms = htab->all_local_syms[bfd_indx];
2915 /* Walk over each section attached to the input bfd. */
2916 for (section = input_bfd->sections;
2917 section != NULL;
2918 section = section->next)
2920 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2922 /* If there aren't any relocs, then there's nothing more
2923 to do. */
2924 if ((section->flags & SEC_RELOC) == 0
2925 || section->reloc_count == 0)
2926 continue;
2928 /* If this section is a link-once section that will be
2929 discarded, then don't create any stubs. */
2930 if (section->output_section == NULL
2931 || section->output_section->owner != output_bfd)
2932 continue;
2934 /* Get the relocs. */
2935 internal_relocs
2936 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2937 info->keep_memory);
2938 if (internal_relocs == NULL)
2939 goto error_ret_free_local;
2941 /* Now examine each relocation. */
2942 irela = internal_relocs;
2943 irelaend = irela + section->reloc_count;
2944 for (; irela < irelaend; irela++)
2946 unsigned int r_type, r_indx;
2947 enum elf32_hppa_stub_type stub_type;
2948 struct elf32_hppa_stub_hash_entry *hsh;
2949 asection *sym_sec;
2950 bfd_vma sym_value;
2951 bfd_vma destination;
2952 struct elf32_hppa_link_hash_entry *hh;
2953 char *stub_name;
2954 const asection *id_sec;
2956 r_type = ELF32_R_TYPE (irela->r_info);
2957 r_indx = ELF32_R_SYM (irela->r_info);
2959 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2961 bfd_set_error (bfd_error_bad_value);
2962 error_ret_free_internal:
2963 if (elf_section_data (section)->relocs == NULL)
2964 free (internal_relocs);
2965 goto error_ret_free_local;
2968 /* Only look for stubs on call instructions. */
2969 if (r_type != (unsigned int) R_PARISC_PCREL12F
2970 && r_type != (unsigned int) R_PARISC_PCREL17F
2971 && r_type != (unsigned int) R_PARISC_PCREL22F)
2972 continue;
2974 /* Now determine the call target, its name, value,
2975 section. */
2976 sym_sec = NULL;
2977 sym_value = 0;
2978 destination = 0;
2979 hh = NULL;
2980 if (r_indx < symtab_hdr->sh_info)
2982 /* It's a local symbol. */
2983 Elf_Internal_Sym *sym;
2984 Elf_Internal_Shdr *hdr;
2985 unsigned int shndx;
2987 sym = local_syms + r_indx;
2988 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2989 sym_value = sym->st_value;
2990 shndx = sym->st_shndx;
2991 if (shndx < elf_numsections (input_bfd))
2993 hdr = elf_elfsections (input_bfd)[shndx];
2994 sym_sec = hdr->bfd_section;
2995 destination = (sym_value + irela->r_addend
2996 + sym_sec->output_offset
2997 + sym_sec->output_section->vma);
3000 else
3002 /* It's an external symbol. */
3003 int e_indx;
3005 e_indx = r_indx - symtab_hdr->sh_info;
3006 hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
3008 while (hh->eh.root.type == bfd_link_hash_indirect
3009 || hh->eh.root.type == bfd_link_hash_warning)
3010 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
3012 if (hh->eh.root.type == bfd_link_hash_defined
3013 || hh->eh.root.type == bfd_link_hash_defweak)
3015 sym_sec = hh->eh.root.u.def.section;
3016 sym_value = hh->eh.root.u.def.value;
3017 if (sym_sec->output_section != NULL)
3018 destination = (sym_value + irela->r_addend
3019 + sym_sec->output_offset
3020 + sym_sec->output_section->vma);
3022 else if (hh->eh.root.type == bfd_link_hash_undefweak)
3024 if (! info->shared)
3025 continue;
3027 else if (hh->eh.root.type == bfd_link_hash_undefined)
3029 if (! (info->unresolved_syms_in_objects == RM_IGNORE
3030 && (ELF_ST_VISIBILITY (hh->eh.other)
3031 == STV_DEFAULT)
3032 && hh->eh.type != STT_PARISC_MILLI))
3033 continue;
3035 else
3037 bfd_set_error (bfd_error_bad_value);
3038 goto error_ret_free_internal;
3042 /* Determine what (if any) linker stub is needed. */
3043 stub_type = hppa_type_of_stub (section, irela, hh,
3044 destination, info);
3045 if (stub_type == hppa_stub_none)
3046 continue;
3048 /* Support for grouping stub sections. */
3049 id_sec = htab->stub_group[section->id].link_sec;
3051 /* Get the name of this stub. */
3052 stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
3053 if (!stub_name)
3054 goto error_ret_free_internal;
3056 hsh = hppa_stub_hash_lookup (&htab->bstab,
3057 stub_name,
3058 FALSE, FALSE);
3059 if (hsh != NULL)
3061 /* The proper stub has already been created. */
3062 free (stub_name);
3063 continue;
3066 hsh = hppa_add_stub (stub_name, section, htab);
3067 if (hsh == NULL)
3069 free (stub_name);
3070 goto error_ret_free_internal;
3073 hsh->target_value = sym_value;
3074 hsh->target_section = sym_sec;
3075 hsh->stub_type = stub_type;
3076 if (info->shared)
3078 if (stub_type == hppa_stub_import)
3079 hsh->stub_type = hppa_stub_import_shared;
3080 else if (stub_type == hppa_stub_long_branch)
3081 hsh->stub_type = hppa_stub_long_branch_shared;
3083 hsh->hh = hh;
3084 stub_changed = TRUE;
3087 /* We're done with the internal relocs, free them. */
3088 if (elf_section_data (section)->relocs == NULL)
3089 free (internal_relocs);
3093 if (!stub_changed)
3094 break;
3096 /* OK, we've added some stubs. Find out the new size of the
3097 stub sections. */
3098 for (stub_sec = htab->stub_bfd->sections;
3099 stub_sec != NULL;
3100 stub_sec = stub_sec->next)
3101 stub_sec->size = 0;
3103 bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
3105 /* Ask the linker to do its stuff. */
3106 (*htab->layout_sections_again) ();
3107 stub_changed = FALSE;
3110 free (htab->all_local_syms);
3111 return TRUE;
3113 error_ret_free_local:
3114 free (htab->all_local_syms);
3115 return FALSE;
3118 /* For a final link, this function is called after we have sized the
3119 stubs to provide a value for __gp. */
3121 bfd_boolean
3122 elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
3124 struct bfd_link_hash_entry *h;
3125 asection *sec = NULL;
3126 bfd_vma gp_val = 0;
3127 struct elf32_hppa_link_hash_table *htab;
3129 htab = hppa_link_hash_table (info);
3130 if (htab == NULL)
3131 return FALSE;
3133 h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3135 if (h != NULL
3136 && (h->type == bfd_link_hash_defined
3137 || h->type == bfd_link_hash_defweak))
3139 gp_val = h->u.def.value;
3140 sec = h->u.def.section;
3142 else
3144 asection *splt = bfd_get_section_by_name (abfd, ".plt");
3145 asection *sgot = bfd_get_section_by_name (abfd, ".got");
3147 /* Choose to point our LTP at, in this order, one of .plt, .got,
3148 or .data, if these sections exist. In the case of choosing
3149 .plt try to make the LTP ideal for addressing anywhere in the
3150 .plt or .got with a 14 bit signed offset. Typically, the end
3151 of the .plt is the start of the .got, so choose .plt + 0x2000
3152 if either the .plt or .got is larger than 0x2000. If both
3153 the .plt and .got are smaller than 0x2000, choose the end of
3154 the .plt section. */
3155 sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3156 ? NULL : splt;
3157 if (sec != NULL)
3159 gp_val = sec->size;
3160 if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3162 gp_val = 0x2000;
3165 else
3167 sec = sgot;
3168 if (sec != NULL)
3170 if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3172 /* We know we don't have a .plt. If .got is large,
3173 offset our LTP. */
3174 if (sec->size > 0x2000)
3175 gp_val = 0x2000;
3178 else
3180 /* No .plt or .got. Who cares what the LTP is? */
3181 sec = bfd_get_section_by_name (abfd, ".data");
3185 if (h != NULL)
3187 h->type = bfd_link_hash_defined;
3188 h->u.def.value = gp_val;
3189 if (sec != NULL)
3190 h->u.def.section = sec;
3191 else
3192 h->u.def.section = bfd_abs_section_ptr;
3196 if (sec != NULL && sec->output_section != NULL)
3197 gp_val += sec->output_section->vma + sec->output_offset;
3199 elf_gp (abfd) = gp_val;
3200 return TRUE;
3203 /* Build all the stubs associated with the current output file. The
3204 stubs are kept in a hash table attached to the main linker hash
3205 table. We also set up the .plt entries for statically linked PIC
3206 functions here. This function is called via hppaelf_finish in the
3207 linker. */
3209 bfd_boolean
3210 elf32_hppa_build_stubs (struct bfd_link_info *info)
3212 asection *stub_sec;
3213 struct bfd_hash_table *table;
3214 struct elf32_hppa_link_hash_table *htab;
3216 htab = hppa_link_hash_table (info);
3217 if (htab == NULL)
3218 return FALSE;
3220 for (stub_sec = htab->stub_bfd->sections;
3221 stub_sec != NULL;
3222 stub_sec = stub_sec->next)
3224 bfd_size_type size;
3226 /* Allocate memory to hold the linker stubs. */
3227 size = stub_sec->size;
3228 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3229 if (stub_sec->contents == NULL && size != 0)
3230 return FALSE;
3231 stub_sec->size = 0;
3234 /* Build the stubs as directed by the stub hash table. */
3235 table = &htab->bstab;
3236 bfd_hash_traverse (table, hppa_build_one_stub, info);
3238 return TRUE;
3241 /* Return the base vma address which should be subtracted from the real
3242 address when resolving a dtpoff relocation.
3243 This is PT_TLS segment p_vaddr. */
3245 static bfd_vma
3246 dtpoff_base (struct bfd_link_info *info)
3248 /* If tls_sec is NULL, we should have signalled an error already. */
3249 if (elf_hash_table (info)->tls_sec == NULL)
3250 return 0;
3251 return elf_hash_table (info)->tls_sec->vma;
3254 /* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3256 static bfd_vma
3257 tpoff (struct bfd_link_info *info, bfd_vma address)
3259 struct elf_link_hash_table *htab = elf_hash_table (info);
3261 /* If tls_sec is NULL, we should have signalled an error already. */
3262 if (htab->tls_sec == NULL)
3263 return 0;
3264 /* hppa TLS ABI is variant I and static TLS block start just after
3265 tcbhead structure which has 2 pointer fields. */
3266 return (address - htab->tls_sec->vma
3267 + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3270 /* Perform a final link. */
3272 static bfd_boolean
3273 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3275 /* Invoke the regular ELF linker to do all the work. */
3276 if (!bfd_elf_final_link (abfd, info))
3277 return FALSE;
3279 /* If we're producing a final executable, sort the contents of the
3280 unwind section. */
3281 if (info->relocatable)
3282 return TRUE;
3284 return elf_hppa_sort_unwind (abfd);
3287 /* Record the lowest address for the data and text segments. */
3289 static void
3290 hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3292 struct elf32_hppa_link_hash_table *htab;
3294 htab = (struct elf32_hppa_link_hash_table*) data;
3295 if (htab == NULL)
3296 return;
3298 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3300 bfd_vma value;
3301 Elf_Internal_Phdr *p;
3303 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3304 BFD_ASSERT (p != NULL);
3305 value = p->p_vaddr;
3307 if ((section->flags & SEC_READONLY) != 0)
3309 if (value < htab->text_segment_base)
3310 htab->text_segment_base = value;
3312 else
3314 if (value < htab->data_segment_base)
3315 htab->data_segment_base = value;
3320 /* Perform a relocation as part of a final link. */
3322 static bfd_reloc_status_type
3323 final_link_relocate (asection *input_section,
3324 bfd_byte *contents,
3325 const Elf_Internal_Rela *rela,
3326 bfd_vma value,
3327 struct elf32_hppa_link_hash_table *htab,
3328 asection *sym_sec,
3329 struct elf32_hppa_link_hash_entry *hh,
3330 struct bfd_link_info *info)
3332 int insn;
3333 unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3334 unsigned int orig_r_type = r_type;
3335 reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3336 int r_format = howto->bitsize;
3337 enum hppa_reloc_field_selector_type_alt r_field;
3338 bfd *input_bfd = input_section->owner;
3339 bfd_vma offset = rela->r_offset;
3340 bfd_vma max_branch_offset = 0;
3341 bfd_byte *hit_data = contents + offset;
3342 bfd_signed_vma addend = rela->r_addend;
3343 bfd_vma location;
3344 struct elf32_hppa_stub_hash_entry *hsh = NULL;
3345 int val;
3347 if (r_type == R_PARISC_NONE)
3348 return bfd_reloc_ok;
3350 insn = bfd_get_32 (input_bfd, hit_data);
3352 /* Find out where we are and where we're going. */
3353 location = (offset +
3354 input_section->output_offset +
3355 input_section->output_section->vma);
3357 /* If we are not building a shared library, convert DLTIND relocs to
3358 DPREL relocs. */
3359 if (!info->shared)
3361 switch (r_type)
3363 case R_PARISC_DLTIND21L:
3364 r_type = R_PARISC_DPREL21L;
3365 break;
3367 case R_PARISC_DLTIND14R:
3368 r_type = R_PARISC_DPREL14R;
3369 break;
3371 case R_PARISC_DLTIND14F:
3372 r_type = R_PARISC_DPREL14F;
3373 break;
3377 switch (r_type)
3379 case R_PARISC_PCREL12F:
3380 case R_PARISC_PCREL17F:
3381 case R_PARISC_PCREL22F:
3382 /* If this call should go via the plt, find the import stub in
3383 the stub hash. */
3384 if (sym_sec == NULL
3385 || sym_sec->output_section == NULL
3386 || (hh != NULL
3387 && hh->eh.plt.offset != (bfd_vma) -1
3388 && hh->eh.dynindx != -1
3389 && !hh->plabel
3390 && (info->shared
3391 || !hh->eh.def_regular
3392 || hh->eh.root.type == bfd_link_hash_defweak)))
3394 hsh = hppa_get_stub_entry (input_section, sym_sec,
3395 hh, rela, htab);
3396 if (hsh != NULL)
3398 value = (hsh->stub_offset
3399 + hsh->stub_sec->output_offset
3400 + hsh->stub_sec->output_section->vma);
3401 addend = 0;
3403 else if (sym_sec == NULL && hh != NULL
3404 && hh->eh.root.type == bfd_link_hash_undefweak)
3406 /* It's OK if undefined weak. Calls to undefined weak
3407 symbols behave as if the "called" function
3408 immediately returns. We can thus call to a weak
3409 function without first checking whether the function
3410 is defined. */
3411 value = location;
3412 addend = 8;
3414 else
3415 return bfd_reloc_undefined;
3417 /* Fall thru. */
3419 case R_PARISC_PCREL21L:
3420 case R_PARISC_PCREL17C:
3421 case R_PARISC_PCREL17R:
3422 case R_PARISC_PCREL14R:
3423 case R_PARISC_PCREL14F:
3424 case R_PARISC_PCREL32:
3425 /* Make it a pc relative offset. */
3426 value -= location;
3427 addend -= 8;
3428 break;
3430 case R_PARISC_DPREL21L:
3431 case R_PARISC_DPREL14R:
3432 case R_PARISC_DPREL14F:
3433 case R_PARISC_TLS_GD21L:
3434 case R_PARISC_TLS_LDM21L:
3435 case R_PARISC_TLS_IE21L:
3436 /* Convert instructions that use the linkage table pointer (r19) to
3437 instructions that use the global data pointer (dp). This is the
3438 most efficient way of using PIC code in an incomplete executable,
3439 but the user must follow the standard runtime conventions for
3440 accessing data for this to work. */
3441 if (orig_r_type == R_PARISC_DLTIND21L
3442 || (!info->shared
3443 && (r_type == R_PARISC_TLS_GD21L
3444 || r_type == R_PARISC_TLS_LDM21L
3445 || r_type == R_PARISC_TLS_IE21L)))
3447 /* Convert addil instructions if the original reloc was a
3448 DLTIND21L. GCC sometimes uses a register other than r19 for
3449 the operation, so we must convert any addil instruction
3450 that uses this relocation. */
3451 if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3452 insn = ADDIL_DP;
3453 else
3454 /* We must have a ldil instruction. It's too hard to find
3455 and convert the associated add instruction, so issue an
3456 error. */
3457 (*_bfd_error_handler)
3458 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3459 input_bfd,
3460 input_section,
3461 (long) offset,
3462 howto->name,
3463 insn);
3465 else if (orig_r_type == R_PARISC_DLTIND14F)
3467 /* This must be a format 1 load/store. Change the base
3468 register to dp. */
3469 insn = (insn & 0xfc1ffff) | (27 << 21);
3472 /* For all the DP relative relocations, we need to examine the symbol's
3473 section. If it has no section or if it's a code section, then
3474 "data pointer relative" makes no sense. In that case we don't
3475 adjust the "value", and for 21 bit addil instructions, we change the
3476 source addend register from %dp to %r0. This situation commonly
3477 arises for undefined weak symbols and when a variable's "constness"
3478 is declared differently from the way the variable is defined. For
3479 instance: "extern int foo" with foo defined as "const int foo". */
3480 if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3482 if ((insn & ((0x3f << 26) | (0x1f << 21)))
3483 == (((int) OP_ADDIL << 26) | (27 << 21)))
3485 insn &= ~ (0x1f << 21);
3487 /* Now try to make things easy for the dynamic linker. */
3489 break;
3491 /* Fall thru. */
3493 case R_PARISC_DLTIND21L:
3494 case R_PARISC_DLTIND14R:
3495 case R_PARISC_DLTIND14F:
3496 case R_PARISC_TLS_GD14R:
3497 case R_PARISC_TLS_LDM14R:
3498 case R_PARISC_TLS_IE14R:
3499 value -= elf_gp (input_section->output_section->owner);
3500 break;
3502 case R_PARISC_SEGREL32:
3503 if ((sym_sec->flags & SEC_CODE) != 0)
3504 value -= htab->text_segment_base;
3505 else
3506 value -= htab->data_segment_base;
3507 break;
3509 default:
3510 break;
3513 switch (r_type)
3515 case R_PARISC_DIR32:
3516 case R_PARISC_DIR14F:
3517 case R_PARISC_DIR17F:
3518 case R_PARISC_PCREL17C:
3519 case R_PARISC_PCREL14F:
3520 case R_PARISC_PCREL32:
3521 case R_PARISC_DPREL14F:
3522 case R_PARISC_PLABEL32:
3523 case R_PARISC_DLTIND14F:
3524 case R_PARISC_SEGBASE:
3525 case R_PARISC_SEGREL32:
3526 case R_PARISC_TLS_DTPMOD32:
3527 case R_PARISC_TLS_DTPOFF32:
3528 case R_PARISC_TLS_TPREL32:
3529 r_field = e_fsel;
3530 break;
3532 case R_PARISC_DLTIND21L:
3533 case R_PARISC_PCREL21L:
3534 case R_PARISC_PLABEL21L:
3535 r_field = e_lsel;
3536 break;
3538 case R_PARISC_DIR21L:
3539 case R_PARISC_DPREL21L:
3540 case R_PARISC_TLS_GD21L:
3541 case R_PARISC_TLS_LDM21L:
3542 case R_PARISC_TLS_LDO21L:
3543 case R_PARISC_TLS_IE21L:
3544 case R_PARISC_TLS_LE21L:
3545 r_field = e_lrsel;
3546 break;
3548 case R_PARISC_PCREL17R:
3549 case R_PARISC_PCREL14R:
3550 case R_PARISC_PLABEL14R:
3551 case R_PARISC_DLTIND14R:
3552 r_field = e_rsel;
3553 break;
3555 case R_PARISC_DIR17R:
3556 case R_PARISC_DIR14R:
3557 case R_PARISC_DPREL14R:
3558 case R_PARISC_TLS_GD14R:
3559 case R_PARISC_TLS_LDM14R:
3560 case R_PARISC_TLS_LDO14R:
3561 case R_PARISC_TLS_IE14R:
3562 case R_PARISC_TLS_LE14R:
3563 r_field = e_rrsel;
3564 break;
3566 case R_PARISC_PCREL12F:
3567 case R_PARISC_PCREL17F:
3568 case R_PARISC_PCREL22F:
3569 r_field = e_fsel;
3571 if (r_type == (unsigned int) R_PARISC_PCREL17F)
3573 max_branch_offset = (1 << (17-1)) << 2;
3575 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3577 max_branch_offset = (1 << (12-1)) << 2;
3579 else
3581 max_branch_offset = (1 << (22-1)) << 2;
3584 /* sym_sec is NULL on undefined weak syms or when shared on
3585 undefined syms. We've already checked for a stub for the
3586 shared undefined case. */
3587 if (sym_sec == NULL)
3588 break;
3590 /* If the branch is out of reach, then redirect the
3591 call to the local stub for this function. */
3592 if (value + addend + max_branch_offset >= 2*max_branch_offset)
3594 hsh = hppa_get_stub_entry (input_section, sym_sec,
3595 hh, rela, htab);
3596 if (hsh == NULL)
3597 return bfd_reloc_undefined;
3599 /* Munge up the value and addend so that we call the stub
3600 rather than the procedure directly. */
3601 value = (hsh->stub_offset
3602 + hsh->stub_sec->output_offset
3603 + hsh->stub_sec->output_section->vma
3604 - location);
3605 addend = -8;
3607 break;
3609 /* Something we don't know how to handle. */
3610 default:
3611 return bfd_reloc_notsupported;
3614 /* Make sure we can reach the stub. */
3615 if (max_branch_offset != 0
3616 && value + addend + max_branch_offset >= 2*max_branch_offset)
3618 (*_bfd_error_handler)
3619 (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3620 input_bfd,
3621 input_section,
3622 (long) offset,
3623 hsh->bh_root.string);
3624 bfd_set_error (bfd_error_bad_value);
3625 return bfd_reloc_notsupported;
3628 val = hppa_field_adjust (value, addend, r_field);
3630 switch (r_type)
3632 case R_PARISC_PCREL12F:
3633 case R_PARISC_PCREL17C:
3634 case R_PARISC_PCREL17F:
3635 case R_PARISC_PCREL17R:
3636 case R_PARISC_PCREL22F:
3637 case R_PARISC_DIR17F:
3638 case R_PARISC_DIR17R:
3639 /* This is a branch. Divide the offset by four.
3640 Note that we need to decide whether it's a branch or
3641 otherwise by inspecting the reloc. Inspecting insn won't
3642 work as insn might be from a .word directive. */
3643 val >>= 2;
3644 break;
3646 default:
3647 break;
3650 insn = hppa_rebuild_insn (insn, val, r_format);
3652 /* Update the instruction word. */
3653 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3654 return bfd_reloc_ok;
3657 /* Relocate an HPPA ELF section. */
3659 static bfd_boolean
3660 elf32_hppa_relocate_section (bfd *output_bfd,
3661 struct bfd_link_info *info,
3662 bfd *input_bfd,
3663 asection *input_section,
3664 bfd_byte *contents,
3665 Elf_Internal_Rela *relocs,
3666 Elf_Internal_Sym *local_syms,
3667 asection **local_sections)
3669 bfd_vma *local_got_offsets;
3670 struct elf32_hppa_link_hash_table *htab;
3671 Elf_Internal_Shdr *symtab_hdr;
3672 Elf_Internal_Rela *rela;
3673 Elf_Internal_Rela *relend;
3675 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3677 htab = hppa_link_hash_table (info);
3678 if (htab == NULL)
3679 return FALSE;
3681 local_got_offsets = elf_local_got_offsets (input_bfd);
3683 rela = relocs;
3684 relend = relocs + input_section->reloc_count;
3685 for (; rela < relend; rela++)
3687 unsigned int r_type;
3688 reloc_howto_type *howto;
3689 unsigned int r_symndx;
3690 struct elf32_hppa_link_hash_entry *hh;
3691 Elf_Internal_Sym *sym;
3692 asection *sym_sec;
3693 bfd_vma relocation;
3694 bfd_reloc_status_type rstatus;
3695 const char *sym_name;
3696 bfd_boolean plabel;
3697 bfd_boolean warned_undef;
3699 r_type = ELF32_R_TYPE (rela->r_info);
3700 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3702 bfd_set_error (bfd_error_bad_value);
3703 return FALSE;
3705 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3706 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3707 continue;
3709 r_symndx = ELF32_R_SYM (rela->r_info);
3710 hh = NULL;
3711 sym = NULL;
3712 sym_sec = NULL;
3713 warned_undef = FALSE;
3714 if (r_symndx < symtab_hdr->sh_info)
3716 /* This is a local symbol, h defaults to NULL. */
3717 sym = local_syms + r_symndx;
3718 sym_sec = local_sections[r_symndx];
3719 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3721 else
3723 struct elf_link_hash_entry *eh;
3724 bfd_boolean unresolved_reloc;
3725 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3727 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3728 r_symndx, symtab_hdr, sym_hashes,
3729 eh, sym_sec, relocation,
3730 unresolved_reloc, warned_undef);
3732 if (!info->relocatable
3733 && relocation == 0
3734 && eh->root.type != bfd_link_hash_defined
3735 && eh->root.type != bfd_link_hash_defweak
3736 && eh->root.type != bfd_link_hash_undefweak)
3738 if (info->unresolved_syms_in_objects == RM_IGNORE
3739 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3740 && eh->type == STT_PARISC_MILLI)
3742 if (! info->callbacks->undefined_symbol
3743 (info, eh_name (eh), input_bfd,
3744 input_section, rela->r_offset, FALSE))
3745 return FALSE;
3746 warned_undef = TRUE;
3749 hh = hppa_elf_hash_entry (eh);
3752 if (sym_sec != NULL && elf_discarded_section (sym_sec))
3754 /* For relocs against symbols from removed linkonce
3755 sections, or sections discarded by a linker script,
3756 we just want the section contents zeroed. Avoid any
3757 special processing. */
3758 _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
3759 contents + rela->r_offset);
3760 rela->r_info = 0;
3761 rela->r_addend = 0;
3762 continue;
3765 if (info->relocatable)
3766 continue;
3768 /* Do any required modifications to the relocation value, and
3769 determine what types of dynamic info we need to output, if
3770 any. */
3771 plabel = 0;
3772 switch (r_type)
3774 case R_PARISC_DLTIND14F:
3775 case R_PARISC_DLTIND14R:
3776 case R_PARISC_DLTIND21L:
3778 bfd_vma off;
3779 bfd_boolean do_got = 0;
3781 /* Relocation is to the entry for this symbol in the
3782 global offset table. */
3783 if (hh != NULL)
3785 bfd_boolean dyn;
3787 off = hh->eh.got.offset;
3788 dyn = htab->etab.dynamic_sections_created;
3789 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3790 &hh->eh))
3792 /* If we aren't going to call finish_dynamic_symbol,
3793 then we need to handle initialisation of the .got
3794 entry and create needed relocs here. Since the
3795 offset must always be a multiple of 4, we use the
3796 least significant bit to record whether we have
3797 initialised it already. */
3798 if ((off & 1) != 0)
3799 off &= ~1;
3800 else
3802 hh->eh.got.offset |= 1;
3803 do_got = 1;
3807 else
3809 /* Local symbol case. */
3810 if (local_got_offsets == NULL)
3811 abort ();
3813 off = local_got_offsets[r_symndx];
3815 /* The offset must always be a multiple of 4. We use
3816 the least significant bit to record whether we have
3817 already generated the necessary reloc. */
3818 if ((off & 1) != 0)
3819 off &= ~1;
3820 else
3822 local_got_offsets[r_symndx] |= 1;
3823 do_got = 1;
3827 if (do_got)
3829 if (info->shared)
3831 /* Output a dynamic relocation for this GOT entry.
3832 In this case it is relative to the base of the
3833 object because the symbol index is zero. */
3834 Elf_Internal_Rela outrel;
3835 bfd_byte *loc;
3836 asection *sec = htab->srelgot;
3838 outrel.r_offset = (off
3839 + htab->sgot->output_offset
3840 + htab->sgot->output_section->vma);
3841 outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3842 outrel.r_addend = relocation;
3843 loc = sec->contents;
3844 loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3845 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3847 else
3848 bfd_put_32 (output_bfd, relocation,
3849 htab->sgot->contents + off);
3852 if (off >= (bfd_vma) -2)
3853 abort ();
3855 /* Add the base of the GOT to the relocation value. */
3856 relocation = (off
3857 + htab->sgot->output_offset
3858 + htab->sgot->output_section->vma);
3860 break;
3862 case R_PARISC_SEGREL32:
3863 /* If this is the first SEGREL relocation, then initialize
3864 the segment base values. */
3865 if (htab->text_segment_base == (bfd_vma) -1)
3866 bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3867 break;
3869 case R_PARISC_PLABEL14R:
3870 case R_PARISC_PLABEL21L:
3871 case R_PARISC_PLABEL32:
3872 if (htab->etab.dynamic_sections_created)
3874 bfd_vma off;
3875 bfd_boolean do_plt = 0;
3876 /* If we have a global symbol with a PLT slot, then
3877 redirect this relocation to it. */
3878 if (hh != NULL)
3880 off = hh->eh.plt.offset;
3881 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3882 &hh->eh))
3884 /* In a non-shared link, adjust_dynamic_symbols
3885 isn't called for symbols forced local. We
3886 need to write out the plt entry here. */
3887 if ((off & 1) != 0)
3888 off &= ~1;
3889 else
3891 hh->eh.plt.offset |= 1;
3892 do_plt = 1;
3896 else
3898 bfd_vma *local_plt_offsets;
3900 if (local_got_offsets == NULL)
3901 abort ();
3903 local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3904 off = local_plt_offsets[r_symndx];
3906 /* As for the local .got entry case, we use the last
3907 bit to record whether we've already initialised
3908 this local .plt entry. */
3909 if ((off & 1) != 0)
3910 off &= ~1;
3911 else
3913 local_plt_offsets[r_symndx] |= 1;
3914 do_plt = 1;
3918 if (do_plt)
3920 if (info->shared)
3922 /* Output a dynamic IPLT relocation for this
3923 PLT entry. */
3924 Elf_Internal_Rela outrel;
3925 bfd_byte *loc;
3926 asection *s = htab->srelplt;
3928 outrel.r_offset = (off
3929 + htab->splt->output_offset
3930 + htab->splt->output_section->vma);
3931 outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3932 outrel.r_addend = relocation;
3933 loc = s->contents;
3934 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3935 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3937 else
3939 bfd_put_32 (output_bfd,
3940 relocation,
3941 htab->splt->contents + off);
3942 bfd_put_32 (output_bfd,
3943 elf_gp (htab->splt->output_section->owner),
3944 htab->splt->contents + off + 4);
3948 if (off >= (bfd_vma) -2)
3949 abort ();
3951 /* PLABELs contain function pointers. Relocation is to
3952 the entry for the function in the .plt. The magic +2
3953 offset signals to $$dyncall that the function pointer
3954 is in the .plt and thus has a gp pointer too.
3955 Exception: Undefined PLABELs should have a value of
3956 zero. */
3957 if (hh == NULL
3958 || (hh->eh.root.type != bfd_link_hash_undefweak
3959 && hh->eh.root.type != bfd_link_hash_undefined))
3961 relocation = (off
3962 + htab->splt->output_offset
3963 + htab->splt->output_section->vma
3964 + 2);
3966 plabel = 1;
3968 /* Fall through and possibly emit a dynamic relocation. */
3970 case R_PARISC_DIR17F:
3971 case R_PARISC_DIR17R:
3972 case R_PARISC_DIR14F:
3973 case R_PARISC_DIR14R:
3974 case R_PARISC_DIR21L:
3975 case R_PARISC_DPREL14F:
3976 case R_PARISC_DPREL14R:
3977 case R_PARISC_DPREL21L:
3978 case R_PARISC_DIR32:
3979 if ((input_section->flags & SEC_ALLOC) == 0)
3980 break;
3982 /* The reloc types handled here and this conditional
3983 expression must match the code in ..check_relocs and
3984 allocate_dynrelocs. ie. We need exactly the same condition
3985 as in ..check_relocs, with some extra conditions (dynindx
3986 test in this case) to cater for relocs removed by
3987 allocate_dynrelocs. If you squint, the non-shared test
3988 here does indeed match the one in ..check_relocs, the
3989 difference being that here we test DEF_DYNAMIC as well as
3990 !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3991 which is why we can't use just that test here.
3992 Conversely, DEF_DYNAMIC can't be used in check_relocs as
3993 there all files have not been loaded. */
3994 if ((info->shared
3995 && (hh == NULL
3996 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3997 || hh->eh.root.type != bfd_link_hash_undefweak)
3998 && (IS_ABSOLUTE_RELOC (r_type)
3999 || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
4000 || (!info->shared
4001 && hh != NULL
4002 && hh->eh.dynindx != -1
4003 && !hh->eh.non_got_ref
4004 && ((ELIMINATE_COPY_RELOCS
4005 && hh->eh.def_dynamic
4006 && !hh->eh.def_regular)
4007 || hh->eh.root.type == bfd_link_hash_undefweak
4008 || hh->eh.root.type == bfd_link_hash_undefined)))
4010 Elf_Internal_Rela outrel;
4011 bfd_boolean skip;
4012 asection *sreloc;
4013 bfd_byte *loc;
4015 /* When generating a shared object, these relocations
4016 are copied into the output file to be resolved at run
4017 time. */
4019 outrel.r_addend = rela->r_addend;
4020 outrel.r_offset =
4021 _bfd_elf_section_offset (output_bfd, info, input_section,
4022 rela->r_offset);
4023 skip = (outrel.r_offset == (bfd_vma) -1
4024 || outrel.r_offset == (bfd_vma) -2);
4025 outrel.r_offset += (input_section->output_offset
4026 + input_section->output_section->vma);
4028 if (skip)
4030 memset (&outrel, 0, sizeof (outrel));
4032 else if (hh != NULL
4033 && hh->eh.dynindx != -1
4034 && (plabel
4035 || !IS_ABSOLUTE_RELOC (r_type)
4036 || !info->shared
4037 || !info->symbolic
4038 || !hh->eh.def_regular))
4040 outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4042 else /* It's a local symbol, or one marked to become local. */
4044 int indx = 0;
4046 /* Add the absolute offset of the symbol. */
4047 outrel.r_addend += relocation;
4049 /* Global plabels need to be processed by the
4050 dynamic linker so that functions have at most one
4051 fptr. For this reason, we need to differentiate
4052 between global and local plabels, which we do by
4053 providing the function symbol for a global plabel
4054 reloc, and no symbol for local plabels. */
4055 if (! plabel
4056 && sym_sec != NULL
4057 && sym_sec->output_section != NULL
4058 && ! bfd_is_abs_section (sym_sec))
4060 asection *osec;
4062 osec = sym_sec->output_section;
4063 indx = elf_section_data (osec)->dynindx;
4064 if (indx == 0)
4066 osec = htab->etab.text_index_section;
4067 indx = elf_section_data (osec)->dynindx;
4069 BFD_ASSERT (indx != 0);
4071 /* We are turning this relocation into one
4072 against a section symbol, so subtract out the
4073 output section's address but not the offset
4074 of the input section in the output section. */
4075 outrel.r_addend -= osec->vma;
4078 outrel.r_info = ELF32_R_INFO (indx, r_type);
4080 sreloc = elf_section_data (input_section)->sreloc;
4081 if (sreloc == NULL)
4082 abort ();
4084 loc = sreloc->contents;
4085 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4086 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4088 break;
4090 case R_PARISC_TLS_LDM21L:
4091 case R_PARISC_TLS_LDM14R:
4093 bfd_vma off;
4095 off = htab->tls_ldm_got.offset;
4096 if (off & 1)
4097 off &= ~1;
4098 else
4100 Elf_Internal_Rela outrel;
4101 bfd_byte *loc;
4103 outrel.r_offset = (off
4104 + htab->sgot->output_section->vma
4105 + htab->sgot->output_offset);
4106 outrel.r_addend = 0;
4107 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4108 loc = htab->srelgot->contents;
4109 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4111 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4112 htab->tls_ldm_got.offset |= 1;
4115 /* Add the base of the GOT to the relocation value. */
4116 relocation = (off
4117 + htab->sgot->output_offset
4118 + htab->sgot->output_section->vma);
4120 break;
4123 case R_PARISC_TLS_LDO21L:
4124 case R_PARISC_TLS_LDO14R:
4125 relocation -= dtpoff_base (info);
4126 break;
4128 case R_PARISC_TLS_GD21L:
4129 case R_PARISC_TLS_GD14R:
4130 case R_PARISC_TLS_IE21L:
4131 case R_PARISC_TLS_IE14R:
4133 bfd_vma off;
4134 int indx;
4135 char tls_type;
4137 indx = 0;
4138 if (hh != NULL)
4140 bfd_boolean dyn;
4141 dyn = htab->etab.dynamic_sections_created;
4143 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4144 && (!info->shared
4145 || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4147 indx = hh->eh.dynindx;
4149 off = hh->eh.got.offset;
4150 tls_type = hh->tls_type;
4152 else
4154 off = local_got_offsets[r_symndx];
4155 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4158 if (tls_type == GOT_UNKNOWN)
4159 abort ();
4161 if ((off & 1) != 0)
4162 off &= ~1;
4163 else
4165 bfd_boolean need_relocs = FALSE;
4166 Elf_Internal_Rela outrel;
4167 bfd_byte *loc = NULL;
4168 int cur_off = off;
4170 /* The GOT entries have not been initialized yet. Do it
4171 now, and emit any relocations. If both an IE GOT and a
4172 GD GOT are necessary, we emit the GD first. */
4174 if ((info->shared || indx != 0)
4175 && (hh == NULL
4176 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4177 || hh->eh.root.type != bfd_link_hash_undefweak))
4179 need_relocs = TRUE;
4180 loc = htab->srelgot->contents;
4181 /* FIXME (CAO): Should this be reloc_count++ ? */
4182 loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4185 if (tls_type & GOT_TLS_GD)
4187 if (need_relocs)
4189 outrel.r_offset = (cur_off
4190 + htab->sgot->output_section->vma
4191 + htab->sgot->output_offset);
4192 outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4193 outrel.r_addend = 0;
4194 bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4195 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4196 htab->srelgot->reloc_count++;
4197 loc += sizeof (Elf32_External_Rela);
4199 if (indx == 0)
4200 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4201 htab->sgot->contents + cur_off + 4);
4202 else
4204 bfd_put_32 (output_bfd, 0,
4205 htab->sgot->contents + cur_off + 4);
4206 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4207 outrel.r_offset += 4;
4208 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4209 htab->srelgot->reloc_count++;
4210 loc += sizeof (Elf32_External_Rela);
4213 else
4215 /* If we are not emitting relocations for a
4216 general dynamic reference, then we must be in a
4217 static link or an executable link with the
4218 symbol binding locally. Mark it as belonging
4219 to module 1, the executable. */
4220 bfd_put_32 (output_bfd, 1,
4221 htab->sgot->contents + cur_off);
4222 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4223 htab->sgot->contents + cur_off + 4);
4227 cur_off += 8;
4230 if (tls_type & GOT_TLS_IE)
4232 if (need_relocs)
4234 outrel.r_offset = (cur_off
4235 + htab->sgot->output_section->vma
4236 + htab->sgot->output_offset);
4237 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4239 if (indx == 0)
4240 outrel.r_addend = relocation - dtpoff_base (info);
4241 else
4242 outrel.r_addend = 0;
4244 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4245 htab->srelgot->reloc_count++;
4246 loc += sizeof (Elf32_External_Rela);
4248 else
4249 bfd_put_32 (output_bfd, tpoff (info, relocation),
4250 htab->sgot->contents + cur_off);
4252 cur_off += 4;
4255 if (hh != NULL)
4256 hh->eh.got.offset |= 1;
4257 else
4258 local_got_offsets[r_symndx] |= 1;
4261 if ((tls_type & GOT_TLS_GD)
4262 && r_type != R_PARISC_TLS_GD21L
4263 && r_type != R_PARISC_TLS_GD14R)
4264 off += 2 * GOT_ENTRY_SIZE;
4266 /* Add the base of the GOT to the relocation value. */
4267 relocation = (off
4268 + htab->sgot->output_offset
4269 + htab->sgot->output_section->vma);
4271 break;
4274 case R_PARISC_TLS_LE21L:
4275 case R_PARISC_TLS_LE14R:
4277 relocation = tpoff (info, relocation);
4278 break;
4280 break;
4282 default:
4283 break;
4286 rstatus = final_link_relocate (input_section, contents, rela, relocation,
4287 htab, sym_sec, hh, info);
4289 if (rstatus == bfd_reloc_ok)
4290 continue;
4292 if (hh != NULL)
4293 sym_name = hh_name (hh);
4294 else
4296 sym_name = bfd_elf_string_from_elf_section (input_bfd,
4297 symtab_hdr->sh_link,
4298 sym->st_name);
4299 if (sym_name == NULL)
4300 return FALSE;
4301 if (*sym_name == '\0')
4302 sym_name = bfd_section_name (input_bfd, sym_sec);
4305 howto = elf_hppa_howto_table + r_type;
4307 if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4309 if (rstatus == bfd_reloc_notsupported || !warned_undef)
4311 (*_bfd_error_handler)
4312 (_("%B(%A+0x%lx): cannot handle %s for %s"),
4313 input_bfd,
4314 input_section,
4315 (long) rela->r_offset,
4316 howto->name,
4317 sym_name);
4318 bfd_set_error (bfd_error_bad_value);
4319 return FALSE;
4322 else
4324 if (!((*info->callbacks->reloc_overflow)
4325 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4326 (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4327 return FALSE;
4331 return TRUE;
4334 /* Finish up dynamic symbol handling. We set the contents of various
4335 dynamic sections here. */
4337 static bfd_boolean
4338 elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4339 struct bfd_link_info *info,
4340 struct elf_link_hash_entry *eh,
4341 Elf_Internal_Sym *sym)
4343 struct elf32_hppa_link_hash_table *htab;
4344 Elf_Internal_Rela rela;
4345 bfd_byte *loc;
4347 htab = hppa_link_hash_table (info);
4348 if (htab == NULL)
4349 return FALSE;
4351 if (eh->plt.offset != (bfd_vma) -1)
4353 bfd_vma value;
4355 if (eh->plt.offset & 1)
4356 abort ();
4358 /* This symbol has an entry in the procedure linkage table. Set
4359 it up.
4361 The format of a plt entry is
4362 <funcaddr>
4363 <__gp>
4365 value = 0;
4366 if (eh->root.type == bfd_link_hash_defined
4367 || eh->root.type == bfd_link_hash_defweak)
4369 value = eh->root.u.def.value;
4370 if (eh->root.u.def.section->output_section != NULL)
4371 value += (eh->root.u.def.section->output_offset
4372 + eh->root.u.def.section->output_section->vma);
4375 /* Create a dynamic IPLT relocation for this entry. */
4376 rela.r_offset = (eh->plt.offset
4377 + htab->splt->output_offset
4378 + htab->splt->output_section->vma);
4379 if (eh->dynindx != -1)
4381 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4382 rela.r_addend = 0;
4384 else
4386 /* This symbol has been marked to become local, and is
4387 used by a plabel so must be kept in the .plt. */
4388 rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4389 rela.r_addend = value;
4392 loc = htab->srelplt->contents;
4393 loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4394 bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4396 if (!eh->def_regular)
4398 /* Mark the symbol as undefined, rather than as defined in
4399 the .plt section. Leave the value alone. */
4400 sym->st_shndx = SHN_UNDEF;
4404 if (eh->got.offset != (bfd_vma) -1
4405 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4406 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4408 /* This symbol has an entry in the global offset table. Set it
4409 up. */
4411 rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4412 + htab->sgot->output_offset
4413 + htab->sgot->output_section->vma);
4415 /* If this is a -Bsymbolic link and the symbol is defined
4416 locally or was forced to be local because of a version file,
4417 we just want to emit a RELATIVE reloc. The entry in the
4418 global offset table will already have been initialized in the
4419 relocate_section function. */
4420 if (info->shared
4421 && (info->symbolic || eh->dynindx == -1)
4422 && eh->def_regular)
4424 rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4425 rela.r_addend = (eh->root.u.def.value
4426 + eh->root.u.def.section->output_offset
4427 + eh->root.u.def.section->output_section->vma);
4429 else
4431 if ((eh->got.offset & 1) != 0)
4432 abort ();
4434 bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4435 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4436 rela.r_addend = 0;
4439 loc = htab->srelgot->contents;
4440 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4441 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4444 if (eh->needs_copy)
4446 asection *sec;
4448 /* This symbol needs a copy reloc. Set it up. */
4450 if (! (eh->dynindx != -1
4451 && (eh->root.type == bfd_link_hash_defined
4452 || eh->root.type == bfd_link_hash_defweak)))
4453 abort ();
4455 sec = htab->srelbss;
4457 rela.r_offset = (eh->root.u.def.value
4458 + eh->root.u.def.section->output_offset
4459 + eh->root.u.def.section->output_section->vma);
4460 rela.r_addend = 0;
4461 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4462 loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4463 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4466 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4467 if (eh_name (eh)[0] == '_'
4468 && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4469 || eh == htab->etab.hgot))
4471 sym->st_shndx = SHN_ABS;
4474 return TRUE;
4477 /* Used to decide how to sort relocs in an optimal manner for the
4478 dynamic linker, before writing them out. */
4480 static enum elf_reloc_type_class
4481 elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4483 /* Handle TLS relocs first; we don't want them to be marked
4484 relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4485 check below. */
4486 switch ((int) ELF32_R_TYPE (rela->r_info))
4488 case R_PARISC_TLS_DTPMOD32:
4489 case R_PARISC_TLS_DTPOFF32:
4490 case R_PARISC_TLS_TPREL32:
4491 return reloc_class_normal;
4494 if (ELF32_R_SYM (rela->r_info) == 0)
4495 return reloc_class_relative;
4497 switch ((int) ELF32_R_TYPE (rela->r_info))
4499 case R_PARISC_IPLT:
4500 return reloc_class_plt;
4501 case R_PARISC_COPY:
4502 return reloc_class_copy;
4503 default:
4504 return reloc_class_normal;
4508 /* Finish up the dynamic sections. */
4510 static bfd_boolean
4511 elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4512 struct bfd_link_info *info)
4514 bfd *dynobj;
4515 struct elf32_hppa_link_hash_table *htab;
4516 asection *sdyn;
4518 htab = hppa_link_hash_table (info);
4519 if (htab == NULL)
4520 return FALSE;
4522 dynobj = htab->etab.dynobj;
4524 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4526 if (htab->etab.dynamic_sections_created)
4528 Elf32_External_Dyn *dyncon, *dynconend;
4530 if (sdyn == NULL)
4531 abort ();
4533 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4534 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4535 for (; dyncon < dynconend; dyncon++)
4537 Elf_Internal_Dyn dyn;
4538 asection *s;
4540 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4542 switch (dyn.d_tag)
4544 default:
4545 continue;
4547 case DT_PLTGOT:
4548 /* Use PLTGOT to set the GOT register. */
4549 dyn.d_un.d_ptr = elf_gp (output_bfd);
4550 break;
4552 case DT_JMPREL:
4553 s = htab->srelplt;
4554 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4555 break;
4557 case DT_PLTRELSZ:
4558 s = htab->srelplt;
4559 dyn.d_un.d_val = s->size;
4560 break;
4562 case DT_RELASZ:
4563 /* Don't count procedure linkage table relocs in the
4564 overall reloc count. */
4565 s = htab->srelplt;
4566 if (s == NULL)
4567 continue;
4568 dyn.d_un.d_val -= s->size;
4569 break;
4571 case DT_RELA:
4572 /* We may not be using the standard ELF linker script.
4573 If .rela.plt is the first .rela section, we adjust
4574 DT_RELA to not include it. */
4575 s = htab->srelplt;
4576 if (s == NULL)
4577 continue;
4578 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4579 continue;
4580 dyn.d_un.d_ptr += s->size;
4581 break;
4584 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4588 if (htab->sgot != NULL && htab->sgot->size != 0)
4590 /* Fill in the first entry in the global offset table.
4591 We use it to point to our dynamic section, if we have one. */
4592 bfd_put_32 (output_bfd,
4593 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4594 htab->sgot->contents);
4596 /* The second entry is reserved for use by the dynamic linker. */
4597 memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4599 /* Set .got entry size. */
4600 elf_section_data (htab->sgot->output_section)
4601 ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4604 if (htab->splt != NULL && htab->splt->size != 0)
4606 /* Set plt entry size. */
4607 elf_section_data (htab->splt->output_section)
4608 ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4610 if (htab->need_plt_stub)
4612 /* Set up the .plt stub. */
4613 memcpy (htab->splt->contents
4614 + htab->splt->size - sizeof (plt_stub),
4615 plt_stub, sizeof (plt_stub));
4617 if ((htab->splt->output_offset
4618 + htab->splt->output_section->vma
4619 + htab->splt->size)
4620 != (htab->sgot->output_offset
4621 + htab->sgot->output_section->vma))
4623 (*_bfd_error_handler)
4624 (_(".got section not immediately after .plt section"));
4625 return FALSE;
4630 return TRUE;
4633 /* Called when writing out an object file to decide the type of a
4634 symbol. */
4635 static int
4636 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4638 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4639 return STT_PARISC_MILLI;
4640 else
4641 return type;
4644 /* Misc BFD support code. */
4645 #define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4646 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4647 #define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4648 #define elf_info_to_howto elf_hppa_info_to_howto
4649 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4651 /* Stuff for the BFD linker. */
4652 #define bfd_elf32_mkobject elf32_hppa_mkobject
4653 #define bfd_elf32_bfd_final_link elf32_hppa_final_link
4654 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4655 #define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
4656 #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
4657 #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
4658 #define elf_backend_check_relocs elf32_hppa_check_relocs
4659 #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4660 #define elf_backend_fake_sections elf_hppa_fake_sections
4661 #define elf_backend_relocate_section elf32_hppa_relocate_section
4662 #define elf_backend_hide_symbol elf32_hppa_hide_symbol
4663 #define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4664 #define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4665 #define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
4666 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4667 #define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4668 #define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
4669 #define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4670 #define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
4671 #define elf_backend_object_p elf32_hppa_object_p
4672 #define elf_backend_final_write_processing elf_hppa_final_write_processing
4673 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4674 #define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
4675 #define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
4676 #define elf_backend_action_discarded elf_hppa_action_discarded
4678 #define elf_backend_can_gc_sections 1
4679 #define elf_backend_can_refcount 1
4680 #define elf_backend_plt_alignment 2
4681 #define elf_backend_want_got_plt 0
4682 #define elf_backend_plt_readonly 0
4683 #define elf_backend_want_plt_sym 0
4684 #define elf_backend_got_header_size 8
4685 #define elf_backend_rela_normal 1
4687 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
4688 #define TARGET_BIG_NAME "elf32-hppa"
4689 #define ELF_ARCH bfd_arch_hppa
4690 #define ELF_MACHINE_CODE EM_PARISC
4691 #define ELF_MAXPAGESIZE 0x1000
4692 #define ELF_OSABI ELFOSABI_HPUX
4693 #define elf32_bed elf32_hppa_hpux_bed
4695 #include "elf32-target.h"
4697 #undef TARGET_BIG_SYM
4698 #define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
4699 #undef TARGET_BIG_NAME
4700 #define TARGET_BIG_NAME "elf32-hppa-linux"
4701 #undef ELF_OSABI
4702 #define ELF_OSABI ELFOSABI_LINUX
4703 #undef elf32_bed
4704 #define elf32_bed elf32_hppa_linux_bed
4706 #include "elf32-target.h"
4708 #undef TARGET_BIG_SYM
4709 #define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec
4710 #undef TARGET_BIG_NAME
4711 #define TARGET_BIG_NAME "elf32-hppa-netbsd"
4712 #undef ELF_OSABI
4713 #define ELF_OSABI ELFOSABI_NETBSD
4714 #undef elf32_bed
4715 #define elf32_bed elf32_hppa_netbsd_bed
4717 #include "elf32-target.h"