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