*** empty log message ***
[deliverable/binutils-gdb.git] / bfd / elf32-hppa.c
CommitLineData
252b5132 1/* BFD back-end for HP PA-RISC ELF files.
7898deda 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001
252b5132
RH
3 Free Software Foundation, Inc.
4
30667bf3 5 Original code by
252b5132
RH
6 Center for Software Science
7 Department of Computer Science
8 University of Utah
30667bf3 9 Largely rewritten by Alan Modra <alan@linuxcare.com.au>
252b5132
RH
10
11This file is part of BFD, the Binary File Descriptor library.
12
13This program is free software; you can redistribute it and/or modify
14it under the terms of the GNU General Public License as published by
15the Free Software Foundation; either version 2 of the License, or
16(at your option) any later version.
17
18This program is distributed in the hope that it will be useful,
19but WITHOUT ANY WARRANTY; without even the implied warranty of
20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21GNU General Public License for more details.
22
23You should have received a copy of the GNU General Public License
24along with this program; if not, write to the Free Software
25Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26
27#include "bfd.h"
28#include "sysdep.h"
252b5132
RH
29#include "libbfd.h"
30#include "elf-bfd.h"
9e103c9c
JL
31#include "elf/hppa.h"
32#include "libhppa.h"
33#include "elf32-hppa.h"
34#define ARCH_SIZE 32
35#include "elf-hppa.h"
edd21aca 36#include "elf32-hppa.h"
9e103c9c 37
74d1c347
AM
38/* In order to gain some understanding of code in this file without
39 knowing all the intricate details of the linker, note the
40 following:
41
42 Functions named elf32_hppa_* are called by external routines, other
43 functions are only called locally. elf32_hppa_* functions appear
44 in this file more or less in the order in which they are called
45 from external routines. eg. elf32_hppa_check_relocs is called
46 early in the link process, elf32_hppa_finish_dynamic_sections is
47 one of the last functions. */
48
edd21aca 49/* We use two hash tables to hold information for linking PA ELF objects.
252b5132
RH
50
51 The first is the elf32_hppa_link_hash_table which is derived
52 from the standard ELF linker hash table. We use this as a place to
53 attach other hash tables and static information.
54
55 The second is the stub hash table which is derived from the
56 base BFD hash table. The stub hash table holds the information
30667bf3
AM
57 necessary to build the linker stubs during a link.
58
59 There are a number of different stubs generated by the linker.
60
61 Long branch stub:
62 : ldil LR'X,%r1
63 : be,n RR'X(%sr4,%r1)
64
65 PIC long branch stub:
66 : b,l .+8,%r1
3ee1d854
AM
67 : addil LR'X - ($PIC_pcrel$0 - 4),%r1
68 : be,n RR'X - ($PIC_pcrel$0 - 8)(%sr4,%r1)
30667bf3
AM
69
70 Import stub to call shared library routine from normal object file
71 (single sub-space version)
3ee1d854
AM
72 : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
73 : ldw RR'lt_ptr+ltoff(%r1),%r21
30667bf3 74 : bv %r0(%r21)
3ee1d854 75 : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
30667bf3
AM
76
77 Import stub to call shared library routine from shared library
78 (single sub-space version)
3ee1d854
AM
79 : addil LR'ltoff,%r19 ; get procedure entry point
80 : ldw RR'ltoff(%r1),%r21
30667bf3 81 : bv %r0(%r21)
3ee1d854 82 : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
30667bf3
AM
83
84 Import stub to call shared library routine from normal object file
85 (multiple sub-space support)
3ee1d854
AM
86 : addil LR'lt_ptr+ltoff,%dp ; get procedure entry point
87 : ldw RR'lt_ptr+ltoff(%r1),%r21
88 : ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
30667bf3
AM
89 : ldsid (%r21),%r1
90 : mtsp %r1,%sr0
91 : be 0(%sr0,%r21) ; branch to target
92 : stw %rp,-24(%sp) ; save rp
93
94 Import stub to call shared library routine from shared library
95 (multiple sub-space support)
3ee1d854
AM
96 : addil LR'ltoff,%r19 ; get procedure entry point
97 : ldw RR'ltoff(%r1),%r21
98 : ldw RR'ltoff+4(%r1),%r19 ; get new dlt value.
30667bf3
AM
99 : ldsid (%r21),%r1
100 : mtsp %r1,%sr0
101 : be 0(%sr0,%r21) ; branch to target
102 : stw %rp,-24(%sp) ; save rp
103
104 Export stub to return from shared lib routine (multiple sub-space support)
105 One of these is created for each exported procedure in a shared
106 library (and stored in the shared lib). Shared lib routines are
107 called via the first instruction in the export stub so that we can
108 do an inter-space return. Not required for single sub-space.
109 : bl,n X,%rp ; trap the return
110 : nop
111 : ldw -24(%sp),%rp ; restore the original rp
112 : ldsid (%rp),%r1
113 : mtsp %r1,%sr0
74d1c347 114 : be,n 0(%sr0,%rp) ; inter-space return */
30667bf3
AM
115
116#define PLT_ENTRY_SIZE 8
74d1c347 117#define PLABEL_PLT_ENTRY_SIZE PLT_ENTRY_SIZE
30667bf3
AM
118#define GOT_ENTRY_SIZE 4
119#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
120
47d89dba
AM
121static const bfd_byte plt_stub[] =
122{
123 0x0e, 0x80, 0x10, 0x96, /* 1: ldw 0(%r20),%r22 */
124 0xea, 0xc0, 0xc0, 0x00, /* bv %r0(%r22) */
125 0x0e, 0x88, 0x10, 0x95, /* ldw 4(%r20),%r21 */
126#define PLT_STUB_ENTRY (3*4)
127 0xea, 0x9f, 0x1f, 0xdd, /* b,l 1b,%r20 */
128 0xd6, 0x80, 0x1c, 0x1e, /* depi 0,31,2,%r20 */
129 0x00, 0xc0, 0xff, 0xee, /* 9: .word fixup_func */
130 0xde, 0xad, 0xbe, 0xef /* .word fixup_ltp */
131};
132
30667bf3
AM
133/* Section name for stubs is the associated section name plus this
134 string. */
135#define STUB_SUFFIX ".stub"
136
98ceb8ce
AM
137/* We don't need to copy certain PC- or GP-relative dynamic relocs
138 into a shared object's dynamic section. All the relocs of the
139 limited class we are interested in, are absolute. */
140#ifndef RELATIVE_DYNRELOCS
141#define RELATIVE_DYNRELOCS 0
446f2863 142#define IS_ABSOLUTE_RELOC(r_type) 1
30667bf3
AM
143#endif
144
30667bf3
AM
145enum elf32_hppa_stub_type {
146 hppa_stub_long_branch,
147 hppa_stub_long_branch_shared,
148 hppa_stub_import,
149 hppa_stub_import_shared,
150 hppa_stub_export,
151 hppa_stub_none
152};
153
30667bf3 154struct elf32_hppa_stub_hash_entry {
252b5132 155
edd21aca 156 /* Base hash table entry structure. */
252b5132
RH
157 struct bfd_hash_entry root;
158
edd21aca
AM
159 /* The stub section. */
160 asection *stub_sec;
161
162 /* Offset within stub_sec of the beginning of this stub. */
30667bf3 163 bfd_vma stub_offset;
252b5132
RH
164
165 /* Given the symbol's value and its section we can determine its final
166 value when building the stubs (so the stub knows where to jump. */
30667bf3 167 bfd_vma target_value;
252b5132 168 asection *target_section;
30667bf3
AM
169
170 enum elf32_hppa_stub_type stub_type;
171
172 /* The symbol table entry, if any, that this was derived from. */
173 struct elf32_hppa_link_hash_entry *h;
174
25f72752
AM
175 /* Where this stub is being called from, or, in the case of combined
176 stub sections, the first input section in the group. */
177 asection *id_sec;
252b5132
RH
178};
179
30667bf3
AM
180struct elf32_hppa_link_hash_entry {
181
182 struct elf_link_hash_entry elf;
183
184 /* A pointer to the most recently used stub hash entry against this
185 symbol. */
186 struct elf32_hppa_stub_hash_entry *stub_cache;
187
30667bf3
AM
188 /* Used to count relocations for delayed sizing of relocation
189 sections. */
190 struct elf32_hppa_dyn_reloc_entry {
191
192 /* Next relocation in the chain. */
193 struct elf32_hppa_dyn_reloc_entry *next;
194
98ceb8ce
AM
195 /* The input section of the reloc. */
196 asection *sec;
30667bf3
AM
197
198 /* Number of relocs copied in this section. */
199 bfd_size_type count;
98ceb8ce
AM
200
201#if RELATIVE_DYNRELOCS
202 /* Number of relative relocs copied for the input section. */
203 bfd_size_type relative_count;
204#endif
205 } *dyn_relocs;
30667bf3
AM
206
207 /* Set during a static link if we detect a function is PIC. */
12cca0d2
AM
208 unsigned int maybe_pic_call:1;
209
210 /* Set if the only reason we need a .plt entry is for a non-PIC to
211 PIC function call. */
74d1c347
AM
212 unsigned int pic_call:1;
213
214 /* Set if this symbol is used by a plabel reloc. */
215 unsigned int plabel:1;
216
217 /* Set if this symbol is an init or fini function and thus should
218 use an absolute reloc. */
219 unsigned int plt_abs:1;
30667bf3
AM
220};
221
30667bf3
AM
222struct elf32_hppa_link_hash_table {
223
252b5132 224 /* The main hash table. */
ebe50bae 225 struct elf_link_hash_table elf;
252b5132
RH
226
227 /* The stub hash table. */
edd21aca 228 struct bfd_hash_table stub_hash_table;
252b5132 229
30667bf3
AM
230 /* Linker stub bfd. */
231 bfd *stub_bfd;
232
30667bf3
AM
233 /* Linker call-backs. */
234 asection * (*add_stub_section) PARAMS ((const char *, asection *));
235 void (*layout_sections_again) PARAMS ((void));
236
25f72752
AM
237 /* Array to keep track of which stub sections have been created, and
238 information on stub grouping. */
239 struct map_stub {
240 /* This is the section to which stubs in the group will be
241 attached. */
242 asection *link_sec;
243 /* The stub section. */
244 asection *stub_sec;
25f72752 245 } *stub_group;
30667bf3 246
30667bf3
AM
247 /* Short-cuts to get to dynamic linker sections. */
248 asection *sgot;
249 asection *srelgot;
250 asection *splt;
251 asection *srelplt;
252 asection *sdynbss;
253 asection *srelbss;
47d89dba 254
c46b7515
AM
255 /* Used during a final link to store the base of the text and data
256 segments so that we can perform SEGREL relocations. */
257 bfd_vma text_segment_base;
258 bfd_vma data_segment_base;
259
47d89dba
AM
260 /* Whether we support multiple sub-spaces for shared libs. */
261 unsigned int multi_subspace:1;
262
263 /* Flags set when PCREL12F and PCREL17F branches detected. Used to
264 select suitable defaults for the stub group size. */
265 unsigned int has_12bit_branch:1;
266 unsigned int has_17bit_branch:1;
267
268 /* Set if we need a .plt stub to support lazy dynamic linking. */
269 unsigned int need_plt_stub:1;
252b5132
RH
270};
271
30667bf3
AM
272/* Various hash macros and functions. */
273#define hppa_link_hash_table(p) \
edd21aca 274 ((struct elf32_hppa_link_hash_table *) ((p)->hash))
252b5132 275
30667bf3
AM
276#define hppa_stub_hash_lookup(table, string, create, copy) \
277 ((struct elf32_hppa_stub_hash_entry *) \
278 bfd_hash_lookup ((table), (string), (create), (copy)))
279
280static struct bfd_hash_entry *stub_hash_newfunc
281 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
edd21aca 282
30667bf3 283static struct bfd_hash_entry *hppa_link_hash_newfunc
edd21aca 284 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
252b5132
RH
285
286static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
287 PARAMS ((bfd *));
288
30667bf3
AM
289/* Stub handling functions. */
290static char *hppa_stub_name
291 PARAMS ((const asection *, const asection *,
292 const struct elf32_hppa_link_hash_entry *,
293 const Elf_Internal_Rela *));
edd21aca 294
30667bf3
AM
295static struct elf32_hppa_stub_hash_entry *hppa_get_stub_entry
296 PARAMS ((const asection *, const asection *,
297 struct elf32_hppa_link_hash_entry *,
25f72752
AM
298 const Elf_Internal_Rela *,
299 struct elf32_hppa_link_hash_table *));
edd21aca 300
30667bf3 301static struct elf32_hppa_stub_hash_entry *hppa_add_stub
25f72752 302 PARAMS ((const char *, asection *, struct elf32_hppa_link_hash_table *));
30667bf3
AM
303
304static enum elf32_hppa_stub_type hppa_type_of_stub
305 PARAMS ((asection *, const Elf_Internal_Rela *,
306 struct elf32_hppa_link_hash_entry *, bfd_vma));
307
308static boolean hppa_build_one_stub
309 PARAMS ((struct bfd_hash_entry *, PTR));
310
311static boolean hppa_size_one_stub
312 PARAMS ((struct bfd_hash_entry *, PTR));
313
30667bf3
AM
314/* BFD and elf backend functions. */
315static boolean elf32_hppa_object_p PARAMS ((bfd *));
252b5132 316
edd21aca
AM
317static boolean elf32_hppa_add_symbol_hook
318 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
319 const char **, flagword *, asection **, bfd_vma *));
252b5132 320
30667bf3
AM
321static boolean elf32_hppa_create_dynamic_sections
322 PARAMS ((bfd *, struct bfd_link_info *));
252b5132 323
ebe50bae
AM
324static void elf32_hppa_copy_indirect_symbol
325 PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
326
30667bf3
AM
327static boolean elf32_hppa_check_relocs
328 PARAMS ((bfd *, struct bfd_link_info *,
329 asection *, const Elf_Internal_Rela *));
330
331static asection *elf32_hppa_gc_mark_hook
332 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
333 struct elf_link_hash_entry *, Elf_Internal_Sym *));
334
335static boolean elf32_hppa_gc_sweep_hook
336 PARAMS ((bfd *, struct bfd_link_info *,
337 asection *, const Elf_Internal_Rela *));
338
74d1c347
AM
339static void elf32_hppa_hide_symbol
340 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
341
30667bf3
AM
342static boolean elf32_hppa_adjust_dynamic_symbol
343 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
344
345static boolean hppa_handle_PIC_calls
346 PARAMS ((struct elf_link_hash_entry *, PTR));
347
98ceb8ce
AM
348static boolean allocate_dynrelocs
349 PARAMS ((struct elf_link_hash_entry *, PTR));
350
351static boolean readonly_dynrelocs
30667bf3 352 PARAMS ((struct elf_link_hash_entry *, PTR));
30667bf3 353
d5c73c2f
AM
354static boolean clobber_millicode_symbols
355 PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
356
30667bf3
AM
357static boolean elf32_hppa_size_dynamic_sections
358 PARAMS ((bfd *, struct bfd_link_info *));
359
c46b7515
AM
360static boolean elf32_hppa_final_link
361 PARAMS ((bfd *, struct bfd_link_info *));
362
363static void hppa_record_segment_addr
364 PARAMS ((bfd *, asection *, PTR));
365
30667bf3
AM
366static bfd_reloc_status_type final_link_relocate
367 PARAMS ((asection *, bfd_byte *, const Elf_Internal_Rela *,
25f72752 368 bfd_vma, struct elf32_hppa_link_hash_table *, asection *,
30667bf3
AM
369 struct elf32_hppa_link_hash_entry *));
370
371static boolean elf32_hppa_relocate_section
372 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
373 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
374
c46b7515
AM
375static int hppa_unwind_entry_compare
376 PARAMS ((const PTR, const PTR));
377
30667bf3
AM
378static boolean elf32_hppa_finish_dynamic_symbol
379 PARAMS ((bfd *, struct bfd_link_info *,
380 struct elf_link_hash_entry *, Elf_Internal_Sym *));
381
98ceb8ce
AM
382static enum elf_reloc_type_class elf32_hppa_reloc_type_class
383 PARAMS ((const Elf_Internal_Rela *));
384
30667bf3
AM
385static boolean elf32_hppa_finish_dynamic_sections
386 PARAMS ((bfd *, struct bfd_link_info *));
387
d952f17a
AM
388static void elf32_hppa_post_process_headers
389 PARAMS ((bfd *, struct bfd_link_info *));
390
30667bf3
AM
391static int elf32_hppa_elf_get_symbol_type
392 PARAMS ((Elf_Internal_Sym *, int));
252b5132 393
252b5132
RH
394/* Assorted hash table functions. */
395
396/* Initialize an entry in the stub hash table. */
397
398static struct bfd_hash_entry *
30667bf3 399stub_hash_newfunc (entry, table, string)
252b5132
RH
400 struct bfd_hash_entry *entry;
401 struct bfd_hash_table *table;
402 const char *string;
403{
252b5132
RH
404 /* Allocate the structure if it has not already been allocated by a
405 subclass. */
ebe50bae 406 if (entry == NULL)
30667bf3 407 {
ebe50bae
AM
408 entry = bfd_hash_allocate (table,
409 sizeof (struct elf32_hppa_stub_hash_entry));
410 if (entry == NULL)
411 return entry;
30667bf3 412 }
252b5132
RH
413
414 /* Call the allocation method of the superclass. */
ebe50bae
AM
415 entry = bfd_hash_newfunc (entry, table, string);
416 if (entry != NULL)
252b5132 417 {
ebe50bae
AM
418 struct elf32_hppa_stub_hash_entry *eh;
419
252b5132 420 /* Initialize the local fields. */
ebe50bae
AM
421 eh = (struct elf32_hppa_stub_hash_entry *) entry;
422 eh->stub_sec = NULL;
423 eh->stub_offset = 0;
424 eh->target_value = 0;
425 eh->target_section = NULL;
426 eh->stub_type = hppa_stub_long_branch;
427 eh->h = NULL;
428 eh->id_sec = NULL;
30667bf3
AM
429 }
430
ebe50bae 431 return entry;
30667bf3
AM
432}
433
30667bf3
AM
434/* Initialize an entry in the link hash table. */
435
436static struct bfd_hash_entry *
437hppa_link_hash_newfunc (entry, table, string)
438 struct bfd_hash_entry *entry;
439 struct bfd_hash_table *table;
440 const char *string;
441{
30667bf3
AM
442 /* Allocate the structure if it has not already been allocated by a
443 subclass. */
ebe50bae 444 if (entry == NULL)
30667bf3 445 {
ebe50bae
AM
446 entry = bfd_hash_allocate (table,
447 sizeof (struct elf32_hppa_link_hash_entry));
448 if (entry == NULL)
449 return entry;
30667bf3
AM
450 }
451
452 /* Call the allocation method of the superclass. */
ebe50bae
AM
453 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
454 if (entry != NULL)
30667bf3 455 {
ebe50bae
AM
456 struct elf32_hppa_link_hash_entry *eh;
457
30667bf3 458 /* Initialize the local fields. */
ebe50bae
AM
459 eh = (struct elf32_hppa_link_hash_entry *) entry;
460 eh->stub_cache = NULL;
461 eh->dyn_relocs = NULL;
462 eh->maybe_pic_call = 0;
463 eh->pic_call = 0;
464 eh->plabel = 0;
465 eh->plt_abs = 0;
252b5132
RH
466 }
467
ebe50bae 468 return entry;
252b5132
RH
469}
470
252b5132
RH
471/* Create the derived linker hash table. The PA ELF port uses the derived
472 hash table to keep information specific to the PA ELF linker (without
473 using static variables). */
474
475static struct bfd_link_hash_table *
476elf32_hppa_link_hash_table_create (abfd)
477 bfd *abfd;
478{
479 struct elf32_hppa_link_hash_table *ret;
dc810e39 480 bfd_size_type amt = sizeof (*ret);
252b5132 481
dc810e39 482 ret = (struct elf32_hppa_link_hash_table *) bfd_alloc (abfd, amt);
252b5132
RH
483 if (ret == NULL)
484 return NULL;
edd21aca 485
ebe50bae 486 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, hppa_link_hash_newfunc))
252b5132
RH
487 {
488 bfd_release (abfd, ret);
489 return NULL;
490 }
edd21aca
AM
491
492 /* Init the stub hash table too. */
30667bf3 493 if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc))
edd21aca
AM
494 return NULL;
495
30667bf3 496 ret->stub_bfd = NULL;
30667bf3
AM
497 ret->add_stub_section = NULL;
498 ret->layout_sections_again = NULL;
25f72752 499 ret->stub_group = NULL;
30667bf3
AM
500 ret->sgot = NULL;
501 ret->srelgot = NULL;
502 ret->splt = NULL;
503 ret->srelplt = NULL;
504 ret->sdynbss = NULL;
505 ret->srelbss = NULL;
c46b7515
AM
506 ret->text_segment_base = (bfd_vma) -1;
507 ret->data_segment_base = (bfd_vma) -1;
47d89dba
AM
508 ret->multi_subspace = 0;
509 ret->has_12bit_branch = 0;
510 ret->has_17bit_branch = 0;
511 ret->need_plt_stub = 0;
252b5132 512
ebe50bae 513 return &ret->elf.root;
252b5132
RH
514}
515
30667bf3
AM
516/* Build a name for an entry in the stub hash table. */
517
edd21aca 518static char *
30667bf3 519hppa_stub_name (input_section, sym_sec, hash, rel)
edd21aca 520 const asection *input_section;
30667bf3
AM
521 const asection *sym_sec;
522 const struct elf32_hppa_link_hash_entry *hash;
523 const Elf_Internal_Rela *rel;
edd21aca
AM
524{
525 char *stub_name;
dc810e39 526 bfd_size_type len;
edd21aca 527
30667bf3
AM
528 if (hash)
529 {
530 len = 8 + 1 + strlen (hash->elf.root.root.string) + 1 + 8 + 1;
531 stub_name = bfd_malloc (len);
532 if (stub_name != NULL)
533 {
534 sprintf (stub_name, "%08x_%s+%x",
535 input_section->id & 0xffffffff,
536 hash->elf.root.root.string,
537 (int) rel->r_addend & 0xffffffff);
538 }
539 }
540 else
edd21aca 541 {
30667bf3
AM
542 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
543 stub_name = bfd_malloc (len);
544 if (stub_name != NULL)
545 {
546 sprintf (stub_name, "%08x_%x:%x+%x",
547 input_section->id & 0xffffffff,
548 sym_sec->id & 0xffffffff,
549 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff,
550 (int) rel->r_addend & 0xffffffff);
551 }
edd21aca
AM
552 }
553 return stub_name;
554}
252b5132 555
30667bf3
AM
556/* Look up an entry in the stub hash. Stub entries are cached because
557 creating the stub name takes a bit of time. */
558
559static struct elf32_hppa_stub_hash_entry *
83c81bfe 560hppa_get_stub_entry (input_section, sym_sec, hash, rel, htab)
30667bf3
AM
561 const asection *input_section;
562 const asection *sym_sec;
563 struct elf32_hppa_link_hash_entry *hash;
564 const Elf_Internal_Rela *rel;
83c81bfe 565 struct elf32_hppa_link_hash_table *htab;
252b5132 566{
30667bf3 567 struct elf32_hppa_stub_hash_entry *stub_entry;
25f72752
AM
568 const asection *id_sec;
569
570 /* If this input section is part of a group of sections sharing one
571 stub section, then use the id of the first section in the group.
572 Stub names need to include a section id, as there may well be
573 more than one stub used to reach say, printf, and we need to
574 distinguish between them. */
83c81bfe 575 id_sec = htab->stub_group[input_section->id].link_sec;
edd21aca 576
30667bf3
AM
577 if (hash != NULL && hash->stub_cache != NULL
578 && hash->stub_cache->h == hash
25f72752 579 && hash->stub_cache->id_sec == id_sec)
edd21aca 580 {
30667bf3
AM
581 stub_entry = hash->stub_cache;
582 }
583 else
584 {
30667bf3 585 char *stub_name;
edd21aca 586
25f72752 587 stub_name = hppa_stub_name (id_sec, sym_sec, hash, rel);
30667bf3
AM
588 if (stub_name == NULL)
589 return NULL;
edd21aca 590
83c81bfe 591 stub_entry = hppa_stub_hash_lookup (&htab->stub_hash_table,
25f72752 592 stub_name, false, false);
30667bf3
AM
593 if (stub_entry == NULL)
594 {
595 if (hash == NULL || hash->elf.root.type != bfd_link_hash_undefweak)
596 (*_bfd_error_handler) (_("%s(%s+0x%lx): cannot find stub entry %s"),
8f615d07 597 bfd_archive_filename (input_section->owner),
30667bf3
AM
598 input_section->name,
599 (long) rel->r_offset,
600 stub_name);
601 }
602 else
603 {
604 if (hash != NULL)
605 hash->stub_cache = stub_entry;
606 }
607
608 free (stub_name);
edd21aca 609 }
30667bf3
AM
610
611 return stub_entry;
612}
613
30667bf3
AM
614/* Add a new stub entry to the stub hash. Not all fields of the new
615 stub entry are initialised. */
616
617static struct elf32_hppa_stub_hash_entry *
83c81bfe 618hppa_add_stub (stub_name, section, htab)
30667bf3
AM
619 const char *stub_name;
620 asection *section;
83c81bfe 621 struct elf32_hppa_link_hash_table *htab;
30667bf3 622{
25f72752 623 asection *link_sec;
30667bf3 624 asection *stub_sec;
30667bf3 625 struct elf32_hppa_stub_hash_entry *stub_entry;
edd21aca 626
83c81bfe
AM
627 link_sec = htab->stub_group[section->id].link_sec;
628 stub_sec = htab->stub_group[section->id].stub_sec;
30667bf3 629 if (stub_sec == NULL)
edd21aca 630 {
83c81bfe 631 stub_sec = htab->stub_group[link_sec->id].stub_sec;
30667bf3
AM
632 if (stub_sec == NULL)
633 {
dc810e39 634 bfd_size_type len;
30667bf3
AM
635 char *s_name;
636
25f72752 637 len = strlen (link_sec->name) + sizeof (STUB_SUFFIX);
83c81bfe 638 s_name = bfd_alloc (htab->stub_bfd, len);
30667bf3
AM
639 if (s_name == NULL)
640 return NULL;
641
25f72752 642 strcpy (s_name, link_sec->name);
30667bf3 643 strcpy (s_name + len - sizeof (STUB_SUFFIX), STUB_SUFFIX);
83c81bfe 644 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
30667bf3
AM
645 if (stub_sec == NULL)
646 return NULL;
83c81bfe 647 htab->stub_group[link_sec->id].stub_sec = stub_sec;
30667bf3 648 }
83c81bfe 649 htab->stub_group[section->id].stub_sec = stub_sec;
edd21aca 650 }
252b5132 651
30667bf3 652 /* Enter this entry into the linker stub hash table. */
83c81bfe 653 stub_entry = hppa_stub_hash_lookup (&htab->stub_hash_table, stub_name,
30667bf3
AM
654 true, false);
655 if (stub_entry == NULL)
656 {
657 (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
8f615d07 658 bfd_archive_filename (section->owner),
30667bf3
AM
659 stub_name);
660 return NULL;
edd21aca
AM
661 }
662
30667bf3 663 stub_entry->stub_sec = stub_sec;
30667bf3 664 stub_entry->stub_offset = 0;
25f72752 665 stub_entry->id_sec = link_sec;
30667bf3 666 return stub_entry;
edd21aca
AM
667}
668
30667bf3
AM
669/* Determine the type of stub needed, if any, for a call. */
670
671static enum elf32_hppa_stub_type
672hppa_type_of_stub (input_sec, rel, hash, destination)
673 asection *input_sec;
674 const Elf_Internal_Rela *rel;
675 struct elf32_hppa_link_hash_entry *hash;
676 bfd_vma destination;
edd21aca 677{
edd21aca 678 bfd_vma location;
30667bf3
AM
679 bfd_vma branch_offset;
680 bfd_vma max_branch_offset;
681 unsigned int r_type;
682
683 if (hash != NULL
684 && (((hash->elf.root.type == bfd_link_hash_defined
74d1c347
AM
685 || hash->elf.root.type == bfd_link_hash_defweak)
686 && hash->elf.root.u.def.section->output_section == NULL)
687 || (hash->elf.root.type == bfd_link_hash_defweak
688 && hash->elf.dynindx != -1
689 && hash->elf.plt.offset != (bfd_vma) -1)
30667bf3
AM
690 || hash->elf.root.type == bfd_link_hash_undefweak
691 || hash->elf.root.type == bfd_link_hash_undefined
12cca0d2 692 || (hash->maybe_pic_call && !(input_sec->flags & SEC_HAS_GOT_REF))))
30667bf3
AM
693 {
694 /* If output_section is NULL, then it's a symbol defined in a
695 shared library. We will need an import stub. Decide between
74d1c347
AM
696 hppa_stub_import and hppa_stub_import_shared later. For
697 shared links we need stubs for undefined or weak syms too;
698 They will presumably be resolved by the dynamic linker. */
30667bf3
AM
699 return hppa_stub_import;
700 }
edd21aca 701
30667bf3
AM
702 /* Determine where the call point is. */
703 location = (input_sec->output_offset
704 + input_sec->output_section->vma
705 + rel->r_offset);
edd21aca 706
30667bf3
AM
707 branch_offset = destination - location - 8;
708 r_type = ELF32_R_TYPE (rel->r_info);
edd21aca 709
30667bf3
AM
710 /* Determine if a long branch stub is needed. parisc branch offsets
711 are relative to the second instruction past the branch, ie. +8
712 bytes on from the branch instruction location. The offset is
713 signed and counts in units of 4 bytes. */
714 if (r_type == (unsigned int) R_PARISC_PCREL17F)
edd21aca 715 {
30667bf3
AM
716 max_branch_offset = (1 << (17-1)) << 2;
717 }
718 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
719 {
720 max_branch_offset = (1 << (12-1)) << 2;
721 }
25f72752 722 else /* R_PARISC_PCREL22F. */
30667bf3
AM
723 {
724 max_branch_offset = (1 << (22-1)) << 2;
edd21aca
AM
725 }
726
30667bf3 727 if (branch_offset + max_branch_offset >= 2*max_branch_offset)
98ceb8ce
AM
728 return hppa_stub_long_branch;
729
30667bf3
AM
730 return hppa_stub_none;
731}
edd21aca 732
30667bf3
AM
733/* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
734 IN_ARG contains the link info pointer. */
edd21aca 735
30667bf3
AM
736#define LDIL_R1 0x20200000 /* ldil LR'XXX,%r1 */
737#define BE_SR4_R1 0xe0202002 /* be,n RR'XXX(%sr4,%r1) */
edd21aca 738
30667bf3 739#define BL_R1 0xe8200000 /* b,l .+8,%r1 */
3ee1d854 740#define ADDIL_R1 0x28200000 /* addil LR'XXX,%r1,%r1 */
30667bf3 741#define DEPI_R1 0xd4201c1e /* depi 0,31,2,%r1 */
252b5132 742
3ee1d854
AM
743#define ADDIL_DP 0x2b600000 /* addil LR'XXX,%dp,%r1 */
744#define LDW_R1_R21 0x48350000 /* ldw RR'XXX(%sr0,%r1),%r21 */
30667bf3 745#define BV_R0_R21 0xeaa0c000 /* bv %r0(%r21) */
3ee1d854 746#define LDW_R1_R19 0x48330000 /* ldw RR'XXX(%sr0,%r1),%r19 */
252b5132 747
3ee1d854
AM
748#define ADDIL_R19 0x2a600000 /* addil LR'XXX,%r19,%r1 */
749#define LDW_R1_DP 0x483b0000 /* ldw RR'XXX(%sr0,%r1),%dp */
edd21aca 750
30667bf3
AM
751#define LDSID_R21_R1 0x02a010a1 /* ldsid (%sr0,%r21),%r1 */
752#define MTSP_R1 0x00011820 /* mtsp %r1,%sr0 */
753#define BE_SR0_R21 0xe2a00000 /* be 0(%sr0,%r21) */
754#define STW_RP 0x6bc23fd1 /* stw %rp,-24(%sr0,%sp) */
edd21aca 755
30667bf3
AM
756#define BL_RP 0xe8400002 /* b,l,n XXX,%rp */
757#define NOP 0x08000240 /* nop */
758#define LDW_RP 0x4bc23fd1 /* ldw -24(%sr0,%sp),%rp */
759#define LDSID_RP_R1 0x004010a1 /* ldsid (%sr0,%rp),%r1 */
760#define BE_SR0_RP 0xe0400002 /* be,n 0(%sr0,%rp) */
edd21aca 761
30667bf3
AM
762#ifndef R19_STUBS
763#define R19_STUBS 1
764#endif
edd21aca 765
30667bf3
AM
766#if R19_STUBS
767#define LDW_R1_DLT LDW_R1_R19
768#else
769#define LDW_R1_DLT LDW_R1_DP
770#endif
edd21aca 771
30667bf3
AM
772static boolean
773hppa_build_one_stub (gen_entry, in_arg)
774 struct bfd_hash_entry *gen_entry;
775 PTR in_arg;
776{
777 struct elf32_hppa_stub_hash_entry *stub_entry;
778 struct bfd_link_info *info;
83c81bfe 779 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
780 asection *stub_sec;
781 bfd *stub_bfd;
782 bfd_byte *loc;
783 bfd_vma sym_value;
74d1c347 784 bfd_vma insn;
8dea1268 785 bfd_vma off;
74d1c347 786 int val;
30667bf3 787 int size;
edd21aca 788
30667bf3
AM
789 /* Massage our args to the form they really have. */
790 stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry;
791 info = (struct bfd_link_info *) in_arg;
792
83c81bfe 793 htab = hppa_link_hash_table (info);
30667bf3 794 stub_sec = stub_entry->stub_sec;
edd21aca 795
30667bf3 796 /* Make a note of the offset within the stubs for this entry. */
74d1c347 797 stub_entry->stub_offset = stub_sec->_raw_size;
30667bf3 798 loc = stub_sec->contents + stub_entry->stub_offset;
252b5132 799
30667bf3
AM
800 stub_bfd = stub_sec->owner;
801
802 switch (stub_entry->stub_type)
803 {
804 case hppa_stub_long_branch:
805 /* Create the long branch. A long branch is formed with "ldil"
806 loading the upper bits of the target address into a register,
807 then branching with "be" which adds in the lower bits.
808 The "be" has its delay slot nullified. */
809 sym_value = (stub_entry->target_value
810 + stub_entry->target_section->output_offset
811 + stub_entry->target_section->output_section->vma);
812
74d1c347
AM
813 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_lrsel);
814 insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
30667bf3
AM
815 bfd_put_32 (stub_bfd, insn, loc);
816
74d1c347
AM
817 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_rrsel) >> 2;
818 insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
30667bf3
AM
819 bfd_put_32 (stub_bfd, insn, loc + 4);
820
30667bf3 821 size = 8;
edd21aca
AM
822 break;
823
30667bf3
AM
824 case hppa_stub_long_branch_shared:
825 /* Branches are relative. This is where we are going to. */
826 sym_value = (stub_entry->target_value
827 + stub_entry->target_section->output_offset
828 + stub_entry->target_section->output_section->vma);
829
830 /* And this is where we are coming from, more or less. */
831 sym_value -= (stub_entry->stub_offset
832 + stub_sec->output_offset
833 + stub_sec->output_section->vma);
834
74d1c347 835 bfd_put_32 (stub_bfd, (bfd_vma) BL_R1, loc);
47d89dba 836 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_lrsel);
74d1c347 837 insn = hppa_rebuild_insn ((int) ADDIL_R1, val, 21);
30667bf3
AM
838 bfd_put_32 (stub_bfd, insn, loc + 4);
839
47d89dba 840 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_rrsel) >> 2;
74d1c347 841 insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
30667bf3
AM
842 bfd_put_32 (stub_bfd, insn, loc + 8);
843 size = 12;
844 break;
edd21aca 845
30667bf3
AM
846 case hppa_stub_import:
847 case hppa_stub_import_shared:
8dea1268
AM
848 off = stub_entry->h->elf.plt.offset;
849 if (off >= (bfd_vma) -2)
49e9d0d3 850 abort ();
8dea1268
AM
851
852 off &= ~ (bfd_vma) 1;
853 sym_value = (off
83c81bfe
AM
854 + htab->splt->output_offset
855 + htab->splt->output_section->vma
856 - elf_gp (htab->splt->output_section->owner));
30667bf3
AM
857
858 insn = ADDIL_DP;
859#if R19_STUBS
860 if (stub_entry->stub_type == hppa_stub_import_shared)
861 insn = ADDIL_R19;
862#endif
47d89dba 863 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_lrsel),
74d1c347 864 insn = hppa_rebuild_insn ((int) insn, val, 21);
30667bf3 865 bfd_put_32 (stub_bfd, insn, loc);
edd21aca 866
47d89dba
AM
867 /* It is critical to use lrsel/rrsel here because we are using
868 two different offsets (+0 and +4) from sym_value. If we use
869 lsel/rsel then with unfortunate sym_values we will round
870 sym_value+4 up to the next 2k block leading to a mis-match
871 between the lsel and rsel value. */
872 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_rrsel);
74d1c347 873 insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14);
30667bf3 874 bfd_put_32 (stub_bfd, insn, loc + 4);
252b5132 875
83c81bfe 876 if (htab->multi_subspace)
30667bf3 877 {
47d89dba 878 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
74d1c347 879 insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
30667bf3 880 bfd_put_32 (stub_bfd, insn, loc + 8);
252b5132 881
74d1c347
AM
882 bfd_put_32 (stub_bfd, (bfd_vma) LDSID_R21_R1, loc + 12);
883 bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
884 bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_R21, loc + 20);
885 bfd_put_32 (stub_bfd, (bfd_vma) STW_RP, loc + 24);
252b5132 886
30667bf3
AM
887 size = 28;
888 }
889 else
890 {
74d1c347 891 bfd_put_32 (stub_bfd, (bfd_vma) BV_R0_R21, loc + 8);
47d89dba 892 val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
74d1c347 893 insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
30667bf3 894 bfd_put_32 (stub_bfd, insn, loc + 12);
252b5132 895
30667bf3
AM
896 size = 16;
897 }
252b5132 898
30667bf3
AM
899 if (!info->shared
900 && stub_entry->h != NULL
901 && stub_entry->h->pic_call)
252b5132 902 {
30667bf3
AM
903 /* Build the .plt entry needed to call a PIC function from
904 statically linked code. We don't need any relocs. */
905 bfd *dynobj;
906 struct elf32_hppa_link_hash_entry *eh;
907 bfd_vma value;
252b5132 908
ebe50bae 909 dynobj = htab->elf.dynobj;
30667bf3 910 eh = (struct elf32_hppa_link_hash_entry *) stub_entry->h;
252b5132 911
49e9d0d3
AM
912 if (eh->elf.root.type != bfd_link_hash_defined
913 && eh->elf.root.type != bfd_link_hash_defweak)
914 abort ();
252b5132 915
30667bf3
AM
916 value = (eh->elf.root.u.def.value
917 + eh->elf.root.u.def.section->output_offset
918 + eh->elf.root.u.def.section->output_section->vma);
252b5132 919
30667bf3 920 /* Fill in the entry in the procedure linkage table.
252b5132 921
30667bf3 922 The format of a plt entry is
74d1c347
AM
923 <funcaddr>
924 <__gp>. */
252b5132 925
83c81bfe
AM
926 bfd_put_32 (htab->splt->owner, value,
927 htab->splt->contents + off);
928 value = elf_gp (htab->splt->output_section->owner);
929 bfd_put_32 (htab->splt->owner, value,
930 htab->splt->contents + off + 4);
252b5132 931 }
30667bf3 932 break;
252b5132 933
30667bf3
AM
934 case hppa_stub_export:
935 /* Branches are relative. This is where we are going to. */
936 sym_value = (stub_entry->target_value
937 + stub_entry->target_section->output_offset
938 + stub_entry->target_section->output_section->vma);
252b5132 939
30667bf3
AM
940 /* And this is where we are coming from. */
941 sym_value -= (stub_entry->stub_offset
942 + stub_sec->output_offset
943 + stub_sec->output_section->vma);
edd21aca 944
30667bf3
AM
945 if (sym_value - 8 + 0x40000 >= 0x80000)
946 {
edd21aca 947 (*_bfd_error_handler)
30667bf3 948 (_("%s(%s+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
8f615d07 949 bfd_archive_filename (stub_entry->target_section->owner),
30667bf3
AM
950 stub_sec->name,
951 (long) stub_entry->stub_offset,
952 stub_entry->root.string);
953 bfd_set_error (bfd_error_bad_value);
edd21aca 954 return false;
252b5132 955 }
30667bf3 956
74d1c347
AM
957 val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_fsel) >> 2;
958 insn = hppa_rebuild_insn ((int) BL_RP, val, 17);
30667bf3
AM
959 bfd_put_32 (stub_bfd, insn, loc);
960
74d1c347
AM
961 bfd_put_32 (stub_bfd, (bfd_vma) NOP, loc + 4);
962 bfd_put_32 (stub_bfd, (bfd_vma) LDW_RP, loc + 8);
963 bfd_put_32 (stub_bfd, (bfd_vma) LDSID_RP_R1, loc + 12);
964 bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1, loc + 16);
965 bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_RP, loc + 20);
30667bf3
AM
966
967 /* Point the function symbol at the stub. */
968 stub_entry->h->elf.root.u.def.section = stub_sec;
74d1c347 969 stub_entry->h->elf.root.u.def.value = stub_sec->_raw_size;
30667bf3
AM
970
971 size = 24;
972 break;
973
974 default:
975 BFD_FAIL ();
976 return false;
252b5132
RH
977 }
978
74d1c347 979 stub_sec->_raw_size += size;
252b5132
RH
980 return true;
981}
982
30667bf3
AM
983#undef LDIL_R1
984#undef BE_SR4_R1
985#undef BL_R1
986#undef ADDIL_R1
987#undef DEPI_R1
988#undef ADDIL_DP
989#undef LDW_R1_R21
990#undef LDW_R1_DLT
991#undef LDW_R1_R19
992#undef ADDIL_R19
993#undef LDW_R1_DP
994#undef LDSID_R21_R1
995#undef MTSP_R1
996#undef BE_SR0_R21
997#undef STW_RP
998#undef BV_R0_R21
999#undef BL_RP
1000#undef NOP
1001#undef LDW_RP
1002#undef LDSID_RP_R1
1003#undef BE_SR0_RP
252b5132 1004
30667bf3
AM
1005/* As above, but don't actually build the stub. Just bump offset so
1006 we know stub section sizes. */
1007
1008static boolean
1009hppa_size_one_stub (gen_entry, in_arg)
1010 struct bfd_hash_entry *gen_entry;
1011 PTR in_arg;
252b5132 1012{
30667bf3 1013 struct elf32_hppa_stub_hash_entry *stub_entry;
83c81bfe 1014 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
1015 int size;
1016
1017 /* Massage our args to the form they really have. */
1018 stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry;
83c81bfe 1019 htab = (struct elf32_hppa_link_hash_table *) in_arg;
30667bf3
AM
1020
1021 if (stub_entry->stub_type == hppa_stub_long_branch)
98ceb8ce 1022 size = 8;
30667bf3
AM
1023 else if (stub_entry->stub_type == hppa_stub_long_branch_shared)
1024 size = 12;
1025 else if (stub_entry->stub_type == hppa_stub_export)
1026 size = 24;
74d1c347 1027 else /* hppa_stub_import or hppa_stub_import_shared. */
252b5132 1028 {
83c81bfe 1029 if (htab->multi_subspace)
30667bf3
AM
1030 size = 28;
1031 else
1032 size = 16;
1033 }
252b5132 1034
74d1c347 1035 stub_entry->stub_sec->_raw_size += size;
30667bf3
AM
1036 return true;
1037}
252b5132 1038
30667bf3
AM
1039/* Return nonzero if ABFD represents an HPPA ELF32 file.
1040 Additionally we set the default architecture and machine. */
1041
1042static boolean
1043elf32_hppa_object_p (abfd)
1044 bfd *abfd;
1045{
24a5e751
L
1046 Elf_Internal_Ehdr * i_ehdrp;
1047 unsigned int flags;
252b5132 1048
24a5e751
L
1049 i_ehdrp = elf_elfheader (abfd);
1050 if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
1051 {
1052 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX)
1053 return false;
1054 }
1055 else
1056 {
1057 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
1058 return false;
1059 }
1060
1061 flags = i_ehdrp->e_flags;
30667bf3
AM
1062 switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
1063 {
1064 case EFA_PARISC_1_0:
1065 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
1066 case EFA_PARISC_1_1:
1067 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
1068 case EFA_PARISC_2_0:
1069 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
1070 case EFA_PARISC_2_0 | EF_PARISC_WIDE:
1071 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
1072 }
1073 return true;
252b5132
RH
1074}
1075
252b5132
RH
1076/* Undo the generic ELF code's subtraction of section->vma from the
1077 value of each external symbol. */
1078
1079static boolean
1080elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
5f771d47
ILT
1081 bfd *abfd ATTRIBUTE_UNUSED;
1082 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1083 const Elf_Internal_Sym *sym ATTRIBUTE_UNUSED;
1084 const char **namep ATTRIBUTE_UNUSED;
1085 flagword *flagsp ATTRIBUTE_UNUSED;
252b5132
RH
1086 asection **secp;
1087 bfd_vma *valp;
1088{
1089 *valp += (*secp)->vma;
1090 return true;
1091}
1092
30667bf3
AM
1093/* Create the .plt and .got sections, and set up our hash table
1094 short-cuts to various dynamic sections. */
1095
1096static boolean
1097elf32_hppa_create_dynamic_sections (abfd, info)
1098 bfd *abfd;
1099 struct bfd_link_info *info;
252b5132 1100{
83c81bfe 1101 struct elf32_hppa_link_hash_table *htab;
edd21aca 1102
30667bf3 1103 /* Don't try to create the .plt and .got twice. */
83c81bfe
AM
1104 htab = hppa_link_hash_table (info);
1105 if (htab->splt != NULL)
30667bf3 1106 return true;
edd21aca 1107
30667bf3
AM
1108 /* Call the generic code to do most of the work. */
1109 if (! _bfd_elf_create_dynamic_sections (abfd, info))
1110 return false;
252b5132 1111
83c81bfe
AM
1112 htab->splt = bfd_get_section_by_name (abfd, ".plt");
1113 htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
30667bf3 1114
83c81bfe
AM
1115 htab->sgot = bfd_get_section_by_name (abfd, ".got");
1116 htab->srelgot = bfd_make_section (abfd, ".rela.got");
1117 if (htab->srelgot == NULL
1118 || ! bfd_set_section_flags (abfd, htab->srelgot,
30667bf3
AM
1119 (SEC_ALLOC
1120 | SEC_LOAD
1121 | SEC_HAS_CONTENTS
1122 | SEC_IN_MEMORY
1123 | SEC_LINKER_CREATED
1124 | SEC_READONLY))
83c81bfe 1125 || ! bfd_set_section_alignment (abfd, htab->srelgot, 2))
30667bf3 1126 return false;
edd21aca 1127
83c81bfe
AM
1128 htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
1129 htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
30667bf3
AM
1130
1131 return true;
1132}
1133
ebe50bae
AM
1134/* Copy the extra info we tack onto an elf_link_hash_entry. */
1135
51b64d56 1136static void
ebe50bae
AM
1137elf32_hppa_copy_indirect_symbol (dir, ind)
1138 struct elf_link_hash_entry *dir, *ind;
1139{
1140 struct elf32_hppa_link_hash_entry *edir, *eind;
1141
1142 edir = (struct elf32_hppa_link_hash_entry *) dir;
1143 eind = (struct elf32_hppa_link_hash_entry *) ind;
1144
bbd7ec4a 1145 if (eind->dyn_relocs != NULL)
ebe50bae 1146 {
bbd7ec4a
AM
1147 if (edir->dyn_relocs != NULL)
1148 {
1149 struct elf32_hppa_dyn_reloc_entry **pp;
1150 struct elf32_hppa_dyn_reloc_entry *p;
1151
1e370bd2 1152 if (ind->root.type == bfd_link_hash_indirect)
bbd7ec4a
AM
1153 abort ();
1154
1155 /* Add reloc counts against the weak sym to the strong sym
1156 list. Merge any entries against the same section. */
1157 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1158 {
1159 struct elf32_hppa_dyn_reloc_entry *q;
1160
1161 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1162 if (q->sec == p->sec)
1163 {
1164#if RELATIVE_DYNRELOCS
1165 q->relative_count += p->relative_count;
1166#endif
1167 q->count += p->count;
1168 *pp = p->next;
1169 break;
1170 }
1171 if (q == NULL)
1172 pp = &p->next;
1173 }
1174 *pp = edir->dyn_relocs;
1175 }
1176
ebe50bae
AM
1177 edir->dyn_relocs = eind->dyn_relocs;
1178 eind->dyn_relocs = NULL;
1179 }
ebe50bae
AM
1180
1181 _bfd_elf_link_hash_copy_indirect (dir, ind);
1182}
1183
30667bf3 1184/* Look through the relocs for a section during the first phase, and
3ac8354b
AM
1185 calculate needed space in the global offset table, procedure linkage
1186 table, and dynamic reloc sections. At this point we haven't
1187 necessarily read all the input files. */
252b5132
RH
1188
1189static boolean
30667bf3
AM
1190elf32_hppa_check_relocs (abfd, info, sec, relocs)
1191 bfd *abfd;
1192 struct bfd_link_info *info;
1193 asection *sec;
1194 const Elf_Internal_Rela *relocs;
252b5132 1195{
30667bf3
AM
1196 Elf_Internal_Shdr *symtab_hdr;
1197 struct elf_link_hash_entry **sym_hashes;
30667bf3
AM
1198 const Elf_Internal_Rela *rel;
1199 const Elf_Internal_Rela *rel_end;
83c81bfe 1200 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
1201 asection *sreloc;
1202 asection *stubreloc;
1203
1204 if (info->relocateable)
1205 return true;
1206
83c81bfe 1207 htab = hppa_link_hash_table (info);
30667bf3
AM
1208 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1209 sym_hashes = elf_sym_hashes (abfd);
30667bf3
AM
1210 sreloc = NULL;
1211 stubreloc = NULL;
1212
1213 rel_end = relocs + sec->reloc_count;
1214 for (rel = relocs; rel < rel_end; rel++)
1215 {
1216 enum {
1217 NEED_GOT = 1,
1218 NEED_PLT = 2,
1219 NEED_DYNREL = 4,
98ceb8ce 1220 PLT_PLABEL = 8
30667bf3 1221 };
edd21aca 1222
30667bf3
AM
1223 unsigned int r_symndx, r_type;
1224 struct elf32_hppa_link_hash_entry *h;
1225 int need_entry;
252b5132 1226
30667bf3 1227 r_symndx = ELF32_R_SYM (rel->r_info);
252b5132 1228
30667bf3
AM
1229 if (r_symndx < symtab_hdr->sh_info)
1230 h = NULL;
1231 else
1232 h = ((struct elf32_hppa_link_hash_entry *)
1233 sym_hashes[r_symndx - symtab_hdr->sh_info]);
252b5132 1234
30667bf3 1235 r_type = ELF32_R_TYPE (rel->r_info);
252b5132 1236
30667bf3
AM
1237 switch (r_type)
1238 {
1239 case R_PARISC_DLTIND14F:
1240 case R_PARISC_DLTIND14R:
1241 case R_PARISC_DLTIND21L:
1242 /* This symbol requires a global offset table entry. */
1243 need_entry = NEED_GOT;
1244
1245 /* Mark this section as containing PIC code. */
1246 sec->flags |= SEC_HAS_GOT_REF;
1247 break;
1248
1249 case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1250 case R_PARISC_PLABEL21L:
1251 case R_PARISC_PLABEL32:
74d1c347 1252 /* If the addend is non-zero, we break badly. */
49e9d0d3
AM
1253 if (rel->r_addend != 0)
1254 abort ();
74d1c347
AM
1255
1256 /* If we are creating a shared library, then we need to
1257 create a PLT entry for all PLABELs, because PLABELs with
1258 local symbols may be passed via a pointer to another
1259 object. Additionally, output a dynamic relocation
4dc86686
AM
1260 pointing to the PLT entry.
1261 For executables, the original 32-bit ABI allowed two
1262 different styles of PLABELs (function pointers): For
1263 global functions, the PLABEL word points into the .plt
1264 two bytes past a (function address, gp) pair, and for
1265 local functions the PLABEL points directly at the
1266 function. The magic +2 for the first type allows us to
1267 differentiate between the two. As you can imagine, this
1268 is a real pain when it comes to generating code to call
1269 functions indirectly or to compare function pointers.
1270 We avoid the mess by always pointing a PLABEL into the
1271 .plt, even for local functions. */
74d1c347 1272 need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
30667bf3
AM
1273 break;
1274
1275 case R_PARISC_PCREL12F:
83c81bfe 1276 htab->has_12bit_branch = 1;
47d89dba 1277 /* Fall thru. */
30667bf3
AM
1278 case R_PARISC_PCREL17C:
1279 case R_PARISC_PCREL17F:
83c81bfe 1280 htab->has_17bit_branch = 1;
47d89dba 1281 /* Fall thru. */
30667bf3 1282 case R_PARISC_PCREL22F:
47d89dba
AM
1283 /* Function calls might need to go through the .plt, and
1284 might require long branch stubs. */
30667bf3
AM
1285 if (h == NULL)
1286 {
1287 /* We know local syms won't need a .plt entry, and if
1288 they need a long branch stub we can't guarantee that
1289 we can reach the stub. So just flag an error later
1290 if we're doing a shared link and find we need a long
1291 branch stub. */
1292 continue;
1293 }
1294 else
1295 {
1296 /* Global symbols will need a .plt entry if they remain
1297 global, and in most cases won't need a long branch
1298 stub. Unfortunately, we have to cater for the case
1299 where a symbol is forced local by versioning, or due
1300 to symbolic linking, and we lose the .plt entry. */
98ceb8ce 1301 need_entry = NEED_PLT;
4dc86686 1302 if (h->elf.type == STT_PARISC_MILLI)
98ceb8ce 1303 need_entry = 0;
30667bf3
AM
1304 }
1305 break;
1306
1307 case R_PARISC_SEGBASE: /* Used to set segment base. */
c46b7515 1308 case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
30667bf3
AM
1309 case R_PARISC_PCREL14F: /* PC relative load/store. */
1310 case R_PARISC_PCREL14R:
1311 case R_PARISC_PCREL17R: /* External branches. */
1312 case R_PARISC_PCREL21L: /* As above, and for load/store too. */
1313 /* We don't need to propagate the relocation if linking a
1314 shared object since these are section relative. */
1315 continue;
1316
1317 case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1318 case R_PARISC_DPREL14R:
1319 case R_PARISC_DPREL21L:
1320 if (info->shared)
1321 {
1322 (*_bfd_error_handler)
1323 (_("%s: relocation %s can not be used when making a shared object; recompile with -fPIC"),
8f615d07 1324 bfd_archive_filename (abfd),
30667bf3
AM
1325 elf_hppa_howto_table[r_type].name);
1326 bfd_set_error (bfd_error_bad_value);
1327 return false;
1328 }
1329 /* Fall through. */
1330
1331 case R_PARISC_DIR17F: /* Used for external branches. */
1332 case R_PARISC_DIR17R:
47d89dba
AM
1333 case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1334 case R_PARISC_DIR14R:
30667bf3
AM
1335 case R_PARISC_DIR21L: /* As above, and for ext branches too. */
1336#if 1
1337 /* Help debug shared library creation. Any of the above
1338 relocs can be used in shared libs, but they may cause
1339 pages to become unshared. */
1340 if (info->shared)
1341 {
1342 (*_bfd_error_handler)
1343 (_("%s: relocation %s should not be used when making a shared object; recompile with -fPIC"),
8f615d07 1344 bfd_archive_filename (abfd),
30667bf3
AM
1345 elf_hppa_howto_table[r_type].name);
1346 }
1347 /* Fall through. */
1348#endif
1349
c46b7515 1350 case R_PARISC_DIR32: /* .word relocs. */
30667bf3
AM
1351 /* We may want to output a dynamic relocation later. */
1352 need_entry = NEED_DYNREL;
1353 break;
1354
1355 /* This relocation describes the C++ object vtable hierarchy.
1356 Reconstruct it for later use during GC. */
1357 case R_PARISC_GNU_VTINHERIT:
1358 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec,
1359 &h->elf, rel->r_offset))
1360 return false;
1361 continue;
1362
1363 /* This relocation describes which C++ vtable entries are actually
1364 used. Record for later use during GC. */
1365 case R_PARISC_GNU_VTENTRY:
1366 if (!_bfd_elf32_gc_record_vtentry (abfd, sec,
36605136 1367 &h->elf, rel->r_addend))
30667bf3
AM
1368 return false;
1369 continue;
1370
1371 default:
1372 continue;
1373 }
1374
1375 /* Now carry out our orders. */
1376 if (need_entry & NEED_GOT)
1377 {
1378 /* Allocate space for a GOT entry, as well as a dynamic
25f72752 1379 relocation for this entry. */
83c81bfe 1380 if (htab->sgot == NULL)
30667bf3 1381 {
3ac8354b
AM
1382 if (htab->elf.dynobj == NULL)
1383 htab->elf.dynobj = abfd;
1384 if (!elf32_hppa_create_dynamic_sections (htab->elf.dynobj, info))
30667bf3
AM
1385 return false;
1386 }
1387
1388 if (h != NULL)
1389 {
51b64d56 1390 h->elf.got.refcount += 1;
30667bf3
AM
1391 }
1392 else
1393 {
3ac8354b
AM
1394 bfd_signed_vma *local_got_refcounts;
1395
30667bf3 1396 /* This is a global offset table entry for a local symbol. */
3ac8354b 1397 local_got_refcounts = elf_local_got_refcounts (abfd);
30667bf3
AM
1398 if (local_got_refcounts == NULL)
1399 {
dc810e39 1400 bfd_size_type size;
30667bf3 1401
74d1c347
AM
1402 /* Allocate space for local got offsets and local
1403 plt offsets. Done this way to save polluting
1404 elf_obj_tdata with another target specific
1405 pointer. */
dc810e39
AM
1406 size = symtab_hdr->sh_info;
1407 size *= 2 * sizeof (bfd_signed_vma);
30667bf3 1408 local_got_refcounts = ((bfd_signed_vma *)
ebe50bae 1409 bfd_zalloc (abfd, size));
30667bf3
AM
1410 if (local_got_refcounts == NULL)
1411 return false;
1412 elf_local_got_refcounts (abfd) = local_got_refcounts;
30667bf3 1413 }
ebe50bae 1414 local_got_refcounts[r_symndx] += 1;
30667bf3
AM
1415 }
1416 }
1417
1418 if (need_entry & NEED_PLT)
1419 {
1420 /* If we are creating a shared library, and this is a reloc
1421 against a weak symbol or a global symbol in a dynamic
1422 object, then we will be creating an import stub and a
1423 .plt entry for the symbol. Similarly, on a normal link
1424 to symbols defined in a dynamic object we'll need the
1425 import stub and a .plt entry. We don't know yet whether
1426 the symbol is defined or not, so make an entry anyway and
1427 clean up later in adjust_dynamic_symbol. */
1428 if ((sec->flags & SEC_ALLOC) != 0)
1429 {
74d1c347 1430 if (h != NULL)
30667bf3 1431 {
51b64d56
AM
1432 h->elf.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1433 h->elf.plt.refcount += 1;
74d1c347 1434
36605136
AM
1435 /* If this .plt entry is for a plabel, mark it so
1436 that adjust_dynamic_symbol will keep the entry
1437 even if it appears to be local. */
74d1c347
AM
1438 if (need_entry & PLT_PLABEL)
1439 h->plabel = 1;
1440 }
1441 else if (need_entry & PLT_PLABEL)
1442 {
3ac8354b 1443 bfd_signed_vma *local_got_refcounts;
68fb2e56 1444 bfd_signed_vma *local_plt_refcounts;
74d1c347 1445
3ac8354b 1446 local_got_refcounts = elf_local_got_refcounts (abfd);
74d1c347
AM
1447 if (local_got_refcounts == NULL)
1448 {
dc810e39 1449 bfd_size_type size;
74d1c347
AM
1450
1451 /* Allocate space for local got offsets and local
1452 plt offsets. */
dc810e39
AM
1453 size = symtab_hdr->sh_info;
1454 size *= 2 * sizeof (bfd_signed_vma);
74d1c347 1455 local_got_refcounts = ((bfd_signed_vma *)
ebe50bae 1456 bfd_zalloc (abfd, size));
74d1c347
AM
1457 if (local_got_refcounts == NULL)
1458 return false;
1459 elf_local_got_refcounts (abfd) = local_got_refcounts;
74d1c347 1460 }
68fb2e56
AM
1461 local_plt_refcounts = (local_got_refcounts
1462 + symtab_hdr->sh_info);
ebe50bae 1463 local_plt_refcounts[r_symndx] += 1;
30667bf3 1464 }
30667bf3
AM
1465 }
1466 }
1467
98ceb8ce 1468 if (need_entry & NEED_DYNREL)
30667bf3
AM
1469 {
1470 /* Flag this symbol as having a non-got, non-plt reference
1471 so that we generate copy relocs if it turns out to be
1472 dynamic. */
ebe50bae 1473 if (h != NULL && !info->shared)
30667bf3
AM
1474 h->elf.elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1475
1476 /* If we are creating a shared library then we need to copy
1477 the reloc into the shared library. However, if we are
1478 linking with -Bsymbolic, we need only copy absolute
1479 relocs or relocs against symbols that are not defined in
1480 an object we are including in the link. PC- or DP- or
1481 DLT-relative relocs against any local sym or global sym
1482 with DEF_REGULAR set, can be discarded. At this point we
1483 have not seen all the input files, so it is possible that
1484 DEF_REGULAR is not set now but will be set later (it is
1485 never cleared). We account for that possibility below by
98ceb8ce 1486 storing information in the dyn_relocs field of the
30667bf3
AM
1487 hash table entry.
1488
1489 A similar situation to the -Bsymbolic case occurs when
1490 creating shared libraries and symbol visibility changes
1491 render the symbol local.
1492
1493 As it turns out, all the relocs we will be creating here
1494 are absolute, so we cannot remove them on -Bsymbolic
1495 links or visibility changes anyway. A STUB_REL reloc
1496 is absolute too, as in that case it is the reloc in the
1497 stub we will be creating, rather than copying the PCREL
56882138
AM
1498 reloc in the branch.
1499
1500 If on the other hand, we are creating an executable, we
1501 may need to keep relocations for symbols satisfied by a
1502 dynamic library if we manage to avoid copy relocs for the
1503 symbol. */
446f2863
AM
1504 if ((info->shared
1505 && (sec->flags & SEC_ALLOC) != 0
1506 && (IS_ABSOLUTE_RELOC (r_type)
1507 || (h != NULL
1508 && (!info->symbolic
1509 || h->elf.root.type == bfd_link_hash_defweak
1510 || (h->elf.elf_link_hash_flags
1511 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1512 || (!info->shared
1513 && (sec->flags & SEC_ALLOC) != 0
1514 && h != NULL
446f2863
AM
1515 && (h->elf.root.type == bfd_link_hash_defweak
1516 || (h->elf.elf_link_hash_flags
1517 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
30667bf3 1518 {
30667bf3
AM
1519 /* Create a reloc section in dynobj and make room for
1520 this reloc. */
98ceb8ce 1521 if (sreloc == NULL)
30667bf3
AM
1522 {
1523 char *name;
3ac8354b 1524 bfd *dynobj;
30667bf3 1525
98ceb8ce
AM
1526 name = (bfd_elf_string_from_elf_section
1527 (abfd,
1528 elf_elfheader (abfd)->e_shstrndx,
1529 elf_section_data (sec)->rel_hdr.sh_name));
30667bf3
AM
1530 if (name == NULL)
1531 {
1532 (*_bfd_error_handler)
1533 (_("Could not find relocation section for %s"),
1534 sec->name);
1535 bfd_set_error (bfd_error_bad_value);
1536 return false;
1537 }
1538
3ac8354b
AM
1539 if (htab->elf.dynobj == NULL)
1540 htab->elf.dynobj = abfd;
1541
1542 dynobj = htab->elf.dynobj;
98ceb8ce
AM
1543 sreloc = bfd_get_section_by_name (dynobj, name);
1544 if (sreloc == NULL)
30667bf3
AM
1545 {
1546 flagword flags;
1547
98ceb8ce 1548 sreloc = bfd_make_section (dynobj, name);
30667bf3
AM
1549 flags = (SEC_HAS_CONTENTS | SEC_READONLY
1550 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1551 if ((sec->flags & SEC_ALLOC) != 0)
1552 flags |= SEC_ALLOC | SEC_LOAD;
98ceb8ce
AM
1553 if (sreloc == NULL
1554 || !bfd_set_section_flags (dynobj, sreloc, flags)
1555 || !bfd_set_section_alignment (dynobj, sreloc, 2))
30667bf3
AM
1556 return false;
1557 }
30667bf3 1558
98ceb8ce 1559 elf_section_data (sec)->sreloc = sreloc;
30667bf3
AM
1560 }
1561
98ceb8ce
AM
1562 /* If this is a global symbol, we count the number of
1563 relocations we need for this symbol. */
1564 if (h != NULL)
30667bf3 1565 {
98ceb8ce 1566 struct elf32_hppa_dyn_reloc_entry *p;
30667bf3 1567
98ceb8ce
AM
1568 p = h->dyn_relocs;
1569 if (p == NULL || p->sec != sec)
30667bf3 1570 {
98ceb8ce 1571 p = ((struct elf32_hppa_dyn_reloc_entry *)
3ac8354b
AM
1572 bfd_alloc (htab->elf.dynobj,
1573 (bfd_size_type) sizeof *p));
30667bf3 1574 if (p == NULL)
98ceb8ce
AM
1575 return false;
1576 p->next = h->dyn_relocs;
1577 h->dyn_relocs = p;
1578 p->sec = sec;
1579 p->count = 0;
1580#if RELATIVE_DYNRELOCS
1581 p->relative_count = 0;
1582#endif
30667bf3 1583 }
98ceb8ce
AM
1584
1585 p->count += 1;
1586#if RELATIVE_DYNRELOCS
1587 if (!IS_ABSOLUTE_RELOC (rtype))
1588 p->relative_count += 1;
1589#endif
1590 }
1591 else
1592 {
1593 /* Track dynamic relocs needed for local syms too. */
1594 elf_section_data (sec)->local_dynrel += 1;
30667bf3
AM
1595 }
1596 }
1597 }
1598 }
edd21aca
AM
1599
1600 return true;
1601}
1602
30667bf3
AM
1603/* Return the section that should be marked against garbage collection
1604 for a given relocation. */
1605
1606static asection *
1607elf32_hppa_gc_mark_hook (abfd, info, rel, h, sym)
1608 bfd *abfd;
1609 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1610 Elf_Internal_Rela *rel;
1611 struct elf_link_hash_entry *h;
1612 Elf_Internal_Sym *sym;
1613{
1614 if (h != NULL)
1615 {
1616 switch ((unsigned int) ELF32_R_TYPE (rel->r_info))
1617 {
1618 case R_PARISC_GNU_VTINHERIT:
1619 case R_PARISC_GNU_VTENTRY:
1620 break;
1621
1622 default:
1623 switch (h->root.type)
1624 {
1625 case bfd_link_hash_defined:
1626 case bfd_link_hash_defweak:
1627 return h->root.u.def.section;
1628
1629 case bfd_link_hash_common:
1630 return h->root.u.c.p->section;
1631
1632 default:
1633 break;
1634 }
1635 }
1636 }
1637 else
1638 {
1639 if (!(elf_bad_symtab (abfd)
1640 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1641 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1642 && sym->st_shndx != SHN_COMMON))
1643 {
1644 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1645 }
1646 }
1647
1648 return NULL;
1649}
1650
30667bf3
AM
1651/* Update the got and plt entry reference counts for the section being
1652 removed. */
edd21aca
AM
1653
1654static boolean
30667bf3
AM
1655elf32_hppa_gc_sweep_hook (abfd, info, sec, relocs)
1656 bfd *abfd;
1657 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1658 asection *sec;
1659 const Elf_Internal_Rela *relocs;
edd21aca 1660{
30667bf3
AM
1661 Elf_Internal_Shdr *symtab_hdr;
1662 struct elf_link_hash_entry **sym_hashes;
1663 bfd_signed_vma *local_got_refcounts;
74d1c347 1664 bfd_signed_vma *local_plt_refcounts;
30667bf3
AM
1665 const Elf_Internal_Rela *rel, *relend;
1666 unsigned long r_symndx;
1667 struct elf_link_hash_entry *h;
83c81bfe 1668 struct elf32_hppa_link_hash_table *htab;
30667bf3 1669 bfd *dynobj;
30667bf3 1670
98ceb8ce
AM
1671 elf_section_data (sec)->local_dynrel = 0;
1672
30667bf3
AM
1673 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1674 sym_hashes = elf_sym_hashes (abfd);
1675 local_got_refcounts = elf_local_got_refcounts (abfd);
74d1c347
AM
1676 local_plt_refcounts = local_got_refcounts;
1677 if (local_plt_refcounts != NULL)
1678 local_plt_refcounts += symtab_hdr->sh_info;
83c81bfe 1679 htab = hppa_link_hash_table (info);
ebe50bae 1680 dynobj = htab->elf.dynobj;
30667bf3
AM
1681 if (dynobj == NULL)
1682 return true;
1683
30667bf3
AM
1684 relend = relocs + sec->reloc_count;
1685 for (rel = relocs; rel < relend; rel++)
1686 switch ((unsigned int) ELF32_R_TYPE (rel->r_info))
1687 {
1688 case R_PARISC_DLTIND14F:
1689 case R_PARISC_DLTIND14R:
1690 case R_PARISC_DLTIND21L:
1691 r_symndx = ELF32_R_SYM (rel->r_info);
1692 if (r_symndx >= symtab_hdr->sh_info)
1693 {
1694 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1695 if (h->got.refcount > 0)
4dc86686 1696 h->got.refcount -= 1;
30667bf3
AM
1697 }
1698 else if (local_got_refcounts != NULL)
1699 {
1700 if (local_got_refcounts[r_symndx] > 0)
4dc86686 1701 local_got_refcounts[r_symndx] -= 1;
30667bf3
AM
1702 }
1703 break;
edd21aca 1704
30667bf3
AM
1705 case R_PARISC_PCREL12F:
1706 case R_PARISC_PCREL17C:
1707 case R_PARISC_PCREL17F:
1708 case R_PARISC_PCREL22F:
1709 r_symndx = ELF32_R_SYM (rel->r_info);
1710 if (r_symndx >= symtab_hdr->sh_info)
1711 {
1712 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1713 if (h->plt.refcount > 0)
1714 h->plt.refcount -= 1;
1715 }
1716 break;
edd21aca 1717
74d1c347
AM
1718 case R_PARISC_PLABEL14R:
1719 case R_PARISC_PLABEL21L:
1720 case R_PARISC_PLABEL32:
1721 r_symndx = ELF32_R_SYM (rel->r_info);
1722 if (r_symndx >= symtab_hdr->sh_info)
1723 {
98ceb8ce
AM
1724 struct elf32_hppa_link_hash_entry *eh;
1725 struct elf32_hppa_dyn_reloc_entry **pp;
1726 struct elf32_hppa_dyn_reloc_entry *p;
1727
74d1c347 1728 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
98ceb8ce 1729
74d1c347
AM
1730 if (h->plt.refcount > 0)
1731 h->plt.refcount -= 1;
98ceb8ce
AM
1732
1733 eh = (struct elf32_hppa_link_hash_entry *) h;
1734
1735 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1736 if (p->sec == sec)
1737 {
1738#if RELATIVE_DYNRELOCS
1739 if (!IS_ABSOLUTE_RELOC (rtype))
1740 p->relative_count -= 1;
1741#endif
1742 p->count -= 1;
1743 if (p->count == 0)
1744 *pp = p->next;
1745 break;
1746 }
74d1c347
AM
1747 }
1748 else if (local_plt_refcounts != NULL)
1749 {
1750 if (local_plt_refcounts[r_symndx] > 0)
1751 local_plt_refcounts[r_symndx] -= 1;
1752 }
1753 break;
1754
98ceb8ce
AM
1755 case R_PARISC_DIR32:
1756 r_symndx = ELF32_R_SYM (rel->r_info);
1757 if (r_symndx >= symtab_hdr->sh_info)
1758 {
1759 struct elf32_hppa_link_hash_entry *eh;
1760 struct elf32_hppa_dyn_reloc_entry **pp;
1761 struct elf32_hppa_dyn_reloc_entry *p;
1762
1763 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1764
1765 eh = (struct elf32_hppa_link_hash_entry *) h;
1766
1767 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1768 if (p->sec == sec)
1769 {
1770#if RELATIVE_DYNRELOCS
1771 if (!IS_ABSOLUTE_RELOC (R_PARISC_DIR32))
1772 p->relative_count -= 1;
1773#endif
1774 p->count -= 1;
1775 if (p->count == 0)
1776 *pp = p->next;
1777 break;
1778 }
1779 }
1780 break;
1781
30667bf3
AM
1782 default:
1783 break;
1784 }
252b5132 1785
252b5132
RH
1786 return true;
1787}
1788
74d1c347
AM
1789/* Our own version of hide_symbol, so that we can keep plt entries for
1790 plabels. */
1791
1792static void
1793elf32_hppa_hide_symbol (info, h)
1794 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1795 struct elf_link_hash_entry *h;
1796{
5fba655a
L
1797 if ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)
1798 h->dynindx = -1;
74d1c347
AM
1799 if (! ((struct elf32_hppa_link_hash_entry *) h)->plabel)
1800 {
1801 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1802 h->plt.offset = (bfd_vma) -1;
1803 }
1804}
1805
4dc86686
AM
1806/* This is the condition under which elf32_hppa_finish_dynamic_symbol
1807 will be called from elflink.h. If elflink.h doesn't call our
1808 finish_dynamic_symbol routine, we'll need to do something about
1809 initializing any .plt and .got entries in elf32_hppa_relocate_section. */
1810#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1811 ((DYN) \
1812 && ((INFO)->shared \
1813 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1814 && ((H)->dynindx != -1 \
1815 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1816
30667bf3
AM
1817/* Adjust a symbol defined by a dynamic object and referenced by a
1818 regular object. The current definition is in some section of the
1819 dynamic object, but we're not including those sections. We have to
1820 change the definition to something the rest of the link can
1821 understand. */
252b5132 1822
30667bf3
AM
1823static boolean
1824elf32_hppa_adjust_dynamic_symbol (info, h)
1825 struct bfd_link_info *info;
1826 struct elf_link_hash_entry *h;
252b5132 1827{
83c81bfe 1828 struct elf32_hppa_link_hash_table *htab;
ebe50bae
AM
1829 struct elf32_hppa_link_hash_entry *eh;
1830 struct elf32_hppa_dyn_reloc_entry *p;
30667bf3 1831 asection *s;
3ac8354b 1832 unsigned int power_of_two;
30667bf3
AM
1833
1834 /* If this is a function, put it in the procedure linkage table. We
1835 will fill in the contents of the procedure linkage table later,
1836 when we know the address of the .got section. */
1837 if (h->type == STT_FUNC
1838 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1839 {
12cca0d2
AM
1840 if (!info->shared
1841 && h->plt.refcount > 0
1842 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1843 && (h->root.u.def.section->flags & SEC_HAS_GOT_REF) != 0)
1844 {
1845 ((struct elf32_hppa_link_hash_entry *) h)->maybe_pic_call = 1;
1846 }
1847
30667bf3
AM
1848 if (h->plt.refcount <= 0
1849 || ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1850 && h->root.type != bfd_link_hash_defweak
74d1c347 1851 && ! ((struct elf32_hppa_link_hash_entry *) h)->plabel
30667bf3
AM
1852 && (!info->shared || info->symbolic)))
1853 {
1854 /* The .plt entry is not needed when:
1855 a) Garbage collection has removed all references to the
1856 symbol, or
1857 b) We know for certain the symbol is defined in this
74d1c347
AM
1858 object, and it's not a weak definition, nor is the symbol
1859 used by a plabel relocation. Either this object is the
1860 application or we are doing a shared symbolic link. */
1861
1862 /* As a special sop to the hppa ABI, we keep a .plt entry
1863 for functions in sections containing PIC code. */
12cca0d2
AM
1864 if (((struct elf32_hppa_link_hash_entry *) h)->maybe_pic_call)
1865 ((struct elf32_hppa_link_hash_entry *) h)->pic_call = 1;
30667bf3
AM
1866 else
1867 {
1868 h->plt.offset = (bfd_vma) -1;
1869 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
30667bf3 1870 }
30667bf3 1871 }
4dc86686 1872
30667bf3
AM
1873 return true;
1874 }
bbd7ec4a
AM
1875 else
1876 h->plt.offset = (bfd_vma) -1;
edd21aca 1877
30667bf3
AM
1878 /* If this is a weak symbol, and there is a real definition, the
1879 processor independent code will have arranged for us to see the
1880 real definition first, and we can just use the same value. */
1881 if (h->weakdef != NULL)
edd21aca 1882 {
49e9d0d3
AM
1883 if (h->weakdef->root.type != bfd_link_hash_defined
1884 && h->weakdef->root.type != bfd_link_hash_defweak)
1885 abort ();
30667bf3
AM
1886 h->root.u.def.section = h->weakdef->root.u.def.section;
1887 h->root.u.def.value = h->weakdef->root.u.def.value;
0a991dfe 1888 return true;
30667bf3 1889 }
edd21aca 1890
30667bf3
AM
1891 /* This is a reference to a symbol defined by a dynamic object which
1892 is not a function. */
1893
1894 /* If we are creating a shared library, we must presume that the
1895 only references to the symbol are via the global offset table.
1896 For such cases we need not do anything here; the relocations will
1897 be handled correctly by relocate_section. */
1898 if (info->shared)
1899 return true;
1900
1901 /* If there are no references to this symbol that do not use the
1902 GOT, we don't need to generate a copy reloc. */
1903 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1904 return true;
1905
ebe50bae
AM
1906 eh = (struct elf32_hppa_link_hash_entry *) h;
1907 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1908 {
1909 s = p->sec->output_section;
1910 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1911 break;
1912 }
1913
1914 /* If we didn't find any dynamic relocs in read-only sections, then
1915 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1916 if (p == NULL)
1917 {
1918 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1919 return true;
1920 }
1921
30667bf3
AM
1922 /* We must allocate the symbol in our .dynbss section, which will
1923 become part of the .bss section of the executable. There will be
1924 an entry for this symbol in the .dynsym section. The dynamic
1925 object will contain position independent code, so all references
1926 from the dynamic object to this symbol will go through the global
1927 offset table. The dynamic linker will use the .dynsym entry to
1928 determine the address it must put in the global offset table, so
1929 both the dynamic object and the regular object will refer to the
1930 same memory location for the variable. */
1931
3ac8354b 1932 htab = hppa_link_hash_table (info);
30667bf3
AM
1933
1934 /* We must generate a COPY reloc to tell the dynamic linker to
1935 copy the initial value out of the dynamic object and into the
3ac8354b 1936 runtime process image. */
30667bf3
AM
1937 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1938 {
3ac8354b 1939 htab->srelbss->_raw_size += sizeof (Elf32_External_Rela);
30667bf3 1940 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
edd21aca 1941 }
252b5132 1942
3ac8354b
AM
1943 /* We need to figure out the alignment required for this symbol. I
1944 have no idea how other ELF linkers handle this. */
30667bf3 1945
3ac8354b
AM
1946 power_of_two = bfd_log2 (h->size);
1947 if (power_of_two > 3)
1948 power_of_two = 3;
1949
1950 /* Apply the required alignment. */
1951 s = htab->sdynbss;
1952 s->_raw_size = BFD_ALIGN (s->_raw_size,
1953 (bfd_size_type) (1 << power_of_two));
1954 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
1955 {
1956 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
1957 return false;
1958 }
30667bf3 1959
30667bf3
AM
1960 /* Define the symbol as being at this point in the section. */
1961 h->root.u.def.section = s;
1962 h->root.u.def.value = s->_raw_size;
edd21aca 1963
30667bf3
AM
1964 /* Increment the section size to make room for the symbol. */
1965 s->_raw_size += h->size;
252b5132
RH
1966
1967 return true;
1968}
1969
30667bf3
AM
1970/* Called via elf_link_hash_traverse to create .plt entries for an
1971 application that uses statically linked PIC functions. Similar to
1972 the first part of elf32_hppa_adjust_dynamic_symbol. */
252b5132 1973
30667bf3
AM
1974static boolean
1975hppa_handle_PIC_calls (h, inf)
1976 struct elf_link_hash_entry *h;
4dc86686 1977 PTR inf ATTRIBUTE_UNUSED;
252b5132 1978{
30667bf3
AM
1979 if (! (h->plt.refcount > 0
1980 && (h->root.type == bfd_link_hash_defined
1981 || h->root.type == bfd_link_hash_defweak)
1982 && (h->root.u.def.section->flags & SEC_HAS_GOT_REF) != 0))
252b5132 1983 {
30667bf3
AM
1984 h->plt.offset = (bfd_vma) -1;
1985 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1986 return true;
252b5132
RH
1987 }
1988
74d1c347 1989 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
12cca0d2 1990 ((struct elf32_hppa_link_hash_entry *) h)->maybe_pic_call = 1;
30667bf3 1991 ((struct elf32_hppa_link_hash_entry *) h)->pic_call = 1;
edd21aca 1992
4dc86686
AM
1993 return true;
1994}
1995
1996/* Allocate space in .plt, .got and associated reloc sections for
1997 global syms. */
1998
1999static boolean
98ceb8ce 2000allocate_dynrelocs (h, inf)
4dc86686
AM
2001 struct elf_link_hash_entry *h;
2002 PTR inf;
2003{
2004 struct bfd_link_info *info;
83c81bfe 2005 struct elf32_hppa_link_hash_table *htab;
4dc86686 2006 asection *s;
446f2863 2007 struct elf32_hppa_link_hash_entry *eh;
98ceb8ce 2008 struct elf32_hppa_dyn_reloc_entry *p;
4dc86686 2009
73a74a62
AM
2010 if (h->root.type == bfd_link_hash_indirect
2011 || h->root.type == bfd_link_hash_warning)
2012 return true;
2013
30667bf3 2014 info = (struct bfd_link_info *) inf;
83c81bfe 2015 htab = hppa_link_hash_table (info);
ebe50bae 2016 if ((htab->elf.dynamic_sections_created
4dc86686
AM
2017 && h->plt.refcount > 0)
2018 || ((struct elf32_hppa_link_hash_entry *) h)->pic_call)
2019 {
446f2863
AM
2020 /* Make sure this symbol is output as a dynamic symbol.
2021 Undefined weak syms won't yet be marked as dynamic. */
2022 if (h->dynindx == -1
2023 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
2024 && h->type != STT_PARISC_MILLI
2025 && !((struct elf32_hppa_link_hash_entry *) h)->pic_call)
2026 {
2027 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2028 return false;
2029 }
2030
3ac8354b
AM
2031 if (((struct elf32_hppa_link_hash_entry *) h)->pic_call
2032 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
4dc86686 2033 {
3ac8354b
AM
2034 /* Make an entry in the .plt section. */
2035 s = htab->splt;
2036 h->plt.offset = s->_raw_size;
2037 if (PLABEL_PLT_ENTRY_SIZE != PLT_ENTRY_SIZE
2038 && ((struct elf32_hppa_link_hash_entry *) h)->plabel
2039 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2040 {
2041 /* Add some extra space for the dynamic linker to use. */
2042 s->_raw_size += PLABEL_PLT_ENTRY_SIZE;
2043 }
2044 else
2045 s->_raw_size += PLT_ENTRY_SIZE;
2046
2047 if (! ((struct elf32_hppa_link_hash_entry *) h)->pic_call)
2048 {
2049 /* We also need to make an entry in the .rela.plt section. */
2050 htab->srelplt->_raw_size += sizeof (Elf32_External_Rela);
2051 htab->need_plt_stub = 1;
2052 }
4dc86686
AM
2053 }
2054 else
4dc86686 2055 {
3ac8354b
AM
2056 h->plt.offset = (bfd_vma) -1;
2057 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
4dc86686
AM
2058 }
2059 }
2060 else
2061 {
2062 h->plt.offset = (bfd_vma) -1;
2063 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2064 }
edd21aca 2065
4dc86686
AM
2066 if (h->got.refcount > 0)
2067 {
2068 boolean dyn;
2069
446f2863
AM
2070 /* Make sure this symbol is output as a dynamic symbol.
2071 Undefined weak syms won't yet be marked as dynamic. */
2072 if (h->dynindx == -1
2073 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
2074 && h->type != STT_PARISC_MILLI)
2075 {
2076 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2077 return false;
2078 }
2079
83c81bfe 2080 s = htab->sgot;
4dc86686
AM
2081 h->got.offset = s->_raw_size;
2082 s->_raw_size += GOT_ENTRY_SIZE;
ebe50bae 2083 dyn = htab->elf.dynamic_sections_created;
4dc86686 2084 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
83c81bfe 2085 htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
4dc86686
AM
2086 }
2087 else
2088 h->got.offset = (bfd_vma) -1;
30667bf3 2089
446f2863 2090 eh = (struct elf32_hppa_link_hash_entry *) h;
98ceb8ce 2091 if (eh->dyn_relocs == NULL)
446f2863 2092 return true;
30667bf3 2093
98ceb8ce
AM
2094 /* If this is a -Bsymbolic shared link, then we need to discard all
2095 space allocated for dynamic pc-relative relocs against symbols
2096 defined in a regular object. For the normal shared case, discard
2097 space for relocs that have become local due to symbol visibility
2098 changes. */
2099 if (info->shared)
446f2863 2100 {
98ceb8ce
AM
2101#if RELATIVE_DYNRELOCS
2102 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
2103 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2104 || info->symbolic))
446f2863 2105 {
98ceb8ce 2106 struct elf32_hppa_dyn_reloc_entry **pp;
30667bf3 2107
98ceb8ce
AM
2108 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2109 {
2110 p->count -= p->relative_count;
2111 p->relative_count = 0;
2112 if (p->count == 0)
2113 *pp = p->next;
2114 else
2115 pp = &p->next;
2116 }
2117 }
2118#endif
446f2863 2119 }
98ceb8ce 2120 else
30667bf3 2121 {
98ceb8ce
AM
2122 /* For the non-shared case, discard space for relocs against
2123 symbols which turn out to need copy relocs or are not
2124 dynamic. */
2125 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2126 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2127 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
ebe50bae 2128 || (htab->elf.dynamic_sections_created
98ceb8ce
AM
2129 && (h->root.type == bfd_link_hash_undefweak
2130 || h->root.type == bfd_link_hash_undefined))))
2131 {
2132 /* Make sure this symbol is output as a dynamic symbol.
2133 Undefined weak syms won't yet be marked as dynamic. */
2134 if (h->dynindx == -1
2135 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
2136 && h->type != STT_PARISC_MILLI)
2137 {
2138 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2139 return false;
2140 }
2141
2142 /* If that succeeded, we know we'll be keeping all the
2143 relocs. */
2144 if (h->dynindx != -1)
2145 goto keep;
2146 }
446f2863 2147
98ceb8ce
AM
2148 eh->dyn_relocs = NULL;
2149 return true;
2150
2151 keep:
30667bf3 2152 }
30667bf3 2153
98ceb8ce
AM
2154 /* Finally, allocate space. */
2155 for (p = eh->dyn_relocs; p != NULL; p = p->next)
30667bf3 2156 {
98ceb8ce
AM
2157 asection *sreloc = elf_section_data (p->sec)->sreloc;
2158 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rela);
30667bf3 2159 }
30667bf3
AM
2160
2161 return true;
2162}
30667bf3 2163
d5c73c2f
AM
2164/* This function is called via elf_link_hash_traverse to force
2165 millicode symbols local so they do not end up as globals in the
2166 dynamic symbol table. We ought to be able to do this in
2167 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2168 for all dynamic symbols. Arguably, this is a bug in
2169 elf_adjust_dynamic_symbol. */
2170
2171static boolean
2172clobber_millicode_symbols (h, info)
2173 struct elf_link_hash_entry *h;
2174 struct bfd_link_info *info;
2175{
8dea1268
AM
2176 /* We only want to remove these from the dynamic symbol table.
2177 Therefore we do not leave ELF_LINK_FORCED_LOCAL set. */
d5c73c2f 2178 if (h->type == STT_PARISC_MILLI)
e0522e89
AM
2179 {
2180 unsigned short oldflags = h->elf_link_hash_flags;
2181 h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
2182 elf32_hppa_hide_symbol (info, h);
2183 h->elf_link_hash_flags &= ~ELF_LINK_FORCED_LOCAL;
2184 h->elf_link_hash_flags |= oldflags & ELF_LINK_FORCED_LOCAL;
2185 }
d5c73c2f
AM
2186 return true;
2187}
2188
98ceb8ce
AM
2189/* Find any dynamic relocs that apply to read-only sections. */
2190
2191static boolean
2192readonly_dynrelocs (h, inf)
2193 struct elf_link_hash_entry *h;
2194 PTR inf;
2195{
2196 struct elf32_hppa_link_hash_entry *eh;
2197 struct elf32_hppa_dyn_reloc_entry *p;
2198
2199 eh = (struct elf32_hppa_link_hash_entry *) h;
2200 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2201 {
2202 asection *s = p->sec->output_section;
2203
2204 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2205 {
2206 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2207
2208 info->flags |= DF_TEXTREL;
2209
2210 /* Not an error, just cut short the traversal. */
2211 return false;
2212 }
2213 }
2214 return true;
2215}
2216
30667bf3
AM
2217/* Set the sizes of the dynamic sections. */
2218
2219static boolean
2220elf32_hppa_size_dynamic_sections (output_bfd, info)
98ceb8ce 2221 bfd *output_bfd ATTRIBUTE_UNUSED;
30667bf3
AM
2222 struct bfd_link_info *info;
2223{
83c81bfe 2224 struct elf32_hppa_link_hash_table *htab;
30667bf3 2225 bfd *dynobj;
98ceb8ce 2226 bfd *ibfd;
30667bf3
AM
2227 asection *s;
2228 boolean relocs;
30667bf3 2229
83c81bfe 2230 htab = hppa_link_hash_table (info);
ebe50bae 2231 dynobj = htab->elf.dynobj;
49e9d0d3
AM
2232 if (dynobj == NULL)
2233 abort ();
30667bf3 2234
ebe50bae 2235 if (htab->elf.dynamic_sections_created)
30667bf3
AM
2236 {
2237 /* Set the contents of the .interp section to the interpreter. */
2238 if (! info->shared)
2239 {
2240 s = bfd_get_section_by_name (dynobj, ".interp");
49e9d0d3
AM
2241 if (s == NULL)
2242 abort ();
30667bf3
AM
2243 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2244 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2245 }
74d1c347 2246
d5c73c2f 2247 /* Force millicode symbols local. */
ebe50bae 2248 elf_link_hash_traverse (&htab->elf,
d5c73c2f
AM
2249 clobber_millicode_symbols,
2250 info);
68fb2e56
AM
2251 }
2252 else
2253 {
2254 /* Run through the function symbols, looking for any that are
2255 PIC, and allocate space for the necessary .plt entries so
2256 that %r19 will be set up. */
2257 if (! info->shared)
ebe50bae 2258 elf_link_hash_traverse (&htab->elf,
68fb2e56
AM
2259 hppa_handle_PIC_calls,
2260 info);
2261 }
d5c73c2f 2262
98ceb8ce
AM
2263 /* Set up .got and .plt offsets for local syms, and space for local
2264 dynamic relocs. */
2265 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
68fb2e56
AM
2266 {
2267 bfd_signed_vma *local_got;
2268 bfd_signed_vma *end_local_got;
2269 bfd_signed_vma *local_plt;
2270 bfd_signed_vma *end_local_plt;
2271 bfd_size_type locsymcount;
2272 Elf_Internal_Shdr *symtab_hdr;
2273 asection *srel;
74d1c347 2274
98ceb8ce 2275 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
68fb2e56 2276 continue;
4dc86686 2277
98ceb8ce
AM
2278 for (s = ibfd->sections; s != NULL; s = s->next)
2279 {
2280 bfd_size_type count = elf_section_data (s)->local_dynrel;
2281
2282 if (count != 0)
2283 {
2284 srel = elf_section_data (s)->sreloc;
2285 srel->_raw_size += count * sizeof (Elf32_External_Rela);
2286 }
2287 }
2288
2289 local_got = elf_local_got_refcounts (ibfd);
68fb2e56
AM
2290 if (!local_got)
2291 continue;
74d1c347 2292
98ceb8ce 2293 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
68fb2e56
AM
2294 locsymcount = symtab_hdr->sh_info;
2295 end_local_got = local_got + locsymcount;
83c81bfe
AM
2296 s = htab->sgot;
2297 srel = htab->srelgot;
68fb2e56
AM
2298 for (; local_got < end_local_got; ++local_got)
2299 {
2300 if (*local_got > 0)
4dc86686 2301 {
68fb2e56
AM
2302 *local_got = s->_raw_size;
2303 s->_raw_size += GOT_ENTRY_SIZE;
2304 if (info->shared)
2305 srel->_raw_size += sizeof (Elf32_External_Rela);
4dc86686 2306 }
68fb2e56
AM
2307 else
2308 *local_got = (bfd_vma) -1;
2309 }
74d1c347 2310
68fb2e56
AM
2311 local_plt = end_local_got;
2312 end_local_plt = local_plt + locsymcount;
ebe50bae 2313 if (! htab->elf.dynamic_sections_created)
68fb2e56
AM
2314 {
2315 /* Won't be used, but be safe. */
2316 for (; local_plt < end_local_plt; ++local_plt)
2317 *local_plt = (bfd_vma) -1;
2318 }
2319 else
2320 {
83c81bfe
AM
2321 s = htab->splt;
2322 srel = htab->srelplt;
74d1c347
AM
2323 for (; local_plt < end_local_plt; ++local_plt)
2324 {
2325 if (*local_plt > 0)
2326 {
74d1c347
AM
2327 *local_plt = s->_raw_size;
2328 s->_raw_size += PLT_ENTRY_SIZE;
2329 if (info->shared)
4dc86686 2330 srel->_raw_size += sizeof (Elf32_External_Rela);
74d1c347
AM
2331 }
2332 else
2333 *local_plt = (bfd_vma) -1;
2334 }
2335 }
30667bf3 2336 }
30667bf3 2337
98ceb8ce
AM
2338 /* Allocate global sym .plt and .got entries, and space for global
2339 sym dynamic relocs. */
ebe50bae 2340 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
30667bf3
AM
2341
2342 /* The check_relocs and adjust_dynamic_symbol entry points have
2343 determined the sizes of the various dynamic sections. Allocate
2344 memory for them. */
2345 relocs = false;
30667bf3
AM
2346 for (s = dynobj->sections; s != NULL; s = s->next)
2347 {
30667bf3
AM
2348 if ((s->flags & SEC_LINKER_CREATED) == 0)
2349 continue;
2350
83c81bfe 2351 if (s == htab->splt)
68fb2e56 2352 {
83c81bfe 2353 if (htab->need_plt_stub)
68fb2e56
AM
2354 {
2355 /* Make space for the plt stub at the end of the .plt
2356 section. We want this stub right at the end, up
2357 against the .got section. */
83c81bfe 2358 int gotalign = bfd_section_alignment (dynobj, htab->sgot);
68fb2e56
AM
2359 int pltalign = bfd_section_alignment (dynobj, s);
2360 bfd_size_type mask;
30667bf3 2361
68fb2e56
AM
2362 if (gotalign > pltalign)
2363 bfd_set_section_alignment (dynobj, s, gotalign);
2364 mask = ((bfd_size_type) 1 << gotalign) - 1;
2365 s->_raw_size = (s->_raw_size + sizeof (plt_stub) + mask) & ~mask;
2366 }
2367 }
83c81bfe 2368 else if (s == htab->sgot)
68fb2e56
AM
2369 ;
2370 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
30667bf3
AM
2371 {
2372 if (s->_raw_size != 0)
2373 {
30667bf3
AM
2374 /* Remember whether there are any reloc sections other
2375 than .rela.plt. */
83c81bfe 2376 if (s != htab->srelplt)
47d89dba
AM
2377 relocs = true;
2378
30667bf3
AM
2379 /* We use the reloc_count field as a counter if we need
2380 to copy relocs into the output file. */
2381 s->reloc_count = 0;
2382 }
2383 }
30667bf3
AM
2384 else
2385 {
2386 /* It's not one of our sections, so don't allocate space. */
2387 continue;
2388 }
2389
2390 if (s->_raw_size == 0)
2391 {
2392 /* If we don't need this section, strip it from the
2393 output file. This is mostly to handle .rela.bss and
2394 .rela.plt. We must create both sections in
2395 create_dynamic_sections, because they must be created
2396 before the linker maps input sections to output
2397 sections. The linker does that before
2398 adjust_dynamic_symbol is called, and it is that
2399 function which decides whether anything needs to go
2400 into these sections. */
2401 _bfd_strip_section_from_output (info, s);
2402 continue;
2403 }
2404
2405 /* Allocate memory for the section contents. Zero it, because
2406 we may not fill in all the reloc sections. */
2407 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2408 if (s->contents == NULL && s->_raw_size != 0)
2409 return false;
2410 }
2411
ebe50bae 2412 if (htab->elf.dynamic_sections_created)
30667bf3
AM
2413 {
2414 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2415 actually has nothing to do with the PLT, it is how we
2416 communicate the LTP value of a load module to the dynamic
2417 linker. */
dc810e39
AM
2418#define add_dynamic_entry(TAG, VAL) \
2419 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
2420
2421 if (!add_dynamic_entry (DT_PLTGOT, 0))
30667bf3
AM
2422 return false;
2423
2424 /* Add some entries to the .dynamic section. We fill in the
2425 values later, in elf32_hppa_finish_dynamic_sections, but we
2426 must add the entries now so that we get the correct size for
2427 the .dynamic section. The DT_DEBUG entry is filled in by the
2428 dynamic linker and used by the debugger. */
dc810e39 2429 if (!info->shared)
30667bf3 2430 {
dc810e39 2431 if (!add_dynamic_entry (DT_DEBUG, 0))
30667bf3
AM
2432 return false;
2433 }
2434
83c81bfe 2435 if (htab->srelplt->_raw_size != 0)
30667bf3 2436 {
dc810e39
AM
2437 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2438 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2439 || !add_dynamic_entry (DT_JMPREL, 0))
30667bf3
AM
2440 return false;
2441 }
2442
2443 if (relocs)
2444 {
dc810e39
AM
2445 if (!add_dynamic_entry (DT_RELA, 0)
2446 || !add_dynamic_entry (DT_RELASZ, 0)
2447 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
30667bf3 2448 return false;
30667bf3 2449
98ceb8ce
AM
2450 /* If any dynamic relocs apply to a read-only section,
2451 then we need a DT_TEXTREL entry. */
ebe50bae 2452 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, (PTR) info);
98ceb8ce
AM
2453
2454 if ((info->flags & DF_TEXTREL) != 0)
2455 {
2456 if (!add_dynamic_entry (DT_TEXTREL, 0))
2457 return false;
2458 }
30667bf3
AM
2459 }
2460 }
dc810e39 2461#undef add_dynamic_entry
30667bf3
AM
2462
2463 return true;
2464}
2465
30667bf3
AM
2466/* External entry points for sizing and building linker stubs. */
2467
2468/* Determine and set the size of the stub section for a final link.
2469
2470 The basic idea here is to examine all the relocations looking for
2471 PC-relative calls to a target that is unreachable with a "bl"
2472 instruction. */
2473
2474boolean
47d89dba 2475elf32_hppa_size_stubs (output_bfd, stub_bfd, info, multi_subspace, group_size,
30667bf3 2476 add_stub_section, layout_sections_again)
25f72752 2477 bfd *output_bfd;
30667bf3 2478 bfd *stub_bfd;
30667bf3 2479 struct bfd_link_info *info;
25f72752 2480 boolean multi_subspace;
47d89dba 2481 bfd_signed_vma group_size;
30667bf3
AM
2482 asection * (*add_stub_section) PARAMS ((const char *, asection *));
2483 void (*layout_sections_again) PARAMS ((void));
2484{
2485 bfd *input_bfd;
2486 asection *section;
25f72752 2487 asection **input_list, **list;
30667bf3 2488 Elf_Internal_Sym *local_syms, **all_local_syms;
25f72752
AM
2489 unsigned int bfd_indx, bfd_count;
2490 int top_id, top_index;
83c81bfe 2491 struct elf32_hppa_link_hash_table *htab;
47d89dba
AM
2492 bfd_size_type stub_group_size;
2493 boolean stubs_always_before_branch;
30667bf3 2494 boolean stub_changed = 0;
25f72752 2495 boolean ret = 0;
dc810e39 2496 bfd_size_type amt;
30667bf3 2497
83c81bfe 2498 htab = hppa_link_hash_table (info);
30667bf3
AM
2499
2500 /* Stash our params away. */
83c81bfe
AM
2501 htab->stub_bfd = stub_bfd;
2502 htab->multi_subspace = multi_subspace;
2503 htab->add_stub_section = add_stub_section;
2504 htab->layout_sections_again = layout_sections_again;
47d89dba
AM
2505 stubs_always_before_branch = group_size < 0;
2506 if (group_size < 0)
2507 stub_group_size = -group_size;
2508 else
2509 stub_group_size = group_size;
2510 if (stub_group_size == 1)
2511 {
2512 /* Default values. */
2513 stub_group_size = 8000000;
83c81bfe 2514 if (htab->has_17bit_branch || htab->multi_subspace)
47d89dba 2515 stub_group_size = 250000;
83c81bfe 2516 if (htab->has_12bit_branch)
47d89dba
AM
2517 stub_group_size = 7812;
2518 }
30667bf3 2519
1badb539
AM
2520 /* Count the number of input BFDs and find the top input section id. */
2521 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
30667bf3
AM
2522 input_bfd != NULL;
2523 input_bfd = input_bfd->link_next)
2524 {
2525 bfd_count += 1;
25f72752
AM
2526 for (section = input_bfd->sections;
2527 section != NULL;
2528 section = section->next)
2529 {
2530 if (top_id < section->id)
2531 top_id = section->id;
2532 }
30667bf3
AM
2533 }
2534
dc810e39 2535 amt = sizeof (struct map_stub) * (top_id + 1);
83c81bfe
AM
2536 htab->stub_group = (struct map_stub *) bfd_zmalloc (amt);
2537 if (htab->stub_group == NULL)
30667bf3
AM
2538 return false;
2539
1badb539
AM
2540 /* Make a list of input sections for each output section included in
2541 the link.
2542
2543 We can't use output_bfd->section_count here to find the top output
2544 section index as some sections may have been removed, and
2545 _bfd_strip_section_from_output doesn't renumber the indices. */
2546 for (section = output_bfd->sections, top_index = 0;
2547 section != NULL;
2548 section = section->next)
2549 {
2550 if (top_index < section->index)
2551 top_index = section->index;
2552 }
2553
dc810e39
AM
2554 amt = sizeof (asection *) * (top_index + 1);
2555 input_list = (asection **) bfd_malloc (amt);
25f72752
AM
2556 if (input_list == NULL)
2557 return false;
2558
1badb539
AM
2559 /* For sections we aren't interested in, mark their entries with a
2560 value we can check later. */
2561 list = input_list + top_index;
2562 do
2563 *list = bfd_abs_section_ptr;
2564 while (list-- != input_list);
2565
2566 for (section = output_bfd->sections;
2567 section != NULL;
2568 section = section->next)
2569 {
47d89dba 2570 if ((section->flags & SEC_CODE) != 0)
1badb539
AM
2571 input_list[section->index] = NULL;
2572 }
2573
2574 /* Now actually build the lists. */
25f72752
AM
2575 for (input_bfd = info->input_bfds;
2576 input_bfd != NULL;
2577 input_bfd = input_bfd->link_next)
2578 {
2579 for (section = input_bfd->sections;
2580 section != NULL;
2581 section = section->next)
2582 {
2583 if (section->output_section != NULL
1badb539
AM
2584 && section->output_section->owner == output_bfd
2585 && section->output_section->index <= top_index)
25f72752
AM
2586 {
2587 list = input_list + section->output_section->index;
1badb539
AM
2588 if (*list != bfd_abs_section_ptr)
2589 {
2590 /* Steal the link_sec pointer for our list. */
83c81bfe 2591#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
1badb539
AM
2592 /* This happens to make the list in reverse order,
2593 which is what we want. */
2594 PREV_SEC (section) = *list;
2595 *list = section;
2596 }
25f72752
AM
2597 }
2598 }
2599 }
2600
2601 /* See whether we can group stub sections together. Grouping stub
2602 sections may result in fewer stubs. More importantly, we need to
2603 put all .init* and .fini* stubs at the beginning of the .init or
2604 .fini output sections respectively, because glibc splits the
2605 _init and _fini functions into multiple parts. Putting a stub in
2606 the middle of a function is not a good idea. */
a017a724 2607 list = input_list + top_index;
1badb539 2608 do
25f72752
AM
2609 {
2610 asection *tail = *list;
1badb539
AM
2611 if (tail == bfd_abs_section_ptr)
2612 continue;
25f72752
AM
2613 while (tail != NULL)
2614 {
2615 asection *curr;
2616 asection *prev;
2617 bfd_size_type total;
2618
2619 curr = tail;
2620 if (tail->_cooked_size)
2621 total = tail->_cooked_size;
2622 else
2623 total = tail->_raw_size;
2624 while ((prev = PREV_SEC (curr)) != NULL
2625 && ((total += curr->output_offset - prev->output_offset)
47d89dba 2626 < stub_group_size))
25f72752
AM
2627 curr = prev;
2628
2629 /* OK, the size from the start of CURR to the end is less
2630 than 250000 bytes and thus can be handled by one stub
2631 section. (or the tail section is itself larger than
2632 250000 bytes, in which case we may be toast.)
2633 We should really be keeping track of the total size of
2634 stubs added here, as stubs contribute to the final output
2635 section size. That's a little tricky, and this way will
2636 only break if stubs added total more than 12144 bytes, or
2637 1518 long branch stubs. It seems unlikely for more than
2638 1518 different functions to be called, especially from
2639 code only 250000 bytes long. */
2640 do
2641 {
2642 prev = PREV_SEC (tail);
2643 /* Set up this stub group. */
83c81bfe 2644 htab->stub_group[tail->id].link_sec = curr;
25f72752
AM
2645 }
2646 while (tail != curr && (tail = prev) != NULL);
2647
2648 /* But wait, there's more! Input sections up to 250000
2649 bytes before the stub section can be handled by it too. */
47d89dba 2650 if (!stubs_always_before_branch)
25f72752 2651 {
47d89dba
AM
2652 total = 0;
2653 while (prev != NULL
2654 && ((total += tail->output_offset - prev->output_offset)
2655 < stub_group_size))
2656 {
2657 tail = prev;
2658 prev = PREV_SEC (tail);
83c81bfe 2659 htab->stub_group[tail->id].link_sec = curr;
47d89dba 2660 }
25f72752
AM
2661 }
2662 tail = prev;
2663 }
2664 }
1badb539 2665 while (list-- != input_list);
25f72752 2666 free (input_list);
1badb539 2667#undef PREV_SEC
30667bf3
AM
2668
2669 /* We want to read in symbol extension records only once. To do this
2670 we need to read in the local symbols in parallel and save them for
2671 later use; so hold pointers to the local symbols in an array. */
dc810e39
AM
2672 amt = sizeof (Elf_Internal_Sym *) * bfd_count;
2673 all_local_syms = (Elf_Internal_Sym **) bfd_zmalloc (amt);
30667bf3 2674 if (all_local_syms == NULL)
25f72752 2675 return false;
30667bf3
AM
2676
2677 /* Walk over all the input BFDs, swapping in local symbols.
2678 If we are creating a shared library, create hash entries for the
2679 export stubs. */
25f72752 2680 for (input_bfd = info->input_bfds, bfd_indx = 0;
30667bf3 2681 input_bfd != NULL;
25f72752 2682 input_bfd = input_bfd->link_next, bfd_indx++)
30667bf3
AM
2683 {
2684 Elf_Internal_Shdr *symtab_hdr;
2685 Elf_Internal_Sym *isym;
25f72752 2686 Elf32_External_Sym *ext_syms, *esym, *end_sy;
dc810e39 2687 bfd_size_type sec_size;
edd21aca 2688
252b5132
RH
2689 /* We'll need the symbol table in a second. */
2690 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2691 if (symtab_hdr->sh_info == 0)
2692 continue;
2693
edd21aca
AM
2694 /* We need an array of the local symbols attached to the input bfd.
2695 Unfortunately, we're going to have to read & swap them in. */
dc810e39
AM
2696 sec_size = symtab_hdr->sh_info;
2697 sec_size *= sizeof (Elf_Internal_Sym);
2698 local_syms = (Elf_Internal_Sym *) bfd_malloc (sec_size);
edd21aca
AM
2699 if (local_syms == NULL)
2700 {
2701 goto error_ret_free_local;
2702 }
25f72752 2703 all_local_syms[bfd_indx] = local_syms;
dc810e39
AM
2704 sec_size = symtab_hdr->sh_info;
2705 sec_size *= sizeof (Elf32_External_Sym);
2706 ext_syms = (Elf32_External_Sym *) bfd_malloc (sec_size);
edd21aca
AM
2707 if (ext_syms == NULL)
2708 {
2709 goto error_ret_free_local;
2710 }
2711
2712 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
dc810e39 2713 || (bfd_bread (ext_syms, sec_size, input_bfd) != sec_size))
edd21aca
AM
2714 {
2715 free (ext_syms);
2716 goto error_ret_free_local;
2717 }
2718
2719 /* Swap the local symbols in. */
2720 isym = local_syms;
2721 esym = ext_syms;
25f72752 2722 for (end_sy = esym + symtab_hdr->sh_info; esym < end_sy; esym++, isym++)
edd21aca
AM
2723 bfd_elf32_swap_symbol_in (input_bfd, esym, isym);
2724
2725 /* Now we can free the external symbols. */
2726 free (ext_syms);
edd21aca 2727
83c81bfe 2728 if (info->shared && htab->multi_subspace)
30667bf3 2729 {
25f72752
AM
2730 struct elf_link_hash_entry **sym_hashes;
2731 struct elf_link_hash_entry **end_hashes;
30667bf3
AM
2732 unsigned int symcount;
2733
2734 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2735 - symtab_hdr->sh_info);
25f72752
AM
2736 sym_hashes = elf_sym_hashes (input_bfd);
2737 end_hashes = sym_hashes + symcount;
30667bf3
AM
2738
2739 /* Look through the global syms for functions; We need to
2740 build export stubs for all globally visible functions. */
25f72752 2741 for (; sym_hashes < end_hashes; sym_hashes++)
30667bf3
AM
2742 {
2743 struct elf32_hppa_link_hash_entry *hash;
2744
25f72752 2745 hash = (struct elf32_hppa_link_hash_entry *) *sym_hashes;
30667bf3
AM
2746
2747 while (hash->elf.root.type == bfd_link_hash_indirect
2748 || hash->elf.root.type == bfd_link_hash_warning)
2749 hash = ((struct elf32_hppa_link_hash_entry *)
2750 hash->elf.root.u.i.link);
2751
2752 /* At this point in the link, undefined syms have been
2753 resolved, so we need to check that the symbol was
2754 defined in this BFD. */
2755 if ((hash->elf.root.type == bfd_link_hash_defined
2756 || hash->elf.root.type == bfd_link_hash_defweak)
2757 && hash->elf.type == STT_FUNC
2758 && hash->elf.root.u.def.section->output_section != NULL
25f72752
AM
2759 && (hash->elf.root.u.def.section->output_section->owner
2760 == output_bfd)
30667bf3
AM
2761 && hash->elf.root.u.def.section->owner == input_bfd
2762 && (hash->elf.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
2763 && !(hash->elf.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)
2764 && ELF_ST_VISIBILITY (hash->elf.other) == STV_DEFAULT)
2765 {
2766 asection *sec;
2767 const char *stub_name;
2768 struct elf32_hppa_stub_hash_entry *stub_entry;
2769
2770 sec = hash->elf.root.u.def.section;
2771 stub_name = hash->elf.root.root.string;
83c81bfe 2772 stub_entry = hppa_stub_hash_lookup (&htab->stub_hash_table,
30667bf3
AM
2773 stub_name,
2774 false, false);
2775 if (stub_entry == NULL)
2776 {
83c81bfe 2777 stub_entry = hppa_add_stub (stub_name, sec, htab);
30667bf3
AM
2778 if (!stub_entry)
2779 goto error_ret_free_local;
2780
2781 stub_entry->target_value = hash->elf.root.u.def.value;
2782 stub_entry->target_section = hash->elf.root.u.def.section;
2783 stub_entry->stub_type = hppa_stub_export;
2784 stub_entry->h = hash;
2785 stub_changed = 1;
2786 }
2787 else
2788 {
2789 (*_bfd_error_handler) (_("%s: duplicate export stub %s"),
8f615d07
AM
2790 bfd_archive_filename (input_bfd),
2791 stub_name);
30667bf3
AM
2792 }
2793 }
2794 }
30667bf3
AM
2795 }
2796 }
edd21aca
AM
2797
2798 while (1)
2799 {
30667bf3
AM
2800 asection *stub_sec;
2801
25f72752 2802 for (input_bfd = info->input_bfds, bfd_indx = 0;
30667bf3 2803 input_bfd != NULL;
25f72752 2804 input_bfd = input_bfd->link_next, bfd_indx++)
30667bf3
AM
2805 {
2806 Elf_Internal_Shdr *symtab_hdr;
2807
2808 /* We'll need the symbol table in a second. */
2809 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2810 if (symtab_hdr->sh_info == 0)
2811 continue;
2812
25f72752 2813 local_syms = all_local_syms[bfd_indx];
30667bf3
AM
2814
2815 /* Walk over each section attached to the input bfd. */
2816 for (section = input_bfd->sections;
2817 section != NULL;
25f72752 2818 section = section->next)
30667bf3
AM
2819 {
2820 Elf_Internal_Shdr *input_rel_hdr;
2821 Elf32_External_Rela *external_relocs, *erelaend, *erela;
2822 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2823
2824 /* If there aren't any relocs, then there's nothing more
2825 to do. */
2826 if ((section->flags & SEC_RELOC) == 0
2827 || section->reloc_count == 0)
2828 continue;
2829
25f72752
AM
2830 /* If this section is a link-once section that will be
2831 discarded, then don't create any stubs. */
2832 if (section->output_section == NULL
2833 || section->output_section->owner != output_bfd)
2834 continue;
2835
30667bf3 2836 /* Allocate space for the external relocations. */
dc810e39
AM
2837 amt = section->reloc_count;
2838 amt *= sizeof (Elf32_External_Rela);
2839 external_relocs = (Elf32_External_Rela *) bfd_malloc (amt);
30667bf3
AM
2840 if (external_relocs == NULL)
2841 {
2842 goto error_ret_free_local;
2843 }
2844
2845 /* Likewise for the internal relocations. */
dc810e39
AM
2846 amt = section->reloc_count;
2847 amt *= sizeof (Elf_Internal_Rela);
2848 internal_relocs = (Elf_Internal_Rela *) bfd_malloc (amt);
30667bf3
AM
2849 if (internal_relocs == NULL)
2850 {
2851 free (external_relocs);
2852 goto error_ret_free_local;
2853 }
2854
2855 /* Read in the external relocs. */
2856 input_rel_hdr = &elf_section_data (section)->rel_hdr;
2857 if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0
dc810e39 2858 || bfd_bread (external_relocs,
30667bf3
AM
2859 input_rel_hdr->sh_size,
2860 input_bfd) != input_rel_hdr->sh_size)
2861 {
2862 free (external_relocs);
2863 error_ret_free_internal:
2864 free (internal_relocs);
2865 goto error_ret_free_local;
2866 }
2867
2868 /* Swap in the relocs. */
2869 erela = external_relocs;
2870 erelaend = erela + section->reloc_count;
2871 irela = internal_relocs;
2872 for (; erela < erelaend; erela++, irela++)
2873 bfd_elf32_swap_reloca_in (input_bfd, erela, irela);
2874
2875 /* We're done with the external relocs, free them. */
2876 free (external_relocs);
2877
2878 /* Now examine each relocation. */
2879 irela = internal_relocs;
2880 irelaend = irela + section->reloc_count;
2881 for (; irela < irelaend; irela++)
2882 {
2883 unsigned int r_type, r_indx;
2884 enum elf32_hppa_stub_type stub_type;
2885 struct elf32_hppa_stub_hash_entry *stub_entry;
2886 asection *sym_sec;
2887 bfd_vma sym_value;
2888 bfd_vma destination;
2889 struct elf32_hppa_link_hash_entry *hash;
2890 char *stub_name;
25f72752 2891 const asection *id_sec;
30667bf3
AM
2892
2893 r_type = ELF32_R_TYPE (irela->r_info);
2894 r_indx = ELF32_R_SYM (irela->r_info);
2895
2896 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2897 {
2898 bfd_set_error (bfd_error_bad_value);
2899 goto error_ret_free_internal;
2900 }
2901
2902 /* Only look for stubs on call instructions. */
2903 if (r_type != (unsigned int) R_PARISC_PCREL12F
2904 && r_type != (unsigned int) R_PARISC_PCREL17F
2905 && r_type != (unsigned int) R_PARISC_PCREL22F)
2906 continue;
2907
2908 /* Now determine the call target, its name, value,
2909 section. */
2910 sym_sec = NULL;
2911 sym_value = 0;
2912 destination = 0;
2913 hash = NULL;
2914 if (r_indx < symtab_hdr->sh_info)
2915 {
2916 /* It's a local symbol. */
2917 Elf_Internal_Sym *sym;
2918 Elf_Internal_Shdr *hdr;
2919
2920 sym = local_syms + r_indx;
2921 hdr = elf_elfsections (input_bfd)[sym->st_shndx];
2922 sym_sec = hdr->bfd_section;
2923 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2924 sym_value = sym->st_value;
2925 destination = (sym_value + irela->r_addend
2926 + sym_sec->output_offset
2927 + sym_sec->output_section->vma);
2928 }
2929 else
2930 {
2931 /* It's an external symbol. */
2932 int e_indx;
2933
2934 e_indx = r_indx - symtab_hdr->sh_info;
2935 hash = ((struct elf32_hppa_link_hash_entry *)
2936 elf_sym_hashes (input_bfd)[e_indx]);
2937
2938 while (hash->elf.root.type == bfd_link_hash_indirect
2939 || hash->elf.root.type == bfd_link_hash_warning)
2940 hash = ((struct elf32_hppa_link_hash_entry *)
2941 hash->elf.root.u.i.link);
2942
2943 if (hash->elf.root.type == bfd_link_hash_defined
2944 || hash->elf.root.type == bfd_link_hash_defweak)
2945 {
2946 sym_sec = hash->elf.root.u.def.section;
2947 sym_value = hash->elf.root.u.def.value;
2948 if (sym_sec->output_section != NULL)
2949 destination = (sym_value + irela->r_addend
2950 + sym_sec->output_offset
2951 + sym_sec->output_section->vma);
2952 }
2953 else if (hash->elf.root.type == bfd_link_hash_undefweak)
2954 {
2955 if (! info->shared)
2956 continue;
2957 }
2958 else if (hash->elf.root.type == bfd_link_hash_undefined)
2959 {
2960 if (! (info->shared
2961 && !info->no_undefined
2962 && (ELF_ST_VISIBILITY (hash->elf.other)
2963 == STV_DEFAULT)))
2964 continue;
2965 }
2966 else
2967 {
2968 bfd_set_error (bfd_error_bad_value);
2969 goto error_ret_free_internal;
2970 }
2971 }
2972
2973 /* Determine what (if any) linker stub is needed. */
2974 stub_type = hppa_type_of_stub (section, irela, hash,
2975 destination);
2976 if (stub_type == hppa_stub_none)
2977 continue;
2978
25f72752 2979 /* Support for grouping stub sections. */
83c81bfe 2980 id_sec = htab->stub_group[section->id].link_sec;
25f72752 2981
30667bf3 2982 /* Get the name of this stub. */
25f72752 2983 stub_name = hppa_stub_name (id_sec, sym_sec, hash, irela);
30667bf3
AM
2984 if (!stub_name)
2985 goto error_ret_free_internal;
2986
83c81bfe 2987 stub_entry = hppa_stub_hash_lookup (&htab->stub_hash_table,
30667bf3
AM
2988 stub_name,
2989 false, false);
2990 if (stub_entry != NULL)
2991 {
2992 /* The proper stub has already been created. */
2993 free (stub_name);
2994 continue;
2995 }
2996
83c81bfe 2997 stub_entry = hppa_add_stub (stub_name, section, htab);
30667bf3
AM
2998 if (stub_entry == NULL)
2999 {
3000 free (stub_name);
3001 goto error_ret_free_local;
3002 }
3003
3004 stub_entry->target_value = sym_value;
3005 stub_entry->target_section = sym_sec;
3006 stub_entry->stub_type = stub_type;
3007 if (info->shared)
3008 {
3009 if (stub_type == hppa_stub_import)
3010 stub_entry->stub_type = hppa_stub_import_shared;
98ceb8ce 3011 else if (stub_type == hppa_stub_long_branch)
30667bf3
AM
3012 stub_entry->stub_type = hppa_stub_long_branch_shared;
3013 }
3014 stub_entry->h = hash;
3015 stub_changed = 1;
3016 }
3017
3018 /* We're done with the internal relocs, free them. */
3019 free (internal_relocs);
3020 }
3021 }
3022
3023 if (!stub_changed)
3024 break;
3025
3026 /* OK, we've added some stubs. Find out the new size of the
3027 stub sections. */
83c81bfe 3028 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
3029 stub_sec != NULL;
3030 stub_sec = stub_sec->next)
3031 {
74d1c347
AM
3032 stub_sec->_raw_size = 0;
3033 stub_sec->_cooked_size = 0;
3034 }
74d1c347 3035
83c81bfe 3036 bfd_hash_traverse (&htab->stub_hash_table, hppa_size_one_stub, htab);
74d1c347 3037
30667bf3 3038 /* Ask the linker to do its stuff. */
83c81bfe 3039 (*htab->layout_sections_again) ();
30667bf3
AM
3040 stub_changed = 0;
3041 }
3042
25f72752 3043 ret = 1;
30667bf3
AM
3044
3045 error_ret_free_local:
25f72752
AM
3046 while (bfd_count-- > 0)
3047 if (all_local_syms[bfd_count])
3048 free (all_local_syms[bfd_count]);
30667bf3
AM
3049 free (all_local_syms);
3050
25f72752 3051 return ret;
30667bf3
AM
3052}
3053
30667bf3
AM
3054/* For a final link, this function is called after we have sized the
3055 stubs to provide a value for __gp. */
3056
3057boolean
3058elf32_hppa_set_gp (abfd, info)
3059 bfd *abfd;
3060 struct bfd_link_info *info;
3061{
83c81bfe 3062 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
3063 struct elf_link_hash_entry *h;
3064 asection *sec;
3065 bfd_vma gp_val;
3066
83c81bfe 3067 htab = hppa_link_hash_table (info);
ebe50bae 3068 h = elf_link_hash_lookup (&htab->elf, "$global$", false, false, false);
30667bf3 3069
df8634e3
AM
3070 if (h != NULL
3071 && (h->root.type == bfd_link_hash_defined
3072 || h->root.type == bfd_link_hash_defweak))
30667bf3
AM
3073 {
3074 gp_val = h->root.u.def.value;
3075 sec = h->root.u.def.section;
3076 }
3077 else
3078 {
74d1c347
AM
3079 /* Choose to point our LTP at, in this order, one of .plt, .got,
3080 or .data, if these sections exist. In the case of choosing
3081 .plt try to make the LTP ideal for addressing anywhere in the
3082 .plt or .got with a 14 bit signed offset. Typically, the end
3083 of the .plt is the start of the .got, so choose .plt + 0x2000
3084 if either the .plt or .got is larger than 0x2000. If both
3085 the .plt and .got are smaller than 0x2000, choose the end of
3086 the .plt section. */
3087
83c81bfe 3088 sec = htab->splt;
74d1c347 3089 if (sec != NULL)
30667bf3 3090 {
74d1c347
AM
3091 gp_val = sec->_raw_size;
3092 if (gp_val > 0x2000
83c81bfe 3093 || (htab->sgot && htab->sgot->_raw_size > 0x2000))
74d1c347
AM
3094 {
3095 gp_val = 0x2000;
3096 }
3097 }
3098 else
3099 {
3100 gp_val = 0;
83c81bfe 3101 sec = htab->sgot;
74d1c347
AM
3102 if (sec != NULL)
3103 {
3104 /* We know we don't have a .plt. If .got is large,
3105 offset our LTP. */
3106 if (sec->_raw_size > 0x2000)
3107 gp_val = 0x2000;
3108 }
3109 else
3110 {
3111 /* No .plt or .got. Who cares what the LTP is? */
3112 sec = bfd_get_section_by_name (abfd, ".data");
3113 }
30667bf3 3114 }
df8634e3
AM
3115
3116 if (h != NULL)
3117 {
3118 h->root.type = bfd_link_hash_defined;
3119 h->root.u.def.value = gp_val;
3120 if (sec != NULL)
3121 h->root.u.def.section = sec;
3122 else
3123 h->root.u.def.section = bfd_abs_section_ptr;
3124 }
30667bf3
AM
3125 }
3126
b32b5d6e 3127 if (sec != NULL && sec->output_section != NULL)
74d1c347
AM
3128 gp_val += sec->output_section->vma + sec->output_offset;
3129
3130 elf_gp (abfd) = gp_val;
30667bf3
AM
3131 return true;
3132}
3133
30667bf3
AM
3134/* Build all the stubs associated with the current output file. The
3135 stubs are kept in a hash table attached to the main linker hash
3136 table. We also set up the .plt entries for statically linked PIC
3137 functions here. This function is called via hppaelf_finish in the
3138 linker. */
3139
3140boolean
3141elf32_hppa_build_stubs (info)
3142 struct bfd_link_info *info;
3143{
3144 asection *stub_sec;
3145 struct bfd_hash_table *table;
83c81bfe 3146 struct elf32_hppa_link_hash_table *htab;
30667bf3 3147
83c81bfe 3148 htab = hppa_link_hash_table (info);
30667bf3 3149
83c81bfe 3150 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
3151 stub_sec != NULL;
3152 stub_sec = stub_sec->next)
3153 {
dc810e39 3154 bfd_size_type size;
30667bf3
AM
3155
3156 /* Allocate memory to hold the linker stubs. */
74d1c347 3157 size = stub_sec->_raw_size;
83c81bfe 3158 stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size);
30667bf3
AM
3159 if (stub_sec->contents == NULL && size != 0)
3160 return false;
74d1c347 3161 stub_sec->_raw_size = 0;
30667bf3
AM
3162 }
3163
3164 /* Build the stubs as directed by the stub hash table. */
83c81bfe 3165 table = &htab->stub_hash_table;
30667bf3
AM
3166 bfd_hash_traverse (table, hppa_build_one_stub, info);
3167
3168 return true;
3169}
3170
c46b7515
AM
3171/* Perform a final link. */
3172
3173static boolean
3174elf32_hppa_final_link (abfd, info)
3175 bfd *abfd;
3176 struct bfd_link_info *info;
3177{
3178 asection *s;
3179
4dc86686
AM
3180 /* Invoke the regular ELF linker to do all the work. */
3181 if (!bfd_elf32_bfd_final_link (abfd, info))
c46b7515
AM
3182 return false;
3183
3184 /* If we're producing a final executable, sort the contents of the
3185 unwind section. Magic section names, but this is much safer than
3186 having elf32_hppa_relocate_section remember where SEGREL32 relocs
3187 occurred. Consider what happens if someone inept creates a
3188 linker script that puts unwind information in .text. */
3189 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
3190 if (s != NULL)
3191 {
3192 bfd_size_type size;
3193 char *contents;
3194
3195 size = s->_raw_size;
3196 contents = bfd_malloc (size);
3197 if (contents == NULL)
3198 return false;
3199
3200 if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
3201 return false;
3202
dc810e39 3203 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
c46b7515
AM
3204
3205 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
3206 return false;
3207 }
3208 return true;
3209}
3210
3211/* Record the lowest address for the data and text segments. */
3212
3213static void
3214hppa_record_segment_addr (abfd, section, data)
3215 bfd *abfd ATTRIBUTE_UNUSED;
3216 asection *section;
3217 PTR data;
3218{
83c81bfe 3219 struct elf32_hppa_link_hash_table *htab;
c46b7515 3220
83c81bfe 3221 htab = (struct elf32_hppa_link_hash_table *) data;
c46b7515
AM
3222
3223 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3224 {
3225 bfd_vma value = section->vma - section->filepos;
3226
3227 if ((section->flags & SEC_READONLY) != 0)
3228 {
83c81bfe
AM
3229 if (value < htab->text_segment_base)
3230 htab->text_segment_base = value;
c46b7515
AM
3231 }
3232 else
3233 {
83c81bfe
AM
3234 if (value < htab->data_segment_base)
3235 htab->data_segment_base = value;
c46b7515
AM
3236 }
3237 }
3238}
3239
30667bf3
AM
3240/* Perform a relocation as part of a final link. */
3241
3242static bfd_reloc_status_type
83c81bfe 3243final_link_relocate (input_section, contents, rel, value, htab, sym_sec, h)
30667bf3
AM
3244 asection *input_section;
3245 bfd_byte *contents;
3246 const Elf_Internal_Rela *rel;
3247 bfd_vma value;
83c81bfe 3248 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
3249 asection *sym_sec;
3250 struct elf32_hppa_link_hash_entry *h;
3251{
3252 int insn;
3253 unsigned int r_type = ELF32_R_TYPE (rel->r_info);
3254 reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3255 int r_format = howto->bitsize;
3256 enum hppa_reloc_field_selector_type_alt r_field;
3257 bfd *input_bfd = input_section->owner;
3258 bfd_vma offset = rel->r_offset;
3259 bfd_vma max_branch_offset = 0;
3260 bfd_byte *hit_data = contents + offset;
3261 bfd_signed_vma addend = rel->r_addend;
3262 bfd_vma location;
3263 struct elf32_hppa_stub_hash_entry *stub_entry = NULL;
3264 int val;
3265
3266 if (r_type == R_PARISC_NONE)
3267 return bfd_reloc_ok;
3268
3269 insn = bfd_get_32 (input_bfd, hit_data);
3270
3271 /* Find out where we are and where we're going. */
3272 location = (offset +
3273 input_section->output_offset +
3274 input_section->output_section->vma);
3275
3276 switch (r_type)
3277 {
3278 case R_PARISC_PCREL12F:
3279 case R_PARISC_PCREL17F:
3280 case R_PARISC_PCREL22F:
3281 /* If this is a call to a function defined in another dynamic
3282 library, or if it is a call to a PIC function in the same
74d1c347
AM
3283 object, or if this is a shared link and it is a call to a
3284 weak symbol which may or may not be in the same object, then
3285 find the import stub in the stub hash. */
30667bf3
AM
3286 if (sym_sec == NULL
3287 || sym_sec->output_section == NULL
12cca0d2
AM
3288 || (h != NULL
3289 && ((h->maybe_pic_call
3290 && !(input_section->flags & SEC_HAS_GOT_REF))
3291 || (h->elf.root.type == bfd_link_hash_defweak
3292 && h->elf.dynindx != -1
3293 && h->elf.plt.offset != (bfd_vma) -1))))
30667bf3
AM
3294 {
3295 stub_entry = hppa_get_stub_entry (input_section, sym_sec,
83c81bfe 3296 h, rel, htab);
30667bf3
AM
3297 if (stub_entry != NULL)
3298 {
3299 value = (stub_entry->stub_offset
3300 + stub_entry->stub_sec->output_offset
3301 + stub_entry->stub_sec->output_section->vma);
3302 addend = 0;
3303 }
3304 else if (sym_sec == NULL && h != NULL
3305 && h->elf.root.type == bfd_link_hash_undefweak)
3306 {
db20fd76
AM
3307 /* It's OK if undefined weak. Calls to undefined weak
3308 symbols behave as if the "called" function
3309 immediately returns. We can thus call to a weak
3310 function without first checking whether the function
3311 is defined. */
30667bf3 3312 value = location;
db20fd76 3313 addend = 8;
30667bf3
AM
3314 }
3315 else
3316 return bfd_reloc_notsupported;
3317 }
3318 /* Fall thru. */
3319
3320 case R_PARISC_PCREL21L:
3321 case R_PARISC_PCREL17C:
3322 case R_PARISC_PCREL17R:
3323 case R_PARISC_PCREL14R:
3324 case R_PARISC_PCREL14F:
3325 /* Make it a pc relative offset. */
3326 value -= location;
3327 addend -= 8;
3328 break;
3329
3330 case R_PARISC_DPREL21L:
3331 case R_PARISC_DPREL14R:
3332 case R_PARISC_DPREL14F:
3333 /* For all the DP relative relocations, we need to examine the symbol's
3334 section. If it's a code section, then "data pointer relative" makes
3335 no sense. In that case we don't adjust the "value", and for 21 bit
3336 addil instructions, we change the source addend register from %dp to
3337 %r0. This situation commonly arises when a variable's "constness"
3338 is declared differently from the way the variable is defined. For
3339 instance: "extern int foo" with foo defined as "const int foo". */
3340 if (sym_sec == NULL)
3341 break;
3342 if ((sym_sec->flags & SEC_CODE) != 0)
3343 {
3344 if ((insn & ((0x3f << 26) | (0x1f << 21)))
3345 == (((int) OP_ADDIL << 26) | (27 << 21)))
3346 {
3347 insn &= ~ (0x1f << 21);
74d1c347 3348#if 1 /* debug them. */
30667bf3
AM
3349 (*_bfd_error_handler)
3350 (_("%s(%s+0x%lx): fixing %s"),
8f615d07 3351 bfd_archive_filename (input_bfd),
30667bf3
AM
3352 input_section->name,
3353 (long) rel->r_offset,
3354 howto->name);
3355#endif
3356 }
3357 /* Now try to make things easy for the dynamic linker. */
3358
3359 break;
3360 }
74d1c347 3361 /* Fall thru. */
30667bf3
AM
3362
3363 case R_PARISC_DLTIND21L:
3364 case R_PARISC_DLTIND14R:
3365 case R_PARISC_DLTIND14F:
3366 value -= elf_gp (input_section->output_section->owner);
3367 break;
3368
c46b7515
AM
3369 case R_PARISC_SEGREL32:
3370 if ((sym_sec->flags & SEC_CODE) != 0)
83c81bfe 3371 value -= htab->text_segment_base;
c46b7515 3372 else
83c81bfe 3373 value -= htab->data_segment_base;
c46b7515
AM
3374 break;
3375
30667bf3
AM
3376 default:
3377 break;
3378 }
3379
3380 switch (r_type)
3381 {
3382 case R_PARISC_DIR32:
47d89dba 3383 case R_PARISC_DIR14F:
30667bf3
AM
3384 case R_PARISC_DIR17F:
3385 case R_PARISC_PCREL17C:
3386 case R_PARISC_PCREL14F:
3387 case R_PARISC_DPREL14F:
3388 case R_PARISC_PLABEL32:
3389 case R_PARISC_DLTIND14F:
3390 case R_PARISC_SEGBASE:
3391 case R_PARISC_SEGREL32:
3392 r_field = e_fsel;
3393 break;
3394
3395 case R_PARISC_DIR21L:
3396 case R_PARISC_PCREL21L:
3397 case R_PARISC_DPREL21L:
3398 case R_PARISC_PLABEL21L:
3399 case R_PARISC_DLTIND21L:
3400 r_field = e_lrsel;
3401 break;
3402
3403 case R_PARISC_DIR17R:
3404 case R_PARISC_PCREL17R:
3405 case R_PARISC_DIR14R:
3406 case R_PARISC_PCREL14R:
3407 case R_PARISC_DPREL14R:
3408 case R_PARISC_PLABEL14R:
3409 case R_PARISC_DLTIND14R:
3410 r_field = e_rrsel;
3411 break;
3412
3413 case R_PARISC_PCREL12F:
3414 case R_PARISC_PCREL17F:
3415 case R_PARISC_PCREL22F:
3416 r_field = e_fsel;
3417
3418 if (r_type == (unsigned int) R_PARISC_PCREL17F)
3419 {
3420 max_branch_offset = (1 << (17-1)) << 2;
3421 }
3422 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3423 {
3424 max_branch_offset = (1 << (12-1)) << 2;
3425 }
3426 else
3427 {
3428 max_branch_offset = (1 << (22-1)) << 2;
3429 }
3430
3431 /* sym_sec is NULL on undefined weak syms or when shared on
3432 undefined syms. We've already checked for a stub for the
3433 shared undefined case. */
3434 if (sym_sec == NULL)
3435 break;
3436
3437 /* If the branch is out of reach, then redirect the
3438 call to the local stub for this function. */
3439 if (value + addend + max_branch_offset >= 2*max_branch_offset)
3440 {
3441 stub_entry = hppa_get_stub_entry (input_section, sym_sec,
83c81bfe 3442 h, rel, htab);
30667bf3
AM
3443 if (stub_entry == NULL)
3444 return bfd_reloc_notsupported;
3445
3446 /* Munge up the value and addend so that we call the stub
3447 rather than the procedure directly. */
3448 value = (stub_entry->stub_offset
3449 + stub_entry->stub_sec->output_offset
3450 + stub_entry->stub_sec->output_section->vma
3451 - location);
3452 addend = -8;
3453 }
3454 break;
3455
3456 /* Something we don't know how to handle. */
3457 default:
3458 return bfd_reloc_notsupported;
3459 }
3460
3461 /* Make sure we can reach the stub. */
3462 if (max_branch_offset != 0
3463 && value + addend + max_branch_offset >= 2*max_branch_offset)
3464 {
3465 (*_bfd_error_handler)
3466 (_("%s(%s+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
8f615d07 3467 bfd_archive_filename (input_bfd),
30667bf3
AM
3468 input_section->name,
3469 (long) rel->r_offset,
3470 stub_entry->root.string);
3471 return bfd_reloc_notsupported;
3472 }
3473
3474 val = hppa_field_adjust (value, addend, r_field);
3475
3476 switch (r_type)
3477 {
3478 case R_PARISC_PCREL12F:
3479 case R_PARISC_PCREL17C:
3480 case R_PARISC_PCREL17F:
3481 case R_PARISC_PCREL17R:
3482 case R_PARISC_PCREL22F:
3483 case R_PARISC_DIR17F:
3484 case R_PARISC_DIR17R:
3485 /* This is a branch. Divide the offset by four.
3486 Note that we need to decide whether it's a branch or
3487 otherwise by inspecting the reloc. Inspecting insn won't
3488 work as insn might be from a .word directive. */
3489 val >>= 2;
3490 break;
3491
3492 default:
3493 break;
3494 }
3495
3496 insn = hppa_rebuild_insn (insn, val, r_format);
3497
3498 /* Update the instruction word. */
74d1c347 3499 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
30667bf3
AM
3500 return bfd_reloc_ok;
3501}
3502
30667bf3
AM
3503/* Relocate an HPPA ELF section. */
3504
3505static boolean
3506elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
3507 contents, relocs, local_syms, local_sections)
3508 bfd *output_bfd;
3509 struct bfd_link_info *info;
3510 bfd *input_bfd;
3511 asection *input_section;
3512 bfd_byte *contents;
3513 Elf_Internal_Rela *relocs;
3514 Elf_Internal_Sym *local_syms;
3515 asection **local_sections;
3516{
30667bf3 3517 bfd_vma *local_got_offsets;
83c81bfe 3518 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
3519 Elf_Internal_Shdr *symtab_hdr;
3520 Elf_Internal_Rela *rel;
3521 Elf_Internal_Rela *relend;
30667bf3
AM
3522
3523 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3524
83c81bfe 3525 htab = hppa_link_hash_table (info);
74d1c347 3526 local_got_offsets = elf_local_got_offsets (input_bfd);
30667bf3
AM
3527
3528 rel = relocs;
3529 relend = relocs + input_section->reloc_count;
3530 for (; rel < relend; rel++)
3531 {
3532 unsigned int r_type;
3533 reloc_howto_type *howto;
3534 unsigned int r_symndx;
3535 struct elf32_hppa_link_hash_entry *h;
3536 Elf_Internal_Sym *sym;
3537 asection *sym_sec;
3538 bfd_vma relocation;
3539 bfd_reloc_status_type r;
3540 const char *sym_name;
74d1c347 3541 boolean plabel;
68fb2e56 3542 bfd_vma off;
30667bf3
AM
3543
3544 r_type = ELF32_R_TYPE (rel->r_info);
3545 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3546 {
3547 bfd_set_error (bfd_error_bad_value);
3548 return false;
3549 }
3550 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3551 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3552 continue;
3553
3554 r_symndx = ELF32_R_SYM (rel->r_info);
3555
3556 if (info->relocateable)
3557 {
3ac8354b 3558 /* This is a relocatable link. We don't have to change
30667bf3
AM
3559 anything, unless the reloc is against a section symbol,
3560 in which case we have to adjust according to where the
3561 section symbol winds up in the output section. */
3562 if (r_symndx < symtab_hdr->sh_info)
3563 {
3564 sym = local_syms + r_symndx;
3565 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3566 {
3567 sym_sec = local_sections[r_symndx];
3568 rel->r_addend += sym_sec->output_offset;
3569 }
3570 }
3571 continue;
3572 }
3573
3574 /* This is a final link. */
3575 h = NULL;
3576 sym = NULL;
3577 sym_sec = NULL;
3578 if (r_symndx < symtab_hdr->sh_info)
3579 {
3580 /* This is a local symbol, h defaults to NULL. */
3581 sym = local_syms + r_symndx;
3582 sym_sec = local_sections[r_symndx];
3583 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
3584 ? 0 : sym->st_value)
3585 + sym_sec->output_offset
3586 + sym_sec->output_section->vma);
3587 }
3588 else
3589 {
3590 int indx;
3591
3592 /* It's a global; Find its entry in the link hash. */
3593 indx = r_symndx - symtab_hdr->sh_info;
3594 h = ((struct elf32_hppa_link_hash_entry *)
3595 elf_sym_hashes (input_bfd)[indx]);
3596 while (h->elf.root.type == bfd_link_hash_indirect
3597 || h->elf.root.type == bfd_link_hash_warning)
3598 h = (struct elf32_hppa_link_hash_entry *) h->elf.root.u.i.link;
3599
3600 relocation = 0;
3601 if (h->elf.root.type == bfd_link_hash_defined
3602 || h->elf.root.type == bfd_link_hash_defweak)
3603 {
3604 sym_sec = h->elf.root.u.def.section;
3605 /* If sym_sec->output_section is NULL, then it's a
3606 symbol defined in a shared library. */
3607 if (sym_sec->output_section != NULL)
3608 relocation = (h->elf.root.u.def.value
3609 + sym_sec->output_offset
3610 + sym_sec->output_section->vma);
3611 }
3612 else if (h->elf.root.type == bfd_link_hash_undefweak)
3613 ;
3614 else if (info->shared && !info->no_undefined
49e9d0d3
AM
3615 && ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
3616 && h->elf.type != STT_PARISC_MILLI)
30667bf3 3617 {
671bae9c 3618 if (info->symbolic && !info->allow_shlib_undefined)
30667bf3
AM
3619 if (!((*info->callbacks->undefined_symbol)
3620 (info, h->elf.root.root.string, input_bfd,
3621 input_section, rel->r_offset, false)))
3622 return false;
3623 }
3624 else
3625 {
3626 if (!((*info->callbacks->undefined_symbol)
3627 (info, h->elf.root.root.string, input_bfd,
3628 input_section, rel->r_offset, true)))
3629 return false;
3630 }
3631 }
3632
3633 /* Do any required modifications to the relocation value, and
25f72752
AM
3634 determine what types of dynamic info we need to output, if
3635 any. */
74d1c347 3636 plabel = 0;
30667bf3
AM
3637 switch (r_type)
3638 {
3639 case R_PARISC_DLTIND14F:
3640 case R_PARISC_DLTIND14R:
3641 case R_PARISC_DLTIND21L:
3642 /* Relocation is to the entry for this symbol in the global
3643 offset table. */
3644 if (h != NULL)
3645 {
4dc86686 3646 boolean dyn;
30667bf3
AM
3647
3648 off = h->elf.got.offset;
ebe50bae 3649 dyn = htab->elf.dynamic_sections_created;
4dc86686 3650 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, &h->elf))
30667bf3
AM
3651 {
3652 /* This is actually a static link, or it is a
3653 -Bsymbolic link and the symbol is defined
3654 locally, or the symbol was forced to be local
3655 because of a version file. We must initialize
3656 this entry in the global offset table. Since the
3657 offset must always be a multiple of 4, we use the
3658 least significant bit to record whether we have
3659 initialized it already.
3660
3661 When doing a dynamic link, we create a .rela.got
3662 relocation entry to initialize the value. This
3663 is done in the finish_dynamic_symbol routine. */
3664 if ((off & 1) != 0)
3665 off &= ~1;
3666 else
3667 {
3668 bfd_put_32 (output_bfd, relocation,
83c81bfe 3669 htab->sgot->contents + off);
30667bf3
AM
3670 h->elf.got.offset |= 1;
3671 }
3672 }
30667bf3
AM
3673 }
3674 else
3675 {
3676 /* Local symbol case. */
68fb2e56 3677 if (local_got_offsets == NULL)
49e9d0d3 3678 abort ();
30667bf3 3679
68fb2e56
AM
3680 off = local_got_offsets[r_symndx];
3681
30667bf3
AM
3682 /* The offset must always be a multiple of 4. We use
3683 the least significant bit to record whether we have
3684 already generated the necessary reloc. */
3685 if ((off & 1) != 0)
3686 off &= ~1;
3687 else
3688 {
3689 bfd_put_32 (output_bfd, relocation,
83c81bfe 3690 htab->sgot->contents + off);
30667bf3
AM
3691
3692 if (info->shared)
3693 {
8dea1268
AM
3694 /* Output a dynamic relocation for this GOT
3695 entry. In this case it is relative to the
3696 base of the object because the symbol index
3697 is zero. */
30667bf3 3698 Elf_Internal_Rela outrel;
83c81bfe 3699 asection *srelgot = htab->srelgot;
3ac8354b 3700 Elf32_External_Rela *loc;
30667bf3
AM
3701
3702 outrel.r_offset = (off
83c81bfe
AM
3703 + htab->sgot->output_offset
3704 + htab->sgot->output_section->vma);
74d1c347 3705 outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
30667bf3 3706 outrel.r_addend = relocation;
3ac8354b
AM
3707 loc = (Elf32_External_Rela *) srelgot->contents;
3708 loc += srelgot->reloc_count++;
3709 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
30667bf3 3710 }
252b5132 3711
30667bf3
AM
3712 local_got_offsets[r_symndx] |= 1;
3713 }
30667bf3 3714 }
252b5132 3715
68fb2e56
AM
3716 if (off >= (bfd_vma) -2)
3717 abort ();
3718
30667bf3 3719 /* Add the base of the GOT to the relocation value. */
68fb2e56 3720 relocation = (off
83c81bfe
AM
3721 + htab->sgot->output_offset
3722 + htab->sgot->output_section->vma);
30667bf3 3723 break;
252b5132 3724
c46b7515
AM
3725 case R_PARISC_SEGREL32:
3726 /* If this is the first SEGREL relocation, then initialize
3727 the segment base values. */
83c81bfe
AM
3728 if (htab->text_segment_base == (bfd_vma) -1)
3729 bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
c46b7515
AM
3730 break;
3731
30667bf3
AM
3732 case R_PARISC_PLABEL14R:
3733 case R_PARISC_PLABEL21L:
3734 case R_PARISC_PLABEL32:
ebe50bae 3735 if (htab->elf.dynamic_sections_created)
252b5132 3736 {
74d1c347
AM
3737 /* If we have a global symbol with a PLT slot, then
3738 redirect this relocation to it. */
3739 if (h != NULL)
3740 {
3741 off = h->elf.plt.offset;
4dc86686 3742 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, &h->elf))
8dea1268
AM
3743 {
3744 /* In a non-shared link, adjust_dynamic_symbols
3745 isn't called for symbols forced local. We
dc810e39 3746 need to write out the plt entry here. */
8dea1268
AM
3747 if ((off & 1) != 0)
3748 off &= ~1;
3749 else
3750 {
3751 bfd_put_32 (output_bfd,
3752 relocation,
83c81bfe 3753 htab->splt->contents + off);
8dea1268 3754 bfd_put_32 (output_bfd,
83c81bfe
AM
3755 elf_gp (htab->splt->output_section->owner),
3756 htab->splt->contents + off + 4);
8dea1268
AM
3757 h->elf.plt.offset |= 1;
3758 }
3759 }
74d1c347
AM
3760 }
3761 else
3762 {
68fb2e56
AM
3763 bfd_vma *local_plt_offsets;
3764
3765 if (local_got_offsets == NULL)
3766 abort ();
74d1c347 3767
68fb2e56
AM
3768 local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3769 off = local_plt_offsets[r_symndx];
74d1c347
AM
3770
3771 /* As for the local .got entry case, we use the last
3772 bit to record whether we've already initialised
3773 this local .plt entry. */
3774 if ((off & 1) != 0)
3775 off &= ~1;
3776 else
3777 {
3778 bfd_put_32 (output_bfd,
3779 relocation,
83c81bfe 3780 htab->splt->contents + off);
74d1c347 3781 bfd_put_32 (output_bfd,
83c81bfe
AM
3782 elf_gp (htab->splt->output_section->owner),
3783 htab->splt->contents + off + 4);
74d1c347
AM
3784
3785 if (info->shared)
3786 {
3787 /* Output a dynamic IPLT relocation for this
3788 PLT entry. */
3789 Elf_Internal_Rela outrel;
83c81bfe 3790 asection *srelplt = htab->srelplt;
3ac8354b 3791 Elf32_External_Rela *loc;
74d1c347
AM
3792
3793 outrel.r_offset = (off
83c81bfe
AM
3794 + htab->splt->output_offset
3795 + htab->splt->output_section->vma);
74d1c347
AM
3796 outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3797 outrel.r_addend = relocation;
3ac8354b
AM
3798 loc = (Elf32_External_Rela *) srelplt->contents;
3799 loc += srelplt->reloc_count++;
3800 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
74d1c347
AM
3801 }
3802
68fb2e56 3803 local_plt_offsets[r_symndx] |= 1;
74d1c347
AM
3804 }
3805 }
3806
68fb2e56 3807 if (off >= (bfd_vma) -2)
49e9d0d3 3808 abort ();
74d1c347
AM
3809
3810 /* PLABELs contain function pointers. Relocation is to
3811 the entry for the function in the .plt. The magic +2
3812 offset signals to $$dyncall that the function pointer
3813 is in the .plt and thus has a gp pointer too.
3814 Exception: Undefined PLABELs should have a value of
3815 zero. */
3816 if (h == NULL
3817 || (h->elf.root.type != bfd_link_hash_undefweak
3818 && h->elf.root.type != bfd_link_hash_undefined))
3819 {
3820 relocation = (off
83c81bfe
AM
3821 + htab->splt->output_offset
3822 + htab->splt->output_section->vma
74d1c347
AM
3823 + 2);
3824 }
3825 plabel = 1;
30667bf3
AM
3826 }
3827 /* Fall through and possibly emit a dynamic relocation. */
3828
3829 case R_PARISC_DIR17F:
3830 case R_PARISC_DIR17R:
47d89dba 3831 case R_PARISC_DIR14F:
30667bf3
AM
3832 case R_PARISC_DIR14R:
3833 case R_PARISC_DIR21L:
3834 case R_PARISC_DPREL14F:
3835 case R_PARISC_DPREL14R:
3836 case R_PARISC_DPREL21L:
3837 case R_PARISC_DIR32:
3838 /* The reloc types handled here and this conditional
56882138
AM
3839 expression must match the code in ..check_relocs and
3840 ..discard_relocs. ie. We need exactly the same condition
3841 as in ..check_relocs, with some extra conditions (dynindx
3842 test in this case) to cater for relocs removed by
3843 ..discard_relocs. If you squint, the non-shared test
3844 here does indeed match the one in ..check_relocs, the
3845 difference being that here we test DEF_DYNAMIC as well as
3846 !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3847 which is why we can't use just that test here.
3848 Conversely, DEF_DYNAMIC can't be used in check_relocs as
3849 there all files have not been loaded. */
446f2863
AM
3850 if ((info->shared
3851 && (input_section->flags & SEC_ALLOC) != 0
3852 && (IS_ABSOLUTE_RELOC (r_type)
3853 || (h != NULL
3854 && h->elf.dynindx != -1
3855 && (!info->symbolic
3856 || (h->elf.elf_link_hash_flags
3857 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3858 || (!info->shared
3859 && (input_section->flags & SEC_ALLOC) != 0
3860 && h != NULL
3861 && h->elf.dynindx != -1
3862 && (h->elf.elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
56882138
AM
3863 && (((h->elf.elf_link_hash_flags
3864 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
3865 && (h->elf.elf_link_hash_flags
3866 & ELF_LINK_HASH_DEF_REGULAR) == 0)
446f2863
AM
3867 || h->elf.root.type == bfd_link_hash_undefweak
3868 || h->elf.root.type == bfd_link_hash_undefined)))
30667bf3
AM
3869 {
3870 Elf_Internal_Rela outrel;
3871 boolean skip;
98ceb8ce
AM
3872 asection *sreloc;
3873 Elf32_External_Rela *loc;
252b5132 3874
30667bf3
AM
3875 /* When generating a shared object, these relocations
3876 are copied into the output file to be resolved at run
3877 time. */
252b5132 3878
30667bf3
AM
3879 outrel.r_offset = rel->r_offset;
3880 outrel.r_addend = rel->r_addend;
3881 skip = false;
3882 if (elf_section_data (input_section)->stab_info != NULL)
edd21aca 3883 {
30667bf3 3884 off = (_bfd_stab_section_offset
ebe50bae 3885 (output_bfd, &htab->elf.stab_info,
30667bf3
AM
3886 input_section,
3887 &elf_section_data (input_section)->stab_info,
3888 rel->r_offset));
3889 if (off == (bfd_vma) -1)
3890 skip = true;
3891 outrel.r_offset = off;
edd21aca 3892 }
252b5132 3893
30667bf3
AM
3894 outrel.r_offset += (input_section->output_offset
3895 + input_section->output_section->vma);
3896
3897 if (skip)
252b5132 3898 {
30667bf3 3899 memset (&outrel, 0, sizeof (outrel));
252b5132 3900 }
74d1c347
AM
3901 else if (h != NULL
3902 && h->elf.dynindx != -1
3903 && (plabel
446f2863
AM
3904 || !IS_ABSOLUTE_RELOC (r_type)
3905 || !info->shared
74d1c347 3906 || !info->symbolic
30667bf3
AM
3907 || (h->elf.elf_link_hash_flags
3908 & ELF_LINK_HASH_DEF_REGULAR) == 0))
252b5132 3909 {
30667bf3
AM
3910 outrel.r_info = ELF32_R_INFO (h->elf.dynindx, r_type);
3911 }
3912 else /* It's a local symbol, or one marked to become local. */
3913 {
3914 int indx = 0;
edd21aca 3915
30667bf3
AM
3916 /* Add the absolute offset of the symbol. */
3917 outrel.r_addend += relocation;
edd21aca 3918
74d1c347
AM
3919 /* Global plabels need to be processed by the
3920 dynamic linker so that functions have at most one
3921 fptr. For this reason, we need to differentiate
3922 between global and local plabels, which we do by
3923 providing the function symbol for a global plabel
3924 reloc, and no symbol for local plabels. */
3925 if (! plabel
3926 && sym_sec != NULL
30667bf3
AM
3927 && sym_sec->output_section != NULL
3928 && ! bfd_is_abs_section (sym_sec))
252b5132 3929 {
30667bf3
AM
3930 indx = elf_section_data (sym_sec->output_section)->dynindx;
3931 /* We are turning this relocation into one
3932 against a section symbol, so subtract out the
3933 output section's address but not the offset
3934 of the input section in the output section. */
3935 outrel.r_addend -= sym_sec->output_section->vma;
252b5132 3936 }
252b5132 3937
30667bf3
AM
3938 outrel.r_info = ELF32_R_INFO (indx, r_type);
3939 }
68fb2e56
AM
3940#if 0
3941 /* EH info can cause unaligned DIR32 relocs.
3942 Tweak the reloc type for the dynamic linker. */
3943 if (r_type == R_PARISC_DIR32 && (outrel.r_offset & 3) != 0)
3944 outrel.r_info = ELF32_R_INFO (ELF32_R_SYM (outrel.r_info),
3945 R_PARISC_DIR32U);
3946#endif
98ceb8ce
AM
3947 sreloc = elf_section_data (input_section)->sreloc;
3948 if (sreloc == NULL)
3949 abort ();
3950
3ac8354b
AM
3951 loc = (Elf32_External_Rela *) sreloc->contents;
3952 loc += sreloc->reloc_count++;
98ceb8ce 3953 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
30667bf3
AM
3954 }
3955 break;
edd21aca 3956
30667bf3
AM
3957 default:
3958 break;
3959 }
252b5132 3960
30667bf3 3961 r = final_link_relocate (input_section, contents, rel, relocation,
83c81bfe 3962 htab, sym_sec, h);
252b5132 3963
30667bf3
AM
3964 if (r == bfd_reloc_ok)
3965 continue;
252b5132 3966
30667bf3
AM
3967 if (h != NULL)
3968 sym_name = h->elf.root.root.string;
3969 else
3970 {
3971 sym_name = bfd_elf_string_from_elf_section (input_bfd,
3972 symtab_hdr->sh_link,
3973 sym->st_name);
3974 if (sym_name == NULL)
3975 return false;
3976 if (*sym_name == '\0')
3977 sym_name = bfd_section_name (input_bfd, sym_sec);
3978 }
edd21aca 3979
30667bf3 3980 howto = elf_hppa_howto_table + r_type;
252b5132 3981
30667bf3
AM
3982 if (r == bfd_reloc_undefined || r == bfd_reloc_notsupported)
3983 {
3984 (*_bfd_error_handler)
3985 (_("%s(%s+0x%lx): cannot handle %s for %s"),
8f615d07 3986 bfd_archive_filename (input_bfd),
30667bf3
AM
3987 input_section->name,
3988 (long) rel->r_offset,
3989 howto->name,
3990 sym_name);
8f615d07
AM
3991 bfd_set_error (bfd_error_bad_value);
3992 return false;
30667bf3
AM
3993 }
3994 else
3995 {
3996 if (!((*info->callbacks->reloc_overflow)
3997 (info, sym_name, howto->name, (bfd_vma) 0,
3998 input_bfd, input_section, rel->r_offset)))
3999 return false;
4000 }
4001 }
edd21aca 4002
30667bf3
AM
4003 return true;
4004}
252b5132 4005
c46b7515
AM
4006/* Comparison function for qsort to sort unwind section during a
4007 final link. */
4008
4009static int
4010hppa_unwind_entry_compare (a, b)
4011 const PTR a;
4012 const PTR b;
4013{
4014 const bfd_byte *ap, *bp;
4015 unsigned long av, bv;
4016
4017 ap = (const bfd_byte *) a;
4018 av = (unsigned long) ap[0] << 24;
4019 av |= (unsigned long) ap[1] << 16;
4020 av |= (unsigned long) ap[2] << 8;
4021 av |= (unsigned long) ap[3];
4022
4023 bp = (const bfd_byte *) b;
4024 bv = (unsigned long) bp[0] << 24;
4025 bv |= (unsigned long) bp[1] << 16;
4026 bv |= (unsigned long) bp[2] << 8;
4027 bv |= (unsigned long) bp[3];
4028
4029 return av < bv ? -1 : av > bv ? 1 : 0;
4030}
4031
30667bf3
AM
4032/* Finish up dynamic symbol handling. We set the contents of various
4033 dynamic sections here. */
252b5132 4034
30667bf3
AM
4035static boolean
4036elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
4037 bfd *output_bfd;
4038 struct bfd_link_info *info;
4039 struct elf_link_hash_entry *h;
4040 Elf_Internal_Sym *sym;
4041{
83c81bfe 4042 struct elf32_hppa_link_hash_table *htab;
edd21aca 4043
83c81bfe 4044 htab = hppa_link_hash_table (info);
30667bf3 4045
30667bf3
AM
4046 if (h->plt.offset != (bfd_vma) -1)
4047 {
4048 bfd_vma value;
30667bf3 4049
8dea1268
AM
4050 if (h->plt.offset & 1)
4051 abort ();
4052
30667bf3
AM
4053 /* This symbol has an entry in the procedure linkage table. Set
4054 it up.
4055
4056 The format of a plt entry is
74d1c347
AM
4057 <funcaddr>
4058 <__gp>
47d89dba 4059 */
30667bf3
AM
4060 value = 0;
4061 if (h->root.type == bfd_link_hash_defined
4062 || h->root.type == bfd_link_hash_defweak)
4063 {
4064 value = h->root.u.def.value;
4065 if (h->root.u.def.section->output_section != NULL)
4066 value += (h->root.u.def.section->output_offset
4067 + h->root.u.def.section->output_section->vma);
252b5132 4068 }
edd21aca 4069
74d1c347 4070 if (! ((struct elf32_hppa_link_hash_entry *) h)->pic_call)
30667bf3 4071 {
47d89dba 4072 Elf_Internal_Rela rel;
3ac8354b 4073 Elf32_External_Rela *loc;
47d89dba 4074
30667bf3
AM
4075 /* Create a dynamic IPLT relocation for this entry. */
4076 rel.r_offset = (h->plt.offset
83c81bfe
AM
4077 + htab->splt->output_offset
4078 + htab->splt->output_section->vma);
74d1c347
AM
4079 if (! ((struct elf32_hppa_link_hash_entry *) h)->plt_abs
4080 && h->dynindx != -1)
4081 {
47d89dba
AM
4082 /* To support lazy linking, the function pointer is
4083 initialised to point to a special stub stored at the
8dea1268
AM
4084 end of the .plt. This is not done for plt entries
4085 with a base-relative dynamic relocation. */
83c81bfe
AM
4086 value = (htab->splt->output_offset
4087 + htab->splt->output_section->vma
4088 + htab->splt->_raw_size
47d89dba
AM
4089 - sizeof (plt_stub)
4090 + PLT_STUB_ENTRY);
74d1c347
AM
4091 rel.r_info = ELF32_R_INFO (h->dynindx, R_PARISC_IPLT);
4092 rel.r_addend = 0;
4093 }
4094 else
4095 {
4096 /* This symbol has been marked to become local, and is
4097 used by a plabel so must be kept in the .plt. */
4098 rel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4099 rel.r_addend = value;
4100 }
30667bf3 4101
3ac8354b
AM
4102 loc = (Elf32_External_Rela *) htab->srelplt->contents;
4103 loc += htab->srelplt->reloc_count++;
83c81bfe 4104 bfd_elf32_swap_reloca_out (htab->splt->output_section->owner,
3ac8354b 4105 &rel, loc);
30667bf3
AM
4106 }
4107
83c81bfe 4108 bfd_put_32 (htab->splt->owner,
47d89dba 4109 value,
83c81bfe
AM
4110 htab->splt->contents + h->plt.offset);
4111 bfd_put_32 (htab->splt->owner,
4112 elf_gp (htab->splt->output_section->owner),
4113 htab->splt->contents + h->plt.offset + 4);
47d89dba
AM
4114 if (PLABEL_PLT_ENTRY_SIZE != PLT_ENTRY_SIZE
4115 && ((struct elf32_hppa_link_hash_entry *) h)->plabel
4116 && h->dynindx != -1)
4117 {
83c81bfe 4118 memset (htab->splt->contents + h->plt.offset + 8,
47d89dba
AM
4119 0, PLABEL_PLT_ENTRY_SIZE - PLT_ENTRY_SIZE);
4120 }
4121
30667bf3
AM
4122 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
4123 {
4124 /* Mark the symbol as undefined, rather than as defined in
4125 the .plt section. Leave the value alone. */
4126 sym->st_shndx = SHN_UNDEF;
4127 }
4128 }
edd21aca 4129
30667bf3
AM
4130 if (h->got.offset != (bfd_vma) -1)
4131 {
4132 Elf_Internal_Rela rel;
3ac8354b 4133 Elf32_External_Rela *loc;
30667bf3
AM
4134
4135 /* This symbol has an entry in the global offset table. Set it
4136 up. */
4137
4138 rel.r_offset = ((h->got.offset &~ (bfd_vma) 1)
83c81bfe
AM
4139 + htab->sgot->output_offset
4140 + htab->sgot->output_section->vma);
30667bf3 4141
4dc86686
AM
4142 /* If this is a -Bsymbolic link and the symbol is defined
4143 locally or was forced to be local because of a version file,
4144 we just want to emit a RELATIVE reloc. The entry in the
4145 global offset table will already have been initialized in the
4146 relocate_section function. */
4147 if (info->shared
4148 && (info->symbolic || h->dynindx == -1)
4149 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
30667bf3 4150 {
74d1c347 4151 rel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
30667bf3
AM
4152 rel.r_addend = (h->root.u.def.value
4153 + h->root.u.def.section->output_offset
4154 + h->root.u.def.section->output_section->vma);
4155 }
4156 else
4157 {
49e9d0d3
AM
4158 if ((h->got.offset & 1) != 0)
4159 abort ();
30667bf3 4160 bfd_put_32 (output_bfd, (bfd_vma) 0,
83c81bfe 4161 htab->sgot->contents + h->got.offset);
30667bf3
AM
4162 rel.r_info = ELF32_R_INFO (h->dynindx, R_PARISC_DIR32);
4163 rel.r_addend = 0;
4164 }
edd21aca 4165
3ac8354b
AM
4166 loc = (Elf32_External_Rela *) htab->srelgot->contents;
4167 loc += htab->srelgot->reloc_count++;
4168 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
30667bf3 4169 }
edd21aca 4170
30667bf3
AM
4171 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
4172 {
4173 asection *s;
4174 Elf_Internal_Rela rel;
3ac8354b 4175 Elf32_External_Rela *loc;
30667bf3
AM
4176
4177 /* This symbol needs a copy reloc. Set it up. */
4178
49e9d0d3
AM
4179 if (! (h->dynindx != -1
4180 && (h->root.type == bfd_link_hash_defined
4181 || h->root.type == bfd_link_hash_defweak)))
4182 abort ();
30667bf3 4183
83c81bfe 4184 s = htab->srelbss;
30667bf3
AM
4185
4186 rel.r_offset = (h->root.u.def.value
4187 + h->root.u.def.section->output_offset
4188 + h->root.u.def.section->output_section->vma);
4189 rel.r_addend = 0;
4190 rel.r_info = ELF32_R_INFO (h->dynindx, R_PARISC_COPY);
3ac8354b
AM
4191 loc = (Elf32_External_Rela *) s->contents + s->reloc_count++;
4192 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
30667bf3
AM
4193 }
4194
4195 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
4196 if (h->root.root.string[0] == '_'
4197 && (strcmp (h->root.root.string, "_DYNAMIC") == 0
4198 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0))
4199 {
4200 sym->st_shndx = SHN_ABS;
4201 }
4202
4203 return true;
4204}
4205
98ceb8ce
AM
4206/* Used to decide how to sort relocs in an optimal manner for the
4207 dynamic linker, before writing them out. */
4208
4209static enum elf_reloc_type_class
4210elf32_hppa_reloc_type_class (rela)
4211 const Elf_Internal_Rela *rela;
4212{
4213 if (ELF32_R_SYM (rela->r_info) == 0)
4214 return reloc_class_relative;
4215
4216 switch ((int) ELF32_R_TYPE (rela->r_info))
4217 {
4218 case R_PARISC_IPLT:
4219 return reloc_class_plt;
4220 case R_PARISC_COPY:
4221 return reloc_class_copy;
4222 default:
4223 return reloc_class_normal;
4224 }
4225}
4226
30667bf3
AM
4227/* Finish up the dynamic sections. */
4228
4229static boolean
4230elf32_hppa_finish_dynamic_sections (output_bfd, info)
4231 bfd *output_bfd;
4232 struct bfd_link_info *info;
4233{
4234 bfd *dynobj;
83c81bfe 4235 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
4236 asection *sdyn;
4237
83c81bfe 4238 htab = hppa_link_hash_table (info);
ebe50bae 4239 dynobj = htab->elf.dynobj;
30667bf3
AM
4240
4241 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4242
ebe50bae 4243 if (htab->elf.dynamic_sections_created)
30667bf3
AM
4244 {
4245 Elf32_External_Dyn *dyncon, *dynconend;
4246
49e9d0d3
AM
4247 if (sdyn == NULL)
4248 abort ();
30667bf3
AM
4249
4250 dyncon = (Elf32_External_Dyn *) sdyn->contents;
4251 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
4252 for (; dyncon < dynconend; dyncon++)
edd21aca 4253 {
30667bf3
AM
4254 Elf_Internal_Dyn dyn;
4255 asection *s;
4256
4257 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4258
4259 switch (dyn.d_tag)
4260 {
4261 default:
3ac8354b 4262 continue;
30667bf3
AM
4263
4264 case DT_PLTGOT:
4265 /* Use PLTGOT to set the GOT register. */
4266 dyn.d_un.d_ptr = elf_gp (output_bfd);
30667bf3
AM
4267 break;
4268
4269 case DT_JMPREL:
83c81bfe 4270 s = htab->srelplt;
30667bf3 4271 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
30667bf3
AM
4272 break;
4273
4274 case DT_PLTRELSZ:
83c81bfe 4275 s = htab->srelplt;
30667bf3
AM
4276 if (s->_cooked_size != 0)
4277 dyn.d_un.d_val = s->_cooked_size;
4278 else
4279 dyn.d_un.d_val = s->_raw_size;
30667bf3
AM
4280 break;
4281 }
3ac8354b
AM
4282
4283 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
edd21aca 4284 }
252b5132 4285 }
edd21aca 4286
83c81bfe 4287 if (htab->sgot != NULL && htab->sgot->_raw_size != 0)
30667bf3 4288 {
74d1c347
AM
4289 /* Fill in the first entry in the global offset table.
4290 We use it to point to our dynamic section, if we have one. */
30667bf3
AM
4291 bfd_put_32 (output_bfd,
4292 (sdyn != NULL
4293 ? sdyn->output_section->vma + sdyn->output_offset
4294 : (bfd_vma) 0),
83c81bfe 4295 htab->sgot->contents);
30667bf3 4296
74d1c347 4297 /* The second entry is reserved for use by the dynamic linker. */
83c81bfe 4298 memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
74d1c347 4299
30667bf3 4300 /* Set .got entry size. */
83c81bfe 4301 elf_section_data (htab->sgot->output_section)
74d1c347 4302 ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
30667bf3
AM
4303 }
4304
83c81bfe 4305 if (htab->splt != NULL && htab->splt->_raw_size != 0)
47d89dba
AM
4306 {
4307 /* Set plt entry size. */
83c81bfe 4308 elf_section_data (htab->splt->output_section)
47d89dba
AM
4309 ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4310
83c81bfe 4311 if (htab->need_plt_stub)
47d89dba
AM
4312 {
4313 /* Set up the .plt stub. */
83c81bfe
AM
4314 memcpy (htab->splt->contents
4315 + htab->splt->_raw_size - sizeof (plt_stub),
47d89dba
AM
4316 plt_stub, sizeof (plt_stub));
4317
83c81bfe
AM
4318 if ((htab->splt->output_offset
4319 + htab->splt->output_section->vma
4320 + htab->splt->_raw_size)
4321 != (htab->sgot->output_offset
4322 + htab->sgot->output_section->vma))
47d89dba
AM
4323 {
4324 (*_bfd_error_handler)
4325 (_(".got section not immediately after .plt section"));
4326 return false;
4327 }
4328 }
4329 }
30667bf3 4330
252b5132 4331 return true;
30667bf3 4332}
252b5132 4333
d952f17a
AM
4334/* Tweak the OSABI field of the elf header. */
4335
4336static void
4337elf32_hppa_post_process_headers (abfd, link_info)
4338 bfd *abfd;
4339 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4340{
4341 Elf_Internal_Ehdr * i_ehdrp;
4342
4343 i_ehdrp = elf_elfheader (abfd);
4344
4345 if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
4346 {
4347 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
4348 }
4349 else
4350 {
4351 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
4352 }
4353}
4354
30667bf3
AM
4355/* Called when writing out an object file to decide the type of a
4356 symbol. */
4357static int
4358elf32_hppa_elf_get_symbol_type (elf_sym, type)
4359 Elf_Internal_Sym *elf_sym;
4360 int type;
4361{
4362 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4363 return STT_PARISC_MILLI;
4364 else
4365 return type;
252b5132
RH
4366}
4367
4368/* Misc BFD support code. */
30667bf3
AM
4369#define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4370#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4371#define elf_info_to_howto elf_hppa_info_to_howto
4372#define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
252b5132 4373
252b5132 4374/* Stuff for the BFD linker. */
c46b7515 4375#define bfd_elf32_bfd_final_link elf32_hppa_final_link
30667bf3
AM
4376#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4377#define elf_backend_add_symbol_hook elf32_hppa_add_symbol_hook
4378#define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
ebe50bae 4379#define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
30667bf3
AM
4380#define elf_backend_check_relocs elf32_hppa_check_relocs
4381#define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4382#define elf_backend_fake_sections elf_hppa_fake_sections
4383#define elf_backend_relocate_section elf32_hppa_relocate_section
74d1c347 4384#define elf_backend_hide_symbol elf32_hppa_hide_symbol
30667bf3
AM
4385#define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4386#define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4387#define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
4388#define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4389#define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
4390#define elf_backend_object_p elf32_hppa_object_p
4391#define elf_backend_final_write_processing elf_hppa_final_write_processing
d952f17a 4392#define elf_backend_post_process_headers elf32_hppa_post_process_headers
30667bf3 4393#define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
98ceb8ce 4394#define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
30667bf3
AM
4395
4396#define elf_backend_can_gc_sections 1
51b64d56 4397#define elf_backend_can_refcount 1
30667bf3
AM
4398#define elf_backend_plt_alignment 2
4399#define elf_backend_want_got_plt 0
4400#define elf_backend_plt_readonly 0
4401#define elf_backend_want_plt_sym 0
74d1c347 4402#define elf_backend_got_header_size 8
252b5132
RH
4403
4404#define TARGET_BIG_SYM bfd_elf32_hppa_vec
4405#define TARGET_BIG_NAME "elf32-hppa"
4406#define ELF_ARCH bfd_arch_hppa
4407#define ELF_MACHINE_CODE EM_PARISC
4408#define ELF_MAXPAGESIZE 0x1000
4409
4410#include "elf32-target.h"
d952f17a
AM
4411
4412#undef TARGET_BIG_SYM
4413#define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
4414#undef TARGET_BIG_NAME
4415#define TARGET_BIG_NAME "elf32-hppa-linux"
4416
4417#define INCLUDED_TARGET_FILE 1
4418#include "elf32-target.h"
This page took 0.539772 seconds and 4 git commands to generate.