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