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