OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [elf32-hppa.c] - Blame information for rev 578

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.