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 int tls_type
= GOT_UNKNOWN
, old_tls_type
= GOT_UNKNOWN
;
1165 if (info
->relocatable
)
1168 htab
= hppa_link_hash_table (info
);
1171 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1172 eh_syms
= elf_sym_hashes (abfd
);
1175 rela_end
= relocs
+ sec
->reloc_count
;
1176 for (rela
= relocs
; rela
< rela_end
; rela
++)
1185 unsigned int r_symndx
, r_type
;
1186 struct elf32_hppa_link_hash_entry
*hh
;
1189 r_symndx
= ELF32_R_SYM (rela
->r_info
);
1191 if (r_symndx
< symtab_hdr
->sh_info
)
1195 hh
= hppa_elf_hash_entry (eh_syms
[r_symndx
- symtab_hdr
->sh_info
]);
1196 while (hh
->eh
.root
.type
== bfd_link_hash_indirect
1197 || hh
->eh
.root
.type
== bfd_link_hash_warning
)
1198 hh
= hppa_elf_hash_entry (hh
->eh
.root
.u
.i
.link
);
1201 r_type
= ELF32_R_TYPE (rela
->r_info
);
1202 r_type
= elf32_hppa_optimized_tls_reloc (info
, r_type
, hh
== NULL
);
1206 case R_PARISC_DLTIND14F
:
1207 case R_PARISC_DLTIND14R
:
1208 case R_PARISC_DLTIND21L
:
1209 /* This symbol requires a global offset table entry. */
1210 need_entry
= NEED_GOT
;
1213 case R_PARISC_PLABEL14R
: /* "Official" procedure labels. */
1214 case R_PARISC_PLABEL21L
:
1215 case R_PARISC_PLABEL32
:
1216 /* If the addend is non-zero, we break badly. */
1217 if (rela
->r_addend
!= 0)
1220 /* If we are creating a shared library, then we need to
1221 create a PLT entry for all PLABELs, because PLABELs with
1222 local symbols may be passed via a pointer to another
1223 object. Additionally, output a dynamic relocation
1224 pointing to the PLT entry.
1226 For executables, the original 32-bit ABI allowed two
1227 different styles of PLABELs (function pointers): For
1228 global functions, the PLABEL word points into the .plt
1229 two bytes past a (function address, gp) pair, and for
1230 local functions the PLABEL points directly at the
1231 function. The magic +2 for the first type allows us to
1232 differentiate between the two. As you can imagine, this
1233 is a real pain when it comes to generating code to call
1234 functions indirectly or to compare function pointers.
1235 We avoid the mess by always pointing a PLABEL into the
1236 .plt, even for local functions. */
1237 need_entry
= PLT_PLABEL
| NEED_PLT
| NEED_DYNREL
;
1240 case R_PARISC_PCREL12F
:
1241 htab
->has_12bit_branch
= 1;
1244 case R_PARISC_PCREL17C
:
1245 case R_PARISC_PCREL17F
:
1246 htab
->has_17bit_branch
= 1;
1249 case R_PARISC_PCREL22F
:
1250 htab
->has_22bit_branch
= 1;
1252 /* Function calls might need to go through the .plt, and
1253 might require long branch stubs. */
1256 /* We know local syms won't need a .plt entry, and if
1257 they need a long branch stub we can't guarantee that
1258 we can reach the stub. So just flag an error later
1259 if we're doing a shared link and find we need a long
1265 /* Global symbols will need a .plt entry if they remain
1266 global, and in most cases won't need a long branch
1267 stub. Unfortunately, we have to cater for the case
1268 where a symbol is forced local by versioning, or due
1269 to symbolic linking, and we lose the .plt entry. */
1270 need_entry
= NEED_PLT
;
1271 if (hh
->eh
.type
== STT_PARISC_MILLI
)
1276 case R_PARISC_SEGBASE
: /* Used to set segment base. */
1277 case R_PARISC_SEGREL32
: /* Relative reloc, used for unwind. */
1278 case R_PARISC_PCREL14F
: /* PC relative load/store. */
1279 case R_PARISC_PCREL14R
:
1280 case R_PARISC_PCREL17R
: /* External branches. */
1281 case R_PARISC_PCREL21L
: /* As above, and for load/store too. */
1282 case R_PARISC_PCREL32
:
1283 /* We don't need to propagate the relocation if linking a
1284 shared object since these are section relative. */
1287 case R_PARISC_DPREL14F
: /* Used for gp rel data load/store. */
1288 case R_PARISC_DPREL14R
:
1289 case R_PARISC_DPREL21L
:
1292 (*_bfd_error_handler
)
1293 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1295 elf_hppa_howto_table
[r_type
].name
);
1296 bfd_set_error (bfd_error_bad_value
);
1301 case R_PARISC_DIR17F
: /* Used for external branches. */
1302 case R_PARISC_DIR17R
:
1303 case R_PARISC_DIR14F
: /* Used for load/store from absolute locn. */
1304 case R_PARISC_DIR14R
:
1305 case R_PARISC_DIR21L
: /* As above, and for ext branches too. */
1306 case R_PARISC_DIR32
: /* .word relocs. */
1307 /* We may want to output a dynamic relocation later. */
1308 need_entry
= NEED_DYNREL
;
1311 /* This relocation describes the C++ object vtable hierarchy.
1312 Reconstruct it for later use during GC. */
1313 case R_PARISC_GNU_VTINHERIT
:
1314 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, &hh
->eh
, rela
->r_offset
))
1318 /* This relocation describes which C++ vtable entries are actually
1319 used. Record for later use during GC. */
1320 case R_PARISC_GNU_VTENTRY
:
1321 BFD_ASSERT (hh
!= NULL
);
1323 && !bfd_elf_gc_record_vtentry (abfd
, sec
, &hh
->eh
, rela
->r_addend
))
1327 case R_PARISC_TLS_GD21L
:
1328 case R_PARISC_TLS_GD14R
:
1329 case R_PARISC_TLS_LDM21L
:
1330 case R_PARISC_TLS_LDM14R
:
1331 need_entry
= NEED_GOT
;
1334 case R_PARISC_TLS_IE21L
:
1335 case R_PARISC_TLS_IE14R
:
1337 info
->flags
|= DF_STATIC_TLS
;
1338 need_entry
= NEED_GOT
;
1345 /* Now carry out our orders. */
1346 if (need_entry
& NEED_GOT
)
1351 tls_type
= GOT_NORMAL
;
1353 case R_PARISC_TLS_GD21L
:
1354 case R_PARISC_TLS_GD14R
:
1355 tls_type
|= GOT_TLS_GD
;
1357 case R_PARISC_TLS_LDM21L
:
1358 case R_PARISC_TLS_LDM14R
:
1359 tls_type
|= GOT_TLS_LDM
;
1361 case R_PARISC_TLS_IE21L
:
1362 case R_PARISC_TLS_IE14R
:
1363 tls_type
|= GOT_TLS_IE
;
1367 /* Allocate space for a GOT entry, as well as a dynamic
1368 relocation for this entry. */
1369 if (htab
->sgot
== NULL
)
1371 if (htab
->etab
.dynobj
== NULL
)
1372 htab
->etab
.dynobj
= abfd
;
1373 if (!elf32_hppa_create_dynamic_sections (htab
->etab
.dynobj
, info
))
1377 if (r_type
== R_PARISC_TLS_LDM21L
1378 || r_type
== R_PARISC_TLS_LDM14R
)
1379 htab
->tls_ldm_got
.refcount
+= 1;
1384 hh
->eh
.got
.refcount
+= 1;
1385 old_tls_type
= hh
->tls_type
;
1389 bfd_signed_vma
*local_got_refcounts
;
1391 /* This is a global offset table entry for a local symbol. */
1392 local_got_refcounts
= hppa32_elf_local_refcounts (abfd
);
1393 if (local_got_refcounts
== NULL
)
1395 local_got_refcounts
[r_symndx
] += 1;
1397 old_tls_type
= hppa_elf_local_got_tls_type (abfd
) [r_symndx
];
1400 tls_type
|= old_tls_type
;
1402 if (old_tls_type
!= tls_type
)
1405 hh
->tls_type
= tls_type
;
1407 hppa_elf_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
1413 if (need_entry
& NEED_PLT
)
1415 /* If we are creating a shared library, and this is a reloc
1416 against a weak symbol or a global symbol in a dynamic
1417 object, then we will be creating an import stub and a
1418 .plt entry for the symbol. Similarly, on a normal link
1419 to symbols defined in a dynamic object we'll need the
1420 import stub and a .plt entry. We don't know yet whether
1421 the symbol is defined or not, so make an entry anyway and
1422 clean up later in adjust_dynamic_symbol. */
1423 if ((sec
->flags
& SEC_ALLOC
) != 0)
1427 hh
->eh
.needs_plt
= 1;
1428 hh
->eh
.plt
.refcount
+= 1;
1430 /* If this .plt entry is for a plabel, mark it so
1431 that adjust_dynamic_symbol will keep the entry
1432 even if it appears to be local. */
1433 if (need_entry
& PLT_PLABEL
)
1436 else if (need_entry
& PLT_PLABEL
)
1438 bfd_signed_vma
*local_got_refcounts
;
1439 bfd_signed_vma
*local_plt_refcounts
;
1441 local_got_refcounts
= hppa32_elf_local_refcounts (abfd
);
1442 if (local_got_refcounts
== NULL
)
1444 local_plt_refcounts
= (local_got_refcounts
1445 + symtab_hdr
->sh_info
);
1446 local_plt_refcounts
[r_symndx
] += 1;
1451 if (need_entry
& NEED_DYNREL
)
1453 /* Flag this symbol as having a non-got, non-plt reference
1454 so that we generate copy relocs if it turns out to be
1456 if (hh
!= NULL
&& !info
->shared
)
1457 hh
->eh
.non_got_ref
= 1;
1459 /* If we are creating a shared library then we need to copy
1460 the reloc into the shared library. However, if we are
1461 linking with -Bsymbolic, we need only copy absolute
1462 relocs or relocs against symbols that are not defined in
1463 an object we are including in the link. PC- or DP- or
1464 DLT-relative relocs against any local sym or global sym
1465 with DEF_REGULAR set, can be discarded. At this point we
1466 have not seen all the input files, so it is possible that
1467 DEF_REGULAR is not set now but will be set later (it is
1468 never cleared). We account for that possibility below by
1469 storing information in the dyn_relocs field of the
1472 A similar situation to the -Bsymbolic case occurs when
1473 creating shared libraries and symbol visibility changes
1474 render the symbol local.
1476 As it turns out, all the relocs we will be creating here
1477 are absolute, so we cannot remove them on -Bsymbolic
1478 links or visibility changes anyway. A STUB_REL reloc
1479 is absolute too, as in that case it is the reloc in the
1480 stub we will be creating, rather than copying the PCREL
1481 reloc in the branch.
1483 If on the other hand, we are creating an executable, we
1484 may need to keep relocations for symbols satisfied by a
1485 dynamic library if we manage to avoid copy relocs for the
1488 && (sec
->flags
& SEC_ALLOC
) != 0
1489 && (IS_ABSOLUTE_RELOC (r_type
)
1492 || hh
->eh
.root
.type
== bfd_link_hash_defweak
1493 || !hh
->eh
.def_regular
))))
1494 || (ELIMINATE_COPY_RELOCS
1496 && (sec
->flags
& SEC_ALLOC
) != 0
1498 && (hh
->eh
.root
.type
== bfd_link_hash_defweak
1499 || !hh
->eh
.def_regular
)))
1501 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
1502 struct elf32_hppa_dyn_reloc_entry
**hdh_head
;
1504 /* Create a reloc section in dynobj and make room for
1508 if (htab
->etab
.dynobj
== NULL
)
1509 htab
->etab
.dynobj
= abfd
;
1511 sreloc
= _bfd_elf_make_dynamic_reloc_section
1512 (sec
, htab
->etab
.dynobj
, 2, abfd
, /*rela?*/ TRUE
);
1516 bfd_set_error (bfd_error_bad_value
);
1521 /* If this is a global symbol, we count the number of
1522 relocations we need for this symbol. */
1525 hdh_head
= &hh
->dyn_relocs
;
1529 /* Track dynamic relocs needed for local syms too.
1530 We really need local syms available to do this
1534 Elf_Internal_Sym
*isym
;
1536 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
1541 sr
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1545 vpp
= &elf_section_data (sr
)->local_dynrel
;
1546 hdh_head
= (struct elf32_hppa_dyn_reloc_entry
**) vpp
;
1550 if (hdh_p
== NULL
|| hdh_p
->sec
!= sec
)
1552 hdh_p
= bfd_alloc (htab
->etab
.dynobj
, sizeof *hdh_p
);
1555 hdh_p
->hdh_next
= *hdh_head
;
1559 #if RELATIVE_DYNRELOCS
1560 hdh_p
->relative_count
= 0;
1565 #if RELATIVE_DYNRELOCS
1566 if (!IS_ABSOLUTE_RELOC (rtype
))
1567 hdh_p
->relative_count
+= 1;
1576 /* Return the section that should be marked against garbage collection
1577 for a given relocation. */
1580 elf32_hppa_gc_mark_hook (asection
*sec
,
1581 struct bfd_link_info
*info
,
1582 Elf_Internal_Rela
*rela
,
1583 struct elf_link_hash_entry
*hh
,
1584 Elf_Internal_Sym
*sym
)
1587 switch ((unsigned int) ELF32_R_TYPE (rela
->r_info
))
1589 case R_PARISC_GNU_VTINHERIT
:
1590 case R_PARISC_GNU_VTENTRY
:
1594 return _bfd_elf_gc_mark_hook (sec
, info
, rela
, hh
, sym
);
1597 /* Update the got and plt entry reference counts for the section being
1601 elf32_hppa_gc_sweep_hook (bfd
*abfd
,
1602 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
1604 const Elf_Internal_Rela
*relocs
)
1606 Elf_Internal_Shdr
*symtab_hdr
;
1607 struct elf_link_hash_entry
**eh_syms
;
1608 bfd_signed_vma
*local_got_refcounts
;
1609 bfd_signed_vma
*local_plt_refcounts
;
1610 const Elf_Internal_Rela
*rela
, *relend
;
1611 struct elf32_hppa_link_hash_table
*htab
;
1613 if (info
->relocatable
)
1616 htab
= hppa_link_hash_table (info
);
1620 elf_section_data (sec
)->local_dynrel
= NULL
;
1622 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1623 eh_syms
= elf_sym_hashes (abfd
);
1624 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1625 local_plt_refcounts
= local_got_refcounts
;
1626 if (local_plt_refcounts
!= NULL
)
1627 local_plt_refcounts
+= symtab_hdr
->sh_info
;
1629 relend
= relocs
+ sec
->reloc_count
;
1630 for (rela
= relocs
; rela
< relend
; rela
++)
1632 unsigned long r_symndx
;
1633 unsigned int r_type
;
1634 struct elf_link_hash_entry
*eh
= NULL
;
1636 r_symndx
= ELF32_R_SYM (rela
->r_info
);
1637 if (r_symndx
>= symtab_hdr
->sh_info
)
1639 struct elf32_hppa_link_hash_entry
*hh
;
1640 struct elf32_hppa_dyn_reloc_entry
**hdh_pp
;
1641 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
1643 eh
= eh_syms
[r_symndx
- symtab_hdr
->sh_info
];
1644 while (eh
->root
.type
== bfd_link_hash_indirect
1645 || eh
->root
.type
== bfd_link_hash_warning
)
1646 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
1647 hh
= hppa_elf_hash_entry (eh
);
1649 for (hdh_pp
= &hh
->dyn_relocs
; (hdh_p
= *hdh_pp
) != NULL
; hdh_pp
= &hdh_p
->hdh_next
)
1650 if (hdh_p
->sec
== sec
)
1652 /* Everything must go for SEC. */
1653 *hdh_pp
= hdh_p
->hdh_next
;
1658 r_type
= ELF32_R_TYPE (rela
->r_info
);
1659 r_type
= elf32_hppa_optimized_tls_reloc (info
, r_type
, eh
!= NULL
);
1663 case R_PARISC_DLTIND14F
:
1664 case R_PARISC_DLTIND14R
:
1665 case R_PARISC_DLTIND21L
:
1666 case R_PARISC_TLS_GD21L
:
1667 case R_PARISC_TLS_GD14R
:
1668 case R_PARISC_TLS_IE21L
:
1669 case R_PARISC_TLS_IE14R
:
1672 if (eh
->got
.refcount
> 0)
1673 eh
->got
.refcount
-= 1;
1675 else if (local_got_refcounts
!= NULL
)
1677 if (local_got_refcounts
[r_symndx
] > 0)
1678 local_got_refcounts
[r_symndx
] -= 1;
1682 case R_PARISC_TLS_LDM21L
:
1683 case R_PARISC_TLS_LDM14R
:
1684 htab
->tls_ldm_got
.refcount
-= 1;
1687 case R_PARISC_PCREL12F
:
1688 case R_PARISC_PCREL17C
:
1689 case R_PARISC_PCREL17F
:
1690 case R_PARISC_PCREL22F
:
1693 if (eh
->plt
.refcount
> 0)
1694 eh
->plt
.refcount
-= 1;
1698 case R_PARISC_PLABEL14R
:
1699 case R_PARISC_PLABEL21L
:
1700 case R_PARISC_PLABEL32
:
1703 if (eh
->plt
.refcount
> 0)
1704 eh
->plt
.refcount
-= 1;
1706 else if (local_plt_refcounts
!= NULL
)
1708 if (local_plt_refcounts
[r_symndx
] > 0)
1709 local_plt_refcounts
[r_symndx
] -= 1;
1721 /* Support for core dump NOTE sections. */
1724 elf32_hppa_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
1729 switch (note
->descsz
)
1734 case 396: /* Linux/hppa */
1736 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1739 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1748 /* Make a ".reg/999" section. */
1749 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1750 size
, note
->descpos
+ offset
);
1754 elf32_hppa_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
1756 switch (note
->descsz
)
1761 case 124: /* Linux/hppa elf_prpsinfo. */
1762 elf_tdata (abfd
)->core_program
1763 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
1764 elf_tdata (abfd
)->core_command
1765 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
1768 /* Note that for some reason, a spurious space is tacked
1769 onto the end of the args in some (at least one anyway)
1770 implementations, so strip it off if it exists. */
1772 char *command
= elf_tdata (abfd
)->core_command
;
1773 int n
= strlen (command
);
1775 if (0 < n
&& command
[n
- 1] == ' ')
1776 command
[n
- 1] = '\0';
1782 /* Our own version of hide_symbol, so that we can keep plt entries for
1786 elf32_hppa_hide_symbol (struct bfd_link_info
*info
,
1787 struct elf_link_hash_entry
*eh
,
1788 bfd_boolean force_local
)
1792 eh
->forced_local
= 1;
1793 if (eh
->dynindx
!= -1)
1796 _bfd_elf_strtab_delref (elf_hash_table (info
)->dynstr
,
1801 if (! hppa_elf_hash_entry (eh
)->plabel
)
1804 eh
->plt
= elf_hash_table (info
)->init_plt_refcount
;
1808 /* Adjust a symbol defined by a dynamic object and referenced by a
1809 regular object. The current definition is in some section of the
1810 dynamic object, but we're not including those sections. We have to
1811 change the definition to something the rest of the link can
1815 elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info
*info
,
1816 struct elf_link_hash_entry
*eh
)
1818 struct elf32_hppa_link_hash_table
*htab
;
1821 /* If this is a function, put it in the procedure linkage table. We
1822 will fill in the contents of the procedure linkage table later. */
1823 if (eh
->type
== STT_FUNC
1826 if (eh
->plt
.refcount
<= 0
1828 && eh
->root
.type
!= bfd_link_hash_defweak
1829 && ! hppa_elf_hash_entry (eh
)->plabel
1830 && (!info
->shared
|| info
->symbolic
)))
1832 /* The .plt entry is not needed when:
1833 a) Garbage collection has removed all references to the
1835 b) We know for certain the symbol is defined in this
1836 object, and it's not a weak definition, nor is the symbol
1837 used by a plabel relocation. Either this object is the
1838 application or we are doing a shared symbolic link. */
1840 eh
->plt
.offset
= (bfd_vma
) -1;
1847 eh
->plt
.offset
= (bfd_vma
) -1;
1849 /* If this is a weak symbol, and there is a real definition, the
1850 processor independent code will have arranged for us to see the
1851 real definition first, and we can just use the same value. */
1852 if (eh
->u
.weakdef
!= NULL
)
1854 if (eh
->u
.weakdef
->root
.type
!= bfd_link_hash_defined
1855 && eh
->u
.weakdef
->root
.type
!= bfd_link_hash_defweak
)
1857 eh
->root
.u
.def
.section
= eh
->u
.weakdef
->root
.u
.def
.section
;
1858 eh
->root
.u
.def
.value
= eh
->u
.weakdef
->root
.u
.def
.value
;
1859 if (ELIMINATE_COPY_RELOCS
)
1860 eh
->non_got_ref
= eh
->u
.weakdef
->non_got_ref
;
1864 /* This is a reference to a symbol defined by a dynamic object which
1865 is not a function. */
1867 /* If we are creating a shared library, we must presume that the
1868 only references to the symbol are via the global offset table.
1869 For such cases we need not do anything here; the relocations will
1870 be handled correctly by relocate_section. */
1874 /* If there are no references to this symbol that do not use the
1875 GOT, we don't need to generate a copy reloc. */
1876 if (!eh
->non_got_ref
)
1879 if (ELIMINATE_COPY_RELOCS
)
1881 struct elf32_hppa_link_hash_entry
*hh
;
1882 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
1884 hh
= hppa_elf_hash_entry (eh
);
1885 for (hdh_p
= hh
->dyn_relocs
; hdh_p
!= NULL
; hdh_p
= hdh_p
->hdh_next
)
1887 sec
= hdh_p
->sec
->output_section
;
1888 if (sec
!= NULL
&& (sec
->flags
& SEC_READONLY
) != 0)
1892 /* If we didn't find any dynamic relocs in read-only sections, then
1893 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1896 eh
->non_got_ref
= 0;
1903 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
1904 eh
->root
.root
.string
);
1908 /* We must allocate the symbol in our .dynbss section, which will
1909 become part of the .bss section of the executable. There will be
1910 an entry for this symbol in the .dynsym section. The dynamic
1911 object will contain position independent code, so all references
1912 from the dynamic object to this symbol will go through the global
1913 offset table. The dynamic linker will use the .dynsym entry to
1914 determine the address it must put in the global offset table, so
1915 both the dynamic object and the regular object will refer to the
1916 same memory location for the variable. */
1918 htab
= hppa_link_hash_table (info
);
1922 /* We must generate a COPY reloc to tell the dynamic linker to
1923 copy the initial value out of the dynamic object and into the
1924 runtime process image. */
1925 if ((eh
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
1927 htab
->srelbss
->size
+= sizeof (Elf32_External_Rela
);
1931 sec
= htab
->sdynbss
;
1933 return _bfd_elf_adjust_dynamic_copy (eh
, sec
);
1936 /* Allocate space in the .plt for entries that won't have relocations.
1937 ie. plabel entries. */
1940 allocate_plt_static (struct elf_link_hash_entry
*eh
, void *inf
)
1942 struct bfd_link_info
*info
;
1943 struct elf32_hppa_link_hash_table
*htab
;
1944 struct elf32_hppa_link_hash_entry
*hh
;
1947 if (eh
->root
.type
== bfd_link_hash_indirect
)
1950 if (eh
->root
.type
== bfd_link_hash_warning
)
1951 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
1953 info
= (struct bfd_link_info
*) inf
;
1954 hh
= hppa_elf_hash_entry (eh
);
1955 htab
= hppa_link_hash_table (info
);
1959 if (htab
->etab
.dynamic_sections_created
1960 && eh
->plt
.refcount
> 0)
1962 /* Make sure this symbol is output as a dynamic symbol.
1963 Undefined weak syms won't yet be marked as dynamic. */
1964 if (eh
->dynindx
== -1
1965 && !eh
->forced_local
1966 && eh
->type
!= STT_PARISC_MILLI
)
1968 if (! bfd_elf_link_record_dynamic_symbol (info
, eh
))
1972 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
, eh
))
1974 /* Allocate these later. From this point on, h->plabel
1975 means that the plt entry is only used by a plabel.
1976 We'll be using a normal plt entry for this symbol, so
1977 clear the plabel indicator. */
1981 else if (hh
->plabel
)
1983 /* Make an entry in the .plt section for plabel references
1984 that won't have a .plt entry for other reasons. */
1986 eh
->plt
.offset
= sec
->size
;
1987 sec
->size
+= PLT_ENTRY_SIZE
;
1991 /* No .plt entry needed. */
1992 eh
->plt
.offset
= (bfd_vma
) -1;
1998 eh
->plt
.offset
= (bfd_vma
) -1;
2005 /* Allocate space in .plt, .got and associated reloc sections for
2009 allocate_dynrelocs (struct elf_link_hash_entry
*eh
, void *inf
)
2011 struct bfd_link_info
*info
;
2012 struct elf32_hppa_link_hash_table
*htab
;
2014 struct elf32_hppa_link_hash_entry
*hh
;
2015 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
2017 if (eh
->root
.type
== bfd_link_hash_indirect
)
2020 if (eh
->root
.type
== bfd_link_hash_warning
)
2021 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
2024 htab
= hppa_link_hash_table (info
);
2028 hh
= hppa_elf_hash_entry (eh
);
2030 if (htab
->etab
.dynamic_sections_created
2031 && eh
->plt
.offset
!= (bfd_vma
) -1
2033 && eh
->plt
.refcount
> 0)
2035 /* Make an entry in the .plt section. */
2037 eh
->plt
.offset
= sec
->size
;
2038 sec
->size
+= PLT_ENTRY_SIZE
;
2040 /* We also need to make an entry in the .rela.plt section. */
2041 htab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
2042 htab
->need_plt_stub
= 1;
2045 if (eh
->got
.refcount
> 0)
2047 /* Make sure this symbol is output as a dynamic symbol.
2048 Undefined weak syms won't yet be marked as dynamic. */
2049 if (eh
->dynindx
== -1
2050 && !eh
->forced_local
2051 && eh
->type
!= STT_PARISC_MILLI
)
2053 if (! bfd_elf_link_record_dynamic_symbol (info
, eh
))
2058 eh
->got
.offset
= sec
->size
;
2059 sec
->size
+= GOT_ENTRY_SIZE
;
2060 /* R_PARISC_TLS_GD* needs two GOT entries */
2061 if ((hh
->tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
)) == (GOT_TLS_GD
| GOT_TLS_IE
))
2062 sec
->size
+= GOT_ENTRY_SIZE
* 2;
2063 else if ((hh
->tls_type
& GOT_TLS_GD
) == GOT_TLS_GD
)
2064 sec
->size
+= GOT_ENTRY_SIZE
;
2065 if (htab
->etab
.dynamic_sections_created
2067 || (eh
->dynindx
!= -1
2068 && !eh
->forced_local
)))
2070 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
2071 if ((hh
->tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
)) == (GOT_TLS_GD
| GOT_TLS_IE
))
2072 htab
->srelgot
->size
+= 2 * sizeof (Elf32_External_Rela
);
2073 else if ((hh
->tls_type
& GOT_TLS_GD
) == GOT_TLS_GD
)
2074 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
2078 eh
->got
.offset
= (bfd_vma
) -1;
2080 if (hh
->dyn_relocs
== NULL
)
2083 /* If this is a -Bsymbolic shared link, then we need to discard all
2084 space allocated for dynamic pc-relative relocs against symbols
2085 defined in a regular object. For the normal shared case, discard
2086 space for relocs that have become local due to symbol visibility
2090 #if RELATIVE_DYNRELOCS
2091 if (SYMBOL_CALLS_LOCAL (info
, eh
))
2093 struct elf32_hppa_dyn_reloc_entry
**hdh_pp
;
2095 for (hdh_pp
= &hh
->dyn_relocs
; (hdh_p
= *hdh_pp
) != NULL
; )
2097 hdh_p
->count
-= hdh_p
->relative_count
;
2098 hdh_p
->relative_count
= 0;
2099 if (hdh_p
->count
== 0)
2100 *hdh_pp
= hdh_p
->hdh_next
;
2102 hdh_pp
= &hdh_p
->hdh_next
;
2107 /* Also discard relocs on undefined weak syms with non-default
2109 if (hh
->dyn_relocs
!= NULL
2110 && eh
->root
.type
== bfd_link_hash_undefweak
)
2112 if (ELF_ST_VISIBILITY (eh
->other
) != STV_DEFAULT
)
2113 hh
->dyn_relocs
= NULL
;
2115 /* Make sure undefined weak symbols are output as a dynamic
2117 else if (eh
->dynindx
== -1
2118 && !eh
->forced_local
)
2120 if (! bfd_elf_link_record_dynamic_symbol (info
, eh
))
2127 /* For the non-shared case, discard space for relocs against
2128 symbols which turn out to need copy relocs or are not
2131 if (!eh
->non_got_ref
2132 && ((ELIMINATE_COPY_RELOCS
2134 && !eh
->def_regular
)
2135 || (htab
->etab
.dynamic_sections_created
2136 && (eh
->root
.type
== bfd_link_hash_undefweak
2137 || eh
->root
.type
== bfd_link_hash_undefined
))))
2139 /* Make sure this symbol is output as a dynamic symbol.
2140 Undefined weak syms won't yet be marked as dynamic. */
2141 if (eh
->dynindx
== -1
2142 && !eh
->forced_local
2143 && eh
->type
!= STT_PARISC_MILLI
)
2145 if (! bfd_elf_link_record_dynamic_symbol (info
, eh
))
2149 /* If that succeeded, we know we'll be keeping all the
2151 if (eh
->dynindx
!= -1)
2155 hh
->dyn_relocs
= NULL
;
2161 /* Finally, allocate space. */
2162 for (hdh_p
= hh
->dyn_relocs
; hdh_p
!= NULL
; hdh_p
= hdh_p
->hdh_next
)
2164 asection
*sreloc
= elf_section_data (hdh_p
->sec
)->sreloc
;
2165 sreloc
->size
+= hdh_p
->count
* sizeof (Elf32_External_Rela
);
2171 /* This function is called via elf_link_hash_traverse to force
2172 millicode symbols local so they do not end up as globals in the
2173 dynamic symbol table. We ought to be able to do this in
2174 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2175 for all dynamic symbols. Arguably, this is a bug in
2176 elf_adjust_dynamic_symbol. */
2179 clobber_millicode_symbols (struct elf_link_hash_entry
*eh
,
2180 struct bfd_link_info
*info
)
2182 if (eh
->root
.type
== bfd_link_hash_warning
)
2183 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
2185 if (eh
->type
== STT_PARISC_MILLI
2186 && !eh
->forced_local
)
2188 elf32_hppa_hide_symbol (info
, eh
, TRUE
);
2193 /* Find any dynamic relocs that apply to read-only sections. */
2196 readonly_dynrelocs (struct elf_link_hash_entry
*eh
, void *inf
)
2198 struct elf32_hppa_link_hash_entry
*hh
;
2199 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
2201 if (eh
->root
.type
== bfd_link_hash_warning
)
2202 eh
= (struct elf_link_hash_entry
*) eh
->root
.u
.i
.link
;
2204 hh
= hppa_elf_hash_entry (eh
);
2205 for (hdh_p
= hh
->dyn_relocs
; hdh_p
!= NULL
; hdh_p
= hdh_p
->hdh_next
)
2207 asection
*sec
= hdh_p
->sec
->output_section
;
2209 if (sec
!= NULL
&& (sec
->flags
& SEC_READONLY
) != 0)
2211 struct bfd_link_info
*info
= inf
;
2213 info
->flags
|= DF_TEXTREL
;
2215 /* Not an error, just cut short the traversal. */
2222 /* Set the sizes of the dynamic sections. */
2225 elf32_hppa_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
2226 struct bfd_link_info
*info
)
2228 struct elf32_hppa_link_hash_table
*htab
;
2234 htab
= hppa_link_hash_table (info
);
2238 dynobj
= htab
->etab
.dynobj
;
2242 if (htab
->etab
.dynamic_sections_created
)
2244 /* Set the contents of the .interp section to the interpreter. */
2245 if (info
->executable
)
2247 sec
= bfd_get_section_by_name (dynobj
, ".interp");
2250 sec
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
2251 sec
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
2254 /* Force millicode symbols local. */
2255 elf_link_hash_traverse (&htab
->etab
,
2256 clobber_millicode_symbols
,
2260 /* Set up .got and .plt offsets for local syms, and space for local
2262 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2264 bfd_signed_vma
*local_got
;
2265 bfd_signed_vma
*end_local_got
;
2266 bfd_signed_vma
*local_plt
;
2267 bfd_signed_vma
*end_local_plt
;
2268 bfd_size_type locsymcount
;
2269 Elf_Internal_Shdr
*symtab_hdr
;
2271 char *local_tls_type
;
2273 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
2276 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
2278 struct elf32_hppa_dyn_reloc_entry
*hdh_p
;
2280 for (hdh_p
= ((struct elf32_hppa_dyn_reloc_entry
*)
2281 elf_section_data (sec
)->local_dynrel
);
2283 hdh_p
= hdh_p
->hdh_next
)
2285 if (!bfd_is_abs_section (hdh_p
->sec
)
2286 && bfd_is_abs_section (hdh_p
->sec
->output_section
))
2288 /* Input section has been discarded, either because
2289 it is a copy of a linkonce section or due to
2290 linker script /DISCARD/, so we'll be discarding
2293 else if (hdh_p
->count
!= 0)
2295 srel
= elf_section_data (hdh_p
->sec
)->sreloc
;
2296 srel
->size
+= hdh_p
->count
* sizeof (Elf32_External_Rela
);
2297 if ((hdh_p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
2298 info
->flags
|= DF_TEXTREL
;
2303 local_got
= elf_local_got_refcounts (ibfd
);
2307 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2308 locsymcount
= symtab_hdr
->sh_info
;
2309 end_local_got
= local_got
+ locsymcount
;
2310 local_tls_type
= hppa_elf_local_got_tls_type (ibfd
);
2312 srel
= htab
->srelgot
;
2313 for (; local_got
< end_local_got
; ++local_got
)
2317 *local_got
= sec
->size
;
2318 sec
->size
+= GOT_ENTRY_SIZE
;
2319 if ((*local_tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
)) == (GOT_TLS_GD
| GOT_TLS_IE
))
2320 sec
->size
+= 2 * GOT_ENTRY_SIZE
;
2321 else if ((*local_tls_type
& GOT_TLS_GD
) == GOT_TLS_GD
)
2322 sec
->size
+= GOT_ENTRY_SIZE
;
2325 srel
->size
+= sizeof (Elf32_External_Rela
);
2326 if ((*local_tls_type
& (GOT_TLS_GD
| GOT_TLS_IE
)) == (GOT_TLS_GD
| GOT_TLS_IE
))
2327 srel
->size
+= 2 * sizeof (Elf32_External_Rela
);
2328 else if ((*local_tls_type
& GOT_TLS_GD
) == GOT_TLS_GD
)
2329 srel
->size
+= sizeof (Elf32_External_Rela
);
2333 *local_got
= (bfd_vma
) -1;
2338 local_plt
= end_local_got
;
2339 end_local_plt
= local_plt
+ locsymcount
;
2340 if (! htab
->etab
.dynamic_sections_created
)
2342 /* Won't be used, but be safe. */
2343 for (; local_plt
< end_local_plt
; ++local_plt
)
2344 *local_plt
= (bfd_vma
) -1;
2349 srel
= htab
->srelplt
;
2350 for (; local_plt
< end_local_plt
; ++local_plt
)
2354 *local_plt
= sec
->size
;
2355 sec
->size
+= PLT_ENTRY_SIZE
;
2357 srel
->size
+= sizeof (Elf32_External_Rela
);
2360 *local_plt
= (bfd_vma
) -1;
2365 if (htab
->tls_ldm_got
.refcount
> 0)
2367 /* Allocate 2 got entries and 1 dynamic reloc for
2368 R_PARISC_TLS_DTPMOD32 relocs. */
2369 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
2370 htab
->sgot
->size
+= (GOT_ENTRY_SIZE
* 2);
2371 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
2374 htab
->tls_ldm_got
.offset
= -1;
2376 /* Do all the .plt entries without relocs first. The dynamic linker
2377 uses the last .plt reloc to find the end of the .plt (and hence
2378 the start of the .got) for lazy linking. */
2379 elf_link_hash_traverse (&htab
->etab
, allocate_plt_static
, info
);
2381 /* Allocate global sym .plt and .got entries, and space for global
2382 sym dynamic relocs. */
2383 elf_link_hash_traverse (&htab
->etab
, allocate_dynrelocs
, info
);
2385 /* The check_relocs and adjust_dynamic_symbol entry points have
2386 determined the sizes of the various dynamic sections. Allocate
2389 for (sec
= dynobj
->sections
; sec
!= NULL
; sec
= sec
->next
)
2391 if ((sec
->flags
& SEC_LINKER_CREATED
) == 0)
2394 if (sec
== htab
->splt
)
2396 if (htab
->need_plt_stub
)
2398 /* Make space for the plt stub at the end of the .plt
2399 section. We want this stub right at the end, up
2400 against the .got section. */
2401 int gotalign
= bfd_section_alignment (dynobj
, htab
->sgot
);
2402 int pltalign
= bfd_section_alignment (dynobj
, sec
);
2405 if (gotalign
> pltalign
)
2406 bfd_set_section_alignment (dynobj
, sec
, gotalign
);
2407 mask
= ((bfd_size_type
) 1 << gotalign
) - 1;
2408 sec
->size
= (sec
->size
+ sizeof (plt_stub
) + mask
) & ~mask
;
2411 else if (sec
== htab
->sgot
2412 || sec
== htab
->sdynbss
)
2414 else if (CONST_STRNEQ (bfd_get_section_name (dynobj
, sec
), ".rela"))
2418 /* Remember whether there are any reloc sections other
2420 if (sec
!= htab
->srelplt
)
2423 /* We use the reloc_count field as a counter if we need
2424 to copy relocs into the output file. */
2425 sec
->reloc_count
= 0;
2430 /* It's not one of our sections, so don't allocate space. */
2436 /* If we don't need this section, strip it from the
2437 output file. This is mostly to handle .rela.bss and
2438 .rela.plt. We must create both sections in
2439 create_dynamic_sections, because they must be created
2440 before the linker maps input sections to output
2441 sections. The linker does that before
2442 adjust_dynamic_symbol is called, and it is that
2443 function which decides whether anything needs to go
2444 into these sections. */
2445 sec
->flags
|= SEC_EXCLUDE
;
2449 if ((sec
->flags
& SEC_HAS_CONTENTS
) == 0)
2452 /* Allocate memory for the section contents. Zero it, because
2453 we may not fill in all the reloc sections. */
2454 sec
->contents
= bfd_zalloc (dynobj
, sec
->size
);
2455 if (sec
->contents
== NULL
)
2459 if (htab
->etab
.dynamic_sections_created
)
2461 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2462 actually has nothing to do with the PLT, it is how we
2463 communicate the LTP value of a load module to the dynamic
2465 #define add_dynamic_entry(TAG, VAL) \
2466 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2468 if (!add_dynamic_entry (DT_PLTGOT
, 0))
2471 /* Add some entries to the .dynamic section. We fill in the
2472 values later, in elf32_hppa_finish_dynamic_sections, but we
2473 must add the entries now so that we get the correct size for
2474 the .dynamic section. The DT_DEBUG entry is filled in by the
2475 dynamic linker and used by the debugger. */
2476 if (info
->executable
)
2478 if (!add_dynamic_entry (DT_DEBUG
, 0))
2482 if (htab
->srelplt
->size
!= 0)
2484 if (!add_dynamic_entry (DT_PLTRELSZ
, 0)
2485 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
2486 || !add_dynamic_entry (DT_JMPREL
, 0))
2492 if (!add_dynamic_entry (DT_RELA
, 0)
2493 || !add_dynamic_entry (DT_RELASZ
, 0)
2494 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf32_External_Rela
)))
2497 /* If any dynamic relocs apply to a read-only section,
2498 then we need a DT_TEXTREL entry. */
2499 if ((info
->flags
& DF_TEXTREL
) == 0)
2500 elf_link_hash_traverse (&htab
->etab
, readonly_dynrelocs
, info
);
2502 if ((info
->flags
& DF_TEXTREL
) != 0)
2504 if (!add_dynamic_entry (DT_TEXTREL
, 0))
2509 #undef add_dynamic_entry
2514 /* External entry points for sizing and building linker stubs. */
2516 /* Set up various things so that we can make a list of input sections
2517 for each output section included in the link. Returns -1 on error,
2518 0 when no stubs will be needed, and 1 on success. */
2521 elf32_hppa_setup_section_lists (bfd
*output_bfd
, struct bfd_link_info
*info
)
2524 unsigned int bfd_count
;
2525 int top_id
, top_index
;
2527 asection
**input_list
, **list
;
2529 struct elf32_hppa_link_hash_table
*htab
= hppa_link_hash_table (info
);
2534 /* Count the number of input BFDs and find the top input section id. */
2535 for (input_bfd
= info
->input_bfds
, bfd_count
= 0, top_id
= 0;
2537 input_bfd
= input_bfd
->link_next
)
2540 for (section
= input_bfd
->sections
;
2542 section
= section
->next
)
2544 if (top_id
< section
->id
)
2545 top_id
= section
->id
;
2548 htab
->bfd_count
= bfd_count
;
2550 amt
= sizeof (struct map_stub
) * (top_id
+ 1);
2551 htab
->stub_group
= bfd_zmalloc (amt
);
2552 if (htab
->stub_group
== NULL
)
2555 /* We can't use output_bfd->section_count here to find the top output
2556 section index as some sections may have been removed, and
2557 strip_excluded_output_sections doesn't renumber the indices. */
2558 for (section
= output_bfd
->sections
, top_index
= 0;
2560 section
= section
->next
)
2562 if (top_index
< section
->index
)
2563 top_index
= section
->index
;
2566 htab
->top_index
= top_index
;
2567 amt
= sizeof (asection
*) * (top_index
+ 1);
2568 input_list
= bfd_malloc (amt
);
2569 htab
->input_list
= input_list
;
2570 if (input_list
== NULL
)
2573 /* For sections we aren't interested in, mark their entries with a
2574 value we can check later. */
2575 list
= input_list
+ top_index
;
2577 *list
= bfd_abs_section_ptr
;
2578 while (list
-- != input_list
);
2580 for (section
= output_bfd
->sections
;
2582 section
= section
->next
)
2584 if ((section
->flags
& SEC_CODE
) != 0)
2585 input_list
[section
->index
] = NULL
;
2591 /* The linker repeatedly calls this function for each input section,
2592 in the order that input sections are linked into output sections.
2593 Build lists of input sections to determine groupings between which
2594 we may insert linker stubs. */
2597 elf32_hppa_next_input_section (struct bfd_link_info
*info
, asection
*isec
)
2599 struct elf32_hppa_link_hash_table
*htab
= hppa_link_hash_table (info
);
2604 if (isec
->output_section
->index
<= htab
->top_index
)
2606 asection
**list
= htab
->input_list
+ isec
->output_section
->index
;
2607 if (*list
!= bfd_abs_section_ptr
)
2609 /* Steal the link_sec pointer for our list. */
2610 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2611 /* This happens to make the list in reverse order,
2612 which is what we want. */
2613 PREV_SEC (isec
) = *list
;
2619 /* See whether we can group stub sections together. Grouping stub
2620 sections may result in fewer stubs. More importantly, we need to
2621 put all .init* and .fini* stubs at the beginning of the .init or
2622 .fini output sections respectively, because glibc splits the
2623 _init and _fini functions into multiple parts. Putting a stub in
2624 the middle of a function is not a good idea. */
2627 group_sections (struct elf32_hppa_link_hash_table
*htab
,
2628 bfd_size_type stub_group_size
,
2629 bfd_boolean stubs_always_before_branch
)
2631 asection
**list
= htab
->input_list
+ htab
->top_index
;
2634 asection
*tail
= *list
;
2635 if (tail
== bfd_abs_section_ptr
)
2637 while (tail
!= NULL
)
2641 bfd_size_type total
;
2642 bfd_boolean big_sec
;
2646 big_sec
= total
>= stub_group_size
;
2648 while ((prev
= PREV_SEC (curr
)) != NULL
2649 && ((total
+= curr
->output_offset
- prev
->output_offset
)
2653 /* OK, the size from the start of CURR to the end is less
2654 than 240000 bytes and thus can be handled by one stub
2655 section. (or the tail section is itself larger than
2656 240000 bytes, in which case we may be toast.)
2657 We should really be keeping track of the total size of
2658 stubs added here, as stubs contribute to the final output
2659 section size. That's a little tricky, and this way will
2660 only break if stubs added total more than 22144 bytes, or
2661 2768 long branch stubs. It seems unlikely for more than
2662 2768 different functions to be called, especially from
2663 code only 240000 bytes long. This limit used to be
2664 250000, but c++ code tends to generate lots of little
2665 functions, and sometimes violated the assumption. */
2668 prev
= PREV_SEC (tail
);
2669 /* Set up this stub group. */
2670 htab
->stub_group
[tail
->id
].link_sec
= curr
;
2672 while (tail
!= curr
&& (tail
= prev
) != NULL
);
2674 /* But wait, there's more! Input sections up to 240000
2675 bytes before the stub section can be handled by it too.
2676 Don't do this if we have a really large section after the
2677 stubs, as adding more stubs increases the chance that
2678 branches may not reach into the stub section. */
2679 if (!stubs_always_before_branch
&& !big_sec
)
2683 && ((total
+= tail
->output_offset
- prev
->output_offset
)
2687 prev
= PREV_SEC (tail
);
2688 htab
->stub_group
[tail
->id
].link_sec
= curr
;
2694 while (list
-- != htab
->input_list
);
2695 free (htab
->input_list
);
2699 /* Read in all local syms for all input bfds, and create hash entries
2700 for export stubs if we are building a multi-subspace shared lib.
2701 Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2704 get_local_syms (bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*info
)
2706 unsigned int bfd_indx
;
2707 Elf_Internal_Sym
*local_syms
, **all_local_syms
;
2708 int stub_changed
= 0;
2709 struct elf32_hppa_link_hash_table
*htab
= hppa_link_hash_table (info
);
2714 /* We want to read in symbol extension records only once. To do this
2715 we need to read in the local symbols in parallel and save them for
2716 later use; so hold pointers to the local symbols in an array. */
2717 bfd_size_type amt
= sizeof (Elf_Internal_Sym
*) * htab
->bfd_count
;
2718 all_local_syms
= bfd_zmalloc (amt
);
2719 htab
->all_local_syms
= all_local_syms
;
2720 if (all_local_syms
== NULL
)
2723 /* Walk over all the input BFDs, swapping in local symbols.
2724 If we are creating a shared library, create hash entries for the
2728 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2730 Elf_Internal_Shdr
*symtab_hdr
;
2732 /* We'll need the symbol table in a second. */
2733 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2734 if (symtab_hdr
->sh_info
== 0)
2737 /* We need an array of the local symbols attached to the input bfd. */
2738 local_syms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2739 if (local_syms
== NULL
)
2741 local_syms
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
2742 symtab_hdr
->sh_info
, 0,
2744 /* Cache them for elf_link_input_bfd. */
2745 symtab_hdr
->contents
= (unsigned char *) local_syms
;
2747 if (local_syms
== NULL
)
2750 all_local_syms
[bfd_indx
] = local_syms
;
2752 if (info
->shared
&& htab
->multi_subspace
)
2754 struct elf_link_hash_entry
**eh_syms
;
2755 struct elf_link_hash_entry
**eh_symend
;
2756 unsigned int symcount
;
2758 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2759 - symtab_hdr
->sh_info
);
2760 eh_syms
= (struct elf_link_hash_entry
**) elf_sym_hashes (input_bfd
);
2761 eh_symend
= (struct elf_link_hash_entry
**) (eh_syms
+ symcount
);
2763 /* Look through the global syms for functions; We need to
2764 build export stubs for all globally visible functions. */
2765 for (; eh_syms
< eh_symend
; eh_syms
++)
2767 struct elf32_hppa_link_hash_entry
*hh
;
2769 hh
= hppa_elf_hash_entry (*eh_syms
);
2771 while (hh
->eh
.root
.type
== bfd_link_hash_indirect
2772 || hh
->eh
.root
.type
== bfd_link_hash_warning
)
2773 hh
= hppa_elf_hash_entry (hh
->eh
.root
.u
.i
.link
);
2775 /* At this point in the link, undefined syms have been
2776 resolved, so we need to check that the symbol was
2777 defined in this BFD. */
2778 if ((hh
->eh
.root
.type
== bfd_link_hash_defined
2779 || hh
->eh
.root
.type
== bfd_link_hash_defweak
)
2780 && hh
->eh
.type
== STT_FUNC
2781 && hh
->eh
.root
.u
.def
.section
->output_section
!= NULL
2782 && (hh
->eh
.root
.u
.def
.section
->output_section
->owner
2784 && hh
->eh
.root
.u
.def
.section
->owner
== input_bfd
2785 && hh
->eh
.def_regular
2786 && !hh
->eh
.forced_local
2787 && ELF_ST_VISIBILITY (hh
->eh
.other
) == STV_DEFAULT
)
2790 const char *stub_name
;
2791 struct elf32_hppa_stub_hash_entry
*hsh
;
2793 sec
= hh
->eh
.root
.u
.def
.section
;
2794 stub_name
= hh_name (hh
);
2795 hsh
= hppa_stub_hash_lookup (&htab
->bstab
,
2800 hsh
= hppa_add_stub (stub_name
, sec
, htab
);
2804 hsh
->target_value
= hh
->eh
.root
.u
.def
.value
;
2805 hsh
->target_section
= hh
->eh
.root
.u
.def
.section
;
2806 hsh
->stub_type
= hppa_stub_export
;
2812 (*_bfd_error_handler
) (_("%B: duplicate export stub %s"),
2821 return stub_changed
;
2824 /* Determine and set the size of the stub section for a final link.
2826 The basic idea here is to examine all the relocations looking for
2827 PC-relative calls to a target that is unreachable with a "bl"
2831 elf32_hppa_size_stubs
2832 (bfd
*output_bfd
, bfd
*stub_bfd
, struct bfd_link_info
*info
,
2833 bfd_boolean multi_subspace
, bfd_signed_vma group_size
,
2834 asection
* (*add_stub_section
) (const char *, asection
*),
2835 void (*layout_sections_again
) (void))
2837 bfd_size_type stub_group_size
;
2838 bfd_boolean stubs_always_before_branch
;
2839 bfd_boolean stub_changed
;
2840 struct elf32_hppa_link_hash_table
*htab
= hppa_link_hash_table (info
);
2845 /* Stash our params away. */
2846 htab
->stub_bfd
= stub_bfd
;
2847 htab
->multi_subspace
= multi_subspace
;
2848 htab
->add_stub_section
= add_stub_section
;
2849 htab
->layout_sections_again
= layout_sections_again
;
2850 stubs_always_before_branch
= group_size
< 0;
2852 stub_group_size
= -group_size
;
2854 stub_group_size
= group_size
;
2855 if (stub_group_size
== 1)
2857 /* Default values. */
2858 if (stubs_always_before_branch
)
2860 stub_group_size
= 7680000;
2861 if (htab
->has_17bit_branch
|| htab
->multi_subspace
)
2862 stub_group_size
= 240000;
2863 if (htab
->has_12bit_branch
)
2864 stub_group_size
= 7500;
2868 stub_group_size
= 6971392;
2869 if (htab
->has_17bit_branch
|| htab
->multi_subspace
)
2870 stub_group_size
= 217856;
2871 if (htab
->has_12bit_branch
)
2872 stub_group_size
= 6808;
2876 group_sections (htab
, stub_group_size
, stubs_always_before_branch
);
2878 switch (get_local_syms (output_bfd
, info
->input_bfds
, info
))
2881 if (htab
->all_local_syms
)
2882 goto error_ret_free_local
;
2886 stub_changed
= FALSE
;
2890 stub_changed
= TRUE
;
2897 unsigned int bfd_indx
;
2900 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
2902 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
2904 Elf_Internal_Shdr
*symtab_hdr
;
2906 Elf_Internal_Sym
*local_syms
;
2908 /* We'll need the symbol table in a second. */
2909 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2910 if (symtab_hdr
->sh_info
== 0)
2913 local_syms
= htab
->all_local_syms
[bfd_indx
];
2915 /* Walk over each section attached to the input bfd. */
2916 for (section
= input_bfd
->sections
;
2918 section
= section
->next
)
2920 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2922 /* If there aren't any relocs, then there's nothing more
2924 if ((section
->flags
& SEC_RELOC
) == 0
2925 || section
->reloc_count
== 0)
2928 /* If this section is a link-once section that will be
2929 discarded, then don't create any stubs. */
2930 if (section
->output_section
== NULL
2931 || section
->output_section
->owner
!= output_bfd
)
2934 /* Get the relocs. */
2936 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
2938 if (internal_relocs
== NULL
)
2939 goto error_ret_free_local
;
2941 /* Now examine each relocation. */
2942 irela
= internal_relocs
;
2943 irelaend
= irela
+ section
->reloc_count
;
2944 for (; irela
< irelaend
; irela
++)
2946 unsigned int r_type
, r_indx
;
2947 enum elf32_hppa_stub_type stub_type
;
2948 struct elf32_hppa_stub_hash_entry
*hsh
;
2951 bfd_vma destination
;
2952 struct elf32_hppa_link_hash_entry
*hh
;
2954 const asection
*id_sec
;
2956 r_type
= ELF32_R_TYPE (irela
->r_info
);
2957 r_indx
= ELF32_R_SYM (irela
->r_info
);
2959 if (r_type
>= (unsigned int) R_PARISC_UNIMPLEMENTED
)
2961 bfd_set_error (bfd_error_bad_value
);
2962 error_ret_free_internal
:
2963 if (elf_section_data (section
)->relocs
== NULL
)
2964 free (internal_relocs
);
2965 goto error_ret_free_local
;
2968 /* Only look for stubs on call instructions. */
2969 if (r_type
!= (unsigned int) R_PARISC_PCREL12F
2970 && r_type
!= (unsigned int) R_PARISC_PCREL17F
2971 && r_type
!= (unsigned int) R_PARISC_PCREL22F
)
2974 /* Now determine the call target, its name, value,
2980 if (r_indx
< symtab_hdr
->sh_info
)
2982 /* It's a local symbol. */
2983 Elf_Internal_Sym
*sym
;
2984 Elf_Internal_Shdr
*hdr
;
2987 sym
= local_syms
+ r_indx
;
2988 if (ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
)
2989 sym_value
= sym
->st_value
;
2990 shndx
= sym
->st_shndx
;
2991 if (shndx
< elf_numsections (input_bfd
))
2993 hdr
= elf_elfsections (input_bfd
)[shndx
];
2994 sym_sec
= hdr
->bfd_section
;
2995 destination
= (sym_value
+ irela
->r_addend
2996 + sym_sec
->output_offset
2997 + sym_sec
->output_section
->vma
);
3002 /* It's an external symbol. */
3005 e_indx
= r_indx
- symtab_hdr
->sh_info
;
3006 hh
= hppa_elf_hash_entry (elf_sym_hashes (input_bfd
)[e_indx
]);
3008 while (hh
->eh
.root
.type
== bfd_link_hash_indirect
3009 || hh
->eh
.root
.type
== bfd_link_hash_warning
)
3010 hh
= hppa_elf_hash_entry (hh
->eh
.root
.u
.i
.link
);
3012 if (hh
->eh
.root
.type
== bfd_link_hash_defined
3013 || hh
->eh
.root
.type
== bfd_link_hash_defweak
)
3015 sym_sec
= hh
->eh
.root
.u
.def
.section
;
3016 sym_value
= hh
->eh
.root
.u
.def
.value
;
3017 if (sym_sec
->output_section
!= NULL
)
3018 destination
= (sym_value
+ irela
->r_addend
3019 + sym_sec
->output_offset
3020 + sym_sec
->output_section
->vma
);
3022 else if (hh
->eh
.root
.type
== bfd_link_hash_undefweak
)
3027 else if (hh
->eh
.root
.type
== bfd_link_hash_undefined
)
3029 if (! (info
->unresolved_syms_in_objects
== RM_IGNORE
3030 && (ELF_ST_VISIBILITY (hh
->eh
.other
)
3032 && hh
->eh
.type
!= STT_PARISC_MILLI
))
3037 bfd_set_error (bfd_error_bad_value
);
3038 goto error_ret_free_internal
;
3042 /* Determine what (if any) linker stub is needed. */
3043 stub_type
= hppa_type_of_stub (section
, irela
, hh
,
3045 if (stub_type
== hppa_stub_none
)
3048 /* Support for grouping stub sections. */
3049 id_sec
= htab
->stub_group
[section
->id
].link_sec
;
3051 /* Get the name of this stub. */
3052 stub_name
= hppa_stub_name (id_sec
, sym_sec
, hh
, irela
);
3054 goto error_ret_free_internal
;
3056 hsh
= hppa_stub_hash_lookup (&htab
->bstab
,
3061 /* The proper stub has already been created. */
3066 hsh
= hppa_add_stub (stub_name
, section
, htab
);
3070 goto error_ret_free_internal
;
3073 hsh
->target_value
= sym_value
;
3074 hsh
->target_section
= sym_sec
;
3075 hsh
->stub_type
= stub_type
;
3078 if (stub_type
== hppa_stub_import
)
3079 hsh
->stub_type
= hppa_stub_import_shared
;
3080 else if (stub_type
== hppa_stub_long_branch
)
3081 hsh
->stub_type
= hppa_stub_long_branch_shared
;
3084 stub_changed
= TRUE
;
3087 /* We're done with the internal relocs, free them. */
3088 if (elf_section_data (section
)->relocs
== NULL
)
3089 free (internal_relocs
);
3096 /* OK, we've added some stubs. Find out the new size of the
3098 for (stub_sec
= htab
->stub_bfd
->sections
;
3100 stub_sec
= stub_sec
->next
)
3103 bfd_hash_traverse (&htab
->bstab
, hppa_size_one_stub
, htab
);
3105 /* Ask the linker to do its stuff. */
3106 (*htab
->layout_sections_again
) ();
3107 stub_changed
= FALSE
;
3110 free (htab
->all_local_syms
);
3113 error_ret_free_local
:
3114 free (htab
->all_local_syms
);
3118 /* For a final link, this function is called after we have sized the
3119 stubs to provide a value for __gp. */
3122 elf32_hppa_set_gp (bfd
*abfd
, struct bfd_link_info
*info
)
3124 struct bfd_link_hash_entry
*h
;
3125 asection
*sec
= NULL
;
3127 struct elf32_hppa_link_hash_table
*htab
;
3129 htab
= hppa_link_hash_table (info
);
3133 h
= bfd_link_hash_lookup (&htab
->etab
.root
, "$global$", FALSE
, FALSE
, FALSE
);
3136 && (h
->type
== bfd_link_hash_defined
3137 || h
->type
== bfd_link_hash_defweak
))
3139 gp_val
= h
->u
.def
.value
;
3140 sec
= h
->u
.def
.section
;
3144 asection
*splt
= bfd_get_section_by_name (abfd
, ".plt");
3145 asection
*sgot
= bfd_get_section_by_name (abfd
, ".got");
3147 /* Choose to point our LTP at, in this order, one of .plt, .got,
3148 or .data, if these sections exist. In the case of choosing
3149 .plt try to make the LTP ideal for addressing anywhere in the
3150 .plt or .got with a 14 bit signed offset. Typically, the end
3151 of the .plt is the start of the .got, so choose .plt + 0x2000
3152 if either the .plt or .got is larger than 0x2000. If both
3153 the .plt and .got are smaller than 0x2000, choose the end of
3154 the .plt section. */
3155 sec
= strcmp (bfd_get_target (abfd
), "elf32-hppa-netbsd") == 0
3160 if (gp_val
> 0x2000 || (sgot
&& sgot
->size
> 0x2000))
3170 if (strcmp (bfd_get_target (abfd
), "elf32-hppa-netbsd") != 0)
3172 /* We know we don't have a .plt. If .got is large,
3174 if (sec
->size
> 0x2000)
3180 /* No .plt or .got. Who cares what the LTP is? */
3181 sec
= bfd_get_section_by_name (abfd
, ".data");
3187 h
->type
= bfd_link_hash_defined
;
3188 h
->u
.def
.value
= gp_val
;
3190 h
->u
.def
.section
= sec
;
3192 h
->u
.def
.section
= bfd_abs_section_ptr
;
3196 if (sec
!= NULL
&& sec
->output_section
!= NULL
)
3197 gp_val
+= sec
->output_section
->vma
+ sec
->output_offset
;
3199 elf_gp (abfd
) = gp_val
;
3203 /* Build all the stubs associated with the current output file. The
3204 stubs are kept in a hash table attached to the main linker hash
3205 table. We also set up the .plt entries for statically linked PIC
3206 functions here. This function is called via hppaelf_finish in the
3210 elf32_hppa_build_stubs (struct bfd_link_info
*info
)
3213 struct bfd_hash_table
*table
;
3214 struct elf32_hppa_link_hash_table
*htab
;
3216 htab
= hppa_link_hash_table (info
);
3220 for (stub_sec
= htab
->stub_bfd
->sections
;
3222 stub_sec
= stub_sec
->next
)
3226 /* Allocate memory to hold the linker stubs. */
3227 size
= stub_sec
->size
;
3228 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
3229 if (stub_sec
->contents
== NULL
&& size
!= 0)
3234 /* Build the stubs as directed by the stub hash table. */
3235 table
= &htab
->bstab
;
3236 bfd_hash_traverse (table
, hppa_build_one_stub
, info
);
3241 /* Return the base vma address which should be subtracted from the real
3242 address when resolving a dtpoff relocation.
3243 This is PT_TLS segment p_vaddr. */
3246 dtpoff_base (struct bfd_link_info
*info
)
3248 /* If tls_sec is NULL, we should have signalled an error already. */
3249 if (elf_hash_table (info
)->tls_sec
== NULL
)
3251 return elf_hash_table (info
)->tls_sec
->vma
;
3254 /* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3257 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
3259 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
3261 /* If tls_sec is NULL, we should have signalled an error already. */
3262 if (htab
->tls_sec
== NULL
)
3264 /* hppa TLS ABI is variant I and static TLS block start just after
3265 tcbhead structure which has 2 pointer fields. */
3266 return (address
- htab
->tls_sec
->vma
3267 + align_power ((bfd_vma
) 8, htab
->tls_sec
->alignment_power
));
3270 /* Perform a final link. */
3273 elf32_hppa_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
3275 /* Invoke the regular ELF linker to do all the work. */
3276 if (!bfd_elf_final_link (abfd
, info
))
3279 /* If we're producing a final executable, sort the contents of the
3281 if (info
->relocatable
)
3284 return elf_hppa_sort_unwind (abfd
);
3287 /* Record the lowest address for the data and text segments. */
3290 hppa_record_segment_addr (bfd
*abfd
, asection
*section
, void *data
)
3292 struct elf32_hppa_link_hash_table
*htab
;
3294 htab
= (struct elf32_hppa_link_hash_table
*) data
;
3298 if ((section
->flags
& (SEC_ALLOC
| SEC_LOAD
)) == (SEC_ALLOC
| SEC_LOAD
))
3301 Elf_Internal_Phdr
*p
;
3303 p
= _bfd_elf_find_segment_containing_section (abfd
, section
->output_section
);
3304 BFD_ASSERT (p
!= NULL
);
3307 if ((section
->flags
& SEC_READONLY
) != 0)
3309 if (value
< htab
->text_segment_base
)
3310 htab
->text_segment_base
= value
;
3314 if (value
< htab
->data_segment_base
)
3315 htab
->data_segment_base
= value
;
3320 /* Perform a relocation as part of a final link. */
3322 static bfd_reloc_status_type
3323 final_link_relocate (asection
*input_section
,
3325 const Elf_Internal_Rela
*rela
,
3327 struct elf32_hppa_link_hash_table
*htab
,
3329 struct elf32_hppa_link_hash_entry
*hh
,
3330 struct bfd_link_info
*info
)
3333 unsigned int r_type
= ELF32_R_TYPE (rela
->r_info
);
3334 unsigned int orig_r_type
= r_type
;
3335 reloc_howto_type
*howto
= elf_hppa_howto_table
+ r_type
;
3336 int r_format
= howto
->bitsize
;
3337 enum hppa_reloc_field_selector_type_alt r_field
;
3338 bfd
*input_bfd
= input_section
->owner
;
3339 bfd_vma offset
= rela
->r_offset
;
3340 bfd_vma max_branch_offset
= 0;
3341 bfd_byte
*hit_data
= contents
+ offset
;
3342 bfd_signed_vma addend
= rela
->r_addend
;
3344 struct elf32_hppa_stub_hash_entry
*hsh
= NULL
;
3347 if (r_type
== R_PARISC_NONE
)
3348 return bfd_reloc_ok
;
3350 insn
= bfd_get_32 (input_bfd
, hit_data
);
3352 /* Find out where we are and where we're going. */
3353 location
= (offset
+
3354 input_section
->output_offset
+
3355 input_section
->output_section
->vma
);
3357 /* If we are not building a shared library, convert DLTIND relocs to
3363 case R_PARISC_DLTIND21L
:
3364 r_type
= R_PARISC_DPREL21L
;
3367 case R_PARISC_DLTIND14R
:
3368 r_type
= R_PARISC_DPREL14R
;
3371 case R_PARISC_DLTIND14F
:
3372 r_type
= R_PARISC_DPREL14F
;
3379 case R_PARISC_PCREL12F
:
3380 case R_PARISC_PCREL17F
:
3381 case R_PARISC_PCREL22F
:
3382 /* If this call should go via the plt, find the import stub in
3385 || sym_sec
->output_section
== NULL
3387 && hh
->eh
.plt
.offset
!= (bfd_vma
) -1
3388 && hh
->eh
.dynindx
!= -1
3391 || !hh
->eh
.def_regular
3392 || hh
->eh
.root
.type
== bfd_link_hash_defweak
)))
3394 hsh
= hppa_get_stub_entry (input_section
, sym_sec
,
3398 value
= (hsh
->stub_offset
3399 + hsh
->stub_sec
->output_offset
3400 + hsh
->stub_sec
->output_section
->vma
);
3403 else if (sym_sec
== NULL
&& hh
!= NULL
3404 && hh
->eh
.root
.type
== bfd_link_hash_undefweak
)
3406 /* It's OK if undefined weak. Calls to undefined weak
3407 symbols behave as if the "called" function
3408 immediately returns. We can thus call to a weak
3409 function without first checking whether the function
3415 return bfd_reloc_undefined
;
3419 case R_PARISC_PCREL21L
:
3420 case R_PARISC_PCREL17C
:
3421 case R_PARISC_PCREL17R
:
3422 case R_PARISC_PCREL14R
:
3423 case R_PARISC_PCREL14F
:
3424 case R_PARISC_PCREL32
:
3425 /* Make it a pc relative offset. */
3430 case R_PARISC_DPREL21L
:
3431 case R_PARISC_DPREL14R
:
3432 case R_PARISC_DPREL14F
:
3433 case R_PARISC_TLS_GD21L
:
3434 case R_PARISC_TLS_LDM21L
:
3435 case R_PARISC_TLS_IE21L
:
3436 /* Convert instructions that use the linkage table pointer (r19) to
3437 instructions that use the global data pointer (dp). This is the
3438 most efficient way of using PIC code in an incomplete executable,
3439 but the user must follow the standard runtime conventions for
3440 accessing data for this to work. */
3441 if (orig_r_type
== R_PARISC_DLTIND21L
3443 && (r_type
== R_PARISC_TLS_GD21L
3444 || r_type
== R_PARISC_TLS_LDM21L
3445 || r_type
== R_PARISC_TLS_IE21L
)))
3447 /* Convert addil instructions if the original reloc was a
3448 DLTIND21L. GCC sometimes uses a register other than r19 for
3449 the operation, so we must convert any addil instruction
3450 that uses this relocation. */
3451 if ((insn
& 0xfc000000) == ((int) OP_ADDIL
<< 26))
3454 /* We must have a ldil instruction. It's too hard to find
3455 and convert the associated add instruction, so issue an
3457 (*_bfd_error_handler
)
3458 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3465 else if (orig_r_type
== R_PARISC_DLTIND14F
)
3467 /* This must be a format 1 load/store. Change the base
3469 insn
= (insn
& 0xfc1ffff) | (27 << 21);
3472 /* For all the DP relative relocations, we need to examine the symbol's
3473 section. If it has no section or if it's a code section, then
3474 "data pointer relative" makes no sense. In that case we don't
3475 adjust the "value", and for 21 bit addil instructions, we change the
3476 source addend register from %dp to %r0. This situation commonly
3477 arises for undefined weak symbols and when a variable's "constness"
3478 is declared differently from the way the variable is defined. For
3479 instance: "extern int foo" with foo defined as "const int foo". */
3480 if (sym_sec
== NULL
|| (sym_sec
->flags
& SEC_CODE
) != 0)
3482 if ((insn
& ((0x3f << 26) | (0x1f << 21)))
3483 == (((int) OP_ADDIL
<< 26) | (27 << 21)))
3485 insn
&= ~ (0x1f << 21);
3487 /* Now try to make things easy for the dynamic linker. */
3493 case R_PARISC_DLTIND21L
:
3494 case R_PARISC_DLTIND14R
:
3495 case R_PARISC_DLTIND14F
:
3496 case R_PARISC_TLS_GD14R
:
3497 case R_PARISC_TLS_LDM14R
:
3498 case R_PARISC_TLS_IE14R
:
3499 value
-= elf_gp (input_section
->output_section
->owner
);
3502 case R_PARISC_SEGREL32
:
3503 if ((sym_sec
->flags
& SEC_CODE
) != 0)
3504 value
-= htab
->text_segment_base
;
3506 value
-= htab
->data_segment_base
;
3515 case R_PARISC_DIR32
:
3516 case R_PARISC_DIR14F
:
3517 case R_PARISC_DIR17F
:
3518 case R_PARISC_PCREL17C
:
3519 case R_PARISC_PCREL14F
:
3520 case R_PARISC_PCREL32
:
3521 case R_PARISC_DPREL14F
:
3522 case R_PARISC_PLABEL32
:
3523 case R_PARISC_DLTIND14F
:
3524 case R_PARISC_SEGBASE
:
3525 case R_PARISC_SEGREL32
:
3526 case R_PARISC_TLS_DTPMOD32
:
3527 case R_PARISC_TLS_DTPOFF32
:
3528 case R_PARISC_TLS_TPREL32
:
3532 case R_PARISC_DLTIND21L
:
3533 case R_PARISC_PCREL21L
:
3534 case R_PARISC_PLABEL21L
:
3538 case R_PARISC_DIR21L
:
3539 case R_PARISC_DPREL21L
:
3540 case R_PARISC_TLS_GD21L
:
3541 case R_PARISC_TLS_LDM21L
:
3542 case R_PARISC_TLS_LDO21L
:
3543 case R_PARISC_TLS_IE21L
:
3544 case R_PARISC_TLS_LE21L
:
3548 case R_PARISC_PCREL17R
:
3549 case R_PARISC_PCREL14R
:
3550 case R_PARISC_PLABEL14R
:
3551 case R_PARISC_DLTIND14R
:
3555 case R_PARISC_DIR17R
:
3556 case R_PARISC_DIR14R
:
3557 case R_PARISC_DPREL14R
:
3558 case R_PARISC_TLS_GD14R
:
3559 case R_PARISC_TLS_LDM14R
:
3560 case R_PARISC_TLS_LDO14R
:
3561 case R_PARISC_TLS_IE14R
:
3562 case R_PARISC_TLS_LE14R
:
3566 case R_PARISC_PCREL12F
:
3567 case R_PARISC_PCREL17F
:
3568 case R_PARISC_PCREL22F
:
3571 if (r_type
== (unsigned int) R_PARISC_PCREL17F
)
3573 max_branch_offset
= (1 << (17-1)) << 2;
3575 else if (r_type
== (unsigned int) R_PARISC_PCREL12F
)
3577 max_branch_offset
= (1 << (12-1)) << 2;
3581 max_branch_offset
= (1 << (22-1)) << 2;
3584 /* sym_sec is NULL on undefined weak syms or when shared on
3585 undefined syms. We've already checked for a stub for the
3586 shared undefined case. */
3587 if (sym_sec
== NULL
)
3590 /* If the branch is out of reach, then redirect the
3591 call to the local stub for this function. */
3592 if (value
+ addend
+ max_branch_offset
>= 2*max_branch_offset
)
3594 hsh
= hppa_get_stub_entry (input_section
, sym_sec
,
3597 return bfd_reloc_undefined
;
3599 /* Munge up the value and addend so that we call the stub
3600 rather than the procedure directly. */
3601 value
= (hsh
->stub_offset
3602 + hsh
->stub_sec
->output_offset
3603 + hsh
->stub_sec
->output_section
->vma
3609 /* Something we don't know how to handle. */
3611 return bfd_reloc_notsupported
;
3614 /* Make sure we can reach the stub. */
3615 if (max_branch_offset
!= 0
3616 && value
+ addend
+ max_branch_offset
>= 2*max_branch_offset
)
3618 (*_bfd_error_handler
)
3619 (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3623 hsh
->bh_root
.string
);
3624 bfd_set_error (bfd_error_bad_value
);
3625 return bfd_reloc_notsupported
;
3628 val
= hppa_field_adjust (value
, addend
, r_field
);
3632 case R_PARISC_PCREL12F
:
3633 case R_PARISC_PCREL17C
:
3634 case R_PARISC_PCREL17F
:
3635 case R_PARISC_PCREL17R
:
3636 case R_PARISC_PCREL22F
:
3637 case R_PARISC_DIR17F
:
3638 case R_PARISC_DIR17R
:
3639 /* This is a branch. Divide the offset by four.
3640 Note that we need to decide whether it's a branch or
3641 otherwise by inspecting the reloc. Inspecting insn won't
3642 work as insn might be from a .word directive. */
3650 insn
= hppa_rebuild_insn (insn
, val
, r_format
);
3652 /* Update the instruction word. */
3653 bfd_put_32 (input_bfd
, (bfd_vma
) insn
, hit_data
);
3654 return bfd_reloc_ok
;
3657 /* Relocate an HPPA ELF section. */
3660 elf32_hppa_relocate_section (bfd
*output_bfd
,
3661 struct bfd_link_info
*info
,
3663 asection
*input_section
,
3665 Elf_Internal_Rela
*relocs
,
3666 Elf_Internal_Sym
*local_syms
,
3667 asection
**local_sections
)
3669 bfd_vma
*local_got_offsets
;
3670 struct elf32_hppa_link_hash_table
*htab
;
3671 Elf_Internal_Shdr
*symtab_hdr
;
3672 Elf_Internal_Rela
*rela
;
3673 Elf_Internal_Rela
*relend
;
3675 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
3677 htab
= hppa_link_hash_table (info
);
3681 local_got_offsets
= elf_local_got_offsets (input_bfd
);
3684 relend
= relocs
+ input_section
->reloc_count
;
3685 for (; rela
< relend
; rela
++)
3687 unsigned int r_type
;
3688 reloc_howto_type
*howto
;
3689 unsigned int r_symndx
;
3690 struct elf32_hppa_link_hash_entry
*hh
;
3691 Elf_Internal_Sym
*sym
;
3694 bfd_reloc_status_type rstatus
;
3695 const char *sym_name
;
3697 bfd_boolean warned_undef
;
3699 r_type
= ELF32_R_TYPE (rela
->r_info
);
3700 if (r_type
>= (unsigned int) R_PARISC_UNIMPLEMENTED
)
3702 bfd_set_error (bfd_error_bad_value
);
3705 if (r_type
== (unsigned int) R_PARISC_GNU_VTENTRY
3706 || r_type
== (unsigned int) R_PARISC_GNU_VTINHERIT
)
3709 r_symndx
= ELF32_R_SYM (rela
->r_info
);
3713 warned_undef
= FALSE
;
3714 if (r_symndx
< symtab_hdr
->sh_info
)
3716 /* This is a local symbol, h defaults to NULL. */
3717 sym
= local_syms
+ r_symndx
;
3718 sym_sec
= local_sections
[r_symndx
];
3719 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sym_sec
, rela
);
3723 struct elf_link_hash_entry
*eh
;
3724 bfd_boolean unresolved_reloc
;
3725 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (input_bfd
);
3727 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rela
,
3728 r_symndx
, symtab_hdr
, sym_hashes
,
3729 eh
, sym_sec
, relocation
,
3730 unresolved_reloc
, warned_undef
);
3732 if (!info
->relocatable
3734 && eh
->root
.type
!= bfd_link_hash_defined
3735 && eh
->root
.type
!= bfd_link_hash_defweak
3736 && eh
->root
.type
!= bfd_link_hash_undefweak
)
3738 if (info
->unresolved_syms_in_objects
== RM_IGNORE
3739 && ELF_ST_VISIBILITY (eh
->other
) == STV_DEFAULT
3740 && eh
->type
== STT_PARISC_MILLI
)
3742 if (! info
->callbacks
->undefined_symbol
3743 (info
, eh_name (eh
), input_bfd
,
3744 input_section
, rela
->r_offset
, FALSE
))
3746 warned_undef
= TRUE
;
3749 hh
= hppa_elf_hash_entry (eh
);
3752 if (sym_sec
!= NULL
&& elf_discarded_section (sym_sec
))
3754 /* For relocs against symbols from removed linkonce
3755 sections, or sections discarded by a linker script,
3756 we just want the section contents zeroed. Avoid any
3757 special processing. */
3758 _bfd_clear_contents (elf_hppa_howto_table
+ r_type
, input_bfd
,
3759 contents
+ rela
->r_offset
);
3765 if (info
->relocatable
)
3768 /* Do any required modifications to the relocation value, and
3769 determine what types of dynamic info we need to output, if
3774 case R_PARISC_DLTIND14F
:
3775 case R_PARISC_DLTIND14R
:
3776 case R_PARISC_DLTIND21L
:
3779 bfd_boolean do_got
= 0;
3781 /* Relocation is to the entry for this symbol in the
3782 global offset table. */
3787 off
= hh
->eh
.got
.offset
;
3788 dyn
= htab
->etab
.dynamic_sections_created
;
3789 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
,
3792 /* If we aren't going to call finish_dynamic_symbol,
3793 then we need to handle initialisation of the .got
3794 entry and create needed relocs here. Since the
3795 offset must always be a multiple of 4, we use the
3796 least significant bit to record whether we have
3797 initialised it already. */
3802 hh
->eh
.got
.offset
|= 1;
3809 /* Local symbol case. */
3810 if (local_got_offsets
== NULL
)
3813 off
= local_got_offsets
[r_symndx
];
3815 /* The offset must always be a multiple of 4. We use
3816 the least significant bit to record whether we have
3817 already generated the necessary reloc. */
3822 local_got_offsets
[r_symndx
] |= 1;
3831 /* Output a dynamic relocation for this GOT entry.
3832 In this case it is relative to the base of the
3833 object because the symbol index is zero. */
3834 Elf_Internal_Rela outrel
;
3836 asection
*sec
= htab
->srelgot
;
3838 outrel
.r_offset
= (off
3839 + htab
->sgot
->output_offset
3840 + htab
->sgot
->output_section
->vma
);
3841 outrel
.r_info
= ELF32_R_INFO (0, R_PARISC_DIR32
);
3842 outrel
.r_addend
= relocation
;
3843 loc
= sec
->contents
;
3844 loc
+= sec
->reloc_count
++ * sizeof (Elf32_External_Rela
);
3845 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
3848 bfd_put_32 (output_bfd
, relocation
,
3849 htab
->sgot
->contents
+ off
);
3852 if (off
>= (bfd_vma
) -2)
3855 /* Add the base of the GOT to the relocation value. */
3857 + htab
->sgot
->output_offset
3858 + htab
->sgot
->output_section
->vma
);
3862 case R_PARISC_SEGREL32
:
3863 /* If this is the first SEGREL relocation, then initialize
3864 the segment base values. */
3865 if (htab
->text_segment_base
== (bfd_vma
) -1)
3866 bfd_map_over_sections (output_bfd
, hppa_record_segment_addr
, htab
);
3869 case R_PARISC_PLABEL14R
:
3870 case R_PARISC_PLABEL21L
:
3871 case R_PARISC_PLABEL32
:
3872 if (htab
->etab
.dynamic_sections_created
)
3875 bfd_boolean do_plt
= 0;
3876 /* If we have a global symbol with a PLT slot, then
3877 redirect this relocation to it. */
3880 off
= hh
->eh
.plt
.offset
;
3881 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
,
3884 /* In a non-shared link, adjust_dynamic_symbols
3885 isn't called for symbols forced local. We
3886 need to write out the plt entry here. */
3891 hh
->eh
.plt
.offset
|= 1;
3898 bfd_vma
*local_plt_offsets
;
3900 if (local_got_offsets
== NULL
)
3903 local_plt_offsets
= local_got_offsets
+ symtab_hdr
->sh_info
;
3904 off
= local_plt_offsets
[r_symndx
];
3906 /* As for the local .got entry case, we use the last
3907 bit to record whether we've already initialised
3908 this local .plt entry. */
3913 local_plt_offsets
[r_symndx
] |= 1;
3922 /* Output a dynamic IPLT relocation for this
3924 Elf_Internal_Rela outrel
;
3926 asection
*s
= htab
->srelplt
;
3928 outrel
.r_offset
= (off
3929 + htab
->splt
->output_offset
3930 + htab
->splt
->output_section
->vma
);
3931 outrel
.r_info
= ELF32_R_INFO (0, R_PARISC_IPLT
);
3932 outrel
.r_addend
= relocation
;
3934 loc
+= s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
3935 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
3939 bfd_put_32 (output_bfd
,
3941 htab
->splt
->contents
+ off
);
3942 bfd_put_32 (output_bfd
,
3943 elf_gp (htab
->splt
->output_section
->owner
),
3944 htab
->splt
->contents
+ off
+ 4);
3948 if (off
>= (bfd_vma
) -2)
3951 /* PLABELs contain function pointers. Relocation is to
3952 the entry for the function in the .plt. The magic +2
3953 offset signals to $$dyncall that the function pointer
3954 is in the .plt and thus has a gp pointer too.
3955 Exception: Undefined PLABELs should have a value of
3958 || (hh
->eh
.root
.type
!= bfd_link_hash_undefweak
3959 && hh
->eh
.root
.type
!= bfd_link_hash_undefined
))
3962 + htab
->splt
->output_offset
3963 + htab
->splt
->output_section
->vma
3968 /* Fall through and possibly emit a dynamic relocation. */
3970 case R_PARISC_DIR17F
:
3971 case R_PARISC_DIR17R
:
3972 case R_PARISC_DIR14F
:
3973 case R_PARISC_DIR14R
:
3974 case R_PARISC_DIR21L
:
3975 case R_PARISC_DPREL14F
:
3976 case R_PARISC_DPREL14R
:
3977 case R_PARISC_DPREL21L
:
3978 case R_PARISC_DIR32
:
3979 if ((input_section
->flags
& SEC_ALLOC
) == 0)
3982 /* The reloc types handled here and this conditional
3983 expression must match the code in ..check_relocs and
3984 allocate_dynrelocs. ie. We need exactly the same condition
3985 as in ..check_relocs, with some extra conditions (dynindx
3986 test in this case) to cater for relocs removed by
3987 allocate_dynrelocs. If you squint, the non-shared test
3988 here does indeed match the one in ..check_relocs, the
3989 difference being that here we test DEF_DYNAMIC as well as
3990 !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3991 which is why we can't use just that test here.
3992 Conversely, DEF_DYNAMIC can't be used in check_relocs as
3993 there all files have not been loaded. */
3996 || ELF_ST_VISIBILITY (hh
->eh
.other
) == STV_DEFAULT
3997 || hh
->eh
.root
.type
!= bfd_link_hash_undefweak
)
3998 && (IS_ABSOLUTE_RELOC (r_type
)
3999 || !SYMBOL_CALLS_LOCAL (info
, &hh
->eh
)))
4002 && hh
->eh
.dynindx
!= -1
4003 && !hh
->eh
.non_got_ref
4004 && ((ELIMINATE_COPY_RELOCS
4005 && hh
->eh
.def_dynamic
4006 && !hh
->eh
.def_regular
)
4007 || hh
->eh
.root
.type
== bfd_link_hash_undefweak
4008 || hh
->eh
.root
.type
== bfd_link_hash_undefined
)))
4010 Elf_Internal_Rela outrel
;
4015 /* When generating a shared object, these relocations
4016 are copied into the output file to be resolved at run
4019 outrel
.r_addend
= rela
->r_addend
;
4021 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
4023 skip
= (outrel
.r_offset
== (bfd_vma
) -1
4024 || outrel
.r_offset
== (bfd_vma
) -2);
4025 outrel
.r_offset
+= (input_section
->output_offset
4026 + input_section
->output_section
->vma
);
4030 memset (&outrel
, 0, sizeof (outrel
));
4033 && hh
->eh
.dynindx
!= -1
4035 || !IS_ABSOLUTE_RELOC (r_type
)
4038 || !hh
->eh
.def_regular
))
4040 outrel
.r_info
= ELF32_R_INFO (hh
->eh
.dynindx
, r_type
);
4042 else /* It's a local symbol, or one marked to become local. */
4046 /* Add the absolute offset of the symbol. */
4047 outrel
.r_addend
+= relocation
;
4049 /* Global plabels need to be processed by the
4050 dynamic linker so that functions have at most one
4051 fptr. For this reason, we need to differentiate
4052 between global and local plabels, which we do by
4053 providing the function symbol for a global plabel
4054 reloc, and no symbol for local plabels. */
4057 && sym_sec
->output_section
!= NULL
4058 && ! bfd_is_abs_section (sym_sec
))
4062 osec
= sym_sec
->output_section
;
4063 indx
= elf_section_data (osec
)->dynindx
;
4066 osec
= htab
->etab
.text_index_section
;
4067 indx
= elf_section_data (osec
)->dynindx
;
4069 BFD_ASSERT (indx
!= 0);
4071 /* We are turning this relocation into one
4072 against a section symbol, so subtract out the
4073 output section's address but not the offset
4074 of the input section in the output section. */
4075 outrel
.r_addend
-= osec
->vma
;
4078 outrel
.r_info
= ELF32_R_INFO (indx
, r_type
);
4080 sreloc
= elf_section_data (input_section
)->sreloc
;
4084 loc
= sreloc
->contents
;
4085 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4086 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4090 case R_PARISC_TLS_LDM21L
:
4091 case R_PARISC_TLS_LDM14R
:
4095 off
= htab
->tls_ldm_got
.offset
;
4100 Elf_Internal_Rela outrel
;
4103 outrel
.r_offset
= (off
4104 + htab
->sgot
->output_section
->vma
4105 + htab
->sgot
->output_offset
);
4106 outrel
.r_addend
= 0;
4107 outrel
.r_info
= ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32
);
4108 loc
= htab
->srelgot
->contents
;
4109 loc
+= htab
->srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4111 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4112 htab
->tls_ldm_got
.offset
|= 1;
4115 /* Add the base of the GOT to the relocation value. */
4117 + htab
->sgot
->output_offset
4118 + htab
->sgot
->output_section
->vma
);
4123 case R_PARISC_TLS_LDO21L
:
4124 case R_PARISC_TLS_LDO14R
:
4125 relocation
-= dtpoff_base (info
);
4128 case R_PARISC_TLS_GD21L
:
4129 case R_PARISC_TLS_GD14R
:
4130 case R_PARISC_TLS_IE21L
:
4131 case R_PARISC_TLS_IE14R
:
4141 dyn
= htab
->etab
.dynamic_sections_created
;
4143 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, &hh
->eh
)
4145 || !SYMBOL_REFERENCES_LOCAL (info
, &hh
->eh
)))
4147 indx
= hh
->eh
.dynindx
;
4149 off
= hh
->eh
.got
.offset
;
4150 tls_type
= hh
->tls_type
;
4154 off
= local_got_offsets
[r_symndx
];
4155 tls_type
= hppa_elf_local_got_tls_type (input_bfd
)[r_symndx
];
4158 if (tls_type
== GOT_UNKNOWN
)
4165 bfd_boolean need_relocs
= FALSE
;
4166 Elf_Internal_Rela outrel
;
4167 bfd_byte
*loc
= NULL
;
4170 /* The GOT entries have not been initialized yet. Do it
4171 now, and emit any relocations. If both an IE GOT and a
4172 GD GOT are necessary, we emit the GD first. */
4174 if ((info
->shared
|| indx
!= 0)
4176 || ELF_ST_VISIBILITY (hh
->eh
.other
) == STV_DEFAULT
4177 || hh
->eh
.root
.type
!= bfd_link_hash_undefweak
))
4180 loc
= htab
->srelgot
->contents
;
4181 /* FIXME (CAO): Should this be reloc_count++ ? */
4182 loc
+= htab
->srelgot
->reloc_count
* sizeof (Elf32_External_Rela
);
4185 if (tls_type
& GOT_TLS_GD
)
4189 outrel
.r_offset
= (cur_off
4190 + htab
->sgot
->output_section
->vma
4191 + htab
->sgot
->output_offset
);
4192 outrel
.r_info
= ELF32_R_INFO (indx
,R_PARISC_TLS_DTPMOD32
);
4193 outrel
.r_addend
= 0;
4194 bfd_put_32 (output_bfd
, 0, htab
->sgot
->contents
+ cur_off
);
4195 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4196 htab
->srelgot
->reloc_count
++;
4197 loc
+= sizeof (Elf32_External_Rela
);
4200 bfd_put_32 (output_bfd
, relocation
- dtpoff_base (info
),
4201 htab
->sgot
->contents
+ cur_off
+ 4);
4204 bfd_put_32 (output_bfd
, 0,
4205 htab
->sgot
->contents
+ cur_off
+ 4);
4206 outrel
.r_info
= ELF32_R_INFO (indx
, R_PARISC_TLS_DTPOFF32
);
4207 outrel
.r_offset
+= 4;
4208 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,loc
);
4209 htab
->srelgot
->reloc_count
++;
4210 loc
+= sizeof (Elf32_External_Rela
);
4215 /* If we are not emitting relocations for a
4216 general dynamic reference, then we must be in a
4217 static link or an executable link with the
4218 symbol binding locally. Mark it as belonging
4219 to module 1, the executable. */
4220 bfd_put_32 (output_bfd
, 1,
4221 htab
->sgot
->contents
+ cur_off
);
4222 bfd_put_32 (output_bfd
, relocation
- dtpoff_base (info
),
4223 htab
->sgot
->contents
+ cur_off
+ 4);
4230 if (tls_type
& GOT_TLS_IE
)
4234 outrel
.r_offset
= (cur_off
4235 + htab
->sgot
->output_section
->vma
4236 + htab
->sgot
->output_offset
);
4237 outrel
.r_info
= ELF32_R_INFO (indx
, R_PARISC_TLS_TPREL32
);
4240 outrel
.r_addend
= relocation
- dtpoff_base (info
);
4242 outrel
.r_addend
= 0;
4244 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4245 htab
->srelgot
->reloc_count
++;
4246 loc
+= sizeof (Elf32_External_Rela
);
4249 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
4250 htab
->sgot
->contents
+ cur_off
);
4256 hh
->eh
.got
.offset
|= 1;
4258 local_got_offsets
[r_symndx
] |= 1;
4261 if ((tls_type
& GOT_TLS_GD
)
4262 && r_type
!= R_PARISC_TLS_GD21L
4263 && r_type
!= R_PARISC_TLS_GD14R
)
4264 off
+= 2 * GOT_ENTRY_SIZE
;
4266 /* Add the base of the GOT to the relocation value. */
4268 + htab
->sgot
->output_offset
4269 + htab
->sgot
->output_section
->vma
);
4274 case R_PARISC_TLS_LE21L
:
4275 case R_PARISC_TLS_LE14R
:
4277 relocation
= tpoff (info
, relocation
);
4286 rstatus
= final_link_relocate (input_section
, contents
, rela
, relocation
,
4287 htab
, sym_sec
, hh
, info
);
4289 if (rstatus
== bfd_reloc_ok
)
4293 sym_name
= hh_name (hh
);
4296 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
4297 symtab_hdr
->sh_link
,
4299 if (sym_name
== NULL
)
4301 if (*sym_name
== '\0')
4302 sym_name
= bfd_section_name (input_bfd
, sym_sec
);
4305 howto
= elf_hppa_howto_table
+ r_type
;
4307 if (rstatus
== bfd_reloc_undefined
|| rstatus
== bfd_reloc_notsupported
)
4309 if (rstatus
== bfd_reloc_notsupported
|| !warned_undef
)
4311 (*_bfd_error_handler
)
4312 (_("%B(%A+0x%lx): cannot handle %s for %s"),
4315 (long) rela
->r_offset
,
4318 bfd_set_error (bfd_error_bad_value
);
4324 if (!((*info
->callbacks
->reloc_overflow
)
4325 (info
, (hh
? &hh
->eh
.root
: NULL
), sym_name
, howto
->name
,
4326 (bfd_vma
) 0, input_bfd
, input_section
, rela
->r_offset
)))
4334 /* Finish up dynamic symbol handling. We set the contents of various
4335 dynamic sections here. */
4338 elf32_hppa_finish_dynamic_symbol (bfd
*output_bfd
,
4339 struct bfd_link_info
*info
,
4340 struct elf_link_hash_entry
*eh
,
4341 Elf_Internal_Sym
*sym
)
4343 struct elf32_hppa_link_hash_table
*htab
;
4344 Elf_Internal_Rela rela
;
4347 htab
= hppa_link_hash_table (info
);
4351 if (eh
->plt
.offset
!= (bfd_vma
) -1)
4355 if (eh
->plt
.offset
& 1)
4358 /* This symbol has an entry in the procedure linkage table. Set
4361 The format of a plt entry is
4366 if (eh
->root
.type
== bfd_link_hash_defined
4367 || eh
->root
.type
== bfd_link_hash_defweak
)
4369 value
= eh
->root
.u
.def
.value
;
4370 if (eh
->root
.u
.def
.section
->output_section
!= NULL
)
4371 value
+= (eh
->root
.u
.def
.section
->output_offset
4372 + eh
->root
.u
.def
.section
->output_section
->vma
);
4375 /* Create a dynamic IPLT relocation for this entry. */
4376 rela
.r_offset
= (eh
->plt
.offset
4377 + htab
->splt
->output_offset
4378 + htab
->splt
->output_section
->vma
);
4379 if (eh
->dynindx
!= -1)
4381 rela
.r_info
= ELF32_R_INFO (eh
->dynindx
, R_PARISC_IPLT
);
4386 /* This symbol has been marked to become local, and is
4387 used by a plabel so must be kept in the .plt. */
4388 rela
.r_info
= ELF32_R_INFO (0, R_PARISC_IPLT
);
4389 rela
.r_addend
= value
;
4392 loc
= htab
->srelplt
->contents
;
4393 loc
+= htab
->srelplt
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4394 bfd_elf32_swap_reloca_out (htab
->splt
->output_section
->owner
, &rela
, loc
);
4396 if (!eh
->def_regular
)
4398 /* Mark the symbol as undefined, rather than as defined in
4399 the .plt section. Leave the value alone. */
4400 sym
->st_shndx
= SHN_UNDEF
;
4404 if (eh
->got
.offset
!= (bfd_vma
) -1
4405 && (hppa_elf_hash_entry (eh
)->tls_type
& GOT_TLS_GD
) == 0
4406 && (hppa_elf_hash_entry (eh
)->tls_type
& GOT_TLS_IE
) == 0)
4408 /* This symbol has an entry in the global offset table. Set it
4411 rela
.r_offset
= ((eh
->got
.offset
&~ (bfd_vma
) 1)
4412 + htab
->sgot
->output_offset
4413 + htab
->sgot
->output_section
->vma
);
4415 /* If this is a -Bsymbolic link and the symbol is defined
4416 locally or was forced to be local because of a version file,
4417 we just want to emit a RELATIVE reloc. The entry in the
4418 global offset table will already have been initialized in the
4419 relocate_section function. */
4421 && (info
->symbolic
|| eh
->dynindx
== -1)
4424 rela
.r_info
= ELF32_R_INFO (0, R_PARISC_DIR32
);
4425 rela
.r_addend
= (eh
->root
.u
.def
.value
4426 + eh
->root
.u
.def
.section
->output_offset
4427 + eh
->root
.u
.def
.section
->output_section
->vma
);
4431 if ((eh
->got
.offset
& 1) != 0)
4434 bfd_put_32 (output_bfd
, 0, htab
->sgot
->contents
+ (eh
->got
.offset
& ~1));
4435 rela
.r_info
= ELF32_R_INFO (eh
->dynindx
, R_PARISC_DIR32
);
4439 loc
= htab
->srelgot
->contents
;
4440 loc
+= htab
->srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4441 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
4448 /* This symbol needs a copy reloc. Set it up. */
4450 if (! (eh
->dynindx
!= -1
4451 && (eh
->root
.type
== bfd_link_hash_defined
4452 || eh
->root
.type
== bfd_link_hash_defweak
)))
4455 sec
= htab
->srelbss
;
4457 rela
.r_offset
= (eh
->root
.u
.def
.value
4458 + eh
->root
.u
.def
.section
->output_offset
4459 + eh
->root
.u
.def
.section
->output_section
->vma
);
4461 rela
.r_info
= ELF32_R_INFO (eh
->dynindx
, R_PARISC_COPY
);
4462 loc
= sec
->contents
+ sec
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4463 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
4466 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4467 if (eh_name (eh
)[0] == '_'
4468 && (strcmp (eh_name (eh
), "_DYNAMIC") == 0
4469 || eh
== htab
->etab
.hgot
))
4471 sym
->st_shndx
= SHN_ABS
;
4477 /* Used to decide how to sort relocs in an optimal manner for the
4478 dynamic linker, before writing them out. */
4480 static enum elf_reloc_type_class
4481 elf32_hppa_reloc_type_class (const Elf_Internal_Rela
*rela
)
4483 /* Handle TLS relocs first; we don't want them to be marked
4484 relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4486 switch ((int) ELF32_R_TYPE (rela
->r_info
))
4488 case R_PARISC_TLS_DTPMOD32
:
4489 case R_PARISC_TLS_DTPOFF32
:
4490 case R_PARISC_TLS_TPREL32
:
4491 return reloc_class_normal
;
4494 if (ELF32_R_SYM (rela
->r_info
) == 0)
4495 return reloc_class_relative
;
4497 switch ((int) ELF32_R_TYPE (rela
->r_info
))
4500 return reloc_class_plt
;
4502 return reloc_class_copy
;
4504 return reloc_class_normal
;
4508 /* Finish up the dynamic sections. */
4511 elf32_hppa_finish_dynamic_sections (bfd
*output_bfd
,
4512 struct bfd_link_info
*info
)
4515 struct elf32_hppa_link_hash_table
*htab
;
4518 htab
= hppa_link_hash_table (info
);
4522 dynobj
= htab
->etab
.dynobj
;
4524 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
4526 if (htab
->etab
.dynamic_sections_created
)
4528 Elf32_External_Dyn
*dyncon
, *dynconend
;
4533 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
4534 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
4535 for (; dyncon
< dynconend
; dyncon
++)
4537 Elf_Internal_Dyn dyn
;
4540 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
4548 /* Use PLTGOT to set the GOT register. */
4549 dyn
.d_un
.d_ptr
= elf_gp (output_bfd
);
4554 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
4559 dyn
.d_un
.d_val
= s
->size
;
4563 /* Don't count procedure linkage table relocs in the
4564 overall reloc count. */
4568 dyn
.d_un
.d_val
-= s
->size
;
4572 /* We may not be using the standard ELF linker script.
4573 If .rela.plt is the first .rela section, we adjust
4574 DT_RELA to not include it. */
4578 if (dyn
.d_un
.d_ptr
!= s
->output_section
->vma
+ s
->output_offset
)
4580 dyn
.d_un
.d_ptr
+= s
->size
;
4584 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
4588 if (htab
->sgot
!= NULL
&& htab
->sgot
->size
!= 0)
4590 /* Fill in the first entry in the global offset table.
4591 We use it to point to our dynamic section, if we have one. */
4592 bfd_put_32 (output_bfd
,
4593 sdyn
? sdyn
->output_section
->vma
+ sdyn
->output_offset
: 0,
4594 htab
->sgot
->contents
);
4596 /* The second entry is reserved for use by the dynamic linker. */
4597 memset (htab
->sgot
->contents
+ GOT_ENTRY_SIZE
, 0, GOT_ENTRY_SIZE
);
4599 /* Set .got entry size. */
4600 elf_section_data (htab
->sgot
->output_section
)
4601 ->this_hdr
.sh_entsize
= GOT_ENTRY_SIZE
;
4604 if (htab
->splt
!= NULL
&& htab
->splt
->size
!= 0)
4606 /* Set plt entry size. */
4607 elf_section_data (htab
->splt
->output_section
)
4608 ->this_hdr
.sh_entsize
= PLT_ENTRY_SIZE
;
4610 if (htab
->need_plt_stub
)
4612 /* Set up the .plt stub. */
4613 memcpy (htab
->splt
->contents
4614 + htab
->splt
->size
- sizeof (plt_stub
),
4615 plt_stub
, sizeof (plt_stub
));
4617 if ((htab
->splt
->output_offset
4618 + htab
->splt
->output_section
->vma
4620 != (htab
->sgot
->output_offset
4621 + htab
->sgot
->output_section
->vma
))
4623 (*_bfd_error_handler
)
4624 (_(".got section not immediately after .plt section"));
4633 /* Called when writing out an object file to decide the type of a
4636 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym
*elf_sym
, int type
)
4638 if (ELF_ST_TYPE (elf_sym
->st_info
) == STT_PARISC_MILLI
)
4639 return STT_PARISC_MILLI
;
4644 /* Misc BFD support code. */
4645 #define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4646 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4647 #define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4648 #define elf_info_to_howto elf_hppa_info_to_howto
4649 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4651 /* Stuff for the BFD linker. */
4652 #define bfd_elf32_mkobject elf32_hppa_mkobject
4653 #define bfd_elf32_bfd_final_link elf32_hppa_final_link
4654 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4655 #define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
4656 #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
4657 #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
4658 #define elf_backend_check_relocs elf32_hppa_check_relocs
4659 #define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4660 #define elf_backend_fake_sections elf_hppa_fake_sections
4661 #define elf_backend_relocate_section elf32_hppa_relocate_section
4662 #define elf_backend_hide_symbol elf32_hppa_hide_symbol
4663 #define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4664 #define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4665 #define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
4666 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4667 #define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4668 #define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
4669 #define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4670 #define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
4671 #define elf_backend_object_p elf32_hppa_object_p
4672 #define elf_backend_final_write_processing elf_hppa_final_write_processing
4673 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4674 #define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
4675 #define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
4676 #define elf_backend_action_discarded elf_hppa_action_discarded
4678 #define elf_backend_can_gc_sections 1
4679 #define elf_backend_can_refcount 1
4680 #define elf_backend_plt_alignment 2
4681 #define elf_backend_want_got_plt 0
4682 #define elf_backend_plt_readonly 0
4683 #define elf_backend_want_plt_sym 0
4684 #define elf_backend_got_header_size 8
4685 #define elf_backend_rela_normal 1
4687 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
4688 #define TARGET_BIG_NAME "elf32-hppa"
4689 #define ELF_ARCH bfd_arch_hppa
4690 #define ELF_MACHINE_CODE EM_PARISC
4691 #define ELF_MAXPAGESIZE 0x1000
4692 #define ELF_OSABI ELFOSABI_HPUX
4693 #define elf32_bed elf32_hppa_hpux_bed
4695 #include "elf32-target.h"
4697 #undef TARGET_BIG_SYM
4698 #define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
4699 #undef TARGET_BIG_NAME
4700 #define TARGET_BIG_NAME "elf32-hppa-linux"
4702 #define ELF_OSABI ELFOSABI_LINUX
4704 #define elf32_bed elf32_hppa_linux_bed
4706 #include "elf32-target.h"
4708 #undef TARGET_BIG_SYM
4709 #define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec
4710 #undef TARGET_BIG_NAME
4711 #define TARGET_BIG_NAME "elf32-hppa-netbsd"
4713 #define ELF_OSABI ELFOSABI_NETBSD
4715 #define elf32_bed elf32_hppa_netbsd_bed
4717 #include "elf32-target.h"