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