daily update
[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
AM
1162 asection *sreloc;
1163 asection *stubreloc;
9b52905e 1164 int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
30667bf3 1165
1049f94e 1166 if (info->relocatable)
b34976b6 1167 return TRUE;
30667bf3 1168
83c81bfe 1169 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1170 if (htab == NULL)
1171 return FALSE;
30667bf3 1172 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
875c0872 1173 eh_syms = elf_sym_hashes (abfd);
30667bf3
AM
1174 sreloc = NULL;
1175 stubreloc = NULL;
1176
875c0872
DA
1177 rela_end = relocs + sec->reloc_count;
1178 for (rela = relocs; rela < rela_end; rela++)
30667bf3
AM
1179 {
1180 enum {
1181 NEED_GOT = 1,
1182 NEED_PLT = 2,
1183 NEED_DYNREL = 4,
98ceb8ce 1184 PLT_PLABEL = 8
30667bf3 1185 };
edd21aca 1186
30667bf3 1187 unsigned int r_symndx, r_type;
875c0872
DA
1188 struct elf32_hppa_link_hash_entry *hh;
1189 int need_entry = 0;
252b5132 1190
875c0872 1191 r_symndx = ELF32_R_SYM (rela->r_info);
252b5132 1192
30667bf3 1193 if (r_symndx < symtab_hdr->sh_info)
875c0872 1194 hh = NULL;
30667bf3 1195 else
f7c5057a 1196 {
875c0872 1197 hh = hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
a63e02c7
DA
1198 while (hh->eh.root.type == bfd_link_hash_indirect
1199 || hh->eh.root.type == bfd_link_hash_warning)
1200 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
f7c5057a 1201 }
252b5132 1202
875c0872 1203 r_type = ELF32_R_TYPE (rela->r_info);
9b52905e 1204 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
252b5132 1205
30667bf3
AM
1206 switch (r_type)
1207 {
1208 case R_PARISC_DLTIND14F:
1209 case R_PARISC_DLTIND14R:
1210 case R_PARISC_DLTIND21L:
1211 /* This symbol requires a global offset table entry. */
1212 need_entry = NEED_GOT;
30667bf3
AM
1213 break;
1214
1215 case R_PARISC_PLABEL14R: /* "Official" procedure labels. */
1216 case R_PARISC_PLABEL21L:
1217 case R_PARISC_PLABEL32:
74d1c347 1218 /* If the addend is non-zero, we break badly. */
875c0872 1219 if (rela->r_addend != 0)
49e9d0d3 1220 abort ();
74d1c347
AM
1221
1222 /* If we are creating a shared library, then we need to
1223 create a PLT entry for all PLABELs, because PLABELs with
1224 local symbols may be passed via a pointer to another
1225 object. Additionally, output a dynamic relocation
4dc86686 1226 pointing to the PLT entry.
875c0872 1227
4dc86686
AM
1228 For executables, the original 32-bit ABI allowed two
1229 different styles of PLABELs (function pointers): For
1230 global functions, the PLABEL word points into the .plt
1231 two bytes past a (function address, gp) pair, and for
1232 local functions the PLABEL points directly at the
1233 function. The magic +2 for the first type allows us to
1234 differentiate between the two. As you can imagine, this
1235 is a real pain when it comes to generating code to call
1236 functions indirectly or to compare function pointers.
1237 We avoid the mess by always pointing a PLABEL into the
1238 .plt, even for local functions. */
74d1c347 1239 need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
30667bf3
AM
1240 break;
1241
1242 case R_PARISC_PCREL12F:
83c81bfe 1243 htab->has_12bit_branch = 1;
067fa4a6
AM
1244 goto branch_common;
1245
30667bf3
AM
1246 case R_PARISC_PCREL17C:
1247 case R_PARISC_PCREL17F:
83c81bfe 1248 htab->has_17bit_branch = 1;
067fa4a6
AM
1249 goto branch_common;
1250
30667bf3 1251 case R_PARISC_PCREL22F:
067fa4a6
AM
1252 htab->has_22bit_branch = 1;
1253 branch_common:
47d89dba
AM
1254 /* Function calls might need to go through the .plt, and
1255 might require long branch stubs. */
875c0872 1256 if (hh == NULL)
30667bf3
AM
1257 {
1258 /* We know local syms won't need a .plt entry, and if
1259 they need a long branch stub we can't guarantee that
1260 we can reach the stub. So just flag an error later
1261 if we're doing a shared link and find we need a long
1262 branch stub. */
1263 continue;
1264 }
1265 else
1266 {
1267 /* Global symbols will need a .plt entry if they remain
1268 global, and in most cases won't need a long branch
1269 stub. Unfortunately, we have to cater for the case
1270 where a symbol is forced local by versioning, or due
1271 to symbolic linking, and we lose the .plt entry. */
98ceb8ce 1272 need_entry = NEED_PLT;
a63e02c7 1273 if (hh->eh.type == STT_PARISC_MILLI)
98ceb8ce 1274 need_entry = 0;
30667bf3
AM
1275 }
1276 break;
1277
36751eee 1278 case R_PARISC_SEGBASE: /* Used to set segment base. */
c46b7515 1279 case R_PARISC_SEGREL32: /* Relative reloc, used for unwind. */
30667bf3
AM
1280 case R_PARISC_PCREL14F: /* PC relative load/store. */
1281 case R_PARISC_PCREL14R:
1282 case R_PARISC_PCREL17R: /* External branches. */
1283 case R_PARISC_PCREL21L: /* As above, and for load/store too. */
36751eee 1284 case R_PARISC_PCREL32:
30667bf3
AM
1285 /* We don't need to propagate the relocation if linking a
1286 shared object since these are section relative. */
1287 continue;
1288
1289 case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */
1290 case R_PARISC_DPREL14R:
1291 case R_PARISC_DPREL21L:
1292 if (info->shared)
1293 {
1294 (*_bfd_error_handler)
d003868e
AM
1295 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1296 abfd,
30667bf3
AM
1297 elf_hppa_howto_table[r_type].name);
1298 bfd_set_error (bfd_error_bad_value);
b34976b6 1299 return FALSE;
30667bf3
AM
1300 }
1301 /* Fall through. */
1302
1303 case R_PARISC_DIR17F: /* Used for external branches. */
1304 case R_PARISC_DIR17R:
47d89dba
AM
1305 case R_PARISC_DIR14F: /* Used for load/store from absolute locn. */
1306 case R_PARISC_DIR14R:
30667bf3 1307 case R_PARISC_DIR21L: /* As above, and for ext branches too. */
c46b7515 1308 case R_PARISC_DIR32: /* .word relocs. */
30667bf3
AM
1309 /* We may want to output a dynamic relocation later. */
1310 need_entry = NEED_DYNREL;
1311 break;
1312
1313 /* This relocation describes the C++ object vtable hierarchy.
1314 Reconstruct it for later use during GC. */
1315 case R_PARISC_GNU_VTINHERIT:
a63e02c7 1316 if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
b34976b6 1317 return FALSE;
30667bf3
AM
1318 continue;
1319
1320 /* This relocation describes which C++ vtable entries are actually
1321 used. Record for later use during GC. */
1322 case R_PARISC_GNU_VTENTRY:
d17e0c6e
JB
1323 BFD_ASSERT (hh != NULL);
1324 if (hh != NULL
1325 && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
b34976b6 1326 return FALSE;
30667bf3
AM
1327 continue;
1328
9b52905e
NC
1329 case R_PARISC_TLS_GD21L:
1330 case R_PARISC_TLS_GD14R:
1331 case R_PARISC_TLS_LDM21L:
1332 case R_PARISC_TLS_LDM14R:
1333 need_entry = NEED_GOT;
1334 break;
1335
1336 case R_PARISC_TLS_IE21L:
1337 case R_PARISC_TLS_IE14R:
1338 if (info->shared)
1339 info->flags |= DF_STATIC_TLS;
1340 need_entry = NEED_GOT;
1341 break;
1342
30667bf3
AM
1343 default:
1344 continue;
1345 }
1346
1347 /* Now carry out our orders. */
1348 if (need_entry & NEED_GOT)
1349 {
9b52905e
NC
1350 switch (r_type)
1351 {
1352 default:
1353 tls_type = GOT_NORMAL;
1354 break;
1355 case R_PARISC_TLS_GD21L:
1356 case R_PARISC_TLS_GD14R:
1357 tls_type |= GOT_TLS_GD;
1358 break;
1359 case R_PARISC_TLS_LDM21L:
1360 case R_PARISC_TLS_LDM14R:
1361 tls_type |= GOT_TLS_LDM;
1362 break;
1363 case R_PARISC_TLS_IE21L:
1364 case R_PARISC_TLS_IE14R:
1365 tls_type |= GOT_TLS_IE;
1366 break;
1367 }
1368
30667bf3 1369 /* Allocate space for a GOT entry, as well as a dynamic
25f72752 1370 relocation for this entry. */
83c81bfe 1371 if (htab->sgot == NULL)
30667bf3 1372 {
a63e02c7
DA
1373 if (htab->etab.dynobj == NULL)
1374 htab->etab.dynobj = abfd;
1375 if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
b34976b6 1376 return FALSE;
30667bf3
AM
1377 }
1378
9b52905e
NC
1379 if (r_type == R_PARISC_TLS_LDM21L
1380 || r_type == R_PARISC_TLS_LDM14R)
4dfe6ac6 1381 htab->tls_ldm_got.refcount += 1;
30667bf3
AM
1382 else
1383 {
9b52905e
NC
1384 if (hh != NULL)
1385 {
1386 hh->eh.got.refcount += 1;
1387 old_tls_type = hh->tls_type;
1388 }
1389 else
1390 {
1391 bfd_signed_vma *local_got_refcounts;
1392
1393 /* This is a global offset table entry for a local symbol. */
d45b7d74 1394 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
9b52905e 1395 if (local_got_refcounts == NULL)
d45b7d74 1396 return FALSE;
9b52905e
NC
1397 local_got_refcounts[r_symndx] += 1;
1398
1399 old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1400 }
1401
1402 tls_type |= old_tls_type;
1403
1404 if (old_tls_type != tls_type)
1405 {
1406 if (hh != NULL)
1407 hh->tls_type = tls_type;
1408 else
1409 hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1410 }
1411
30667bf3
AM
1412 }
1413 }
1414
1415 if (need_entry & NEED_PLT)
1416 {
1417 /* If we are creating a shared library, and this is a reloc
1418 against a weak symbol or a global symbol in a dynamic
1419 object, then we will be creating an import stub and a
1420 .plt entry for the symbol. Similarly, on a normal link
1421 to symbols defined in a dynamic object we'll need the
1422 import stub and a .plt entry. We don't know yet whether
1423 the symbol is defined or not, so make an entry anyway and
1424 clean up later in adjust_dynamic_symbol. */
1425 if ((sec->flags & SEC_ALLOC) != 0)
1426 {
875c0872 1427 if (hh != NULL)
30667bf3 1428 {
a63e02c7
DA
1429 hh->eh.needs_plt = 1;
1430 hh->eh.plt.refcount += 1;
74d1c347 1431
36605136
AM
1432 /* If this .plt entry is for a plabel, mark it so
1433 that adjust_dynamic_symbol will keep the entry
1434 even if it appears to be local. */
74d1c347 1435 if (need_entry & PLT_PLABEL)
875c0872 1436 hh->plabel = 1;
74d1c347
AM
1437 }
1438 else if (need_entry & PLT_PLABEL)
1439 {
3ac8354b 1440 bfd_signed_vma *local_got_refcounts;
68fb2e56 1441 bfd_signed_vma *local_plt_refcounts;
74d1c347 1442
d45b7d74 1443 local_got_refcounts = hppa32_elf_local_refcounts (abfd);
74d1c347 1444 if (local_got_refcounts == NULL)
d45b7d74 1445 return FALSE;
68fb2e56
AM
1446 local_plt_refcounts = (local_got_refcounts
1447 + symtab_hdr->sh_info);
ebe50bae 1448 local_plt_refcounts[r_symndx] += 1;
30667bf3 1449 }
30667bf3
AM
1450 }
1451 }
1452
98ceb8ce 1453 if (need_entry & NEED_DYNREL)
30667bf3
AM
1454 {
1455 /* Flag this symbol as having a non-got, non-plt reference
1456 so that we generate copy relocs if it turns out to be
1457 dynamic. */
875c0872 1458 if (hh != NULL && !info->shared)
a63e02c7 1459 hh->eh.non_got_ref = 1;
30667bf3
AM
1460
1461 /* If we are creating a shared library then we need to copy
1462 the reloc into the shared library. However, if we are
1463 linking with -Bsymbolic, we need only copy absolute
1464 relocs or relocs against symbols that are not defined in
1465 an object we are including in the link. PC- or DP- or
1466 DLT-relative relocs against any local sym or global sym
1467 with DEF_REGULAR set, can be discarded. At this point we
1468 have not seen all the input files, so it is possible that
1469 DEF_REGULAR is not set now but will be set later (it is
1470 never cleared). We account for that possibility below by
98ceb8ce 1471 storing information in the dyn_relocs field of the
30667bf3
AM
1472 hash table entry.
1473
1474 A similar situation to the -Bsymbolic case occurs when
1475 creating shared libraries and symbol visibility changes
1476 render the symbol local.
1477
1478 As it turns out, all the relocs we will be creating here
1479 are absolute, so we cannot remove them on -Bsymbolic
1480 links or visibility changes anyway. A STUB_REL reloc
1481 is absolute too, as in that case it is the reloc in the
1482 stub we will be creating, rather than copying the PCREL
56882138
AM
1483 reloc in the branch.
1484
1485 If on the other hand, we are creating an executable, we
1486 may need to keep relocations for symbols satisfied by a
1487 dynamic library if we manage to avoid copy relocs for the
1488 symbol. */
446f2863
AM
1489 if ((info->shared
1490 && (sec->flags & SEC_ALLOC) != 0
1491 && (IS_ABSOLUTE_RELOC (r_type)
875c0872 1492 || (hh != NULL
446f2863 1493 && (!info->symbolic
a63e02c7
DA
1494 || hh->eh.root.type == bfd_link_hash_defweak
1495 || !hh->eh.def_regular))))
4fc8051d
AM
1496 || (ELIMINATE_COPY_RELOCS
1497 && !info->shared
446f2863 1498 && (sec->flags & SEC_ALLOC) != 0
875c0872 1499 && hh != NULL
a63e02c7
DA
1500 && (hh->eh.root.type == bfd_link_hash_defweak
1501 || !hh->eh.def_regular)))
30667bf3 1502 {
875c0872
DA
1503 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1504 struct elf32_hppa_dyn_reloc_entry **hdh_head;
ec338859 1505
30667bf3
AM
1506 /* Create a reloc section in dynobj and make room for
1507 this reloc. */
98ceb8ce 1508 if (sreloc == NULL)
30667bf3 1509 {
a63e02c7
DA
1510 if (htab->etab.dynobj == NULL)
1511 htab->etab.dynobj = abfd;
3ac8354b 1512
83bac4b0
NC
1513 sreloc = _bfd_elf_make_dynamic_reloc_section
1514 (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1515
98ceb8ce 1516 if (sreloc == NULL)
30667bf3 1517 {
83bac4b0
NC
1518 bfd_set_error (bfd_error_bad_value);
1519 return FALSE;
30667bf3 1520 }
30667bf3
AM
1521 }
1522
98ceb8ce
AM
1523 /* If this is a global symbol, we count the number of
1524 relocations we need for this symbol. */
875c0872 1525 if (hh != NULL)
30667bf3 1526 {
875c0872 1527 hdh_head = &hh->dyn_relocs;
ec338859
AM
1528 }
1529 else
1530 {
1531 /* Track dynamic relocs needed for local syms too.
1532 We really need local syms available to do this
1533 easily. Oh well. */
875c0872 1534 asection *sr;
6edfbbad 1535 void *vpp;
87d72d41 1536 Elf_Internal_Sym *isym;
6edfbbad 1537
87d72d41
AM
1538 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1539 abfd, r_symndx);
1540 if (isym == NULL)
b34976b6 1541 return FALSE;
30667bf3 1542
87d72d41
AM
1543 sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1544 if (sr == NULL)
1545 sr = sec;
1546
6edfbbad
DJ
1547 vpp = &elf_section_data (sr)->local_dynrel;
1548 hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
ec338859
AM
1549 }
1550
875c0872
DA
1551 hdh_p = *hdh_head;
1552 if (hdh_p == NULL || hdh_p->sec != sec)
ec338859 1553 {
a63e02c7 1554 hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
875c0872 1555 if (hdh_p == NULL)
b34976b6 1556 return FALSE;
a63e02c7 1557 hdh_p->hdh_next = *hdh_head;
875c0872
DA
1558 *hdh_head = hdh_p;
1559 hdh_p->sec = sec;
1560 hdh_p->count = 0;
98ceb8ce 1561#if RELATIVE_DYNRELOCS
875c0872 1562 hdh_p->relative_count = 0;
98ceb8ce 1563#endif
ec338859 1564 }
98ceb8ce 1565
875c0872 1566 hdh_p->count += 1;
98ceb8ce 1567#if RELATIVE_DYNRELOCS
ec338859 1568 if (!IS_ABSOLUTE_RELOC (rtype))
875c0872 1569 hdh_p->relative_count += 1;
98ceb8ce 1570#endif
30667bf3
AM
1571 }
1572 }
1573 }
edd21aca 1574
b34976b6 1575 return TRUE;
edd21aca
AM
1576}
1577
30667bf3
AM
1578/* Return the section that should be marked against garbage collection
1579 for a given relocation. */
1580
1581static asection *
c39a58e6 1582elf32_hppa_gc_mark_hook (asection *sec,
07adf181 1583 struct bfd_link_info *info,
875c0872
DA
1584 Elf_Internal_Rela *rela,
1585 struct elf_link_hash_entry *hh,
c39a58e6 1586 Elf_Internal_Sym *sym)
30667bf3 1587{
875c0872 1588 if (hh != NULL)
07adf181
AM
1589 switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1590 {
1591 case R_PARISC_GNU_VTINHERIT:
1592 case R_PARISC_GNU_VTENTRY:
1593 return NULL;
1594 }
30667bf3 1595
07adf181 1596 return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
30667bf3
AM
1597}
1598
30667bf3
AM
1599/* Update the got and plt entry reference counts for the section being
1600 removed. */
edd21aca 1601
b34976b6 1602static bfd_boolean
c39a58e6
AM
1603elf32_hppa_gc_sweep_hook (bfd *abfd,
1604 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1605 asection *sec,
1606 const Elf_Internal_Rela *relocs)
edd21aca 1607{
30667bf3 1608 Elf_Internal_Shdr *symtab_hdr;
875c0872 1609 struct elf_link_hash_entry **eh_syms;
30667bf3 1610 bfd_signed_vma *local_got_refcounts;
74d1c347 1611 bfd_signed_vma *local_plt_refcounts;
875c0872 1612 const Elf_Internal_Rela *rela, *relend;
4dfe6ac6 1613 struct elf32_hppa_link_hash_table *htab;
30667bf3 1614
7dda2462
TG
1615 if (info->relocatable)
1616 return TRUE;
1617
4dfe6ac6
NC
1618 htab = hppa_link_hash_table (info);
1619 if (htab == NULL)
1620 return FALSE;
1621
ec338859 1622 elf_section_data (sec)->local_dynrel = NULL;
98ceb8ce 1623
30667bf3 1624 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
875c0872 1625 eh_syms = elf_sym_hashes (abfd);
30667bf3 1626 local_got_refcounts = elf_local_got_refcounts (abfd);
74d1c347
AM
1627 local_plt_refcounts = local_got_refcounts;
1628 if (local_plt_refcounts != NULL)
1629 local_plt_refcounts += symtab_hdr->sh_info;
30667bf3 1630
30667bf3 1631 relend = relocs + sec->reloc_count;
875c0872 1632 for (rela = relocs; rela < relend; rela++)
26e41594
AM
1633 {
1634 unsigned long r_symndx;
1635 unsigned int r_type;
875c0872 1636 struct elf_link_hash_entry *eh = NULL;
26e41594 1637
875c0872 1638 r_symndx = ELF32_R_SYM (rela->r_info);
26e41594
AM
1639 if (r_symndx >= symtab_hdr->sh_info)
1640 {
875c0872
DA
1641 struct elf32_hppa_link_hash_entry *hh;
1642 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1643 struct elf32_hppa_dyn_reloc_entry *hdh_p;
26e41594 1644
875c0872
DA
1645 eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1646 while (eh->root.type == bfd_link_hash_indirect
1647 || eh->root.type == bfd_link_hash_warning)
1648 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1649 hh = hppa_elf_hash_entry (eh);
26e41594 1650
a63e02c7 1651 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
875c0872 1652 if (hdh_p->sec == sec)
26e41594
AM
1653 {
1654 /* Everything must go for SEC. */
a63e02c7 1655 *hdh_pp = hdh_p->hdh_next;
26e41594
AM
1656 break;
1657 }
1658 }
1659
875c0872 1660 r_type = ELF32_R_TYPE (rela->r_info);
9b52905e
NC
1661 r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1662
26e41594
AM
1663 switch (r_type)
1664 {
1665 case R_PARISC_DLTIND14F:
1666 case R_PARISC_DLTIND14R:
1667 case R_PARISC_DLTIND21L:
9b52905e
NC
1668 case R_PARISC_TLS_GD21L:
1669 case R_PARISC_TLS_GD14R:
1670 case R_PARISC_TLS_IE21L:
1671 case R_PARISC_TLS_IE14R:
875c0872 1672 if (eh != NULL)
26e41594 1673 {
875c0872
DA
1674 if (eh->got.refcount > 0)
1675 eh->got.refcount -= 1;
26e41594
AM
1676 }
1677 else if (local_got_refcounts != NULL)
1678 {
1679 if (local_got_refcounts[r_symndx] > 0)
1680 local_got_refcounts[r_symndx] -= 1;
1681 }
1682 break;
98ceb8ce 1683
9b52905e
NC
1684 case R_PARISC_TLS_LDM21L:
1685 case R_PARISC_TLS_LDM14R:
4dfe6ac6 1686 htab->tls_ldm_got.refcount -= 1;
9b52905e
NC
1687 break;
1688
26e41594
AM
1689 case R_PARISC_PCREL12F:
1690 case R_PARISC_PCREL17C:
1691 case R_PARISC_PCREL17F:
1692 case R_PARISC_PCREL22F:
875c0872 1693 if (eh != NULL)
26e41594 1694 {
875c0872
DA
1695 if (eh->plt.refcount > 0)
1696 eh->plt.refcount -= 1;
26e41594
AM
1697 }
1698 break;
1699
1700 case R_PARISC_PLABEL14R:
1701 case R_PARISC_PLABEL21L:
1702 case R_PARISC_PLABEL32:
875c0872 1703 if (eh != NULL)
26e41594 1704 {
875c0872
DA
1705 if (eh->plt.refcount > 0)
1706 eh->plt.refcount -= 1;
26e41594
AM
1707 }
1708 else if (local_plt_refcounts != NULL)
1709 {
1710 if (local_plt_refcounts[r_symndx] > 0)
1711 local_plt_refcounts[r_symndx] -= 1;
1712 }
1713 break;
1714
1715 default:
1716 break;
1717 }
1718 }
252b5132 1719
b34976b6 1720 return TRUE;
252b5132
RH
1721}
1722
edfc032f
AM
1723/* Support for core dump NOTE sections. */
1724
1725static bfd_boolean
1726elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1727{
1728 int offset;
1729 size_t size;
1730
1731 switch (note->descsz)
1732 {
1733 default:
1734 return FALSE;
1735
1736 case 396: /* Linux/hppa */
1737 /* pr_cursig */
1738 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1739
1740 /* pr_pid */
1741 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1742
1743 /* pr_reg */
1744 offset = 72;
1745 size = 320;
1746
1747 break;
1748 }
1749
1750 /* Make a ".reg/999" section. */
1751 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1752 size, note->descpos + offset);
1753}
1754
1755static bfd_boolean
1756elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1757{
1758 switch (note->descsz)
1759 {
1760 default:
1761 return FALSE;
1762
1763 case 124: /* Linux/hppa elf_prpsinfo. */
1764 elf_tdata (abfd)->core_program
1765 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1766 elf_tdata (abfd)->core_command
1767 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1768 }
1769
1770 /* Note that for some reason, a spurious space is tacked
1771 onto the end of the args in some (at least one anyway)
1772 implementations, so strip it off if it exists. */
1773 {
1774 char *command = elf_tdata (abfd)->core_command;
1775 int n = strlen (command);
1776
1777 if (0 < n && command[n - 1] == ' ')
1778 command[n - 1] = '\0';
1779 }
1780
1781 return TRUE;
1782}
1783
74d1c347
AM
1784/* Our own version of hide_symbol, so that we can keep plt entries for
1785 plabels. */
1786
1787static void
c39a58e6 1788elf32_hppa_hide_symbol (struct bfd_link_info *info,
875c0872 1789 struct elf_link_hash_entry *eh,
c39a58e6 1790 bfd_boolean force_local)
74d1c347 1791{
e5094212
AM
1792 if (force_local)
1793 {
875c0872
DA
1794 eh->forced_local = 1;
1795 if (eh->dynindx != -1)
e5094212 1796 {
875c0872 1797 eh->dynindx = -1;
e5094212 1798 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
875c0872 1799 eh->dynstr_index);
e5094212
AM
1800 }
1801 }
1802
9b52905e 1803 if (! hppa_elf_hash_entry (eh)->plabel)
74d1c347 1804 {
875c0872
DA
1805 eh->needs_plt = 0;
1806 eh->plt = elf_hash_table (info)->init_plt_refcount;
74d1c347
AM
1807 }
1808}
1809
30667bf3
AM
1810/* Adjust a symbol defined by a dynamic object and referenced by a
1811 regular object. The current definition is in some section of the
1812 dynamic object, but we're not including those sections. We have to
1813 change the definition to something the rest of the link can
1814 understand. */
252b5132 1815
b34976b6 1816static bfd_boolean
c39a58e6 1817elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
875c0872 1818 struct elf_link_hash_entry *eh)
252b5132 1819{
83c81bfe 1820 struct elf32_hppa_link_hash_table *htab;
875c0872 1821 asection *sec;
30667bf3
AM
1822
1823 /* If this is a function, put it in the procedure linkage table. We
067fa4a6 1824 will fill in the contents of the procedure linkage table later. */
875c0872
DA
1825 if (eh->type == STT_FUNC
1826 || eh->needs_plt)
30667bf3 1827 {
875c0872
DA
1828 if (eh->plt.refcount <= 0
1829 || (eh->def_regular
1830 && eh->root.type != bfd_link_hash_defweak
1831 && ! hppa_elf_hash_entry (eh)->plabel
30667bf3
AM
1832 && (!info->shared || info->symbolic)))
1833 {
1834 /* The .plt entry is not needed when:
1835 a) Garbage collection has removed all references to the
1836 symbol, or
1837 b) We know for certain the symbol is defined in this
74d1c347
AM
1838 object, and it's not a weak definition, nor is the symbol
1839 used by a plabel relocation. Either this object is the
1840 application or we are doing a shared symbolic link. */
1841
875c0872
DA
1842 eh->plt.offset = (bfd_vma) -1;
1843 eh->needs_plt = 0;
30667bf3 1844 }
4dc86686 1845
b34976b6 1846 return TRUE;
30667bf3 1847 }
bbd7ec4a 1848 else
875c0872 1849 eh->plt.offset = (bfd_vma) -1;
edd21aca 1850
30667bf3
AM
1851 /* If this is a weak symbol, and there is a real definition, the
1852 processor independent code will have arranged for us to see the
1853 real definition first, and we can just use the same value. */
875c0872 1854 if (eh->u.weakdef != NULL)
edd21aca 1855 {
875c0872
DA
1856 if (eh->u.weakdef->root.type != bfd_link_hash_defined
1857 && eh->u.weakdef->root.type != bfd_link_hash_defweak)
49e9d0d3 1858 abort ();
875c0872
DA
1859 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1860 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
4fc8051d 1861 if (ELIMINATE_COPY_RELOCS)
875c0872 1862 eh->non_got_ref = eh->u.weakdef->non_got_ref;
b34976b6 1863 return TRUE;
30667bf3 1864 }
edd21aca 1865
30667bf3
AM
1866 /* This is a reference to a symbol defined by a dynamic object which
1867 is not a function. */
1868
1869 /* If we are creating a shared library, we must presume that the
1870 only references to the symbol are via the global offset table.
1871 For such cases we need not do anything here; the relocations will
1872 be handled correctly by relocate_section. */
1873 if (info->shared)
b34976b6 1874 return TRUE;
30667bf3
AM
1875
1876 /* If there are no references to this symbol that do not use the
1877 GOT, we don't need to generate a copy reloc. */
875c0872 1878 if (!eh->non_got_ref)
b34976b6 1879 return TRUE;
30667bf3 1880
4fc8051d 1881 if (ELIMINATE_COPY_RELOCS)
ebe50bae 1882 {
875c0872
DA
1883 struct elf32_hppa_link_hash_entry *hh;
1884 struct elf32_hppa_dyn_reloc_entry *hdh_p;
ebe50bae 1885
875c0872 1886 hh = hppa_elf_hash_entry (eh);
a63e02c7 1887 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
4fc8051d 1888 {
875c0872
DA
1889 sec = hdh_p->sec->output_section;
1890 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
4fc8051d
AM
1891 break;
1892 }
1893
1894 /* If we didn't find any dynamic relocs in read-only sections, then
1895 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
875c0872 1896 if (hdh_p == NULL)
4fc8051d 1897 {
875c0872 1898 eh->non_got_ref = 0;
4fc8051d
AM
1899 return TRUE;
1900 }
ebe50bae
AM
1901 }
1902
909272ee
AM
1903 if (eh->size == 0)
1904 {
1905 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1906 eh->root.root.string);
1907 return TRUE;
1908 }
1909
30667bf3
AM
1910 /* We must allocate the symbol in our .dynbss section, which will
1911 become part of the .bss section of the executable. There will be
1912 an entry for this symbol in the .dynsym section. The dynamic
1913 object will contain position independent code, so all references
1914 from the dynamic object to this symbol will go through the global
1915 offset table. The dynamic linker will use the .dynsym entry to
1916 determine the address it must put in the global offset table, so
1917 both the dynamic object and the regular object will refer to the
1918 same memory location for the variable. */
1919
3ac8354b 1920 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1921 if (htab == NULL)
1922 return FALSE;
30667bf3
AM
1923
1924 /* We must generate a COPY reloc to tell the dynamic linker to
1925 copy the initial value out of the dynamic object and into the
3ac8354b 1926 runtime process image. */
875c0872 1927 if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
30667bf3 1928 {
eea6121a 1929 htab->srelbss->size += sizeof (Elf32_External_Rela);
875c0872 1930 eh->needs_copy = 1;
edd21aca 1931 }
252b5132 1932
875c0872 1933 sec = htab->sdynbss;
edd21aca 1934
027297b7 1935 return _bfd_elf_adjust_dynamic_copy (eh, sec);
252b5132
RH
1936}
1937
e5ee5df1 1938/* Allocate space in the .plt for entries that won't have relocations.
a252afa4 1939 ie. plabel entries. */
a8d02d66 1940
b34976b6 1941static bfd_boolean
875c0872 1942allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
a8d02d66
AM
1943{
1944 struct bfd_link_info *info;
1945 struct elf32_hppa_link_hash_table *htab;
875c0872
DA
1946 struct elf32_hppa_link_hash_entry *hh;
1947 asection *sec;
a8d02d66 1948
875c0872 1949 if (eh->root.type == bfd_link_hash_indirect)
b34976b6 1950 return TRUE;
a8d02d66 1951
875c0872
DA
1952 if (eh->root.type == bfd_link_hash_warning)
1953 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
e92d460e 1954
875c0872 1955 info = (struct bfd_link_info *) inf;
9b52905e 1956 hh = hppa_elf_hash_entry (eh);
a8d02d66 1957 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1958 if (htab == NULL)
1959 return FALSE;
1960
a63e02c7 1961 if (htab->etab.dynamic_sections_created
875c0872 1962 && eh->plt.refcount > 0)
e5ee5df1
AM
1963 {
1964 /* Make sure this symbol is output as a dynamic symbol.
1965 Undefined weak syms won't yet be marked as dynamic. */
875c0872
DA
1966 if (eh->dynindx == -1
1967 && !eh->forced_local
1968 && eh->type != STT_PARISC_MILLI)
a8d02d66 1969 {
875c0872 1970 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
b34976b6 1971 return FALSE;
e5ee5df1
AM
1972 }
1973
875c0872 1974 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
e5ee5df1 1975 {
067fa4a6
AM
1976 /* Allocate these later. From this point on, h->plabel
1977 means that the plt entry is only used by a plabel.
1978 We'll be using a normal plt entry for this symbol, so
1979 clear the plabel indicator. */
875c0872
DA
1980
1981 hh->plabel = 0;
e5ee5df1 1982 }
875c0872 1983 else if (hh->plabel)
e5ee5df1
AM
1984 {
1985 /* Make an entry in the .plt section for plabel references
1986 that won't have a .plt entry for other reasons. */
875c0872
DA
1987 sec = htab->splt;
1988 eh->plt.offset = sec->size;
1989 sec->size += PLT_ENTRY_SIZE;
a8d02d66
AM
1990 }
1991 else
e5ee5df1
AM
1992 {
1993 /* No .plt entry needed. */
875c0872
DA
1994 eh->plt.offset = (bfd_vma) -1;
1995 eh->needs_plt = 0;
e5ee5df1
AM
1996 }
1997 }
1998 else
1999 {
875c0872
DA
2000 eh->plt.offset = (bfd_vma) -1;
2001 eh->needs_plt = 0;
a8d02d66
AM
2002 }
2003
b34976b6 2004 return TRUE;
a8d02d66
AM
2005}
2006
4dc86686
AM
2007/* Allocate space in .plt, .got and associated reloc sections for
2008 global syms. */
2009
b34976b6 2010static bfd_boolean
875c0872 2011allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
4dc86686
AM
2012{
2013 struct bfd_link_info *info;
83c81bfe 2014 struct elf32_hppa_link_hash_table *htab;
875c0872
DA
2015 asection *sec;
2016 struct elf32_hppa_link_hash_entry *hh;
2017 struct elf32_hppa_dyn_reloc_entry *hdh_p;
4dc86686 2018
875c0872 2019 if (eh->root.type == bfd_link_hash_indirect)
b34976b6 2020 return TRUE;
73a74a62 2021
875c0872
DA
2022 if (eh->root.type == bfd_link_hash_warning)
2023 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
e92d460e 2024
c39a58e6 2025 info = inf;
83c81bfe 2026 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
2027 if (htab == NULL)
2028 return FALSE;
2029
875c0872
DA
2030 hh = hppa_elf_hash_entry (eh);
2031
a63e02c7 2032 if (htab->etab.dynamic_sections_created
875c0872
DA
2033 && eh->plt.offset != (bfd_vma) -1
2034 && !hh->plabel
2035 && eh->plt.refcount > 0)
4dc86686 2036 {
e5ee5df1 2037 /* Make an entry in the .plt section. */
875c0872
DA
2038 sec = htab->splt;
2039 eh->plt.offset = sec->size;
2040 sec->size += PLT_ENTRY_SIZE;
3ac8354b 2041
e5ee5df1 2042 /* We also need to make an entry in the .rela.plt section. */
eea6121a 2043 htab->srelplt->size += sizeof (Elf32_External_Rela);
e5ee5df1 2044 htab->need_plt_stub = 1;
4dc86686 2045 }
edd21aca 2046
875c0872 2047 if (eh->got.refcount > 0)
4dc86686 2048 {
446f2863
AM
2049 /* Make sure this symbol is output as a dynamic symbol.
2050 Undefined weak syms won't yet be marked as dynamic. */
875c0872
DA
2051 if (eh->dynindx == -1
2052 && !eh->forced_local
2053 && eh->type != STT_PARISC_MILLI)
446f2863 2054 {
875c0872 2055 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
b34976b6 2056 return FALSE;
446f2863
AM
2057 }
2058
875c0872
DA
2059 sec = htab->sgot;
2060 eh->got.offset = sec->size;
2061 sec->size += GOT_ENTRY_SIZE;
9b52905e
NC
2062 /* R_PARISC_TLS_GD* needs two GOT entries */
2063 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2064 sec->size += GOT_ENTRY_SIZE * 2;
2065 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2066 sec->size += GOT_ENTRY_SIZE;
a63e02c7 2067 if (htab->etab.dynamic_sections_created
ce757d15 2068 && (info->shared
875c0872
DA
2069 || (eh->dynindx != -1
2070 && !eh->forced_local)))
ce757d15 2071 {
eea6121a 2072 htab->srelgot->size += sizeof (Elf32_External_Rela);
9b52905e
NC
2073 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2074 htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2075 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2076 htab->srelgot->size += sizeof (Elf32_External_Rela);
ce757d15 2077 }
4dc86686
AM
2078 }
2079 else
875c0872 2080 eh->got.offset = (bfd_vma) -1;
30667bf3 2081
875c0872 2082 if (hh->dyn_relocs == NULL)
b34976b6 2083 return TRUE;
30667bf3 2084
98ceb8ce
AM
2085 /* If this is a -Bsymbolic shared link, then we need to discard all
2086 space allocated for dynamic pc-relative relocs against symbols
2087 defined in a regular object. For the normal shared case, discard
2088 space for relocs that have become local due to symbol visibility
2089 changes. */
2090 if (info->shared)
446f2863 2091 {
98ceb8ce 2092#if RELATIVE_DYNRELOCS
875c0872 2093 if (SYMBOL_CALLS_LOCAL (info, eh))
446f2863 2094 {
875c0872 2095 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
30667bf3 2096
875c0872 2097 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
98ceb8ce 2098 {
875c0872
DA
2099 hdh_p->count -= hdh_p->relative_count;
2100 hdh_p->relative_count = 0;
2101 if (hdh_p->count == 0)
a63e02c7 2102 *hdh_pp = hdh_p->hdh_next;
98ceb8ce 2103 else
a63e02c7 2104 hdh_pp = &hdh_p->hdh_next;
98ceb8ce
AM
2105 }
2106 }
2107#endif
4fc8051d
AM
2108
2109 /* Also discard relocs on undefined weak syms with non-default
2110 visibility. */
22d606e9 2111 if (hh->dyn_relocs != NULL
875c0872 2112 && eh->root.type == bfd_link_hash_undefweak)
22d606e9
AM
2113 {
2114 if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2115 hh->dyn_relocs = NULL;
2116
2117 /* Make sure undefined weak symbols are output as a dynamic
2118 symbol in PIEs. */
2119 else if (eh->dynindx == -1
2120 && !eh->forced_local)
2121 {
2122 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2123 return FALSE;
2124 }
2125 }
446f2863 2126 }
98ceb8ce 2127 else
30667bf3 2128 {
98ceb8ce
AM
2129 /* For the non-shared case, discard space for relocs against
2130 symbols which turn out to need copy relocs or are not
2131 dynamic. */
875c0872
DA
2132
2133 if (!eh->non_got_ref
4fc8051d 2134 && ((ELIMINATE_COPY_RELOCS
875c0872
DA
2135 && eh->def_dynamic
2136 && !eh->def_regular)
a63e02c7 2137 || (htab->etab.dynamic_sections_created
875c0872
DA
2138 && (eh->root.type == bfd_link_hash_undefweak
2139 || eh->root.type == bfd_link_hash_undefined))))
98ceb8ce
AM
2140 {
2141 /* Make sure this symbol is output as a dynamic symbol.
2142 Undefined weak syms won't yet be marked as dynamic. */
875c0872
DA
2143 if (eh->dynindx == -1
2144 && !eh->forced_local
2145 && eh->type != STT_PARISC_MILLI)
98ceb8ce 2146 {
875c0872 2147 if (! bfd_elf_link_record_dynamic_symbol (info, eh))
b34976b6 2148 return FALSE;
98ceb8ce
AM
2149 }
2150
2151 /* If that succeeded, we know we'll be keeping all the
2152 relocs. */
875c0872 2153 if (eh->dynindx != -1)
98ceb8ce
AM
2154 goto keep;
2155 }
446f2863 2156
875c0872 2157 hh->dyn_relocs = NULL;
b34976b6 2158 return TRUE;
98ceb8ce 2159
ec338859 2160 keep: ;
30667bf3 2161 }
30667bf3 2162
98ceb8ce 2163 /* Finally, allocate space. */
a63e02c7 2164 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
30667bf3 2165 {
875c0872
DA
2166 asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2167 sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
30667bf3 2168 }
30667bf3 2169
b34976b6 2170 return TRUE;
30667bf3 2171}
30667bf3 2172
d5c73c2f
AM
2173/* This function is called via elf_link_hash_traverse to force
2174 millicode symbols local so they do not end up as globals in the
2175 dynamic symbol table. We ought to be able to do this in
2176 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2177 for all dynamic symbols. Arguably, this is a bug in
2178 elf_adjust_dynamic_symbol. */
2179
b34976b6 2180static bfd_boolean
875c0872 2181clobber_millicode_symbols (struct elf_link_hash_entry *eh,
c39a58e6 2182 struct bfd_link_info *info)
d5c73c2f 2183{
875c0872
DA
2184 if (eh->root.type == bfd_link_hash_warning)
2185 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
e92d460e 2186
875c0872
DA
2187 if (eh->type == STT_PARISC_MILLI
2188 && !eh->forced_local)
e0522e89 2189 {
875c0872 2190 elf32_hppa_hide_symbol (info, eh, TRUE);
e0522e89 2191 }
b34976b6 2192 return TRUE;
d5c73c2f
AM
2193}
2194
98ceb8ce
AM
2195/* Find any dynamic relocs that apply to read-only sections. */
2196
b34976b6 2197static bfd_boolean
875c0872 2198readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
98ceb8ce 2199{
875c0872
DA
2200 struct elf32_hppa_link_hash_entry *hh;
2201 struct elf32_hppa_dyn_reloc_entry *hdh_p;
98ceb8ce 2202
875c0872
DA
2203 if (eh->root.type == bfd_link_hash_warning)
2204 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
e92d460e 2205
875c0872 2206 hh = hppa_elf_hash_entry (eh);
a63e02c7 2207 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
98ceb8ce 2208 {
875c0872 2209 asection *sec = hdh_p->sec->output_section;
98ceb8ce 2210
875c0872 2211 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
98ceb8ce 2212 {
c39a58e6 2213 struct bfd_link_info *info = inf;
98ceb8ce
AM
2214
2215 info->flags |= DF_TEXTREL;
2216
2217 /* Not an error, just cut short the traversal. */
b34976b6 2218 return FALSE;
98ceb8ce
AM
2219 }
2220 }
b34976b6 2221 return TRUE;
98ceb8ce
AM
2222}
2223
30667bf3
AM
2224/* Set the sizes of the dynamic sections. */
2225
b34976b6 2226static bfd_boolean
c39a58e6
AM
2227elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2228 struct bfd_link_info *info)
30667bf3 2229{
83c81bfe 2230 struct elf32_hppa_link_hash_table *htab;
30667bf3 2231 bfd *dynobj;
98ceb8ce 2232 bfd *ibfd;
875c0872 2233 asection *sec;
b34976b6 2234 bfd_boolean relocs;
30667bf3 2235
83c81bfe 2236 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
2237 if (htab == NULL)
2238 return FALSE;
2239
a63e02c7 2240 dynobj = htab->etab.dynobj;
49e9d0d3
AM
2241 if (dynobj == NULL)
2242 abort ();
30667bf3 2243
a63e02c7 2244 if (htab->etab.dynamic_sections_created)
30667bf3
AM
2245 {
2246 /* Set the contents of the .interp section to the interpreter. */
893c4fe2 2247 if (info->executable)
30667bf3 2248 {
875c0872
DA
2249 sec = bfd_get_section_by_name (dynobj, ".interp");
2250 if (sec == NULL)
49e9d0d3 2251 abort ();
875c0872
DA
2252 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2253 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
30667bf3 2254 }
74d1c347 2255
d5c73c2f 2256 /* Force millicode symbols local. */
a63e02c7 2257 elf_link_hash_traverse (&htab->etab,
d5c73c2f
AM
2258 clobber_millicode_symbols,
2259 info);
68fb2e56 2260 }
d5c73c2f 2261
98ceb8ce
AM
2262 /* Set up .got and .plt offsets for local syms, and space for local
2263 dynamic relocs. */
2264 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
68fb2e56
AM
2265 {
2266 bfd_signed_vma *local_got;
2267 bfd_signed_vma *end_local_got;
2268 bfd_signed_vma *local_plt;
2269 bfd_signed_vma *end_local_plt;
2270 bfd_size_type locsymcount;
2271 Elf_Internal_Shdr *symtab_hdr;
2272 asection *srel;
9b52905e 2273 char *local_tls_type;
74d1c347 2274
98ceb8ce 2275 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
68fb2e56 2276 continue;
4dc86686 2277
875c0872 2278 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
98ceb8ce 2279 {
875c0872 2280 struct elf32_hppa_dyn_reloc_entry *hdh_p;
98ceb8ce 2281
875c0872
DA
2282 for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2283 elf_section_data (sec)->local_dynrel);
2284 hdh_p != NULL;
a63e02c7 2285 hdh_p = hdh_p->hdh_next)
98ceb8ce 2286 {
875c0872
DA
2287 if (!bfd_is_abs_section (hdh_p->sec)
2288 && bfd_is_abs_section (hdh_p->sec->output_section))
ec338859
AM
2289 {
2290 /* Input section has been discarded, either because
2291 it is a copy of a linkonce section or due to
2292 linker script /DISCARD/, so we'll be discarding
2293 the relocs too. */
2294 }
875c0872 2295 else if (hdh_p->count != 0)
ec338859 2296 {
875c0872
DA
2297 srel = elf_section_data (hdh_p->sec)->sreloc;
2298 srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2299 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
248866a8 2300 info->flags |= DF_TEXTREL;
ec338859 2301 }
98ceb8ce
AM
2302 }
2303 }
2304
2305 local_got = elf_local_got_refcounts (ibfd);
68fb2e56
AM
2306 if (!local_got)
2307 continue;
74d1c347 2308
98ceb8ce 2309 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
68fb2e56
AM
2310 locsymcount = symtab_hdr->sh_info;
2311 end_local_got = local_got + locsymcount;
9b52905e 2312 local_tls_type = hppa_elf_local_got_tls_type (ibfd);
875c0872 2313 sec = htab->sgot;
83c81bfe 2314 srel = htab->srelgot;
68fb2e56
AM
2315 for (; local_got < end_local_got; ++local_got)
2316 {
2317 if (*local_got > 0)
4dc86686 2318 {
875c0872
DA
2319 *local_got = sec->size;
2320 sec->size += GOT_ENTRY_SIZE;
9b52905e
NC
2321 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2322 sec->size += 2 * GOT_ENTRY_SIZE;
2323 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2324 sec->size += GOT_ENTRY_SIZE;
875c0872 2325 if (info->shared)
9b52905e
NC
2326 {
2327 srel->size += sizeof (Elf32_External_Rela);
2328 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2329 srel->size += 2 * sizeof (Elf32_External_Rela);
2330 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2331 srel->size += sizeof (Elf32_External_Rela);
2332 }
4dc86686 2333 }
68fb2e56
AM
2334 else
2335 *local_got = (bfd_vma) -1;
9b52905e
NC
2336
2337 ++local_tls_type;
68fb2e56 2338 }
74d1c347 2339
68fb2e56
AM
2340 local_plt = end_local_got;
2341 end_local_plt = local_plt + locsymcount;
a63e02c7 2342 if (! htab->etab.dynamic_sections_created)
68fb2e56
AM
2343 {
2344 /* Won't be used, but be safe. */
2345 for (; local_plt < end_local_plt; ++local_plt)
2346 *local_plt = (bfd_vma) -1;
2347 }
2348 else
2349 {
875c0872 2350 sec = htab->splt;
83c81bfe 2351 srel = htab->srelplt;
74d1c347
AM
2352 for (; local_plt < end_local_plt; ++local_plt)
2353 {
2354 if (*local_plt > 0)
2355 {
875c0872
DA
2356 *local_plt = sec->size;
2357 sec->size += PLT_ENTRY_SIZE;
74d1c347 2358 if (info->shared)
eea6121a 2359 srel->size += sizeof (Elf32_External_Rela);
74d1c347
AM
2360 }
2361 else
2362 *local_plt = (bfd_vma) -1;
2363 }
2364 }
30667bf3 2365 }
9b52905e
NC
2366
2367 if (htab->tls_ldm_got.refcount > 0)
2368 {
2369 /* Allocate 2 got entries and 1 dynamic reloc for
2370 R_PARISC_TLS_DTPMOD32 relocs. */
2371 htab->tls_ldm_got.offset = htab->sgot->size;
2372 htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2373 htab->srelgot->size += sizeof (Elf32_External_Rela);
2374 }
2375 else
2376 htab->tls_ldm_got.offset = -1;
30667bf3 2377
e5ee5df1
AM
2378 /* Do all the .plt entries without relocs first. The dynamic linker
2379 uses the last .plt reloc to find the end of the .plt (and hence
2380 the start of the .got) for lazy linking. */
a63e02c7 2381 elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
a8d02d66 2382
98ceb8ce
AM
2383 /* Allocate global sym .plt and .got entries, and space for global
2384 sym dynamic relocs. */
a63e02c7 2385 elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
30667bf3
AM
2386
2387 /* The check_relocs and adjust_dynamic_symbol entry points have
2388 determined the sizes of the various dynamic sections. Allocate
2389 memory for them. */
b34976b6 2390 relocs = FALSE;
875c0872 2391 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
30667bf3 2392 {
875c0872 2393 if ((sec->flags & SEC_LINKER_CREATED) == 0)
30667bf3
AM
2394 continue;
2395
875c0872 2396 if (sec == htab->splt)
68fb2e56 2397 {
83c81bfe 2398 if (htab->need_plt_stub)
68fb2e56
AM
2399 {
2400 /* Make space for the plt stub at the end of the .plt
2401 section. We want this stub right at the end, up
2402 against the .got section. */
83c81bfe 2403 int gotalign = bfd_section_alignment (dynobj, htab->sgot);
875c0872 2404 int pltalign = bfd_section_alignment (dynobj, sec);
68fb2e56 2405 bfd_size_type mask;
30667bf3 2406
68fb2e56 2407 if (gotalign > pltalign)
875c0872 2408 bfd_set_section_alignment (dynobj, sec, gotalign);
68fb2e56 2409 mask = ((bfd_size_type) 1 << gotalign) - 1;
875c0872 2410 sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
68fb2e56
AM
2411 }
2412 }
c456f082
AM
2413 else if (sec == htab->sgot
2414 || sec == htab->sdynbss)
68fb2e56 2415 ;
0112cd26 2416 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
30667bf3 2417 {
875c0872 2418 if (sec->size != 0)
30667bf3 2419 {
4e12ff7f
AM
2420 /* Remember whether there are any reloc sections other
2421 than .rela.plt. */
875c0872 2422 if (sec != htab->srelplt)
b34976b6 2423 relocs = TRUE;
47d89dba 2424
30667bf3
AM
2425 /* We use the reloc_count field as a counter if we need
2426 to copy relocs into the output file. */
875c0872 2427 sec->reloc_count = 0;
30667bf3
AM
2428 }
2429 }
30667bf3
AM
2430 else
2431 {
2432 /* It's not one of our sections, so don't allocate space. */
2433 continue;
2434 }
2435
875c0872 2436 if (sec->size == 0)
30667bf3
AM
2437 {
2438 /* If we don't need this section, strip it from the
2439 output file. This is mostly to handle .rela.bss and
2440 .rela.plt. We must create both sections in
2441 create_dynamic_sections, because they must be created
2442 before the linker maps input sections to output
2443 sections. The linker does that before
2444 adjust_dynamic_symbol is called, and it is that
2445 function which decides whether anything needs to go
2446 into these sections. */
875c0872 2447 sec->flags |= SEC_EXCLUDE;
30667bf3
AM
2448 continue;
2449 }
2450
c456f082
AM
2451 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2452 continue;
2453
30667bf3
AM
2454 /* Allocate memory for the section contents. Zero it, because
2455 we may not fill in all the reloc sections. */
875c0872 2456 sec->contents = bfd_zalloc (dynobj, sec->size);
c456f082 2457 if (sec->contents == NULL)
b34976b6 2458 return FALSE;
30667bf3
AM
2459 }
2460
a63e02c7 2461 if (htab->etab.dynamic_sections_created)
30667bf3
AM
2462 {
2463 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2464 actually has nothing to do with the PLT, it is how we
2465 communicate the LTP value of a load module to the dynamic
2466 linker. */
dc810e39 2467#define add_dynamic_entry(TAG, VAL) \
5a580b3a 2468 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39
AM
2469
2470 if (!add_dynamic_entry (DT_PLTGOT, 0))
b34976b6 2471 return FALSE;
30667bf3
AM
2472
2473 /* Add some entries to the .dynamic section. We fill in the
2474 values later, in elf32_hppa_finish_dynamic_sections, but we
2475 must add the entries now so that we get the correct size for
2476 the .dynamic section. The DT_DEBUG entry is filled in by the
2477 dynamic linker and used by the debugger. */
3c27d551 2478 if (info->executable)
30667bf3 2479 {
dc810e39 2480 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 2481 return FALSE;
30667bf3
AM
2482 }
2483
eea6121a 2484 if (htab->srelplt->size != 0)
30667bf3 2485 {
dc810e39
AM
2486 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2487 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2488 || !add_dynamic_entry (DT_JMPREL, 0))
b34976b6 2489 return FALSE;
30667bf3
AM
2490 }
2491
2492 if (relocs)
2493 {
dc810e39
AM
2494 if (!add_dynamic_entry (DT_RELA, 0)
2495 || !add_dynamic_entry (DT_RELASZ, 0)
2496 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
b34976b6 2497 return FALSE;
30667bf3 2498
98ceb8ce
AM
2499 /* If any dynamic relocs apply to a read-only section,
2500 then we need a DT_TEXTREL entry. */
248866a8 2501 if ((info->flags & DF_TEXTREL) == 0)
a63e02c7 2502 elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
98ceb8ce
AM
2503
2504 if ((info->flags & DF_TEXTREL) != 0)
2505 {
2506 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 2507 return FALSE;
98ceb8ce 2508 }
30667bf3
AM
2509 }
2510 }
dc810e39 2511#undef add_dynamic_entry
30667bf3 2512
b34976b6 2513 return TRUE;
30667bf3
AM
2514}
2515
30667bf3
AM
2516/* External entry points for sizing and building linker stubs. */
2517
b4655ea9
AM
2518/* Set up various things so that we can make a list of input sections
2519 for each output section included in the link. Returns -1 on error,
cedb70c5 2520 0 when no stubs will be needed, and 1 on success. */
30667bf3 2521
b4655ea9 2522int
c39a58e6 2523elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
30667bf3
AM
2524{
2525 bfd *input_bfd;
b4655ea9
AM
2526 unsigned int bfd_count;
2527 int top_id, top_index;
30667bf3 2528 asection *section;
25f72752 2529 asection **input_list, **list;
dc810e39 2530 bfd_size_type amt;
b4655ea9 2531 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
30667bf3 2532
4dfe6ac6
NC
2533 if (htab == NULL)
2534 return -1;
2535
1badb539
AM
2536 /* Count the number of input BFDs and find the top input section id. */
2537 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
30667bf3
AM
2538 input_bfd != NULL;
2539 input_bfd = input_bfd->link_next)
2540 {
2541 bfd_count += 1;
25f72752
AM
2542 for (section = input_bfd->sections;
2543 section != NULL;
2544 section = section->next)
2545 {
2546 if (top_id < section->id)
2547 top_id = section->id;
2548 }
30667bf3 2549 }
b4655ea9 2550 htab->bfd_count = bfd_count;
30667bf3 2551
dc810e39 2552 amt = sizeof (struct map_stub) * (top_id + 1);
c39a58e6 2553 htab->stub_group = bfd_zmalloc (amt);
83c81bfe 2554 if (htab->stub_group == NULL)
b4655ea9 2555 return -1;
1badb539 2556
b4655ea9 2557 /* We can't use output_bfd->section_count here to find the top output
1badb539 2558 section index as some sections may have been removed, and
8423293d 2559 strip_excluded_output_sections doesn't renumber the indices. */
1badb539
AM
2560 for (section = output_bfd->sections, top_index = 0;
2561 section != NULL;
2562 section = section->next)
2563 {
2564 if (top_index < section->index)
2565 top_index = section->index;
2566 }
2567
b4655ea9 2568 htab->top_index = top_index;
dc810e39 2569 amt = sizeof (asection *) * (top_index + 1);
c39a58e6 2570 input_list = bfd_malloc (amt);
b4655ea9 2571 htab->input_list = input_list;
25f72752 2572 if (input_list == NULL)
b4655ea9 2573 return -1;
25f72752 2574
1badb539
AM
2575 /* For sections we aren't interested in, mark their entries with a
2576 value we can check later. */
2577 list = input_list + top_index;
2578 do
2579 *list = bfd_abs_section_ptr;
2580 while (list-- != input_list);
2581
2582 for (section = output_bfd->sections;
2583 section != NULL;
2584 section = section->next)
2585 {
47d89dba 2586 if ((section->flags & SEC_CODE) != 0)
1badb539
AM
2587 input_list[section->index] = NULL;
2588 }
2589
b4655ea9
AM
2590 return 1;
2591}
2592
2593/* The linker repeatedly calls this function for each input section,
2594 in the order that input sections are linked into output sections.
2595 Build lists of input sections to determine groupings between which
2596 we may insert linker stubs. */
2597
2598void
c39a58e6 2599elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
b4655ea9
AM
2600{
2601 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2602
4dfe6ac6
NC
2603 if (htab == NULL)
2604 return;
2605
b4655ea9 2606 if (isec->output_section->index <= htab->top_index)
25f72752 2607 {
b4655ea9
AM
2608 asection **list = htab->input_list + isec->output_section->index;
2609 if (*list != bfd_abs_section_ptr)
25f72752 2610 {
b4655ea9 2611 /* Steal the link_sec pointer for our list. */
83c81bfe 2612#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
b4655ea9
AM
2613 /* This happens to make the list in reverse order,
2614 which is what we want. */
2615 PREV_SEC (isec) = *list;
2616 *list = isec;
25f72752
AM
2617 }
2618 }
b4655ea9 2619}
25f72752 2620
b4655ea9
AM
2621/* See whether we can group stub sections together. Grouping stub
2622 sections may result in fewer stubs. More importantly, we need to
2623 put all .init* and .fini* stubs at the beginning of the .init or
2624 .fini output sections respectively, because glibc splits the
2625 _init and _fini functions into multiple parts. Putting a stub in
2626 the middle of a function is not a good idea. */
2627
2628static void
c39a58e6
AM
2629group_sections (struct elf32_hppa_link_hash_table *htab,
2630 bfd_size_type stub_group_size,
2631 bfd_boolean stubs_always_before_branch)
b4655ea9
AM
2632{
2633 asection **list = htab->input_list + htab->top_index;
1badb539 2634 do
25f72752
AM
2635 {
2636 asection *tail = *list;
1badb539
AM
2637 if (tail == bfd_abs_section_ptr)
2638 continue;
25f72752
AM
2639 while (tail != NULL)
2640 {
2641 asection *curr;
2642 asection *prev;
2643 bfd_size_type total;
00b28bb0 2644 bfd_boolean big_sec;
25f72752
AM
2645
2646 curr = tail;
eea6121a 2647 total = tail->size;
00b28bb0
AM
2648 big_sec = total >= stub_group_size;
2649
25f72752
AM
2650 while ((prev = PREV_SEC (curr)) != NULL
2651 && ((total += curr->output_offset - prev->output_offset)
47d89dba 2652 < stub_group_size))
25f72752
AM
2653 curr = prev;
2654
2655 /* OK, the size from the start of CURR to the end is less
a248e267 2656 than 240000 bytes and thus can be handled by one stub
25f72752 2657 section. (or the tail section is itself larger than
a248e267 2658 240000 bytes, in which case we may be toast.)
25f72752
AM
2659 We should really be keeping track of the total size of
2660 stubs added here, as stubs contribute to the final output
2661 section size. That's a little tricky, and this way will
a248e267
AM
2662 only break if stubs added total more than 22144 bytes, or
2663 2768 long branch stubs. It seems unlikely for more than
2664 2768 different functions to be called, especially from
2665 code only 240000 bytes long. This limit used to be
2666 250000, but c++ code tends to generate lots of little
2667 functions, and sometimes violated the assumption. */
25f72752
AM
2668 do
2669 {
2670 prev = PREV_SEC (tail);
2671 /* Set up this stub group. */
83c81bfe 2672 htab->stub_group[tail->id].link_sec = curr;
25f72752
AM
2673 }
2674 while (tail != curr && (tail = prev) != NULL);
2675
a248e267 2676 /* But wait, there's more! Input sections up to 240000
00b28bb0
AM
2677 bytes before the stub section can be handled by it too.
2678 Don't do this if we have a really large section after the
2679 stubs, as adding more stubs increases the chance that
2680 branches may not reach into the stub section. */
2681 if (!stubs_always_before_branch && !big_sec)
25f72752 2682 {
47d89dba
AM
2683 total = 0;
2684 while (prev != NULL
2685 && ((total += tail->output_offset - prev->output_offset)
2686 < stub_group_size))
2687 {
2688 tail = prev;
2689 prev = PREV_SEC (tail);
83c81bfe 2690 htab->stub_group[tail->id].link_sec = curr;
47d89dba 2691 }
25f72752
AM
2692 }
2693 tail = prev;
2694 }
2695 }
b4655ea9
AM
2696 while (list-- != htab->input_list);
2697 free (htab->input_list);
1badb539 2698#undef PREV_SEC
b4655ea9
AM
2699}
2700
2701/* Read in all local syms for all input bfds, and create hash entries
2702 for export stubs if we are building a multi-subspace shared lib.
2703 Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2704
2705static int
c39a58e6 2706get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
b4655ea9
AM
2707{
2708 unsigned int bfd_indx;
2709 Elf_Internal_Sym *local_syms, **all_local_syms;
2710 int stub_changed = 0;
2711 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
30667bf3 2712
4dfe6ac6
NC
2713 if (htab == NULL)
2714 return -1;
2715
30667bf3
AM
2716 /* We want to read in symbol extension records only once. To do this
2717 we need to read in the local symbols in parallel and save them for
2718 later use; so hold pointers to the local symbols in an array. */
b4655ea9 2719 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
c39a58e6 2720 all_local_syms = bfd_zmalloc (amt);
b4655ea9 2721 htab->all_local_syms = all_local_syms;
30667bf3 2722 if (all_local_syms == NULL)
b4655ea9 2723 return -1;
30667bf3
AM
2724
2725 /* Walk over all the input BFDs, swapping in local symbols.
2726 If we are creating a shared library, create hash entries for the
2727 export stubs. */
b4655ea9 2728 for (bfd_indx = 0;
30667bf3 2729 input_bfd != NULL;
25f72752 2730 input_bfd = input_bfd->link_next, bfd_indx++)
30667bf3
AM
2731 {
2732 Elf_Internal_Shdr *symtab_hdr;
edd21aca 2733
252b5132
RH
2734 /* We'll need the symbol table in a second. */
2735 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2736 if (symtab_hdr->sh_info == 0)
2737 continue;
2738
6cdc0ccc
AM
2739 /* We need an array of the local symbols attached to the input bfd. */
2740 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
edd21aca 2741 if (local_syms == NULL)
edd21aca 2742 {
6cdc0ccc
AM
2743 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2744 symtab_hdr->sh_info, 0,
2745 NULL, NULL, NULL);
2746 /* Cache them for elf_link_input_bfd. */
2747 symtab_hdr->contents = (unsigned char *) local_syms;
edd21aca 2748 }
6cdc0ccc
AM
2749 if (local_syms == NULL)
2750 return -1;
edd21aca 2751
6cdc0ccc 2752 all_local_syms[bfd_indx] = local_syms;
edd21aca 2753
83c81bfe 2754 if (info->shared && htab->multi_subspace)
30667bf3 2755 {
875c0872
DA
2756 struct elf_link_hash_entry **eh_syms;
2757 struct elf_link_hash_entry **eh_symend;
30667bf3
AM
2758 unsigned int symcount;
2759
2760 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2761 - symtab_hdr->sh_info);
875c0872
DA
2762 eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2763 eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
30667bf3
AM
2764
2765 /* Look through the global syms for functions; We need to
2766 build export stubs for all globally visible functions. */
875c0872 2767 for (; eh_syms < eh_symend; eh_syms++)
30667bf3 2768 {
875c0872 2769 struct elf32_hppa_link_hash_entry *hh;
30667bf3 2770
875c0872 2771 hh = hppa_elf_hash_entry (*eh_syms);
30667bf3 2772
a63e02c7
DA
2773 while (hh->eh.root.type == bfd_link_hash_indirect
2774 || hh->eh.root.type == bfd_link_hash_warning)
2775 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
30667bf3
AM
2776
2777 /* At this point in the link, undefined syms have been
2778 resolved, so we need to check that the symbol was
2779 defined in this BFD. */
a63e02c7
DA
2780 if ((hh->eh.root.type == bfd_link_hash_defined
2781 || hh->eh.root.type == bfd_link_hash_defweak)
2782 && hh->eh.type == STT_FUNC
2783 && hh->eh.root.u.def.section->output_section != NULL
2784 && (hh->eh.root.u.def.section->output_section->owner
25f72752 2785 == output_bfd)
a63e02c7
DA
2786 && hh->eh.root.u.def.section->owner == input_bfd
2787 && hh->eh.def_regular
2788 && !hh->eh.forced_local
2789 && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
30667bf3
AM
2790 {
2791 asection *sec;
2792 const char *stub_name;
875c0872 2793 struct elf32_hppa_stub_hash_entry *hsh;
30667bf3 2794
a63e02c7 2795 sec = hh->eh.root.u.def.section;
9b52905e 2796 stub_name = hh_name (hh);
a63e02c7 2797 hsh = hppa_stub_hash_lookup (&htab->bstab,
30667bf3 2798 stub_name,
b34976b6 2799 FALSE, FALSE);
875c0872 2800 if (hsh == NULL)
30667bf3 2801 {
875c0872
DA
2802 hsh = hppa_add_stub (stub_name, sec, htab);
2803 if (!hsh)
b4655ea9 2804 return -1;
30667bf3 2805
a63e02c7
DA
2806 hsh->target_value = hh->eh.root.u.def.value;
2807 hsh->target_section = hh->eh.root.u.def.section;
875c0872 2808 hsh->stub_type = hppa_stub_export;
a63e02c7 2809 hsh->hh = hh;
30667bf3
AM
2810 stub_changed = 1;
2811 }
2812 else
2813 {
d003868e
AM
2814 (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2815 input_bfd,
8f615d07 2816 stub_name);
30667bf3
AM
2817 }
2818 }
2819 }
30667bf3
AM
2820 }
2821 }
edd21aca 2822
b4655ea9
AM
2823 return stub_changed;
2824}
2825
2826/* Determine and set the size of the stub section for a final link.
2827
2828 The basic idea here is to examine all the relocations looking for
2829 PC-relative calls to a target that is unreachable with a "bl"
2830 instruction. */
2831
b34976b6 2832bfd_boolean
c39a58e6
AM
2833elf32_hppa_size_stubs
2834 (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2835 bfd_boolean multi_subspace, bfd_signed_vma group_size,
2836 asection * (*add_stub_section) (const char *, asection *),
2837 void (*layout_sections_again) (void))
b4655ea9
AM
2838{
2839 bfd_size_type stub_group_size;
b34976b6
AM
2840 bfd_boolean stubs_always_before_branch;
2841 bfd_boolean stub_changed;
b4655ea9
AM
2842 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2843
4dfe6ac6
NC
2844 if (htab == NULL)
2845 return FALSE;
2846
b4655ea9
AM
2847 /* Stash our params away. */
2848 htab->stub_bfd = stub_bfd;
2849 htab->multi_subspace = multi_subspace;
2850 htab->add_stub_section = add_stub_section;
2851 htab->layout_sections_again = layout_sections_again;
2852 stubs_always_before_branch = group_size < 0;
2853 if (group_size < 0)
2854 stub_group_size = -group_size;
2855 else
2856 stub_group_size = group_size;
2857 if (stub_group_size == 1)
2858 {
2859 /* Default values. */
acc990f2
AM
2860 if (stubs_always_before_branch)
2861 {
2862 stub_group_size = 7680000;
2863 if (htab->has_17bit_branch || htab->multi_subspace)
2864 stub_group_size = 240000;
2865 if (htab->has_12bit_branch)
2866 stub_group_size = 7500;
2867 }
2868 else
2869 {
2870 stub_group_size = 6971392;
2871 if (htab->has_17bit_branch || htab->multi_subspace)
2872 stub_group_size = 217856;
2873 if (htab->has_12bit_branch)
2874 stub_group_size = 6808;
2875 }
b4655ea9
AM
2876 }
2877
2878 group_sections (htab, stub_group_size, stubs_always_before_branch);
2879
2880 switch (get_local_syms (output_bfd, info->input_bfds, info))
2881 {
2882 default:
2883 if (htab->all_local_syms)
2884 goto error_ret_free_local;
b34976b6 2885 return FALSE;
b4655ea9
AM
2886
2887 case 0:
b34976b6 2888 stub_changed = FALSE;
b4655ea9
AM
2889 break;
2890
2891 case 1:
b34976b6 2892 stub_changed = TRUE;
b4655ea9
AM
2893 break;
2894 }
2895
edd21aca
AM
2896 while (1)
2897 {
b4655ea9
AM
2898 bfd *input_bfd;
2899 unsigned int bfd_indx;
30667bf3
AM
2900 asection *stub_sec;
2901
25f72752 2902 for (input_bfd = info->input_bfds, bfd_indx = 0;
30667bf3 2903 input_bfd != NULL;
25f72752 2904 input_bfd = input_bfd->link_next, bfd_indx++)
30667bf3
AM
2905 {
2906 Elf_Internal_Shdr *symtab_hdr;
b4655ea9
AM
2907 asection *section;
2908 Elf_Internal_Sym *local_syms;
30667bf3
AM
2909
2910 /* We'll need the symbol table in a second. */
2911 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2912 if (symtab_hdr->sh_info == 0)
2913 continue;
2914
b4655ea9 2915 local_syms = htab->all_local_syms[bfd_indx];
30667bf3
AM
2916
2917 /* Walk over each section attached to the input bfd. */
2918 for (section = input_bfd->sections;
2919 section != NULL;
25f72752 2920 section = section->next)
30667bf3 2921 {
30667bf3
AM
2922 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2923
2924 /* If there aren't any relocs, then there's nothing more
2925 to do. */
2926 if ((section->flags & SEC_RELOC) == 0
2927 || section->reloc_count == 0)
2928 continue;
2929
25f72752
AM
2930 /* If this section is a link-once section that will be
2931 discarded, then don't create any stubs. */
2932 if (section->output_section == NULL
2933 || section->output_section->owner != output_bfd)
2934 continue;
2935
1e2f5b6e
AM
2936 /* Get the relocs. */
2937 internal_relocs
c39a58e6 2938 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 2939 info->keep_memory);
30667bf3 2940 if (internal_relocs == NULL)
1e2f5b6e 2941 goto error_ret_free_local;
30667bf3
AM
2942
2943 /* Now examine each relocation. */
2944 irela = internal_relocs;
2945 irelaend = irela + section->reloc_count;
2946 for (; irela < irelaend; irela++)
2947 {
2948 unsigned int r_type, r_indx;
2949 enum elf32_hppa_stub_type stub_type;
875c0872 2950 struct elf32_hppa_stub_hash_entry *hsh;
30667bf3
AM
2951 asection *sym_sec;
2952 bfd_vma sym_value;
2953 bfd_vma destination;
875c0872 2954 struct elf32_hppa_link_hash_entry *hh;
30667bf3 2955 char *stub_name;
25f72752 2956 const asection *id_sec;
30667bf3
AM
2957
2958 r_type = ELF32_R_TYPE (irela->r_info);
2959 r_indx = ELF32_R_SYM (irela->r_info);
2960
2961 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2962 {
2963 bfd_set_error (bfd_error_bad_value);
1e2f5b6e
AM
2964 error_ret_free_internal:
2965 if (elf_section_data (section)->relocs == NULL)
2966 free (internal_relocs);
2967 goto error_ret_free_local;
30667bf3
AM
2968 }
2969
2970 /* Only look for stubs on call instructions. */
2971 if (r_type != (unsigned int) R_PARISC_PCREL12F
2972 && r_type != (unsigned int) R_PARISC_PCREL17F
2973 && r_type != (unsigned int) R_PARISC_PCREL22F)
2974 continue;
2975
2976 /* Now determine the call target, its name, value,
2977 section. */
2978 sym_sec = NULL;
2979 sym_value = 0;
2980 destination = 0;
875c0872 2981 hh = NULL;
30667bf3
AM
2982 if (r_indx < symtab_hdr->sh_info)
2983 {
2984 /* It's a local symbol. */
2985 Elf_Internal_Sym *sym;
2986 Elf_Internal_Shdr *hdr;
4fbb74a6 2987 unsigned int shndx;
30667bf3
AM
2988
2989 sym = local_syms + r_indx;
30667bf3
AM
2990 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2991 sym_value = sym->st_value;
4fbb74a6
AM
2992 shndx = sym->st_shndx;
2993 if (shndx < elf_numsections (input_bfd))
2994 {
2995 hdr = elf_elfsections (input_bfd)[shndx];
2996 sym_sec = hdr->bfd_section;
2997 destination = (sym_value + irela->r_addend
2998 + sym_sec->output_offset
2999 + sym_sec->output_section->vma);
3000 }
30667bf3
AM
3001 }
3002 else
3003 {
3004 /* It's an external symbol. */
3005 int e_indx;
3006
3007 e_indx = r_indx - symtab_hdr->sh_info;
875c0872 3008 hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
30667bf3 3009
a63e02c7
DA
3010 while (hh->eh.root.type == bfd_link_hash_indirect
3011 || hh->eh.root.type == bfd_link_hash_warning)
3012 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
30667bf3 3013
a63e02c7
DA
3014 if (hh->eh.root.type == bfd_link_hash_defined
3015 || hh->eh.root.type == bfd_link_hash_defweak)
30667bf3 3016 {
a63e02c7
DA
3017 sym_sec = hh->eh.root.u.def.section;
3018 sym_value = hh->eh.root.u.def.value;
30667bf3
AM
3019 if (sym_sec->output_section != NULL)
3020 destination = (sym_value + irela->r_addend
3021 + sym_sec->output_offset
3022 + sym_sec->output_section->vma);
3023 }
a63e02c7 3024 else if (hh->eh.root.type == bfd_link_hash_undefweak)
c432ba1a
AM
3025 {
3026 if (! info->shared)
3027 continue;
3028 }
a63e02c7 3029 else if (hh->eh.root.type == bfd_link_hash_undefined)
c432ba1a 3030 {
59c2e50f 3031 if (! (info->unresolved_syms_in_objects == RM_IGNORE
a63e02c7 3032 && (ELF_ST_VISIBILITY (hh->eh.other)
c432ba1a 3033 == STV_DEFAULT)
a63e02c7 3034 && hh->eh.type != STT_PARISC_MILLI))
c432ba1a
AM
3035 continue;
3036 }
30667bf3
AM
3037 else
3038 {
3039 bfd_set_error (bfd_error_bad_value);
3040 goto error_ret_free_internal;
3041 }
3042 }
3043
3044 /* Determine what (if any) linker stub is needed. */
875c0872 3045 stub_type = hppa_type_of_stub (section, irela, hh,
a252afa4 3046 destination, info);
30667bf3
AM
3047 if (stub_type == hppa_stub_none)
3048 continue;
3049
25f72752 3050 /* Support for grouping stub sections. */
83c81bfe 3051 id_sec = htab->stub_group[section->id].link_sec;
25f72752 3052
30667bf3 3053 /* Get the name of this stub. */
875c0872 3054 stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
30667bf3
AM
3055 if (!stub_name)
3056 goto error_ret_free_internal;
3057
a63e02c7 3058 hsh = hppa_stub_hash_lookup (&htab->bstab,
30667bf3 3059 stub_name,
b34976b6 3060 FALSE, FALSE);
875c0872 3061 if (hsh != NULL)
30667bf3
AM
3062 {
3063 /* The proper stub has already been created. */
3064 free (stub_name);
3065 continue;
3066 }
3067
875c0872
DA
3068 hsh = hppa_add_stub (stub_name, section, htab);
3069 if (hsh == NULL)
30667bf3
AM
3070 {
3071 free (stub_name);
1e2f5b6e 3072 goto error_ret_free_internal;
30667bf3
AM
3073 }
3074
875c0872
DA
3075 hsh->target_value = sym_value;
3076 hsh->target_section = sym_sec;
3077 hsh->stub_type = stub_type;
30667bf3
AM
3078 if (info->shared)
3079 {
3080 if (stub_type == hppa_stub_import)
875c0872 3081 hsh->stub_type = hppa_stub_import_shared;
98ceb8ce 3082 else if (stub_type == hppa_stub_long_branch)
875c0872 3083 hsh->stub_type = hppa_stub_long_branch_shared;
30667bf3 3084 }
a63e02c7 3085 hsh->hh = hh;
b34976b6 3086 stub_changed = TRUE;
30667bf3
AM
3087 }
3088
3089 /* We're done with the internal relocs, free them. */
1e2f5b6e
AM
3090 if (elf_section_data (section)->relocs == NULL)
3091 free (internal_relocs);
30667bf3
AM
3092 }
3093 }
3094
3095 if (!stub_changed)
3096 break;
3097
3098 /* OK, we've added some stubs. Find out the new size of the
3099 stub sections. */
83c81bfe 3100 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
3101 stub_sec != NULL;
3102 stub_sec = stub_sec->next)
eea6121a 3103 stub_sec->size = 0;
74d1c347 3104
a63e02c7 3105 bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
74d1c347 3106
30667bf3 3107 /* Ask the linker to do its stuff. */
83c81bfe 3108 (*htab->layout_sections_again) ();
b34976b6 3109 stub_changed = FALSE;
30667bf3
AM
3110 }
3111
6cdc0ccc 3112 free (htab->all_local_syms);
b34976b6 3113 return TRUE;
30667bf3
AM
3114
3115 error_ret_free_local:
b4655ea9 3116 free (htab->all_local_syms);
b34976b6 3117 return FALSE;
30667bf3
AM
3118}
3119
30667bf3
AM
3120/* For a final link, this function is called after we have sized the
3121 stubs to provide a value for __gp. */
3122
b34976b6 3123bfd_boolean
c39a58e6 3124elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
30667bf3 3125{
b4655ea9
AM
3126 struct bfd_link_hash_entry *h;
3127 asection *sec = NULL;
3128 bfd_vma gp_val = 0;
83c81bfe 3129 struct elf32_hppa_link_hash_table *htab;
30667bf3 3130
83c81bfe 3131 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
3132 if (htab == NULL)
3133 return FALSE;
3134
a63e02c7 3135 h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
30667bf3 3136
df8634e3 3137 if (h != NULL
b4655ea9
AM
3138 && (h->type == bfd_link_hash_defined
3139 || h->type == bfd_link_hash_defweak))
30667bf3 3140 {
b4655ea9
AM
3141 gp_val = h->u.def.value;
3142 sec = h->u.def.section;
30667bf3
AM
3143 }
3144 else
3145 {
0eddce27
AM
3146 asection *splt = bfd_get_section_by_name (abfd, ".plt");
3147 asection *sgot = bfd_get_section_by_name (abfd, ".got");
b4655ea9 3148
74d1c347
AM
3149 /* Choose to point our LTP at, in this order, one of .plt, .got,
3150 or .data, if these sections exist. In the case of choosing
3151 .plt try to make the LTP ideal for addressing anywhere in the
3152 .plt or .got with a 14 bit signed offset. Typically, the end
3153 of the .plt is the start of the .got, so choose .plt + 0x2000
3154 if either the .plt or .got is larger than 0x2000. If both
3155 the .plt and .got are smaller than 0x2000, choose the end of
3156 the .plt section. */
225247f0
JT
3157 sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3158 ? NULL : splt;
74d1c347 3159 if (sec != NULL)
30667bf3 3160 {
eea6121a
AM
3161 gp_val = sec->size;
3162 if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
74d1c347
AM
3163 {
3164 gp_val = 0x2000;
3165 }
3166 }
3167 else
3168 {
b4655ea9 3169 sec = sgot;
74d1c347
AM
3170 if (sec != NULL)
3171 {
225247f0
JT
3172 if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3173 {
3174 /* We know we don't have a .plt. If .got is large,
3175 offset our LTP. */
3176 if (sec->size > 0x2000)
3177 gp_val = 0x2000;
3178 }
74d1c347
AM
3179 }
3180 else
3181 {
3182 /* No .plt or .got. Who cares what the LTP is? */
3183 sec = bfd_get_section_by_name (abfd, ".data");
3184 }
30667bf3 3185 }
df8634e3
AM
3186
3187 if (h != NULL)
3188 {
b4655ea9
AM
3189 h->type = bfd_link_hash_defined;
3190 h->u.def.value = gp_val;
df8634e3 3191 if (sec != NULL)
b4655ea9 3192 h->u.def.section = sec;
df8634e3 3193 else
b4655ea9 3194 h->u.def.section = bfd_abs_section_ptr;
df8634e3 3195 }
30667bf3
AM
3196 }
3197
b32b5d6e 3198 if (sec != NULL && sec->output_section != NULL)
74d1c347
AM
3199 gp_val += sec->output_section->vma + sec->output_offset;
3200
3201 elf_gp (abfd) = gp_val;
b34976b6 3202 return TRUE;
30667bf3
AM
3203}
3204
30667bf3
AM
3205/* Build all the stubs associated with the current output file. The
3206 stubs are kept in a hash table attached to the main linker hash
3207 table. We also set up the .plt entries for statically linked PIC
3208 functions here. This function is called via hppaelf_finish in the
3209 linker. */
3210
b34976b6 3211bfd_boolean
c39a58e6 3212elf32_hppa_build_stubs (struct bfd_link_info *info)
30667bf3
AM
3213{
3214 asection *stub_sec;
3215 struct bfd_hash_table *table;
83c81bfe 3216 struct elf32_hppa_link_hash_table *htab;
30667bf3 3217
83c81bfe 3218 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
3219 if (htab == NULL)
3220 return FALSE;
30667bf3 3221
83c81bfe 3222 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
3223 stub_sec != NULL;
3224 stub_sec = stub_sec->next)
3225 {
dc810e39 3226 bfd_size_type size;
30667bf3
AM
3227
3228 /* Allocate memory to hold the linker stubs. */
eea6121a 3229 size = stub_sec->size;
c39a58e6 3230 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
30667bf3 3231 if (stub_sec->contents == NULL && size != 0)
b34976b6 3232 return FALSE;
eea6121a 3233 stub_sec->size = 0;
30667bf3
AM
3234 }
3235
3236 /* Build the stubs as directed by the stub hash table. */
a63e02c7 3237 table = &htab->bstab;
30667bf3
AM
3238 bfd_hash_traverse (table, hppa_build_one_stub, info);
3239
b34976b6 3240 return TRUE;
30667bf3
AM
3241}
3242
9b52905e
NC
3243/* Return the base vma address which should be subtracted from the real
3244 address when resolving a dtpoff relocation.
3245 This is PT_TLS segment p_vaddr. */
3246
3247static bfd_vma
3248dtpoff_base (struct bfd_link_info *info)
3249{
3250 /* If tls_sec is NULL, we should have signalled an error already. */
3251 if (elf_hash_table (info)->tls_sec == NULL)
3252 return 0;
3253 return elf_hash_table (info)->tls_sec->vma;
3254}
3255
3256/* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3257
3258static bfd_vma
3259tpoff (struct bfd_link_info *info, bfd_vma address)
3260{
3261 struct elf_link_hash_table *htab = elf_hash_table (info);
3262
3263 /* If tls_sec is NULL, we should have signalled an error already. */
3264 if (htab->tls_sec == NULL)
3265 return 0;
3266 /* hppa TLS ABI is variant I and static TLS block start just after
3267 tcbhead structure which has 2 pointer fields. */
3268 return (address - htab->tls_sec->vma
3269 + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3270}
3271
c46b7515
AM
3272/* Perform a final link. */
3273
b34976b6 3274static bfd_boolean
c39a58e6 3275elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
c46b7515 3276{
4dc86686 3277 /* Invoke the regular ELF linker to do all the work. */
c152c796 3278 if (!bfd_elf_final_link (abfd, info))
b34976b6 3279 return FALSE;
c46b7515
AM
3280
3281 /* If we're producing a final executable, sort the contents of the
985142a4 3282 unwind section. */
d9f40817
DA
3283 if (info->relocatable)
3284 return TRUE;
3285
46fe4e66 3286 return elf_hppa_sort_unwind (abfd);
c46b7515
AM
3287}
3288
3289/* Record the lowest address for the data and text segments. */
3290
3291static void
2ea37f1c 3292hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
c46b7515 3293{
83c81bfe 3294 struct elf32_hppa_link_hash_table *htab;
c46b7515 3295
875c0872 3296 htab = (struct elf32_hppa_link_hash_table*) data;
4dfe6ac6
NC
3297 if (htab == NULL)
3298 return;
c46b7515
AM
3299
3300 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3301 {
2ea37f1c
NC
3302 bfd_vma value;
3303 Elf_Internal_Phdr *p;
3304
3305 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3306 BFD_ASSERT (p != NULL);
3307 value = p->p_vaddr;
c46b7515
AM
3308
3309 if ((section->flags & SEC_READONLY) != 0)
3310 {
83c81bfe
AM
3311 if (value < htab->text_segment_base)
3312 htab->text_segment_base = value;
c46b7515
AM
3313 }
3314 else
3315 {
83c81bfe
AM
3316 if (value < htab->data_segment_base)
3317 htab->data_segment_base = value;
c46b7515
AM
3318 }
3319 }
3320}
3321
30667bf3
AM
3322/* Perform a relocation as part of a final link. */
3323
3324static bfd_reloc_status_type
c39a58e6
AM
3325final_link_relocate (asection *input_section,
3326 bfd_byte *contents,
875c0872 3327 const Elf_Internal_Rela *rela,
c39a58e6
AM
3328 bfd_vma value,
3329 struct elf32_hppa_link_hash_table *htab,
3330 asection *sym_sec,
875c0872 3331 struct elf32_hppa_link_hash_entry *hh,
a252afa4 3332 struct bfd_link_info *info)
30667bf3
AM
3333{
3334 int insn;
875c0872 3335 unsigned int r_type = ELF32_R_TYPE (rela->r_info);
a252afa4 3336 unsigned int orig_r_type = r_type;
30667bf3
AM
3337 reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3338 int r_format = howto->bitsize;
3339 enum hppa_reloc_field_selector_type_alt r_field;
3340 bfd *input_bfd = input_section->owner;
875c0872 3341 bfd_vma offset = rela->r_offset;
30667bf3
AM
3342 bfd_vma max_branch_offset = 0;
3343 bfd_byte *hit_data = contents + offset;
875c0872 3344 bfd_signed_vma addend = rela->r_addend;
30667bf3 3345 bfd_vma location;
875c0872
DA
3346 struct elf32_hppa_stub_hash_entry *hsh = NULL;
3347 int val;
30667bf3
AM
3348
3349 if (r_type == R_PARISC_NONE)
3350 return bfd_reloc_ok;
3351
3352 insn = bfd_get_32 (input_bfd, hit_data);
3353
3354 /* Find out where we are and where we're going. */
3355 location = (offset +
3356 input_section->output_offset +
3357 input_section->output_section->vma);
3358
a252afa4
DA
3359 /* If we are not building a shared library, convert DLTIND relocs to
3360 DPREL relocs. */
3361 if (!info->shared)
3362 {
3363 switch (r_type)
4fc8051d
AM
3364 {
3365 case R_PARISC_DLTIND21L:
3366 r_type = R_PARISC_DPREL21L;
a252afa4
DA
3367 break;
3368
4fc8051d
AM
3369 case R_PARISC_DLTIND14R:
3370 r_type = R_PARISC_DPREL14R;
a252afa4
DA
3371 break;
3372
4fc8051d
AM
3373 case R_PARISC_DLTIND14F:
3374 r_type = R_PARISC_DPREL14F;
a252afa4
DA
3375 break;
3376 }
3377 }
3378
30667bf3
AM
3379 switch (r_type)
3380 {
3381 case R_PARISC_PCREL12F:
3382 case R_PARISC_PCREL17F:
3383 case R_PARISC_PCREL22F:
067fa4a6
AM
3384 /* If this call should go via the plt, find the import stub in
3385 the stub hash. */
30667bf3
AM
3386 if (sym_sec == NULL
3387 || sym_sec->output_section == NULL
875c0872 3388 || (hh != NULL
a63e02c7
DA
3389 && hh->eh.plt.offset != (bfd_vma) -1
3390 && hh->eh.dynindx != -1
875c0872 3391 && !hh->plabel
a252afa4 3392 && (info->shared
a63e02c7
DA
3393 || !hh->eh.def_regular
3394 || hh->eh.root.type == bfd_link_hash_defweak)))
30667bf3 3395 {
875c0872
DA
3396 hsh = hppa_get_stub_entry (input_section, sym_sec,
3397 hh, rela, htab);
3398 if (hsh != NULL)
30667bf3 3399 {
875c0872
DA
3400 value = (hsh->stub_offset
3401 + hsh->stub_sec->output_offset
3402 + hsh->stub_sec->output_section->vma);
30667bf3
AM
3403 addend = 0;
3404 }
875c0872 3405 else if (sym_sec == NULL && hh != NULL
a63e02c7 3406 && hh->eh.root.type == bfd_link_hash_undefweak)
30667bf3 3407 {
db20fd76
AM
3408 /* It's OK if undefined weak. Calls to undefined weak
3409 symbols behave as if the "called" function
3410 immediately returns. We can thus call to a weak
3411 function without first checking whether the function
3412 is defined. */
30667bf3 3413 value = location;
db20fd76 3414 addend = 8;
30667bf3
AM
3415 }
3416 else
f09ebc7d 3417 return bfd_reloc_undefined;
30667bf3
AM
3418 }
3419 /* Fall thru. */
3420
3421 case R_PARISC_PCREL21L:
3422 case R_PARISC_PCREL17C:
3423 case R_PARISC_PCREL17R:
3424 case R_PARISC_PCREL14R:
3425 case R_PARISC_PCREL14F:
36751eee 3426 case R_PARISC_PCREL32:
30667bf3
AM
3427 /* Make it a pc relative offset. */
3428 value -= location;
3429 addend -= 8;
3430 break;
3431
3432 case R_PARISC_DPREL21L:
3433 case R_PARISC_DPREL14R:
3434 case R_PARISC_DPREL14F:
f6fd0237
DA
3435 case R_PARISC_TLS_GD21L:
3436 case R_PARISC_TLS_LDM21L:
3437 case R_PARISC_TLS_IE21L:
a252afa4
DA
3438 /* Convert instructions that use the linkage table pointer (r19) to
3439 instructions that use the global data pointer (dp). This is the
3440 most efficient way of using PIC code in an incomplete executable,
3441 but the user must follow the standard runtime conventions for
3442 accessing data for this to work. */
f6fd0237
DA
3443 if (orig_r_type == R_PARISC_DLTIND21L
3444 || (!info->shared
3445 && (r_type == R_PARISC_TLS_GD21L
3446 || r_type == R_PARISC_TLS_LDM21L
3447 || r_type == R_PARISC_TLS_IE21L)))
a252afa4
DA
3448 {
3449 /* Convert addil instructions if the original reloc was a
3450 DLTIND21L. GCC sometimes uses a register other than r19 for
3451 the operation, so we must convert any addil instruction
3452 that uses this relocation. */
3453 if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3454 insn = ADDIL_DP;
3455 else
3456 /* We must have a ldil instruction. It's too hard to find
3457 and convert the associated add instruction, so issue an
3458 error. */
3459 (*_bfd_error_handler)
d003868e
AM
3460 (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3461 input_bfd,
3462 input_section,
d1fa68d3 3463 (long) offset,
a252afa4
DA
3464 howto->name,
3465 insn);
3466 }
3467 else if (orig_r_type == R_PARISC_DLTIND14F)
3468 {
3469 /* This must be a format 1 load/store. Change the base
3470 register to dp. */
3471 insn = (insn & 0xfc1ffff) | (27 << 21);
3472 }
3473
30667bf3 3474 /* For all the DP relative relocations, we need to examine the symbol's
95d0f04a
DA
3475 section. If it has no section or if it's a code section, then
3476 "data pointer relative" makes no sense. In that case we don't
3477 adjust the "value", and for 21 bit addil instructions, we change the
3478 source addend register from %dp to %r0. This situation commonly
3479 arises for undefined weak symbols and when a variable's "constness"
30667bf3
AM
3480 is declared differently from the way the variable is defined. For
3481 instance: "extern int foo" with foo defined as "const int foo". */
95d0f04a 3482 if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
30667bf3
AM
3483 {
3484 if ((insn & ((0x3f << 26) | (0x1f << 21)))
3485 == (((int) OP_ADDIL << 26) | (27 << 21)))
3486 {
3487 insn &= ~ (0x1f << 21);
30667bf3
AM
3488 }
3489 /* Now try to make things easy for the dynamic linker. */
3490
3491 break;
3492 }
74d1c347 3493 /* Fall thru. */
30667bf3
AM
3494
3495 case R_PARISC_DLTIND21L:
3496 case R_PARISC_DLTIND14R:
3497 case R_PARISC_DLTIND14F:
9b52905e 3498 case R_PARISC_TLS_GD14R:
9b52905e 3499 case R_PARISC_TLS_LDM14R:
9b52905e 3500 case R_PARISC_TLS_IE14R:
30667bf3
AM
3501 value -= elf_gp (input_section->output_section->owner);
3502 break;
3503
c46b7515
AM
3504 case R_PARISC_SEGREL32:
3505 if ((sym_sec->flags & SEC_CODE) != 0)
83c81bfe 3506 value -= htab->text_segment_base;
c46b7515 3507 else
83c81bfe 3508 value -= htab->data_segment_base;
c46b7515
AM
3509 break;
3510
30667bf3
AM
3511 default:
3512 break;
3513 }
3514
3515 switch (r_type)
3516 {
3517 case R_PARISC_DIR32:
47d89dba 3518 case R_PARISC_DIR14F:
30667bf3
AM
3519 case R_PARISC_DIR17F:
3520 case R_PARISC_PCREL17C:
3521 case R_PARISC_PCREL14F:
36751eee 3522 case R_PARISC_PCREL32:
30667bf3
AM
3523 case R_PARISC_DPREL14F:
3524 case R_PARISC_PLABEL32:
3525 case R_PARISC_DLTIND14F:
3526 case R_PARISC_SEGBASE:
3527 case R_PARISC_SEGREL32:
9b52905e
NC
3528 case R_PARISC_TLS_DTPMOD32:
3529 case R_PARISC_TLS_DTPOFF32:
3530 case R_PARISC_TLS_TPREL32:
30667bf3
AM
3531 r_field = e_fsel;
3532 break;
3533
1bf42538 3534 case R_PARISC_DLTIND21L:
30667bf3 3535 case R_PARISC_PCREL21L:
30667bf3 3536 case R_PARISC_PLABEL21L:
1bf42538
JL
3537 r_field = e_lsel;
3538 break;
3539
3540 case R_PARISC_DIR21L:
3541 case R_PARISC_DPREL21L:
9b52905e
NC
3542 case R_PARISC_TLS_GD21L:
3543 case R_PARISC_TLS_LDM21L:
3544 case R_PARISC_TLS_LDO21L:
3545 case R_PARISC_TLS_IE21L:
3546 case R_PARISC_TLS_LE21L:
30667bf3
AM
3547 r_field = e_lrsel;
3548 break;
3549
30667bf3 3550 case R_PARISC_PCREL17R:
30667bf3 3551 case R_PARISC_PCREL14R:
30667bf3
AM
3552 case R_PARISC_PLABEL14R:
3553 case R_PARISC_DLTIND14R:
1bf42538
JL
3554 r_field = e_rsel;
3555 break;
3556
3557 case R_PARISC_DIR17R:
3558 case R_PARISC_DIR14R:
3559 case R_PARISC_DPREL14R:
9b52905e
NC
3560 case R_PARISC_TLS_GD14R:
3561 case R_PARISC_TLS_LDM14R:
3562 case R_PARISC_TLS_LDO14R:
3563 case R_PARISC_TLS_IE14R:
3564 case R_PARISC_TLS_LE14R:
30667bf3
AM
3565 r_field = e_rrsel;
3566 break;
3567
3568 case R_PARISC_PCREL12F:
3569 case R_PARISC_PCREL17F:
3570 case R_PARISC_PCREL22F:
3571 r_field = e_fsel;
3572
3573 if (r_type == (unsigned int) R_PARISC_PCREL17F)
3574 {
3575 max_branch_offset = (1 << (17-1)) << 2;
3576 }
3577 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3578 {
3579 max_branch_offset = (1 << (12-1)) << 2;
3580 }
3581 else
3582 {
3583 max_branch_offset = (1 << (22-1)) << 2;
3584 }
3585
3586 /* sym_sec is NULL on undefined weak syms or when shared on
3587 undefined syms. We've already checked for a stub for the
3588 shared undefined case. */
3589 if (sym_sec == NULL)
3590 break;
3591
3592 /* If the branch is out of reach, then redirect the
3593 call to the local stub for this function. */
3594 if (value + addend + max_branch_offset >= 2*max_branch_offset)
3595 {
875c0872
DA
3596 hsh = hppa_get_stub_entry (input_section, sym_sec,
3597 hh, rela, htab);
3598 if (hsh == NULL)
f09ebc7d 3599 return bfd_reloc_undefined;
30667bf3
AM
3600
3601 /* Munge up the value and addend so that we call the stub
3602 rather than the procedure directly. */
875c0872
DA
3603 value = (hsh->stub_offset
3604 + hsh->stub_sec->output_offset
3605 + hsh->stub_sec->output_section->vma
30667bf3
AM
3606 - location);
3607 addend = -8;
3608 }
3609 break;
3610
3611 /* Something we don't know how to handle. */
3612 default:
3613 return bfd_reloc_notsupported;
3614 }
3615
3616 /* Make sure we can reach the stub. */
3617 if (max_branch_offset != 0
3618 && value + addend + max_branch_offset >= 2*max_branch_offset)
3619 {
3620 (*_bfd_error_handler)
d003868e
AM
3621 (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3622 input_bfd,
3623 input_section,
d1fa68d3 3624 (long) offset,
a63e02c7 3625 hsh->bh_root.string);
ce757d15 3626 bfd_set_error (bfd_error_bad_value);
30667bf3
AM
3627 return bfd_reloc_notsupported;
3628 }
3629
3630 val = hppa_field_adjust (value, addend, r_field);
3631
3632 switch (r_type)
3633 {
3634 case R_PARISC_PCREL12F:
3635 case R_PARISC_PCREL17C:
3636 case R_PARISC_PCREL17F:
3637 case R_PARISC_PCREL17R:
3638 case R_PARISC_PCREL22F:
3639 case R_PARISC_DIR17F:
3640 case R_PARISC_DIR17R:
3641 /* This is a branch. Divide the offset by four.
3642 Note that we need to decide whether it's a branch or
3643 otherwise by inspecting the reloc. Inspecting insn won't
3644 work as insn might be from a .word directive. */
3645 val >>= 2;
3646 break;
3647
3648 default:
3649 break;
3650 }
3651
3652 insn = hppa_rebuild_insn (insn, val, r_format);
3653
3654 /* Update the instruction word. */
74d1c347 3655 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
30667bf3
AM
3656 return bfd_reloc_ok;
3657}
3658
30667bf3
AM
3659/* Relocate an HPPA ELF section. */
3660
b34976b6 3661static bfd_boolean
c39a58e6
AM
3662elf32_hppa_relocate_section (bfd *output_bfd,
3663 struct bfd_link_info *info,
3664 bfd *input_bfd,
3665 asection *input_section,
3666 bfd_byte *contents,
3667 Elf_Internal_Rela *relocs,
3668 Elf_Internal_Sym *local_syms,
3669 asection **local_sections)
30667bf3 3670{
30667bf3 3671 bfd_vma *local_got_offsets;
83c81bfe 3672 struct elf32_hppa_link_hash_table *htab;
30667bf3 3673 Elf_Internal_Shdr *symtab_hdr;
875c0872 3674 Elf_Internal_Rela *rela;
30667bf3 3675 Elf_Internal_Rela *relend;
30667bf3
AM
3676
3677 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3678
83c81bfe 3679 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
3680 if (htab == NULL)
3681 return FALSE;
3682
74d1c347 3683 local_got_offsets = elf_local_got_offsets (input_bfd);
30667bf3 3684
875c0872 3685 rela = relocs;
30667bf3 3686 relend = relocs + input_section->reloc_count;
875c0872 3687 for (; rela < relend; rela++)
30667bf3
AM
3688 {
3689 unsigned int r_type;
3690 reloc_howto_type *howto;
3691 unsigned int r_symndx;
875c0872 3692 struct elf32_hppa_link_hash_entry *hh;
30667bf3
AM
3693 Elf_Internal_Sym *sym;
3694 asection *sym_sec;
3695 bfd_vma relocation;
875c0872 3696 bfd_reloc_status_type rstatus;
30667bf3 3697 const char *sym_name;
b34976b6
AM
3698 bfd_boolean plabel;
3699 bfd_boolean warned_undef;
30667bf3 3700
875c0872 3701 r_type = ELF32_R_TYPE (rela->r_info);
30667bf3
AM
3702 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3703 {
3704 bfd_set_error (bfd_error_bad_value);
b34976b6 3705 return FALSE;
30667bf3
AM
3706 }
3707 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3708 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3709 continue;
3710
875c0872
DA
3711 r_symndx = ELF32_R_SYM (rela->r_info);
3712 hh = NULL;
30667bf3
AM
3713 sym = NULL;
3714 sym_sec = NULL;
b34976b6 3715 warned_undef = FALSE;
30667bf3
AM
3716 if (r_symndx < symtab_hdr->sh_info)
3717 {
3718 /* This is a local symbol, h defaults to NULL. */
3719 sym = local_syms + r_symndx;
3720 sym_sec = local_sections[r_symndx];
875c0872 3721 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
30667bf3
AM
3722 }
3723 else
3724 {
875c0872 3725 struct elf_link_hash_entry *eh;
560e09e9 3726 bfd_boolean unresolved_reloc;
b2a8e766 3727 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
560e09e9 3728
875c0872 3729 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
b2a8e766 3730 r_symndx, symtab_hdr, sym_hashes,
875c0872 3731 eh, sym_sec, relocation,
b2a8e766 3732 unresolved_reloc, warned_undef);
560e09e9 3733
ab96bf03
AM
3734 if (!info->relocatable
3735 && relocation == 0
875c0872
DA
3736 && eh->root.type != bfd_link_hash_defined
3737 && eh->root.type != bfd_link_hash_defweak
3738 && eh->root.type != bfd_link_hash_undefweak)
4fc8051d 3739 {
59c2e50f 3740 if (info->unresolved_syms_in_objects == RM_IGNORE
875c0872
DA
3741 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3742 && eh->type == STT_PARISC_MILLI)
560e09e9
NC
3743 {
3744 if (! info->callbacks->undefined_symbol
9b52905e 3745 (info, eh_name (eh), input_bfd,
875c0872 3746 input_section, rela->r_offset, FALSE))
560e09e9
NC
3747 return FALSE;
3748 warned_undef = TRUE;
3749 }
30667bf3 3750 }
875c0872 3751 hh = hppa_elf_hash_entry (eh);
30667bf3
AM
3752 }
3753
ab96bf03
AM
3754 if (sym_sec != NULL && elf_discarded_section (sym_sec))
3755 {
3756 /* For relocs against symbols from removed linkonce
3757 sections, or sections discarded by a linker script,
3758 we just want the section contents zeroed. Avoid any
3759 special processing. */
3760 _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
3761 contents + rela->r_offset);
3762 rela->r_info = 0;
3763 rela->r_addend = 0;
3764 continue;
3765 }
3766
3767 if (info->relocatable)
3768 continue;
3769
30667bf3 3770 /* Do any required modifications to the relocation value, and
25f72752
AM
3771 determine what types of dynamic info we need to output, if
3772 any. */
74d1c347 3773 plabel = 0;
30667bf3
AM
3774 switch (r_type)
3775 {
3776 case R_PARISC_DLTIND14F:
3777 case R_PARISC_DLTIND14R:
3778 case R_PARISC_DLTIND21L:
ce757d15
AM
3779 {
3780 bfd_vma off;
b34976b6 3781 bfd_boolean do_got = 0;
ce757d15
AM
3782
3783 /* Relocation is to the entry for this symbol in the
3784 global offset table. */
875c0872 3785 if (hh != NULL)
ce757d15 3786 {
b34976b6 3787 bfd_boolean dyn;
ce757d15 3788
a63e02c7
DA
3789 off = hh->eh.got.offset;
3790 dyn = htab->etab.dynamic_sections_created;
c152c796 3791 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
a63e02c7 3792 &hh->eh))
ce757d15
AM
3793 {
3794 /* If we aren't going to call finish_dynamic_symbol,
3795 then we need to handle initialisation of the .got
3796 entry and create needed relocs here. Since the
3797 offset must always be a multiple of 4, we use the
3798 least significant bit to record whether we have
3799 initialised it already. */
3800 if ((off & 1) != 0)
3801 off &= ~1;
3802 else
3803 {
a63e02c7 3804 hh->eh.got.offset |= 1;
ce757d15
AM
3805 do_got = 1;
3806 }
3807 }
3808 }
3809 else
3810 {
3811 /* Local symbol case. */
3812 if (local_got_offsets == NULL)
3813 abort ();
3814
3815 off = local_got_offsets[r_symndx];
3816
3817 /* The offset must always be a multiple of 4. We use
3818 the least significant bit to record whether we have
3819 already generated the necessary reloc. */
3820 if ((off & 1) != 0)
3821 off &= ~1;
3822 else
3823 {
3824 local_got_offsets[r_symndx] |= 1;
3825 do_got = 1;
3826 }
3827 }
68fb2e56 3828
ce757d15
AM
3829 if (do_got)
3830 {
3831 if (info->shared)
3832 {
3833 /* Output a dynamic relocation for this GOT entry.
3834 In this case it is relative to the base of the
3835 object because the symbol index is zero. */
3836 Elf_Internal_Rela outrel;
947216bf 3837 bfd_byte *loc;
875c0872 3838 asection *sec = htab->srelgot;
ce757d15
AM
3839
3840 outrel.r_offset = (off
3841 + htab->sgot->output_offset
3842 + htab->sgot->output_section->vma);
3843 outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3844 outrel.r_addend = relocation;
875c0872
DA
3845 loc = sec->contents;
3846 loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
ce757d15
AM
3847 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3848 }
3849 else
30667bf3 3850 bfd_put_32 (output_bfd, relocation,
83c81bfe 3851 htab->sgot->contents + off);
ce757d15 3852 }
30667bf3 3853
ce757d15
AM
3854 if (off >= (bfd_vma) -2)
3855 abort ();
30667bf3 3856
ce757d15
AM
3857 /* Add the base of the GOT to the relocation value. */
3858 relocation = (off
3859 + htab->sgot->output_offset
3860 + htab->sgot->output_section->vma);
3861 }
30667bf3 3862 break;
252b5132 3863
c46b7515
AM
3864 case R_PARISC_SEGREL32:
3865 /* If this is the first SEGREL relocation, then initialize
3866 the segment base values. */
83c81bfe
AM
3867 if (htab->text_segment_base == (bfd_vma) -1)
3868 bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
c46b7515
AM
3869 break;
3870
30667bf3
AM
3871 case R_PARISC_PLABEL14R:
3872 case R_PARISC_PLABEL21L:
3873 case R_PARISC_PLABEL32:
a63e02c7 3874 if (htab->etab.dynamic_sections_created)
252b5132 3875 {
ce757d15 3876 bfd_vma off;
b34976b6 3877 bfd_boolean do_plt = 0;
74d1c347
AM
3878 /* If we have a global symbol with a PLT slot, then
3879 redirect this relocation to it. */
875c0872 3880 if (hh != NULL)
74d1c347 3881 {
a63e02c7 3882 off = hh->eh.plt.offset;
c152c796 3883 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
a63e02c7 3884 &hh->eh))
8dea1268
AM
3885 {
3886 /* In a non-shared link, adjust_dynamic_symbols
3887 isn't called for symbols forced local. We
dc810e39 3888 need to write out the plt entry here. */
8dea1268
AM
3889 if ((off & 1) != 0)
3890 off &= ~1;
3891 else
3892 {
a63e02c7 3893 hh->eh.plt.offset |= 1;
ce757d15 3894 do_plt = 1;
8dea1268
AM
3895 }
3896 }
74d1c347
AM
3897 }
3898 else
3899 {
68fb2e56
AM
3900 bfd_vma *local_plt_offsets;
3901
3902 if (local_got_offsets == NULL)
3903 abort ();
74d1c347 3904
68fb2e56
AM
3905 local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3906 off = local_plt_offsets[r_symndx];
74d1c347
AM
3907
3908 /* As for the local .got entry case, we use the last
3909 bit to record whether we've already initialised
3910 this local .plt entry. */
3911 if ((off & 1) != 0)
3912 off &= ~1;
ce757d15
AM
3913 else
3914 {
3915 local_plt_offsets[r_symndx] |= 1;
3916 do_plt = 1;
3917 }
3918 }
3919
3920 if (do_plt)
3921 {
3922 if (info->shared)
3923 {
3924 /* Output a dynamic IPLT relocation for this
3925 PLT entry. */
3926 Elf_Internal_Rela outrel;
947216bf
AM
3927 bfd_byte *loc;
3928 asection *s = htab->srelplt;
ce757d15
AM
3929
3930 outrel.r_offset = (off
3931 + htab->splt->output_offset
3932 + htab->splt->output_section->vma);
3933 outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3934 outrel.r_addend = relocation;
947216bf
AM
3935 loc = s->contents;
3936 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
ce757d15
AM
3937 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3938 }
74d1c347
AM
3939 else
3940 {
3941 bfd_put_32 (output_bfd,
3942 relocation,
83c81bfe 3943 htab->splt->contents + off);
74d1c347 3944 bfd_put_32 (output_bfd,
83c81bfe
AM
3945 elf_gp (htab->splt->output_section->owner),
3946 htab->splt->contents + off + 4);
74d1c347
AM
3947 }
3948 }
3949
68fb2e56 3950 if (off >= (bfd_vma) -2)
49e9d0d3 3951 abort ();
74d1c347
AM
3952
3953 /* PLABELs contain function pointers. Relocation is to
3954 the entry for the function in the .plt. The magic +2
3955 offset signals to $$dyncall that the function pointer
3956 is in the .plt and thus has a gp pointer too.
3957 Exception: Undefined PLABELs should have a value of
3958 zero. */
875c0872 3959 if (hh == NULL
a63e02c7
DA
3960 || (hh->eh.root.type != bfd_link_hash_undefweak
3961 && hh->eh.root.type != bfd_link_hash_undefined))
74d1c347
AM
3962 {
3963 relocation = (off
83c81bfe
AM
3964 + htab->splt->output_offset
3965 + htab->splt->output_section->vma
74d1c347
AM
3966 + 2);
3967 }
3968 plabel = 1;
30667bf3
AM
3969 }
3970 /* Fall through and possibly emit a dynamic relocation. */
3971
3972 case R_PARISC_DIR17F:
3973 case R_PARISC_DIR17R:
47d89dba 3974 case R_PARISC_DIR14F:
30667bf3
AM
3975 case R_PARISC_DIR14R:
3976 case R_PARISC_DIR21L:
3977 case R_PARISC_DPREL14F:
3978 case R_PARISC_DPREL14R:
3979 case R_PARISC_DPREL21L:
3980 case R_PARISC_DIR32:
b1e24c02 3981 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
3982 break;
3983
30667bf3 3984 /* The reloc types handled here and this conditional
56882138 3985 expression must match the code in ..check_relocs and
ec338859 3986 allocate_dynrelocs. ie. We need exactly the same condition
56882138
AM
3987 as in ..check_relocs, with some extra conditions (dynindx
3988 test in this case) to cater for relocs removed by
ec338859 3989 allocate_dynrelocs. If you squint, the non-shared test
56882138
AM
3990 here does indeed match the one in ..check_relocs, the
3991 difference being that here we test DEF_DYNAMIC as well as
3992 !DEF_REGULAR. All common syms end up with !DEF_REGULAR,
3993 which is why we can't use just that test here.
3994 Conversely, DEF_DYNAMIC can't be used in check_relocs as
3995 there all files have not been loaded. */
446f2863 3996 if ((info->shared
875c0872 3997 && (hh == NULL
a63e02c7
DA
3998 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3999 || hh->eh.root.type != bfd_link_hash_undefweak)
446f2863 4000 && (IS_ABSOLUTE_RELOC (r_type)
a63e02c7 4001 || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
446f2863 4002 || (!info->shared
875c0872 4003 && hh != NULL
a63e02c7
DA
4004 && hh->eh.dynindx != -1
4005 && !hh->eh.non_got_ref
4fc8051d 4006 && ((ELIMINATE_COPY_RELOCS
a63e02c7
DA
4007 && hh->eh.def_dynamic
4008 && !hh->eh.def_regular)
4009 || hh->eh.root.type == bfd_link_hash_undefweak
4010 || hh->eh.root.type == bfd_link_hash_undefined)))
30667bf3
AM
4011 {
4012 Elf_Internal_Rela outrel;
b34976b6 4013 bfd_boolean skip;
98ceb8ce 4014 asection *sreloc;
947216bf 4015 bfd_byte *loc;
252b5132 4016
30667bf3
AM
4017 /* When generating a shared object, these relocations
4018 are copied into the output file to be resolved at run
4019 time. */
252b5132 4020
875c0872 4021 outrel.r_addend = rela->r_addend;
c629eae0
JJ
4022 outrel.r_offset =
4023 _bfd_elf_section_offset (output_bfd, info, input_section,
875c0872 4024 rela->r_offset);
0bb2d96a
JJ
4025 skip = (outrel.r_offset == (bfd_vma) -1
4026 || outrel.r_offset == (bfd_vma) -2);
30667bf3
AM
4027 outrel.r_offset += (input_section->output_offset
4028 + input_section->output_section->vma);
875c0872 4029
30667bf3 4030 if (skip)
252b5132 4031 {
30667bf3 4032 memset (&outrel, 0, sizeof (outrel));
252b5132 4033 }
875c0872 4034 else if (hh != NULL
a63e02c7 4035 && hh->eh.dynindx != -1
74d1c347 4036 && (plabel
446f2863
AM
4037 || !IS_ABSOLUTE_RELOC (r_type)
4038 || !info->shared
74d1c347 4039 || !info->symbolic
a63e02c7 4040 || !hh->eh.def_regular))
252b5132 4041 {
a63e02c7 4042 outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
30667bf3
AM
4043 }
4044 else /* It's a local symbol, or one marked to become local. */
4045 {
4046 int indx = 0;
edd21aca 4047
30667bf3
AM
4048 /* Add the absolute offset of the symbol. */
4049 outrel.r_addend += relocation;
edd21aca 4050
74d1c347
AM
4051 /* Global plabels need to be processed by the
4052 dynamic linker so that functions have at most one
4053 fptr. For this reason, we need to differentiate
4054 between global and local plabels, which we do by
4055 providing the function symbol for a global plabel
4056 reloc, and no symbol for local plabels. */
4057 if (! plabel
4058 && sym_sec != NULL
30667bf3
AM
4059 && sym_sec->output_section != NULL
4060 && ! bfd_is_abs_section (sym_sec))
252b5132 4061 {
74541ad4
AM
4062 asection *osec;
4063
4064 osec = sym_sec->output_section;
4065 indx = elf_section_data (osec)->dynindx;
4066 if (indx == 0)
4067 {
4068 osec = htab->etab.text_index_section;
4069 indx = elf_section_data (osec)->dynindx;
4070 }
4071 BFD_ASSERT (indx != 0);
4b71bec0 4072
30667bf3
AM
4073 /* We are turning this relocation into one
4074 against a section symbol, so subtract out the
4075 output section's address but not the offset
4076 of the input section in the output section. */
74541ad4 4077 outrel.r_addend -= osec->vma;
252b5132 4078 }
252b5132 4079
30667bf3
AM
4080 outrel.r_info = ELF32_R_INFO (indx, r_type);
4081 }
98ceb8ce
AM
4082 sreloc = elf_section_data (input_section)->sreloc;
4083 if (sreloc == NULL)
4084 abort ();
4085
947216bf
AM
4086 loc = sreloc->contents;
4087 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
98ceb8ce 4088 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
30667bf3
AM
4089 }
4090 break;
9b52905e
NC
4091
4092 case R_PARISC_TLS_LDM21L:
4093 case R_PARISC_TLS_LDM14R:
4094 {
4095 bfd_vma off;
4096
4097 off = htab->tls_ldm_got.offset;
4098 if (off & 1)
4099 off &= ~1;
4100 else
4101 {
4102 Elf_Internal_Rela outrel;
4103 bfd_byte *loc;
4104
4105 outrel.r_offset = (off
4106 + htab->sgot->output_section->vma
4107 + htab->sgot->output_offset);
4108 outrel.r_addend = 0;
4109 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4110 loc = htab->srelgot->contents;
4111 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4112
4113 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4114 htab->tls_ldm_got.offset |= 1;
4115 }
4116
4117 /* Add the base of the GOT to the relocation value. */
4118 relocation = (off
4119 + htab->sgot->output_offset
4120 + htab->sgot->output_section->vma);
4121
4122 break;
4123 }
4124
4125 case R_PARISC_TLS_LDO21L:
4126 case R_PARISC_TLS_LDO14R:
4127 relocation -= dtpoff_base (info);
4128 break;
4129
4130 case R_PARISC_TLS_GD21L:
4131 case R_PARISC_TLS_GD14R:
4132 case R_PARISC_TLS_IE21L:
4133 case R_PARISC_TLS_IE14R:
4134 {
4135 bfd_vma off;
4136 int indx;
4137 char tls_type;
4138
4139 indx = 0;
4140 if (hh != NULL)
4141 {
4142 bfd_boolean dyn;
4143 dyn = htab->etab.dynamic_sections_created;
4144
4145 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4146 && (!info->shared
4147 || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4148 {
4149 indx = hh->eh.dynindx;
4150 }
4151 off = hh->eh.got.offset;
4152 tls_type = hh->tls_type;
4153 }
4154 else
4155 {
4156 off = local_got_offsets[r_symndx];
4157 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4158 }
4159
4160 if (tls_type == GOT_UNKNOWN)
4161 abort ();
4162
4163 if ((off & 1) != 0)
4164 off &= ~1;
4165 else
4166 {
4167 bfd_boolean need_relocs = FALSE;
4168 Elf_Internal_Rela outrel;
4169 bfd_byte *loc = NULL;
4170 int cur_off = off;
4171
4172 /* The GOT entries have not been initialized yet. Do it
4173 now, and emit any relocations. If both an IE GOT and a
4174 GD GOT are necessary, we emit the GD first. */
4175
4176 if ((info->shared || indx != 0)
4177 && (hh == NULL
4178 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4179 || hh->eh.root.type != bfd_link_hash_undefweak))
4180 {
4181 need_relocs = TRUE;
4182 loc = htab->srelgot->contents;
4183 /* FIXME (CAO): Should this be reloc_count++ ? */
4184 loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4185 }
4186
4187 if (tls_type & GOT_TLS_GD)
4188 {
4189 if (need_relocs)
4190 {
4191 outrel.r_offset = (cur_off
4192 + htab->sgot->output_section->vma
4193 + htab->sgot->output_offset);
4194 outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4195 outrel.r_addend = 0;
4196 bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4197 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4198 htab->srelgot->reloc_count++;
4199 loc += sizeof (Elf32_External_Rela);
4200
4201 if (indx == 0)
4202 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4203 htab->sgot->contents + cur_off + 4);
4204 else
4205 {
4206 bfd_put_32 (output_bfd, 0,
4207 htab->sgot->contents + cur_off + 4);
4208 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4209 outrel.r_offset += 4;
4210 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4211 htab->srelgot->reloc_count++;
4212 loc += sizeof (Elf32_External_Rela);
4213 }
4214 }
4215 else
4216 {
4217 /* If we are not emitting relocations for a
4218 general dynamic reference, then we must be in a
4219 static link or an executable link with the
4220 symbol binding locally. Mark it as belonging
4221 to module 1, the executable. */
4222 bfd_put_32 (output_bfd, 1,
4223 htab->sgot->contents + cur_off);
4224 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4225 htab->sgot->contents + cur_off + 4);
4226 }
4227
4228
4229 cur_off += 8;
4230 }
4231
4232 if (tls_type & GOT_TLS_IE)
4233 {
4234 if (need_relocs)
4235 {
4236 outrel.r_offset = (cur_off
4237 + htab->sgot->output_section->vma
4238 + htab->sgot->output_offset);
4239 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4240
4241 if (indx == 0)
4242 outrel.r_addend = relocation - dtpoff_base (info);
4243 else
4244 outrel.r_addend = 0;
4245
4246 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4247 htab->srelgot->reloc_count++;
4248 loc += sizeof (Elf32_External_Rela);
4249 }
4250 else
4251 bfd_put_32 (output_bfd, tpoff (info, relocation),
4252 htab->sgot->contents + cur_off);
4253
4254 cur_off += 4;
4255 }
4256
4257 if (hh != NULL)
4258 hh->eh.got.offset |= 1;
4259 else
4260 local_got_offsets[r_symndx] |= 1;
4261 }
4262
4263 if ((tls_type & GOT_TLS_GD)
4264 && r_type != R_PARISC_TLS_GD21L
4265 && r_type != R_PARISC_TLS_GD14R)
4266 off += 2 * GOT_ENTRY_SIZE;
4267
4268 /* Add the base of the GOT to the relocation value. */
4269 relocation = (off
4270 + htab->sgot->output_offset
4271 + htab->sgot->output_section->vma);
4272
4273 break;
4274 }
4275
4276 case R_PARISC_TLS_LE21L:
4277 case R_PARISC_TLS_LE14R:
4278 {
4279 relocation = tpoff (info, relocation);
4280 break;
4281 }
4282 break;
edd21aca 4283
30667bf3
AM
4284 default:
4285 break;
4286 }
252b5132 4287
875c0872
DA
4288 rstatus = final_link_relocate (input_section, contents, rela, relocation,
4289 htab, sym_sec, hh, info);
252b5132 4290
875c0872 4291 if (rstatus == bfd_reloc_ok)
30667bf3 4292 continue;
252b5132 4293
875c0872 4294 if (hh != NULL)
9b52905e 4295 sym_name = hh_name (hh);
30667bf3
AM
4296 else
4297 {
4298 sym_name = bfd_elf_string_from_elf_section (input_bfd,
4299 symtab_hdr->sh_link,
4300 sym->st_name);
4301 if (sym_name == NULL)
b34976b6 4302 return FALSE;
30667bf3
AM
4303 if (*sym_name == '\0')
4304 sym_name = bfd_section_name (input_bfd, sym_sec);
4305 }
edd21aca 4306
30667bf3 4307 howto = elf_hppa_howto_table + r_type;
252b5132 4308
875c0872 4309 if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
30667bf3 4310 {
875c0872 4311 if (rstatus == bfd_reloc_notsupported || !warned_undef)
f09ebc7d
AM
4312 {
4313 (*_bfd_error_handler)
d003868e
AM
4314 (_("%B(%A+0x%lx): cannot handle %s for %s"),
4315 input_bfd,
4316 input_section,
875c0872 4317 (long) rela->r_offset,
f09ebc7d
AM
4318 howto->name,
4319 sym_name);
4320 bfd_set_error (bfd_error_bad_value);
b34976b6 4321 return FALSE;
f09ebc7d 4322 }
30667bf3
AM
4323 }
4324 else
4325 {
4326 if (!((*info->callbacks->reloc_overflow)
a63e02c7 4327 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
875c0872 4328 (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
b34976b6 4329 return FALSE;
30667bf3
AM
4330 }
4331 }
edd21aca 4332
b34976b6 4333 return TRUE;
30667bf3 4334}
252b5132 4335
30667bf3
AM
4336/* Finish up dynamic symbol handling. We set the contents of various
4337 dynamic sections here. */
252b5132 4338
b34976b6 4339static bfd_boolean
c39a58e6
AM
4340elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4341 struct bfd_link_info *info,
875c0872 4342 struct elf_link_hash_entry *eh,
c39a58e6 4343 Elf_Internal_Sym *sym)
30667bf3 4344{
83c81bfe 4345 struct elf32_hppa_link_hash_table *htab;
875c0872 4346 Elf_Internal_Rela rela;
a252afa4 4347 bfd_byte *loc;
edd21aca 4348
83c81bfe 4349 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
4350 if (htab == NULL)
4351 return FALSE;
30667bf3 4352
875c0872 4353 if (eh->plt.offset != (bfd_vma) -1)
30667bf3
AM
4354 {
4355 bfd_vma value;
30667bf3 4356
875c0872 4357 if (eh->plt.offset & 1)
8dea1268
AM
4358 abort ();
4359
30667bf3
AM
4360 /* This symbol has an entry in the procedure linkage table. Set
4361 it up.
4362
4363 The format of a plt entry is
74d1c347
AM
4364 <funcaddr>
4365 <__gp>
47d89dba 4366 */
30667bf3 4367 value = 0;
875c0872
DA
4368 if (eh->root.type == bfd_link_hash_defined
4369 || eh->root.type == bfd_link_hash_defweak)
30667bf3 4370 {
875c0872
DA
4371 value = eh->root.u.def.value;
4372 if (eh->root.u.def.section->output_section != NULL)
4373 value += (eh->root.u.def.section->output_offset
4374 + eh->root.u.def.section->output_section->vma);
252b5132 4375 }
edd21aca 4376
a252afa4 4377 /* Create a dynamic IPLT relocation for this entry. */
875c0872 4378 rela.r_offset = (eh->plt.offset
a252afa4
DA
4379 + htab->splt->output_offset
4380 + htab->splt->output_section->vma);
875c0872 4381 if (eh->dynindx != -1)
30667bf3 4382 {
875c0872
DA
4383 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4384 rela.r_addend = 0;
30667bf3 4385 }
ce757d15 4386 else
47d89dba 4387 {
a252afa4
DA
4388 /* This symbol has been marked to become local, and is
4389 used by a plabel so must be kept in the .plt. */
875c0872
DA
4390 rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4391 rela.r_addend = value;
47d89dba
AM
4392 }
4393
a252afa4
DA
4394 loc = htab->srelplt->contents;
4395 loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
875c0872 4396 bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
a252afa4 4397
875c0872 4398 if (!eh->def_regular)
30667bf3
AM
4399 {
4400 /* Mark the symbol as undefined, rather than as defined in
4401 the .plt section. Leave the value alone. */
4402 sym->st_shndx = SHN_UNDEF;
4403 }
4404 }
edd21aca 4405
9b52905e
NC
4406 if (eh->got.offset != (bfd_vma) -1
4407 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4408 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
30667bf3 4409 {
30667bf3
AM
4410 /* This symbol has an entry in the global offset table. Set it
4411 up. */
4412
875c0872 4413 rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
83c81bfe
AM
4414 + htab->sgot->output_offset
4415 + htab->sgot->output_section->vma);
30667bf3 4416
4dc86686
AM
4417 /* If this is a -Bsymbolic link and the symbol is defined
4418 locally or was forced to be local because of a version file,
4419 we just want to emit a RELATIVE reloc. The entry in the
4420 global offset table will already have been initialized in the
4421 relocate_section function. */
4422 if (info->shared
875c0872
DA
4423 && (info->symbolic || eh->dynindx == -1)
4424 && eh->def_regular)
30667bf3 4425 {
875c0872
DA
4426 rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4427 rela.r_addend = (eh->root.u.def.value
4428 + eh->root.u.def.section->output_offset
4429 + eh->root.u.def.section->output_section->vma);
30667bf3
AM
4430 }
4431 else
4432 {
875c0872 4433 if ((eh->got.offset & 1) != 0)
49e9d0d3 4434 abort ();
875c0872
DA
4435
4436 bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4437 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4438 rela.r_addend = 0;
30667bf3 4439 }
edd21aca 4440
947216bf
AM
4441 loc = htab->srelgot->contents;
4442 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
875c0872 4443 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
30667bf3 4444 }
edd21aca 4445
875c0872 4446 if (eh->needs_copy)
30667bf3 4447 {
875c0872 4448 asection *sec;
30667bf3
AM
4449
4450 /* This symbol needs a copy reloc. Set it up. */
4451
875c0872
DA
4452 if (! (eh->dynindx != -1
4453 && (eh->root.type == bfd_link_hash_defined
4454 || eh->root.type == bfd_link_hash_defweak)))
49e9d0d3 4455 abort ();
30667bf3 4456
875c0872 4457 sec = htab->srelbss;
30667bf3 4458
875c0872
DA
4459 rela.r_offset = (eh->root.u.def.value
4460 + eh->root.u.def.section->output_offset
4461 + eh->root.u.def.section->output_section->vma);
4462 rela.r_addend = 0;
4463 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4464 loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4465 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
30667bf3
AM
4466 }
4467
4468 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
9b52905e
NC
4469 if (eh_name (eh)[0] == '_'
4470 && (strcmp (eh_name (eh), "_DYNAMIC") == 0
22edb2f1 4471 || eh == htab->etab.hgot))
30667bf3
AM
4472 {
4473 sym->st_shndx = SHN_ABS;
4474 }
4475
b34976b6 4476 return TRUE;
30667bf3
AM
4477}
4478
98ceb8ce
AM
4479/* Used to decide how to sort relocs in an optimal manner for the
4480 dynamic linker, before writing them out. */
4481
4482static enum elf_reloc_type_class
c39a58e6 4483elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
98ceb8ce 4484{
9b52905e
NC
4485 /* Handle TLS relocs first; we don't want them to be marked
4486 relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4487 check below. */
4488 switch ((int) ELF32_R_TYPE (rela->r_info))
4489 {
4490 case R_PARISC_TLS_DTPMOD32:
4491 case R_PARISC_TLS_DTPOFF32:
4492 case R_PARISC_TLS_TPREL32:
4493 return reloc_class_normal;
4494 }
4495
98ceb8ce
AM
4496 if (ELF32_R_SYM (rela->r_info) == 0)
4497 return reloc_class_relative;
4498
4499 switch ((int) ELF32_R_TYPE (rela->r_info))
4500 {
4501 case R_PARISC_IPLT:
4502 return reloc_class_plt;
4503 case R_PARISC_COPY:
4504 return reloc_class_copy;
4505 default:
4506 return reloc_class_normal;
4507 }
4508}
4509
30667bf3
AM
4510/* Finish up the dynamic sections. */
4511
b34976b6 4512static bfd_boolean
c39a58e6
AM
4513elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4514 struct bfd_link_info *info)
30667bf3
AM
4515{
4516 bfd *dynobj;
83c81bfe 4517 struct elf32_hppa_link_hash_table *htab;
30667bf3
AM
4518 asection *sdyn;
4519
83c81bfe 4520 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
4521 if (htab == NULL)
4522 return FALSE;
4523
a63e02c7 4524 dynobj = htab->etab.dynobj;
30667bf3
AM
4525
4526 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4527
a63e02c7 4528 if (htab->etab.dynamic_sections_created)
30667bf3
AM
4529 {
4530 Elf32_External_Dyn *dyncon, *dynconend;
4531
49e9d0d3
AM
4532 if (sdyn == NULL)
4533 abort ();
30667bf3
AM
4534
4535 dyncon = (Elf32_External_Dyn *) sdyn->contents;
eea6121a 4536 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
30667bf3 4537 for (; dyncon < dynconend; dyncon++)
edd21aca 4538 {
30667bf3
AM
4539 Elf_Internal_Dyn dyn;
4540 asection *s;
4541
4542 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4543
4544 switch (dyn.d_tag)
4545 {
4546 default:
3ac8354b 4547 continue;
30667bf3
AM
4548
4549 case DT_PLTGOT:
4550 /* Use PLTGOT to set the GOT register. */
4551 dyn.d_un.d_ptr = elf_gp (output_bfd);
30667bf3
AM
4552 break;
4553
4554 case DT_JMPREL:
83c81bfe 4555 s = htab->srelplt;
30667bf3 4556 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
30667bf3
AM
4557 break;
4558
4559 case DT_PLTRELSZ:
83c81bfe 4560 s = htab->srelplt;
eea6121a 4561 dyn.d_un.d_val = s->size;
30667bf3 4562 break;
4e12ff7f
AM
4563
4564 case DT_RELASZ:
4565 /* Don't count procedure linkage table relocs in the
4566 overall reloc count. */
6348e046
AM
4567 s = htab->srelplt;
4568 if (s == NULL)
4569 continue;
eea6121a 4570 dyn.d_un.d_val -= s->size;
6348e046
AM
4571 break;
4572
4573 case DT_RELA:
4574 /* We may not be using the standard ELF linker script.
4575 If .rela.plt is the first .rela section, we adjust
4576 DT_RELA to not include it. */
4577 s = htab->srelplt;
4578 if (s == NULL)
4579 continue;
4580 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4581 continue;
eea6121a 4582 dyn.d_un.d_ptr += s->size;
4e12ff7f 4583 break;
30667bf3 4584 }
3ac8354b
AM
4585
4586 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
edd21aca 4587 }
252b5132 4588 }
edd21aca 4589
eea6121a 4590 if (htab->sgot != NULL && htab->sgot->size != 0)
30667bf3 4591 {
74d1c347
AM
4592 /* Fill in the first entry in the global offset table.
4593 We use it to point to our dynamic section, if we have one. */
30667bf3 4594 bfd_put_32 (output_bfd,
c39a58e6 4595 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
83c81bfe 4596 htab->sgot->contents);
30667bf3 4597
74d1c347 4598 /* The second entry is reserved for use by the dynamic linker. */
83c81bfe 4599 memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
74d1c347 4600
30667bf3 4601 /* Set .got entry size. */
83c81bfe 4602 elf_section_data (htab->sgot->output_section)
74d1c347 4603 ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
30667bf3
AM
4604 }
4605
eea6121a 4606 if (htab->splt != NULL && htab->splt->size != 0)
47d89dba
AM
4607 {
4608 /* Set plt entry size. */
83c81bfe 4609 elf_section_data (htab->splt->output_section)
47d89dba
AM
4610 ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4611
83c81bfe 4612 if (htab->need_plt_stub)
47d89dba
AM
4613 {
4614 /* Set up the .plt stub. */
83c81bfe 4615 memcpy (htab->splt->contents
eea6121a 4616 + htab->splt->size - sizeof (plt_stub),
47d89dba
AM
4617 plt_stub, sizeof (plt_stub));
4618
83c81bfe
AM
4619 if ((htab->splt->output_offset
4620 + htab->splt->output_section->vma
eea6121a 4621 + htab->splt->size)
83c81bfe
AM
4622 != (htab->sgot->output_offset
4623 + htab->sgot->output_section->vma))
47d89dba
AM
4624 {
4625 (*_bfd_error_handler)
4626 (_(".got section not immediately after .plt section"));
b34976b6 4627 return FALSE;
47d89dba
AM
4628 }
4629 }
4630 }
30667bf3 4631
b34976b6 4632 return TRUE;
30667bf3 4633}
252b5132 4634
30667bf3
AM
4635/* Called when writing out an object file to decide the type of a
4636 symbol. */
4637static int
c39a58e6 4638elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
30667bf3
AM
4639{
4640 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4641 return STT_PARISC_MILLI;
4642 else
4643 return type;
252b5132
RH
4644}
4645
4646/* Misc BFD support code. */
30667bf3
AM
4647#define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4648#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
0c8d6e5c 4649#define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
30667bf3
AM
4650#define elf_info_to_howto elf_hppa_info_to_howto
4651#define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
252b5132 4652
252b5132 4653/* Stuff for the BFD linker. */
0c8d6e5c 4654#define bfd_elf32_mkobject elf32_hppa_mkobject
c46b7515 4655#define bfd_elf32_bfd_final_link elf32_hppa_final_link
30667bf3 4656#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
e2d34d7d 4657#define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
30667bf3 4658#define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
ebe50bae 4659#define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
30667bf3
AM
4660#define elf_backend_check_relocs elf32_hppa_check_relocs
4661#define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4662#define elf_backend_fake_sections elf_hppa_fake_sections
4663#define elf_backend_relocate_section elf32_hppa_relocate_section
74d1c347 4664#define elf_backend_hide_symbol elf32_hppa_hide_symbol
30667bf3
AM
4665#define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4666#define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4667#define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
74541ad4 4668#define elf_backend_init_index_section _bfd_elf_init_1_index_section
30667bf3
AM
4669#define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
4670#define elf_backend_gc_sweep_hook elf32_hppa_gc_sweep_hook
edfc032f
AM
4671#define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4672#define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
30667bf3
AM
4673#define elf_backend_object_p elf32_hppa_object_p
4674#define elf_backend_final_write_processing elf_hppa_final_write_processing
d1036acb 4675#define elf_backend_post_process_headers _bfd_elf_set_osabi
30667bf3 4676#define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
98ceb8ce 4677#define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
8a696751 4678#define elf_backend_action_discarded elf_hppa_action_discarded
30667bf3
AM
4679
4680#define elf_backend_can_gc_sections 1
51b64d56 4681#define elf_backend_can_refcount 1
30667bf3
AM
4682#define elf_backend_plt_alignment 2
4683#define elf_backend_want_got_plt 0
4684#define elf_backend_plt_readonly 0
4685#define elf_backend_want_plt_sym 0
74d1c347 4686#define elf_backend_got_header_size 8
f0fe0e16 4687#define elf_backend_rela_normal 1
252b5132
RH
4688
4689#define TARGET_BIG_SYM bfd_elf32_hppa_vec
4690#define TARGET_BIG_NAME "elf32-hppa"
4691#define ELF_ARCH bfd_arch_hppa
4692#define ELF_MACHINE_CODE EM_PARISC
4693#define ELF_MAXPAGESIZE 0x1000
d1036acb 4694#define ELF_OSABI ELFOSABI_HPUX
914dfb0f 4695#define elf32_bed elf32_hppa_hpux_bed
252b5132
RH
4696
4697#include "elf32-target.h"
d952f17a
AM
4698
4699#undef TARGET_BIG_SYM
914dfb0f 4700#define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec
d952f17a 4701#undef TARGET_BIG_NAME
914dfb0f 4702#define TARGET_BIG_NAME "elf32-hppa-linux"
d1036acb
L
4703#undef ELF_OSABI
4704#define ELF_OSABI ELFOSABI_LINUX
914dfb0f
DA
4705#undef elf32_bed
4706#define elf32_bed elf32_hppa_linux_bed
d952f17a 4707
d952f17a 4708#include "elf32-target.h"
225247f0
JT
4709
4710#undef TARGET_BIG_SYM
914dfb0f 4711#define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec
225247f0 4712#undef TARGET_BIG_NAME
914dfb0f 4713#define TARGET_BIG_NAME "elf32-hppa-netbsd"
d1036acb
L
4714#undef ELF_OSABI
4715#define ELF_OSABI ELFOSABI_NETBSD
914dfb0f
DA
4716#undef elf32_bed
4717#define elf32_bed elf32_hppa_netbsd_bed
225247f0
JT
4718
4719#include "elf32-target.h"
This page took 0.933151 seconds and 4 git commands to generate.