OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [bfd/] [elf32-hppa.c] - Blame information for rev 532

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

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

powered by: WebSVN 2.1.0

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