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