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

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [elf32-hppa.c] - Blame information for rev 1778

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

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

powered by: WebSVN 2.1.0

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