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.
7 Center for Software Science
8 Department of Computer Science
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. */
37 #include "elf32-hppa.h"
39 #include "elf32-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
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.
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
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
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.
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.
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
115 : ldw -24(%sp),%rp ; restore the original rp
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"
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
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
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
173 #define ELIMINATE_COPY_RELOCS 1
175 enum elf32_hppa_stub_type
177 hppa_stub_long_branch
,
178 hppa_stub_long_branch_shared
,
180 hppa_stub_import_shared
,
185 struct elf32_hppa_stub_hash_entry
187 /* Base hash table entry structure. */
188 struct bfd_hash_entry bh_root
;
190 /* The stub section. */
193 /* Offset within stub_sec of the beginning of this stub. */
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. */
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
217 struct elf32_hppa_stub_hash_entry
*hsh_cache
;
219 /* Used to count relocations for delayed sizing of relocation
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. */
229 /* Number of relocs copied in this section. */
232 #if RELATIVE_DYNRELOCS
233 /* Number of relative relocs copied for the input section. */
234 bfd_size_type relative_count
;
240 GOT_UNKNOWN
= 0, GOT_NORMAL
= 1, GOT_TLS_GD
= 2, GOT_TLS_LDM
= 4, GOT_TLS_IE
= 8
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. */
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. */
266 /* This is the section to which stubs in the group will be
269 /* The stub section. */
273 /* Assorted information used by elf32_hppa_size_stubs. */
274 unsigned int bfd_count
;
276 asection
**input_list
;
277 Elf_Internal_Sym
**all_local_syms
;
279 /* Short-cuts to get to dynamic linker sections. */
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. */
310 bfd_signed_vma refcount
;
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. */
342 elf32_hppa_mkobject (bfd
*abfd
)
344 return bfd_elf_allocate_object (abfd
, sizeof (struct elf_obj_tdata
),
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
,
357 /* Allocate the structure if it has not already been allocated by a
361 entry
= bfd_hash_allocate (table
,
362 sizeof (struct elf32_hppa_stub_hash_entry
));
367 /* Call the allocation method of the superclass. */
368 entry
= bfd_hash_newfunc (entry
, table
, string
);
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
;
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
,
394 /* Allocate the structure if it has not already been allocated by a
398 entry
= bfd_hash_allocate (table
,
399 sizeof (struct elf32_hppa_link_hash_entry
));
404 /* Call the allocation method of the superclass. */
405 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
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
;
415 hh
->tls_type
= GOT_UNKNOWN
;
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
);
435 if (!_bfd_elf_link_hash_table_init (&htab
->etab
, abfd
, hppa_link_hash_newfunc
,
436 sizeof (struct elf32_hppa_link_hash_entry
),
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
)))
448 htab
->stub_bfd
= NULL
;
449 htab
->add_stub_section
= NULL
;
450 htab
->layout_sections_again
= NULL
;
451 htab
->stub_group
= NULL
;
453 htab
->srelgot
= 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. */
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. */
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
)
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,
502 (int) rela
->r_addend
& 0xffffffff);
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);
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
;
548 stub_name
= hppa_stub_name (id_sec
, sym_sec
, hh
, rela
);
549 if (stub_name
== NULL
)
552 hsh_entry
= hppa_stub_hash_lookup (&htab
->bstab
,
553 stub_name
, FALSE
, FALSE
);
555 hh
->hsh_cache
= 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
,
569 struct elf32_hppa_link_hash_table
*htab
)
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
)
586 namelen
= strlen (link_sec
->name
);
587 len
= namelen
+ sizeof (STUB_SUFFIX
);
588 s_name
= bfd_alloc (htab
->stub_bfd
, len
);
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
)
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
,
607 (*_bfd_error_handler
) (_("%B: cannot create stub entry %s"),
613 hsh
->stub_sec
= stub_sec
;
614 hsh
->stub_offset
= 0;
615 hsh
->id_sec
= link_sec
;
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
,
626 struct bfd_link_info
*info
)
629 bfd_vma branch_offset
;
630 bfd_vma max_branch_offset
;
634 && hh
->eh
.plt
.offset
!= (bfd_vma
) -1
635 && hh
->eh
.dynindx
!= -1
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
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) */
708 #define LDW_R1_DLT LDW_R1_R19
710 #define LDW_R1_DLT LDW_R1_DP
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
;
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
);
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);
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);
788 case hppa_stub_import
:
789 case hppa_stub_import_shared
:
790 off
= hsh
->hh
->eh
.plt
.offset
;
791 if (off
>= (bfd_vma
) -2)
794 off
&= ~ (bfd_vma
) 1;
796 + htab
->splt
->output_offset
797 + htab
->splt
->output_section
->vma
798 - elf_gp (htab
->splt
->output_section
->owner
));
802 if (hsh
->stub_type
== hppa_stub_import_shared
)
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);
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);
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
,
862 (long) hsh
->stub_offset
,
863 hsh
->bh_root
.string
);
864 bfd_set_error (bfd_error_bad_value
);
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);
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
;
893 stub_sec
->size
+= size
;
918 /* As above, but don't actually build the stub. Just bump offset so
919 we know stub section sizes. */
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
;
928 /* Massage our args to the form they really have. */
929 hsh
= hppa_stub_hash_entry (bh
);
932 if (hsh
->stub_type
== hppa_stub_long_branch
)
934 else if (hsh
->stub_type
== hppa_stub_long_branch_shared
)
936 else if (hsh
->stub_type
== hppa_stub_export
)
938 else /* hppa_stub_import or hppa_stub_import_shared. */
940 if (htab
->multi_subspace
)
946 hsh
->stub_sec
->size
+= size
;
950 /* Return nonzero if ABFD represents an HPPA ELF32 file.
951 Additionally we set the default architecture and machine. */
954 elf32_hppa_object_p (bfd
*abfd
)
956 Elf_Internal_Ehdr
* i_ehdrp
;
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 */
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 */
978 if (i_ehdrp
->e_ident
[EI_OSABI
] != ELFOSABI_HPUX
)
982 flags
= i_ehdrp
->e_flags
;
983 switch (flags
& (EF_PARISC_ARCH
| EF_PARISC_WIDE
))
986 return bfd_default_set_arch_mach (abfd
, bfd_arch_hppa
, 10);
988 return bfd_default_set_arch_mach (abfd
, bfd_arch_hppa
, 11);
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);
997 /* Create the .plt and .got sections, and set up our hash table
998 short-cuts to various dynamic sections. */
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
);
1010 if (htab
->splt
!= NULL
)
1013 /* Call the generic code to do most of the work. */
1014 if (! _bfd_elf_create_dynamic_sections (abfd
, info
))
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. */
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
;
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
;
1067 hdh_q
->count
+= hdh_p
->count
;
1068 *hdh_pp
= hdh_p
->hdh_next
;
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
;
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
);
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. */
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
)
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
)
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. */
1152 elf32_hppa_check_relocs (bfd
*abfd
,
1153 struct bfd_link_info
*info
,
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
;
1163 asection
*stubreloc
;
1164 int tls_type
= GOT_UNKNOWN
, old_tls_type
= GOT_UNKNOWN
;
1166 if (info
->relocatable
)
1169 htab
= hppa_link_hash_table (info
);
1172 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1173 eh_syms
= elf_sym_hashes (abfd
);
1177 rela_end
= relocs
+ sec
->reloc_count
;
1178 for (rela
= relocs
; rela
< rela_end
; rela
++)
1187 unsigned int r_symndx
, r_type
;
1188 struct elf32_hppa_link_hash_entry
*hh
;
1191 r_symndx
= ELF32_R_SYM (rela
->r_info
);
1193 if (r_symndx
< symtab_hdr
->sh_info
)
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
);
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
;
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)
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
;
1242 case R_PARISC_PCREL12F
:
1243 htab
->has_12bit_branch
= 1;
1246 case R_PARISC_PCREL17C
:
1247 case R_PARISC_PCREL17F
:
1248 htab
->has_17bit_branch
= 1;
1251 case R_PARISC_PCREL22F
:
1252 htab
->has_22bit_branch
= 1;
1254 /* Function calls might need to go through the .plt, and
1255 might require long branch stubs. */
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
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
)
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. */
1289 case R_PARISC_DPREL14F
: /* Used for gp rel data load/store. */
1290 case R_PARISC_DPREL14R
:
1291 case R_PARISC_DPREL21L
:
1294 (*_bfd_error_handler
)
1295 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1297 elf_hppa_howto_table
[r_type
].name
);
1298 bfd_set_error (bfd_error_bad_value
);
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
;
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
))
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
);
1325 && !bfd_elf_gc_record_vtentry (abfd
, sec
, &hh
->eh
, rela
->r_addend
))
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
;
1336 case R_PARISC_TLS_IE21L
:
1337 case R_PARISC_TLS_IE14R
:
1339 info
->flags
|= DF_STATIC_TLS
;
1340 need_entry
= NEED_GOT
;
1347 /* Now carry out our orders. */
1348 if (need_entry
& NEED_GOT
)
1353 tls_type
= GOT_NORMAL
;
1355 case R_PARISC_TLS_GD21L
:
1356 case R_PARISC_TLS_GD14R
:
1357 tls_type
|= GOT_TLS_GD
;
1359 case R_PARISC_TLS_LDM21L
:
1360 case R_PARISC_TLS_LDM14R
:
1361 tls_type
|= GOT_TLS_LDM
;
1363 case R_PARISC_TLS_IE21L
:
1364 case R_PARISC_TLS_IE14R
:
1365 tls_type
|= GOT_TLS_IE
;
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
))
1379 if (r_type
== R_PARISC_TLS_LDM21L
1380 || r_type
== R_PARISC_TLS_LDM14R
)
1381 htab
->tls_ldm_got
.refcount
+= 1;
1386 hh
->eh
.got
.refcount
+= 1;
1387 old_tls_type
= hh
->tls_type
;
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
)
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
)
1407 hh
->tls_type
= tls_type
;
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)
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
)
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
)
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
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
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
1490 && (sec
->flags
& SEC_ALLOC
) != 0
1491 && (IS_ABSOLUTE_RELOC (r_type
)
1494 || hh
->eh
.root
.type
== bfd_link_hash_defweak
1495 || !hh
->eh
.def_regular
))))
1496 || (ELIMINATE_COPY_RELOCS
1498 && (sec
->flags
& SEC_ALLOC
) != 0
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
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
);
1518 bfd_set_error (bfd_error_bad_value
);
1523 /* If this is a global symbol, we count the number of
1524 relocations we need for this symbol. */
1527 hdh_head
= &hh
->dyn_relocs
;
1531 /* Track dynamic relocs needed for local syms too.
1532 We really need local syms available to do this
1536 Elf_Internal_Sym
*isym
;
1538 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
1543 sr
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1547 vpp
= &elf_section_data (sr
)->local_dynrel
;
1548 hdh_head
= (struct elf32_hppa_dyn_reloc_entry
**) vpp
;
1552 if (hdh_p
== NULL
|| hdh_p
->sec
!= sec
)
1554 hdh_p
= bfd_alloc (htab
->etab
.dynobj
, sizeof *hdh_p
);
1557 hdh_p
->hdh_next
= *hdh_head
;
1561 #if RELATIVE_DYNRELOCS
1562 hdh_p
->relative_count
= 0;
1567 #if RELATIVE_DYNRELOCS
1568 if (!IS_ABSOLUTE_RELOC (rtype
))
1569 hdh_p
->relative_count
+= 1;
1578 /* Return the section that should be marked against garbage collection
1579 for a given relocation. */
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
)
1589 switch ((unsigned int) ELF32_R_TYPE (rela
->r_info
))
1591 case R_PARISC_GNU_VTINHERIT
:
1592 case R_PARISC_GNU_VTENTRY
:
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
1603 elf32_hppa_gc_sweep_hook (bfd
*abfd
,
1604 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
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
)
1618 htab
= hppa_link_hash_table (info
);
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
;
1660 r_type
= ELF32_R_TYPE (rela
->r_info
);
1661 r_type
= elf32_hppa_optimized_tls_reloc (info
, r_type
, eh
!= NULL
);
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
:
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;
1684 case R_PARISC_TLS_LDM21L
:
1685 case R_PARISC_TLS_LDM14R
:
1686 htab
->tls_ldm_got
.refcount
-= 1;
1689 case R_PARISC_PCREL12F
:
1690 case R_PARISC_PCREL17C
:
1691 case R_PARISC_PCREL17F
:
1692 case R_PARISC_PCREL22F
:
1695 if (eh
->plt
.refcount
> 0)
1696 eh
->plt
.refcount
-= 1;
1700 case R_PARISC_PLABEL14R
:
1701 case R_PARISC_PLABEL21L
:
1702 case R_PARISC_PLABEL32
:
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;
1723 /* Support for core dump NOTE sections. */
1726 elf32_hppa_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
1731 switch (note
->descsz
)
1736 case 396: /* Linux/hppa */
1738 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1741 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1750 /* Make a ".reg/999" section. */
1751 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1752 size
, note
->descpos
+ offset
);
1756 elf32_hppa_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
1758 switch (note
->descsz
)
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';
1784 /* Our own version of hide_symbol, so that we can keep plt entries for
1788 elf32_hppa_hide_symbol (struct bfd_link_info
*info
,
1789 struct elf_link_hash_entry
*eh
,
1790 bfd_boolean force_local
)
1794 eh
->forced_local
= 1;
1795 if (eh
->dynindx
!= -1)
1798 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
1803 if (! hppa_elf_hash_entry (eh
)->plabel
)
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
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
;
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
1828 if (eh
->plt
.refcount
<= 0
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
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;
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
)
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
;
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. */
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
)
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)
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. */
1898 eh
->non_got_ref
= 0;
1905 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
1906 eh
->root
.root
.string
);
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
);
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
);
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. */
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
;
1949 if (eh
->root
.type
== bfd_link_hash_indirect
)
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
);
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
))
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. */
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. */
1988 eh
->plt
.offset
= sec
->size
;
1989 sec
->size
+= PLT_ENTRY_SIZE
;
1993 /* No .plt entry needed. */
1994 eh
->plt
.offset
= (bfd_vma
) -1;
2000 eh
->plt
.offset
= (bfd_vma
) -1;
2007 /* Allocate space in .plt, .got and associated reloc sections for
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
;
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
)
2022 if (eh
->root
.type
== bfd_link_hash_warning
)
2023 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
2026 htab
= hppa_link_hash_table (info
);
2030 hh
= hppa_elf_hash_entry (eh
);
2032 if (htab
->etab
.dynamic_sections_created
2033 && eh
->plt
.offset
!= (bfd_vma
) -1
2035 && eh
->plt
.refcount
> 0)
2037 /* Make an entry in the .plt section. */
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
))
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
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
);
2080 eh
->got
.offset
= (bfd_vma
) -1;
2082 if (hh
->dyn_relocs
== NULL
)
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
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
;
2104 hdh_pp
= &hdh_p
->hdh_next
;
2109 /* Also discard relocs on undefined weak syms with non-default
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
2119 else if (eh
->dynindx
== -1
2120 && !eh
->forced_local
)
2122 if (! bfd_elf_link_record_dynamic_symbol (info
, eh
))
2129 /* For the non-shared case, discard space for relocs against
2130 symbols which turn out to need copy relocs or are not
2133 if (!eh
->non_got_ref
2134 && ((ELIMINATE_COPY_RELOCS
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
))
2151 /* If that succeeded, we know we'll be keeping all the
2153 if (eh
->dynindx
!= -1)
2157 hh
->dyn_relocs
= NULL
;
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
);
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. */
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
);
2195 /* Find any dynamic relocs that apply to read-only sections. */
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. */
2224 /* Set the sizes of the dynamic sections. */
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
;
2236 htab
= hppa_link_hash_table (info
);
2240 dynobj
= htab
->etab
.dynobj
;
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");
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
,
2262 /* Set up .got and .plt offsets for local syms, and space for local
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
;
2273 char *local_tls_type
;
2275 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
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
);
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
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
);
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
);
2314 srel
= htab
->srelgot
;
2315 for (; local_got
< end_local_got
; ++local_got
)
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
;
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
);
2335 *local_got
= (bfd_vma
) -1;
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;
2351 srel
= htab
->srelplt
;
2352 for (; local_plt
< end_local_plt
; ++local_plt
)
2356 *local_plt
= sec
->size
;
2357 sec
->size
+= PLT_ENTRY_SIZE
;
2359 srel
->size
+= sizeof (Elf32_External_Rela
);
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
);
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
2391 for (sec
= dynobj
->sections
; sec
!= NULL
; sec
= sec
->next
)
2393 if ((sec
->flags
& SEC_LINKER_CREATED
) == 0)
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
);
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"))
2420 /* Remember whether there are any reloc sections other
2422 if (sec
!= htab
->srelplt
)
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;
2432 /* It's not one of our sections, so don't allocate space. */
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
;
2451 if ((sec
->flags
& SEC_HAS_CONTENTS
) == 0)
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
)
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
2467 #define add_dynamic_entry(TAG, VAL) \
2468 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2470 if (!add_dynamic_entry (DT_PLTGOT
, 0))
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))
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))
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
)))
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))
2511 #undef add_dynamic_entry
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
)
2526 unsigned int bfd_count
;
2527 int top_id
, top_index
;
2529 asection
**input_list
, **list
;
2531 struct elf32_hppa_link_hash_table
*htab
= hppa_link_hash_table (info
);
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;
2539 input_bfd
= input_bfd
->link_next
)
2542 for (section
= input_bfd
->sections
;
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
)
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;
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
)
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
;
2584 section
= section
->next
)
2586 if ((section
->flags
& SEC_CODE
) != 0)
2587 input_list
[section
->index
] = NULL
;
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. */
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
);
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
;
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. */
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
)
2639 while (tail
!= NULL
)
2643 bfd_size_type total
;
2644 bfd_boolean big_sec
;
2648 big_sec
= total
>= stub_group_size
;
2650 while ((prev
= PREV_SEC (curr
)) != NULL
2651 && ((total
+= curr
->output_offset
- prev
->output_offset
)
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
)
2685 && ((total
+= tail
->output_offset
- prev
->output_offset
)
2689 prev
= PREV_SEC (tail
);
2690 htab
->stub_group
[tail
->id
].link_sec
= curr
;
2696 while (list
-- != htab
->input_list
);
2697 free (htab
->input_list
);
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. */
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
);
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
)
2725 /* Walk over all the input BFDs, swapping in local symbols.
2726 If we are creating a shared library, create hash entries for the
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)
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,
2746 /* Cache them for elf_link_input_bfd. */
2747 symtab_hdr
->contents
= (unsigned char *) local_syms
;
2749 if (local_syms
== NULL
)
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
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
)
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
,
2802 hsh
= hppa_add_stub (stub_name
, sec
, htab
);
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
;
2814 (*_bfd_error_handler
) (_("%B: duplicate export stub %s"),
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"
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
);
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;
2854 stub_group_size
= -group_size
;
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;
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
))
2883 if (htab
->all_local_syms
)
2884 goto error_ret_free_local
;
2888 stub_changed
= FALSE
;
2892 stub_changed
= TRUE
;
2899 unsigned int bfd_indx
;
2902 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
2904 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2906 Elf_Internal_Shdr
*symtab_hdr
;
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)
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
;
2920 section
= section
->next
)
2922 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2924 /* If there aren't any relocs, then there's nothing more
2926 if ((section
->flags
& SEC_RELOC
) == 0
2927 || section
->reloc_count
== 0)
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
)
2936 /* Get the relocs. */
2938 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
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
;
2953 bfd_vma destination
;
2954 struct elf32_hppa_link_hash_entry
*hh
;
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
)
2976 /* Now determine the call target, its name, value,
2982 if (r_indx
< symtab_hdr
->sh_info
)
2984 /* It's a local symbol. */
2985 Elf_Internal_Sym
*sym
;
2986 Elf_Internal_Shdr
*hdr
;
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
);
3004 /* It's an external symbol. */
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
)
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
)
3034 && hh
->eh
.type
!= STT_PARISC_MILLI
))
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
,
3047 if (stub_type
== hppa_stub_none
)
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
);
3056 goto error_ret_free_internal
;
3058 hsh
= hppa_stub_hash_lookup (&htab
->bstab
,
3063 /* The proper stub has already been created. */
3068 hsh
= hppa_add_stub (stub_name
, section
, htab
);
3072 goto error_ret_free_internal
;
3075 hsh
->target_value
= sym_value
;
3076 hsh
->target_section
= sym_sec
;
3077 hsh
->stub_type
= stub_type
;
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
;
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
);
3098 /* OK, we've added some stubs. Find out the new size of the
3100 for (stub_sec
= htab
->stub_bfd
->sections
;
3102 stub_sec
= stub_sec
->next
)
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
);
3115 error_ret_free_local
:
3116 free (htab
->all_local_syms
);
3120 /* For a final link, this function is called after we have sized the
3121 stubs to provide a value for __gp. */
3124 elf32_hppa_set_gp (bfd
*abfd
, struct bfd_link_info
*info
)
3126 struct bfd_link_hash_entry
*h
;
3127 asection
*sec
= NULL
;
3129 struct elf32_hppa_link_hash_table
*htab
;
3131 htab
= hppa_link_hash_table (info
);
3135 h
= bfd_link_hash_lookup (&htab
->etab
.root
, "$global$", FALSE
, FALSE
, FALSE
);
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
;
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
3162 if (gp_val
> 0x2000 || (sgot
&& sgot
->size
> 0x2000))
3172 if (strcmp (bfd_get_target (abfd
), "elf32-hppa-netbsd") != 0)
3174 /* We know we don't have a .plt. If .got is large,
3176 if (sec
->size
> 0x2000)
3182 /* No .plt or .got. Who cares what the LTP is? */
3183 sec
= bfd_get_section_by_name (abfd
, ".data");
3189 h
->type
= bfd_link_hash_defined
;
3190 h
->u
.def
.value
= gp_val
;
3192 h
->u
.def
.section
= sec
;
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
;
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
3212 elf32_hppa_build_stubs (struct bfd_link_info
*info
)
3215 struct bfd_hash_table
*table
;
3216 struct elf32_hppa_link_hash_table
*htab
;
3218 htab
= hppa_link_hash_table (info
);
3222 for (stub_sec
= htab
->stub_bfd
->sections
;
3224 stub_sec
= stub_sec
->next
)
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)
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
);
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. */
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
)
3253 return elf_hash_table (info
)->tls_sec
->vma
;
3256 /* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
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
)
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. */
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
))
3281 /* If we're producing a final executable, sort the contents of the
3283 if (info
->relocatable
)
3286 return elf_hppa_sort_unwind (abfd
);
3289 /* Record the lowest address for the data and text segments. */
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
;
3300 if ((section
->flags
& (SEC_ALLOC
| SEC_LOAD
)) == (SEC_ALLOC
| SEC_LOAD
))
3303 Elf_Internal_Phdr
*p
;
3305 p
= _bfd_elf_find_segment_containing_section (abfd
, section
->output_section
);
3306 BFD_ASSERT (p
!= NULL
);
3309 if ((section
->flags
& SEC_READONLY
) != 0)
3311 if (value
< htab
->text_segment_base
)
3312 htab
->text_segment_base
= value
;
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
,
3327 const Elf_Internal_Rela
*rela
,
3329 struct elf32_hppa_link_hash_table
*htab
,
3331 struct elf32_hppa_link_hash_entry
*hh
,
3332 struct bfd_link_info
*info
)
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
;
3346 struct elf32_hppa_stub_hash_entry
*hsh
= NULL
;
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
3365 case R_PARISC_DLTIND21L
:
3366 r_type
= R_PARISC_DPREL21L
;
3369 case R_PARISC_DLTIND14R
:
3370 r_type
= R_PARISC_DPREL14R
;
3373 case R_PARISC_DLTIND14F
:
3374 r_type
= R_PARISC_DPREL14F
;
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
3387 || sym_sec
->output_section
== NULL
3389 && hh
->eh
.plt
.offset
!= (bfd_vma
) -1
3390 && hh
->eh
.dynindx
!= -1
3393 || !hh
->eh
.def_regular
3394 || hh
->eh
.root
.type
== bfd_link_hash_defweak
)))
3396 hsh
= hppa_get_stub_entry (input_section
, sym_sec
,
3400 value
= (hsh
->stub_offset
3401 + hsh
->stub_sec
->output_offset
3402 + hsh
->stub_sec
->output_section
->vma
);
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
3417 return bfd_reloc_undefined
;
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. */
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
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))
3456 /* We must have a ldil instruction. It's too hard to find
3457 and convert the associated add instruction, so issue an
3459 (*_bfd_error_handler
)
3460 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3467 else if (orig_r_type
== R_PARISC_DLTIND14F
)
3469 /* This must be a format 1 load/store. Change the base
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. */
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
);
3504 case R_PARISC_SEGREL32
:
3505 if ((sym_sec
->flags
& SEC_CODE
) != 0)
3506 value
-= htab
->text_segment_base
;
3508 value
-= htab
->data_segment_base
;
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
:
3534 case R_PARISC_DLTIND21L
:
3535 case R_PARISC_PCREL21L
:
3536 case R_PARISC_PLABEL21L
:
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
:
3550 case R_PARISC_PCREL17R
:
3551 case R_PARISC_PCREL14R
:
3552 case R_PARISC_PLABEL14R
:
3553 case R_PARISC_DLTIND14R
:
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
:
3568 case R_PARISC_PCREL12F
:
3569 case R_PARISC_PCREL17F
:
3570 case R_PARISC_PCREL22F
:
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;
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
)
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
,
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
3611 /* Something we don't know how to handle. */
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"),
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
);
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. */
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. */
3662 elf32_hppa_relocate_section (bfd
*output_bfd
,
3663 struct bfd_link_info
*info
,
3665 asection
*input_section
,
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
);
3683 local_got_offsets
= elf_local_got_offsets (input_bfd
);
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
;
3696 bfd_reloc_status_type rstatus
;
3697 const char *sym_name
;
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
);
3707 if (r_type
== (unsigned int) R_PARISC_GNU_VTENTRY
3708 || r_type
== (unsigned int) R_PARISC_GNU_VTINHERIT
)
3711 r_symndx
= ELF32_R_SYM (rela
->r_info
);
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
);
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
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
))
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
);
3767 if (info
->relocatable
)
3770 /* Do any required modifications to the relocation value, and
3771 determine what types of dynamic info we need to output, if
3776 case R_PARISC_DLTIND14F
:
3777 case R_PARISC_DLTIND14R
:
3778 case R_PARISC_DLTIND21L
:
3781 bfd_boolean do_got
= 0;
3783 /* Relocation is to the entry for this symbol in the
3784 global offset table. */
3789 off
= hh
->eh
.got
.offset
;
3790 dyn
= htab
->etab
.dynamic_sections_created
;
3791 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
,
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. */
3804 hh
->eh
.got
.offset
|= 1;
3811 /* Local symbol case. */
3812 if (local_got_offsets
== NULL
)
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. */
3824 local_got_offsets
[r_symndx
] |= 1;
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
;
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
);
3850 bfd_put_32 (output_bfd
, relocation
,
3851 htab
->sgot
->contents
+ off
);
3854 if (off
>= (bfd_vma
) -2)
3857 /* Add the base of the GOT to the relocation value. */
3859 + htab
->sgot
->output_offset
3860 + htab
->sgot
->output_section
->vma
);
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
);
3871 case R_PARISC_PLABEL14R
:
3872 case R_PARISC_PLABEL21L
:
3873 case R_PARISC_PLABEL32
:
3874 if (htab
->etab
.dynamic_sections_created
)
3877 bfd_boolean do_plt
= 0;
3878 /* If we have a global symbol with a PLT slot, then
3879 redirect this relocation to it. */
3882 off
= hh
->eh
.plt
.offset
;
3883 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
,
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. */
3893 hh
->eh
.plt
.offset
|= 1;
3900 bfd_vma
*local_plt_offsets
;
3902 if (local_got_offsets
== NULL
)
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. */
3915 local_plt_offsets
[r_symndx
] |= 1;
3924 /* Output a dynamic IPLT relocation for this
3926 Elf_Internal_Rela outrel
;
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
;
3936 loc
+= s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
3937 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
3941 bfd_put_32 (output_bfd
,
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)
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
3960 || (hh
->eh
.root
.type
!= bfd_link_hash_undefweak
3961 && hh
->eh
.root
.type
!= bfd_link_hash_undefined
))
3964 + htab
->splt
->output_offset
3965 + htab
->splt
->output_section
->vma
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)
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. */
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
)))
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
;
4017 /* When generating a shared object, these relocations
4018 are copied into the output file to be resolved at run
4021 outrel
.r_addend
= rela
->r_addend
;
4023 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
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
);
4032 memset (&outrel
, 0, sizeof (outrel
));
4035 && hh
->eh
.dynindx
!= -1
4037 || !IS_ABSOLUTE_RELOC (r_type
)
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. */
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. */
4059 && sym_sec
->output_section
!= NULL
4060 && ! bfd_is_abs_section (sym_sec
))
4064 osec
= sym_sec
->output_section
;
4065 indx
= elf_section_data (osec
)->dynindx
;
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
;
4086 loc
= sreloc
->contents
;
4087 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4088 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4092 case R_PARISC_TLS_LDM21L
:
4093 case R_PARISC_TLS_LDM14R
:
4097 off
= htab
->tls_ldm_got
.offset
;
4102 Elf_Internal_Rela outrel
;
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. */
4119 + htab
->sgot
->output_offset
4120 + htab
->sgot
->output_section
->vma
);
4125 case R_PARISC_TLS_LDO21L
:
4126 case R_PARISC_TLS_LDO14R
:
4127 relocation
-= dtpoff_base (info
);
4130 case R_PARISC_TLS_GD21L
:
4131 case R_PARISC_TLS_GD14R
:
4132 case R_PARISC_TLS_IE21L
:
4133 case R_PARISC_TLS_IE14R
:
4143 dyn
= htab
->etab
.dynamic_sections_created
;
4145 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, &hh
->eh
)
4147 || !SYMBOL_REFERENCES_LOCAL (info
, &hh
->eh
)))
4149 indx
= hh
->eh
.dynindx
;
4151 off
= hh
->eh
.got
.offset
;
4152 tls_type
= hh
->tls_type
;
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
)
4167 bfd_boolean need_relocs
= FALSE
;
4168 Elf_Internal_Rela outrel
;
4169 bfd_byte
*loc
= NULL
;
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)
4178 || ELF_ST_VISIBILITY (hh
->eh
.other
) == STV_DEFAULT
4179 || hh
->eh
.root
.type
!= bfd_link_hash_undefweak
))
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
)
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
);
4202 bfd_put_32 (output_bfd
, relocation
- dtpoff_base (info
),
4203 htab
->sgot
->contents
+ cur_off
+ 4);
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
);
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);
4232 if (tls_type
& GOT_TLS_IE
)
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
);
4242 outrel
.r_addend
= relocation
- dtpoff_base (info
);
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
);
4251 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
4252 htab
->sgot
->contents
+ cur_off
);
4258 hh
->eh
.got
.offset
|= 1;
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. */
4270 + htab
->sgot
->output_offset
4271 + htab
->sgot
->output_section
->vma
);
4276 case R_PARISC_TLS_LE21L
:
4277 case R_PARISC_TLS_LE14R
:
4279 relocation
= tpoff (info
, relocation
);
4288 rstatus
= final_link_relocate (input_section
, contents
, rela
, relocation
,
4289 htab
, sym_sec
, hh
, info
);
4291 if (rstatus
== bfd_reloc_ok
)
4295 sym_name
= hh_name (hh
);
4298 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
4299 symtab_hdr
->sh_link
,
4301 if (sym_name
== NULL
)
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"),
4317 (long) rela
->r_offset
,
4320 bfd_set_error (bfd_error_bad_value
);
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
)))
4336 /* Finish up dynamic symbol handling. We set the contents of various
4337 dynamic sections here. */
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
;
4349 htab
= hppa_link_hash_table (info
);
4353 if (eh
->plt
.offset
!= (bfd_vma
) -1)
4357 if (eh
->plt
.offset
& 1)
4360 /* This symbol has an entry in the procedure linkage table. Set
4363 The format of a plt entry is
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
);
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
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. */
4423 && (info
->symbolic
|| eh
->dynindx
== -1)
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
);
4433 if ((eh
->got
.offset
& 1) != 0)
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
);
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
);
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
)))
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
);
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
;
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)"
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
))
4502 return reloc_class_plt
;
4504 return reloc_class_copy
;
4506 return reloc_class_normal
;
4510 /* Finish up the dynamic sections. */
4513 elf32_hppa_finish_dynamic_sections (bfd
*output_bfd
,
4514 struct bfd_link_info
*info
)
4517 struct elf32_hppa_link_hash_table
*htab
;
4520 htab
= hppa_link_hash_table (info
);
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
;
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
;
4542 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
4550 /* Use PLTGOT to set the GOT register. */
4551 dyn
.d_un
.d_ptr
= elf_gp (output_bfd
);
4556 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
4561 dyn
.d_un
.d_val
= s
->size
;
4565 /* Don't count procedure linkage table relocs in the
4566 overall reloc count. */
4570 dyn
.d_un
.d_val
-= s
->size
;
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. */
4580 if (dyn
.d_un
.d_ptr
!= s
->output_section
->vma
+ s
->output_offset
)
4582 dyn
.d_un
.d_ptr
+= s
->size
;
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
4622 != (htab
->sgot
->output_offset
4623 + htab
->sgot
->output_section
->vma
))
4625 (*_bfd_error_handler
)
4626 (_(".got section not immediately after .plt section"));
4635 /* Called when writing out an object file to decide the type of a
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
;
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"
4704 #define ELF_OSABI ELFOSABI_LINUX
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"
4715 #define ELF_OSABI ELFOSABI_NETBSD
4717 #define elf32_bed elf32_hppa_netbsd_bed
4719 #include "elf32-target.h"