Fix excessive memory allocation attempts and possible integer overfloaws when attempt...
[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
d336fa6d
AM
1426 if ((need_entry & NEED_DYNREL) != 0
1427 && (sec->flags & SEC_ALLOC) != 0)
30667bf3
AM
1428 {
1429 /* Flag this symbol as having a non-got, non-plt reference
1430 so that we generate copy relocs if it turns out to be
1431 dynamic. */
0e1862bb 1432 if (hh != NULL && !bfd_link_pic (info))
a63e02c7 1433 hh->eh.non_got_ref = 1;
30667bf3
AM
1434
1435 /* If we are creating a shared library then we need to copy
1436 the reloc into the shared library. However, if we are
1437 linking with -Bsymbolic, we need only copy absolute
1438 relocs or relocs against symbols that are not defined in
1439 an object we are including in the link. PC- or DP- or
1440 DLT-relative relocs against any local sym or global sym
1441 with DEF_REGULAR set, can be discarded. At this point we
1442 have not seen all the input files, so it is possible that
1443 DEF_REGULAR is not set now but will be set later (it is
1444 never cleared). We account for that possibility below by
98ceb8ce 1445 storing information in the dyn_relocs field of the
30667bf3
AM
1446 hash table entry.
1447
1448 A similar situation to the -Bsymbolic case occurs when
1449 creating shared libraries and symbol visibility changes
1450 render the symbol local.
1451
1452 As it turns out, all the relocs we will be creating here
1453 are absolute, so we cannot remove them on -Bsymbolic
1454 links or visibility changes anyway. A STUB_REL reloc
1455 is absolute too, as in that case it is the reloc in the
1456 stub we will be creating, rather than copying the PCREL
56882138
AM
1457 reloc in the branch.
1458
1459 If on the other hand, we are creating an executable, we
1460 may need to keep relocations for symbols satisfied by a
1461 dynamic library if we manage to avoid copy relocs for the
1462 symbol. */
0e1862bb 1463 if ((bfd_link_pic (info)
446f2863 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)
875c0872 1471 && hh != NULL
a63e02c7
DA
1472 && (hh->eh.root.type == bfd_link_hash_defweak
1473 || !hh->eh.def_regular)))
30667bf3 1474 {
875c0872
DA
1475 struct elf32_hppa_dyn_reloc_entry *hdh_p;
1476 struct elf32_hppa_dyn_reloc_entry **hdh_head;
ec338859 1477
30667bf3
AM
1478 /* Create a reloc section in dynobj and make room for
1479 this reloc. */
98ceb8ce 1480 if (sreloc == NULL)
30667bf3 1481 {
83bac4b0
NC
1482 sreloc = _bfd_elf_make_dynamic_reloc_section
1483 (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1484
98ceb8ce 1485 if (sreloc == NULL)
30667bf3 1486 {
83bac4b0
NC
1487 bfd_set_error (bfd_error_bad_value);
1488 return FALSE;
30667bf3 1489 }
30667bf3
AM
1490 }
1491
98ceb8ce
AM
1492 /* If this is a global symbol, we count the number of
1493 relocations we need for this symbol. */
875c0872 1494 if (hh != NULL)
30667bf3 1495 {
875c0872 1496 hdh_head = &hh->dyn_relocs;
ec338859
AM
1497 }
1498 else
1499 {
1500 /* Track dynamic relocs needed for local syms too.
1501 We really need local syms available to do this
1502 easily. Oh well. */
875c0872 1503 asection *sr;
6edfbbad 1504 void *vpp;
87d72d41 1505 Elf_Internal_Sym *isym;
6edfbbad 1506
87d72d41
AM
1507 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1508 abfd, r_symndx);
1509 if (isym == NULL)
b34976b6 1510 return FALSE;
30667bf3 1511
87d72d41
AM
1512 sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1513 if (sr == NULL)
1514 sr = sec;
1515
6edfbbad
DJ
1516 vpp = &elf_section_data (sr)->local_dynrel;
1517 hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
ec338859
AM
1518 }
1519
875c0872
DA
1520 hdh_p = *hdh_head;
1521 if (hdh_p == NULL || hdh_p->sec != sec)
ec338859 1522 {
a63e02c7 1523 hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
875c0872 1524 if (hdh_p == NULL)
b34976b6 1525 return FALSE;
a63e02c7 1526 hdh_p->hdh_next = *hdh_head;
875c0872
DA
1527 *hdh_head = hdh_p;
1528 hdh_p->sec = sec;
1529 hdh_p->count = 0;
98ceb8ce 1530#if RELATIVE_DYNRELOCS
875c0872 1531 hdh_p->relative_count = 0;
98ceb8ce 1532#endif
ec338859 1533 }
98ceb8ce 1534
875c0872 1535 hdh_p->count += 1;
98ceb8ce 1536#if RELATIVE_DYNRELOCS
ec338859 1537 if (!IS_ABSOLUTE_RELOC (rtype))
875c0872 1538 hdh_p->relative_count += 1;
98ceb8ce 1539#endif
30667bf3
AM
1540 }
1541 }
1542 }
edd21aca 1543
b34976b6 1544 return TRUE;
edd21aca
AM
1545}
1546
30667bf3
AM
1547/* Return the section that should be marked against garbage collection
1548 for a given relocation. */
1549
1550static asection *
c39a58e6 1551elf32_hppa_gc_mark_hook (asection *sec,
07adf181 1552 struct bfd_link_info *info,
875c0872
DA
1553 Elf_Internal_Rela *rela,
1554 struct elf_link_hash_entry *hh,
c39a58e6 1555 Elf_Internal_Sym *sym)
30667bf3 1556{
875c0872 1557 if (hh != NULL)
07adf181
AM
1558 switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1559 {
1560 case R_PARISC_GNU_VTINHERIT:
1561 case R_PARISC_GNU_VTENTRY:
1562 return NULL;
1563 }
30667bf3 1564
07adf181 1565 return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
30667bf3
AM
1566}
1567
edfc032f
AM
1568/* Support for core dump NOTE sections. */
1569
1570static bfd_boolean
1571elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1572{
1573 int offset;
1574 size_t size;
1575
1576 switch (note->descsz)
1577 {
1578 default:
1579 return FALSE;
1580
1581 case 396: /* Linux/hppa */
1582 /* pr_cursig */
228e534f 1583 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
edfc032f
AM
1584
1585 /* pr_pid */
228e534f 1586 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
edfc032f
AM
1587
1588 /* pr_reg */
1589 offset = 72;
1590 size = 320;
1591
1592 break;
1593 }
1594
1595 /* Make a ".reg/999" section. */
1596 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1597 size, note->descpos + offset);
1598}
1599
1600static bfd_boolean
1601elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1602{
1603 switch (note->descsz)
1604 {
1605 default:
1606 return FALSE;
1607
1608 case 124: /* Linux/hppa elf_prpsinfo. */
228e534f 1609 elf_tdata (abfd)->core->program
edfc032f 1610 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
228e534f 1611 elf_tdata (abfd)->core->command
edfc032f
AM
1612 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1613 }
1614
1615 /* Note that for some reason, a spurious space is tacked
1616 onto the end of the args in some (at least one anyway)
1617 implementations, so strip it off if it exists. */
1618 {
228e534f 1619 char *command = elf_tdata (abfd)->core->command;
edfc032f
AM
1620 int n = strlen (command);
1621
1622 if (0 < n && command[n - 1] == ' ')
1623 command[n - 1] = '\0';
1624 }
1625
1626 return TRUE;
1627}
1628
74d1c347
AM
1629/* Our own version of hide_symbol, so that we can keep plt entries for
1630 plabels. */
1631
1632static void
c39a58e6 1633elf32_hppa_hide_symbol (struct bfd_link_info *info,
875c0872 1634 struct elf_link_hash_entry *eh,
c39a58e6 1635 bfd_boolean force_local)
74d1c347 1636{
e5094212
AM
1637 if (force_local)
1638 {
875c0872
DA
1639 eh->forced_local = 1;
1640 if (eh->dynindx != -1)
e5094212 1641 {
875c0872 1642 eh->dynindx = -1;
e5094212 1643 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
875c0872 1644 eh->dynstr_index);
e5094212 1645 }
31fc8a0b
NC
1646
1647 /* PR 16082: Remove version information from hidden symbol. */
1648 eh->verinfo.verdef = NULL;
1649 eh->verinfo.vertree = NULL;
e5094212
AM
1650 }
1651
4340287b
DA
1652 /* STT_GNU_IFUNC symbol must go through PLT. */
1653 if (! hppa_elf_hash_entry (eh)->plabel
1654 && eh->type != STT_GNU_IFUNC)
74d1c347 1655 {
875c0872 1656 eh->needs_plt = 0;
4340287b 1657 eh->plt = elf_hash_table (info)->init_plt_offset;
74d1c347
AM
1658 }
1659}
1660
30667bf3
AM
1661/* Adjust a symbol defined by a dynamic object and referenced by a
1662 regular object. The current definition is in some section of the
1663 dynamic object, but we're not including those sections. We have to
1664 change the definition to something the rest of the link can
1665 understand. */
252b5132 1666
b34976b6 1667static bfd_boolean
c39a58e6 1668elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
875c0872 1669 struct elf_link_hash_entry *eh)
252b5132 1670{
83c81bfe 1671 struct elf32_hppa_link_hash_table *htab;
5474d94f 1672 asection *sec, *srel;
30667bf3
AM
1673
1674 /* If this is a function, put it in the procedure linkage table. We
067fa4a6 1675 will fill in the contents of the procedure linkage table later. */
875c0872
DA
1676 if (eh->type == STT_FUNC
1677 || eh->needs_plt)
30667bf3 1678 {
4340287b
DA
1679 /* If the symbol is used by a plabel, we must allocate a PLT slot.
1680 The refcounts are not reliable when it has been hidden since
1681 hide_symbol can be called before the plabel flag is set. */
d336fa6d 1682 if (hppa_elf_hash_entry (eh)->plabel)
4340287b
DA
1683 eh->plt.refcount = 1;
1684
d336fa6d
AM
1685 else if (eh->plt.refcount <= 0
1686 || SYMBOL_CALLS_LOCAL (info, eh)
1687 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
30667bf3
AM
1688 {
1689 /* The .plt entry is not needed when:
1690 a) Garbage collection has removed all references to the
1691 symbol, or
1692 b) We know for certain the symbol is defined in this
74d1c347
AM
1693 object, and it's not a weak definition, nor is the symbol
1694 used by a plabel relocation. Either this object is the
1695 application or we are doing a shared symbolic link. */
1696
875c0872
DA
1697 eh->plt.offset = (bfd_vma) -1;
1698 eh->needs_plt = 0;
30667bf3 1699 }
4dc86686 1700
b34976b6 1701 return TRUE;
30667bf3 1702 }
bbd7ec4a 1703 else
875c0872 1704 eh->plt.offset = (bfd_vma) -1;
edd21aca 1705
30667bf3
AM
1706 /* If this is a weak symbol, and there is a real definition, the
1707 processor independent code will have arranged for us to see the
1708 real definition first, and we can just use the same value. */
875c0872 1709 if (eh->u.weakdef != NULL)
edd21aca 1710 {
875c0872
DA
1711 if (eh->u.weakdef->root.type != bfd_link_hash_defined
1712 && eh->u.weakdef->root.type != bfd_link_hash_defweak)
49e9d0d3 1713 abort ();
875c0872
DA
1714 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1715 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
4fc8051d 1716 if (ELIMINATE_COPY_RELOCS)
875c0872 1717 eh->non_got_ref = eh->u.weakdef->non_got_ref;
b34976b6 1718 return TRUE;
30667bf3 1719 }
edd21aca 1720
30667bf3
AM
1721 /* This is a reference to a symbol defined by a dynamic object which
1722 is not a function. */
1723
1724 /* If we are creating a shared library, we must presume that the
1725 only references to the symbol are via the global offset table.
1726 For such cases we need not do anything here; the relocations will
1727 be handled correctly by relocate_section. */
0e1862bb 1728 if (bfd_link_pic (info))
b34976b6 1729 return TRUE;
30667bf3
AM
1730
1731 /* If there are no references to this symbol that do not use the
1732 GOT, we don't need to generate a copy reloc. */
875c0872 1733 if (!eh->non_got_ref)
b34976b6 1734 return TRUE;
30667bf3 1735
4fc8051d 1736 if (ELIMINATE_COPY_RELOCS)
ebe50bae 1737 {
875c0872
DA
1738 struct elf32_hppa_link_hash_entry *hh;
1739 struct elf32_hppa_dyn_reloc_entry *hdh_p;
ebe50bae 1740
875c0872 1741 hh = hppa_elf_hash_entry (eh);
a63e02c7 1742 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
4fc8051d 1743 {
875c0872
DA
1744 sec = hdh_p->sec->output_section;
1745 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
4fc8051d
AM
1746 break;
1747 }
1748
1749 /* If we didn't find any dynamic relocs in read-only sections, then
1750 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
875c0872 1751 if (hdh_p == NULL)
4fc8051d 1752 {
875c0872 1753 eh->non_got_ref = 0;
4fc8051d
AM
1754 return TRUE;
1755 }
ebe50bae
AM
1756 }
1757
30667bf3
AM
1758 /* We must allocate the symbol in our .dynbss section, which will
1759 become part of the .bss section of the executable. There will be
1760 an entry for this symbol in the .dynsym section. The dynamic
1761 object will contain position independent code, so all references
1762 from the dynamic object to this symbol will go through the global
1763 offset table. The dynamic linker will use the .dynsym entry to
1764 determine the address it must put in the global offset table, so
1765 both the dynamic object and the regular object will refer to the
1766 same memory location for the variable. */
1767
3ac8354b 1768 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1769 if (htab == NULL)
1770 return FALSE;
30667bf3
AM
1771
1772 /* We must generate a COPY reloc to tell the dynamic linker to
1773 copy the initial value out of the dynamic object and into the
3ac8354b 1774 runtime process image. */
5474d94f
AM
1775 if ((eh->root.u.def.section->flags & SEC_READONLY) != 0)
1776 {
1777 sec = htab->etab.sdynrelro;
1778 srel = htab->etab.sreldynrelro;
1779 }
1780 else
1781 {
1782 sec = htab->etab.sdynbss;
1783 srel = htab->etab.srelbss;
1784 }
1d7e9d18 1785 if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
30667bf3 1786 {
5474d94f 1787 srel->size += sizeof (Elf32_External_Rela);
875c0872 1788 eh->needs_copy = 1;
edd21aca 1789 }
252b5132 1790
6cabe1ea 1791 return _bfd_elf_adjust_dynamic_copy (info, eh, sec);
252b5132
RH
1792}
1793
46434633 1794/* If EH is undefined, make it dynamic if that makes sense. */
595e0a47
AM
1795
1796static bfd_boolean
46434633
AM
1797ensure_undef_dynamic (struct bfd_link_info *info,
1798 struct elf_link_hash_entry *eh)
595e0a47 1799{
46434633
AM
1800 struct elf_link_hash_table *htab = elf_hash_table (info);
1801
1802 if (htab->dynamic_sections_created
1803 && (eh->root.type == bfd_link_hash_undefweak
1804 || eh->root.type == bfd_link_hash_undefined)
1805 && eh->dynindx == -1
595e0a47
AM
1806 && !eh->forced_local
1807 && eh->type != STT_PARISC_MILLI
60c1b909 1808 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh)
595e0a47
AM
1809 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
1810 return bfd_elf_link_record_dynamic_symbol (info, eh);
1811 return TRUE;
1812}
1813
e5ee5df1 1814/* Allocate space in the .plt for entries that won't have relocations.
a252afa4 1815 ie. plabel entries. */
a8d02d66 1816
b34976b6 1817static bfd_boolean
875c0872 1818allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
a8d02d66
AM
1819{
1820 struct bfd_link_info *info;
1821 struct elf32_hppa_link_hash_table *htab;
875c0872
DA
1822 struct elf32_hppa_link_hash_entry *hh;
1823 asection *sec;
a8d02d66 1824
875c0872 1825 if (eh->root.type == bfd_link_hash_indirect)
b34976b6 1826 return TRUE;
a8d02d66 1827
875c0872 1828 info = (struct bfd_link_info *) inf;
9b52905e 1829 hh = hppa_elf_hash_entry (eh);
a8d02d66 1830 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1831 if (htab == NULL)
1832 return FALSE;
1833
a63e02c7 1834 if (htab->etab.dynamic_sections_created
875c0872 1835 && eh->plt.refcount > 0)
e5ee5df1 1836 {
46434633 1837 if (!ensure_undef_dynamic (info, eh))
595e0a47 1838 return FALSE;
e5ee5df1 1839
0e1862bb 1840 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
e5ee5df1 1841 {
067fa4a6
AM
1842 /* Allocate these later. From this point on, h->plabel
1843 means that the plt entry is only used by a plabel.
1844 We'll be using a normal plt entry for this symbol, so
1845 clear the plabel indicator. */
68ffbac6 1846
875c0872 1847 hh->plabel = 0;
e5ee5df1 1848 }
875c0872 1849 else if (hh->plabel)
e5ee5df1
AM
1850 {
1851 /* Make an entry in the .plt section for plabel references
1852 that won't have a .plt entry for other reasons. */
ce558b89 1853 sec = htab->etab.splt;
875c0872
DA
1854 eh->plt.offset = sec->size;
1855 sec->size += PLT_ENTRY_SIZE;
247d6c4c
AM
1856 if (bfd_link_pic (info))
1857 htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
a8d02d66
AM
1858 }
1859 else
e5ee5df1
AM
1860 {
1861 /* No .plt entry needed. */
875c0872
DA
1862 eh->plt.offset = (bfd_vma) -1;
1863 eh->needs_plt = 0;
e5ee5df1
AM
1864 }
1865 }
1866 else
1867 {
875c0872
DA
1868 eh->plt.offset = (bfd_vma) -1;
1869 eh->needs_plt = 0;
a8d02d66
AM
1870 }
1871
b34976b6 1872 return TRUE;
a8d02d66
AM
1873}
1874
4dc86686
AM
1875/* Allocate space in .plt, .got and associated reloc sections for
1876 global syms. */
1877
b34976b6 1878static bfd_boolean
875c0872 1879allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
4dc86686
AM
1880{
1881 struct bfd_link_info *info;
83c81bfe 1882 struct elf32_hppa_link_hash_table *htab;
875c0872
DA
1883 asection *sec;
1884 struct elf32_hppa_link_hash_entry *hh;
1885 struct elf32_hppa_dyn_reloc_entry *hdh_p;
4dc86686 1886
875c0872 1887 if (eh->root.type == bfd_link_hash_indirect)
b34976b6 1888 return TRUE;
73a74a62 1889
c39a58e6 1890 info = inf;
83c81bfe 1891 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
1892 if (htab == NULL)
1893 return FALSE;
1894
875c0872 1895 hh = hppa_elf_hash_entry (eh);
68ffbac6 1896
a63e02c7 1897 if (htab->etab.dynamic_sections_created
875c0872
DA
1898 && eh->plt.offset != (bfd_vma) -1
1899 && !hh->plabel
1900 && eh->plt.refcount > 0)
4dc86686 1901 {
e5ee5df1 1902 /* Make an entry in the .plt section. */
ce558b89 1903 sec = htab->etab.splt;
875c0872
DA
1904 eh->plt.offset = sec->size;
1905 sec->size += PLT_ENTRY_SIZE;
3ac8354b 1906
e5ee5df1 1907 /* We also need to make an entry in the .rela.plt section. */
ce558b89 1908 htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
e5ee5df1 1909 htab->need_plt_stub = 1;
4dc86686 1910 }
edd21aca 1911
875c0872 1912 if (eh->got.refcount > 0)
4dc86686 1913 {
46434633 1914 if (!ensure_undef_dynamic (info, eh))
595e0a47 1915 return FALSE;
446f2863 1916
ce558b89 1917 sec = htab->etab.sgot;
875c0872
DA
1918 eh->got.offset = sec->size;
1919 sec->size += GOT_ENTRY_SIZE;
9b52905e
NC
1920 /* R_PARISC_TLS_GD* needs two GOT entries */
1921 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
1922 sec->size += GOT_ENTRY_SIZE * 2;
1923 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
1924 sec->size += GOT_ENTRY_SIZE;
a63e02c7 1925 if (htab->etab.dynamic_sections_created
0e1862bb 1926 && (bfd_link_pic (info)
875c0872 1927 || (eh->dynindx != -1
d336fa6d
AM
1928 && !SYMBOL_REFERENCES_LOCAL (info, eh)))
1929 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
ce757d15 1930 {
ce558b89 1931 htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
9b52905e 1932 if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
ce558b89 1933 htab->etab.srelgot->size += 2 * sizeof (Elf32_External_Rela);
9b52905e 1934 else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
ce558b89 1935 htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
ce757d15 1936 }
4dc86686
AM
1937 }
1938 else
875c0872 1939 eh->got.offset = (bfd_vma) -1;
30667bf3 1940
d336fa6d
AM
1941 /* If no dynamic sections we can't have dynamic relocs. */
1942 if (!htab->etab.dynamic_sections_created)
1943 hh->dyn_relocs = NULL;
1944
875c0872 1945 if (hh->dyn_relocs == NULL)
b34976b6 1946 return TRUE;
30667bf3 1947
98ceb8ce
AM
1948 /* If this is a -Bsymbolic shared link, then we need to discard all
1949 space allocated for dynamic pc-relative relocs against symbols
1950 defined in a regular object. For the normal shared case, discard
1951 space for relocs that have become local due to symbol visibility
1952 changes. */
0e1862bb 1953 if (bfd_link_pic (info))
446f2863 1954 {
46434633
AM
1955 /* Discard relocs on undefined syms with non-default visibility. */
1956 if ((eh->root.type == bfd_link_hash_undefined
d336fa6d
AM
1957 && ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
1958 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
46434633
AM
1959 hh->dyn_relocs = NULL;
1960
98ceb8ce 1961#if RELATIVE_DYNRELOCS
46434633 1962 else if (SYMBOL_CALLS_LOCAL (info, eh))
446f2863 1963 {
875c0872 1964 struct elf32_hppa_dyn_reloc_entry **hdh_pp;
30667bf3 1965
875c0872 1966 for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
98ceb8ce 1967 {
875c0872
DA
1968 hdh_p->count -= hdh_p->relative_count;
1969 hdh_p->relative_count = 0;
1970 if (hdh_p->count == 0)
a63e02c7 1971 *hdh_pp = hdh_p->hdh_next;
98ceb8ce 1972 else
a63e02c7 1973 hdh_pp = &hdh_p->hdh_next;
98ceb8ce
AM
1974 }
1975 }
1976#endif
4fc8051d 1977
46434633 1978 if (hh->dyn_relocs != NULL)
22d606e9 1979 {
46434633 1980 if (!ensure_undef_dynamic (info, eh))
595e0a47 1981 return FALSE;
22d606e9 1982 }
446f2863 1983 }
d336fa6d 1984 else if (ELIMINATE_COPY_RELOCS)
30667bf3 1985 {
98ceb8ce
AM
1986 /* For the non-shared case, discard space for relocs against
1987 symbols which turn out to need copy relocs or are not
1988 dynamic. */
68ffbac6 1989
875c0872 1990 if (!eh->non_got_ref
d336fa6d 1991 && !eh->def_regular)
98ceb8ce 1992 {
46434633 1993 if (!ensure_undef_dynamic (info, eh))
595e0a47 1994 return FALSE;
98ceb8ce 1995
46434633
AM
1996 if (eh->dynindx == -1)
1997 hh->dyn_relocs = NULL;
98ceb8ce 1998 }
46434633
AM
1999 else
2000 hh->dyn_relocs = NULL;
30667bf3 2001 }
30667bf3 2002
98ceb8ce 2003 /* Finally, allocate space. */
a63e02c7 2004 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
30667bf3 2005 {
875c0872
DA
2006 asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2007 sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
30667bf3 2008 }
30667bf3 2009
b34976b6 2010 return TRUE;
30667bf3 2011}
30667bf3 2012
d5c73c2f
AM
2013/* This function is called via elf_link_hash_traverse to force
2014 millicode symbols local so they do not end up as globals in the
2015 dynamic symbol table. We ought to be able to do this in
2016 adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2017 for all dynamic symbols. Arguably, this is a bug in
2018 elf_adjust_dynamic_symbol. */
2019
b34976b6 2020static bfd_boolean
875c0872 2021clobber_millicode_symbols (struct elf_link_hash_entry *eh,
c39a58e6 2022 struct bfd_link_info *info)
d5c73c2f 2023{
875c0872
DA
2024 if (eh->type == STT_PARISC_MILLI
2025 && !eh->forced_local)
e0522e89 2026 {
875c0872 2027 elf32_hppa_hide_symbol (info, eh, TRUE);
e0522e89 2028 }
b34976b6 2029 return TRUE;
d5c73c2f
AM
2030}
2031
98ceb8ce
AM
2032/* Find any dynamic relocs that apply to read-only sections. */
2033
b34976b6 2034static bfd_boolean
875c0872 2035readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
98ceb8ce 2036{
875c0872
DA
2037 struct elf32_hppa_link_hash_entry *hh;
2038 struct elf32_hppa_dyn_reloc_entry *hdh_p;
98ceb8ce 2039
875c0872 2040 hh = hppa_elf_hash_entry (eh);
a63e02c7 2041 for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
98ceb8ce 2042 {
875c0872 2043 asection *sec = hdh_p->sec->output_section;
98ceb8ce 2044
875c0872 2045 if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
98ceb8ce 2046 {
c39a58e6 2047 struct bfd_link_info *info = inf;
98ceb8ce
AM
2048
2049 info->flags |= DF_TEXTREL;
2050
2051 /* Not an error, just cut short the traversal. */
b34976b6 2052 return FALSE;
98ceb8ce
AM
2053 }
2054 }
b34976b6 2055 return TRUE;
98ceb8ce
AM
2056}
2057
30667bf3
AM
2058/* Set the sizes of the dynamic sections. */
2059
b34976b6 2060static bfd_boolean
c39a58e6
AM
2061elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2062 struct bfd_link_info *info)
30667bf3 2063{
83c81bfe 2064 struct elf32_hppa_link_hash_table *htab;
30667bf3 2065 bfd *dynobj;
98ceb8ce 2066 bfd *ibfd;
875c0872 2067 asection *sec;
b34976b6 2068 bfd_boolean relocs;
30667bf3 2069
83c81bfe 2070 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
2071 if (htab == NULL)
2072 return FALSE;
2073
a63e02c7 2074 dynobj = htab->etab.dynobj;
49e9d0d3
AM
2075 if (dynobj == NULL)
2076 abort ();
30667bf3 2077
a63e02c7 2078 if (htab->etab.dynamic_sections_created)
30667bf3
AM
2079 {
2080 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 2081 if (bfd_link_executable (info) && !info->nointerp)
30667bf3 2082 {
3d4d4302 2083 sec = bfd_get_linker_section (dynobj, ".interp");
875c0872 2084 if (sec == NULL)
49e9d0d3 2085 abort ();
875c0872
DA
2086 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2087 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
30667bf3 2088 }
74d1c347 2089
d5c73c2f 2090 /* Force millicode symbols local. */
a63e02c7 2091 elf_link_hash_traverse (&htab->etab,
d5c73c2f
AM
2092 clobber_millicode_symbols,
2093 info);
68fb2e56 2094 }
d5c73c2f 2095
98ceb8ce
AM
2096 /* Set up .got and .plt offsets for local syms, and space for local
2097 dynamic relocs. */
c72f2fb2 2098 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
68fb2e56
AM
2099 {
2100 bfd_signed_vma *local_got;
2101 bfd_signed_vma *end_local_got;
2102 bfd_signed_vma *local_plt;
2103 bfd_signed_vma *end_local_plt;
2104 bfd_size_type locsymcount;
2105 Elf_Internal_Shdr *symtab_hdr;
2106 asection *srel;
9b52905e 2107 char *local_tls_type;
74d1c347 2108
98ceb8ce 2109 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
68fb2e56 2110 continue;
4dc86686 2111
875c0872 2112 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
98ceb8ce 2113 {
875c0872 2114 struct elf32_hppa_dyn_reloc_entry *hdh_p;
98ceb8ce 2115
875c0872
DA
2116 for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2117 elf_section_data (sec)->local_dynrel);
2118 hdh_p != NULL;
a63e02c7 2119 hdh_p = hdh_p->hdh_next)
98ceb8ce 2120 {
875c0872
DA
2121 if (!bfd_is_abs_section (hdh_p->sec)
2122 && bfd_is_abs_section (hdh_p->sec->output_section))
ec338859
AM
2123 {
2124 /* Input section has been discarded, either because
2125 it is a copy of a linkonce section or due to
2126 linker script /DISCARD/, so we'll be discarding
2127 the relocs too. */
2128 }
875c0872 2129 else if (hdh_p->count != 0)
ec338859 2130 {
875c0872
DA
2131 srel = elf_section_data (hdh_p->sec)->sreloc;
2132 srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2133 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
248866a8 2134 info->flags |= DF_TEXTREL;
ec338859 2135 }
98ceb8ce
AM
2136 }
2137 }
2138
2139 local_got = elf_local_got_refcounts (ibfd);
68fb2e56
AM
2140 if (!local_got)
2141 continue;
74d1c347 2142
98ceb8ce 2143 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
68fb2e56
AM
2144 locsymcount = symtab_hdr->sh_info;
2145 end_local_got = local_got + locsymcount;
9b52905e 2146 local_tls_type = hppa_elf_local_got_tls_type (ibfd);
ce558b89
AM
2147 sec = htab->etab.sgot;
2148 srel = htab->etab.srelgot;
68fb2e56
AM
2149 for (; local_got < end_local_got; ++local_got)
2150 {
2151 if (*local_got > 0)
4dc86686 2152 {
875c0872
DA
2153 *local_got = sec->size;
2154 sec->size += GOT_ENTRY_SIZE;
9b52905e
NC
2155 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2156 sec->size += 2 * GOT_ENTRY_SIZE;
2157 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2158 sec->size += GOT_ENTRY_SIZE;
0e1862bb 2159 if (bfd_link_pic (info))
9b52905e
NC
2160 {
2161 srel->size += sizeof (Elf32_External_Rela);
2162 if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2163 srel->size += 2 * sizeof (Elf32_External_Rela);
2164 else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2165 srel->size += sizeof (Elf32_External_Rela);
2166 }
4dc86686 2167 }
68fb2e56
AM
2168 else
2169 *local_got = (bfd_vma) -1;
9b52905e
NC
2170
2171 ++local_tls_type;
68fb2e56 2172 }
74d1c347 2173
68fb2e56
AM
2174 local_plt = end_local_got;
2175 end_local_plt = local_plt + locsymcount;
a63e02c7 2176 if (! htab->etab.dynamic_sections_created)
68fb2e56
AM
2177 {
2178 /* Won't be used, but be safe. */
2179 for (; local_plt < end_local_plt; ++local_plt)
2180 *local_plt = (bfd_vma) -1;
2181 }
2182 else
2183 {
ce558b89
AM
2184 sec = htab->etab.splt;
2185 srel = htab->etab.srelplt;
74d1c347
AM
2186 for (; local_plt < end_local_plt; ++local_plt)
2187 {
2188 if (*local_plt > 0)
2189 {
875c0872
DA
2190 *local_plt = sec->size;
2191 sec->size += PLT_ENTRY_SIZE;
0e1862bb 2192 if (bfd_link_pic (info))
eea6121a 2193 srel->size += sizeof (Elf32_External_Rela);
74d1c347
AM
2194 }
2195 else
2196 *local_plt = (bfd_vma) -1;
2197 }
2198 }
30667bf3 2199 }
68ffbac6 2200
9b52905e
NC
2201 if (htab->tls_ldm_got.refcount > 0)
2202 {
68ffbac6 2203 /* Allocate 2 got entries and 1 dynamic reloc for
9b52905e 2204 R_PARISC_TLS_DTPMOD32 relocs. */
ce558b89
AM
2205 htab->tls_ldm_got.offset = htab->etab.sgot->size;
2206 htab->etab.sgot->size += (GOT_ENTRY_SIZE * 2);
2207 htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
9b52905e
NC
2208 }
2209 else
2210 htab->tls_ldm_got.offset = -1;
30667bf3 2211
e5ee5df1
AM
2212 /* Do all the .plt entries without relocs first. The dynamic linker
2213 uses the last .plt reloc to find the end of the .plt (and hence
2214 the start of the .got) for lazy linking. */
a63e02c7 2215 elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
a8d02d66 2216
98ceb8ce
AM
2217 /* Allocate global sym .plt and .got entries, and space for global
2218 sym dynamic relocs. */
a63e02c7 2219 elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
30667bf3
AM
2220
2221 /* The check_relocs and adjust_dynamic_symbol entry points have
2222 determined the sizes of the various dynamic sections. Allocate
2223 memory for them. */
b34976b6 2224 relocs = FALSE;
875c0872 2225 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
30667bf3 2226 {
875c0872 2227 if ((sec->flags & SEC_LINKER_CREATED) == 0)
30667bf3
AM
2228 continue;
2229
ce558b89 2230 if (sec == htab->etab.splt)
68fb2e56 2231 {
83c81bfe 2232 if (htab->need_plt_stub)
68fb2e56
AM
2233 {
2234 /* Make space for the plt stub at the end of the .plt
2235 section. We want this stub right at the end, up
2236 against the .got section. */
ce558b89 2237 int gotalign = bfd_section_alignment (dynobj, htab->etab.sgot);
875c0872 2238 int pltalign = bfd_section_alignment (dynobj, sec);
68fb2e56 2239 bfd_size_type mask;
30667bf3 2240
68fb2e56 2241 if (gotalign > pltalign)
a253d456 2242 (void) bfd_set_section_alignment (dynobj, sec, gotalign);
68fb2e56 2243 mask = ((bfd_size_type) 1 << gotalign) - 1;
875c0872 2244 sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
68fb2e56
AM
2245 }
2246 }
ce558b89 2247 else if (sec == htab->etab.sgot
5474d94f
AM
2248 || sec == htab->etab.sdynbss
2249 || sec == htab->etab.sdynrelro)
68fb2e56 2250 ;
0112cd26 2251 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
30667bf3 2252 {
875c0872 2253 if (sec->size != 0)
30667bf3 2254 {
4e12ff7f
AM
2255 /* Remember whether there are any reloc sections other
2256 than .rela.plt. */
ce558b89 2257 if (sec != htab->etab.srelplt)
b34976b6 2258 relocs = TRUE;
47d89dba 2259
30667bf3
AM
2260 /* We use the reloc_count field as a counter if we need
2261 to copy relocs into the output file. */
875c0872 2262 sec->reloc_count = 0;
30667bf3
AM
2263 }
2264 }
30667bf3
AM
2265 else
2266 {
2267 /* It's not one of our sections, so don't allocate space. */
2268 continue;
2269 }
2270
875c0872 2271 if (sec->size == 0)
30667bf3
AM
2272 {
2273 /* If we don't need this section, strip it from the
2274 output file. This is mostly to handle .rela.bss and
2275 .rela.plt. We must create both sections in
2276 create_dynamic_sections, because they must be created
2277 before the linker maps input sections to output
2278 sections. The linker does that before
2279 adjust_dynamic_symbol is called, and it is that
2280 function which decides whether anything needs to go
2281 into these sections. */
875c0872 2282 sec->flags |= SEC_EXCLUDE;
30667bf3
AM
2283 continue;
2284 }
2285
c456f082
AM
2286 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2287 continue;
2288
30667bf3
AM
2289 /* Allocate memory for the section contents. Zero it, because
2290 we may not fill in all the reloc sections. */
875c0872 2291 sec->contents = bfd_zalloc (dynobj, sec->size);
c456f082 2292 if (sec->contents == NULL)
b34976b6 2293 return FALSE;
30667bf3
AM
2294 }
2295
a63e02c7 2296 if (htab->etab.dynamic_sections_created)
30667bf3
AM
2297 {
2298 /* Like IA-64 and HPPA64, always create a DT_PLTGOT. It
2299 actually has nothing to do with the PLT, it is how we
2300 communicate the LTP value of a load module to the dynamic
2301 linker. */
dc810e39 2302#define add_dynamic_entry(TAG, VAL) \
5a580b3a 2303 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39
AM
2304
2305 if (!add_dynamic_entry (DT_PLTGOT, 0))
b34976b6 2306 return FALSE;
30667bf3
AM
2307
2308 /* Add some entries to the .dynamic section. We fill in the
2309 values later, in elf32_hppa_finish_dynamic_sections, but we
2310 must add the entries now so that we get the correct size for
2311 the .dynamic section. The DT_DEBUG entry is filled in by the
2312 dynamic linker and used by the debugger. */
0e1862bb 2313 if (bfd_link_executable (info))
30667bf3 2314 {
dc810e39 2315 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 2316 return FALSE;
30667bf3
AM
2317 }
2318
ce558b89 2319 if (htab->etab.srelplt->size != 0)
30667bf3 2320 {
dc810e39
AM
2321 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2322 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2323 || !add_dynamic_entry (DT_JMPREL, 0))
b34976b6 2324 return FALSE;
30667bf3
AM
2325 }
2326
2327 if (relocs)
2328 {
dc810e39
AM
2329 if (!add_dynamic_entry (DT_RELA, 0)
2330 || !add_dynamic_entry (DT_RELASZ, 0)
2331 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
b34976b6 2332 return FALSE;
30667bf3 2333
98ceb8ce
AM
2334 /* If any dynamic relocs apply to a read-only section,
2335 then we need a DT_TEXTREL entry. */
248866a8 2336 if ((info->flags & DF_TEXTREL) == 0)
a63e02c7 2337 elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
98ceb8ce
AM
2338
2339 if ((info->flags & DF_TEXTREL) != 0)
2340 {
2341 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 2342 return FALSE;
98ceb8ce 2343 }
30667bf3
AM
2344 }
2345 }
dc810e39 2346#undef add_dynamic_entry
30667bf3 2347
b34976b6 2348 return TRUE;
30667bf3
AM
2349}
2350
30667bf3
AM
2351/* External entry points for sizing and building linker stubs. */
2352
b4655ea9
AM
2353/* Set up various things so that we can make a list of input sections
2354 for each output section included in the link. Returns -1 on error,
cedb70c5 2355 0 when no stubs will be needed, and 1 on success. */
30667bf3 2356
b4655ea9 2357int
c39a58e6 2358elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
30667bf3
AM
2359{
2360 bfd *input_bfd;
b4655ea9 2361 unsigned int bfd_count;
7292b3ac 2362 unsigned int top_id, top_index;
30667bf3 2363 asection *section;
25f72752 2364 asection **input_list, **list;
dc810e39 2365 bfd_size_type amt;
b4655ea9 2366 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
30667bf3 2367
4dfe6ac6
NC
2368 if (htab == NULL)
2369 return -1;
2370
1badb539
AM
2371 /* Count the number of input BFDs and find the top input section id. */
2372 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
30667bf3 2373 input_bfd != NULL;
c72f2fb2 2374 input_bfd = input_bfd->link.next)
30667bf3
AM
2375 {
2376 bfd_count += 1;
25f72752
AM
2377 for (section = input_bfd->sections;
2378 section != NULL;
2379 section = section->next)
2380 {
2381 if (top_id < section->id)
2382 top_id = section->id;
2383 }
30667bf3 2384 }
b4655ea9 2385 htab->bfd_count = bfd_count;
30667bf3 2386
dc810e39 2387 amt = sizeof (struct map_stub) * (top_id + 1);
c39a58e6 2388 htab->stub_group = bfd_zmalloc (amt);
83c81bfe 2389 if (htab->stub_group == NULL)
b4655ea9 2390 return -1;
1badb539 2391
b4655ea9 2392 /* We can't use output_bfd->section_count here to find the top output
1badb539 2393 section index as some sections may have been removed, and
8423293d 2394 strip_excluded_output_sections doesn't renumber the indices. */
1badb539
AM
2395 for (section = output_bfd->sections, top_index = 0;
2396 section != NULL;
2397 section = section->next)
2398 {
2399 if (top_index < section->index)
2400 top_index = section->index;
2401 }
2402
b4655ea9 2403 htab->top_index = top_index;
dc810e39 2404 amt = sizeof (asection *) * (top_index + 1);
c39a58e6 2405 input_list = bfd_malloc (amt);
b4655ea9 2406 htab->input_list = input_list;
25f72752 2407 if (input_list == NULL)
b4655ea9 2408 return -1;
25f72752 2409
1badb539
AM
2410 /* For sections we aren't interested in, mark their entries with a
2411 value we can check later. */
2412 list = input_list + top_index;
2413 do
2414 *list = bfd_abs_section_ptr;
2415 while (list-- != input_list);
2416
2417 for (section = output_bfd->sections;
2418 section != NULL;
2419 section = section->next)
2420 {
47d89dba 2421 if ((section->flags & SEC_CODE) != 0)
1badb539
AM
2422 input_list[section->index] = NULL;
2423 }
2424
b4655ea9
AM
2425 return 1;
2426}
2427
2428/* The linker repeatedly calls this function for each input section,
2429 in the order that input sections are linked into output sections.
2430 Build lists of input sections to determine groupings between which
2431 we may insert linker stubs. */
2432
2433void
c39a58e6 2434elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
b4655ea9
AM
2435{
2436 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2437
4dfe6ac6
NC
2438 if (htab == NULL)
2439 return;
2440
b4655ea9 2441 if (isec->output_section->index <= htab->top_index)
25f72752 2442 {
b4655ea9
AM
2443 asection **list = htab->input_list + isec->output_section->index;
2444 if (*list != bfd_abs_section_ptr)
25f72752 2445 {
b4655ea9 2446 /* Steal the link_sec pointer for our list. */
83c81bfe 2447#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
b4655ea9
AM
2448 /* This happens to make the list in reverse order,
2449 which is what we want. */
2450 PREV_SEC (isec) = *list;
2451 *list = isec;
25f72752
AM
2452 }
2453 }
b4655ea9 2454}
25f72752 2455
b4655ea9
AM
2456/* See whether we can group stub sections together. Grouping stub
2457 sections may result in fewer stubs. More importantly, we need to
2458 put all .init* and .fini* stubs at the beginning of the .init or
2459 .fini output sections respectively, because glibc splits the
2460 _init and _fini functions into multiple parts. Putting a stub in
2461 the middle of a function is not a good idea. */
2462
2463static void
c39a58e6
AM
2464group_sections (struct elf32_hppa_link_hash_table *htab,
2465 bfd_size_type stub_group_size,
2466 bfd_boolean stubs_always_before_branch)
b4655ea9
AM
2467{
2468 asection **list = htab->input_list + htab->top_index;
1badb539 2469 do
25f72752
AM
2470 {
2471 asection *tail = *list;
1badb539
AM
2472 if (tail == bfd_abs_section_ptr)
2473 continue;
25f72752
AM
2474 while (tail != NULL)
2475 {
2476 asection *curr;
2477 asection *prev;
2478 bfd_size_type total;
00b28bb0 2479 bfd_boolean big_sec;
25f72752
AM
2480
2481 curr = tail;
eea6121a 2482 total = tail->size;
00b28bb0
AM
2483 big_sec = total >= stub_group_size;
2484
25f72752
AM
2485 while ((prev = PREV_SEC (curr)) != NULL
2486 && ((total += curr->output_offset - prev->output_offset)
47d89dba 2487 < stub_group_size))
25f72752
AM
2488 curr = prev;
2489
2490 /* OK, the size from the start of CURR to the end is less
a248e267 2491 than 240000 bytes and thus can be handled by one stub
25f72752 2492 section. (or the tail section is itself larger than
a248e267 2493 240000 bytes, in which case we may be toast.)
25f72752
AM
2494 We should really be keeping track of the total size of
2495 stubs added here, as stubs contribute to the final output
2496 section size. That's a little tricky, and this way will
a248e267
AM
2497 only break if stubs added total more than 22144 bytes, or
2498 2768 long branch stubs. It seems unlikely for more than
2499 2768 different functions to be called, especially from
2500 code only 240000 bytes long. This limit used to be
2501 250000, but c++ code tends to generate lots of little
2502 functions, and sometimes violated the assumption. */
25f72752
AM
2503 do
2504 {
2505 prev = PREV_SEC (tail);
2506 /* Set up this stub group. */
83c81bfe 2507 htab->stub_group[tail->id].link_sec = curr;
25f72752
AM
2508 }
2509 while (tail != curr && (tail = prev) != NULL);
2510
a248e267 2511 /* But wait, there's more! Input sections up to 240000
00b28bb0
AM
2512 bytes before the stub section can be handled by it too.
2513 Don't do this if we have a really large section after the
2514 stubs, as adding more stubs increases the chance that
2515 branches may not reach into the stub section. */
2516 if (!stubs_always_before_branch && !big_sec)
25f72752 2517 {
47d89dba
AM
2518 total = 0;
2519 while (prev != NULL
2520 && ((total += tail->output_offset - prev->output_offset)
2521 < stub_group_size))
2522 {
2523 tail = prev;
2524 prev = PREV_SEC (tail);
83c81bfe 2525 htab->stub_group[tail->id].link_sec = curr;
47d89dba 2526 }
25f72752
AM
2527 }
2528 tail = prev;
2529 }
2530 }
b4655ea9
AM
2531 while (list-- != htab->input_list);
2532 free (htab->input_list);
1badb539 2533#undef PREV_SEC
b4655ea9
AM
2534}
2535
2536/* Read in all local syms for all input bfds, and create hash entries
2537 for export stubs if we are building a multi-subspace shared lib.
2538 Returns -1 on error, 1 if export stubs created, 0 otherwise. */
2539
2540static int
c39a58e6 2541get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
b4655ea9
AM
2542{
2543 unsigned int bfd_indx;
2544 Elf_Internal_Sym *local_syms, **all_local_syms;
2545 int stub_changed = 0;
2546 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
30667bf3 2547
4dfe6ac6
NC
2548 if (htab == NULL)
2549 return -1;
2550
30667bf3
AM
2551 /* We want to read in symbol extension records only once. To do this
2552 we need to read in the local symbols in parallel and save them for
2553 later use; so hold pointers to the local symbols in an array. */
b4655ea9 2554 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
c39a58e6 2555 all_local_syms = bfd_zmalloc (amt);
b4655ea9 2556 htab->all_local_syms = all_local_syms;
30667bf3 2557 if (all_local_syms == NULL)
b4655ea9 2558 return -1;
30667bf3
AM
2559
2560 /* Walk over all the input BFDs, swapping in local symbols.
2561 If we are creating a shared library, create hash entries for the
2562 export stubs. */
b4655ea9 2563 for (bfd_indx = 0;
30667bf3 2564 input_bfd != NULL;
c72f2fb2 2565 input_bfd = input_bfd->link.next, bfd_indx++)
30667bf3
AM
2566 {
2567 Elf_Internal_Shdr *symtab_hdr;
edd21aca 2568
252b5132
RH
2569 /* We'll need the symbol table in a second. */
2570 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2571 if (symtab_hdr->sh_info == 0)
2572 continue;
2573
6cdc0ccc
AM
2574 /* We need an array of the local symbols attached to the input bfd. */
2575 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
edd21aca 2576 if (local_syms == NULL)
edd21aca 2577 {
6cdc0ccc
AM
2578 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2579 symtab_hdr->sh_info, 0,
2580 NULL, NULL, NULL);
2581 /* Cache them for elf_link_input_bfd. */
2582 symtab_hdr->contents = (unsigned char *) local_syms;
edd21aca 2583 }
6cdc0ccc
AM
2584 if (local_syms == NULL)
2585 return -1;
edd21aca 2586
6cdc0ccc 2587 all_local_syms[bfd_indx] = local_syms;
edd21aca 2588
0e1862bb 2589 if (bfd_link_pic (info) && htab->multi_subspace)
30667bf3 2590 {
875c0872
DA
2591 struct elf_link_hash_entry **eh_syms;
2592 struct elf_link_hash_entry **eh_symend;
30667bf3
AM
2593 unsigned int symcount;
2594
2595 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2596 - symtab_hdr->sh_info);
875c0872
DA
2597 eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2598 eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
30667bf3
AM
2599
2600 /* Look through the global syms for functions; We need to
2601 build export stubs for all globally visible functions. */
875c0872 2602 for (; eh_syms < eh_symend; eh_syms++)
30667bf3 2603 {
875c0872 2604 struct elf32_hppa_link_hash_entry *hh;
30667bf3 2605
875c0872 2606 hh = hppa_elf_hash_entry (*eh_syms);
30667bf3 2607
a63e02c7
DA
2608 while (hh->eh.root.type == bfd_link_hash_indirect
2609 || hh->eh.root.type == bfd_link_hash_warning)
2610 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
30667bf3
AM
2611
2612 /* At this point in the link, undefined syms have been
2613 resolved, so we need to check that the symbol was
2614 defined in this BFD. */
a63e02c7
DA
2615 if ((hh->eh.root.type == bfd_link_hash_defined
2616 || hh->eh.root.type == bfd_link_hash_defweak)
2617 && hh->eh.type == STT_FUNC
2618 && hh->eh.root.u.def.section->output_section != NULL
2619 && (hh->eh.root.u.def.section->output_section->owner
25f72752 2620 == output_bfd)
a63e02c7
DA
2621 && hh->eh.root.u.def.section->owner == input_bfd
2622 && hh->eh.def_regular
2623 && !hh->eh.forced_local
2624 && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
30667bf3
AM
2625 {
2626 asection *sec;
2627 const char *stub_name;
875c0872 2628 struct elf32_hppa_stub_hash_entry *hsh;
30667bf3 2629
a63e02c7 2630 sec = hh->eh.root.u.def.section;
9b52905e 2631 stub_name = hh_name (hh);
a63e02c7 2632 hsh = hppa_stub_hash_lookup (&htab->bstab,
30667bf3 2633 stub_name,
b34976b6 2634 FALSE, FALSE);
875c0872 2635 if (hsh == NULL)
30667bf3 2636 {
875c0872
DA
2637 hsh = hppa_add_stub (stub_name, sec, htab);
2638 if (!hsh)
b4655ea9 2639 return -1;
30667bf3 2640
a63e02c7
DA
2641 hsh->target_value = hh->eh.root.u.def.value;
2642 hsh->target_section = hh->eh.root.u.def.section;
875c0872 2643 hsh->stub_type = hppa_stub_export;
a63e02c7 2644 hsh->hh = hh;
30667bf3
AM
2645 stub_changed = 1;
2646 }
2647 else
2648 {
695344c0 2649 /* xgettext:c-format */
4eca0228
AM
2650 _bfd_error_handler (_("%B: duplicate export stub %s"),
2651 input_bfd, stub_name);
30667bf3
AM
2652 }
2653 }
2654 }
30667bf3
AM
2655 }
2656 }
edd21aca 2657
b4655ea9
AM
2658 return stub_changed;
2659}
2660
2661/* Determine and set the size of the stub section for a final link.
2662
2663 The basic idea here is to examine all the relocations looking for
2664 PC-relative calls to a target that is unreachable with a "bl"
2665 instruction. */
2666
b34976b6 2667bfd_boolean
c39a58e6
AM
2668elf32_hppa_size_stubs
2669 (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2670 bfd_boolean multi_subspace, bfd_signed_vma group_size,
2671 asection * (*add_stub_section) (const char *, asection *),
2672 void (*layout_sections_again) (void))
b4655ea9
AM
2673{
2674 bfd_size_type stub_group_size;
b34976b6
AM
2675 bfd_boolean stubs_always_before_branch;
2676 bfd_boolean stub_changed;
b4655ea9
AM
2677 struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2678
4dfe6ac6
NC
2679 if (htab == NULL)
2680 return FALSE;
2681
b4655ea9
AM
2682 /* Stash our params away. */
2683 htab->stub_bfd = stub_bfd;
2684 htab->multi_subspace = multi_subspace;
2685 htab->add_stub_section = add_stub_section;
2686 htab->layout_sections_again = layout_sections_again;
2687 stubs_always_before_branch = group_size < 0;
2688 if (group_size < 0)
2689 stub_group_size = -group_size;
2690 else
2691 stub_group_size = group_size;
2692 if (stub_group_size == 1)
2693 {
2694 /* Default values. */
acc990f2
AM
2695 if (stubs_always_before_branch)
2696 {
2697 stub_group_size = 7680000;
2698 if (htab->has_17bit_branch || htab->multi_subspace)
2699 stub_group_size = 240000;
2700 if (htab->has_12bit_branch)
2701 stub_group_size = 7500;
2702 }
2703 else
2704 {
2705 stub_group_size = 6971392;
2706 if (htab->has_17bit_branch || htab->multi_subspace)
2707 stub_group_size = 217856;
2708 if (htab->has_12bit_branch)
2709 stub_group_size = 6808;
2710 }
b4655ea9
AM
2711 }
2712
2713 group_sections (htab, stub_group_size, stubs_always_before_branch);
2714
2715 switch (get_local_syms (output_bfd, info->input_bfds, info))
2716 {
2717 default:
2718 if (htab->all_local_syms)
2719 goto error_ret_free_local;
b34976b6 2720 return FALSE;
b4655ea9
AM
2721
2722 case 0:
b34976b6 2723 stub_changed = FALSE;
b4655ea9
AM
2724 break;
2725
2726 case 1:
b34976b6 2727 stub_changed = TRUE;
b4655ea9
AM
2728 break;
2729 }
2730
edd21aca
AM
2731 while (1)
2732 {
b4655ea9
AM
2733 bfd *input_bfd;
2734 unsigned int bfd_indx;
30667bf3
AM
2735 asection *stub_sec;
2736
25f72752 2737 for (input_bfd = info->input_bfds, bfd_indx = 0;
30667bf3 2738 input_bfd != NULL;
c72f2fb2 2739 input_bfd = input_bfd->link.next, bfd_indx++)
30667bf3
AM
2740 {
2741 Elf_Internal_Shdr *symtab_hdr;
b4655ea9
AM
2742 asection *section;
2743 Elf_Internal_Sym *local_syms;
30667bf3
AM
2744
2745 /* We'll need the symbol table in a second. */
2746 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2747 if (symtab_hdr->sh_info == 0)
2748 continue;
2749
b4655ea9 2750 local_syms = htab->all_local_syms[bfd_indx];
30667bf3
AM
2751
2752 /* Walk over each section attached to the input bfd. */
2753 for (section = input_bfd->sections;
2754 section != NULL;
25f72752 2755 section = section->next)
30667bf3 2756 {
30667bf3
AM
2757 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2758
2759 /* If there aren't any relocs, then there's nothing more
2760 to do. */
2761 if ((section->flags & SEC_RELOC) == 0
2762 || section->reloc_count == 0)
2763 continue;
2764
25f72752
AM
2765 /* If this section is a link-once section that will be
2766 discarded, then don't create any stubs. */
2767 if (section->output_section == NULL
2768 || section->output_section->owner != output_bfd)
2769 continue;
2770
1e2f5b6e
AM
2771 /* Get the relocs. */
2772 internal_relocs
c39a58e6 2773 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 2774 info->keep_memory);
30667bf3 2775 if (internal_relocs == NULL)
1e2f5b6e 2776 goto error_ret_free_local;
30667bf3
AM
2777
2778 /* Now examine each relocation. */
2779 irela = internal_relocs;
2780 irelaend = irela + section->reloc_count;
2781 for (; irela < irelaend; irela++)
2782 {
2783 unsigned int r_type, r_indx;
2784 enum elf32_hppa_stub_type stub_type;
875c0872 2785 struct elf32_hppa_stub_hash_entry *hsh;
30667bf3
AM
2786 asection *sym_sec;
2787 bfd_vma sym_value;
2788 bfd_vma destination;
875c0872 2789 struct elf32_hppa_link_hash_entry *hh;
30667bf3 2790 char *stub_name;
25f72752 2791 const asection *id_sec;
30667bf3
AM
2792
2793 r_type = ELF32_R_TYPE (irela->r_info);
2794 r_indx = ELF32_R_SYM (irela->r_info);
2795
2796 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2797 {
2798 bfd_set_error (bfd_error_bad_value);
1e2f5b6e
AM
2799 error_ret_free_internal:
2800 if (elf_section_data (section)->relocs == NULL)
2801 free (internal_relocs);
2802 goto error_ret_free_local;
30667bf3
AM
2803 }
2804
2805 /* Only look for stubs on call instructions. */
2806 if (r_type != (unsigned int) R_PARISC_PCREL12F
2807 && r_type != (unsigned int) R_PARISC_PCREL17F
2808 && r_type != (unsigned int) R_PARISC_PCREL22F)
2809 continue;
2810
2811 /* Now determine the call target, its name, value,
2812 section. */
2813 sym_sec = NULL;
2814 sym_value = 0;
2815 destination = 0;
875c0872 2816 hh = NULL;
30667bf3
AM
2817 if (r_indx < symtab_hdr->sh_info)
2818 {
2819 /* It's a local symbol. */
2820 Elf_Internal_Sym *sym;
2821 Elf_Internal_Shdr *hdr;
4fbb74a6 2822 unsigned int shndx;
30667bf3
AM
2823
2824 sym = local_syms + r_indx;
30667bf3
AM
2825 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2826 sym_value = sym->st_value;
4fbb74a6
AM
2827 shndx = sym->st_shndx;
2828 if (shndx < elf_numsections (input_bfd))
2829 {
2830 hdr = elf_elfsections (input_bfd)[shndx];
2831 sym_sec = hdr->bfd_section;
2832 destination = (sym_value + irela->r_addend
2833 + sym_sec->output_offset
2834 + sym_sec->output_section->vma);
2835 }
30667bf3
AM
2836 }
2837 else
2838 {
2839 /* It's an external symbol. */
2840 int e_indx;
2841
2842 e_indx = r_indx - symtab_hdr->sh_info;
875c0872 2843 hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
30667bf3 2844
a63e02c7
DA
2845 while (hh->eh.root.type == bfd_link_hash_indirect
2846 || hh->eh.root.type == bfd_link_hash_warning)
2847 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
30667bf3 2848
a63e02c7
DA
2849 if (hh->eh.root.type == bfd_link_hash_defined
2850 || hh->eh.root.type == bfd_link_hash_defweak)
30667bf3 2851 {
a63e02c7
DA
2852 sym_sec = hh->eh.root.u.def.section;
2853 sym_value = hh->eh.root.u.def.value;
30667bf3
AM
2854 if (sym_sec->output_section != NULL)
2855 destination = (sym_value + irela->r_addend
2856 + sym_sec->output_offset
2857 + sym_sec->output_section->vma);
2858 }
a63e02c7 2859 else if (hh->eh.root.type == bfd_link_hash_undefweak)
c432ba1a 2860 {
0e1862bb 2861 if (! bfd_link_pic (info))
c432ba1a
AM
2862 continue;
2863 }
a63e02c7 2864 else if (hh->eh.root.type == bfd_link_hash_undefined)
c432ba1a 2865 {
59c2e50f 2866 if (! (info->unresolved_syms_in_objects == RM_IGNORE
a63e02c7 2867 && (ELF_ST_VISIBILITY (hh->eh.other)
c432ba1a 2868 == STV_DEFAULT)
a63e02c7 2869 && hh->eh.type != STT_PARISC_MILLI))
c432ba1a
AM
2870 continue;
2871 }
30667bf3
AM
2872 else
2873 {
2874 bfd_set_error (bfd_error_bad_value);
2875 goto error_ret_free_internal;
2876 }
2877 }
2878
2879 /* Determine what (if any) linker stub is needed. */
875c0872 2880 stub_type = hppa_type_of_stub (section, irela, hh,
a252afa4 2881 destination, info);
30667bf3
AM
2882 if (stub_type == hppa_stub_none)
2883 continue;
2884
25f72752 2885 /* Support for grouping stub sections. */
83c81bfe 2886 id_sec = htab->stub_group[section->id].link_sec;
25f72752 2887
30667bf3 2888 /* Get the name of this stub. */
875c0872 2889 stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
30667bf3
AM
2890 if (!stub_name)
2891 goto error_ret_free_internal;
2892
a63e02c7 2893 hsh = hppa_stub_hash_lookup (&htab->bstab,
30667bf3 2894 stub_name,
b34976b6 2895 FALSE, FALSE);
875c0872 2896 if (hsh != NULL)
30667bf3
AM
2897 {
2898 /* The proper stub has already been created. */
2899 free (stub_name);
2900 continue;
2901 }
2902
875c0872
DA
2903 hsh = hppa_add_stub (stub_name, section, htab);
2904 if (hsh == NULL)
30667bf3
AM
2905 {
2906 free (stub_name);
1e2f5b6e 2907 goto error_ret_free_internal;
30667bf3
AM
2908 }
2909
875c0872
DA
2910 hsh->target_value = sym_value;
2911 hsh->target_section = sym_sec;
2912 hsh->stub_type = stub_type;
0e1862bb 2913 if (bfd_link_pic (info))
30667bf3
AM
2914 {
2915 if (stub_type == hppa_stub_import)
875c0872 2916 hsh->stub_type = hppa_stub_import_shared;
98ceb8ce 2917 else if (stub_type == hppa_stub_long_branch)
875c0872 2918 hsh->stub_type = hppa_stub_long_branch_shared;
30667bf3 2919 }
a63e02c7 2920 hsh->hh = hh;
b34976b6 2921 stub_changed = TRUE;
30667bf3
AM
2922 }
2923
2924 /* We're done with the internal relocs, free them. */
1e2f5b6e
AM
2925 if (elf_section_data (section)->relocs == NULL)
2926 free (internal_relocs);
30667bf3
AM
2927 }
2928 }
2929
2930 if (!stub_changed)
2931 break;
2932
2933 /* OK, we've added some stubs. Find out the new size of the
2934 stub sections. */
83c81bfe 2935 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
2936 stub_sec != NULL;
2937 stub_sec = stub_sec->next)
a464198b
AM
2938 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2939 stub_sec->size = 0;
74d1c347 2940
a63e02c7 2941 bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
74d1c347 2942
30667bf3 2943 /* Ask the linker to do its stuff. */
83c81bfe 2944 (*htab->layout_sections_again) ();
b34976b6 2945 stub_changed = FALSE;
30667bf3
AM
2946 }
2947
6cdc0ccc 2948 free (htab->all_local_syms);
b34976b6 2949 return TRUE;
30667bf3
AM
2950
2951 error_ret_free_local:
b4655ea9 2952 free (htab->all_local_syms);
b34976b6 2953 return FALSE;
30667bf3
AM
2954}
2955
30667bf3
AM
2956/* For a final link, this function is called after we have sized the
2957 stubs to provide a value for __gp. */
2958
b34976b6 2959bfd_boolean
c39a58e6 2960elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
30667bf3 2961{
b4655ea9
AM
2962 struct bfd_link_hash_entry *h;
2963 asection *sec = NULL;
2964 bfd_vma gp_val = 0;
30667bf3 2965
55ef6584 2966 h = bfd_link_hash_lookup (info->hash, "$global$", FALSE, FALSE, FALSE);
30667bf3 2967
df8634e3 2968 if (h != NULL
b4655ea9
AM
2969 && (h->type == bfd_link_hash_defined
2970 || h->type == bfd_link_hash_defweak))
30667bf3 2971 {
b4655ea9
AM
2972 gp_val = h->u.def.value;
2973 sec = h->u.def.section;
30667bf3
AM
2974 }
2975 else
2976 {
0eddce27
AM
2977 asection *splt = bfd_get_section_by_name (abfd, ".plt");
2978 asection *sgot = bfd_get_section_by_name (abfd, ".got");
b4655ea9 2979
74d1c347
AM
2980 /* Choose to point our LTP at, in this order, one of .plt, .got,
2981 or .data, if these sections exist. In the case of choosing
2982 .plt try to make the LTP ideal for addressing anywhere in the
2983 .plt or .got with a 14 bit signed offset. Typically, the end
2984 of the .plt is the start of the .got, so choose .plt + 0x2000
2985 if either the .plt or .got is larger than 0x2000. If both
2986 the .plt and .got are smaller than 0x2000, choose the end of
2987 the .plt section. */
225247f0
JT
2988 sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
2989 ? NULL : splt;
74d1c347 2990 if (sec != NULL)
30667bf3 2991 {
eea6121a
AM
2992 gp_val = sec->size;
2993 if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
74d1c347
AM
2994 {
2995 gp_val = 0x2000;
2996 }
2997 }
2998 else
2999 {
b4655ea9 3000 sec = sgot;
74d1c347
AM
3001 if (sec != NULL)
3002 {
225247f0
JT
3003 if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3004 {
3005 /* We know we don't have a .plt. If .got is large,
3006 offset our LTP. */
3007 if (sec->size > 0x2000)
3008 gp_val = 0x2000;
3009 }
74d1c347
AM
3010 }
3011 else
3012 {
3013 /* No .plt or .got. Who cares what the LTP is? */
3014 sec = bfd_get_section_by_name (abfd, ".data");
3015 }
30667bf3 3016 }
df8634e3
AM
3017
3018 if (h != NULL)
3019 {
b4655ea9
AM
3020 h->type = bfd_link_hash_defined;
3021 h->u.def.value = gp_val;
df8634e3 3022 if (sec != NULL)
b4655ea9 3023 h->u.def.section = sec;
df8634e3 3024 else
b4655ea9 3025 h->u.def.section = bfd_abs_section_ptr;
df8634e3 3026 }
30667bf3
AM
3027 }
3028
55ef6584
AM
3029 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
3030 {
3031 if (sec != NULL && sec->output_section != NULL)
3032 gp_val += sec->output_section->vma + sec->output_offset;
74d1c347 3033
55ef6584
AM
3034 elf_gp (abfd) = gp_val;
3035 }
b34976b6 3036 return TRUE;
30667bf3
AM
3037}
3038
30667bf3
AM
3039/* Build all the stubs associated with the current output file. The
3040 stubs are kept in a hash table attached to the main linker hash
3041 table. We also set up the .plt entries for statically linked PIC
3042 functions here. This function is called via hppaelf_finish in the
3043 linker. */
3044
b34976b6 3045bfd_boolean
c39a58e6 3046elf32_hppa_build_stubs (struct bfd_link_info *info)
30667bf3
AM
3047{
3048 asection *stub_sec;
3049 struct bfd_hash_table *table;
83c81bfe 3050 struct elf32_hppa_link_hash_table *htab;
30667bf3 3051
83c81bfe 3052 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
3053 if (htab == NULL)
3054 return FALSE;
30667bf3 3055
83c81bfe 3056 for (stub_sec = htab->stub_bfd->sections;
30667bf3
AM
3057 stub_sec != NULL;
3058 stub_sec = stub_sec->next)
a464198b
AM
3059 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
3060 && stub_sec->size != 0)
3061 {
3062 /* Allocate memory to hold the linker stubs. */
3063 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
3064 if (stub_sec->contents == NULL)
3065 return FALSE;
3066 stub_sec->size = 0;
3067 }
30667bf3
AM
3068
3069 /* Build the stubs as directed by the stub hash table. */
a63e02c7 3070 table = &htab->bstab;
30667bf3
AM
3071 bfd_hash_traverse (table, hppa_build_one_stub, info);
3072
b34976b6 3073 return TRUE;
30667bf3
AM
3074}
3075
9b52905e 3076/* Return the base vma address which should be subtracted from the real
68ffbac6 3077 address when resolving a dtpoff relocation.
9b52905e
NC
3078 This is PT_TLS segment p_vaddr. */
3079
3080static bfd_vma
3081dtpoff_base (struct bfd_link_info *info)
3082{
3083 /* If tls_sec is NULL, we should have signalled an error already. */
3084 if (elf_hash_table (info)->tls_sec == NULL)
3085 return 0;
3086 return elf_hash_table (info)->tls_sec->vma;
3087}
3088
3089/* Return the relocation value for R_PARISC_TLS_TPOFF*.. */
3090
3091static bfd_vma
3092tpoff (struct bfd_link_info *info, bfd_vma address)
3093{
3094 struct elf_link_hash_table *htab = elf_hash_table (info);
3095
3096 /* If tls_sec is NULL, we should have signalled an error already. */
3097 if (htab->tls_sec == NULL)
3098 return 0;
68ffbac6 3099 /* hppa TLS ABI is variant I and static TLS block start just after
9b52905e 3100 tcbhead structure which has 2 pointer fields. */
68ffbac6 3101 return (address - htab->tls_sec->vma
9b52905e
NC
3102 + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3103}
3104
c46b7515
AM
3105/* Perform a final link. */
3106
b34976b6 3107static bfd_boolean
c39a58e6 3108elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
c46b7515 3109{
6d4b2867
JDA
3110 struct stat buf;
3111
4dc86686 3112 /* Invoke the regular ELF linker to do all the work. */
c152c796 3113 if (!bfd_elf_final_link (abfd, info))
b34976b6 3114 return FALSE;
c46b7515
AM
3115
3116 /* If we're producing a final executable, sort the contents of the
985142a4 3117 unwind section. */
0e1862bb 3118 if (bfd_link_relocatable (info))
d9f40817
DA
3119 return TRUE;
3120
6d4b2867
JDA
3121 /* Do not attempt to sort non-regular files. This is here
3122 especially for configure scripts and kernel builds which run
3123 tests with "ld [...] -o /dev/null". */
3124 if (stat (abfd->filename, &buf) != 0
3125 || !S_ISREG(buf.st_mode))
3126 return TRUE;
3127
46fe4e66 3128 return elf_hppa_sort_unwind (abfd);
c46b7515
AM
3129}
3130
3131/* Record the lowest address for the data and text segments. */
3132
3133static void
2ea37f1c 3134hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
c46b7515 3135{
83c81bfe 3136 struct elf32_hppa_link_hash_table *htab;
c46b7515 3137
875c0872 3138 htab = (struct elf32_hppa_link_hash_table*) data;
4dfe6ac6
NC
3139 if (htab == NULL)
3140 return;
c46b7515
AM
3141
3142 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3143 {
2ea37f1c
NC
3144 bfd_vma value;
3145 Elf_Internal_Phdr *p;
3146
3147 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3148 BFD_ASSERT (p != NULL);
3149 value = p->p_vaddr;
c46b7515
AM
3150
3151 if ((section->flags & SEC_READONLY) != 0)
3152 {
83c81bfe
AM
3153 if (value < htab->text_segment_base)
3154 htab->text_segment_base = value;
c46b7515
AM
3155 }
3156 else
3157 {
83c81bfe
AM
3158 if (value < htab->data_segment_base)
3159 htab->data_segment_base = value;
c46b7515
AM
3160 }
3161 }
3162}
3163
30667bf3
AM
3164/* Perform a relocation as part of a final link. */
3165
3166static bfd_reloc_status_type
c39a58e6
AM
3167final_link_relocate (asection *input_section,
3168 bfd_byte *contents,
875c0872 3169 const Elf_Internal_Rela *rela,
c39a58e6
AM
3170 bfd_vma value,
3171 struct elf32_hppa_link_hash_table *htab,
3172 asection *sym_sec,
875c0872 3173 struct elf32_hppa_link_hash_entry *hh,
a252afa4 3174 struct bfd_link_info *info)
30667bf3
AM
3175{
3176 int insn;
875c0872 3177 unsigned int r_type = ELF32_R_TYPE (rela->r_info);
a252afa4 3178 unsigned int orig_r_type = r_type;
30667bf3
AM
3179 reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3180 int r_format = howto->bitsize;
3181 enum hppa_reloc_field_selector_type_alt r_field;
3182 bfd *input_bfd = input_section->owner;
875c0872 3183 bfd_vma offset = rela->r_offset;
30667bf3
AM
3184 bfd_vma max_branch_offset = 0;
3185 bfd_byte *hit_data = contents + offset;
875c0872 3186 bfd_signed_vma addend = rela->r_addend;
30667bf3 3187 bfd_vma location;
875c0872 3188 struct elf32_hppa_stub_hash_entry *hsh = NULL;
68ffbac6 3189 int val;
30667bf3
AM
3190
3191 if (r_type == R_PARISC_NONE)
3192 return bfd_reloc_ok;
3193
3194 insn = bfd_get_32 (input_bfd, hit_data);
3195
3196 /* Find out where we are and where we're going. */
3197 location = (offset +
3198 input_section->output_offset +
3199 input_section->output_section->vma);
3200
a252afa4
DA
3201 /* If we are not building a shared library, convert DLTIND relocs to
3202 DPREL relocs. */
0e1862bb 3203 if (!bfd_link_pic (info))
a252afa4
DA
3204 {
3205 switch (r_type)
4fc8051d
AM
3206 {
3207 case R_PARISC_DLTIND21L:
143bb599
DA
3208 case R_PARISC_TLS_GD21L:
3209 case R_PARISC_TLS_LDM21L:
3210 case R_PARISC_TLS_IE21L:
4fc8051d 3211 r_type = R_PARISC_DPREL21L;
a252afa4
DA
3212 break;
3213
4fc8051d 3214 case R_PARISC_DLTIND14R:
143bb599
DA
3215 case R_PARISC_TLS_GD14R:
3216 case R_PARISC_TLS_LDM14R:
3217 case R_PARISC_TLS_IE14R:
4fc8051d 3218 r_type = R_PARISC_DPREL14R;
a252afa4
DA
3219 break;
3220
4fc8051d
AM
3221 case R_PARISC_DLTIND14F:
3222 r_type = R_PARISC_DPREL14F;
a252afa4
DA
3223 break;
3224 }
3225 }
3226
30667bf3
AM
3227 switch (r_type)
3228 {
3229 case R_PARISC_PCREL12F:
3230 case R_PARISC_PCREL17F:
3231 case R_PARISC_PCREL22F:
067fa4a6
AM
3232 /* If this call should go via the plt, find the import stub in
3233 the stub hash. */
30667bf3
AM
3234 if (sym_sec == NULL
3235 || sym_sec->output_section == NULL
875c0872 3236 || (hh != NULL
a63e02c7
DA
3237 && hh->eh.plt.offset != (bfd_vma) -1
3238 && hh->eh.dynindx != -1
875c0872 3239 && !hh->plabel
0e1862bb 3240 && (bfd_link_pic (info)
a63e02c7
DA
3241 || !hh->eh.def_regular
3242 || hh->eh.root.type == bfd_link_hash_defweak)))
30667bf3 3243 {
875c0872
DA
3244 hsh = hppa_get_stub_entry (input_section, sym_sec,
3245 hh, rela, htab);
3246 if (hsh != NULL)
30667bf3 3247 {
875c0872
DA
3248 value = (hsh->stub_offset
3249 + hsh->stub_sec->output_offset
3250 + hsh->stub_sec->output_section->vma);
30667bf3
AM
3251 addend = 0;
3252 }
875c0872 3253 else if (sym_sec == NULL && hh != NULL
a63e02c7 3254 && hh->eh.root.type == bfd_link_hash_undefweak)
30667bf3 3255 {
db20fd76
AM
3256 /* It's OK if undefined weak. Calls to undefined weak
3257 symbols behave as if the "called" function
3258 immediately returns. We can thus call to a weak
3259 function without first checking whether the function
3260 is defined. */
30667bf3 3261 value = location;
db20fd76 3262 addend = 8;
30667bf3
AM
3263 }
3264 else
f09ebc7d 3265 return bfd_reloc_undefined;
30667bf3
AM
3266 }
3267 /* Fall thru. */
3268
3269 case R_PARISC_PCREL21L:
3270 case R_PARISC_PCREL17C:
3271 case R_PARISC_PCREL17R:
3272 case R_PARISC_PCREL14R:
3273 case R_PARISC_PCREL14F:
36751eee 3274 case R_PARISC_PCREL32:
30667bf3
AM
3275 /* Make it a pc relative offset. */
3276 value -= location;
3277 addend -= 8;
3278 break;
3279
3280 case R_PARISC_DPREL21L:
3281 case R_PARISC_DPREL14R:
3282 case R_PARISC_DPREL14F:
a252afa4
DA
3283 /* Convert instructions that use the linkage table pointer (r19) to
3284 instructions that use the global data pointer (dp). This is the
3285 most efficient way of using PIC code in an incomplete executable,
3286 but the user must follow the standard runtime conventions for
3287 accessing data for this to work. */
143bb599 3288 if (orig_r_type != r_type)
a252afa4 3289 {
143bb599
DA
3290 if (r_type == R_PARISC_DPREL21L)
3291 {
3292 /* GCC sometimes uses a register other than r19 for the
3293 operation, so we must convert any addil instruction
3294 that uses this relocation. */
3295 if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3296 insn = ADDIL_DP;
3297 else
3298 /* We must have a ldil instruction. It's too hard to find
3299 and convert the associated add instruction, so issue an
3300 error. */
4eca0228 3301 _bfd_error_handler
695344c0 3302 /* xgettext:c-format */
d42c267e 3303 (_("%B(%A+%#Lx): %s fixup for insn %#x is not supported in a non-shared link"),
143bb599
DA
3304 input_bfd,
3305 input_section,
d42c267e 3306 offset,
143bb599
DA
3307 howto->name,
3308 insn);
3309 }
3310 else if (r_type == R_PARISC_DPREL14F)
3311 {
3312 /* This must be a format 1 load/store. Change the base
3313 register to dp. */
3314 insn = (insn & 0xfc1ffff) | (27 << 21);
3315 }
a252afa4
DA
3316 }
3317
143bb599
DA
3318 /* For all the DP relative relocations, we need to examine the symbol's
3319 section. If it has no section or if it's a code section, then
3320 "data pointer relative" makes no sense. In that case we don't
3321 adjust the "value", and for 21 bit addil instructions, we change the
3322 source addend register from %dp to %r0. This situation commonly
3323 arises for undefined weak symbols and when a variable's "constness"
3324 is declared differently from the way the variable is defined. For
3325 instance: "extern int foo" with foo defined as "const int foo". */
95d0f04a 3326 if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
30667bf3
AM
3327 {
3328 if ((insn & ((0x3f << 26) | (0x1f << 21)))
3329 == (((int) OP_ADDIL << 26) | (27 << 21)))
3330 {
3331 insn &= ~ (0x1f << 21);
30667bf3
AM
3332 }
3333 /* Now try to make things easy for the dynamic linker. */
3334
3335 break;
3336 }
74d1c347 3337 /* Fall thru. */
30667bf3
AM
3338
3339 case R_PARISC_DLTIND21L:
3340 case R_PARISC_DLTIND14R:
3341 case R_PARISC_DLTIND14F:
143bb599
DA
3342 case R_PARISC_TLS_GD21L:
3343 case R_PARISC_TLS_LDM21L:
3344 case R_PARISC_TLS_IE21L:
9b52905e 3345 case R_PARISC_TLS_GD14R:
9b52905e 3346 case R_PARISC_TLS_LDM14R:
9b52905e 3347 case R_PARISC_TLS_IE14R:
30667bf3
AM
3348 value -= elf_gp (input_section->output_section->owner);
3349 break;
3350
c46b7515
AM
3351 case R_PARISC_SEGREL32:
3352 if ((sym_sec->flags & SEC_CODE) != 0)
83c81bfe 3353 value -= htab->text_segment_base;
c46b7515 3354 else
83c81bfe 3355 value -= htab->data_segment_base;
c46b7515
AM
3356 break;
3357
30667bf3
AM
3358 default:
3359 break;
3360 }
3361
3362 switch (r_type)
3363 {
3364 case R_PARISC_DIR32:
47d89dba 3365 case R_PARISC_DIR14F:
30667bf3
AM
3366 case R_PARISC_DIR17F:
3367 case R_PARISC_PCREL17C:
3368 case R_PARISC_PCREL14F:
36751eee 3369 case R_PARISC_PCREL32:
30667bf3
AM
3370 case R_PARISC_DPREL14F:
3371 case R_PARISC_PLABEL32:
3372 case R_PARISC_DLTIND14F:
3373 case R_PARISC_SEGBASE:
3374 case R_PARISC_SEGREL32:
9b52905e
NC
3375 case R_PARISC_TLS_DTPMOD32:
3376 case R_PARISC_TLS_DTPOFF32:
3377 case R_PARISC_TLS_TPREL32:
30667bf3
AM
3378 r_field = e_fsel;
3379 break;
3380
1bf42538 3381 case R_PARISC_DLTIND21L:
30667bf3 3382 case R_PARISC_PCREL21L:
30667bf3 3383 case R_PARISC_PLABEL21L:
1bf42538
JL
3384 r_field = e_lsel;
3385 break;
3386
3387 case R_PARISC_DIR21L:
3388 case R_PARISC_DPREL21L:
9b52905e
NC
3389 case R_PARISC_TLS_GD21L:
3390 case R_PARISC_TLS_LDM21L:
3391 case R_PARISC_TLS_LDO21L:
3392 case R_PARISC_TLS_IE21L:
3393 case R_PARISC_TLS_LE21L:
30667bf3
AM
3394 r_field = e_lrsel;
3395 break;
3396
30667bf3 3397 case R_PARISC_PCREL17R:
30667bf3 3398 case R_PARISC_PCREL14R:
30667bf3
AM
3399 case R_PARISC_PLABEL14R:
3400 case R_PARISC_DLTIND14R:
1bf42538
JL
3401 r_field = e_rsel;
3402 break;
3403
3404 case R_PARISC_DIR17R:
3405 case R_PARISC_DIR14R:
3406 case R_PARISC_DPREL14R:
9b52905e
NC
3407 case R_PARISC_TLS_GD14R:
3408 case R_PARISC_TLS_LDM14R:
3409 case R_PARISC_TLS_LDO14R:
3410 case R_PARISC_TLS_IE14R:
3411 case R_PARISC_TLS_LE14R:
30667bf3
AM
3412 r_field = e_rrsel;
3413 break;
3414
3415 case R_PARISC_PCREL12F:
3416 case R_PARISC_PCREL17F:
3417 case R_PARISC_PCREL22F:
3418 r_field = e_fsel;
3419
3420 if (r_type == (unsigned int) R_PARISC_PCREL17F)
3421 {
3422 max_branch_offset = (1 << (17-1)) << 2;
3423 }
3424 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3425 {
3426 max_branch_offset = (1 << (12-1)) << 2;
3427 }
3428 else
3429 {
3430 max_branch_offset = (1 << (22-1)) << 2;
3431 }
3432
3433 /* sym_sec is NULL on undefined weak syms or when shared on
3434 undefined syms. We've already checked for a stub for the
3435 shared undefined case. */
3436 if (sym_sec == NULL)
3437 break;
3438
3439 /* If the branch is out of reach, then redirect the
3440 call to the local stub for this function. */
3441 if (value + addend + max_branch_offset >= 2*max_branch_offset)
3442 {
875c0872
DA
3443 hsh = hppa_get_stub_entry (input_section, sym_sec,
3444 hh, rela, htab);
3445 if (hsh == NULL)
f09ebc7d 3446 return bfd_reloc_undefined;
30667bf3
AM
3447
3448 /* Munge up the value and addend so that we call the stub
3449 rather than the procedure directly. */
875c0872
DA
3450 value = (hsh->stub_offset
3451 + hsh->stub_sec->output_offset
3452 + hsh->stub_sec->output_section->vma
30667bf3
AM
3453 - location);
3454 addend = -8;
3455 }
3456 break;
3457
3458 /* Something we don't know how to handle. */
3459 default:
3460 return bfd_reloc_notsupported;
3461 }
3462
3463 /* Make sure we can reach the stub. */
3464 if (max_branch_offset != 0
3465 && value + addend + max_branch_offset >= 2*max_branch_offset)
3466 {
4eca0228 3467 _bfd_error_handler
695344c0 3468 /* xgettext:c-format */
d42c267e 3469 (_("%B(%A+%#Lx): cannot reach %s, recompile with -ffunction-sections"),
d003868e
AM
3470 input_bfd,
3471 input_section,
d42c267e 3472 offset,
a63e02c7 3473 hsh->bh_root.string);
ce757d15 3474 bfd_set_error (bfd_error_bad_value);
30667bf3
AM
3475 return bfd_reloc_notsupported;
3476 }
3477
3478 val = hppa_field_adjust (value, addend, r_field);
3479
3480 switch (r_type)
3481 {
3482 case R_PARISC_PCREL12F:
3483 case R_PARISC_PCREL17C:
3484 case R_PARISC_PCREL17F:
3485 case R_PARISC_PCREL17R:
3486 case R_PARISC_PCREL22F:
3487 case R_PARISC_DIR17F:
3488 case R_PARISC_DIR17R:
3489 /* This is a branch. Divide the offset by four.
3490 Note that we need to decide whether it's a branch or
3491 otherwise by inspecting the reloc. Inspecting insn won't
3492 work as insn might be from a .word directive. */
3493 val >>= 2;
3494 break;
3495
3496 default:
3497 break;
3498 }
3499
3500 insn = hppa_rebuild_insn (insn, val, r_format);
3501
3502 /* Update the instruction word. */
74d1c347 3503 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
30667bf3
AM
3504 return bfd_reloc_ok;
3505}
3506
30667bf3
AM
3507/* Relocate an HPPA ELF section. */
3508
b34976b6 3509static bfd_boolean
c39a58e6
AM
3510elf32_hppa_relocate_section (bfd *output_bfd,
3511 struct bfd_link_info *info,
3512 bfd *input_bfd,
3513 asection *input_section,
3514 bfd_byte *contents,
3515 Elf_Internal_Rela *relocs,
3516 Elf_Internal_Sym *local_syms,
3517 asection **local_sections)
30667bf3 3518{
30667bf3 3519 bfd_vma *local_got_offsets;
83c81bfe 3520 struct elf32_hppa_link_hash_table *htab;
30667bf3 3521 Elf_Internal_Shdr *symtab_hdr;
875c0872 3522 Elf_Internal_Rela *rela;
30667bf3 3523 Elf_Internal_Rela *relend;
30667bf3
AM
3524
3525 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3526
83c81bfe 3527 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
3528 if (htab == NULL)
3529 return FALSE;
3530
74d1c347 3531 local_got_offsets = elf_local_got_offsets (input_bfd);
30667bf3 3532
875c0872 3533 rela = relocs;
30667bf3 3534 relend = relocs + input_section->reloc_count;
875c0872 3535 for (; rela < relend; rela++)
30667bf3
AM
3536 {
3537 unsigned int r_type;
3538 reloc_howto_type *howto;
3539 unsigned int r_symndx;
875c0872 3540 struct elf32_hppa_link_hash_entry *hh;
30667bf3
AM
3541 Elf_Internal_Sym *sym;
3542 asection *sym_sec;
3543 bfd_vma relocation;
875c0872 3544 bfd_reloc_status_type rstatus;
30667bf3 3545 const char *sym_name;
b34976b6
AM
3546 bfd_boolean plabel;
3547 bfd_boolean warned_undef;
30667bf3 3548
875c0872 3549 r_type = ELF32_R_TYPE (rela->r_info);
30667bf3
AM
3550 if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3551 {
3552 bfd_set_error (bfd_error_bad_value);
b34976b6 3553 return FALSE;
30667bf3
AM
3554 }
3555 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3556 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3557 continue;
3558
875c0872
DA
3559 r_symndx = ELF32_R_SYM (rela->r_info);
3560 hh = NULL;
30667bf3
AM
3561 sym = NULL;
3562 sym_sec = NULL;
b34976b6 3563 warned_undef = FALSE;
30667bf3
AM
3564 if (r_symndx < symtab_hdr->sh_info)
3565 {
3566 /* This is a local symbol, h defaults to NULL. */
3567 sym = local_syms + r_symndx;
3568 sym_sec = local_sections[r_symndx];
875c0872 3569 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
30667bf3
AM
3570 }
3571 else
3572 {
875c0872 3573 struct elf_link_hash_entry *eh;
62d887d4 3574 bfd_boolean unresolved_reloc, ignored;
b2a8e766 3575 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
560e09e9 3576
875c0872 3577 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
b2a8e766 3578 r_symndx, symtab_hdr, sym_hashes,
875c0872 3579 eh, sym_sec, relocation,
62d887d4
L
3580 unresolved_reloc, warned_undef,
3581 ignored);
560e09e9 3582
0e1862bb 3583 if (!bfd_link_relocatable (info)
ab96bf03 3584 && relocation == 0
875c0872
DA
3585 && eh->root.type != bfd_link_hash_defined
3586 && eh->root.type != bfd_link_hash_defweak
3587 && eh->root.type != bfd_link_hash_undefweak)
4fc8051d 3588 {
59c2e50f 3589 if (info->unresolved_syms_in_objects == RM_IGNORE
875c0872
DA
3590 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3591 && eh->type == STT_PARISC_MILLI)
560e09e9 3592 {
1a72702b
AM
3593 (*info->callbacks->undefined_symbol)
3594 (info, eh_name (eh), input_bfd,
3595 input_section, rela->r_offset, FALSE);
560e09e9
NC
3596 warned_undef = TRUE;
3597 }
30667bf3 3598 }
875c0872 3599 hh = hppa_elf_hash_entry (eh);
30667bf3
AM
3600 }
3601
dbaa2011 3602 if (sym_sec != NULL && discarded_section (sym_sec))
e4067dbb 3603 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
545fd46b
MR
3604 rela, 1, relend,
3605 elf_hppa_howto_table + r_type, 0,
e4067dbb 3606 contents);
ab96bf03 3607
0e1862bb 3608 if (bfd_link_relocatable (info))
ab96bf03
AM
3609 continue;
3610
30667bf3 3611 /* Do any required modifications to the relocation value, and
25f72752
AM
3612 determine what types of dynamic info we need to output, if
3613 any. */
74d1c347 3614 plabel = 0;
30667bf3
AM
3615 switch (r_type)
3616 {
3617 case R_PARISC_DLTIND14F:
3618 case R_PARISC_DLTIND14R:
3619 case R_PARISC_DLTIND21L:
ce757d15
AM
3620 {
3621 bfd_vma off;
d336fa6d
AM
3622 bfd_boolean do_got = FALSE;
3623 bfd_boolean reloc = bfd_link_pic (info);
ce757d15
AM
3624
3625 /* Relocation is to the entry for this symbol in the
3626 global offset table. */
875c0872 3627 if (hh != NULL)
ce757d15 3628 {
b34976b6 3629 bfd_boolean dyn;
ce757d15 3630
a63e02c7
DA
3631 off = hh->eh.got.offset;
3632 dyn = htab->etab.dynamic_sections_created;
d336fa6d
AM
3633 reloc = (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh)
3634 && (reloc
3635 || (hh->eh.dynindx != -1
3636 && !SYMBOL_REFERENCES_LOCAL (info, &hh->eh))));
3637 if (!reloc
3638 || !WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3639 bfd_link_pic (info),
3640 &hh->eh))
ce757d15
AM
3641 {
3642 /* If we aren't going to call finish_dynamic_symbol,
3643 then we need to handle initialisation of the .got
3644 entry and create needed relocs here. Since the
3645 offset must always be a multiple of 4, we use the
3646 least significant bit to record whether we have
3647 initialised it already. */
3648 if ((off & 1) != 0)
3649 off &= ~1;
3650 else
3651 {
a63e02c7 3652 hh->eh.got.offset |= 1;
d336fa6d 3653 do_got = TRUE;
ce757d15
AM
3654 }
3655 }
3656 }
3657 else
3658 {
3659 /* Local symbol case. */
3660 if (local_got_offsets == NULL)
3661 abort ();
3662
3663 off = local_got_offsets[r_symndx];
3664
3665 /* The offset must always be a multiple of 4. We use
3666 the least significant bit to record whether we have
3667 already generated the necessary reloc. */
3668 if ((off & 1) != 0)
3669 off &= ~1;
3670 else
3671 {
3672 local_got_offsets[r_symndx] |= 1;
d336fa6d 3673 do_got = TRUE;
ce757d15
AM
3674 }
3675 }
68fb2e56 3676
ce757d15
AM
3677 if (do_got)
3678 {
d336fa6d 3679 if (reloc)
ce757d15
AM
3680 {
3681 /* Output a dynamic relocation for this GOT entry.
3682 In this case it is relative to the base of the
3683 object because the symbol index is zero. */
3684 Elf_Internal_Rela outrel;
947216bf 3685 bfd_byte *loc;
ce558b89 3686 asection *sec = htab->etab.srelgot;
ce757d15
AM
3687
3688 outrel.r_offset = (off
ce558b89
AM
3689 + htab->etab.sgot->output_offset
3690 + htab->etab.sgot->output_section->vma);
ce757d15
AM
3691 outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3692 outrel.r_addend = relocation;
875c0872
DA
3693 loc = sec->contents;
3694 loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
ce757d15
AM
3695 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3696 }
3697 else
30667bf3 3698 bfd_put_32 (output_bfd, relocation,
ce558b89 3699 htab->etab.sgot->contents + off);
ce757d15 3700 }
30667bf3 3701
ce757d15
AM
3702 if (off >= (bfd_vma) -2)
3703 abort ();
30667bf3 3704
ce757d15
AM
3705 /* Add the base of the GOT to the relocation value. */
3706 relocation = (off
ce558b89
AM
3707 + htab->etab.sgot->output_offset
3708 + htab->etab.sgot->output_section->vma);
ce757d15 3709 }
30667bf3 3710 break;
252b5132 3711
c46b7515
AM
3712 case R_PARISC_SEGREL32:
3713 /* If this is the first SEGREL relocation, then initialize
3714 the segment base values. */
83c81bfe
AM
3715 if (htab->text_segment_base == (bfd_vma) -1)
3716 bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
c46b7515
AM
3717 break;
3718
30667bf3
AM
3719 case R_PARISC_PLABEL14R:
3720 case R_PARISC_PLABEL21L:
3721 case R_PARISC_PLABEL32:
a63e02c7 3722 if (htab->etab.dynamic_sections_created)
252b5132 3723 {
ce757d15 3724 bfd_vma off;
b34976b6 3725 bfd_boolean do_plt = 0;
74d1c347
AM
3726 /* If we have a global symbol with a PLT slot, then
3727 redirect this relocation to it. */
875c0872 3728 if (hh != NULL)
74d1c347 3729 {
a63e02c7 3730 off = hh->eh.plt.offset;
0e1862bb
L
3731 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1,
3732 bfd_link_pic (info),
a63e02c7 3733 &hh->eh))
8dea1268
AM
3734 {
3735 /* In a non-shared link, adjust_dynamic_symbols
3736 isn't called for symbols forced local. We
dc810e39 3737 need to write out the plt entry here. */
8dea1268
AM
3738 if ((off & 1) != 0)
3739 off &= ~1;
3740 else
3741 {
a63e02c7 3742 hh->eh.plt.offset |= 1;
ce757d15 3743 do_plt = 1;
8dea1268
AM
3744 }
3745 }
74d1c347
AM
3746 }
3747 else
3748 {
68fb2e56
AM
3749 bfd_vma *local_plt_offsets;
3750
3751 if (local_got_offsets == NULL)
3752 abort ();
74d1c347 3753
68fb2e56
AM
3754 local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3755 off = local_plt_offsets[r_symndx];
74d1c347
AM
3756
3757 /* As for the local .got entry case, we use the last
3758 bit to record whether we've already initialised
3759 this local .plt entry. */
3760 if ((off & 1) != 0)
3761 off &= ~1;
ce757d15
AM
3762 else
3763 {
3764 local_plt_offsets[r_symndx] |= 1;
3765 do_plt = 1;
3766 }
3767 }
3768
3769 if (do_plt)
3770 {
0e1862bb 3771 if (bfd_link_pic (info))
ce757d15
AM
3772 {
3773 /* Output a dynamic IPLT relocation for this
3774 PLT entry. */
3775 Elf_Internal_Rela outrel;
947216bf 3776 bfd_byte *loc;
ce558b89 3777 asection *s = htab->etab.srelplt;
ce757d15
AM
3778
3779 outrel.r_offset = (off
ce558b89
AM
3780 + htab->etab.splt->output_offset
3781 + htab->etab.splt->output_section->vma);
ce757d15
AM
3782 outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3783 outrel.r_addend = relocation;
947216bf
AM
3784 loc = s->contents;
3785 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
ce757d15
AM
3786 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3787 }
74d1c347
AM
3788 else
3789 {
3790 bfd_put_32 (output_bfd,
3791 relocation,
ce558b89 3792 htab->etab.splt->contents + off);
74d1c347 3793 bfd_put_32 (output_bfd,
ce558b89
AM
3794 elf_gp (htab->etab.splt->output_section->owner),
3795 htab->etab.splt->contents + off + 4);
74d1c347
AM
3796 }
3797 }
3798
68fb2e56 3799 if (off >= (bfd_vma) -2)
49e9d0d3 3800 abort ();
74d1c347
AM
3801
3802 /* PLABELs contain function pointers. Relocation is to
3803 the entry for the function in the .plt. The magic +2
3804 offset signals to $$dyncall that the function pointer
3805 is in the .plt and thus has a gp pointer too.
3806 Exception: Undefined PLABELs should have a value of
3807 zero. */
875c0872 3808 if (hh == NULL
a63e02c7
DA
3809 || (hh->eh.root.type != bfd_link_hash_undefweak
3810 && hh->eh.root.type != bfd_link_hash_undefined))
74d1c347
AM
3811 {
3812 relocation = (off
ce558b89
AM
3813 + htab->etab.splt->output_offset
3814 + htab->etab.splt->output_section->vma
74d1c347
AM
3815 + 2);
3816 }
3817 plabel = 1;
30667bf3 3818 }
1a0670f3 3819 /* Fall through. */
30667bf3
AM
3820
3821 case R_PARISC_DIR17F:
3822 case R_PARISC_DIR17R:
47d89dba 3823 case R_PARISC_DIR14F:
30667bf3
AM
3824 case R_PARISC_DIR14R:
3825 case R_PARISC_DIR21L:
3826 case R_PARISC_DPREL14F:
3827 case R_PARISC_DPREL14R:
3828 case R_PARISC_DPREL21L:
3829 case R_PARISC_DIR32:
b1e24c02 3830 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
3831 break;
3832
30667bf3 3833 /* The reloc types handled here and this conditional
56882138 3834 expression must match the code in ..check_relocs and
ec338859 3835 allocate_dynrelocs. ie. We need exactly the same condition
56882138
AM
3836 as in ..check_relocs, with some extra conditions (dynindx
3837 test in this case) to cater for relocs removed by
d336fa6d 3838 allocate_dynrelocs. */
0e1862bb 3839 if ((bfd_link_pic (info)
d336fa6d
AM
3840 && !(hh != NULL
3841 && ((hh->eh.root.type == bfd_link_hash_undefined
3842 && ELF_ST_VISIBILITY (hh->eh.other) != STV_DEFAULT)
3843 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh)))
446f2863 3844 && (IS_ABSOLUTE_RELOC (r_type)
a63e02c7 3845 || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
d336fa6d
AM
3846 || (ELIMINATE_COPY_RELOCS
3847 && !bfd_link_pic (info)
875c0872 3848 && hh != NULL
a63e02c7
DA
3849 && hh->eh.dynindx != -1
3850 && !hh->eh.non_got_ref
d336fa6d 3851 && !hh->eh.def_regular))
30667bf3
AM
3852 {
3853 Elf_Internal_Rela outrel;
b34976b6 3854 bfd_boolean skip;
98ceb8ce 3855 asection *sreloc;
947216bf 3856 bfd_byte *loc;
252b5132 3857
30667bf3
AM
3858 /* When generating a shared object, these relocations
3859 are copied into the output file to be resolved at run
3860 time. */
252b5132 3861
875c0872 3862 outrel.r_addend = rela->r_addend;
c629eae0
JJ
3863 outrel.r_offset =
3864 _bfd_elf_section_offset (output_bfd, info, input_section,
875c0872 3865 rela->r_offset);
0bb2d96a
JJ
3866 skip = (outrel.r_offset == (bfd_vma) -1
3867 || outrel.r_offset == (bfd_vma) -2);
30667bf3
AM
3868 outrel.r_offset += (input_section->output_offset
3869 + input_section->output_section->vma);
68ffbac6 3870
30667bf3 3871 if (skip)
252b5132 3872 {
30667bf3 3873 memset (&outrel, 0, sizeof (outrel));
252b5132 3874 }
875c0872 3875 else if (hh != NULL
a63e02c7 3876 && hh->eh.dynindx != -1
74d1c347 3877 && (plabel
446f2863 3878 || !IS_ABSOLUTE_RELOC (r_type)
0e1862bb 3879 || !bfd_link_pic (info)
a496fbc8 3880 || !SYMBOLIC_BIND (info, &hh->eh)
a63e02c7 3881 || !hh->eh.def_regular))
252b5132 3882 {
a63e02c7 3883 outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
30667bf3
AM
3884 }
3885 else /* It's a local symbol, or one marked to become local. */
3886 {
3887 int indx = 0;
edd21aca 3888
30667bf3
AM
3889 /* Add the absolute offset of the symbol. */
3890 outrel.r_addend += relocation;
edd21aca 3891
74d1c347
AM
3892 /* Global plabels need to be processed by the
3893 dynamic linker so that functions have at most one
3894 fptr. For this reason, we need to differentiate
3895 between global and local plabels, which we do by
3896 providing the function symbol for a global plabel
3897 reloc, and no symbol for local plabels. */
3898 if (! plabel
3899 && sym_sec != NULL
30667bf3
AM
3900 && sym_sec->output_section != NULL
3901 && ! bfd_is_abs_section (sym_sec))
252b5132 3902 {
74541ad4
AM
3903 asection *osec;
3904
3905 osec = sym_sec->output_section;
3906 indx = elf_section_data (osec)->dynindx;
3907 if (indx == 0)
3908 {
3909 osec = htab->etab.text_index_section;
3910 indx = elf_section_data (osec)->dynindx;
3911 }
3912 BFD_ASSERT (indx != 0);
4b71bec0 3913
30667bf3
AM
3914 /* We are turning this relocation into one
3915 against a section symbol, so subtract out the
3916 output section's address but not the offset
3917 of the input section in the output section. */
74541ad4 3918 outrel.r_addend -= osec->vma;
252b5132 3919 }
252b5132 3920
30667bf3
AM
3921 outrel.r_info = ELF32_R_INFO (indx, r_type);
3922 }
98ceb8ce
AM
3923 sreloc = elf_section_data (input_section)->sreloc;
3924 if (sreloc == NULL)
3925 abort ();
3926
947216bf
AM
3927 loc = sreloc->contents;
3928 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
98ceb8ce 3929 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
30667bf3
AM
3930 }
3931 break;
68ffbac6 3932
9b52905e
NC
3933 case R_PARISC_TLS_LDM21L:
3934 case R_PARISC_TLS_LDM14R:
3935 {
3936 bfd_vma off;
68ffbac6 3937
9b52905e
NC
3938 off = htab->tls_ldm_got.offset;
3939 if (off & 1)
3940 off &= ~1;
3941 else
3942 {
3943 Elf_Internal_Rela outrel;
3944 bfd_byte *loc;
3945
68ffbac6 3946 outrel.r_offset = (off
ce558b89
AM
3947 + htab->etab.sgot->output_section->vma
3948 + htab->etab.sgot->output_offset);
9b52905e
NC
3949 outrel.r_addend = 0;
3950 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
ce558b89
AM
3951 loc = htab->etab.srelgot->contents;
3952 loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
9b52905e
NC
3953
3954 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3955 htab->tls_ldm_got.offset |= 1;
3956 }
3957
3958 /* Add the base of the GOT to the relocation value. */
3959 relocation = (off
ce558b89
AM
3960 + htab->etab.sgot->output_offset
3961 + htab->etab.sgot->output_section->vma);
9b52905e
NC
3962
3963 break;
3964 }
3965
3966 case R_PARISC_TLS_LDO21L:
3967 case R_PARISC_TLS_LDO14R:
3968 relocation -= dtpoff_base (info);
3969 break;
3970
3971 case R_PARISC_TLS_GD21L:
3972 case R_PARISC_TLS_GD14R:
3973 case R_PARISC_TLS_IE21L:
3974 case R_PARISC_TLS_IE14R:
3975 {
3976 bfd_vma off;
3977 int indx;
3978 char tls_type;
3979
3980 indx = 0;
3981 if (hh != NULL)
3982 {
3983 bfd_boolean dyn;
3984 dyn = htab->etab.dynamic_sections_created;
3985
0e1862bb
L
3986 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3987 bfd_link_pic (info),
3988 &hh->eh)
3989 && (!bfd_link_pic (info)
9b52905e
NC
3990 || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
3991 {
3992 indx = hh->eh.dynindx;
3993 }
3994 off = hh->eh.got.offset;
3995 tls_type = hh->tls_type;
3996 }
3997 else
3998 {
3999 off = local_got_offsets[r_symndx];
4000 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4001 }
4002
4003 if (tls_type == GOT_UNKNOWN)
4004 abort ();
4005
4006 if ((off & 1) != 0)
4007 off &= ~1;
4008 else
4009 {
4010 bfd_boolean need_relocs = FALSE;
4011 Elf_Internal_Rela outrel;
4012 bfd_byte *loc = NULL;
4013 int cur_off = off;
4014
4015 /* The GOT entries have not been initialized yet. Do it
4016 now, and emit any relocations. If both an IE GOT and a
4017 GD GOT are necessary, we emit the GD first. */
4018
0e1862bb 4019 if ((bfd_link_pic (info) || indx != 0)
9b52905e
NC
4020 && (hh == NULL
4021 || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4022 || hh->eh.root.type != bfd_link_hash_undefweak))
4023 {
4024 need_relocs = TRUE;
ce558b89 4025 loc = htab->etab.srelgot->contents;
9b52905e 4026 /* FIXME (CAO): Should this be reloc_count++ ? */
ce558b89 4027 loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela);
9b52905e
NC
4028 }
4029
4030 if (tls_type & GOT_TLS_GD)
4031 {
4032 if (need_relocs)
4033 {
4034 outrel.r_offset = (cur_off
ce558b89
AM
4035 + htab->etab.sgot->output_section->vma
4036 + htab->etab.sgot->output_offset);
9b52905e
NC
4037 outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4038 outrel.r_addend = 0;
ce558b89 4039 bfd_put_32 (output_bfd, 0, htab->etab.sgot->contents + cur_off);
9b52905e 4040 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
ce558b89 4041 htab->etab.srelgot->reloc_count++;
9b52905e
NC
4042 loc += sizeof (Elf32_External_Rela);
4043
4044 if (indx == 0)
4045 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
ce558b89 4046 htab->etab.sgot->contents + cur_off + 4);
9b52905e
NC
4047 else
4048 {
4049 bfd_put_32 (output_bfd, 0,
ce558b89 4050 htab->etab.sgot->contents + cur_off + 4);
9b52905e
NC
4051 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4052 outrel.r_offset += 4;
4053 bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
ce558b89 4054 htab->etab.srelgot->reloc_count++;
9b52905e
NC
4055 loc += sizeof (Elf32_External_Rela);
4056 }
4057 }
4058 else
4059 {
4060 /* If we are not emitting relocations for a
4061 general dynamic reference, then we must be in a
4062 static link or an executable link with the
4063 symbol binding locally. Mark it as belonging
4064 to module 1, the executable. */
4065 bfd_put_32 (output_bfd, 1,
ce558b89 4066 htab->etab.sgot->contents + cur_off);
9b52905e 4067 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
ce558b89 4068 htab->etab.sgot->contents + cur_off + 4);
9b52905e
NC
4069 }
4070
4071
4072 cur_off += 8;
4073 }
4074
4075 if (tls_type & GOT_TLS_IE)
4076 {
4077 if (need_relocs)
4078 {
4079 outrel.r_offset = (cur_off
ce558b89
AM
4080 + htab->etab.sgot->output_section->vma
4081 + htab->etab.sgot->output_offset);
9b52905e
NC
4082 outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4083
4084 if (indx == 0)
4085 outrel.r_addend = relocation - dtpoff_base (info);
4086 else
4087 outrel.r_addend = 0;
4088
4089 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
ce558b89 4090 htab->etab.srelgot->reloc_count++;
9b52905e
NC
4091 loc += sizeof (Elf32_External_Rela);
4092 }
4093 else
4094 bfd_put_32 (output_bfd, tpoff (info, relocation),
ce558b89 4095 htab->etab.sgot->contents + cur_off);
9b52905e
NC
4096
4097 cur_off += 4;
4098 }
4099
4100 if (hh != NULL)
4101 hh->eh.got.offset |= 1;
4102 else
4103 local_got_offsets[r_symndx] |= 1;
4104 }
4105
4106 if ((tls_type & GOT_TLS_GD)
4107 && r_type != R_PARISC_TLS_GD21L
4108 && r_type != R_PARISC_TLS_GD14R)
4109 off += 2 * GOT_ENTRY_SIZE;
4110
4111 /* Add the base of the GOT to the relocation value. */
4112 relocation = (off
ce558b89
AM
4113 + htab->etab.sgot->output_offset
4114 + htab->etab.sgot->output_section->vma);
9b52905e
NC
4115
4116 break;
4117 }
4118
4119 case R_PARISC_TLS_LE21L:
4120 case R_PARISC_TLS_LE14R:
4121 {
4122 relocation = tpoff (info, relocation);
4123 break;
4124 }
4125 break;
edd21aca 4126
30667bf3
AM
4127 default:
4128 break;
4129 }
252b5132 4130
875c0872
DA
4131 rstatus = final_link_relocate (input_section, contents, rela, relocation,
4132 htab, sym_sec, hh, info);
252b5132 4133
875c0872 4134 if (rstatus == bfd_reloc_ok)
30667bf3 4135 continue;
252b5132 4136
875c0872 4137 if (hh != NULL)
9b52905e 4138 sym_name = hh_name (hh);
30667bf3
AM
4139 else
4140 {
4141 sym_name = bfd_elf_string_from_elf_section (input_bfd,
4142 symtab_hdr->sh_link,
4143 sym->st_name);
4144 if (sym_name == NULL)
b34976b6 4145 return FALSE;
30667bf3
AM
4146 if (*sym_name == '\0')
4147 sym_name = bfd_section_name (input_bfd, sym_sec);
4148 }
edd21aca 4149
30667bf3 4150 howto = elf_hppa_howto_table + r_type;
252b5132 4151
875c0872 4152 if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
30667bf3 4153 {
875c0872 4154 if (rstatus == bfd_reloc_notsupported || !warned_undef)
f09ebc7d 4155 {
4eca0228 4156 _bfd_error_handler
695344c0 4157 /* xgettext:c-format */
d42c267e 4158 (_("%B(%A+%#Lx): cannot handle %s for %s"),
d003868e
AM
4159 input_bfd,
4160 input_section,
d42c267e 4161 rela->r_offset,
f09ebc7d
AM
4162 howto->name,
4163 sym_name);
4164 bfd_set_error (bfd_error_bad_value);
b34976b6 4165 return FALSE;
f09ebc7d 4166 }
30667bf3
AM
4167 }
4168 else
1a72702b
AM
4169 (*info->callbacks->reloc_overflow)
4170 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4171 (bfd_vma) 0, input_bfd, input_section, rela->r_offset);
30667bf3 4172 }
edd21aca 4173
b34976b6 4174 return TRUE;
30667bf3 4175}
252b5132 4176
30667bf3
AM
4177/* Finish up dynamic symbol handling. We set the contents of various
4178 dynamic sections here. */
252b5132 4179
b34976b6 4180static bfd_boolean
c39a58e6
AM
4181elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4182 struct bfd_link_info *info,
875c0872 4183 struct elf_link_hash_entry *eh,
c39a58e6 4184 Elf_Internal_Sym *sym)
30667bf3 4185{
83c81bfe 4186 struct elf32_hppa_link_hash_table *htab;
875c0872 4187 Elf_Internal_Rela rela;
a252afa4 4188 bfd_byte *loc;
edd21aca 4189
83c81bfe 4190 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
4191 if (htab == NULL)
4192 return FALSE;
30667bf3 4193
875c0872 4194 if (eh->plt.offset != (bfd_vma) -1)
30667bf3
AM
4195 {
4196 bfd_vma value;
30667bf3 4197
875c0872 4198 if (eh->plt.offset & 1)
8dea1268
AM
4199 abort ();
4200
30667bf3
AM
4201 /* This symbol has an entry in the procedure linkage table. Set
4202 it up.
4203
4204 The format of a plt entry is
74d1c347
AM
4205 <funcaddr>
4206 <__gp>
47d89dba 4207 */
30667bf3 4208 value = 0;
875c0872
DA
4209 if (eh->root.type == bfd_link_hash_defined
4210 || eh->root.type == bfd_link_hash_defweak)
30667bf3 4211 {
875c0872
DA
4212 value = eh->root.u.def.value;
4213 if (eh->root.u.def.section->output_section != NULL)
4214 value += (eh->root.u.def.section->output_offset
4215 + eh->root.u.def.section->output_section->vma);
252b5132 4216 }
edd21aca 4217
a252afa4 4218 /* Create a dynamic IPLT relocation for this entry. */
875c0872 4219 rela.r_offset = (eh->plt.offset
ce558b89
AM
4220 + htab->etab.splt->output_offset
4221 + htab->etab.splt->output_section->vma);
875c0872 4222 if (eh->dynindx != -1)
30667bf3 4223 {
875c0872
DA
4224 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4225 rela.r_addend = 0;
30667bf3 4226 }
ce757d15 4227 else
47d89dba 4228 {
a252afa4
DA
4229 /* This symbol has been marked to become local, and is
4230 used by a plabel so must be kept in the .plt. */
875c0872
DA
4231 rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4232 rela.r_addend = value;
47d89dba
AM
4233 }
4234
ce558b89
AM
4235 loc = htab->etab.srelplt->contents;
4236 loc += htab->etab.srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4237 bfd_elf32_swap_reloca_out (htab->etab.splt->output_section->owner, &rela, loc);
a252afa4 4238
875c0872 4239 if (!eh->def_regular)
30667bf3
AM
4240 {
4241 /* Mark the symbol as undefined, rather than as defined in
4242 the .plt section. Leave the value alone. */
4243 sym->st_shndx = SHN_UNDEF;
4244 }
4245 }
edd21aca 4246
9b52905e
NC
4247 if (eh->got.offset != (bfd_vma) -1
4248 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
d336fa6d
AM
4249 && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0
4250 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
30667bf3 4251 {
d336fa6d
AM
4252 bfd_boolean is_dyn = (eh->dynindx != -1
4253 && !SYMBOL_REFERENCES_LOCAL (info, eh));
4254
4255 if (is_dyn || bfd_link_pic (info))
30667bf3 4256 {
d336fa6d
AM
4257 /* This symbol has an entry in the global offset table. Set
4258 it up. */
4259
4260 rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4261 + htab->etab.sgot->output_offset
4262 + htab->etab.sgot->output_section->vma);
4263
4264 /* If this is a -Bsymbolic link and the symbol is defined
4265 locally or was forced to be local because of a version
4266 file, we just want to emit a RELATIVE reloc. The entry
4267 in the global offset table will already have been
4268 initialized in the relocate_section function. */
4269 if (!is_dyn)
4270 {
4271 rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4272 rela.r_addend = (eh->root.u.def.value
4273 + eh->root.u.def.section->output_offset
4274 + eh->root.u.def.section->output_section->vma);
4275 }
4276 else
4277 {
4278 if ((eh->got.offset & 1) != 0)
4279 abort ();
875c0872 4280
d336fa6d
AM
4281 bfd_put_32 (output_bfd, 0,
4282 htab->etab.sgot->contents + (eh->got.offset & ~1));
4283 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4284 rela.r_addend = 0;
4285 }
edd21aca 4286
d336fa6d
AM
4287 loc = htab->etab.srelgot->contents;
4288 loc += (htab->etab.srelgot->reloc_count++
4289 * sizeof (Elf32_External_Rela));
4290 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4291 }
30667bf3 4292 }
edd21aca 4293
875c0872 4294 if (eh->needs_copy)
30667bf3 4295 {
875c0872 4296 asection *sec;
30667bf3
AM
4297
4298 /* This symbol needs a copy reloc. Set it up. */
4299
875c0872
DA
4300 if (! (eh->dynindx != -1
4301 && (eh->root.type == bfd_link_hash_defined
4302 || eh->root.type == bfd_link_hash_defweak)))
49e9d0d3 4303 abort ();
30667bf3 4304
875c0872
DA
4305 rela.r_offset = (eh->root.u.def.value
4306 + eh->root.u.def.section->output_offset
4307 + eh->root.u.def.section->output_section->vma);
4308 rela.r_addend = 0;
4309 rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
afbf7e8e 4310 if (eh->root.u.def.section == htab->etab.sdynrelro)
5474d94f
AM
4311 sec = htab->etab.sreldynrelro;
4312 else
4313 sec = htab->etab.srelbss;
875c0872
DA
4314 loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4315 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
30667bf3
AM
4316 }
4317
4318 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
9637f6ef 4319 if (eh == htab->etab.hdynamic || eh == htab->etab.hgot)
30667bf3
AM
4320 {
4321 sym->st_shndx = SHN_ABS;
4322 }
4323
b34976b6 4324 return TRUE;
30667bf3
AM
4325}
4326
98ceb8ce
AM
4327/* Used to decide how to sort relocs in an optimal manner for the
4328 dynamic linker, before writing them out. */
4329
4330static enum elf_reloc_type_class
7e612e98
AM
4331elf32_hppa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4332 const asection *rel_sec ATTRIBUTE_UNUSED,
4333 const Elf_Internal_Rela *rela)
98ceb8ce 4334{
9b52905e 4335 /* Handle TLS relocs first; we don't want them to be marked
cf35638d 4336 relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
9b52905e
NC
4337 check below. */
4338 switch ((int) ELF32_R_TYPE (rela->r_info))
4339 {
4340 case R_PARISC_TLS_DTPMOD32:
4341 case R_PARISC_TLS_DTPOFF32:
4342 case R_PARISC_TLS_TPREL32:
4343 return reloc_class_normal;
4344 }
4345
cf35638d 4346 if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)
98ceb8ce
AM
4347 return reloc_class_relative;
4348
4349 switch ((int) ELF32_R_TYPE (rela->r_info))
4350 {
4351 case R_PARISC_IPLT:
4352 return reloc_class_plt;
4353 case R_PARISC_COPY:
4354 return reloc_class_copy;
4355 default:
4356 return reloc_class_normal;
4357 }
4358}
4359
30667bf3
AM
4360/* Finish up the dynamic sections. */
4361
b34976b6 4362static bfd_boolean
c39a58e6
AM
4363elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4364 struct bfd_link_info *info)
30667bf3
AM
4365{
4366 bfd *dynobj;
83c81bfe 4367 struct elf32_hppa_link_hash_table *htab;
30667bf3 4368 asection *sdyn;
894891db 4369 asection * sgot;
30667bf3 4370
83c81bfe 4371 htab = hppa_link_hash_table (info);
4dfe6ac6
NC
4372 if (htab == NULL)
4373 return FALSE;
4374
a63e02c7 4375 dynobj = htab->etab.dynobj;
30667bf3 4376
ce558b89 4377 sgot = htab->etab.sgot;
894891db
NC
4378 /* A broken linker script might have discarded the dynamic sections.
4379 Catch this here so that we do not seg-fault later on. */
4380 if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
4381 return FALSE;
4382
3d4d4302 4383 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
30667bf3 4384
a63e02c7 4385 if (htab->etab.dynamic_sections_created)
30667bf3
AM
4386 {
4387 Elf32_External_Dyn *dyncon, *dynconend;
4388
49e9d0d3
AM
4389 if (sdyn == NULL)
4390 abort ();
30667bf3
AM
4391
4392 dyncon = (Elf32_External_Dyn *) sdyn->contents;
eea6121a 4393 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
30667bf3 4394 for (; dyncon < dynconend; dyncon++)
edd21aca 4395 {
30667bf3
AM
4396 Elf_Internal_Dyn dyn;
4397 asection *s;
4398
4399 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4400
4401 switch (dyn.d_tag)
4402 {
4403 default:
3ac8354b 4404 continue;
30667bf3
AM
4405
4406 case DT_PLTGOT:
4407 /* Use PLTGOT to set the GOT register. */
4408 dyn.d_un.d_ptr = elf_gp (output_bfd);
30667bf3
AM
4409 break;
4410
4411 case DT_JMPREL:
ce558b89 4412 s = htab->etab.srelplt;
30667bf3 4413 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
30667bf3
AM
4414 break;
4415
4416 case DT_PLTRELSZ:
ce558b89 4417 s = htab->etab.srelplt;
eea6121a 4418 dyn.d_un.d_val = s->size;
30667bf3
AM
4419 break;
4420 }
3ac8354b
AM
4421
4422 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
edd21aca 4423 }
252b5132 4424 }
edd21aca 4425
894891db 4426 if (sgot != NULL && sgot->size != 0)
30667bf3 4427 {
74d1c347
AM
4428 /* Fill in the first entry in the global offset table.
4429 We use it to point to our dynamic section, if we have one. */
30667bf3 4430 bfd_put_32 (output_bfd,
c39a58e6 4431 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
894891db 4432 sgot->contents);
30667bf3 4433
74d1c347 4434 /* The second entry is reserved for use by the dynamic linker. */
894891db 4435 memset (sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
74d1c347 4436
30667bf3 4437 /* Set .got entry size. */
894891db 4438 elf_section_data (sgot->output_section)
74d1c347 4439 ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
30667bf3
AM
4440 }
4441
ce558b89 4442 if (htab->etab.splt != NULL && htab->etab.splt->size != 0)
47d89dba 4443 {
f3c3938c
JDA
4444 /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the
4445 plt stubs and as such the section does not hold a table of fixed-size
4446 entries. */
ce558b89 4447 elf_section_data (htab->etab.splt->output_section)->this_hdr.sh_entsize = 0;
47d89dba 4448
83c81bfe 4449 if (htab->need_plt_stub)
47d89dba
AM
4450 {
4451 /* Set up the .plt stub. */
ce558b89
AM
4452 memcpy (htab->etab.splt->contents
4453 + htab->etab.splt->size - sizeof (plt_stub),
47d89dba
AM
4454 plt_stub, sizeof (plt_stub));
4455
ce558b89
AM
4456 if ((htab->etab.splt->output_offset
4457 + htab->etab.splt->output_section->vma
4458 + htab->etab.splt->size)
894891db
NC
4459 != (sgot->output_offset
4460 + sgot->output_section->vma))
47d89dba 4461 {
4eca0228 4462 _bfd_error_handler
47d89dba 4463 (_(".got section not immediately after .plt section"));
b34976b6 4464 return FALSE;
47d89dba
AM
4465 }
4466 }
4467 }
30667bf3 4468
b34976b6 4469 return TRUE;
30667bf3 4470}
252b5132 4471
30667bf3
AM
4472/* Called when writing out an object file to decide the type of a
4473 symbol. */
4474static int
c39a58e6 4475elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
30667bf3
AM
4476{
4477 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4478 return STT_PARISC_MILLI;
4479 else
4480 return type;
252b5132
RH
4481}
4482
4483/* Misc BFD support code. */
30667bf3
AM
4484#define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
4485#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
0c8d6e5c 4486#define bfd_elf32_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
30667bf3
AM
4487#define elf_info_to_howto elf_hppa_info_to_howto
4488#define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
252b5132 4489
252b5132 4490/* Stuff for the BFD linker. */
c46b7515 4491#define bfd_elf32_bfd_final_link elf32_hppa_final_link
30667bf3 4492#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
30667bf3 4493#define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
ebe50bae 4494#define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
30667bf3 4495#define elf_backend_check_relocs elf32_hppa_check_relocs
c0e331c7 4496#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
30667bf3
AM
4497#define elf_backend_create_dynamic_sections elf32_hppa_create_dynamic_sections
4498#define elf_backend_fake_sections elf_hppa_fake_sections
4499#define elf_backend_relocate_section elf32_hppa_relocate_section
74d1c347 4500#define elf_backend_hide_symbol elf32_hppa_hide_symbol
30667bf3
AM
4501#define elf_backend_finish_dynamic_symbol elf32_hppa_finish_dynamic_symbol
4502#define elf_backend_finish_dynamic_sections elf32_hppa_finish_dynamic_sections
4503#define elf_backend_size_dynamic_sections elf32_hppa_size_dynamic_sections
74541ad4 4504#define elf_backend_init_index_section _bfd_elf_init_1_index_section
30667bf3 4505#define elf_backend_gc_mark_hook elf32_hppa_gc_mark_hook
edfc032f
AM
4506#define elf_backend_grok_prstatus elf32_hppa_grok_prstatus
4507#define elf_backend_grok_psinfo elf32_hppa_grok_psinfo
30667bf3
AM
4508#define elf_backend_object_p elf32_hppa_object_p
4509#define elf_backend_final_write_processing elf_hppa_final_write_processing
4510#define elf_backend_get_symbol_type elf32_hppa_elf_get_symbol_type
98ceb8ce 4511#define elf_backend_reloc_type_class elf32_hppa_reloc_type_class
8a696751 4512#define elf_backend_action_discarded elf_hppa_action_discarded
30667bf3
AM
4513
4514#define elf_backend_can_gc_sections 1
51b64d56 4515#define elf_backend_can_refcount 1
30667bf3
AM
4516#define elf_backend_plt_alignment 2
4517#define elf_backend_want_got_plt 0
4518#define elf_backend_plt_readonly 0
4519#define elf_backend_want_plt_sym 0
74d1c347 4520#define elf_backend_got_header_size 8
5474d94f 4521#define elf_backend_want_dynrelro 1
f0fe0e16 4522#define elf_backend_rela_normal 1
64f52338 4523#define elf_backend_dtrel_excludes_plt 1
a8c75b76 4524#define elf_backend_no_page_alias 1
252b5132 4525
6d00b590 4526#define TARGET_BIG_SYM hppa_elf32_vec
252b5132
RH
4527#define TARGET_BIG_NAME "elf32-hppa"
4528#define ELF_ARCH bfd_arch_hppa
ae95ffa6 4529#define ELF_TARGET_ID HPPA32_ELF_DATA
252b5132
RH
4530#define ELF_MACHINE_CODE EM_PARISC
4531#define ELF_MAXPAGESIZE 0x1000
d1036acb 4532#define ELF_OSABI ELFOSABI_HPUX
914dfb0f 4533#define elf32_bed elf32_hppa_hpux_bed
252b5132
RH
4534
4535#include "elf32-target.h"
d952f17a
AM
4536
4537#undef TARGET_BIG_SYM
6d00b590 4538#define TARGET_BIG_SYM hppa_elf32_linux_vec
d952f17a 4539#undef TARGET_BIG_NAME
914dfb0f 4540#define TARGET_BIG_NAME "elf32-hppa-linux"
d1036acb 4541#undef ELF_OSABI
9c55345c 4542#define ELF_OSABI ELFOSABI_GNU
914dfb0f
DA
4543#undef elf32_bed
4544#define elf32_bed elf32_hppa_linux_bed
d952f17a 4545
d952f17a 4546#include "elf32-target.h"
225247f0
JT
4547
4548#undef TARGET_BIG_SYM
6d00b590 4549#define TARGET_BIG_SYM hppa_elf32_nbsd_vec
225247f0 4550#undef TARGET_BIG_NAME
914dfb0f 4551#define TARGET_BIG_NAME "elf32-hppa-netbsd"
d1036acb
L
4552#undef ELF_OSABI
4553#define ELF_OSABI ELFOSABI_NETBSD
914dfb0f
DA
4554#undef elf32_bed
4555#define elf32_bed elf32_hppa_netbsd_bed
225247f0
JT
4556
4557#include "elf32-target.h"
This page took 1.333527 seconds and 4 git commands to generate.