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