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