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