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