* read.c (cons_worker): Detect and reject unexpected string argument.
[binutils/dougsmingw.git] / bfd / elf32-hppa.c
blob5142d3cf21c84a8c74ddf4d5583ab5ceeb1f568c
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 asection *stubreloc;
1164 int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
1166 if (info->relocatable)
1167 return TRUE;
1169 htab = hppa_link_hash_table (info);
1170 if (htab == NULL)
1171 return FALSE;
1172 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1173 eh_syms = elf_sym_hashes (abfd);
1174 sreloc = NULL;
1175 stubreloc = NULL;
1177 rela_end = relocs + sec->reloc_count;
1178 for (rela = relocs; rela < rela_end; rela++)
1180 enum {
1181 NEED_GOT = 1,
1182 NEED_PLT = 2,
1183 NEED_DYNREL = 4,
1184 PLT_PLABEL = 8
1187 unsigned int r_symndx, r_type;
1188 struct elf32_hppa_link_hash_entry *hh;
1189 int need_entry = 0;
1191 r_symndx = ELF32_R_SYM (rela->r_info);
1193 if (r_symndx < symtab_hdr->sh_info)
1194 hh = NULL;
1195 else
1197 hh = hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1198 while (hh->eh.root.type == bfd_link_hash_indirect
1199 || hh->eh.root.type == bfd_link_hash_warning)
1200 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1203 r_type = ELF32_R_TYPE (rela->r_info);
1204 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1206 switch (r_type)
1208 case R_PARISC_DLTIND14F:
1209 case R_PARISC_DLTIND14R:
1210 case R_PARISC_DLTIND21L:
1211 /* This symbol requires a global offset table entry. */
1212 need_entry = NEED_GOT;
1213 break;
1215 case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1216 case R_PARISC_PLABEL21L:
1217 case R_PARISC_PLABEL32:
1218 /* If the addend is non-zero, we break badly. */
1219 if (rela->r_addend != 0)
1220 abort ();
1222 /* If we are creating a shared library, then we need to
1223 create a PLT entry for all PLABELs, because PLABELs with
1224 local symbols may be passed via a pointer to another
1225 object. Additionally, output a dynamic relocation
1226 pointing to the PLT entry.
1228 For executables, the original 32-bit ABI allowed two
1229 different styles of PLABELs (function pointers): For
1230 global functions, the PLABEL word points into the .plt
1231 two bytes past a (function address, gp) pair, and for
1232 local functions the PLABEL points directly at the
1233 function. The magic +2 for the first type allows us to
1234 differentiate between the two. As you can imagine, this
1235 is a real pain when it comes to generating code to call
1236 functions indirectly or to compare function pointers.
1237 We avoid the mess by always pointing a PLABEL into the
1238 .plt, even for local functions. */
1239 need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
1240 break;
1242 case R_PARISC_PCREL12F:
1243 htab->has_12bit_branch = 1;
1244 goto branch_common;
1246 case R_PARISC_PCREL17C:
1247 case R_PARISC_PCREL17F:
1248 htab->has_17bit_branch = 1;
1249 goto branch_common;
1251 case R_PARISC_PCREL22F:
1252 htab->has_22bit_branch = 1;
1253 branch_common:
1254 /* Function calls might need to go through the .plt, and
1255 might require long branch stubs. */
1256 if (hh == NULL)
1258 /* We know local syms won't need a .plt entry, and if
1259 they need a long branch stub we can't guarantee that
1260 we can reach the stub. So just flag an error later
1261 if we're doing a shared link and find we need a long
1262 branch stub. */
1263 continue;
1265 else
1267 /* Global symbols will need a .plt entry if they remain
1268 global, and in most cases won't need a long branch
1269 stub. Unfortunately, we have to cater for the case
1270 where a symbol is forced local by versioning, or due
1271 to symbolic linking, and we lose the .plt entry. */
1272 need_entry = NEED_PLT;
1273 if (hh->eh.type == STT_PARISC_MILLI)
1274 need_entry = 0;
1276 break;
1278 case R_PARISC_SEGBASE: /* Used to set segment base. */
1279 case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
1280 case R_PARISC_PCREL14F: /* PC relative load/store. */
1281 case R_PARISC_PCREL14R:
1282 case R_PARISC_PCREL17R: /* External branches. */
1283 case R_PARISC_PCREL21L: /* As above, and for load/store too. */
1284 case R_PARISC_PCREL32:
1285 /* We don't need to propagate the relocation if linking a
1286 shared object since these are section relative. */
1287 continue;
1289 case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1290 case R_PARISC_DPREL14R:
1291 case R_PARISC_DPREL21L:
1292 if (info->shared)
1294 (*_bfd_error_handler)
1295 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1296 abfd,
1297 elf_hppa_howto_table[r_type].name);
1298 bfd_set_error (bfd_error_bad_value);
1299 return FALSE;
1301 /* Fall through. */
1303 case R_PARISC_DIR17F: /* Used for external branches. */
1304 case R_PARISC_DIR17R:
1305 case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1306 case R_PARISC_DIR14R:
1307 case R_PARISC_DIR21L: /* As above, and for ext branches too. */
1308 case R_PARISC_DIR32: /* .word relocs. */
1309 /* We may want to output a dynamic relocation later. */
1310 need_entry = NEED_DYNREL;
1311 break;
1313 /* This relocation describes the C++ object vtable hierarchy.
1314 Reconstruct it for later use during GC. */
1315 case R_PARISC_GNU_VTINHERIT:
1316 if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1317 return FALSE;
1318 continue;
1320 /* This relocation describes which C++ vtable entries are actually
1321 used. Record for later use during GC. */
1322 case R_PARISC_GNU_VTENTRY:
1323 BFD_ASSERT (hh != NULL);
1324 if (hh != NULL
1325 && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1326 return FALSE;
1327 continue;
1329 case R_PARISC_TLS_GD21L:
1330 case R_PARISC_TLS_GD14R:
1331 case R_PARISC_TLS_LDM21L:
1332 case R_PARISC_TLS_LDM14R:
1333 need_entry = NEED_GOT;
1334 break;
1336 case R_PARISC_TLS_IE21L:
1337 case R_PARISC_TLS_IE14R:
1338 if (info->shared)
1339 info->flags |= DF_STATIC_TLS;
1340 need_entry = NEED_GOT;
1341 break;
1343 default:
1344 continue;
1347 /* Now carry out our orders. */
1348 if (need_entry & NEED_GOT)
1350 switch (r_type)
1352 default:
1353 tls_type = GOT_NORMAL;
1354 break;
1355 case R_PARISC_TLS_GD21L:
1356 case R_PARISC_TLS_GD14R:
1357 tls_type |= GOT_TLS_GD;
1358 break;
1359 case R_PARISC_TLS_LDM21L:
1360 case R_PARISC_TLS_LDM14R:
1361 tls_type |= GOT_TLS_LDM;
1362 break;
1363 case R_PARISC_TLS_IE21L:
1364 case R_PARISC_TLS_IE14R:
1365 tls_type |= GOT_TLS_IE;
1366 break;
1369 /* Allocate space for a GOT entry, as well as a dynamic
1370 relocation for this entry. */
1371 if (htab->sgot == NULL)
1373 if (htab->etab.dynobj == NULL)
1374 htab->etab.dynobj = abfd;
1375 if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1376 return FALSE;
1379 if (r_type == R_PARISC_TLS_LDM21L
1380 || r_type == R_PARISC_TLS_LDM14R)
1381 htab->tls_ldm_got.refcount += 1;
1382 else
1384 if (hh != NULL)
1386 hh->eh.got.refcount += 1;
1387 old_tls_type = hh->tls_type;
1389 else
1391 bfd_signed_vma *local_got_refcounts;
1393 /* This is a global offset table entry for a local symbol. */
1394 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1395 if (local_got_refcounts == NULL)
1396 return FALSE;
1397 local_got_refcounts[r_symndx] += 1;
1399 old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1402 tls_type |= old_tls_type;
1404 if (old_tls_type != tls_type)
1406 if (hh != NULL)
1407 hh->tls_type = tls_type;
1408 else
1409 hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1415 if (need_entry & NEED_PLT)
1417 /* If we are creating a shared library, and this is a reloc
1418 against a weak symbol or a global symbol in a dynamic
1419 object, then we will be creating an import stub and a
1420 .plt entry for the symbol. Similarly, on a normal link
1421 to symbols defined in a dynamic object we'll need the
1422 import stub and a .plt entry. We don't know yet whether
1423 the symbol is defined or not, so make an entry anyway and
1424 clean up later in adjust_dynamic_symbol. */
1425 if ((sec->flags & SEC_ALLOC) != 0)
1427 if (hh != NULL)
1429 hh->eh.needs_plt = 1;
1430 hh->eh.plt.refcount += 1;
1432 /* If this .plt entry is for a plabel, mark it so
1433 that adjust_dynamic_symbol will keep the entry
1434 even if it appears to be local. */
1435 if (need_entry & PLT_PLABEL)
1436 hh->plabel = 1;
1438 else if (need_entry & PLT_PLABEL)
1440 bfd_signed_vma *local_got_refcounts;
1441 bfd_signed_vma *local_plt_refcounts;
1443 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1444 if (local_got_refcounts == NULL)
1445 return FALSE;
1446 local_plt_refcounts = (local_got_refcounts
1447 + symtab_hdr->sh_info);
1448 local_plt_refcounts[r_symndx] += 1;
1453 if (need_entry & NEED_DYNREL)
1455 /* Flag this symbol as having a non-got, non-plt reference
1456 so that we generate copy relocs if it turns out to be
1457 dynamic. */
1458 if (hh != NULL && !info->shared)
1459 hh->eh.non_got_ref = 1;
1461 /* If we are creating a shared library then we need to copy
1462 the reloc into the shared library. However, if we are
1463 linking with -Bsymbolic, we need only copy absolute
1464 relocs or relocs against symbols that are not defined in
1465 an object we are including in the link. PC- or DP- or
1466 DLT-relative relocs against any local sym or global sym
1467 with DEF_REGULAR set, can be discarded. At this point we
1468 have not seen all the input files, so it is possible that
1469 DEF_REGULAR is not set now but will be set later (it is
1470 never cleared). We account for that possibility below by
1471 storing information in the dyn_relocs field of the
1472 hash table entry.
1474 A similar situation to the -Bsymbolic case occurs when
1475 creating shared libraries and symbol visibility changes
1476 render the symbol local.
1478 As it turns out, all the relocs we will be creating here
1479 are absolute, so we cannot remove them on -Bsymbolic
1480 links or visibility changes anyway. A STUB_REL reloc
1481 is absolute too, as in that case it is the reloc in the
1482 stub we will be creating, rather than copying the PCREL
1483 reloc in the branch.
1485 If on the other hand, we are creating an executable, we
1486 may need to keep relocations for symbols satisfied by a
1487 dynamic library if we manage to avoid copy relocs for the
1488 symbol. */
1489 if ((info->shared
1490 && (sec->flags & SEC_ALLOC) != 0
1491 && (IS_ABSOLUTE_RELOC (r_type)
1492 || (hh != NULL
1493 && (!info->symbolic
1494 || hh->eh.root.type == bfd_link_hash_defweak
1495 || !hh->eh.def_regular))))
1496 || (ELIMINATE_COPY_RELOCS
1497 && !info->shared
1498 && (sec->flags & SEC_ALLOC) != 0
1499 && hh != NULL
1500 && (hh->eh.root.type == bfd_link_hash_defweak
1501 || !hh->eh.def_regular)))
1503 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1504 struct elf32_hppa_dyn_reloc_entry **hdh_head;
1506 /* Create a reloc section in dynobj and make room for
1507 this reloc. */
1508 if (sreloc == NULL)
1510 if (htab->etab.dynobj == NULL)
1511 htab->etab.dynobj = abfd;
1513 sreloc = _bfd_elf_make_dynamic_reloc_section
1514 (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1516 if (sreloc == NULL)
1518 bfd_set_error (bfd_error_bad_value);
1519 return FALSE;
1523 /* If this is a global symbol, we count the number of
1524 relocations we need for this symbol. */
1525 if (hh != NULL)
1527 hdh_head = &hh->dyn_relocs;
1529 else
1531 /* Track dynamic relocs needed for local syms too.
1532 We really need local syms available to do this
1533 easily. Oh well. */
1534 asection *sr;
1535 void *vpp;
1536 Elf_Internal_Sym *isym;
1538 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1539 abfd, r_symndx);
1540 if (isym == NULL)
1541 return FALSE;
1543 sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1544 if (sr == NULL)
1545 sr = sec;
1547 vpp = &elf_section_data (sr)->local_dynrel;
1548 hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
1551 hdh_p = *hdh_head;
1552 if (hdh_p == NULL || hdh_p->sec != sec)
1554 hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1555 if (hdh_p == NULL)
1556 return FALSE;
1557 hdh_p->hdh_next = *hdh_head;
1558 *hdh_head = hdh_p;
1559 hdh_p->sec = sec;
1560 hdh_p->count = 0;
1561 #if RELATIVE_DYNRELOCS
1562 hdh_p->relative_count = 0;
1563 #endif
1566 hdh_p->count += 1;
1567 #if RELATIVE_DYNRELOCS
1568 if (!IS_ABSOLUTE_RELOC (rtype))
1569 hdh_p->relative_count += 1;
1570 #endif
1575 return TRUE;
1578 /* Return the section that should be marked against garbage collection
1579 for a given relocation. */
1581 static asection *
1582 elf32_hppa_gc_mark_hook (asection *sec,
1583 struct bfd_link_info *info,
1584 Elf_Internal_Rela *rela,
1585 struct elf_link_hash_entry *hh,
1586 Elf_Internal_Sym *sym)
1588 if (hh != NULL)
1589 switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1591 case R_PARISC_GNU_VTINHERIT:
1592 case R_PARISC_GNU_VTENTRY:
1593 return NULL;
1596 return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1599 /* Update the got and plt entry reference counts for the section being
1600 removed. */
1602 static bfd_boolean
1603 elf32_hppa_gc_sweep_hook (bfd *abfd,
1604 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1605 asection *sec,
1606 const Elf_Internal_Rela *relocs)
1608 Elf_Internal_Shdr *symtab_hdr;
1609 struct elf_link_hash_entry **eh_syms;
1610 bfd_signed_vma *local_got_refcounts;
1611 bfd_signed_vma *local_plt_refcounts;
1612 const Elf_Internal_Rela *rela, *relend;
1613 struct elf32_hppa_link_hash_table *htab;
1615 if (info->relocatable)
1616 return TRUE;
1618 htab = hppa_link_hash_table (info);
1619 if (htab == NULL)
1620 return FALSE;
1622 elf_section_data (sec)->local_dynrel = NULL;
1624 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1625 eh_syms = elf_sym_hashes (abfd);
1626 local_got_refcounts = elf_local_got_refcounts (abfd);
1627 local_plt_refcounts = local_got_refcounts;
1628 if (local_plt_refcounts != NULL)
1629 local_plt_refcounts += symtab_hdr->sh_info;
1631 relend = relocs + sec->reloc_count;
1632 for (rela = relocs; rela < relend; rela++)
1634 unsigned long r_symndx;
1635 unsigned int r_type;
1636 struct elf_link_hash_entry *eh = NULL;
1638 r_symndx = ELF32_R_SYM (rela->r_info);
1639 if (r_symndx >= symtab_hdr->sh_info)
1641 struct elf32_hppa_link_hash_entry *hh;
1642 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1643 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1645 eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1646 while (eh->root.type == bfd_link_hash_indirect
1647 || eh->root.type == bfd_link_hash_warning)
1648 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1649 hh = hppa_elf_hash_entry (eh);
1651 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
1652 if (hdh_p->sec == sec)
1654 /* Everything must go for SEC. */
1655 *hdh_pp = hdh_p->hdh_next;
1656 break;
1660 r_type = ELF32_R_TYPE (rela->r_info);
1661 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1663 switch (r_type)
1665 case R_PARISC_DLTIND14F:
1666 case R_PARISC_DLTIND14R:
1667 case R_PARISC_DLTIND21L:
1668 case R_PARISC_TLS_GD21L:
1669 case R_PARISC_TLS_GD14R:
1670 case R_PARISC_TLS_IE21L:
1671 case R_PARISC_TLS_IE14R:
1672 if (eh != NULL)
1674 if (eh->got.refcount > 0)
1675 eh->got.refcount -= 1;
1677 else if (local_got_refcounts != NULL)
1679 if (local_got_refcounts[r_symndx] > 0)
1680 local_got_refcounts[r_symndx] -= 1;
1682 break;
1684 case R_PARISC_TLS_LDM21L:
1685 case R_PARISC_TLS_LDM14R:
1686 htab->tls_ldm_got.refcount -= 1;
1687 break;
1689 case R_PARISC_PCREL12F:
1690 case R_PARISC_PCREL17C:
1691 case R_PARISC_PCREL17F:
1692 case R_PARISC_PCREL22F:
1693 if (eh != NULL)
1695 if (eh->plt.refcount > 0)
1696 eh->plt.refcount -= 1;
1698 break;
1700 case R_PARISC_PLABEL14R:
1701 case R_PARISC_PLABEL21L:
1702 case R_PARISC_PLABEL32:
1703 if (eh != NULL)
1705 if (eh->plt.refcount > 0)
1706 eh->plt.refcount -= 1;
1708 else if (local_plt_refcounts != NULL)
1710 if (local_plt_refcounts[r_symndx] > 0)
1711 local_plt_refcounts[r_symndx] -= 1;
1713 break;
1715 default:
1716 break;
1720 return TRUE;
1723 /* Support for core dump NOTE sections. */
1725 static bfd_boolean
1726 elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1728 int offset;
1729 size_t size;
1731 switch (note->descsz)
1733 default:
1734 return FALSE;
1736 case 396: /* Linux/hppa */
1737 /* pr_cursig */
1738 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1740 /* pr_pid */
1741 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1743 /* pr_reg */
1744 offset = 72;
1745 size = 320;
1747 break;
1750 /* Make a ".reg/999" section. */
1751 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1752 size, note->descpos + offset);
1755 static bfd_boolean
1756 elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1758 switch (note->descsz)
1760 default:
1761 return FALSE;
1763 case 124: /* Linux/hppa elf_prpsinfo. */
1764 elf_tdata (abfd)->core_program
1765 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1766 elf_tdata (abfd)->core_command
1767 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1770 /* Note that for some reason, a spurious space is tacked
1771 onto the end of the args in some (at least one anyway)
1772 implementations, so strip it off if it exists. */
1774 char *command = elf_tdata (abfd)->core_command;
1775 int n = strlen (command);
1777 if (0 < n && command[n - 1] == ' ')
1778 command[n - 1] = '\0';
1781 return TRUE;
1784 /* Our own version of hide_symbol, so that we can keep plt entries for
1785 plabels. */
1787 static void
1788 elf32_hppa_hide_symbol (struct bfd_link_info *info,
1789 struct elf_link_hash_entry *eh,
1790 bfd_boolean force_local)
1792 if (force_local)
1794 eh->forced_local = 1;
1795 if (eh->dynindx != -1)
1797 eh->dynindx = -1;
1798 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1799 eh->dynstr_index);
1803 if (! hppa_elf_hash_entry (eh)->plabel)
1805 eh->needs_plt = 0;
1806 eh->plt = elf_hash_table (info)->init_plt_refcount;
1810 /* Adjust a symbol defined by a dynamic object and referenced by a
1811 regular object. The current definition is in some section of the
1812 dynamic object, but we're not including those sections. We have to
1813 change the definition to something the rest of the link can
1814 understand. */
1816 static bfd_boolean
1817 elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1818 struct elf_link_hash_entry *eh)
1820 struct elf32_hppa_link_hash_table *htab;
1821 asection *sec;
1823 /* If this is a function, put it in the procedure linkage table. We
1824 will fill in the contents of the procedure linkage table later. */
1825 if (eh->type == STT_FUNC
1826 || eh->needs_plt)
1828 if (eh->plt.refcount <= 0
1829 || (eh->def_regular
1830 && eh->root.type != bfd_link_hash_defweak
1831 && ! hppa_elf_hash_entry (eh)->plabel
1832 && (!info->shared || info->symbolic)))
1834 /* The .plt entry is not needed when:
1835 a) Garbage collection has removed all references to the
1836 symbol, or
1837 b) We know for certain the symbol is defined in this
1838 object, and it's not a weak definition, nor is the symbol
1839 used by a plabel relocation. Either this object is the
1840 application or we are doing a shared symbolic link. */
1842 eh->plt.offset = (bfd_vma) -1;
1843 eh->needs_plt = 0;
1846 return TRUE;
1848 else
1849 eh->plt.offset = (bfd_vma) -1;
1851 /* If this is a weak symbol, and there is a real definition, the
1852 processor independent code will have arranged for us to see the
1853 real definition first, and we can just use the same value. */
1854 if (eh->u.weakdef != NULL)
1856 if (eh->u.weakdef->root.type != bfd_link_hash_defined
1857 && eh->u.weakdef->root.type != bfd_link_hash_defweak)
1858 abort ();
1859 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1860 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1861 if (ELIMINATE_COPY_RELOCS)
1862 eh->non_got_ref = eh->u.weakdef->non_got_ref;
1863 return TRUE;
1866 /* This is a reference to a symbol defined by a dynamic object which
1867 is not a function. */
1869 /* If we are creating a shared library, we must presume that the
1870 only references to the symbol are via the global offset table.
1871 For such cases we need not do anything here; the relocations will
1872 be handled correctly by relocate_section. */
1873 if (info->shared)
1874 return TRUE;
1876 /* If there are no references to this symbol that do not use the
1877 GOT, we don't need to generate a copy reloc. */
1878 if (!eh->non_got_ref)
1879 return TRUE;
1881 if (ELIMINATE_COPY_RELOCS)
1883 struct elf32_hppa_link_hash_entry *hh;
1884 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1886 hh = hppa_elf_hash_entry (eh);
1887 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
1889 sec = hdh_p->sec->output_section;
1890 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1891 break;
1894 /* If we didn't find any dynamic relocs in read-only sections, then
1895 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1896 if (hdh_p == NULL)
1898 eh->non_got_ref = 0;
1899 return TRUE;
1903 if (eh->size == 0)
1905 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1906 eh->root.root.string);
1907 return TRUE;
1910 /* We must allocate the symbol in our .dynbss section, which will
1911 become part of the .bss section of the executable. There will be
1912 an entry for this symbol in the .dynsym section. The dynamic
1913 object will contain position independent code, so all references
1914 from the dynamic object to this symbol will go through the global
1915 offset table. The dynamic linker will use the .dynsym entry to
1916 determine the address it must put in the global offset table, so
1917 both the dynamic object and the regular object will refer to the
1918 same memory location for the variable. */
1920 htab = hppa_link_hash_table (info);
1921 if (htab == NULL)
1922 return FALSE;
1924 /* We must generate a COPY reloc to tell the dynamic linker to
1925 copy the initial value out of the dynamic object and into the
1926 runtime process image. */
1927 if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
1929 htab->srelbss->size += sizeof (Elf32_External_Rela);
1930 eh->needs_copy = 1;
1933 sec = htab->sdynbss;
1935 return _bfd_elf_adjust_dynamic_copy (eh, sec);
1938 /* Allocate space in the .plt for entries that won't have relocations.
1939 ie. plabel entries. */
1941 static bfd_boolean
1942 allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1944 struct bfd_link_info *info;
1945 struct elf32_hppa_link_hash_table *htab;
1946 struct elf32_hppa_link_hash_entry *hh;
1947 asection *sec;
1949 if (eh->root.type == bfd_link_hash_indirect)
1950 return TRUE;
1952 if (eh->root.type == bfd_link_hash_warning)
1953 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1955 info = (struct bfd_link_info *) inf;
1956 hh = hppa_elf_hash_entry (eh);
1957 htab = hppa_link_hash_table (info);
1958 if (htab == NULL)
1959 return FALSE;
1961 if (htab->etab.dynamic_sections_created
1962 && eh->plt.refcount > 0)
1964 /* Make sure this symbol is output as a dynamic symbol.
1965 Undefined weak syms won't yet be marked as dynamic. */
1966 if (eh->dynindx == -1
1967 && !eh->forced_local
1968 && eh->type != STT_PARISC_MILLI)
1970 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
1971 return FALSE;
1974 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
1976 /* Allocate these later. From this point on, h->plabel
1977 means that the plt entry is only used by a plabel.
1978 We'll be using a normal plt entry for this symbol, so
1979 clear the plabel indicator. */
1981 hh->plabel = 0;
1983 else if (hh->plabel)
1985 /* Make an entry in the .plt section for plabel references
1986 that won't have a .plt entry for other reasons. */
1987 sec = htab->splt;
1988 eh->plt.offset = sec->size;
1989 sec->size += PLT_ENTRY_SIZE;
1991 else
1993 /* No .plt entry needed. */
1994 eh->plt.offset = (bfd_vma) -1;
1995 eh->needs_plt = 0;
1998 else
2000 eh->plt.offset = (bfd_vma) -1;
2001 eh->needs_plt = 0;
2004 return TRUE;
2007 /* Allocate space in .plt, .got and associated reloc sections for
2008 global syms. */
2010 static bfd_boolean
2011 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2013 struct bfd_link_info *info;
2014 struct elf32_hppa_link_hash_table *htab;
2015 asection *sec;
2016 struct elf32_hppa_link_hash_entry *hh;
2017 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2019 if (eh->root.type == bfd_link_hash_indirect)
2020 return TRUE;
2022 if (eh->root.type == bfd_link_hash_warning)
2023 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2025 info = inf;
2026 htab = hppa_link_hash_table (info);
2027 if (htab == NULL)
2028 return FALSE;
2030 hh = hppa_elf_hash_entry (eh);
2032 if (htab->etab.dynamic_sections_created
2033 && eh->plt.offset != (bfd_vma) -1
2034 && !hh->plabel
2035 && eh->plt.refcount > 0)
2037 /* Make an entry in the .plt section. */
2038 sec = htab->splt;
2039 eh->plt.offset = sec->size;
2040 sec->size += PLT_ENTRY_SIZE;
2042 /* We also need to make an entry in the .rela.plt section. */
2043 htab->srelplt->size += sizeof (Elf32_External_Rela);
2044 htab->need_plt_stub = 1;
2047 if (eh->got.refcount > 0)
2049 /* Make sure this symbol is output as a dynamic symbol.
2050 Undefined weak syms won't yet be marked as dynamic. */
2051 if (eh->dynindx == -1
2052 && !eh->forced_local
2053 && eh->type != STT_PARISC_MILLI)
2055 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2056 return FALSE;
2059 sec = htab->sgot;
2060 eh->got.offset = sec->size;
2061 sec->size += GOT_ENTRY_SIZE;
2062 /* R_PARISC_TLS_GD* needs two GOT entries */
2063 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2064 sec->size += GOT_ENTRY_SIZE * 2;
2065 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2066 sec->size += GOT_ENTRY_SIZE;
2067 if (htab->etab.dynamic_sections_created
2068 && (info->shared
2069 || (eh->dynindx != -1
2070 && !eh->forced_local)))
2072 htab->srelgot->size += sizeof (Elf32_External_Rela);
2073 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2074 htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2075 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2076 htab->srelgot->size += sizeof (Elf32_External_Rela);
2079 else
2080 eh->got.offset = (bfd_vma) -1;
2082 if (hh->dyn_relocs == NULL)
2083 return TRUE;
2085 /* If this is a -Bsymbolic shared link, then we need to discard all
2086 space allocated for dynamic pc-relative relocs against symbols
2087 defined in a regular object. For the normal shared case, discard
2088 space for relocs that have become local due to symbol visibility
2089 changes. */
2090 if (info->shared)
2092 #if RELATIVE_DYNRELOCS
2093 if (SYMBOL_CALLS_LOCAL (info, eh))
2095 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
2097 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2099 hdh_p->count -= hdh_p->relative_count;
2100 hdh_p->relative_count = 0;
2101 if (hdh_p->count == 0)
2102 *hdh_pp = hdh_p->hdh_next;
2103 else
2104 hdh_pp = &hdh_p->hdh_next;
2107 #endif
2109 /* Also discard relocs on undefined weak syms with non-default
2110 visibility. */
2111 if (hh->dyn_relocs != NULL
2112 && eh->root.type == bfd_link_hash_undefweak)
2114 if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2115 hh->dyn_relocs = NULL;
2117 /* Make sure undefined weak symbols are output as a dynamic
2118 symbol in PIEs. */
2119 else if (eh->dynindx == -1
2120 && !eh->forced_local)
2122 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2123 return FALSE;
2127 else
2129 /* For the non-shared case, discard space for relocs against
2130 symbols which turn out to need copy relocs or are not
2131 dynamic. */
2133 if (!eh->non_got_ref
2134 && ((ELIMINATE_COPY_RELOCS
2135 && eh->def_dynamic
2136 && !eh->def_regular)
2137 || (htab->etab.dynamic_sections_created
2138 && (eh->root.type == bfd_link_hash_undefweak
2139 || eh->root.type == bfd_link_hash_undefined))))
2141 /* Make sure this symbol is output as a dynamic symbol.
2142 Undefined weak syms won't yet be marked as dynamic. */
2143 if (eh->dynindx == -1
2144 && !eh->forced_local
2145 && eh->type != STT_PARISC_MILLI)
2147 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2148 return FALSE;
2151 /* If that succeeded, we know we'll be keeping all the
2152 relocs. */
2153 if (eh->dynindx != -1)
2154 goto keep;
2157 hh->dyn_relocs = NULL;
2158 return TRUE;
2160 keep: ;
2163 /* Finally, allocate space. */
2164 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2166 asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2167 sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2170 return TRUE;
2173 /* This function is called via elf_link_hash_traverse to force
2174 millicode symbols local so they do not end up as globals in the
2175 dynamic symbol table. We ought to be able to do this in
2176 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2177 for all dynamic symbols. Arguably, this is a bug in
2178 elf_adjust_dynamic_symbol. */
2180 static bfd_boolean
2181 clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2182 struct bfd_link_info *info)
2184 if (eh->root.type == bfd_link_hash_warning)
2185 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2187 if (eh->type == STT_PARISC_MILLI
2188 && !eh->forced_local)
2190 elf32_hppa_hide_symbol (info, eh, TRUE);
2192 return TRUE;
2195 /* Find any dynamic relocs that apply to read-only sections. */
2197 static bfd_boolean
2198 readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2200 struct elf32_hppa_link_hash_entry *hh;
2201 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2203 if (eh->root.type == bfd_link_hash_warning)
2204 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2206 hh = hppa_elf_hash_entry (eh);
2207 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2209 asection *sec = hdh_p->sec->output_section;
2211 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2213 struct bfd_link_info *info = inf;
2215 info->flags |= DF_TEXTREL;
2217 /* Not an error, just cut short the traversal. */
2218 return FALSE;
2221 return TRUE;
2224 /* Set the sizes of the dynamic sections. */
2226 static bfd_boolean
2227 elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2228 struct bfd_link_info *info)
2230 struct elf32_hppa_link_hash_table *htab;
2231 bfd *dynobj;
2232 bfd *ibfd;
2233 asection *sec;
2234 bfd_boolean relocs;
2236 htab = hppa_link_hash_table (info);
2237 if (htab == NULL)
2238 return FALSE;
2240 dynobj = htab->etab.dynobj;
2241 if (dynobj == NULL)
2242 abort ();
2244 if (htab->etab.dynamic_sections_created)
2246 /* Set the contents of the .interp section to the interpreter. */
2247 if (info->executable)
2249 sec = bfd_get_section_by_name (dynobj, ".interp");
2250 if (sec == NULL)
2251 abort ();
2252 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2253 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2256 /* Force millicode symbols local. */
2257 elf_link_hash_traverse (&htab->etab,
2258 clobber_millicode_symbols,
2259 info);
2262 /* Set up .got and .plt offsets for local syms, and space for local
2263 dynamic relocs. */
2264 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2266 bfd_signed_vma *local_got;
2267 bfd_signed_vma *end_local_got;
2268 bfd_signed_vma *local_plt;
2269 bfd_signed_vma *end_local_plt;
2270 bfd_size_type locsymcount;
2271 Elf_Internal_Shdr *symtab_hdr;
2272 asection *srel;
2273 char *local_tls_type;
2275 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2276 continue;
2278 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2280 struct elf32_hppa_dyn_reloc_entry *hdh_p;
2282 for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2283 elf_section_data (sec)->local_dynrel);
2284 hdh_p != NULL;
2285 hdh_p = hdh_p->hdh_next)
2287 if (!bfd_is_abs_section (hdh_p->sec)
2288 && bfd_is_abs_section (hdh_p->sec->output_section))
2290 /* Input section has been discarded, either because
2291 it is a copy of a linkonce section or due to
2292 linker script /DISCARD/, so we'll be discarding
2293 the relocs too. */
2295 else if (hdh_p->count != 0)
2297 srel = elf_section_data (hdh_p->sec)->sreloc;
2298 srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2299 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2300 info->flags |= DF_TEXTREL;
2305 local_got = elf_local_got_refcounts (ibfd);
2306 if (!local_got)
2307 continue;
2309 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2310 locsymcount = symtab_hdr->sh_info;
2311 end_local_got = local_got + locsymcount;
2312 local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2313 sec = htab->sgot;
2314 srel = htab->srelgot;
2315 for (; local_got < end_local_got; ++local_got)
2317 if (*local_got > 0)
2319 *local_got = sec->size;
2320 sec->size += GOT_ENTRY_SIZE;
2321 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2322 sec->size += 2 * GOT_ENTRY_SIZE;
2323 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2324 sec->size += GOT_ENTRY_SIZE;
2325 if (info->shared)
2327 srel->size += sizeof (Elf32_External_Rela);
2328 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2329 srel->size += 2 * sizeof (Elf32_External_Rela);
2330 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2331 srel->size += sizeof (Elf32_External_Rela);
2334 else
2335 *local_got = (bfd_vma) -1;
2337 ++local_tls_type;
2340 local_plt = end_local_got;
2341 end_local_plt = local_plt + locsymcount;
2342 if (! htab->etab.dynamic_sections_created)
2344 /* Won't be used, but be safe. */
2345 for (; local_plt < end_local_plt; ++local_plt)
2346 *local_plt = (bfd_vma) -1;
2348 else
2350 sec = htab->splt;
2351 srel = htab->srelplt;
2352 for (; local_plt < end_local_plt; ++local_plt)
2354 if (*local_plt > 0)
2356 *local_plt = sec->size;
2357 sec->size += PLT_ENTRY_SIZE;
2358 if (info->shared)
2359 srel->size += sizeof (Elf32_External_Rela);
2361 else
2362 *local_plt = (bfd_vma) -1;
2367 if (htab->tls_ldm_got.refcount > 0)
2369 /* Allocate 2 got entries and 1 dynamic reloc for
2370 R_PARISC_TLS_DTPMOD32 relocs. */
2371 htab->tls_ldm_got.offset = htab->sgot->size;
2372 htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2373 htab->srelgot->size += sizeof (Elf32_External_Rela);
2375 else
2376 htab->tls_ldm_got.offset = -1;
2378 /* Do all the .plt entries without relocs first. The dynamic linker
2379 uses the last .plt reloc to find the end of the .plt (and hence
2380 the start of the .got) for lazy linking. */
2381 elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2383 /* Allocate global sym .plt and .got entries, and space for global
2384 sym dynamic relocs. */
2385 elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2387 /* The check_relocs and adjust_dynamic_symbol entry points have
2388 determined the sizes of the various dynamic sections. Allocate
2389 memory for them. */
2390 relocs = FALSE;
2391 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2393 if ((sec->flags & SEC_LINKER_CREATED) == 0)
2394 continue;
2396 if (sec == htab->splt)
2398 if (htab->need_plt_stub)
2400 /* Make space for the plt stub at the end of the .plt
2401 section. We want this stub right at the end, up
2402 against the .got section. */
2403 int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2404 int pltalign = bfd_section_alignment (dynobj, sec);
2405 bfd_size_type mask;
2407 if (gotalign > pltalign)
2408 bfd_set_section_alignment (dynobj, sec, gotalign);
2409 mask = ((bfd_size_type) 1 << gotalign) - 1;
2410 sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2413 else if (sec == htab->sgot
2414 || sec == htab->sdynbss)
2416 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2418 if (sec->size != 0)
2420 /* Remember whether there are any reloc sections other
2421 than .rela.plt. */
2422 if (sec != htab->srelplt)
2423 relocs = TRUE;
2425 /* We use the reloc_count field as a counter if we need
2426 to copy relocs into the output file. */
2427 sec->reloc_count = 0;
2430 else
2432 /* It's not one of our sections, so don't allocate space. */
2433 continue;
2436 if (sec->size == 0)
2438 /* If we don't need this section, strip it from the
2439 output file. This is mostly to handle .rela.bss and
2440 .rela.plt. We must create both sections in
2441 create_dynamic_sections, because they must be created
2442 before the linker maps input sections to output
2443 sections. The linker does that before
2444 adjust_dynamic_symbol is called, and it is that
2445 function which decides whether anything needs to go
2446 into these sections. */
2447 sec->flags |= SEC_EXCLUDE;
2448 continue;
2451 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2452 continue;
2454 /* Allocate memory for the section contents. Zero it, because
2455 we may not fill in all the reloc sections. */
2456 sec->contents = bfd_zalloc (dynobj, sec->size);
2457 if (sec->contents == NULL)
2458 return FALSE;
2461 if (htab->etab.dynamic_sections_created)
2463 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2464 actually has nothing to do with the PLT, it is how we
2465 communicate the LTP value of a load module to the dynamic
2466 linker. */
2467 #define add_dynamic_entry(TAG, VAL) \
2468 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2470 if (!add_dynamic_entry (DT_PLTGOT, 0))
2471 return FALSE;
2473 /* Add some entries to the .dynamic section. We fill in the
2474 values later, in elf32_hppa_finish_dynamic_sections, but we
2475 must add the entries now so that we get the correct size for
2476 the .dynamic section. The DT_DEBUG entry is filled in by the
2477 dynamic linker and used by the debugger. */
2478 if (info->executable)
2480 if (!add_dynamic_entry (DT_DEBUG, 0))
2481 return FALSE;
2484 if (htab->srelplt->size != 0)
2486 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2487 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2488 || !add_dynamic_entry (DT_JMPREL, 0))
2489 return FALSE;
2492 if (relocs)
2494 if (!add_dynamic_entry (DT_RELA, 0)
2495 || !add_dynamic_entry (DT_RELASZ, 0)
2496 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2497 return FALSE;
2499 /* If any dynamic relocs apply to a read-only section,
2500 then we need a DT_TEXTREL entry. */
2501 if ((info->flags & DF_TEXTREL) == 0)
2502 elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2504 if ((info->flags & DF_TEXTREL) != 0)
2506 if (!add_dynamic_entry (DT_TEXTREL, 0))
2507 return FALSE;
2511 #undef add_dynamic_entry
2513 return TRUE;
2516 /* External entry points for sizing and building linker stubs. */
2518 /* Set up various things so that we can make a list of input sections
2519 for each output section included in the link. Returns -1 on error,
2520 0 when no stubs will be needed, and 1 on success. */
2523 elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2525 bfd *input_bfd;
2526 unsigned int bfd_count;
2527 int top_id, top_index;
2528 asection *section;
2529 asection **input_list, **list;
2530 bfd_size_type amt;
2531 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2533 if (htab == NULL)
2534 return -1;
2536 /* Count the number of input BFDs and find the top input section id. */
2537 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2538 input_bfd != NULL;
2539 input_bfd = input_bfd->link_next)
2541 bfd_count += 1;
2542 for (section = input_bfd->sections;
2543 section != NULL;
2544 section = section->next)
2546 if (top_id < section->id)
2547 top_id = section->id;
2550 htab->bfd_count = bfd_count;
2552 amt = sizeof (struct map_stub) * (top_id + 1);
2553 htab->stub_group = bfd_zmalloc (amt);
2554 if (htab->stub_group == NULL)
2555 return -1;
2557 /* We can't use output_bfd->section_count here to find the top output
2558 section index as some sections may have been removed, and
2559 strip_excluded_output_sections doesn't renumber the indices. */
2560 for (section = output_bfd->sections, top_index = 0;
2561 section != NULL;
2562 section = section->next)
2564 if (top_index < section->index)
2565 top_index = section->index;
2568 htab->top_index = top_index;
2569 amt = sizeof (asection *) * (top_index + 1);
2570 input_list = bfd_malloc (amt);
2571 htab->input_list = input_list;
2572 if (input_list == NULL)
2573 return -1;
2575 /* For sections we aren't interested in, mark their entries with a
2576 value we can check later. */
2577 list = input_list + top_index;
2579 *list = bfd_abs_section_ptr;
2580 while (list-- != input_list);
2582 for (section = output_bfd->sections;
2583 section != NULL;
2584 section = section->next)
2586 if ((section->flags & SEC_CODE) != 0)
2587 input_list[section->index] = NULL;
2590 return 1;
2593 /* The linker repeatedly calls this function for each input section,
2594 in the order that input sections are linked into output sections.
2595 Build lists of input sections to determine groupings between which
2596 we may insert linker stubs. */
2598 void
2599 elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2601 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2603 if (htab == NULL)
2604 return;
2606 if (isec->output_section->index <= htab->top_index)
2608 asection **list = htab->input_list + isec->output_section->index;
2609 if (*list != bfd_abs_section_ptr)
2611 /* Steal the link_sec pointer for our list. */
2612 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2613 /* This happens to make the list in reverse order,
2614 which is what we want. */
2615 PREV_SEC (isec) = *list;
2616 *list = isec;
2621 /* See whether we can group stub sections together. Grouping stub
2622 sections may result in fewer stubs. More importantly, we need to
2623 put all .init* and .fini* stubs at the beginning of the .init or
2624 .fini output sections respectively, because glibc splits the
2625 _init and _fini functions into multiple parts. Putting a stub in
2626 the middle of a function is not a good idea. */
2628 static void
2629 group_sections (struct elf32_hppa_link_hash_table *htab,
2630 bfd_size_type stub_group_size,
2631 bfd_boolean stubs_always_before_branch)
2633 asection **list = htab->input_list + htab->top_index;
2636 asection *tail = *list;
2637 if (tail == bfd_abs_section_ptr)
2638 continue;
2639 while (tail != NULL)
2641 asection *curr;
2642 asection *prev;
2643 bfd_size_type total;
2644 bfd_boolean big_sec;
2646 curr = tail;
2647 total = tail->size;
2648 big_sec = total >= stub_group_size;
2650 while ((prev = PREV_SEC (curr)) != NULL
2651 && ((total += curr->output_offset - prev->output_offset)
2652 < stub_group_size))
2653 curr = prev;
2655 /* OK, the size from the start of CURR to the end is less
2656 than 240000 bytes and thus can be handled by one stub
2657 section. (or the tail section is itself larger than
2658 240000 bytes, in which case we may be toast.)
2659 We should really be keeping track of the total size of
2660 stubs added here, as stubs contribute to the final output
2661 section size. That's a little tricky, and this way will
2662 only break if stubs added total more than 22144 bytes, or
2663 2768 long branch stubs. It seems unlikely for more than
2664 2768 different functions to be called, especially from
2665 code only 240000 bytes long. This limit used to be
2666 250000, but c++ code tends to generate lots of little
2667 functions, and sometimes violated the assumption. */
2670 prev = PREV_SEC (tail);
2671 /* Set up this stub group. */
2672 htab->stub_group[tail->id].link_sec = curr;
2674 while (tail != curr && (tail = prev) != NULL);
2676 /* But wait, there's more! Input sections up to 240000
2677 bytes before the stub section can be handled by it too.
2678 Don't do this if we have a really large section after the
2679 stubs, as adding more stubs increases the chance that
2680 branches may not reach into the stub section. */
2681 if (!stubs_always_before_branch && !big_sec)
2683 total = 0;
2684 while (prev != NULL
2685 && ((total += tail->output_offset - prev->output_offset)
2686 < stub_group_size))
2688 tail = prev;
2689 prev = PREV_SEC (tail);
2690 htab->stub_group[tail->id].link_sec = curr;
2693 tail = prev;
2696 while (list-- != htab->input_list);
2697 free (htab->input_list);
2698 #undef PREV_SEC
2701 /* Read in all local syms for all input bfds, and create hash entries
2702 for export stubs if we are building a multi-subspace shared lib.
2703 Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2705 static int
2706 get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2708 unsigned int bfd_indx;
2709 Elf_Internal_Sym *local_syms, **all_local_syms;
2710 int stub_changed = 0;
2711 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2713 if (htab == NULL)
2714 return -1;
2716 /* We want to read in symbol extension records only once. To do this
2717 we need to read in the local symbols in parallel and save them for
2718 later use; so hold pointers to the local symbols in an array. */
2719 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2720 all_local_syms = bfd_zmalloc (amt);
2721 htab->all_local_syms = all_local_syms;
2722 if (all_local_syms == NULL)
2723 return -1;
2725 /* Walk over all the input BFDs, swapping in local symbols.
2726 If we are creating a shared library, create hash entries for the
2727 export stubs. */
2728 for (bfd_indx = 0;
2729 input_bfd != NULL;
2730 input_bfd = input_bfd->link_next, bfd_indx++)
2732 Elf_Internal_Shdr *symtab_hdr;
2734 /* We'll need the symbol table in a second. */
2735 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2736 if (symtab_hdr->sh_info == 0)
2737 continue;
2739 /* We need an array of the local symbols attached to the input bfd. */
2740 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2741 if (local_syms == NULL)
2743 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2744 symtab_hdr->sh_info, 0,
2745 NULL, NULL, NULL);
2746 /* Cache them for elf_link_input_bfd. */
2747 symtab_hdr->contents = (unsigned char *) local_syms;
2749 if (local_syms == NULL)
2750 return -1;
2752 all_local_syms[bfd_indx] = local_syms;
2754 if (info->shared && htab->multi_subspace)
2756 struct elf_link_hash_entry **eh_syms;
2757 struct elf_link_hash_entry **eh_symend;
2758 unsigned int symcount;
2760 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2761 - symtab_hdr->sh_info);
2762 eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2763 eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2765 /* Look through the global syms for functions; We need to
2766 build export stubs for all globally visible functions. */
2767 for (; eh_syms < eh_symend; eh_syms++)
2769 struct elf32_hppa_link_hash_entry *hh;
2771 hh = hppa_elf_hash_entry (*eh_syms);
2773 while (hh->eh.root.type == bfd_link_hash_indirect
2774 || hh->eh.root.type == bfd_link_hash_warning)
2775 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2777 /* At this point in the link, undefined syms have been
2778 resolved, so we need to check that the symbol was
2779 defined in this BFD. */
2780 if ((hh->eh.root.type == bfd_link_hash_defined
2781 || hh->eh.root.type == bfd_link_hash_defweak)
2782 && hh->eh.type == STT_FUNC
2783 && hh->eh.root.u.def.section->output_section != NULL
2784 && (hh->eh.root.u.def.section->output_section->owner
2785 == output_bfd)
2786 && hh->eh.root.u.def.section->owner == input_bfd
2787 && hh->eh.def_regular
2788 && !hh->eh.forced_local
2789 && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2791 asection *sec;
2792 const char *stub_name;
2793 struct elf32_hppa_stub_hash_entry *hsh;
2795 sec = hh->eh.root.u.def.section;
2796 stub_name = hh_name (hh);
2797 hsh = hppa_stub_hash_lookup (&htab->bstab,
2798 stub_name,
2799 FALSE, FALSE);
2800 if (hsh == NULL)
2802 hsh = hppa_add_stub (stub_name, sec, htab);
2803 if (!hsh)
2804 return -1;
2806 hsh->target_value = hh->eh.root.u.def.value;
2807 hsh->target_section = hh->eh.root.u.def.section;
2808 hsh->stub_type = hppa_stub_export;
2809 hsh->hh = hh;
2810 stub_changed = 1;
2812 else
2814 (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2815 input_bfd,
2816 stub_name);
2823 return stub_changed;
2826 /* Determine and set the size of the stub section for a final link.
2828 The basic idea here is to examine all the relocations looking for
2829 PC-relative calls to a target that is unreachable with a "bl"
2830 instruction. */
2832 bfd_boolean
2833 elf32_hppa_size_stubs
2834 (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2835 bfd_boolean multi_subspace, bfd_signed_vma group_size,
2836 asection * (*add_stub_section) (const char *, asection *),
2837 void (*layout_sections_again) (void))
2839 bfd_size_type stub_group_size;
2840 bfd_boolean stubs_always_before_branch;
2841 bfd_boolean stub_changed;
2842 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2844 if (htab == NULL)
2845 return FALSE;
2847 /* Stash our params away. */
2848 htab->stub_bfd = stub_bfd;
2849 htab->multi_subspace = multi_subspace;
2850 htab->add_stub_section = add_stub_section;
2851 htab->layout_sections_again = layout_sections_again;
2852 stubs_always_before_branch = group_size < 0;
2853 if (group_size < 0)
2854 stub_group_size = -group_size;
2855 else
2856 stub_group_size = group_size;
2857 if (stub_group_size == 1)
2859 /* Default values. */
2860 if (stubs_always_before_branch)
2862 stub_group_size = 7680000;
2863 if (htab->has_17bit_branch || htab->multi_subspace)
2864 stub_group_size = 240000;
2865 if (htab->has_12bit_branch)
2866 stub_group_size = 7500;
2868 else
2870 stub_group_size = 6971392;
2871 if (htab->has_17bit_branch || htab->multi_subspace)
2872 stub_group_size = 217856;
2873 if (htab->has_12bit_branch)
2874 stub_group_size = 6808;
2878 group_sections (htab, stub_group_size, stubs_always_before_branch);
2880 switch (get_local_syms (output_bfd, info->input_bfds, info))
2882 default:
2883 if (htab->all_local_syms)
2884 goto error_ret_free_local;
2885 return FALSE;
2887 case 0:
2888 stub_changed = FALSE;
2889 break;
2891 case 1:
2892 stub_changed = TRUE;
2893 break;
2896 while (1)
2898 bfd *input_bfd;
2899 unsigned int bfd_indx;
2900 asection *stub_sec;
2902 for (input_bfd = info->input_bfds, bfd_indx = 0;
2903 input_bfd != NULL;
2904 input_bfd = input_bfd->link_next, bfd_indx++)
2906 Elf_Internal_Shdr *symtab_hdr;
2907 asection *section;
2908 Elf_Internal_Sym *local_syms;
2910 /* We'll need the symbol table in a second. */
2911 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2912 if (symtab_hdr->sh_info == 0)
2913 continue;
2915 local_syms = htab->all_local_syms[bfd_indx];
2917 /* Walk over each section attached to the input bfd. */
2918 for (section = input_bfd->sections;
2919 section != NULL;
2920 section = section->next)
2922 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2924 /* If there aren't any relocs, then there's nothing more
2925 to do. */
2926 if ((section->flags & SEC_RELOC) == 0
2927 || section->reloc_count == 0)
2928 continue;
2930 /* If this section is a link-once section that will be
2931 discarded, then don't create any stubs. */
2932 if (section->output_section == NULL
2933 || section->output_section->owner != output_bfd)
2934 continue;
2936 /* Get the relocs. */
2937 internal_relocs
2938 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2939 info->keep_memory);
2940 if (internal_relocs == NULL)
2941 goto error_ret_free_local;
2943 /* Now examine each relocation. */
2944 irela = internal_relocs;
2945 irelaend = irela + section->reloc_count;
2946 for (; irela < irelaend; irela++)
2948 unsigned int r_type, r_indx;
2949 enum elf32_hppa_stub_type stub_type;
2950 struct elf32_hppa_stub_hash_entry *hsh;
2951 asection *sym_sec;
2952 bfd_vma sym_value;
2953 bfd_vma destination;
2954 struct elf32_hppa_link_hash_entry *hh;
2955 char *stub_name;
2956 const asection *id_sec;
2958 r_type = ELF32_R_TYPE (irela->r_info);
2959 r_indx = ELF32_R_SYM (irela->r_info);
2961 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2963 bfd_set_error (bfd_error_bad_value);
2964 error_ret_free_internal:
2965 if (elf_section_data (section)->relocs == NULL)
2966 free (internal_relocs);
2967 goto error_ret_free_local;
2970 /* Only look for stubs on call instructions. */
2971 if (r_type != (unsigned int) R_PARISC_PCREL12F
2972 && r_type != (unsigned int) R_PARISC_PCREL17F
2973 && r_type != (unsigned int) R_PARISC_PCREL22F)
2974 continue;
2976 /* Now determine the call target, its name, value,
2977 section. */
2978 sym_sec = NULL;
2979 sym_value = 0;
2980 destination = 0;
2981 hh = NULL;
2982 if (r_indx < symtab_hdr->sh_info)
2984 /* It's a local symbol. */
2985 Elf_Internal_Sym *sym;
2986 Elf_Internal_Shdr *hdr;
2987 unsigned int shndx;
2989 sym = local_syms + r_indx;
2990 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2991 sym_value = sym->st_value;
2992 shndx = sym->st_shndx;
2993 if (shndx < elf_numsections (input_bfd))
2995 hdr = elf_elfsections (input_bfd)[shndx];
2996 sym_sec = hdr->bfd_section;
2997 destination = (sym_value + irela->r_addend
2998 + sym_sec->output_offset
2999 + sym_sec->output_section->vma);
3002 else
3004 /* It's an external symbol. */
3005 int e_indx;
3007 e_indx = r_indx - symtab_hdr->sh_info;
3008 hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
3010 while (hh->eh.root.type == bfd_link_hash_indirect
3011 || hh->eh.root.type == bfd_link_hash_warning)
3012 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
3014 if (hh->eh.root.type == bfd_link_hash_defined
3015 || hh->eh.root.type == bfd_link_hash_defweak)
3017 sym_sec = hh->eh.root.u.def.section;
3018 sym_value = hh->eh.root.u.def.value;
3019 if (sym_sec->output_section != NULL)
3020 destination = (sym_value + irela->r_addend
3021 + sym_sec->output_offset
3022 + sym_sec->output_section->vma);
3024 else if (hh->eh.root.type == bfd_link_hash_undefweak)
3026 if (! info->shared)
3027 continue;
3029 else if (hh->eh.root.type == bfd_link_hash_undefined)
3031 if (! (info->unresolved_syms_in_objects == RM_IGNORE
3032 && (ELF_ST_VISIBILITY (hh->eh.other)
3033 == STV_DEFAULT)
3034 && hh->eh.type != STT_PARISC_MILLI))
3035 continue;
3037 else
3039 bfd_set_error (bfd_error_bad_value);
3040 goto error_ret_free_internal;
3044 /* Determine what (if any) linker stub is needed. */
3045 stub_type = hppa_type_of_stub (section, irela, hh,
3046 destination, info);
3047 if (stub_type == hppa_stub_none)
3048 continue;
3050 /* Support for grouping stub sections. */
3051 id_sec = htab->stub_group[section->id].link_sec;
3053 /* Get the name of this stub. */
3054 stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
3055 if (!stub_name)
3056 goto error_ret_free_internal;
3058 hsh = hppa_stub_hash_lookup (&htab->bstab,
3059 stub_name,
3060 FALSE, FALSE);
3061 if (hsh != NULL)
3063 /* The proper stub has already been created. */
3064 free (stub_name);
3065 continue;
3068 hsh = hppa_add_stub (stub_name, section, htab);
3069 if (hsh == NULL)
3071 free (stub_name);
3072 goto error_ret_free_internal;
3075 hsh->target_value = sym_value;
3076 hsh->target_section = sym_sec;
3077 hsh->stub_type = stub_type;
3078 if (info->shared)
3080 if (stub_type == hppa_stub_import)
3081 hsh->stub_type = hppa_stub_import_shared;
3082 else if (stub_type == hppa_stub_long_branch)
3083 hsh->stub_type = hppa_stub_long_branch_shared;
3085 hsh->hh = hh;
3086 stub_changed = TRUE;
3089 /* We're done with the internal relocs, free them. */
3090 if (elf_section_data (section)->relocs == NULL)
3091 free (internal_relocs);
3095 if (!stub_changed)
3096 break;
3098 /* OK, we've added some stubs. Find out the new size of the
3099 stub sections. */
3100 for (stub_sec = htab->stub_bfd->sections;
3101 stub_sec != NULL;
3102 stub_sec = stub_sec->next)
3103 stub_sec->size = 0;
3105 bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
3107 /* Ask the linker to do its stuff. */
3108 (*htab->layout_sections_again) ();
3109 stub_changed = FALSE;
3112 free (htab->all_local_syms);
3113 return TRUE;
3115 error_ret_free_local:
3116 free (htab->all_local_syms);
3117 return FALSE;
3120 /* For a final link, this function is called after we have sized the
3121 stubs to provide a value for __gp. */
3123 bfd_boolean
3124 elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
3126 struct bfd_link_hash_entry *h;
3127 asection *sec = NULL;
3128 bfd_vma gp_val = 0;
3129 struct elf32_hppa_link_hash_table *htab;
3131 htab = hppa_link_hash_table (info);
3132 if (htab == NULL)
3133 return FALSE;
3135 h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3137 if (h != NULL
3138 && (h->type == bfd_link_hash_defined
3139 || h->type == bfd_link_hash_defweak))
3141 gp_val = h->u.def.value;
3142 sec = h->u.def.section;
3144 else
3146 asection *splt = bfd_get_section_by_name (abfd, ".plt");
3147 asection *sgot = bfd_get_section_by_name (abfd, ".got");
3149 /* Choose to point our LTP at, in this order, one of .plt, .got,
3150 or .data, if these sections exist. In the case of choosing
3151 .plt try to make the LTP ideal for addressing anywhere in the
3152 .plt or .got with a 14 bit signed offset. Typically, the end
3153 of the .plt is the start of the .got, so choose .plt + 0x2000
3154 if either the .plt or .got is larger than 0x2000. If both
3155 the .plt and .got are smaller than 0x2000, choose the end of
3156 the .plt section. */
3157 sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3158 ? NULL : splt;
3159 if (sec != NULL)
3161 gp_val = sec->size;
3162 if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3164 gp_val = 0x2000;
3167 else
3169 sec = sgot;
3170 if (sec != NULL)
3172 if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3174 /* We know we don't have a .plt. If .got is large,
3175 offset our LTP. */
3176 if (sec->size > 0x2000)
3177 gp_val = 0x2000;
3180 else
3182 /* No .plt or .got. Who cares what the LTP is? */
3183 sec = bfd_get_section_by_name (abfd, ".data");
3187 if (h != NULL)
3189 h->type = bfd_link_hash_defined;
3190 h->u.def.value = gp_val;
3191 if (sec != NULL)
3192 h->u.def.section = sec;
3193 else
3194 h->u.def.section = bfd_abs_section_ptr;
3198 if (sec != NULL && sec->output_section != NULL)
3199 gp_val += sec->output_section->vma + sec->output_offset;
3201 elf_gp (abfd) = gp_val;
3202 return TRUE;
3205 /* Build all the stubs associated with the current output file. The
3206 stubs are kept in a hash table attached to the main linker hash
3207 table. We also set up the .plt entries for statically linked PIC
3208 functions here. This function is called via hppaelf_finish in the
3209 linker. */
3211 bfd_boolean
3212 elf32_hppa_build_stubs (struct bfd_link_info *info)
3214 asection *stub_sec;
3215 struct bfd_hash_table *table;
3216 struct elf32_hppa_link_hash_table *htab;
3218 htab = hppa_link_hash_table (info);
3219 if (htab == NULL)
3220 return FALSE;
3222 for (stub_sec = htab->stub_bfd->sections;
3223 stub_sec != NULL;
3224 stub_sec = stub_sec->next)
3226 bfd_size_type size;
3228 /* Allocate memory to hold the linker stubs. */
3229 size = stub_sec->size;
3230 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3231 if (stub_sec->contents == NULL && size != 0)
3232 return FALSE;
3233 stub_sec->size = 0;
3236 /* Build the stubs as directed by the stub hash table. */
3237 table = &htab->bstab;
3238 bfd_hash_traverse (table, hppa_build_one_stub, info);
3240 return TRUE;
3243 /* Return the base vma address which should be subtracted from the real
3244 address when resolving a dtpoff relocation.
3245 This is PT_TLS segment p_vaddr. */
3247 static bfd_vma
3248 dtpoff_base (struct bfd_link_info *info)
3250 /* If tls_sec is NULL, we should have signalled an error already. */
3251 if (elf_hash_table (info)->tls_sec == NULL)
3252 return 0;
3253 return elf_hash_table (info)->tls_sec->vma;
3256 /* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3258 static bfd_vma
3259 tpoff (struct bfd_link_info *info, bfd_vma address)
3261 struct elf_link_hash_table *htab = elf_hash_table (info);
3263 /* If tls_sec is NULL, we should have signalled an error already. */
3264 if (htab->tls_sec == NULL)
3265 return 0;
3266 /* hppa TLS ABI is variant I and static TLS block start just after
3267 tcbhead structure which has 2 pointer fields. */
3268 return (address - htab->tls_sec->vma
3269 + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3272 /* Perform a final link. */
3274 static bfd_boolean
3275 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3277 /* Invoke the regular ELF linker to do all the work. */
3278 if (!bfd_elf_final_link (abfd, info))
3279 return FALSE;
3281 /* If we're producing a final executable, sort the contents of the
3282 unwind section. */
3283 if (info->relocatable)
3284 return TRUE;
3286 return elf_hppa_sort_unwind (abfd);
3289 /* Record the lowest address for the data and text segments. */
3291 static void
3292 hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3294 struct elf32_hppa_link_hash_table *htab;
3296 htab = (struct elf32_hppa_link_hash_table*) data;
3297 if (htab == NULL)
3298 return;
3300 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3302 bfd_vma value;
3303 Elf_Internal_Phdr *p;
3305 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3306 BFD_ASSERT (p != NULL);
3307 value = p->p_vaddr;
3309 if ((section->flags & SEC_READONLY) != 0)
3311 if (value < htab->text_segment_base)
3312 htab->text_segment_base = value;
3314 else
3316 if (value < htab->data_segment_base)
3317 htab->data_segment_base = value;
3322 /* Perform a relocation as part of a final link. */
3324 static bfd_reloc_status_type
3325 final_link_relocate (asection *input_section,
3326 bfd_byte *contents,
3327 const Elf_Internal_Rela *rela,
3328 bfd_vma value,
3329 struct elf32_hppa_link_hash_table *htab,
3330 asection *sym_sec,
3331 struct elf32_hppa_link_hash_entry *hh,
3332 struct bfd_link_info *info)
3334 int insn;
3335 unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3336 unsigned int orig_r_type = r_type;
3337 reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3338 int r_format = howto->bitsize;
3339 enum hppa_reloc_field_selector_type_alt r_field;
3340 bfd *input_bfd = input_section->owner;
3341 bfd_vma offset = rela->r_offset;
3342 bfd_vma max_branch_offset = 0;
3343 bfd_byte *hit_data = contents + offset;
3344 bfd_signed_vma addend = rela->r_addend;
3345 bfd_vma location;
3346 struct elf32_hppa_stub_hash_entry *hsh = NULL;
3347 int val;
3349 if (r_type == R_PARISC_NONE)
3350 return bfd_reloc_ok;
3352 insn = bfd_get_32 (input_bfd, hit_data);
3354 /* Find out where we are and where we're going. */
3355 location = (offset +
3356 input_section->output_offset +
3357 input_section->output_section->vma);
3359 /* If we are not building a shared library, convert DLTIND relocs to
3360 DPREL relocs. */
3361 if (!info->shared)
3363 switch (r_type)
3365 case R_PARISC_DLTIND21L:
3366 r_type = R_PARISC_DPREL21L;
3367 break;
3369 case R_PARISC_DLTIND14R:
3370 r_type = R_PARISC_DPREL14R;
3371 break;
3373 case R_PARISC_DLTIND14F:
3374 r_type = R_PARISC_DPREL14F;
3375 break;
3379 switch (r_type)
3381 case R_PARISC_PCREL12F:
3382 case R_PARISC_PCREL17F:
3383 case R_PARISC_PCREL22F:
3384 /* If this call should go via the plt, find the import stub in
3385 the stub hash. */
3386 if (sym_sec == NULL
3387 || sym_sec->output_section == NULL
3388 || (hh != NULL
3389 && hh->eh.plt.offset != (bfd_vma) -1
3390 && hh->eh.dynindx != -1
3391 && !hh->plabel
3392 && (info->shared
3393 || !hh->eh.def_regular
3394 || hh->eh.root.type == bfd_link_hash_defweak)))
3396 hsh = hppa_get_stub_entry (input_section, sym_sec,
3397 hh, rela, htab);
3398 if (hsh != NULL)
3400 value = (hsh->stub_offset
3401 + hsh->stub_sec->output_offset
3402 + hsh->stub_sec->output_section->vma);
3403 addend = 0;
3405 else if (sym_sec == NULL && hh != NULL
3406 && hh->eh.root.type == bfd_link_hash_undefweak)
3408 /* It's OK if undefined weak. Calls to undefined weak
3409 symbols behave as if the "called" function
3410 immediately returns. We can thus call to a weak
3411 function without first checking whether the function
3412 is defined. */
3413 value = location;
3414 addend = 8;
3416 else
3417 return bfd_reloc_undefined;
3419 /* Fall thru. */
3421 case R_PARISC_PCREL21L:
3422 case R_PARISC_PCREL17C:
3423 case R_PARISC_PCREL17R:
3424 case R_PARISC_PCREL14R:
3425 case R_PARISC_PCREL14F:
3426 case R_PARISC_PCREL32:
3427 /* Make it a pc relative offset. */
3428 value -= location;
3429 addend -= 8;
3430 break;
3432 case R_PARISC_DPREL21L:
3433 case R_PARISC_DPREL14R:
3434 case R_PARISC_DPREL14F:
3435 case R_PARISC_TLS_GD21L:
3436 case R_PARISC_TLS_LDM21L:
3437 case R_PARISC_TLS_IE21L:
3438 /* Convert instructions that use the linkage table pointer (r19) to
3439 instructions that use the global data pointer (dp). This is the
3440 most efficient way of using PIC code in an incomplete executable,
3441 but the user must follow the standard runtime conventions for
3442 accessing data for this to work. */
3443 if (orig_r_type == R_PARISC_DLTIND21L
3444 || (!info->shared
3445 && (r_type == R_PARISC_TLS_GD21L
3446 || r_type == R_PARISC_TLS_LDM21L
3447 || r_type == R_PARISC_TLS_IE21L)))
3449 /* Convert addil instructions if the original reloc was a
3450 DLTIND21L. GCC sometimes uses a register other than r19 for
3451 the operation, so we must convert any addil instruction
3452 that uses this relocation. */
3453 if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3454 insn = ADDIL_DP;
3455 else
3456 /* We must have a ldil instruction. It's too hard to find
3457 and convert the associated add instruction, so issue an
3458 error. */
3459 (*_bfd_error_handler)
3460 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3461 input_bfd,
3462 input_section,
3463 (long) offset,
3464 howto->name,
3465 insn);
3467 else if (orig_r_type == R_PARISC_DLTIND14F)
3469 /* This must be a format 1 load/store. Change the base
3470 register to dp. */
3471 insn = (insn & 0xfc1ffff) | (27 << 21);
3474 /* For all the DP relative relocations, we need to examine the symbol's
3475 section. If it has no section or if it's a code section, then
3476 "data pointer relative" makes no sense. In that case we don't
3477 adjust the "value", and for 21 bit addil instructions, we change the
3478 source addend register from %dp to %r0. This situation commonly
3479 arises for undefined weak symbols and when a variable's "constness"
3480 is declared differently from the way the variable is defined. For
3481 instance: "extern int foo" with foo defined as "const int foo". */
3482 if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3484 if ((insn & ((0x3f << 26) | (0x1f << 21)))
3485 == (((int) OP_ADDIL << 26) | (27 << 21)))
3487 insn &= ~ (0x1f << 21);
3489 /* Now try to make things easy for the dynamic linker. */
3491 break;
3493 /* Fall thru. */
3495 case R_PARISC_DLTIND21L:
3496 case R_PARISC_DLTIND14R:
3497 case R_PARISC_DLTIND14F:
3498 case R_PARISC_TLS_GD14R:
3499 case R_PARISC_TLS_LDM14R:
3500 case R_PARISC_TLS_IE14R:
3501 value -= elf_gp (input_section->output_section->owner);
3502 break;
3504 case R_PARISC_SEGREL32:
3505 if ((sym_sec->flags & SEC_CODE) != 0)
3506 value -= htab->text_segment_base;
3507 else
3508 value -= htab->data_segment_base;
3509 break;
3511 default:
3512 break;
3515 switch (r_type)
3517 case R_PARISC_DIR32:
3518 case R_PARISC_DIR14F:
3519 case R_PARISC_DIR17F:
3520 case R_PARISC_PCREL17C:
3521 case R_PARISC_PCREL14F:
3522 case R_PARISC_PCREL32:
3523 case R_PARISC_DPREL14F:
3524 case R_PARISC_PLABEL32:
3525 case R_PARISC_DLTIND14F:
3526 case R_PARISC_SEGBASE:
3527 case R_PARISC_SEGREL32:
3528 case R_PARISC_TLS_DTPMOD32:
3529 case R_PARISC_TLS_DTPOFF32:
3530 case R_PARISC_TLS_TPREL32:
3531 r_field = e_fsel;
3532 break;
3534 case R_PARISC_DLTIND21L:
3535 case R_PARISC_PCREL21L:
3536 case R_PARISC_PLABEL21L:
3537 r_field = e_lsel;
3538 break;
3540 case R_PARISC_DIR21L:
3541 case R_PARISC_DPREL21L:
3542 case R_PARISC_TLS_GD21L:
3543 case R_PARISC_TLS_LDM21L:
3544 case R_PARISC_TLS_LDO21L:
3545 case R_PARISC_TLS_IE21L:
3546 case R_PARISC_TLS_LE21L:
3547 r_field = e_lrsel;
3548 break;
3550 case R_PARISC_PCREL17R:
3551 case R_PARISC_PCREL14R:
3552 case R_PARISC_PLABEL14R:
3553 case R_PARISC_DLTIND14R:
3554 r_field = e_rsel;
3555 break;
3557 case R_PARISC_DIR17R:
3558 case R_PARISC_DIR14R:
3559 case R_PARISC_DPREL14R:
3560 case R_PARISC_TLS_GD14R:
3561 case R_PARISC_TLS_LDM14R:
3562 case R_PARISC_TLS_LDO14R:
3563 case R_PARISC_TLS_IE14R:
3564 case R_PARISC_TLS_LE14R:
3565 r_field = e_rrsel;
3566 break;
3568 case R_PARISC_PCREL12F:
3569 case R_PARISC_PCREL17F:
3570 case R_PARISC_PCREL22F:
3571 r_field = e_fsel;
3573 if (r_type == (unsigned int) R_PARISC_PCREL17F)
3575 max_branch_offset = (1 << (17-1)) << 2;
3577 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3579 max_branch_offset = (1 << (12-1)) << 2;
3581 else
3583 max_branch_offset = (1 << (22-1)) << 2;
3586 /* sym_sec is NULL on undefined weak syms or when shared on
3587 undefined syms. We've already checked for a stub for the
3588 shared undefined case. */
3589 if (sym_sec == NULL)
3590 break;
3592 /* If the branch is out of reach, then redirect the
3593 call to the local stub for this function. */
3594 if (value + addend + max_branch_offset >= 2*max_branch_offset)
3596 hsh = hppa_get_stub_entry (input_section, sym_sec,
3597 hh, rela, htab);
3598 if (hsh == NULL)
3599 return bfd_reloc_undefined;
3601 /* Munge up the value and addend so that we call the stub
3602 rather than the procedure directly. */
3603 value = (hsh->stub_offset
3604 + hsh->stub_sec->output_offset
3605 + hsh->stub_sec->output_section->vma
3606 - location);
3607 addend = -8;
3609 break;
3611 /* Something we don't know how to handle. */
3612 default:
3613 return bfd_reloc_notsupported;
3616 /* Make sure we can reach the stub. */
3617 if (max_branch_offset != 0
3618 && value + addend + max_branch_offset >= 2*max_branch_offset)
3620 (*_bfd_error_handler)
3621 (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3622 input_bfd,
3623 input_section,
3624 (long) offset,
3625 hsh->bh_root.string);
3626 bfd_set_error (bfd_error_bad_value);
3627 return bfd_reloc_notsupported;
3630 val = hppa_field_adjust (value, addend, r_field);
3632 switch (r_type)
3634 case R_PARISC_PCREL12F:
3635 case R_PARISC_PCREL17C:
3636 case R_PARISC_PCREL17F:
3637 case R_PARISC_PCREL17R:
3638 case R_PARISC_PCREL22F:
3639 case R_PARISC_DIR17F:
3640 case R_PARISC_DIR17R:
3641 /* This is a branch. Divide the offset by four.
3642 Note that we need to decide whether it's a branch or
3643 otherwise by inspecting the reloc. Inspecting insn won't
3644 work as insn might be from a .word directive. */
3645 val >>= 2;
3646 break;
3648 default:
3649 break;
3652 insn = hppa_rebuild_insn (insn, val, r_format);
3654 /* Update the instruction word. */
3655 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3656 return bfd_reloc_ok;
3659 /* Relocate an HPPA ELF section. */
3661 static bfd_boolean
3662 elf32_hppa_relocate_section (bfd *output_bfd,
3663 struct bfd_link_info *info,
3664 bfd *input_bfd,
3665 asection *input_section,
3666 bfd_byte *contents,
3667 Elf_Internal_Rela *relocs,
3668 Elf_Internal_Sym *local_syms,
3669 asection **local_sections)
3671 bfd_vma *local_got_offsets;
3672 struct elf32_hppa_link_hash_table *htab;
3673 Elf_Internal_Shdr *symtab_hdr;
3674 Elf_Internal_Rela *rela;
3675 Elf_Internal_Rela *relend;
3677 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3679 htab = hppa_link_hash_table (info);
3680 if (htab == NULL)
3681 return FALSE;
3683 local_got_offsets = elf_local_got_offsets (input_bfd);
3685 rela = relocs;
3686 relend = relocs + input_section->reloc_count;
3687 for (; rela < relend; rela++)
3689 unsigned int r_type;
3690 reloc_howto_type *howto;
3691 unsigned int r_symndx;
3692 struct elf32_hppa_link_hash_entry *hh;
3693 Elf_Internal_Sym *sym;
3694 asection *sym_sec;
3695 bfd_vma relocation;
3696 bfd_reloc_status_type rstatus;
3697 const char *sym_name;
3698 bfd_boolean plabel;
3699 bfd_boolean warned_undef;
3701 r_type = ELF32_R_TYPE (rela->r_info);
3702 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3704 bfd_set_error (bfd_error_bad_value);
3705 return FALSE;
3707 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3708 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3709 continue;
3711 r_symndx = ELF32_R_SYM (rela->r_info);
3712 hh = NULL;
3713 sym = NULL;
3714 sym_sec = NULL;
3715 warned_undef = FALSE;
3716 if (r_symndx < symtab_hdr->sh_info)
3718 /* This is a local symbol, h defaults to NULL. */
3719 sym = local_syms + r_symndx;
3720 sym_sec = local_sections[r_symndx];
3721 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3723 else
3725 struct elf_link_hash_entry *eh;
3726 bfd_boolean unresolved_reloc;
3727 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3729 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3730 r_symndx, symtab_hdr, sym_hashes,
3731 eh, sym_sec, relocation,
3732 unresolved_reloc, warned_undef);
3734 if (!info->relocatable
3735 && relocation == 0
3736 && eh->root.type != bfd_link_hash_defined
3737 && eh->root.type != bfd_link_hash_defweak
3738 && eh->root.type != bfd_link_hash_undefweak)
3740 if (info->unresolved_syms_in_objects == RM_IGNORE
3741 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3742 && eh->type == STT_PARISC_MILLI)
3744 if (! info->callbacks->undefined_symbol
3745 (info, eh_name (eh), input_bfd,
3746 input_section, rela->r_offset, FALSE))
3747 return FALSE;
3748 warned_undef = TRUE;
3751 hh = hppa_elf_hash_entry (eh);
3754 if (sym_sec != NULL && elf_discarded_section (sym_sec))
3756 /* For relocs against symbols from removed linkonce
3757 sections, or sections discarded by a linker script,
3758 we just want the section contents zeroed. Avoid any
3759 special processing. */
3760 _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
3761 contents + rela->r_offset);
3762 rela->r_info = 0;
3763 rela->r_addend = 0;
3764 continue;
3767 if (info->relocatable)
3768 continue;
3770 /* Do any required modifications to the relocation value, and
3771 determine what types of dynamic info we need to output, if
3772 any. */
3773 plabel = 0;
3774 switch (r_type)
3776 case R_PARISC_DLTIND14F:
3777 case R_PARISC_DLTIND14R:
3778 case R_PARISC_DLTIND21L:
3780 bfd_vma off;
3781 bfd_boolean do_got = 0;
3783 /* Relocation is to the entry for this symbol in the
3784 global offset table. */
3785 if (hh != NULL)
3787 bfd_boolean dyn;
3789 off = hh->eh.got.offset;
3790 dyn = htab->etab.dynamic_sections_created;
3791 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3792 &hh->eh))
3794 /* If we aren't going to call finish_dynamic_symbol,
3795 then we need to handle initialisation of the .got
3796 entry and create needed relocs here. Since the
3797 offset must always be a multiple of 4, we use the
3798 least significant bit to record whether we have
3799 initialised it already. */
3800 if ((off & 1) != 0)
3801 off &= ~1;
3802 else
3804 hh->eh.got.offset |= 1;
3805 do_got = 1;
3809 else
3811 /* Local symbol case. */
3812 if (local_got_offsets == NULL)
3813 abort ();
3815 off = local_got_offsets[r_symndx];
3817 /* The offset must always be a multiple of 4. We use
3818 the least significant bit to record whether we have
3819 already generated the necessary reloc. */
3820 if ((off & 1) != 0)
3821 off &= ~1;
3822 else
3824 local_got_offsets[r_symndx] |= 1;
3825 do_got = 1;
3829 if (do_got)
3831 if (info->shared)
3833 /* Output a dynamic relocation for this GOT entry.
3834 In this case it is relative to the base of the
3835 object because the symbol index is zero. */
3836 Elf_Internal_Rela outrel;
3837 bfd_byte *loc;
3838 asection *sec = htab->srelgot;
3840 outrel.r_offset = (off
3841 + htab->sgot->output_offset
3842 + htab->sgot->output_section->vma);
3843 outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3844 outrel.r_addend = relocation;
3845 loc = sec->contents;
3846 loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3847 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3849 else
3850 bfd_put_32 (output_bfd, relocation,
3851 htab->sgot->contents + off);
3854 if (off >= (bfd_vma) -2)
3855 abort ();
3857 /* Add the base of the GOT to the relocation value. */
3858 relocation = (off
3859 + htab->sgot->output_offset
3860 + htab->sgot->output_section->vma);
3862 break;
3864 case R_PARISC_SEGREL32:
3865 /* If this is the first SEGREL relocation, then initialize
3866 the segment base values. */
3867 if (htab->text_segment_base == (bfd_vma) -1)
3868 bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3869 break;
3871 case R_PARISC_PLABEL14R:
3872 case R_PARISC_PLABEL21L:
3873 case R_PARISC_PLABEL32:
3874 if (htab->etab.dynamic_sections_created)
3876 bfd_vma off;
3877 bfd_boolean do_plt = 0;
3878 /* If we have a global symbol with a PLT slot, then
3879 redirect this relocation to it. */
3880 if (hh != NULL)
3882 off = hh->eh.plt.offset;
3883 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3884 &hh->eh))
3886 /* In a non-shared link, adjust_dynamic_symbols
3887 isn't called for symbols forced local. We
3888 need to write out the plt entry here. */
3889 if ((off & 1) != 0)
3890 off &= ~1;
3891 else
3893 hh->eh.plt.offset |= 1;
3894 do_plt = 1;
3898 else
3900 bfd_vma *local_plt_offsets;
3902 if (local_got_offsets == NULL)
3903 abort ();
3905 local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3906 off = local_plt_offsets[r_symndx];
3908 /* As for the local .got entry case, we use the last
3909 bit to record whether we've already initialised
3910 this local .plt entry. */
3911 if ((off & 1) != 0)
3912 off &= ~1;
3913 else
3915 local_plt_offsets[r_symndx] |= 1;
3916 do_plt = 1;
3920 if (do_plt)
3922 if (info->shared)
3924 /* Output a dynamic IPLT relocation for this
3925 PLT entry. */
3926 Elf_Internal_Rela outrel;
3927 bfd_byte *loc;
3928 asection *s = htab->srelplt;
3930 outrel.r_offset = (off
3931 + htab->splt->output_offset
3932 + htab->splt->output_section->vma);
3933 outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3934 outrel.r_addend = relocation;
3935 loc = s->contents;
3936 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3937 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3939 else
3941 bfd_put_32 (output_bfd,
3942 relocation,
3943 htab->splt->contents + off);
3944 bfd_put_32 (output_bfd,
3945 elf_gp (htab->splt->output_section->owner),
3946 htab->splt->contents + off + 4);
3950 if (off >= (bfd_vma) -2)
3951 abort ();
3953 /* PLABELs contain function pointers. Relocation is to
3954 the entry for the function in the .plt. The magic +2
3955 offset signals to $$dyncall that the function pointer
3956 is in the .plt and thus has a gp pointer too.
3957 Exception: Undefined PLABELs should have a value of
3958 zero. */
3959 if (hh == NULL
3960 || (hh->eh.root.type != bfd_link_hash_undefweak
3961 && hh->eh.root.type != bfd_link_hash_undefined))
3963 relocation = (off
3964 + htab->splt->output_offset
3965 + htab->splt->output_section->vma
3966 + 2);
3968 plabel = 1;
3970 /* Fall through and possibly emit a dynamic relocation. */
3972 case R_PARISC_DIR17F:
3973 case R_PARISC_DIR17R:
3974 case R_PARISC_DIR14F:
3975 case R_PARISC_DIR14R:
3976 case R_PARISC_DIR21L:
3977 case R_PARISC_DPREL14F:
3978 case R_PARISC_DPREL14R:
3979 case R_PARISC_DPREL21L:
3980 case R_PARISC_DIR32:
3981 if ((input_section->flags & SEC_ALLOC) == 0)
3982 break;
3984 /* The reloc types handled here and this conditional
3985 expression must match the code in ..check_relocs and
3986 allocate_dynrelocs. ie. We need exactly the same condition
3987 as in ..check_relocs, with some extra conditions (dynindx
3988 test in this case) to cater for relocs removed by
3989 allocate_dynrelocs. If you squint, the non-shared test
3990 here does indeed match the one in ..check_relocs, the
3991 difference being that here we test DEF_DYNAMIC as well as
3992 !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3993 which is why we can't use just that test here.
3994 Conversely, DEF_DYNAMIC can't be used in check_relocs as
3995 there all files have not been loaded. */
3996 if ((info->shared
3997 && (hh == NULL
3998 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3999 || hh->eh.root.type != bfd_link_hash_undefweak)
4000 && (IS_ABSOLUTE_RELOC (r_type)
4001 || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
4002 || (!info->shared
4003 && hh != NULL
4004 && hh->eh.dynindx != -1
4005 && !hh->eh.non_got_ref
4006 && ((ELIMINATE_COPY_RELOCS
4007 && hh->eh.def_dynamic
4008 && !hh->eh.def_regular)
4009 || hh->eh.root.type == bfd_link_hash_undefweak
4010 || hh->eh.root.type == bfd_link_hash_undefined)))
4012 Elf_Internal_Rela outrel;
4013 bfd_boolean skip;
4014 asection *sreloc;
4015 bfd_byte *loc;
4017 /* When generating a shared object, these relocations
4018 are copied into the output file to be resolved at run
4019 time. */
4021 outrel.r_addend = rela->r_addend;
4022 outrel.r_offset =
4023 _bfd_elf_section_offset (output_bfd, info, input_section,
4024 rela->r_offset);
4025 skip = (outrel.r_offset == (bfd_vma) -1
4026 || outrel.r_offset == (bfd_vma) -2);
4027 outrel.r_offset += (input_section->output_offset
4028 + input_section->output_section->vma);
4030 if (skip)
4032 memset (&outrel, 0, sizeof (outrel));
4034 else if (hh != NULL
4035 && hh->eh.dynindx != -1
4036 && (plabel
4037 || !IS_ABSOLUTE_RELOC (r_type)
4038 || !info->shared
4039 || !info->symbolic
4040 || !hh->eh.def_regular))
4042 outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4044 else /* It's a local symbol, or one marked to become local. */
4046 int indx = 0;
4048 /* Add the absolute offset of the symbol. */
4049 outrel.r_addend += relocation;
4051 /* Global plabels need to be processed by the
4052 dynamic linker so that functions have at most one
4053 fptr. For this reason, we need to differentiate
4054 between global and local plabels, which we do by
4055 providing the function symbol for a global plabel
4056 reloc, and no symbol for local plabels. */
4057 if (! plabel
4058 && sym_sec != NULL
4059 && sym_sec->output_section != NULL
4060 && ! bfd_is_abs_section (sym_sec))
4062 asection *osec;
4064 osec = sym_sec->output_section;
4065 indx = elf_section_data (osec)->dynindx;
4066 if (indx == 0)
4068 osec = htab->etab.text_index_section;
4069 indx = elf_section_data (osec)->dynindx;
4071 BFD_ASSERT (indx != 0);
4073 /* We are turning this relocation into one
4074 against a section symbol, so subtract out the
4075 output section's address but not the offset
4076 of the input section in the output section. */
4077 outrel.r_addend -= osec->vma;
4080 outrel.r_info = ELF32_R_INFO (indx, r_type);
4082 sreloc = elf_section_data (input_section)->sreloc;
4083 if (sreloc == NULL)
4084 abort ();
4086 loc = sreloc->contents;
4087 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4088 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4090 break;
4092 case R_PARISC_TLS_LDM21L:
4093 case R_PARISC_TLS_LDM14R:
4095 bfd_vma off;
4097 off = htab->tls_ldm_got.offset;
4098 if (off & 1)
4099 off &= ~1;
4100 else
4102 Elf_Internal_Rela outrel;
4103 bfd_byte *loc;
4105 outrel.r_offset = (off
4106 + htab->sgot->output_section->vma
4107 + htab->sgot->output_offset);
4108 outrel.r_addend = 0;
4109 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4110 loc = htab->srelgot->contents;
4111 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4113 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4114 htab->tls_ldm_got.offset |= 1;
4117 /* Add the base of the GOT to the relocation value. */
4118 relocation = (off
4119 + htab->sgot->output_offset
4120 + htab->sgot->output_section->vma);
4122 break;
4125 case R_PARISC_TLS_LDO21L:
4126 case R_PARISC_TLS_LDO14R:
4127 relocation -= dtpoff_base (info);
4128 break;
4130 case R_PARISC_TLS_GD21L:
4131 case R_PARISC_TLS_GD14R:
4132 case R_PARISC_TLS_IE21L:
4133 case R_PARISC_TLS_IE14R:
4135 bfd_vma off;
4136 int indx;
4137 char tls_type;
4139 indx = 0;
4140 if (hh != NULL)
4142 bfd_boolean dyn;
4143 dyn = htab->etab.dynamic_sections_created;
4145 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4146 && (!info->shared
4147 || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4149 indx = hh->eh.dynindx;
4151 off = hh->eh.got.offset;
4152 tls_type = hh->tls_type;
4154 else
4156 off = local_got_offsets[r_symndx];
4157 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4160 if (tls_type == GOT_UNKNOWN)
4161 abort ();
4163 if ((off & 1) != 0)
4164 off &= ~1;
4165 else
4167 bfd_boolean need_relocs = FALSE;
4168 Elf_Internal_Rela outrel;
4169 bfd_byte *loc = NULL;
4170 int cur_off = off;
4172 /* The GOT entries have not been initialized yet. Do it
4173 now, and emit any relocations. If both an IE GOT and a
4174 GD GOT are necessary, we emit the GD first. */
4176 if ((info->shared || indx != 0)
4177 && (hh == NULL
4178 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4179 || hh->eh.root.type != bfd_link_hash_undefweak))
4181 need_relocs = TRUE;
4182 loc = htab->srelgot->contents;
4183 /* FIXME (CAO): Should this be reloc_count++ ? */
4184 loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4187 if (tls_type & GOT_TLS_GD)
4189 if (need_relocs)
4191 outrel.r_offset = (cur_off
4192 + htab->sgot->output_section->vma
4193 + htab->sgot->output_offset);
4194 outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4195 outrel.r_addend = 0;
4196 bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4197 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4198 htab->srelgot->reloc_count++;
4199 loc += sizeof (Elf32_External_Rela);
4201 if (indx == 0)
4202 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4203 htab->sgot->contents + cur_off + 4);
4204 else
4206 bfd_put_32 (output_bfd, 0,
4207 htab->sgot->contents + cur_off + 4);
4208 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4209 outrel.r_offset += 4;
4210 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4211 htab->srelgot->reloc_count++;
4212 loc += sizeof (Elf32_External_Rela);
4215 else
4217 /* If we are not emitting relocations for a
4218 general dynamic reference, then we must be in a
4219 static link or an executable link with the
4220 symbol binding locally. Mark it as belonging
4221 to module 1, the executable. */
4222 bfd_put_32 (output_bfd, 1,
4223 htab->sgot->contents + cur_off);
4224 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4225 htab->sgot->contents + cur_off + 4);
4229 cur_off += 8;
4232 if (tls_type & GOT_TLS_IE)
4234 if (need_relocs)
4236 outrel.r_offset = (cur_off
4237 + htab->sgot->output_section->vma
4238 + htab->sgot->output_offset);
4239 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4241 if (indx == 0)
4242 outrel.r_addend = relocation - dtpoff_base (info);
4243 else
4244 outrel.r_addend = 0;
4246 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4247 htab->srelgot->reloc_count++;
4248 loc += sizeof (Elf32_External_Rela);
4250 else
4251 bfd_put_32 (output_bfd, tpoff (info, relocation),
4252 htab->sgot->contents + cur_off);
4254 cur_off += 4;
4257 if (hh != NULL)
4258 hh->eh.got.offset |= 1;
4259 else
4260 local_got_offsets[r_symndx] |= 1;
4263 if ((tls_type & GOT_TLS_GD)
4264 && r_type != R_PARISC_TLS_GD21L
4265 && r_type != R_PARISC_TLS_GD14R)
4266 off += 2 * GOT_ENTRY_SIZE;
4268 /* Add the base of the GOT to the relocation value. */
4269 relocation = (off
4270 + htab->sgot->output_offset
4271 + htab->sgot->output_section->vma);
4273 break;
4276 case R_PARISC_TLS_LE21L:
4277 case R_PARISC_TLS_LE14R:
4279 relocation = tpoff (info, relocation);
4280 break;
4282 break;
4284 default:
4285 break;
4288 rstatus = final_link_relocate (input_section, contents, rela, relocation,
4289 htab, sym_sec, hh, info);
4291 if (rstatus == bfd_reloc_ok)
4292 continue;
4294 if (hh != NULL)
4295 sym_name = hh_name (hh);
4296 else
4298 sym_name = bfd_elf_string_from_elf_section (input_bfd,
4299 symtab_hdr->sh_link,
4300 sym->st_name);
4301 if (sym_name == NULL)
4302 return FALSE;
4303 if (*sym_name == '\0')
4304 sym_name = bfd_section_name (input_bfd, sym_sec);
4307 howto = elf_hppa_howto_table + r_type;
4309 if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4311 if (rstatus == bfd_reloc_notsupported || !warned_undef)
4313 (*_bfd_error_handler)
4314 (_("%B(%A+0x%lx): cannot handle %s for %s"),
4315 input_bfd,
4316 input_section,
4317 (long) rela->r_offset,
4318 howto->name,
4319 sym_name);
4320 bfd_set_error (bfd_error_bad_value);
4321 return FALSE;
4324 else
4326 if (!((*info->callbacks->reloc_overflow)
4327 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4328 (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4329 return FALSE;
4333 return TRUE;
4336 /* Finish up dynamic symbol handling. We set the contents of various
4337 dynamic sections here. */
4339 static bfd_boolean
4340 elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4341 struct bfd_link_info *info,
4342 struct elf_link_hash_entry *eh,
4343 Elf_Internal_Sym *sym)
4345 struct elf32_hppa_link_hash_table *htab;
4346 Elf_Internal_Rela rela;
4347 bfd_byte *loc;
4349 htab = hppa_link_hash_table (info);
4350 if (htab == NULL)
4351 return FALSE;
4353 if (eh->plt.offset != (bfd_vma) -1)
4355 bfd_vma value;
4357 if (eh->plt.offset & 1)
4358 abort ();
4360 /* This symbol has an entry in the procedure linkage table. Set
4361 it up.
4363 The format of a plt entry is
4364 <funcaddr>
4365 <__gp>
4367 value = 0;
4368 if (eh->root.type == bfd_link_hash_defined
4369 || eh->root.type == bfd_link_hash_defweak)
4371 value = eh->root.u.def.value;
4372 if (eh->root.u.def.section->output_section != NULL)
4373 value += (eh->root.u.def.section->output_offset
4374 + eh->root.u.def.section->output_section->vma);
4377 /* Create a dynamic IPLT relocation for this entry. */
4378 rela.r_offset = (eh->plt.offset
4379 + htab->splt->output_offset
4380 + htab->splt->output_section->vma);
4381 if (eh->dynindx != -1)
4383 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4384 rela.r_addend = 0;
4386 else
4388 /* This symbol has been marked to become local, and is
4389 used by a plabel so must be kept in the .plt. */
4390 rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4391 rela.r_addend = value;
4394 loc = htab->srelplt->contents;
4395 loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4396 bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4398 if (!eh->def_regular)
4400 /* Mark the symbol as undefined, rather than as defined in
4401 the .plt section. Leave the value alone. */
4402 sym->st_shndx = SHN_UNDEF;
4406 if (eh->got.offset != (bfd_vma) -1
4407 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4408 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4410 /* This symbol has an entry in the global offset table. Set it
4411 up. */
4413 rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4414 + htab->sgot->output_offset
4415 + htab->sgot->output_section->vma);
4417 /* If this is a -Bsymbolic link and the symbol is defined
4418 locally or was forced to be local because of a version file,
4419 we just want to emit a RELATIVE reloc. The entry in the
4420 global offset table will already have been initialized in the
4421 relocate_section function. */
4422 if (info->shared
4423 && (info->symbolic || eh->dynindx == -1)
4424 && eh->def_regular)
4426 rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4427 rela.r_addend = (eh->root.u.def.value
4428 + eh->root.u.def.section->output_offset
4429 + eh->root.u.def.section->output_section->vma);
4431 else
4433 if ((eh->got.offset & 1) != 0)
4434 abort ();
4436 bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4437 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4438 rela.r_addend = 0;
4441 loc = htab->srelgot->contents;
4442 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4443 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4446 if (eh->needs_copy)
4448 asection *sec;
4450 /* This symbol needs a copy reloc. Set it up. */
4452 if (! (eh->dynindx != -1
4453 && (eh->root.type == bfd_link_hash_defined
4454 || eh->root.type == bfd_link_hash_defweak)))
4455 abort ();
4457 sec = htab->srelbss;
4459 rela.r_offset = (eh->root.u.def.value
4460 + eh->root.u.def.section->output_offset
4461 + eh->root.u.def.section->output_section->vma);
4462 rela.r_addend = 0;
4463 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4464 loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4465 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4468 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4469 if (eh_name (eh)[0] == '_'
4470 && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4471 || eh == htab->etab.hgot))
4473 sym->st_shndx = SHN_ABS;
4476 return TRUE;
4479 /* Used to decide how to sort relocs in an optimal manner for the
4480 dynamic linker, before writing them out. */
4482 static enum elf_reloc_type_class
4483 elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4485 /* Handle TLS relocs first; we don't want them to be marked
4486 relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4487 check below. */
4488 switch ((int) ELF32_R_TYPE (rela->r_info))
4490 case R_PARISC_TLS_DTPMOD32:
4491 case R_PARISC_TLS_DTPOFF32:
4492 case R_PARISC_TLS_TPREL32:
4493 return reloc_class_normal;
4496 if (ELF32_R_SYM (rela->r_info) == 0)
4497 return reloc_class_relative;
4499 switch ((int) ELF32_R_TYPE (rela->r_info))
4501 case R_PARISC_IPLT:
4502 return reloc_class_plt;
4503 case R_PARISC_COPY:
4504 return reloc_class_copy;
4505 default:
4506 return reloc_class_normal;
4510 /* Finish up the dynamic sections. */
4512 static bfd_boolean
4513 elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4514 struct bfd_link_info *info)
4516 bfd *dynobj;
4517 struct elf32_hppa_link_hash_table *htab;
4518 asection *sdyn;
4520 htab = hppa_link_hash_table (info);
4521 if (htab == NULL)
4522 return FALSE;
4524 dynobj = htab->etab.dynobj;
4526 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4528 if (htab->etab.dynamic_sections_created)
4530 Elf32_External_Dyn *dyncon, *dynconend;
4532 if (sdyn == NULL)
4533 abort ();
4535 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4536 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4537 for (; dyncon < dynconend; dyncon++)
4539 Elf_Internal_Dyn dyn;
4540 asection *s;
4542 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4544 switch (dyn.d_tag)
4546 default:
4547 continue;
4549 case DT_PLTGOT:
4550 /* Use PLTGOT to set the GOT register. */
4551 dyn.d_un.d_ptr = elf_gp (output_bfd);
4552 break;
4554 case DT_JMPREL:
4555 s = htab->srelplt;
4556 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4557 break;
4559 case DT_PLTRELSZ:
4560 s = htab->srelplt;
4561 dyn.d_un.d_val = s->size;
4562 break;
4564 case DT_RELASZ:
4565 /* Don't count procedure linkage table relocs in the
4566 overall reloc count. */
4567 s = htab->srelplt;
4568 if (s == NULL)
4569 continue;
4570 dyn.d_un.d_val -= s->size;
4571 break;
4573 case DT_RELA:
4574 /* We may not be using the standard ELF linker script.
4575 If .rela.plt is the first .rela section, we adjust
4576 DT_RELA to not include it. */
4577 s = htab->srelplt;
4578 if (s == NULL)
4579 continue;
4580 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4581 continue;
4582 dyn.d_un.d_ptr += s->size;
4583 break;
4586 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4590 if (htab->sgot != NULL && htab->sgot->size != 0)
4592 /* Fill in the first entry in the global offset table.
4593 We use it to point to our dynamic section, if we have one. */
4594 bfd_put_32 (output_bfd,
4595 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4596 htab->sgot->contents);
4598 /* The second entry is reserved for use by the dynamic linker. */
4599 memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4601 /* Set .got entry size. */
4602 elf_section_data (htab->sgot->output_section)
4603 ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4606 if (htab->splt != NULL && htab->splt->size != 0)
4608 /* Set plt entry size. */
4609 elf_section_data (htab->splt->output_section)
4610 ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4612 if (htab->need_plt_stub)
4614 /* Set up the .plt stub. */
4615 memcpy (htab->splt->contents
4616 + htab->splt->size - sizeof (plt_stub),
4617 plt_stub, sizeof (plt_stub));
4619 if ((htab->splt->output_offset
4620 + htab->splt->output_section->vma
4621 + htab->splt->size)
4622 != (htab->sgot->output_offset
4623 + htab->sgot->output_section->vma))
4625 (*_bfd_error_handler)
4626 (_(".got section not immediately after .plt section"));
4627 return FALSE;
4632 return TRUE;
4635 /* Called when writing out an object file to decide the type of a
4636 symbol. */
4637 static int
4638 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4640 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4641 return STT_PARISC_MILLI;
4642 else
4643 return type;
4646 /* Misc BFD support code. */
4647 #define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4648 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4649 #define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4650 #define elf_info_to_howto elf_hppa_info_to_howto
4651 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4653 /* Stuff for the BFD linker. */
4654 #define bfd_elf32_mkobject elf32_hppa_mkobject
4655 #define bfd_elf32_bfd_final_link elf32_hppa_final_link
4656 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4657 #define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
4658 #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
4659 #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
4660 #define elf_backend_check_relocs elf32_hppa_check_relocs
4661 #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4662 #define elf_backend_fake_sections elf_hppa_fake_sections
4663 #define elf_backend_relocate_section elf32_hppa_relocate_section
4664 #define elf_backend_hide_symbol elf32_hppa_hide_symbol
4665 #define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4666 #define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4667 #define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
4668 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4669 #define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4670 #define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
4671 #define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4672 #define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
4673 #define elf_backend_object_p elf32_hppa_object_p
4674 #define elf_backend_final_write_processing elf_hppa_final_write_processing
4675 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4676 #define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
4677 #define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
4678 #define elf_backend_action_discarded elf_hppa_action_discarded
4680 #define elf_backend_can_gc_sections 1
4681 #define elf_backend_can_refcount 1
4682 #define elf_backend_plt_alignment 2
4683 #define elf_backend_want_got_plt 0
4684 #define elf_backend_plt_readonly 0
4685 #define elf_backend_want_plt_sym 0
4686 #define elf_backend_got_header_size 8
4687 #define elf_backend_rela_normal 1
4689 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
4690 #define TARGET_BIG_NAME "elf32-hppa"
4691 #define ELF_ARCH bfd_arch_hppa
4692 #define ELF_MACHINE_CODE EM_PARISC
4693 #define ELF_MAXPAGESIZE 0x1000
4694 #define ELF_OSABI ELFOSABI_HPUX
4695 #define elf32_bed elf32_hppa_hpux_bed
4697 #include "elf32-target.h"
4699 #undef TARGET_BIG_SYM
4700 #define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
4701 #undef TARGET_BIG_NAME
4702 #define TARGET_BIG_NAME "elf32-hppa-linux"
4703 #undef ELF_OSABI
4704 #define ELF_OSABI ELFOSABI_LINUX
4705 #undef elf32_bed
4706 #define elf32_bed elf32_hppa_linux_bed
4708 #include "elf32-target.h"
4710 #undef TARGET_BIG_SYM
4711 #define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec
4712 #undef TARGET_BIG_NAME
4713 #define TARGET_BIG_NAME "elf32-hppa-netbsd"
4714 #undef ELF_OSABI
4715 #define ELF_OSABI ELFOSABI_NETBSD
4716 #undef elf32_bed
4717 #define elf32_bed elf32_hppa_netbsd_bed
4719 #include "elf32-target.h"