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