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