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