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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [bfd/] [elf32-hppa.c] - Blame information for rev 307

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

Line No. Rev Author Line
1 38 julius
/* BFD back-end for HP PA-RISC ELF files.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
3
   2002, 2003, 2004, 2005, 2006, 2007, 2008
4
   Free Software Foundation, Inc.
5
 
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
  /* Small local sym to section mapping cache.  */
305
  struct sym_sec_cache sym_sec;
306
 
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
  htab->sym_sec.abfd = NULL;
464
  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
  htab->srelgot = bfd_make_section_with_flags (abfd, ".rela.got",
1015
                                               (SEC_ALLOC
1016
                                                | SEC_LOAD
1017
                                                | SEC_HAS_CONTENTS
1018
                                                | SEC_IN_MEMORY
1019
                                                | SEC_LINKER_CREATED
1020
                                                | SEC_READONLY));
1021
  if (htab->srelgot == NULL
1022
      || ! bfd_set_section_alignment (abfd, htab->srelgot, 2))
1023
    return FALSE;
1024
 
1025
  htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
1026
  htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
1027
 
1028
  /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main
1029
     application, because __canonicalize_funcptr_for_compare needs it.  */
1030
  eh = elf_hash_table (info)->hgot;
1031
  eh->forced_local = 0;
1032
  eh->other = STV_DEFAULT;
1033
  return bfd_elf_link_record_dynamic_symbol (info, eh);
1034
}
1035
 
1036
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
1037
 
1038
static void
1039
elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
1040
                                 struct elf_link_hash_entry *eh_dir,
1041
                                 struct elf_link_hash_entry *eh_ind)
1042
{
1043
  struct elf32_hppa_link_hash_entry *hh_dir, *hh_ind;
1044
 
1045
  hh_dir = hppa_elf_hash_entry (eh_dir);
1046
  hh_ind = hppa_elf_hash_entry (eh_ind);
1047
 
1048
  if (hh_ind->dyn_relocs != NULL)
1049
    {
1050
      if (hh_dir->dyn_relocs != NULL)
1051
        {
1052
          struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1053
          struct elf32_hppa_dyn_reloc_entry *hdh_p;
1054
 
1055
          /* Add reloc counts against the indirect sym to the direct sym
1056
             list.  Merge any entries against the same section.  */
1057
          for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
1058
            {
1059
              struct elf32_hppa_dyn_reloc_entry *hdh_q;
1060
 
1061
              for (hdh_q = hh_dir->dyn_relocs;
1062
                   hdh_q != NULL;
1063
                   hdh_q = hdh_q->hdh_next)
1064
                if (hdh_q->sec == hdh_p->sec)
1065
                  {
1066
#if RELATIVE_DYNRELOCS
1067
                    hdh_q->relative_count += hdh_p->relative_count;
1068
#endif
1069
                    hdh_q->count += hdh_p->count;
1070
                    *hdh_pp = hdh_p->hdh_next;
1071
                    break;
1072
                  }
1073
              if (hdh_q == NULL)
1074
                hdh_pp = &hdh_p->hdh_next;
1075
            }
1076
          *hdh_pp = hh_dir->dyn_relocs;
1077
        }
1078
 
1079
      hh_dir->dyn_relocs = hh_ind->dyn_relocs;
1080
      hh_ind->dyn_relocs = NULL;
1081
    }
1082
 
1083
  if (ELIMINATE_COPY_RELOCS
1084
      && eh_ind->root.type != bfd_link_hash_indirect
1085
      && eh_dir->dynamic_adjusted)
1086
    {
1087
      /* If called to transfer flags for a weakdef during processing
1088
         of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1089
         We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
1090
      eh_dir->ref_dynamic |= eh_ind->ref_dynamic;
1091
      eh_dir->ref_regular |= eh_ind->ref_regular;
1092
      eh_dir->ref_regular_nonweak |= eh_ind->ref_regular_nonweak;
1093
      eh_dir->needs_plt |= eh_ind->needs_plt;
1094
    }
1095
  else
1096
    {
1097
      if (eh_ind->root.type == bfd_link_hash_indirect
1098
          && eh_dir->got.refcount <= 0)
1099
        {
1100
          hh_dir->tls_type = hh_ind->tls_type;
1101
          hh_ind->tls_type = GOT_UNKNOWN;
1102
        }
1103
 
1104
      _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
1105
    }
1106
}
1107
 
1108
static int
1109
elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1110
                                int r_type, int is_local ATTRIBUTE_UNUSED)
1111
{
1112
  /* For now we don't support linker optimizations.  */
1113
  return r_type;
1114
}
1115
 
1116
/* Look through the relocs for a section during the first phase, and
1117
   calculate needed space in the global offset table, procedure linkage
1118
   table, and dynamic reloc sections.  At this point we haven't
1119
   necessarily read all the input files.  */
1120
 
1121
static bfd_boolean
1122
elf32_hppa_check_relocs (bfd *abfd,
1123
                         struct bfd_link_info *info,
1124
                         asection *sec,
1125
                         const Elf_Internal_Rela *relocs)
1126
{
1127
  Elf_Internal_Shdr *symtab_hdr;
1128
  struct elf_link_hash_entry **eh_syms;
1129
  const Elf_Internal_Rela *rela;
1130
  const Elf_Internal_Rela *rela_end;
1131
  struct elf32_hppa_link_hash_table *htab;
1132
  asection *sreloc;
1133
  asection *stubreloc;
1134
  int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
1135
 
1136
  if (info->relocatable)
1137
    return TRUE;
1138
 
1139
  htab = hppa_link_hash_table (info);
1140
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1141
  eh_syms = elf_sym_hashes (abfd);
1142
  sreloc = NULL;
1143
  stubreloc = NULL;
1144
 
1145
  rela_end = relocs + sec->reloc_count;
1146
  for (rela = relocs; rela < rela_end; rela++)
1147
    {
1148
      enum {
1149
        NEED_GOT = 1,
1150
        NEED_PLT = 2,
1151
        NEED_DYNREL = 4,
1152
        PLT_PLABEL = 8
1153
      };
1154
 
1155
      unsigned int r_symndx, r_type;
1156
      struct elf32_hppa_link_hash_entry *hh;
1157
      int need_entry = 0;
1158
 
1159
      r_symndx = ELF32_R_SYM (rela->r_info);
1160
 
1161
      if (r_symndx < symtab_hdr->sh_info)
1162
        hh = NULL;
1163
      else
1164
        {
1165
          hh =  hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1166
          while (hh->eh.root.type == bfd_link_hash_indirect
1167
                 || hh->eh.root.type == bfd_link_hash_warning)
1168
            hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1169
        }
1170
 
1171
      r_type = ELF32_R_TYPE (rela->r_info);
1172
      r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1173
 
1174
      switch (r_type)
1175
        {
1176
        case R_PARISC_DLTIND14F:
1177
        case R_PARISC_DLTIND14R:
1178
        case R_PARISC_DLTIND21L:
1179
          /* This symbol requires a global offset table entry.  */
1180
          need_entry = NEED_GOT;
1181
          break;
1182
 
1183
        case R_PARISC_PLABEL14R: /* "Official" procedure labels.  */
1184
        case R_PARISC_PLABEL21L:
1185
        case R_PARISC_PLABEL32:
1186
          /* If the addend is non-zero, we break badly.  */
1187
          if (rela->r_addend != 0)
1188
            abort ();
1189
 
1190
          /* If we are creating a shared library, then we need to
1191
             create a PLT entry for all PLABELs, because PLABELs with
1192
             local symbols may be passed via a pointer to another
1193
             object.  Additionally, output a dynamic relocation
1194
             pointing to the PLT entry.
1195
 
1196
             For executables, the original 32-bit ABI allowed two
1197
             different styles of PLABELs (function pointers):  For
1198
             global functions, the PLABEL word points into the .plt
1199
             two bytes past a (function address, gp) pair, and for
1200
             local functions the PLABEL points directly at the
1201
             function.  The magic +2 for the first type allows us to
1202
             differentiate between the two.  As you can imagine, this
1203
             is a real pain when it comes to generating code to call
1204
             functions indirectly or to compare function pointers.
1205
             We avoid the mess by always pointing a PLABEL into the
1206
             .plt, even for local functions.  */
1207
          need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
1208
          break;
1209
 
1210
        case R_PARISC_PCREL12F:
1211
          htab->has_12bit_branch = 1;
1212
          goto branch_common;
1213
 
1214
        case R_PARISC_PCREL17C:
1215
        case R_PARISC_PCREL17F:
1216
          htab->has_17bit_branch = 1;
1217
          goto branch_common;
1218
 
1219
        case R_PARISC_PCREL22F:
1220
          htab->has_22bit_branch = 1;
1221
        branch_common:
1222
          /* Function calls might need to go through the .plt, and
1223
             might require long branch stubs.  */
1224
          if (hh == NULL)
1225
            {
1226
              /* We know local syms won't need a .plt entry, and if
1227
                 they need a long branch stub we can't guarantee that
1228
                 we can reach the stub.  So just flag an error later
1229
                 if we're doing a shared link and find we need a long
1230
                 branch stub.  */
1231
              continue;
1232
            }
1233
          else
1234
            {
1235
              /* Global symbols will need a .plt entry if they remain
1236
                 global, and in most cases won't need a long branch
1237
                 stub.  Unfortunately, we have to cater for the case
1238
                 where a symbol is forced local by versioning, or due
1239
                 to symbolic linking, and we lose the .plt entry.  */
1240
              need_entry = NEED_PLT;
1241
              if (hh->eh.type == STT_PARISC_MILLI)
1242
                need_entry = 0;
1243
            }
1244
          break;
1245
 
1246
        case R_PARISC_SEGBASE:  /* Used to set segment base.  */
1247
        case R_PARISC_SEGREL32: /* Relative reloc, used for unwind.  */
1248
        case R_PARISC_PCREL14F: /* PC relative load/store.  */
1249
        case R_PARISC_PCREL14R:
1250
        case R_PARISC_PCREL17R: /* External branches.  */
1251
        case R_PARISC_PCREL21L: /* As above, and for load/store too.  */
1252
        case R_PARISC_PCREL32:
1253
          /* We don't need to propagate the relocation if linking a
1254
             shared object since these are section relative.  */
1255
          continue;
1256
 
1257
        case R_PARISC_DPREL14F: /* Used for gp rel data load/store.  */
1258
        case R_PARISC_DPREL14R:
1259
        case R_PARISC_DPREL21L:
1260
          if (info->shared)
1261
            {
1262
              (*_bfd_error_handler)
1263
                (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1264
                 abfd,
1265
                 elf_hppa_howto_table[r_type].name);
1266
              bfd_set_error (bfd_error_bad_value);
1267
              return FALSE;
1268
            }
1269
          /* Fall through.  */
1270
 
1271
        case R_PARISC_DIR17F: /* Used for external branches.  */
1272
        case R_PARISC_DIR17R:
1273
        case R_PARISC_DIR14F: /* Used for load/store from absolute locn.  */
1274
        case R_PARISC_DIR14R:
1275
        case R_PARISC_DIR21L: /* As above, and for ext branches too.  */
1276
        case R_PARISC_DIR32: /* .word relocs.  */
1277
          /* We may want to output a dynamic relocation later.  */
1278
          need_entry = NEED_DYNREL;
1279
          break;
1280
 
1281
          /* This relocation describes the C++ object vtable hierarchy.
1282
             Reconstruct it for later use during GC.  */
1283
        case R_PARISC_GNU_VTINHERIT:
1284
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1285
            return FALSE;
1286
          continue;
1287
 
1288
          /* This relocation describes which C++ vtable entries are actually
1289
             used.  Record for later use during GC.  */
1290
        case R_PARISC_GNU_VTENTRY:
1291
          BFD_ASSERT (hh != NULL);
1292
          if (hh != NULL
1293
              && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1294
            return FALSE;
1295
          continue;
1296
 
1297
        case R_PARISC_TLS_GD21L:
1298
        case R_PARISC_TLS_GD14R:
1299
        case R_PARISC_TLS_LDM21L:
1300
        case R_PARISC_TLS_LDM14R:
1301
          need_entry = NEED_GOT;
1302
          break;
1303
 
1304
        case R_PARISC_TLS_IE21L:
1305
        case R_PARISC_TLS_IE14R:
1306
          if (info->shared)
1307
            info->flags |= DF_STATIC_TLS;
1308
          need_entry = NEED_GOT;
1309
          break;
1310
 
1311
        default:
1312
          continue;
1313
        }
1314
 
1315
      /* Now carry out our orders.  */
1316
      if (need_entry & NEED_GOT)
1317
        {
1318
          switch (r_type)
1319
            {
1320
            default:
1321
              tls_type = GOT_NORMAL;
1322
              break;
1323
            case R_PARISC_TLS_GD21L:
1324
            case R_PARISC_TLS_GD14R:
1325
              tls_type |= GOT_TLS_GD;
1326
              break;
1327
            case R_PARISC_TLS_LDM21L:
1328
            case R_PARISC_TLS_LDM14R:
1329
              tls_type |= GOT_TLS_LDM;
1330
              break;
1331
            case R_PARISC_TLS_IE21L:
1332
            case R_PARISC_TLS_IE14R:
1333
              tls_type |= GOT_TLS_IE;
1334
              break;
1335
            }
1336
 
1337
          /* Allocate space for a GOT entry, as well as a dynamic
1338
             relocation for this entry.  */
1339
          if (htab->sgot == NULL)
1340
            {
1341
              if (htab->etab.dynobj == NULL)
1342
                htab->etab.dynobj = abfd;
1343
              if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1344
                return FALSE;
1345
            }
1346
 
1347
          if (r_type == R_PARISC_TLS_LDM21L
1348
              || r_type == R_PARISC_TLS_LDM14R)
1349
            hppa_link_hash_table (info)->tls_ldm_got.refcount += 1;
1350
          else
1351
            {
1352
              if (hh != NULL)
1353
                {
1354
                  hh->eh.got.refcount += 1;
1355
                  old_tls_type = hh->tls_type;
1356
                }
1357
              else
1358
                {
1359
                  bfd_signed_vma *local_got_refcounts;
1360
 
1361
                  /* This is a global offset table entry for a local symbol.  */
1362
                  local_got_refcounts = elf_local_got_refcounts (abfd);
1363
                  if (local_got_refcounts == NULL)
1364
                    {
1365
                      bfd_size_type size;
1366
 
1367
                      /* Allocate space for local got offsets and local
1368
                         plt offsets.  Done this way to save polluting
1369
                         elf_obj_tdata with another target specific
1370
                         pointer.  */
1371
                      size = symtab_hdr->sh_info;
1372
                      size *= 2 * sizeof (bfd_signed_vma);
1373
                      /* Add in space to store the local GOT TLS types.  */
1374
                      size += symtab_hdr->sh_info;
1375
                      local_got_refcounts = bfd_zalloc (abfd, size);
1376
                      if (local_got_refcounts == NULL)
1377
                        return FALSE;
1378
                      elf_local_got_refcounts (abfd) = local_got_refcounts;
1379
                      memset (hppa_elf_local_got_tls_type (abfd),
1380
                          GOT_UNKNOWN, symtab_hdr->sh_info);
1381
                    }
1382
                  local_got_refcounts[r_symndx] += 1;
1383
 
1384
                  old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1385
                }
1386
 
1387
              tls_type |= old_tls_type;
1388
 
1389
              if (old_tls_type != tls_type)
1390
                {
1391
                  if (hh != NULL)
1392
                    hh->tls_type = tls_type;
1393
                  else
1394
                    hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1395
                }
1396
 
1397
            }
1398
        }
1399
 
1400
      if (need_entry & NEED_PLT)
1401
        {
1402
          /* If we are creating a shared library, and this is a reloc
1403
             against a weak symbol or a global symbol in a dynamic
1404
             object, then we will be creating an import stub and a
1405
             .plt entry for the symbol.  Similarly, on a normal link
1406
             to symbols defined in a dynamic object we'll need the
1407
             import stub and a .plt entry.  We don't know yet whether
1408
             the symbol is defined or not, so make an entry anyway and
1409
             clean up later in adjust_dynamic_symbol.  */
1410
          if ((sec->flags & SEC_ALLOC) != 0)
1411
            {
1412
              if (hh != NULL)
1413
                {
1414
                  hh->eh.needs_plt = 1;
1415
                  hh->eh.plt.refcount += 1;
1416
 
1417
                  /* If this .plt entry is for a plabel, mark it so
1418
                     that adjust_dynamic_symbol will keep the entry
1419
                     even if it appears to be local.  */
1420
                  if (need_entry & PLT_PLABEL)
1421
                    hh->plabel = 1;
1422
                }
1423
              else if (need_entry & PLT_PLABEL)
1424
                {
1425
                  bfd_signed_vma *local_got_refcounts;
1426
                  bfd_signed_vma *local_plt_refcounts;
1427
 
1428
                  local_got_refcounts = elf_local_got_refcounts (abfd);
1429
                  if (local_got_refcounts == NULL)
1430
                    {
1431
                      bfd_size_type size;
1432
 
1433
                      /* Allocate space for local got offsets and local
1434
                         plt offsets.  */
1435
                      size = symtab_hdr->sh_info;
1436
                      size *= 2 * sizeof (bfd_signed_vma);
1437
                      /* Add in space to store the local GOT TLS types.  */
1438
                      size += symtab_hdr->sh_info;
1439
                      local_got_refcounts = bfd_zalloc (abfd, size);
1440
                      if (local_got_refcounts == NULL)
1441
                        return FALSE;
1442
                      elf_local_got_refcounts (abfd) = local_got_refcounts;
1443
                    }
1444
                  local_plt_refcounts = (local_got_refcounts
1445
                                         + symtab_hdr->sh_info);
1446
                  local_plt_refcounts[r_symndx] += 1;
1447
                }
1448
            }
1449
        }
1450
 
1451
      if (need_entry & NEED_DYNREL)
1452
        {
1453
          /* Flag this symbol as having a non-got, non-plt reference
1454
             so that we generate copy relocs if it turns out to be
1455
             dynamic.  */
1456
          if (hh != NULL && !info->shared)
1457
            hh->eh.non_got_ref = 1;
1458
 
1459
          /* If we are creating a shared library then we need to copy
1460
             the reloc into the shared library.  However, if we are
1461
             linking with -Bsymbolic, we need only copy absolute
1462
             relocs or relocs against symbols that are not defined in
1463
             an object we are including in the link.  PC- or DP- or
1464
             DLT-relative relocs against any local sym or global sym
1465
             with DEF_REGULAR set, can be discarded.  At this point we
1466
             have not seen all the input files, so it is possible that
1467
             DEF_REGULAR is not set now but will be set later (it is
1468
             never cleared).  We account for that possibility below by
1469
             storing information in the dyn_relocs field of the
1470
             hash table entry.
1471
 
1472
             A similar situation to the -Bsymbolic case occurs when
1473
             creating shared libraries and symbol visibility changes
1474
             render the symbol local.
1475
 
1476
             As it turns out, all the relocs we will be creating here
1477
             are absolute, so we cannot remove them on -Bsymbolic
1478
             links or visibility changes anyway.  A STUB_REL reloc
1479
             is absolute too, as in that case it is the reloc in the
1480
             stub we will be creating, rather than copying the PCREL
1481
             reloc in the branch.
1482
 
1483
             If on the other hand, we are creating an executable, we
1484
             may need to keep relocations for symbols satisfied by a
1485
             dynamic library if we manage to avoid copy relocs for the
1486
             symbol.  */
1487
          if ((info->shared
1488
               && (sec->flags & SEC_ALLOC) != 0
1489
               && (IS_ABSOLUTE_RELOC (r_type)
1490
                   || (hh != NULL
1491
                       && (!info->symbolic
1492
                           || hh->eh.root.type == bfd_link_hash_defweak
1493
                           || !hh->eh.def_regular))))
1494
              || (ELIMINATE_COPY_RELOCS
1495
                  && !info->shared
1496
                  && (sec->flags & SEC_ALLOC) != 0
1497
                  && hh != NULL
1498
                  && (hh->eh.root.type == bfd_link_hash_defweak
1499
                      || !hh->eh.def_regular)))
1500
            {
1501
              struct elf32_hppa_dyn_reloc_entry *hdh_p;
1502
              struct elf32_hppa_dyn_reloc_entry **hdh_head;
1503
 
1504
              /* Create a reloc section in dynobj and make room for
1505
                 this reloc.  */
1506
              if (sreloc == NULL)
1507
                {
1508
                  char *name;
1509
                  bfd *dynobj;
1510
 
1511
                  name = (bfd_elf_string_from_elf_section
1512
                          (abfd,
1513
                           elf_elfheader (abfd)->e_shstrndx,
1514
                           elf_section_data (sec)->rel_hdr.sh_name));
1515
                  if (name == NULL)
1516
                    {
1517
                      (*_bfd_error_handler)
1518
                        (_("Could not find relocation section for %s"),
1519
                         sec->name);
1520
                      bfd_set_error (bfd_error_bad_value);
1521
                      return FALSE;
1522
                    }
1523
 
1524
                  if (htab->etab.dynobj == NULL)
1525
                    htab->etab.dynobj = abfd;
1526
 
1527
                  dynobj = htab->etab.dynobj;
1528
                  sreloc = bfd_get_section_by_name (dynobj, name);
1529
                  if (sreloc == NULL)
1530
                    {
1531
                      flagword flags;
1532
 
1533
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
1534
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1535
                      if ((sec->flags & SEC_ALLOC) != 0)
1536
                        flags |= SEC_ALLOC | SEC_LOAD;
1537
                      sreloc = bfd_make_section_with_flags (dynobj,
1538
                                                            name,
1539
                                                            flags);
1540
                      if (sreloc == NULL
1541
                          || !bfd_set_section_alignment (dynobj, sreloc, 2))
1542
                        return FALSE;
1543
                    }
1544
 
1545
                  elf_section_data (sec)->sreloc = sreloc;
1546
                }
1547
 
1548
              /* If this is a global symbol, we count the number of
1549
                 relocations we need for this symbol.  */
1550
              if (hh != NULL)
1551
                {
1552
                  hdh_head = &hh->dyn_relocs;
1553
                }
1554
              else
1555
                {
1556
                  /* Track dynamic relocs needed for local syms too.
1557
                     We really need local syms available to do this
1558
                     easily.  Oh well.  */
1559
 
1560
                  asection *sr;
1561
                  void *vpp;
1562
 
1563
                  sr = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1564
                                                       sec, r_symndx);
1565
                  if (sr == NULL)
1566
                    return FALSE;
1567
 
1568
                  vpp = &elf_section_data (sr)->local_dynrel;
1569
                  hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
1570
                }
1571
 
1572
              hdh_p = *hdh_head;
1573
              if (hdh_p == NULL || hdh_p->sec != sec)
1574
                {
1575
                  hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1576
                  if (hdh_p == NULL)
1577
                    return FALSE;
1578
                  hdh_p->hdh_next = *hdh_head;
1579
                  *hdh_head = hdh_p;
1580
                  hdh_p->sec = sec;
1581
                  hdh_p->count = 0;
1582
#if RELATIVE_DYNRELOCS
1583
                  hdh_p->relative_count = 0;
1584
#endif
1585
                }
1586
 
1587
              hdh_p->count += 1;
1588
#if RELATIVE_DYNRELOCS
1589
              if (!IS_ABSOLUTE_RELOC (rtype))
1590
                hdh_p->relative_count += 1;
1591
#endif
1592
            }
1593
        }
1594
    }
1595
 
1596
  return TRUE;
1597
}
1598
 
1599
/* Return the section that should be marked against garbage collection
1600
   for a given relocation.  */
1601
 
1602
static asection *
1603
elf32_hppa_gc_mark_hook (asection *sec,
1604
                         struct bfd_link_info *info,
1605
                         Elf_Internal_Rela *rela,
1606
                         struct elf_link_hash_entry *hh,
1607
                         Elf_Internal_Sym *sym)
1608
{
1609
  if (hh != NULL)
1610
    switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1611
      {
1612
      case R_PARISC_GNU_VTINHERIT:
1613
      case R_PARISC_GNU_VTENTRY:
1614
        return NULL;
1615
      }
1616
 
1617
  return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1618
}
1619
 
1620
/* Update the got and plt entry reference counts for the section being
1621
   removed.  */
1622
 
1623
static bfd_boolean
1624
elf32_hppa_gc_sweep_hook (bfd *abfd,
1625
                          struct bfd_link_info *info ATTRIBUTE_UNUSED,
1626
                          asection *sec,
1627
                          const Elf_Internal_Rela *relocs)
1628
{
1629
  Elf_Internal_Shdr *symtab_hdr;
1630
  struct elf_link_hash_entry **eh_syms;
1631
  bfd_signed_vma *local_got_refcounts;
1632
  bfd_signed_vma *local_plt_refcounts;
1633
  const Elf_Internal_Rela *rela, *relend;
1634
 
1635
  if (info->relocatable)
1636
    return TRUE;
1637
 
1638
  elf_section_data (sec)->local_dynrel = NULL;
1639
 
1640
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1641
  eh_syms = elf_sym_hashes (abfd);
1642
  local_got_refcounts = elf_local_got_refcounts (abfd);
1643
  local_plt_refcounts = local_got_refcounts;
1644
  if (local_plt_refcounts != NULL)
1645
    local_plt_refcounts += symtab_hdr->sh_info;
1646
 
1647
  relend = relocs + sec->reloc_count;
1648
  for (rela = relocs; rela < relend; rela++)
1649
    {
1650
      unsigned long r_symndx;
1651
      unsigned int r_type;
1652
      struct elf_link_hash_entry *eh = NULL;
1653
 
1654
      r_symndx = ELF32_R_SYM (rela->r_info);
1655
      if (r_symndx >= symtab_hdr->sh_info)
1656
        {
1657
          struct elf32_hppa_link_hash_entry *hh;
1658
          struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1659
          struct elf32_hppa_dyn_reloc_entry *hdh_p;
1660
 
1661
          eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1662
          while (eh->root.type == bfd_link_hash_indirect
1663
                 || eh->root.type == bfd_link_hash_warning)
1664
            eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1665
          hh = hppa_elf_hash_entry (eh);
1666
 
1667
          for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
1668
            if (hdh_p->sec == sec)
1669
              {
1670
                /* Everything must go for SEC.  */
1671
                *hdh_pp = hdh_p->hdh_next;
1672
                break;
1673
              }
1674
        }
1675
 
1676
      r_type = ELF32_R_TYPE (rela->r_info);
1677
      r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1678
 
1679
      switch (r_type)
1680
        {
1681
        case R_PARISC_DLTIND14F:
1682
        case R_PARISC_DLTIND14R:
1683
        case R_PARISC_DLTIND21L:
1684
        case R_PARISC_TLS_GD21L:
1685
        case R_PARISC_TLS_GD14R:
1686
        case R_PARISC_TLS_IE21L:
1687
        case R_PARISC_TLS_IE14R:
1688
          if (eh != NULL)
1689
            {
1690
              if (eh->got.refcount > 0)
1691
                eh->got.refcount -= 1;
1692
            }
1693
          else if (local_got_refcounts != NULL)
1694
            {
1695
              if (local_got_refcounts[r_symndx] > 0)
1696
                local_got_refcounts[r_symndx] -= 1;
1697
            }
1698
          break;
1699
 
1700
        case R_PARISC_TLS_LDM21L:
1701
        case R_PARISC_TLS_LDM14R:
1702
          hppa_link_hash_table (info)->tls_ldm_got.refcount -= 1;
1703
          break;
1704
 
1705
        case R_PARISC_PCREL12F:
1706
        case R_PARISC_PCREL17C:
1707
        case R_PARISC_PCREL17F:
1708
        case R_PARISC_PCREL22F:
1709
          if (eh != NULL)
1710
            {
1711
              if (eh->plt.refcount > 0)
1712
                eh->plt.refcount -= 1;
1713
            }
1714
          break;
1715
 
1716
        case R_PARISC_PLABEL14R:
1717
        case R_PARISC_PLABEL21L:
1718
        case R_PARISC_PLABEL32:
1719
          if (eh != NULL)
1720
            {
1721
              if (eh->plt.refcount > 0)
1722
                eh->plt.refcount -= 1;
1723
            }
1724
          else if (local_plt_refcounts != NULL)
1725
            {
1726
              if (local_plt_refcounts[r_symndx] > 0)
1727
                local_plt_refcounts[r_symndx] -= 1;
1728
            }
1729
          break;
1730
 
1731
        default:
1732
          break;
1733
        }
1734
    }
1735
 
1736
  return TRUE;
1737
}
1738
 
1739
/* Support for core dump NOTE sections.  */
1740
 
1741
static bfd_boolean
1742
elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1743
{
1744
  int offset;
1745
  size_t size;
1746
 
1747
  switch (note->descsz)
1748
    {
1749
      default:
1750
        return FALSE;
1751
 
1752
      case 396:         /* Linux/hppa */
1753
        /* pr_cursig */
1754
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1755
 
1756
        /* pr_pid */
1757
        elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1758
 
1759
        /* pr_reg */
1760
        offset = 72;
1761
        size = 320;
1762
 
1763
        break;
1764
    }
1765
 
1766
  /* Make a ".reg/999" section.  */
1767
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1768
                                          size, note->descpos + offset);
1769
}
1770
 
1771
static bfd_boolean
1772
elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1773
{
1774
  switch (note->descsz)
1775
    {
1776
      default:
1777
        return FALSE;
1778
 
1779
      case 124:         /* Linux/hppa elf_prpsinfo.  */
1780
        elf_tdata (abfd)->core_program
1781
          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1782
        elf_tdata (abfd)->core_command
1783
          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1784
    }
1785
 
1786
  /* Note that for some reason, a spurious space is tacked
1787
     onto the end of the args in some (at least one anyway)
1788
     implementations, so strip it off if it exists.  */
1789
  {
1790
    char *command = elf_tdata (abfd)->core_command;
1791
    int n = strlen (command);
1792
 
1793
    if (0 < n && command[n - 1] == ' ')
1794
      command[n - 1] = '\0';
1795
  }
1796
 
1797
  return TRUE;
1798
}
1799
 
1800
/* Our own version of hide_symbol, so that we can keep plt entries for
1801
   plabels.  */
1802
 
1803
static void
1804
elf32_hppa_hide_symbol (struct bfd_link_info *info,
1805
                        struct elf_link_hash_entry *eh,
1806
                        bfd_boolean force_local)
1807
{
1808
  if (force_local)
1809
    {
1810
      eh->forced_local = 1;
1811
      if (eh->dynindx != -1)
1812
        {
1813
          eh->dynindx = -1;
1814
          _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1815
                                  eh->dynstr_index);
1816
        }
1817
    }
1818
 
1819
  if (! hppa_elf_hash_entry (eh)->plabel)
1820
    {
1821
      eh->needs_plt = 0;
1822
      eh->plt = elf_hash_table (info)->init_plt_refcount;
1823
    }
1824
}
1825
 
1826
/* Adjust a symbol defined by a dynamic object and referenced by a
1827
   regular object.  The current definition is in some section of the
1828
   dynamic object, but we're not including those sections.  We have to
1829
   change the definition to something the rest of the link can
1830
   understand.  */
1831
 
1832
static bfd_boolean
1833
elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1834
                                  struct elf_link_hash_entry *eh)
1835
{
1836
  struct elf32_hppa_link_hash_table *htab;
1837
  asection *sec;
1838
 
1839
  /* If this is a function, put it in the procedure linkage table.  We
1840
     will fill in the contents of the procedure linkage table later.  */
1841
  if (eh->type == STT_FUNC
1842
      || eh->needs_plt)
1843
    {
1844
      if (eh->plt.refcount <= 0
1845
          || (eh->def_regular
1846
              && eh->root.type != bfd_link_hash_defweak
1847
              && ! hppa_elf_hash_entry (eh)->plabel
1848
              && (!info->shared || info->symbolic)))
1849
        {
1850
          /* The .plt entry is not needed when:
1851
             a) Garbage collection has removed all references to the
1852
             symbol, or
1853
             b) We know for certain the symbol is defined in this
1854
             object, and it's not a weak definition, nor is the symbol
1855
             used by a plabel relocation.  Either this object is the
1856
             application or we are doing a shared symbolic link.  */
1857
 
1858
          eh->plt.offset = (bfd_vma) -1;
1859
          eh->needs_plt = 0;
1860
        }
1861
 
1862
      return TRUE;
1863
    }
1864
  else
1865
    eh->plt.offset = (bfd_vma) -1;
1866
 
1867
  /* If this is a weak symbol, and there is a real definition, the
1868
     processor independent code will have arranged for us to see the
1869
     real definition first, and we can just use the same value.  */
1870
  if (eh->u.weakdef != NULL)
1871
    {
1872
      if (eh->u.weakdef->root.type != bfd_link_hash_defined
1873
          && eh->u.weakdef->root.type != bfd_link_hash_defweak)
1874
        abort ();
1875
      eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1876
      eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1877
      if (ELIMINATE_COPY_RELOCS)
1878
        eh->non_got_ref = eh->u.weakdef->non_got_ref;
1879
      return TRUE;
1880
    }
1881
 
1882
  /* This is a reference to a symbol defined by a dynamic object which
1883
     is not a function.  */
1884
 
1885
  /* If we are creating a shared library, we must presume that the
1886
     only references to the symbol are via the global offset table.
1887
     For such cases we need not do anything here; the relocations will
1888
     be handled correctly by relocate_section.  */
1889
  if (info->shared)
1890
    return TRUE;
1891
 
1892
  /* If there are no references to this symbol that do not use the
1893
     GOT, we don't need to generate a copy reloc.  */
1894
  if (!eh->non_got_ref)
1895
    return TRUE;
1896
 
1897
  if (ELIMINATE_COPY_RELOCS)
1898
    {
1899
      struct elf32_hppa_link_hash_entry *hh;
1900
      struct elf32_hppa_dyn_reloc_entry *hdh_p;
1901
 
1902
      hh = hppa_elf_hash_entry (eh);
1903
      for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
1904
        {
1905
          sec = hdh_p->sec->output_section;
1906
          if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1907
            break;
1908
        }
1909
 
1910
      /* If we didn't find any dynamic relocs in read-only sections, then
1911
         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1912
      if (hdh_p == NULL)
1913
        {
1914
          eh->non_got_ref = 0;
1915
          return TRUE;
1916
        }
1917
    }
1918
 
1919
  if (eh->size == 0)
1920
    {
1921
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1922
                             eh->root.root.string);
1923
      return TRUE;
1924
    }
1925
 
1926
  /* We must allocate the symbol in our .dynbss section, which will
1927
     become part of the .bss section of the executable.  There will be
1928
     an entry for this symbol in the .dynsym section.  The dynamic
1929
     object will contain position independent code, so all references
1930
     from the dynamic object to this symbol will go through the global
1931
     offset table.  The dynamic linker will use the .dynsym entry to
1932
     determine the address it must put in the global offset table, so
1933
     both the dynamic object and the regular object will refer to the
1934
     same memory location for the variable.  */
1935
 
1936
  htab = hppa_link_hash_table (info);
1937
 
1938
  /* We must generate a COPY reloc to tell the dynamic linker to
1939
     copy the initial value out of the dynamic object and into the
1940
     runtime process image.  */
1941
  if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
1942
    {
1943
      htab->srelbss->size += sizeof (Elf32_External_Rela);
1944
      eh->needs_copy = 1;
1945
    }
1946
 
1947
  sec = htab->sdynbss;
1948
 
1949
  return _bfd_elf_adjust_dynamic_copy (eh, sec);
1950
}
1951
 
1952
/* Allocate space in the .plt for entries that won't have relocations.
1953
   ie. plabel entries.  */
1954
 
1955
static bfd_boolean
1956
allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1957
{
1958
  struct bfd_link_info *info;
1959
  struct elf32_hppa_link_hash_table *htab;
1960
  struct elf32_hppa_link_hash_entry *hh;
1961
  asection *sec;
1962
 
1963
  if (eh->root.type == bfd_link_hash_indirect)
1964
    return TRUE;
1965
 
1966
  if (eh->root.type == bfd_link_hash_warning)
1967
    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1968
 
1969
  info = (struct bfd_link_info *) inf;
1970
  hh = hppa_elf_hash_entry (eh);
1971
  htab = hppa_link_hash_table (info);
1972
  if (htab->etab.dynamic_sections_created
1973
      && eh->plt.refcount > 0)
1974
    {
1975
      /* Make sure this symbol is output as a dynamic symbol.
1976
         Undefined weak syms won't yet be marked as dynamic.  */
1977
      if (eh->dynindx == -1
1978
          && !eh->forced_local
1979
          && eh->type != STT_PARISC_MILLI)
1980
        {
1981
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
1982
            return FALSE;
1983
        }
1984
 
1985
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
1986
        {
1987
          /* Allocate these later.  From this point on, h->plabel
1988
             means that the plt entry is only used by a plabel.
1989
             We'll be using a normal plt entry for this symbol, so
1990
             clear the plabel indicator.  */
1991
 
1992
          hh->plabel = 0;
1993
        }
1994
      else if (hh->plabel)
1995
        {
1996
          /* Make an entry in the .plt section for plabel references
1997
             that won't have a .plt entry for other reasons.  */
1998
          sec = htab->splt;
1999
          eh->plt.offset = sec->size;
2000
          sec->size += PLT_ENTRY_SIZE;
2001
        }
2002
      else
2003
        {
2004
          /* No .plt entry needed.  */
2005
          eh->plt.offset = (bfd_vma) -1;
2006
          eh->needs_plt = 0;
2007
        }
2008
    }
2009
  else
2010
    {
2011
      eh->plt.offset = (bfd_vma) -1;
2012
      eh->needs_plt = 0;
2013
    }
2014
 
2015
  return TRUE;
2016
}
2017
 
2018
/* Allocate space in .plt, .got and associated reloc sections for
2019
   global syms.  */
2020
 
2021
static bfd_boolean
2022
allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2023
{
2024
  struct bfd_link_info *info;
2025
  struct elf32_hppa_link_hash_table *htab;
2026
  asection *sec;
2027
  struct elf32_hppa_link_hash_entry *hh;
2028
  struct elf32_hppa_dyn_reloc_entry *hdh_p;
2029
 
2030
  if (eh->root.type == bfd_link_hash_indirect)
2031
    return TRUE;
2032
 
2033
  if (eh->root.type == bfd_link_hash_warning)
2034
    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2035
 
2036
  info = inf;
2037
  htab = hppa_link_hash_table (info);
2038
  hh = hppa_elf_hash_entry (eh);
2039
 
2040
  if (htab->etab.dynamic_sections_created
2041
      && eh->plt.offset != (bfd_vma) -1
2042
      && !hh->plabel
2043
      && eh->plt.refcount > 0)
2044
    {
2045
      /* Make an entry in the .plt section.  */
2046
      sec = htab->splt;
2047
      eh->plt.offset = sec->size;
2048
      sec->size += PLT_ENTRY_SIZE;
2049
 
2050
      /* We also need to make an entry in the .rela.plt section.  */
2051
      htab->srelplt->size += sizeof (Elf32_External_Rela);
2052
      htab->need_plt_stub = 1;
2053
    }
2054
 
2055
  if (eh->got.refcount > 0)
2056
    {
2057
      /* Make sure this symbol is output as a dynamic symbol.
2058
         Undefined weak syms won't yet be marked as dynamic.  */
2059
      if (eh->dynindx == -1
2060
          && !eh->forced_local
2061
          && eh->type != STT_PARISC_MILLI)
2062
        {
2063
          if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2064
            return FALSE;
2065
        }
2066
 
2067
      sec = htab->sgot;
2068
      eh->got.offset = sec->size;
2069
      sec->size += GOT_ENTRY_SIZE;
2070
      /* R_PARISC_TLS_GD* needs two GOT entries */
2071
      if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2072
        sec->size += GOT_ENTRY_SIZE * 2;
2073
      else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2074
        sec->size += GOT_ENTRY_SIZE;
2075
      if (htab->etab.dynamic_sections_created
2076
          && (info->shared
2077
              || (eh->dynindx != -1
2078
                  && !eh->forced_local)))
2079
        {
2080
          htab->srelgot->size += sizeof (Elf32_External_Rela);
2081
          if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2082
            htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2083
          else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2084
            htab->srelgot->size += sizeof (Elf32_External_Rela);
2085
        }
2086
    }
2087
  else
2088
    eh->got.offset = (bfd_vma) -1;
2089
 
2090
  if (hh->dyn_relocs == NULL)
2091
    return TRUE;
2092
 
2093
  /* If this is a -Bsymbolic shared link, then we need to discard all
2094
     space allocated for dynamic pc-relative relocs against symbols
2095
     defined in a regular object.  For the normal shared case, discard
2096
     space for relocs that have become local due to symbol visibility
2097
     changes.  */
2098
  if (info->shared)
2099
    {
2100
#if RELATIVE_DYNRELOCS
2101
      if (SYMBOL_CALLS_LOCAL (info, eh))
2102
        {
2103
          struct elf32_hppa_dyn_reloc_entry **hdh_pp;
2104
 
2105
          for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2106
            {
2107
              hdh_p->count -= hdh_p->relative_count;
2108
              hdh_p->relative_count = 0;
2109
              if (hdh_p->count == 0)
2110
                *hdh_pp = hdh_p->hdh_next;
2111
              else
2112
                hdh_pp = &hdh_p->hdh_next;
2113
            }
2114
        }
2115
#endif
2116
 
2117
      /* Also discard relocs on undefined weak syms with non-default
2118
         visibility.  */
2119
      if (hh->dyn_relocs != NULL
2120
          && eh->root.type == bfd_link_hash_undefweak)
2121
        {
2122
          if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2123
            hh->dyn_relocs = NULL;
2124
 
2125
          /* Make sure undefined weak symbols are output as a dynamic
2126
             symbol in PIEs.  */
2127
          else if (eh->dynindx == -1
2128
                   && !eh->forced_local)
2129
            {
2130
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2131
                return FALSE;
2132
            }
2133
        }
2134
    }
2135
  else
2136
    {
2137
      /* For the non-shared case, discard space for relocs against
2138
         symbols which turn out to need copy relocs or are not
2139
         dynamic.  */
2140
 
2141
      if (!eh->non_got_ref
2142
          && ((ELIMINATE_COPY_RELOCS
2143
               && eh->def_dynamic
2144
               && !eh->def_regular)
2145
               || (htab->etab.dynamic_sections_created
2146
                   && (eh->root.type == bfd_link_hash_undefweak
2147
                       || eh->root.type == bfd_link_hash_undefined))))
2148
        {
2149
          /* Make sure this symbol is output as a dynamic symbol.
2150
             Undefined weak syms won't yet be marked as dynamic.  */
2151
          if (eh->dynindx == -1
2152
              && !eh->forced_local
2153
              && eh->type != STT_PARISC_MILLI)
2154
            {
2155
              if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2156
                return FALSE;
2157
            }
2158
 
2159
          /* If that succeeded, we know we'll be keeping all the
2160
             relocs.  */
2161
          if (eh->dynindx != -1)
2162
            goto keep;
2163
        }
2164
 
2165
      hh->dyn_relocs = NULL;
2166
      return TRUE;
2167
 
2168
    keep: ;
2169
    }
2170
 
2171
  /* Finally, allocate space.  */
2172
  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2173
    {
2174
      asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2175
      sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2176
    }
2177
 
2178
  return TRUE;
2179
}
2180
 
2181
/* This function is called via elf_link_hash_traverse to force
2182
   millicode symbols local so they do not end up as globals in the
2183
   dynamic symbol table.  We ought to be able to do this in
2184
   adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2185
   for all dynamic symbols.  Arguably, this is a bug in
2186
   elf_adjust_dynamic_symbol.  */
2187
 
2188
static bfd_boolean
2189
clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2190
                           struct bfd_link_info *info)
2191
{
2192
  if (eh->root.type == bfd_link_hash_warning)
2193
    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2194
 
2195
  if (eh->type == STT_PARISC_MILLI
2196
      && !eh->forced_local)
2197
    {
2198
      elf32_hppa_hide_symbol (info, eh, TRUE);
2199
    }
2200
  return TRUE;
2201
}
2202
 
2203
/* Find any dynamic relocs that apply to read-only sections.  */
2204
 
2205
static bfd_boolean
2206
readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2207
{
2208
  struct elf32_hppa_link_hash_entry *hh;
2209
  struct elf32_hppa_dyn_reloc_entry *hdh_p;
2210
 
2211
  if (eh->root.type == bfd_link_hash_warning)
2212
    eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2213
 
2214
  hh = hppa_elf_hash_entry (eh);
2215
  for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2216
    {
2217
      asection *sec = hdh_p->sec->output_section;
2218
 
2219
      if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2220
        {
2221
          struct bfd_link_info *info = inf;
2222
 
2223
          info->flags |= DF_TEXTREL;
2224
 
2225
          /* Not an error, just cut short the traversal.  */
2226
          return FALSE;
2227
        }
2228
    }
2229
  return TRUE;
2230
}
2231
 
2232
/* Set the sizes of the dynamic sections.  */
2233
 
2234
static bfd_boolean
2235
elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2236
                                  struct bfd_link_info *info)
2237
{
2238
  struct elf32_hppa_link_hash_table *htab;
2239
  bfd *dynobj;
2240
  bfd *ibfd;
2241
  asection *sec;
2242
  bfd_boolean relocs;
2243
 
2244
  htab = hppa_link_hash_table (info);
2245
  dynobj = htab->etab.dynobj;
2246
  if (dynobj == NULL)
2247
    abort ();
2248
 
2249
  if (htab->etab.dynamic_sections_created)
2250
    {
2251
      /* Set the contents of the .interp section to the interpreter.  */
2252
      if (info->executable)
2253
        {
2254
          sec = bfd_get_section_by_name (dynobj, ".interp");
2255
          if (sec == NULL)
2256
            abort ();
2257
          sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2258
          sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2259
        }
2260
 
2261
      /* Force millicode symbols local.  */
2262
      elf_link_hash_traverse (&htab->etab,
2263
                              clobber_millicode_symbols,
2264
                              info);
2265
    }
2266
 
2267
  /* Set up .got and .plt offsets for local syms, and space for local
2268
     dynamic relocs.  */
2269
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2270
    {
2271
      bfd_signed_vma *local_got;
2272
      bfd_signed_vma *end_local_got;
2273
      bfd_signed_vma *local_plt;
2274
      bfd_signed_vma *end_local_plt;
2275
      bfd_size_type locsymcount;
2276
      Elf_Internal_Shdr *symtab_hdr;
2277
      asection *srel;
2278
      char *local_tls_type;
2279
 
2280
      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2281
        continue;
2282
 
2283
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2284
        {
2285
          struct elf32_hppa_dyn_reloc_entry *hdh_p;
2286
 
2287
          for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2288
                    elf_section_data (sec)->local_dynrel);
2289
               hdh_p != NULL;
2290
               hdh_p = hdh_p->hdh_next)
2291
            {
2292
              if (!bfd_is_abs_section (hdh_p->sec)
2293
                  && bfd_is_abs_section (hdh_p->sec->output_section))
2294
                {
2295
                  /* Input section has been discarded, either because
2296
                     it is a copy of a linkonce section or due to
2297
                     linker script /DISCARD/, so we'll be discarding
2298
                     the relocs too.  */
2299
                }
2300
              else if (hdh_p->count != 0)
2301
                {
2302
                  srel = elf_section_data (hdh_p->sec)->sreloc;
2303
                  srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2304
                  if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2305
                    info->flags |= DF_TEXTREL;
2306
                }
2307
            }
2308
        }
2309
 
2310
      local_got = elf_local_got_refcounts (ibfd);
2311
      if (!local_got)
2312
        continue;
2313
 
2314
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2315
      locsymcount = symtab_hdr->sh_info;
2316
      end_local_got = local_got + locsymcount;
2317
      local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2318
      sec = htab->sgot;
2319
      srel = htab->srelgot;
2320
      for (; local_got < end_local_got; ++local_got)
2321
        {
2322
          if (*local_got > 0)
2323
            {
2324
              *local_got = sec->size;
2325
              sec->size += GOT_ENTRY_SIZE;
2326
              if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2327
                sec->size += 2 * GOT_ENTRY_SIZE;
2328
              else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2329
                sec->size += GOT_ENTRY_SIZE;
2330
              if (info->shared)
2331
                {
2332
                  srel->size += sizeof (Elf32_External_Rela);
2333
                  if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2334
                    srel->size += 2 * sizeof (Elf32_External_Rela);
2335
                  else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2336
                    srel->size += sizeof (Elf32_External_Rela);
2337
                }
2338
            }
2339
          else
2340
            *local_got = (bfd_vma) -1;
2341
 
2342
          ++local_tls_type;
2343
        }
2344
 
2345
      local_plt = end_local_got;
2346
      end_local_plt = local_plt + locsymcount;
2347
      if (! htab->etab.dynamic_sections_created)
2348
        {
2349
          /* Won't be used, but be safe.  */
2350
          for (; local_plt < end_local_plt; ++local_plt)
2351
            *local_plt = (bfd_vma) -1;
2352
        }
2353
      else
2354
        {
2355
          sec = htab->splt;
2356
          srel = htab->srelplt;
2357
          for (; local_plt < end_local_plt; ++local_plt)
2358
            {
2359
              if (*local_plt > 0)
2360
                {
2361
                  *local_plt = sec->size;
2362
                  sec->size += PLT_ENTRY_SIZE;
2363
                  if (info->shared)
2364
                    srel->size += sizeof (Elf32_External_Rela);
2365
                }
2366
              else
2367
                *local_plt = (bfd_vma) -1;
2368
            }
2369
        }
2370
    }
2371
 
2372
  if (htab->tls_ldm_got.refcount > 0)
2373
    {
2374
      /* Allocate 2 got entries and 1 dynamic reloc for
2375
         R_PARISC_TLS_DTPMOD32 relocs.  */
2376
      htab->tls_ldm_got.offset = htab->sgot->size;
2377
      htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2378
      htab->srelgot->size += sizeof (Elf32_External_Rela);
2379
    }
2380
  else
2381
    htab->tls_ldm_got.offset = -1;
2382
 
2383
  /* Do all the .plt entries without relocs first.  The dynamic linker
2384
     uses the last .plt reloc to find the end of the .plt (and hence
2385
     the start of the .got) for lazy linking.  */
2386
  elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2387
 
2388
  /* Allocate global sym .plt and .got entries, and space for global
2389
     sym dynamic relocs.  */
2390
  elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2391
 
2392
  /* The check_relocs and adjust_dynamic_symbol entry points have
2393
     determined the sizes of the various dynamic sections.  Allocate
2394
     memory for them.  */
2395
  relocs = FALSE;
2396
  for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2397
    {
2398
      if ((sec->flags & SEC_LINKER_CREATED) == 0)
2399
        continue;
2400
 
2401
      if (sec == htab->splt)
2402
        {
2403
          if (htab->need_plt_stub)
2404
            {
2405
              /* Make space for the plt stub at the end of the .plt
2406
                 section.  We want this stub right at the end, up
2407
                 against the .got section.  */
2408
              int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2409
              int pltalign = bfd_section_alignment (dynobj, sec);
2410
              bfd_size_type mask;
2411
 
2412
              if (gotalign > pltalign)
2413
                bfd_set_section_alignment (dynobj, sec, gotalign);
2414
              mask = ((bfd_size_type) 1 << gotalign) - 1;
2415
              sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2416
            }
2417
        }
2418
      else if (sec == htab->sgot
2419
               || sec == htab->sdynbss)
2420
        ;
2421
      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2422
        {
2423
          if (sec->size != 0)
2424
            {
2425
              /* Remember whether there are any reloc sections other
2426
                 than .rela.plt.  */
2427
              if (sec != htab->srelplt)
2428
                relocs = TRUE;
2429
 
2430
              /* We use the reloc_count field as a counter if we need
2431
                 to copy relocs into the output file.  */
2432
              sec->reloc_count = 0;
2433
            }
2434
        }
2435
      else
2436
        {
2437
          /* It's not one of our sections, so don't allocate space.  */
2438
          continue;
2439
        }
2440
 
2441
      if (sec->size == 0)
2442
        {
2443
          /* If we don't need this section, strip it from the
2444
             output file.  This is mostly to handle .rela.bss and
2445
             .rela.plt.  We must create both sections in
2446
             create_dynamic_sections, because they must be created
2447
             before the linker maps input sections to output
2448
             sections.  The linker does that before
2449
             adjust_dynamic_symbol is called, and it is that
2450
             function which decides whether anything needs to go
2451
             into these sections.  */
2452
          sec->flags |= SEC_EXCLUDE;
2453
          continue;
2454
        }
2455
 
2456
      if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2457
        continue;
2458
 
2459
      /* Allocate memory for the section contents.  Zero it, because
2460
         we may not fill in all the reloc sections.  */
2461
      sec->contents = bfd_zalloc (dynobj, sec->size);
2462
      if (sec->contents == NULL)
2463
        return FALSE;
2464
    }
2465
 
2466
  if (htab->etab.dynamic_sections_created)
2467
    {
2468
      /* Like IA-64 and HPPA64, always create a DT_PLTGOT.  It
2469
         actually has nothing to do with the PLT, it is how we
2470
         communicate the LTP value of a load module to the dynamic
2471
         linker.  */
2472
#define add_dynamic_entry(TAG, VAL) \
2473
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2474
 
2475
      if (!add_dynamic_entry (DT_PLTGOT, 0))
2476
        return FALSE;
2477
 
2478
      /* Add some entries to the .dynamic section.  We fill in the
2479
         values later, in elf32_hppa_finish_dynamic_sections, but we
2480
         must add the entries now so that we get the correct size for
2481
         the .dynamic section.  The DT_DEBUG entry is filled in by the
2482
         dynamic linker and used by the debugger.  */
2483
      if (info->executable)
2484
        {
2485
          if (!add_dynamic_entry (DT_DEBUG, 0))
2486
            return FALSE;
2487
        }
2488
 
2489
      if (htab->srelplt->size != 0)
2490
        {
2491
          if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2492
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2493
              || !add_dynamic_entry (DT_JMPREL, 0))
2494
            return FALSE;
2495
        }
2496
 
2497
      if (relocs)
2498
        {
2499
          if (!add_dynamic_entry (DT_RELA, 0)
2500
              || !add_dynamic_entry (DT_RELASZ, 0)
2501
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2502
            return FALSE;
2503
 
2504
          /* If any dynamic relocs apply to a read-only section,
2505
             then we need a DT_TEXTREL entry.  */
2506
          if ((info->flags & DF_TEXTREL) == 0)
2507
            elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2508
 
2509
          if ((info->flags & DF_TEXTREL) != 0)
2510
            {
2511
              if (!add_dynamic_entry (DT_TEXTREL, 0))
2512
                return FALSE;
2513
            }
2514
        }
2515
    }
2516
#undef add_dynamic_entry
2517
 
2518
  return TRUE;
2519
}
2520
 
2521
/* External entry points for sizing and building linker stubs.  */
2522
 
2523
/* Set up various things so that we can make a list of input sections
2524
   for each output section included in the link.  Returns -1 on error,
2525
 
2526
 
2527
int
2528
elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2529
{
2530
  bfd *input_bfd;
2531
  unsigned int bfd_count;
2532
  int top_id, top_index;
2533
  asection *section;
2534
  asection **input_list, **list;
2535
  bfd_size_type amt;
2536
  struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2537
 
2538
  /* Count the number of input BFDs and find the top input section id.  */
2539
  for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2540
       input_bfd != NULL;
2541
       input_bfd = input_bfd->link_next)
2542
    {
2543
      bfd_count += 1;
2544
      for (section = input_bfd->sections;
2545
           section != NULL;
2546
           section = section->next)
2547
        {
2548
          if (top_id < section->id)
2549
            top_id = section->id;
2550
        }
2551
    }
2552
  htab->bfd_count = bfd_count;
2553
 
2554
  amt = sizeof (struct map_stub) * (top_id + 1);
2555
  htab->stub_group = bfd_zmalloc (amt);
2556
  if (htab->stub_group == NULL)
2557
    return -1;
2558
 
2559
  /* We can't use output_bfd->section_count here to find the top output
2560
     section index as some sections may have been removed, and
2561
     strip_excluded_output_sections doesn't renumber the indices.  */
2562
  for (section = output_bfd->sections, top_index = 0;
2563
       section != NULL;
2564
       section = section->next)
2565
    {
2566
      if (top_index < section->index)
2567
        top_index = section->index;
2568
    }
2569
 
2570
  htab->top_index = top_index;
2571
  amt = sizeof (asection *) * (top_index + 1);
2572
  input_list = bfd_malloc (amt);
2573
  htab->input_list = input_list;
2574
  if (input_list == NULL)
2575
    return -1;
2576
 
2577
  /* For sections we aren't interested in, mark their entries with a
2578
     value we can check later.  */
2579
  list = input_list + top_index;
2580
  do
2581
    *list = bfd_abs_section_ptr;
2582
  while (list-- != input_list);
2583
 
2584
  for (section = output_bfd->sections;
2585
       section != NULL;
2586
       section = section->next)
2587
    {
2588
      if ((section->flags & SEC_CODE) != 0)
2589
        input_list[section->index] = NULL;
2590
    }
2591
 
2592
  return 1;
2593
}
2594
 
2595
/* The linker repeatedly calls this function for each input section,
2596
   in the order that input sections are linked into output sections.
2597
   Build lists of input sections to determine groupings between which
2598
   we may insert linker stubs.  */
2599
 
2600
void
2601
elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2602
{
2603
  struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2604
 
2605
  if (isec->output_section->index <= htab->top_index)
2606
    {
2607
      asection **list = htab->input_list + isec->output_section->index;
2608
      if (*list != bfd_abs_section_ptr)
2609
        {
2610
          /* Steal the link_sec pointer for our list.  */
2611
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2612
          /* This happens to make the list in reverse order,
2613
             which is what we want.  */
2614
          PREV_SEC (isec) = *list;
2615
          *list = isec;
2616
        }
2617
    }
2618
}
2619
 
2620
/* See whether we can group stub sections together.  Grouping stub
2621
   sections may result in fewer stubs.  More importantly, we need to
2622
   put all .init* and .fini* stubs at the beginning of the .init or
2623
   .fini output sections respectively, because glibc splits the
2624
   _init and _fini functions into multiple parts.  Putting a stub in
2625
   the middle of a function is not a good idea.  */
2626
 
2627
static void
2628
group_sections (struct elf32_hppa_link_hash_table *htab,
2629
                bfd_size_type stub_group_size,
2630
                bfd_boolean stubs_always_before_branch)
2631
{
2632
  asection **list = htab->input_list + htab->top_index;
2633
  do
2634
    {
2635
      asection *tail = *list;
2636
      if (tail == bfd_abs_section_ptr)
2637
        continue;
2638
      while (tail != NULL)
2639
        {
2640
          asection *curr;
2641
          asection *prev;
2642
          bfd_size_type total;
2643
          bfd_boolean big_sec;
2644
 
2645
          curr = tail;
2646
          total = tail->size;
2647
          big_sec = total >= stub_group_size;
2648
 
2649
          while ((prev = PREV_SEC (curr)) != NULL
2650
                 && ((total += curr->output_offset - prev->output_offset)
2651
                     < stub_group_size))
2652
            curr = prev;
2653
 
2654
          /* OK, the size from the start of CURR to the end is less
2655
             than 240000 bytes and thus can be handled by one stub
2656
             section.  (or the tail section is itself larger than
2657
             240000 bytes, in which case we may be toast.)
2658
             We should really be keeping track of the total size of
2659
             stubs added here, as stubs contribute to the final output
2660
             section size.  That's a little tricky, and this way will
2661
             only break if stubs added total more than 22144 bytes, or
2662
             2768 long branch stubs.  It seems unlikely for more than
2663
             2768 different functions to be called, especially from
2664
             code only 240000 bytes long.  This limit used to be
2665
             250000, but c++ code tends to generate lots of little
2666
             functions, and sometimes violated the assumption.  */
2667
          do
2668
            {
2669
              prev = PREV_SEC (tail);
2670
              /* Set up this stub group.  */
2671
              htab->stub_group[tail->id].link_sec = curr;
2672
            }
2673
          while (tail != curr && (tail = prev) != NULL);
2674
 
2675
          /* But wait, there's more!  Input sections up to 240000
2676
             bytes before the stub section can be handled by it too.
2677
             Don't do this if we have a really large section after the
2678
             stubs, as adding more stubs increases the chance that
2679
             branches may not reach into the stub section.  */
2680
          if (!stubs_always_before_branch && !big_sec)
2681
            {
2682
              total = 0;
2683
              while (prev != NULL
2684
                     && ((total += tail->output_offset - prev->output_offset)
2685
                         < stub_group_size))
2686
                {
2687
                  tail = prev;
2688
                  prev = PREV_SEC (tail);
2689
                  htab->stub_group[tail->id].link_sec = curr;
2690
                }
2691
            }
2692
          tail = prev;
2693
        }
2694
    }
2695
  while (list-- != htab->input_list);
2696
  free (htab->input_list);
2697
#undef PREV_SEC
2698
}
2699
 
2700
/* Read in all local syms for all input bfds, and create hash entries
2701
   for export stubs if we are building a multi-subspace shared lib.
2702
   Returns -1 on error, 1 if export stubs created, 0 otherwise.  */
2703
 
2704
static int
2705
get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2706
{
2707
  unsigned int bfd_indx;
2708
  Elf_Internal_Sym *local_syms, **all_local_syms;
2709
  int stub_changed = 0;
2710
  struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2711
 
2712
  /* We want to read in symbol extension records only once.  To do this
2713
     we need to read in the local symbols in parallel and save them for
2714
     later use; so hold pointers to the local symbols in an array.  */
2715
  bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2716
  all_local_syms = bfd_zmalloc (amt);
2717
  htab->all_local_syms = all_local_syms;
2718
  if (all_local_syms == NULL)
2719
    return -1;
2720
 
2721
  /* Walk over all the input BFDs, swapping in local symbols.
2722
     If we are creating a shared library, create hash entries for the
2723
     export stubs.  */
2724
  for (bfd_indx = 0;
2725
       input_bfd != NULL;
2726
       input_bfd = input_bfd->link_next, bfd_indx++)
2727
    {
2728
      Elf_Internal_Shdr *symtab_hdr;
2729
 
2730
      /* We'll need the symbol table in a second.  */
2731
      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2732
      if (symtab_hdr->sh_info == 0)
2733
        continue;
2734
 
2735
      /* We need an array of the local symbols attached to the input bfd.  */
2736
      local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2737
      if (local_syms == NULL)
2738
        {
2739
          local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2740
                                             symtab_hdr->sh_info, 0,
2741
                                             NULL, NULL, NULL);
2742
          /* Cache them for elf_link_input_bfd.  */
2743
          symtab_hdr->contents = (unsigned char *) local_syms;
2744
        }
2745
      if (local_syms == NULL)
2746
        return -1;
2747
 
2748
      all_local_syms[bfd_indx] = local_syms;
2749
 
2750
      if (info->shared && htab->multi_subspace)
2751
        {
2752
          struct elf_link_hash_entry **eh_syms;
2753
          struct elf_link_hash_entry **eh_symend;
2754
          unsigned int symcount;
2755
 
2756
          symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2757
                      - symtab_hdr->sh_info);
2758
          eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2759
          eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2760
 
2761
          /* Look through the global syms for functions;  We need to
2762
             build export stubs for all globally visible functions.  */
2763
          for (; eh_syms < eh_symend; eh_syms++)
2764
            {
2765
              struct elf32_hppa_link_hash_entry *hh;
2766
 
2767
              hh = hppa_elf_hash_entry (*eh_syms);
2768
 
2769
              while (hh->eh.root.type == bfd_link_hash_indirect
2770
                     || hh->eh.root.type == bfd_link_hash_warning)
2771
                   hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2772
 
2773
              /* At this point in the link, undefined syms have been
2774
                 resolved, so we need to check that the symbol was
2775
                 defined in this BFD.  */
2776
              if ((hh->eh.root.type == bfd_link_hash_defined
2777
                   || hh->eh.root.type == bfd_link_hash_defweak)
2778
                  && hh->eh.type == STT_FUNC
2779
                  && hh->eh.root.u.def.section->output_section != NULL
2780
                  && (hh->eh.root.u.def.section->output_section->owner
2781
                      == output_bfd)
2782
                  && hh->eh.root.u.def.section->owner == input_bfd
2783
                  && hh->eh.def_regular
2784
                  && !hh->eh.forced_local
2785
                  && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2786
                {
2787
                  asection *sec;
2788
                  const char *stub_name;
2789
                  struct elf32_hppa_stub_hash_entry *hsh;
2790
 
2791
                  sec = hh->eh.root.u.def.section;
2792
                  stub_name = hh_name (hh);
2793
                  hsh = hppa_stub_hash_lookup (&htab->bstab,
2794
                                                      stub_name,
2795
                                                      FALSE, FALSE);
2796
                  if (hsh == NULL)
2797
                    {
2798
                      hsh = hppa_add_stub (stub_name, sec, htab);
2799
                      if (!hsh)
2800
                        return -1;
2801
 
2802
                      hsh->target_value = hh->eh.root.u.def.value;
2803
                      hsh->target_section = hh->eh.root.u.def.section;
2804
                      hsh->stub_type = hppa_stub_export;
2805
                      hsh->hh = hh;
2806
                      stub_changed = 1;
2807
                    }
2808
                  else
2809
                    {
2810
                      (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2811
                                             input_bfd,
2812
                                             stub_name);
2813
                    }
2814
                }
2815
            }
2816
        }
2817
    }
2818
 
2819
  return stub_changed;
2820
}
2821
 
2822
/* Determine and set the size of the stub section for a final link.
2823
 
2824
   The basic idea here is to examine all the relocations looking for
2825
   PC-relative calls to a target that is unreachable with a "bl"
2826
   instruction.  */
2827
 
2828
bfd_boolean
2829
elf32_hppa_size_stubs
2830
  (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2831
   bfd_boolean multi_subspace, bfd_signed_vma group_size,
2832
   asection * (*add_stub_section) (const char *, asection *),
2833
   void (*layout_sections_again) (void))
2834
{
2835
  bfd_size_type stub_group_size;
2836
  bfd_boolean stubs_always_before_branch;
2837
  bfd_boolean stub_changed;
2838
  struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2839
 
2840
  /* Stash our params away.  */
2841
  htab->stub_bfd = stub_bfd;
2842
  htab->multi_subspace = multi_subspace;
2843
  htab->add_stub_section = add_stub_section;
2844
  htab->layout_sections_again = layout_sections_again;
2845
  stubs_always_before_branch = group_size < 0;
2846
  if (group_size < 0)
2847
    stub_group_size = -group_size;
2848
  else
2849
    stub_group_size = group_size;
2850
  if (stub_group_size == 1)
2851
    {
2852
      /* Default values.  */
2853
      if (stubs_always_before_branch)
2854
        {
2855
          stub_group_size = 7680000;
2856
          if (htab->has_17bit_branch || htab->multi_subspace)
2857
            stub_group_size = 240000;
2858
          if (htab->has_12bit_branch)
2859
            stub_group_size = 7500;
2860
        }
2861
      else
2862
        {
2863
          stub_group_size = 6971392;
2864
          if (htab->has_17bit_branch || htab->multi_subspace)
2865
            stub_group_size = 217856;
2866
          if (htab->has_12bit_branch)
2867
            stub_group_size = 6808;
2868
        }
2869
    }
2870
 
2871
  group_sections (htab, stub_group_size, stubs_always_before_branch);
2872
 
2873
  switch (get_local_syms (output_bfd, info->input_bfds, info))
2874
    {
2875
    default:
2876
      if (htab->all_local_syms)
2877
        goto error_ret_free_local;
2878
      return FALSE;
2879
 
2880
    case 0:
2881
      stub_changed = FALSE;
2882
      break;
2883
 
2884
    case 1:
2885
      stub_changed = TRUE;
2886
      break;
2887
    }
2888
 
2889
  while (1)
2890
    {
2891
      bfd *input_bfd;
2892
      unsigned int bfd_indx;
2893
      asection *stub_sec;
2894
 
2895
      for (input_bfd = info->input_bfds, bfd_indx = 0;
2896
           input_bfd != NULL;
2897
           input_bfd = input_bfd->link_next, bfd_indx++)
2898
        {
2899
          Elf_Internal_Shdr *symtab_hdr;
2900
          asection *section;
2901
          Elf_Internal_Sym *local_syms;
2902
 
2903
          /* We'll need the symbol table in a second.  */
2904
          symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2905
          if (symtab_hdr->sh_info == 0)
2906
            continue;
2907
 
2908
          local_syms = htab->all_local_syms[bfd_indx];
2909
 
2910
          /* Walk over each section attached to the input bfd.  */
2911
          for (section = input_bfd->sections;
2912
               section != NULL;
2913
               section = section->next)
2914
            {
2915
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2916
 
2917
              /* If there aren't any relocs, then there's nothing more
2918
                 to do.  */
2919
              if ((section->flags & SEC_RELOC) == 0
2920
                  || section->reloc_count == 0)
2921
                continue;
2922
 
2923
              /* If this section is a link-once section that will be
2924
                 discarded, then don't create any stubs.  */
2925
              if (section->output_section == NULL
2926
                  || section->output_section->owner != output_bfd)
2927
                continue;
2928
 
2929
              /* Get the relocs.  */
2930
              internal_relocs
2931
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2932
                                             info->keep_memory);
2933
              if (internal_relocs == NULL)
2934
                goto error_ret_free_local;
2935
 
2936
              /* Now examine each relocation.  */
2937
              irela = internal_relocs;
2938
              irelaend = irela + section->reloc_count;
2939
              for (; irela < irelaend; irela++)
2940
                {
2941
                  unsigned int r_type, r_indx;
2942
                  enum elf32_hppa_stub_type stub_type;
2943
                  struct elf32_hppa_stub_hash_entry *hsh;
2944
                  asection *sym_sec;
2945
                  bfd_vma sym_value;
2946
                  bfd_vma destination;
2947
                  struct elf32_hppa_link_hash_entry *hh;
2948
                  char *stub_name;
2949
                  const asection *id_sec;
2950
 
2951
                  r_type = ELF32_R_TYPE (irela->r_info);
2952
                  r_indx = ELF32_R_SYM (irela->r_info);
2953
 
2954
                  if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2955
                    {
2956
                      bfd_set_error (bfd_error_bad_value);
2957
                    error_ret_free_internal:
2958
                      if (elf_section_data (section)->relocs == NULL)
2959
                        free (internal_relocs);
2960
                      goto error_ret_free_local;
2961
                    }
2962
 
2963
                  /* Only look for stubs on call instructions.  */
2964
                  if (r_type != (unsigned int) R_PARISC_PCREL12F
2965
                      && r_type != (unsigned int) R_PARISC_PCREL17F
2966
                      && r_type != (unsigned int) R_PARISC_PCREL22F)
2967
                    continue;
2968
 
2969
                  /* Now determine the call target, its name, value,
2970
                     section.  */
2971
                  sym_sec = NULL;
2972
                  sym_value = 0;
2973
                  destination = 0;
2974
                  hh = NULL;
2975
                  if (r_indx < symtab_hdr->sh_info)
2976
                    {
2977
                      /* It's a local symbol.  */
2978
                      Elf_Internal_Sym *sym;
2979
                      Elf_Internal_Shdr *hdr;
2980
                      unsigned int shndx;
2981
 
2982
                      sym = local_syms + r_indx;
2983
                      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2984
                        sym_value = sym->st_value;
2985
                      shndx = sym->st_shndx;
2986
                      if (shndx < elf_numsections (input_bfd))
2987
                        {
2988
                          hdr = elf_elfsections (input_bfd)[shndx];
2989
                          sym_sec = hdr->bfd_section;
2990
                          destination = (sym_value + irela->r_addend
2991
                                         + sym_sec->output_offset
2992
                                         + sym_sec->output_section->vma);
2993
                        }
2994
                    }
2995
                  else
2996
                    {
2997
                      /* It's an external symbol.  */
2998
                      int e_indx;
2999
 
3000
                      e_indx = r_indx - symtab_hdr->sh_info;
3001
                      hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
3002
 
3003
                      while (hh->eh.root.type == bfd_link_hash_indirect
3004
                             || hh->eh.root.type == bfd_link_hash_warning)
3005
                        hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
3006
 
3007
                      if (hh->eh.root.type == bfd_link_hash_defined
3008
                          || hh->eh.root.type == bfd_link_hash_defweak)
3009
                        {
3010
                          sym_sec = hh->eh.root.u.def.section;
3011
                          sym_value = hh->eh.root.u.def.value;
3012
                          if (sym_sec->output_section != NULL)
3013
                            destination = (sym_value + irela->r_addend
3014
                                           + sym_sec->output_offset
3015
                                           + sym_sec->output_section->vma);
3016
                        }
3017
                      else if (hh->eh.root.type == bfd_link_hash_undefweak)
3018
                        {
3019
                          if (! info->shared)
3020
                            continue;
3021
                        }
3022
                      else if (hh->eh.root.type == bfd_link_hash_undefined)
3023
                        {
3024
                          if (! (info->unresolved_syms_in_objects == RM_IGNORE
3025
                                 && (ELF_ST_VISIBILITY (hh->eh.other)
3026
                                     == STV_DEFAULT)
3027
                                 && hh->eh.type != STT_PARISC_MILLI))
3028
                            continue;
3029
                        }
3030
                      else
3031
                        {
3032
                          bfd_set_error (bfd_error_bad_value);
3033
                          goto error_ret_free_internal;
3034
                        }
3035
                    }
3036
 
3037
                  /* Determine what (if any) linker stub is needed.  */
3038
                  stub_type = hppa_type_of_stub (section, irela, hh,
3039
                                                 destination, info);
3040
                  if (stub_type == hppa_stub_none)
3041
                    continue;
3042
 
3043
                  /* Support for grouping stub sections.  */
3044
                  id_sec = htab->stub_group[section->id].link_sec;
3045
 
3046
                  /* Get the name of this stub.  */
3047
                  stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
3048
                  if (!stub_name)
3049
                    goto error_ret_free_internal;
3050
 
3051
                  hsh = hppa_stub_hash_lookup (&htab->bstab,
3052
                                                      stub_name,
3053
                                                      FALSE, FALSE);
3054
                  if (hsh != NULL)
3055
                    {
3056
                      /* The proper stub has already been created.  */
3057
                      free (stub_name);
3058
                      continue;
3059
                    }
3060
 
3061
                  hsh = hppa_add_stub (stub_name, section, htab);
3062
                  if (hsh == NULL)
3063
                    {
3064
                      free (stub_name);
3065
                      goto error_ret_free_internal;
3066
                    }
3067
 
3068
                  hsh->target_value = sym_value;
3069
                  hsh->target_section = sym_sec;
3070
                  hsh->stub_type = stub_type;
3071
                  if (info->shared)
3072
                    {
3073
                      if (stub_type == hppa_stub_import)
3074
                        hsh->stub_type = hppa_stub_import_shared;
3075
                      else if (stub_type == hppa_stub_long_branch)
3076
                        hsh->stub_type = hppa_stub_long_branch_shared;
3077
                    }
3078
                  hsh->hh = hh;
3079
                  stub_changed = TRUE;
3080
                }
3081
 
3082
              /* We're done with the internal relocs, free them.  */
3083
              if (elf_section_data (section)->relocs == NULL)
3084
                free (internal_relocs);
3085
            }
3086
        }
3087
 
3088
      if (!stub_changed)
3089
        break;
3090
 
3091
      /* OK, we've added some stubs.  Find out the new size of the
3092
         stub sections.  */
3093
      for (stub_sec = htab->stub_bfd->sections;
3094
           stub_sec != NULL;
3095
           stub_sec = stub_sec->next)
3096
        stub_sec->size = 0;
3097
 
3098
      bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
3099
 
3100
      /* Ask the linker to do its stuff.  */
3101
      (*htab->layout_sections_again) ();
3102
      stub_changed = FALSE;
3103
    }
3104
 
3105
  free (htab->all_local_syms);
3106
  return TRUE;
3107
 
3108
 error_ret_free_local:
3109
  free (htab->all_local_syms);
3110
  return FALSE;
3111
}
3112
 
3113
/* For a final link, this function is called after we have sized the
3114
   stubs to provide a value for __gp.  */
3115
 
3116
bfd_boolean
3117
elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
3118
{
3119
  struct bfd_link_hash_entry *h;
3120
  asection *sec = NULL;
3121
  bfd_vma gp_val = 0;
3122
  struct elf32_hppa_link_hash_table *htab;
3123
 
3124
  htab = hppa_link_hash_table (info);
3125
  h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3126
 
3127
  if (h != NULL
3128
      && (h->type == bfd_link_hash_defined
3129
          || h->type == bfd_link_hash_defweak))
3130
    {
3131
      gp_val = h->u.def.value;
3132
      sec = h->u.def.section;
3133
    }
3134
  else
3135
    {
3136
      asection *splt = bfd_get_section_by_name (abfd, ".plt");
3137
      asection *sgot = bfd_get_section_by_name (abfd, ".got");
3138
 
3139
      /* Choose to point our LTP at, in this order, one of .plt, .got,
3140
         or .data, if these sections exist.  In the case of choosing
3141
         .plt try to make the LTP ideal for addressing anywhere in the
3142
         .plt or .got with a 14 bit signed offset.  Typically, the end
3143
         of the .plt is the start of the .got, so choose .plt + 0x2000
3144
         if either the .plt or .got is larger than 0x2000.  If both
3145
         the .plt and .got are smaller than 0x2000, choose the end of
3146
         the .plt section.  */
3147
      sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3148
          ? NULL : splt;
3149
      if (sec != NULL)
3150
        {
3151
          gp_val = sec->size;
3152
          if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3153
            {
3154
              gp_val = 0x2000;
3155
            }
3156
        }
3157
      else
3158
        {
3159
          sec = sgot;
3160
          if (sec != NULL)
3161
            {
3162
              if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3163
                {
3164
                  /* We know we don't have a .plt.  If .got is large,
3165
                     offset our LTP.  */
3166
                  if (sec->size > 0x2000)
3167
                    gp_val = 0x2000;
3168
                }
3169
            }
3170
          else
3171
            {
3172
              /* No .plt or .got.  Who cares what the LTP is?  */
3173
              sec = bfd_get_section_by_name (abfd, ".data");
3174
            }
3175
        }
3176
 
3177
      if (h != NULL)
3178
        {
3179
          h->type = bfd_link_hash_defined;
3180
          h->u.def.value = gp_val;
3181
          if (sec != NULL)
3182
            h->u.def.section = sec;
3183
          else
3184
            h->u.def.section = bfd_abs_section_ptr;
3185
        }
3186
    }
3187
 
3188
  if (sec != NULL && sec->output_section != NULL)
3189
    gp_val += sec->output_section->vma + sec->output_offset;
3190
 
3191
  elf_gp (abfd) = gp_val;
3192
  return TRUE;
3193
}
3194
 
3195
/* Build all the stubs associated with the current output file.  The
3196
   stubs are kept in a hash table attached to the main linker hash
3197
   table.  We also set up the .plt entries for statically linked PIC
3198
   functions here.  This function is called via hppaelf_finish in the
3199
   linker.  */
3200
 
3201
bfd_boolean
3202
elf32_hppa_build_stubs (struct bfd_link_info *info)
3203
{
3204
  asection *stub_sec;
3205
  struct bfd_hash_table *table;
3206
  struct elf32_hppa_link_hash_table *htab;
3207
 
3208
  htab = hppa_link_hash_table (info);
3209
 
3210
  for (stub_sec = htab->stub_bfd->sections;
3211
       stub_sec != NULL;
3212
       stub_sec = stub_sec->next)
3213
    {
3214
      bfd_size_type size;
3215
 
3216
      /* Allocate memory to hold the linker stubs.  */
3217
      size = stub_sec->size;
3218
      stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3219
      if (stub_sec->contents == NULL && size != 0)
3220
        return FALSE;
3221
      stub_sec->size = 0;
3222
    }
3223
 
3224
  /* Build the stubs as directed by the stub hash table.  */
3225
  table = &htab->bstab;
3226
  bfd_hash_traverse (table, hppa_build_one_stub, info);
3227
 
3228
  return TRUE;
3229
}
3230
 
3231
/* Return the base vma address which should be subtracted from the real
3232
   address when resolving a dtpoff relocation.
3233
   This is PT_TLS segment p_vaddr.  */
3234
 
3235
static bfd_vma
3236
dtpoff_base (struct bfd_link_info *info)
3237
{
3238
  /* If tls_sec is NULL, we should have signalled an error already.  */
3239
  if (elf_hash_table (info)->tls_sec == NULL)
3240
    return 0;
3241
  return elf_hash_table (info)->tls_sec->vma;
3242
}
3243
 
3244
/* Return the relocation value for R_PARISC_TLS_TPOFF*..  */
3245
 
3246
static bfd_vma
3247
tpoff (struct bfd_link_info *info, bfd_vma address)
3248
{
3249
  struct elf_link_hash_table *htab = elf_hash_table (info);
3250
 
3251
  /* If tls_sec is NULL, we should have signalled an error already.  */
3252
  if (htab->tls_sec == NULL)
3253
    return 0;
3254
  /* hppa TLS ABI is variant I and static TLS block start just after
3255
     tcbhead structure which has 2 pointer fields.  */
3256
  return (address - htab->tls_sec->vma
3257
          + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3258
}
3259
 
3260
/* Perform a final link.  */
3261
 
3262
static bfd_boolean
3263
elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3264
{
3265
  /* Invoke the regular ELF linker to do all the work.  */
3266
  if (!bfd_elf_final_link (abfd, info))
3267
    return FALSE;
3268
 
3269
  /* If we're producing a final executable, sort the contents of the
3270
     unwind section.  */
3271
  return elf_hppa_sort_unwind (abfd);
3272
}
3273
 
3274
/* Record the lowest address for the data and text segments.  */
3275
 
3276
static void
3277
hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3278
{
3279
  struct elf32_hppa_link_hash_table *htab;
3280
 
3281
  htab = (struct elf32_hppa_link_hash_table*) data;
3282
 
3283
  if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3284
    {
3285
      bfd_vma value;
3286
      Elf_Internal_Phdr *p;
3287
 
3288
      p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3289
      BFD_ASSERT (p != NULL);
3290
      value = p->p_vaddr;
3291
 
3292
      if ((section->flags & SEC_READONLY) != 0)
3293
        {
3294
          if (value < htab->text_segment_base)
3295
            htab->text_segment_base = value;
3296
        }
3297
      else
3298
        {
3299
          if (value < htab->data_segment_base)
3300
            htab->data_segment_base = value;
3301
        }
3302
    }
3303
}
3304
 
3305
/* Perform a relocation as part of a final link.  */
3306
 
3307
static bfd_reloc_status_type
3308
final_link_relocate (asection *input_section,
3309
                     bfd_byte *contents,
3310
                     const Elf_Internal_Rela *rela,
3311
                     bfd_vma value,
3312
                     struct elf32_hppa_link_hash_table *htab,
3313
                     asection *sym_sec,
3314
                     struct elf32_hppa_link_hash_entry *hh,
3315
                     struct bfd_link_info *info)
3316
{
3317
  int insn;
3318
  unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3319
  unsigned int orig_r_type = r_type;
3320
  reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3321
  int r_format = howto->bitsize;
3322
  enum hppa_reloc_field_selector_type_alt r_field;
3323
  bfd *input_bfd = input_section->owner;
3324
  bfd_vma offset = rela->r_offset;
3325
  bfd_vma max_branch_offset = 0;
3326
  bfd_byte *hit_data = contents + offset;
3327
  bfd_signed_vma addend = rela->r_addend;
3328
  bfd_vma location;
3329
  struct elf32_hppa_stub_hash_entry *hsh = NULL;
3330
  int val;
3331
 
3332
  if (r_type == R_PARISC_NONE)
3333
    return bfd_reloc_ok;
3334
 
3335
  insn = bfd_get_32 (input_bfd, hit_data);
3336
 
3337
  /* Find out where we are and where we're going.  */
3338
  location = (offset +
3339
              input_section->output_offset +
3340
              input_section->output_section->vma);
3341
 
3342
  /* If we are not building a shared library, convert DLTIND relocs to
3343
     DPREL relocs.  */
3344
  if (!info->shared)
3345
    {
3346
      switch (r_type)
3347
        {
3348
          case R_PARISC_DLTIND21L:
3349
            r_type = R_PARISC_DPREL21L;
3350
            break;
3351
 
3352
          case R_PARISC_DLTIND14R:
3353
            r_type = R_PARISC_DPREL14R;
3354
            break;
3355
 
3356
          case R_PARISC_DLTIND14F:
3357
            r_type = R_PARISC_DPREL14F;
3358
            break;
3359
        }
3360
    }
3361
 
3362
  switch (r_type)
3363
    {
3364
    case R_PARISC_PCREL12F:
3365
    case R_PARISC_PCREL17F:
3366
    case R_PARISC_PCREL22F:
3367
      /* If this call should go via the plt, find the import stub in
3368
         the stub hash.  */
3369
      if (sym_sec == NULL
3370
          || sym_sec->output_section == NULL
3371
          || (hh != NULL
3372
              && hh->eh.plt.offset != (bfd_vma) -1
3373
              && hh->eh.dynindx != -1
3374
              && !hh->plabel
3375
              && (info->shared
3376
                  || !hh->eh.def_regular
3377
                  || hh->eh.root.type == bfd_link_hash_defweak)))
3378
        {
3379
          hsh = hppa_get_stub_entry (input_section, sym_sec,
3380
                                            hh, rela, htab);
3381
          if (hsh != NULL)
3382
            {
3383
              value = (hsh->stub_offset
3384
                       + hsh->stub_sec->output_offset
3385
                       + hsh->stub_sec->output_section->vma);
3386
              addend = 0;
3387
            }
3388
          else if (sym_sec == NULL && hh != NULL
3389
                   && hh->eh.root.type == bfd_link_hash_undefweak)
3390
            {
3391
              /* It's OK if undefined weak.  Calls to undefined weak
3392
                 symbols behave as if the "called" function
3393
                 immediately returns.  We can thus call to a weak
3394
                 function without first checking whether the function
3395
                 is defined.  */
3396
              value = location;
3397
              addend = 8;
3398
            }
3399
          else
3400
            return bfd_reloc_undefined;
3401
        }
3402
      /* Fall thru.  */
3403
 
3404
    case R_PARISC_PCREL21L:
3405
    case R_PARISC_PCREL17C:
3406
    case R_PARISC_PCREL17R:
3407
    case R_PARISC_PCREL14R:
3408
    case R_PARISC_PCREL14F:
3409
    case R_PARISC_PCREL32:
3410
      /* Make it a pc relative offset.  */
3411
      value -= location;
3412
      addend -= 8;
3413
      break;
3414
 
3415
    case R_PARISC_DPREL21L:
3416
    case R_PARISC_DPREL14R:
3417
    case R_PARISC_DPREL14F:
3418
      /* Convert instructions that use the linkage table pointer (r19) to
3419
         instructions that use the global data pointer (dp).  This is the
3420
         most efficient way of using PIC code in an incomplete executable,
3421
         but the user must follow the standard runtime conventions for
3422
         accessing data for this to work.  */
3423
      if (orig_r_type == R_PARISC_DLTIND21L)
3424
        {
3425
          /* Convert addil instructions if the original reloc was a
3426
             DLTIND21L.  GCC sometimes uses a register other than r19 for
3427
             the operation, so we must convert any addil instruction
3428
             that uses this relocation.  */
3429
          if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3430
            insn = ADDIL_DP;
3431
          else
3432
            /* We must have a ldil instruction.  It's too hard to find
3433
               and convert the associated add instruction, so issue an
3434
               error.  */
3435
            (*_bfd_error_handler)
3436
              (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3437
               input_bfd,
3438
               input_section,
3439
               offset,
3440
               howto->name,
3441
               insn);
3442
        }
3443
      else if (orig_r_type == R_PARISC_DLTIND14F)
3444
        {
3445
          /* This must be a format 1 load/store.  Change the base
3446
             register to dp.  */
3447
          insn = (insn & 0xfc1ffff) | (27 << 21);
3448
        }
3449
 
3450
    /* For all the DP relative relocations, we need to examine the symbol's
3451
       section.  If it has no section or if it's a code section, then
3452
       "data pointer relative" makes no sense.  In that case we don't
3453
       adjust the "value", and for 21 bit addil instructions, we change the
3454
       source addend register from %dp to %r0.  This situation commonly
3455
       arises for undefined weak symbols and when a variable's "constness"
3456
       is declared differently from the way the variable is defined.  For
3457
       instance: "extern int foo" with foo defined as "const int foo".  */
3458
      if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3459
        {
3460
          if ((insn & ((0x3f << 26) | (0x1f << 21)))
3461
              == (((int) OP_ADDIL << 26) | (27 << 21)))
3462
            {
3463
              insn &= ~ (0x1f << 21);
3464
            }
3465
          /* Now try to make things easy for the dynamic linker.  */
3466
 
3467
          break;
3468
        }
3469
      /* Fall thru.  */
3470
 
3471
    case R_PARISC_DLTIND21L:
3472
    case R_PARISC_DLTIND14R:
3473
    case R_PARISC_DLTIND14F:
3474
    case R_PARISC_TLS_GD21L:
3475
    case R_PARISC_TLS_GD14R:
3476
    case R_PARISC_TLS_LDM21L:
3477
    case R_PARISC_TLS_LDM14R:
3478
    case R_PARISC_TLS_IE21L:
3479
    case R_PARISC_TLS_IE14R:
3480
      value -= elf_gp (input_section->output_section->owner);
3481
      break;
3482
 
3483
    case R_PARISC_SEGREL32:
3484
      if ((sym_sec->flags & SEC_CODE) != 0)
3485
        value -= htab->text_segment_base;
3486
      else
3487
        value -= htab->data_segment_base;
3488
      break;
3489
 
3490
    default:
3491
      break;
3492
    }
3493
 
3494
  switch (r_type)
3495
    {
3496
    case R_PARISC_DIR32:
3497
    case R_PARISC_DIR14F:
3498
    case R_PARISC_DIR17F:
3499
    case R_PARISC_PCREL17C:
3500
    case R_PARISC_PCREL14F:
3501
    case R_PARISC_PCREL32:
3502
    case R_PARISC_DPREL14F:
3503
    case R_PARISC_PLABEL32:
3504
    case R_PARISC_DLTIND14F:
3505
    case R_PARISC_SEGBASE:
3506
    case R_PARISC_SEGREL32:
3507
    case R_PARISC_TLS_DTPMOD32:
3508
    case R_PARISC_TLS_DTPOFF32:
3509
    case R_PARISC_TLS_TPREL32:
3510
      r_field = e_fsel;
3511
      break;
3512
 
3513
    case R_PARISC_DLTIND21L:
3514
    case R_PARISC_PCREL21L:
3515
    case R_PARISC_PLABEL21L:
3516
      r_field = e_lsel;
3517
      break;
3518
 
3519
    case R_PARISC_DIR21L:
3520
    case R_PARISC_DPREL21L:
3521
    case R_PARISC_TLS_GD21L:
3522
    case R_PARISC_TLS_LDM21L:
3523
    case R_PARISC_TLS_LDO21L:
3524
    case R_PARISC_TLS_IE21L:
3525
    case R_PARISC_TLS_LE21L:
3526
      r_field = e_lrsel;
3527
      break;
3528
 
3529
    case R_PARISC_PCREL17R:
3530
    case R_PARISC_PCREL14R:
3531
    case R_PARISC_PLABEL14R:
3532
    case R_PARISC_DLTIND14R:
3533
      r_field = e_rsel;
3534
      break;
3535
 
3536
    case R_PARISC_DIR17R:
3537
    case R_PARISC_DIR14R:
3538
    case R_PARISC_DPREL14R:
3539
    case R_PARISC_TLS_GD14R:
3540
    case R_PARISC_TLS_LDM14R:
3541
    case R_PARISC_TLS_LDO14R:
3542
    case R_PARISC_TLS_IE14R:
3543
    case R_PARISC_TLS_LE14R:
3544
      r_field = e_rrsel;
3545
      break;
3546
 
3547
    case R_PARISC_PCREL12F:
3548
    case R_PARISC_PCREL17F:
3549
    case R_PARISC_PCREL22F:
3550
      r_field = e_fsel;
3551
 
3552
      if (r_type == (unsigned int) R_PARISC_PCREL17F)
3553
        {
3554
          max_branch_offset = (1 << (17-1)) << 2;
3555
        }
3556
      else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3557
        {
3558
          max_branch_offset = (1 << (12-1)) << 2;
3559
        }
3560
      else
3561
        {
3562
          max_branch_offset = (1 << (22-1)) << 2;
3563
        }
3564
 
3565
      /* sym_sec is NULL on undefined weak syms or when shared on
3566
         undefined syms.  We've already checked for a stub for the
3567
         shared undefined case.  */
3568
      if (sym_sec == NULL)
3569
        break;
3570
 
3571
      /* If the branch is out of reach, then redirect the
3572
         call to the local stub for this function.  */
3573
      if (value + addend + max_branch_offset >= 2*max_branch_offset)
3574
        {
3575
          hsh = hppa_get_stub_entry (input_section, sym_sec,
3576
                                            hh, rela, htab);
3577
          if (hsh == NULL)
3578
            return bfd_reloc_undefined;
3579
 
3580
          /* Munge up the value and addend so that we call the stub
3581
             rather than the procedure directly.  */
3582
          value = (hsh->stub_offset
3583
                   + hsh->stub_sec->output_offset
3584
                   + hsh->stub_sec->output_section->vma
3585
                   - location);
3586
          addend = -8;
3587
        }
3588
      break;
3589
 
3590
    /* Something we don't know how to handle.  */
3591
    default:
3592
      return bfd_reloc_notsupported;
3593
    }
3594
 
3595
  /* Make sure we can reach the stub.  */
3596
  if (max_branch_offset != 0
3597
      && value + addend + max_branch_offset >= 2*max_branch_offset)
3598
    {
3599
      (*_bfd_error_handler)
3600
        (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3601
         input_bfd,
3602
         input_section,
3603
         offset,
3604
         hsh->bh_root.string);
3605
      bfd_set_error (bfd_error_bad_value);
3606
      return bfd_reloc_notsupported;
3607
    }
3608
 
3609
  val = hppa_field_adjust (value, addend, r_field);
3610
 
3611
  switch (r_type)
3612
    {
3613
    case R_PARISC_PCREL12F:
3614
    case R_PARISC_PCREL17C:
3615
    case R_PARISC_PCREL17F:
3616
    case R_PARISC_PCREL17R:
3617
    case R_PARISC_PCREL22F:
3618
    case R_PARISC_DIR17F:
3619
    case R_PARISC_DIR17R:
3620
      /* This is a branch.  Divide the offset by four.
3621
         Note that we need to decide whether it's a branch or
3622
         otherwise by inspecting the reloc.  Inspecting insn won't
3623
         work as insn might be from a .word directive.  */
3624
      val >>= 2;
3625
      break;
3626
 
3627
    default:
3628
      break;
3629
    }
3630
 
3631
  insn = hppa_rebuild_insn (insn, val, r_format);
3632
 
3633
  /* Update the instruction word.  */
3634
  bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3635
  return bfd_reloc_ok;
3636
}
3637
 
3638
/* Relocate an HPPA ELF section.  */
3639
 
3640
static bfd_boolean
3641
elf32_hppa_relocate_section (bfd *output_bfd,
3642
                             struct bfd_link_info *info,
3643
                             bfd *input_bfd,
3644
                             asection *input_section,
3645
                             bfd_byte *contents,
3646
                             Elf_Internal_Rela *relocs,
3647
                             Elf_Internal_Sym *local_syms,
3648
                             asection **local_sections)
3649
{
3650
  bfd_vma *local_got_offsets;
3651
  struct elf32_hppa_link_hash_table *htab;
3652
  Elf_Internal_Shdr *symtab_hdr;
3653
  Elf_Internal_Rela *rela;
3654
  Elf_Internal_Rela *relend;
3655
 
3656
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3657
 
3658
  htab = hppa_link_hash_table (info);
3659
  local_got_offsets = elf_local_got_offsets (input_bfd);
3660
 
3661
  rela = relocs;
3662
  relend = relocs + input_section->reloc_count;
3663
  for (; rela < relend; rela++)
3664
    {
3665
      unsigned int r_type;
3666
      reloc_howto_type *howto;
3667
      unsigned int r_symndx;
3668
      struct elf32_hppa_link_hash_entry *hh;
3669
      Elf_Internal_Sym *sym;
3670
      asection *sym_sec;
3671
      bfd_vma relocation;
3672
      bfd_reloc_status_type rstatus;
3673
      const char *sym_name;
3674
      bfd_boolean plabel;
3675
      bfd_boolean warned_undef;
3676
 
3677
      r_type = ELF32_R_TYPE (rela->r_info);
3678
      if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3679
        {
3680
          bfd_set_error (bfd_error_bad_value);
3681
          return FALSE;
3682
        }
3683
      if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3684
          || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3685
        continue;
3686
 
3687
      r_symndx = ELF32_R_SYM (rela->r_info);
3688
      hh = NULL;
3689
      sym = NULL;
3690
      sym_sec = NULL;
3691
      warned_undef = FALSE;
3692
      if (r_symndx < symtab_hdr->sh_info)
3693
        {
3694
          /* This is a local symbol, h defaults to NULL.  */
3695
          sym = local_syms + r_symndx;
3696
          sym_sec = local_sections[r_symndx];
3697
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3698
        }
3699
      else
3700
        {
3701
          struct elf_link_hash_entry *eh;
3702
          bfd_boolean unresolved_reloc;
3703
          struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3704
 
3705
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3706
                                   r_symndx, symtab_hdr, sym_hashes,
3707
                                   eh, sym_sec, relocation,
3708
                                   unresolved_reloc, warned_undef);
3709
 
3710
          if (!info->relocatable
3711
              && relocation == 0
3712
              && eh->root.type != bfd_link_hash_defined
3713
              && eh->root.type != bfd_link_hash_defweak
3714
              && eh->root.type != bfd_link_hash_undefweak)
3715
            {
3716
              if (info->unresolved_syms_in_objects == RM_IGNORE
3717
                  && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3718
                  && eh->type == STT_PARISC_MILLI)
3719
                {
3720
                  if (! info->callbacks->undefined_symbol
3721
                      (info, eh_name (eh), input_bfd,
3722
                       input_section, rela->r_offset, FALSE))
3723
                    return FALSE;
3724
                  warned_undef = TRUE;
3725
                }
3726
            }
3727
          hh = hppa_elf_hash_entry (eh);
3728
        }
3729
 
3730
      if (sym_sec != NULL && elf_discarded_section (sym_sec))
3731
        {
3732
          /* For relocs against symbols from removed linkonce
3733
             sections, or sections discarded by a linker script,
3734
             we just want the section contents zeroed.  Avoid any
3735
             special processing.  */
3736
          _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
3737
                               contents + rela->r_offset);
3738
          rela->r_info = 0;
3739
          rela->r_addend = 0;
3740
          continue;
3741
        }
3742
 
3743
      if (info->relocatable)
3744
        continue;
3745
 
3746
      /* Do any required modifications to the relocation value, and
3747
         determine what types of dynamic info we need to output, if
3748
         any.  */
3749
      plabel = 0;
3750
      switch (r_type)
3751
        {
3752
        case R_PARISC_DLTIND14F:
3753
        case R_PARISC_DLTIND14R:
3754
        case R_PARISC_DLTIND21L:
3755
          {
3756
            bfd_vma off;
3757
            bfd_boolean do_got = 0;
3758
 
3759
            /* Relocation is to the entry for this symbol in the
3760
               global offset table.  */
3761
            if (hh != NULL)
3762
              {
3763
                bfd_boolean dyn;
3764
 
3765
                off = hh->eh.got.offset;
3766
                dyn = htab->etab.dynamic_sections_created;
3767
                if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3768
                                                       &hh->eh))
3769
                  {
3770
                    /* If we aren't going to call finish_dynamic_symbol,
3771
                       then we need to handle initialisation of the .got
3772
                       entry and create needed relocs here.  Since the
3773
                       offset must always be a multiple of 4, we use the
3774
                       least significant bit to record whether we have
3775
                       initialised it already.  */
3776
                    if ((off & 1) != 0)
3777
                      off &= ~1;
3778
                    else
3779
                      {
3780
                        hh->eh.got.offset |= 1;
3781
                        do_got = 1;
3782
                      }
3783
                  }
3784
              }
3785
            else
3786
              {
3787
                /* Local symbol case.  */
3788
                if (local_got_offsets == NULL)
3789
                  abort ();
3790
 
3791
                off = local_got_offsets[r_symndx];
3792
 
3793
                /* The offset must always be a multiple of 4.  We use
3794
                   the least significant bit to record whether we have
3795
                   already generated the necessary reloc.  */
3796
                if ((off & 1) != 0)
3797
                  off &= ~1;
3798
                else
3799
                  {
3800
                    local_got_offsets[r_symndx] |= 1;
3801
                    do_got = 1;
3802
                  }
3803
              }
3804
 
3805
            if (do_got)
3806
              {
3807
                if (info->shared)
3808
                  {
3809
                    /* Output a dynamic relocation for this GOT entry.
3810
                       In this case it is relative to the base of the
3811
                       object because the symbol index is zero.  */
3812
                    Elf_Internal_Rela outrel;
3813
                    bfd_byte *loc;
3814
                    asection *sec = htab->srelgot;
3815
 
3816
                    outrel.r_offset = (off
3817
                                       + htab->sgot->output_offset
3818
                                       + htab->sgot->output_section->vma);
3819
                    outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3820
                    outrel.r_addend = relocation;
3821
                    loc = sec->contents;
3822
                    loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3823
                    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3824
                  }
3825
                else
3826
                  bfd_put_32 (output_bfd, relocation,
3827
                              htab->sgot->contents + off);
3828
              }
3829
 
3830
            if (off >= (bfd_vma) -2)
3831
              abort ();
3832
 
3833
            /* Add the base of the GOT to the relocation value.  */
3834
            relocation = (off
3835
                          + htab->sgot->output_offset
3836
                          + htab->sgot->output_section->vma);
3837
          }
3838
          break;
3839
 
3840
        case R_PARISC_SEGREL32:
3841
          /* If this is the first SEGREL relocation, then initialize
3842
             the segment base values.  */
3843
          if (htab->text_segment_base == (bfd_vma) -1)
3844
            bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3845
          break;
3846
 
3847
        case R_PARISC_PLABEL14R:
3848
        case R_PARISC_PLABEL21L:
3849
        case R_PARISC_PLABEL32:
3850
          if (htab->etab.dynamic_sections_created)
3851
            {
3852
              bfd_vma off;
3853
              bfd_boolean do_plt = 0;
3854
              /* If we have a global symbol with a PLT slot, then
3855
                 redirect this relocation to it.  */
3856
              if (hh != NULL)
3857
                {
3858
                  off = hh->eh.plt.offset;
3859
                  if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3860
                                                         &hh->eh))
3861
                    {
3862
                      /* In a non-shared link, adjust_dynamic_symbols
3863
                         isn't called for symbols forced local.  We
3864
                         need to write out the plt entry here.  */
3865
                      if ((off & 1) != 0)
3866
                        off &= ~1;
3867
                      else
3868
                        {
3869
                          hh->eh.plt.offset |= 1;
3870
                          do_plt = 1;
3871
                        }
3872
                    }
3873
                }
3874
              else
3875
                {
3876
                  bfd_vma *local_plt_offsets;
3877
 
3878
                  if (local_got_offsets == NULL)
3879
                    abort ();
3880
 
3881
                  local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3882
                  off = local_plt_offsets[r_symndx];
3883
 
3884
                  /* As for the local .got entry case, we use the last
3885
                     bit to record whether we've already initialised
3886
                     this local .plt entry.  */
3887
                  if ((off & 1) != 0)
3888
                    off &= ~1;
3889
                  else
3890
                    {
3891
                      local_plt_offsets[r_symndx] |= 1;
3892
                      do_plt = 1;
3893
                    }
3894
                }
3895
 
3896
              if (do_plt)
3897
                {
3898
                  if (info->shared)
3899
                    {
3900
                      /* Output a dynamic IPLT relocation for this
3901
                         PLT entry.  */
3902
                      Elf_Internal_Rela outrel;
3903
                      bfd_byte *loc;
3904
                      asection *s = htab->srelplt;
3905
 
3906
                      outrel.r_offset = (off
3907
                                         + htab->splt->output_offset
3908
                                         + htab->splt->output_section->vma);
3909
                      outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3910
                      outrel.r_addend = relocation;
3911
                      loc = s->contents;
3912
                      loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3913
                      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3914
                    }
3915
                  else
3916
                    {
3917
                      bfd_put_32 (output_bfd,
3918
                                  relocation,
3919
                                  htab->splt->contents + off);
3920
                      bfd_put_32 (output_bfd,
3921
                                  elf_gp (htab->splt->output_section->owner),
3922
                                  htab->splt->contents + off + 4);
3923
                    }
3924
                }
3925
 
3926
              if (off >= (bfd_vma) -2)
3927
                abort ();
3928
 
3929
              /* PLABELs contain function pointers.  Relocation is to
3930
                 the entry for the function in the .plt.  The magic +2
3931
                 offset signals to $$dyncall that the function pointer
3932
                 is in the .plt and thus has a gp pointer too.
3933
                 Exception:  Undefined PLABELs should have a value of
3934
                 zero.  */
3935
              if (hh == NULL
3936
                  || (hh->eh.root.type != bfd_link_hash_undefweak
3937
                      && hh->eh.root.type != bfd_link_hash_undefined))
3938
                {
3939
                  relocation = (off
3940
                                + htab->splt->output_offset
3941
                                + htab->splt->output_section->vma
3942
                                + 2);
3943
                }
3944
              plabel = 1;
3945
            }
3946
          /* Fall through and possibly emit a dynamic relocation.  */
3947
 
3948
        case R_PARISC_DIR17F:
3949
        case R_PARISC_DIR17R:
3950
        case R_PARISC_DIR14F:
3951
        case R_PARISC_DIR14R:
3952
        case R_PARISC_DIR21L:
3953
        case R_PARISC_DPREL14F:
3954
        case R_PARISC_DPREL14R:
3955
        case R_PARISC_DPREL21L:
3956
        case R_PARISC_DIR32:
3957
          if ((input_section->flags & SEC_ALLOC) == 0)
3958
            break;
3959
 
3960
          /* The reloc types handled here and this conditional
3961
             expression must match the code in ..check_relocs and
3962
             allocate_dynrelocs.  ie. We need exactly the same condition
3963
             as in ..check_relocs, with some extra conditions (dynindx
3964
             test in this case) to cater for relocs removed by
3965
             allocate_dynrelocs.  If you squint, the non-shared test
3966
             here does indeed match the one in ..check_relocs, the
3967
             difference being that here we test DEF_DYNAMIC as well as
3968
             !DEF_REGULAR.  All common syms end up with !DEF_REGULAR,
3969
             which is why we can't use just that test here.
3970
             Conversely, DEF_DYNAMIC can't be used in check_relocs as
3971
             there all files have not been loaded.  */
3972
          if ((info->shared
3973
               && (hh == NULL
3974
                   || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3975
                   || hh->eh.root.type != bfd_link_hash_undefweak)
3976
               && (IS_ABSOLUTE_RELOC (r_type)
3977
                   || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
3978
              || (!info->shared
3979
                  && hh != NULL
3980
                  && hh->eh.dynindx != -1
3981
                  && !hh->eh.non_got_ref
3982
                  && ((ELIMINATE_COPY_RELOCS
3983
                       && hh->eh.def_dynamic
3984
                       && !hh->eh.def_regular)
3985
                      || hh->eh.root.type == bfd_link_hash_undefweak
3986
                      || hh->eh.root.type == bfd_link_hash_undefined)))
3987
            {
3988
              Elf_Internal_Rela outrel;
3989
              bfd_boolean skip;
3990
              asection *sreloc;
3991
              bfd_byte *loc;
3992
 
3993
              /* When generating a shared object, these relocations
3994
                 are copied into the output file to be resolved at run
3995
                 time.  */
3996
 
3997
              outrel.r_addend = rela->r_addend;
3998
              outrel.r_offset =
3999
                _bfd_elf_section_offset (output_bfd, info, input_section,
4000
                                         rela->r_offset);
4001
              skip = (outrel.r_offset == (bfd_vma) -1
4002
                      || outrel.r_offset == (bfd_vma) -2);
4003
              outrel.r_offset += (input_section->output_offset
4004
                                  + input_section->output_section->vma);
4005
 
4006
              if (skip)
4007
                {
4008
                  memset (&outrel, 0, sizeof (outrel));
4009
                }
4010
              else if (hh != NULL
4011
                       && hh->eh.dynindx != -1
4012
                       && (plabel
4013
                           || !IS_ABSOLUTE_RELOC (r_type)
4014
                           || !info->shared
4015
                           || !info->symbolic
4016
                           || !hh->eh.def_regular))
4017
                {
4018
                  outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4019
                }
4020
              else /* It's a local symbol, or one marked to become local.  */
4021
                {
4022
                  int indx = 0;
4023
 
4024
                  /* Add the absolute offset of the symbol.  */
4025
                  outrel.r_addend += relocation;
4026
 
4027
                  /* Global plabels need to be processed by the
4028
                     dynamic linker so that functions have at most one
4029
                     fptr.  For this reason, we need to differentiate
4030
                     between global and local plabels, which we do by
4031
                     providing the function symbol for a global plabel
4032
                     reloc, and no symbol for local plabels.  */
4033
                  if (! plabel
4034
                      && sym_sec != NULL
4035
                      && sym_sec->output_section != NULL
4036
                      && ! bfd_is_abs_section (sym_sec))
4037
                    {
4038
                      asection *osec;
4039
 
4040
                      osec = sym_sec->output_section;
4041
                      indx = elf_section_data (osec)->dynindx;
4042
                      if (indx == 0)
4043
                        {
4044
                          osec = htab->etab.text_index_section;
4045
                          indx = elf_section_data (osec)->dynindx;
4046
                        }
4047
                      BFD_ASSERT (indx != 0);
4048
 
4049
                      /* We are turning this relocation into one
4050
                         against a section symbol, so subtract out the
4051
                         output section's address but not the offset
4052
                         of the input section in the output section.  */
4053
                      outrel.r_addend -= osec->vma;
4054
                    }
4055
 
4056
                  outrel.r_info = ELF32_R_INFO (indx, r_type);
4057
                }
4058
              sreloc = elf_section_data (input_section)->sreloc;
4059
              if (sreloc == NULL)
4060
                abort ();
4061
 
4062
              loc = sreloc->contents;
4063
              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4064
              bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4065
            }
4066
          break;
4067
 
4068
        case R_PARISC_TLS_LDM21L:
4069
        case R_PARISC_TLS_LDM14R:
4070
          {
4071
            bfd_vma off;
4072
 
4073
            off = htab->tls_ldm_got.offset;
4074
            if (off & 1)
4075
              off &= ~1;
4076
            else
4077
              {
4078
                Elf_Internal_Rela outrel;
4079
                bfd_byte *loc;
4080
 
4081
                outrel.r_offset = (off
4082
                                   + htab->sgot->output_section->vma
4083
                                   + htab->sgot->output_offset);
4084
                outrel.r_addend = 0;
4085
                outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4086
                loc = htab->srelgot->contents;
4087
                loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4088
 
4089
                bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4090
                htab->tls_ldm_got.offset |= 1;
4091
              }
4092
 
4093
            /* Add the base of the GOT to the relocation value.  */
4094
            relocation = (off
4095
                          + htab->sgot->output_offset
4096
                          + htab->sgot->output_section->vma);
4097
 
4098
            break;
4099
          }
4100
 
4101
        case R_PARISC_TLS_LDO21L:
4102
        case R_PARISC_TLS_LDO14R:
4103
          relocation -= dtpoff_base (info);
4104
          break;
4105
 
4106
        case R_PARISC_TLS_GD21L:
4107
        case R_PARISC_TLS_GD14R:
4108
        case R_PARISC_TLS_IE21L:
4109
        case R_PARISC_TLS_IE14R:
4110
          {
4111
            bfd_vma off;
4112
            int indx;
4113
            char tls_type;
4114
 
4115
            indx = 0;
4116
            if (hh != NULL)
4117
              {
4118
                bfd_boolean dyn;
4119
                dyn = htab->etab.dynamic_sections_created;
4120
 
4121
                if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4122
                    && (!info->shared
4123
                        || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4124
                  {
4125
                    indx = hh->eh.dynindx;
4126
                  }
4127
                off = hh->eh.got.offset;
4128
                tls_type = hh->tls_type;
4129
              }
4130
            else
4131
              {
4132
                off = local_got_offsets[r_symndx];
4133
                tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4134
              }
4135
 
4136
            if (tls_type == GOT_UNKNOWN)
4137
              abort ();
4138
 
4139
            if ((off & 1) != 0)
4140
              off &= ~1;
4141
            else
4142
              {
4143
                bfd_boolean need_relocs = FALSE;
4144
                Elf_Internal_Rela outrel;
4145
                bfd_byte *loc = NULL;
4146
                int cur_off = off;
4147
 
4148
                /* The GOT entries have not been initialized yet.  Do it
4149
                   now, and emit any relocations.  If both an IE GOT and a
4150
                   GD GOT are necessary, we emit the GD first.  */
4151
 
4152
                if ((info->shared || indx != 0)
4153
                    && (hh == NULL
4154
                        || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4155
                        || hh->eh.root.type != bfd_link_hash_undefweak))
4156
                  {
4157
                    need_relocs = TRUE;
4158
                    loc = htab->srelgot->contents;
4159
                    /* FIXME (CAO): Should this be reloc_count++ ? */
4160
                    loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4161
                  }
4162
 
4163
                if (tls_type & GOT_TLS_GD)
4164
                  {
4165
                    if (need_relocs)
4166
                      {
4167
                        outrel.r_offset = (cur_off
4168
                                           + htab->sgot->output_section->vma
4169
                                           + htab->sgot->output_offset);
4170
                        outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4171
                        outrel.r_addend = 0;
4172
                        bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4173
                        bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4174
                        htab->srelgot->reloc_count++;
4175
                        loc += sizeof (Elf32_External_Rela);
4176
 
4177
                        if (indx == 0)
4178
                          bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4179
                                      htab->sgot->contents + cur_off + 4);
4180
                        else
4181
                          {
4182
                            bfd_put_32 (output_bfd, 0,
4183
                                        htab->sgot->contents + cur_off + 4);
4184
                            outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4185
                            outrel.r_offset += 4;
4186
                            bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4187
                            htab->srelgot->reloc_count++;
4188
                            loc += sizeof (Elf32_External_Rela);
4189
                          }
4190
                      }
4191
                    else
4192
                      {
4193
                        /* If we are not emitting relocations for a
4194
                           general dynamic reference, then we must be in a
4195
                           static link or an executable link with the
4196
                           symbol binding locally.  Mark it as belonging
4197
                           to module 1, the executable.  */
4198
                        bfd_put_32 (output_bfd, 1,
4199
                                    htab->sgot->contents + cur_off);
4200
                        bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4201
                                    htab->sgot->contents + cur_off + 4);
4202
                      }
4203
 
4204
 
4205
                    cur_off += 8;
4206
                  }
4207
 
4208
                if (tls_type & GOT_TLS_IE)
4209
                  {
4210
                    if (need_relocs)
4211
                      {
4212
                        outrel.r_offset = (cur_off
4213
                                           + htab->sgot->output_section->vma
4214
                                           + htab->sgot->output_offset);
4215
                        outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4216
 
4217
                        if (indx == 0)
4218
                          outrel.r_addend = relocation - dtpoff_base (info);
4219
                        else
4220
                          outrel.r_addend = 0;
4221
 
4222
                        bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4223
                        htab->srelgot->reloc_count++;
4224
                        loc += sizeof (Elf32_External_Rela);
4225
                      }
4226
                    else
4227
                      bfd_put_32 (output_bfd, tpoff (info, relocation),
4228
                                  htab->sgot->contents + cur_off);
4229
 
4230
                    cur_off += 4;
4231
                  }
4232
 
4233
                if (hh != NULL)
4234
                  hh->eh.got.offset |= 1;
4235
                else
4236
                  local_got_offsets[r_symndx] |= 1;
4237
              }
4238
 
4239
            if ((tls_type & GOT_TLS_GD)
4240
                && r_type != R_PARISC_TLS_GD21L
4241
                && r_type != R_PARISC_TLS_GD14R)
4242
              off += 2 * GOT_ENTRY_SIZE;
4243
 
4244
            /* Add the base of the GOT to the relocation value.  */
4245
            relocation = (off
4246
                          + htab->sgot->output_offset
4247
                          + htab->sgot->output_section->vma);
4248
 
4249
            break;
4250
          }
4251
 
4252
        case R_PARISC_TLS_LE21L:
4253
        case R_PARISC_TLS_LE14R:
4254
          {
4255
            relocation = tpoff (info, relocation);
4256
            break;
4257
          }
4258
          break;
4259
 
4260
        default:
4261
          break;
4262
        }
4263
 
4264
      rstatus = final_link_relocate (input_section, contents, rela, relocation,
4265
                               htab, sym_sec, hh, info);
4266
 
4267
      if (rstatus == bfd_reloc_ok)
4268
        continue;
4269
 
4270
      if (hh != NULL)
4271
        sym_name = hh_name (hh);
4272
      else
4273
        {
4274
          sym_name = bfd_elf_string_from_elf_section (input_bfd,
4275
                                                      symtab_hdr->sh_link,
4276
                                                      sym->st_name);
4277
          if (sym_name == NULL)
4278
            return FALSE;
4279
          if (*sym_name == '\0')
4280
            sym_name = bfd_section_name (input_bfd, sym_sec);
4281
        }
4282
 
4283
      howto = elf_hppa_howto_table + r_type;
4284
 
4285
      if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4286
        {
4287
          if (rstatus == bfd_reloc_notsupported || !warned_undef)
4288
            {
4289
              (*_bfd_error_handler)
4290
                (_("%B(%A+0x%lx): cannot handle %s for %s"),
4291
                 input_bfd,
4292
                 input_section,
4293
                 (long) rela->r_offset,
4294
                 howto->name,
4295
                 sym_name);
4296
              bfd_set_error (bfd_error_bad_value);
4297
              return FALSE;
4298
            }
4299
        }
4300
      else
4301
        {
4302
          if (!((*info->callbacks->reloc_overflow)
4303
                (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4304
                 (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4305
            return FALSE;
4306
        }
4307
    }
4308
 
4309
  return TRUE;
4310
}
4311
 
4312
/* Finish up dynamic symbol handling.  We set the contents of various
4313
   dynamic sections here.  */
4314
 
4315
static bfd_boolean
4316
elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4317
                                  struct bfd_link_info *info,
4318
                                  struct elf_link_hash_entry *eh,
4319
                                  Elf_Internal_Sym *sym)
4320
{
4321
  struct elf32_hppa_link_hash_table *htab;
4322
  Elf_Internal_Rela rela;
4323
  bfd_byte *loc;
4324
 
4325
  htab = hppa_link_hash_table (info);
4326
 
4327
  if (eh->plt.offset != (bfd_vma) -1)
4328
    {
4329
      bfd_vma value;
4330
 
4331
      if (eh->plt.offset & 1)
4332
        abort ();
4333
 
4334
      /* This symbol has an entry in the procedure linkage table.  Set
4335
         it up.
4336
 
4337
         The format of a plt entry is
4338
         <funcaddr>
4339
         <__gp>
4340
      */
4341
      value = 0;
4342
      if (eh->root.type == bfd_link_hash_defined
4343
          || eh->root.type == bfd_link_hash_defweak)
4344
        {
4345
          value = eh->root.u.def.value;
4346
          if (eh->root.u.def.section->output_section != NULL)
4347
            value += (eh->root.u.def.section->output_offset
4348
                      + eh->root.u.def.section->output_section->vma);
4349
        }
4350
 
4351
      /* Create a dynamic IPLT relocation for this entry.  */
4352
      rela.r_offset = (eh->plt.offset
4353
                      + htab->splt->output_offset
4354
                      + htab->splt->output_section->vma);
4355
      if (eh->dynindx != -1)
4356
        {
4357
          rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4358
          rela.r_addend = 0;
4359
        }
4360
      else
4361
        {
4362
          /* This symbol has been marked to become local, and is
4363
             used by a plabel so must be kept in the .plt.  */
4364
          rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4365
          rela.r_addend = value;
4366
        }
4367
 
4368
      loc = htab->srelplt->contents;
4369
      loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4370
      bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4371
 
4372
      if (!eh->def_regular)
4373
        {
4374
          /* Mark the symbol as undefined, rather than as defined in
4375
             the .plt section.  Leave the value alone.  */
4376
          sym->st_shndx = SHN_UNDEF;
4377
        }
4378
    }
4379
 
4380
  if (eh->got.offset != (bfd_vma) -1
4381
      && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4382
      && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4383
    {
4384
      /* This symbol has an entry in the global offset table.  Set it
4385
         up.  */
4386
 
4387
      rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4388
                      + htab->sgot->output_offset
4389
                      + htab->sgot->output_section->vma);
4390
 
4391
      /* If this is a -Bsymbolic link and the symbol is defined
4392
         locally or was forced to be local because of a version file,
4393
         we just want to emit a RELATIVE reloc.  The entry in the
4394
         global offset table will already have been initialized in the
4395
         relocate_section function.  */
4396
      if (info->shared
4397
          && (info->symbolic || eh->dynindx == -1)
4398
          && eh->def_regular)
4399
        {
4400
          rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4401
          rela.r_addend = (eh->root.u.def.value
4402
                          + eh->root.u.def.section->output_offset
4403
                          + eh->root.u.def.section->output_section->vma);
4404
        }
4405
      else
4406
        {
4407
          if ((eh->got.offset & 1) != 0)
4408
            abort ();
4409
 
4410
          bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4411
          rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4412
          rela.r_addend = 0;
4413
        }
4414
 
4415
      loc = htab->srelgot->contents;
4416
      loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4417
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4418
    }
4419
 
4420
  if (eh->needs_copy)
4421
    {
4422
      asection *sec;
4423
 
4424
      /* This symbol needs a copy reloc.  Set it up.  */
4425
 
4426
      if (! (eh->dynindx != -1
4427
             && (eh->root.type == bfd_link_hash_defined
4428
                 || eh->root.type == bfd_link_hash_defweak)))
4429
        abort ();
4430
 
4431
      sec = htab->srelbss;
4432
 
4433
      rela.r_offset = (eh->root.u.def.value
4434
                      + eh->root.u.def.section->output_offset
4435
                      + eh->root.u.def.section->output_section->vma);
4436
      rela.r_addend = 0;
4437
      rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4438
      loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4439
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4440
    }
4441
 
4442
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4443
  if (eh_name (eh)[0] == '_'
4444
      && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4445
          || eh == htab->etab.hgot))
4446
    {
4447
      sym->st_shndx = SHN_ABS;
4448
    }
4449
 
4450
  return TRUE;
4451
}
4452
 
4453
/* Used to decide how to sort relocs in an optimal manner for the
4454
   dynamic linker, before writing them out.  */
4455
 
4456
static enum elf_reloc_type_class
4457
elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4458
{
4459
  /* Handle TLS relocs first; we don't want them to be marked
4460
     relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4461
     check below.  */
4462
  switch ((int) ELF32_R_TYPE (rela->r_info))
4463
    {
4464
      case R_PARISC_TLS_DTPMOD32:
4465
      case R_PARISC_TLS_DTPOFF32:
4466
      case R_PARISC_TLS_TPREL32:
4467
        return reloc_class_normal;
4468
    }
4469
 
4470
  if (ELF32_R_SYM (rela->r_info) == 0)
4471
    return reloc_class_relative;
4472
 
4473
  switch ((int) ELF32_R_TYPE (rela->r_info))
4474
    {
4475
    case R_PARISC_IPLT:
4476
      return reloc_class_plt;
4477
    case R_PARISC_COPY:
4478
      return reloc_class_copy;
4479
    default:
4480
      return reloc_class_normal;
4481
    }
4482
}
4483
 
4484
/* Finish up the dynamic sections.  */
4485
 
4486
static bfd_boolean
4487
elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4488
                                    struct bfd_link_info *info)
4489
{
4490
  bfd *dynobj;
4491
  struct elf32_hppa_link_hash_table *htab;
4492
  asection *sdyn;
4493
 
4494
  htab = hppa_link_hash_table (info);
4495
  dynobj = htab->etab.dynobj;
4496
 
4497
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4498
 
4499
  if (htab->etab.dynamic_sections_created)
4500
    {
4501
      Elf32_External_Dyn *dyncon, *dynconend;
4502
 
4503
      if (sdyn == NULL)
4504
        abort ();
4505
 
4506
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
4507
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4508
      for (; dyncon < dynconend; dyncon++)
4509
        {
4510
          Elf_Internal_Dyn dyn;
4511
          asection *s;
4512
 
4513
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4514
 
4515
          switch (dyn.d_tag)
4516
            {
4517
            default:
4518
              continue;
4519
 
4520
            case DT_PLTGOT:
4521
              /* Use PLTGOT to set the GOT register.  */
4522
              dyn.d_un.d_ptr = elf_gp (output_bfd);
4523
              break;
4524
 
4525
            case DT_JMPREL:
4526
              s = htab->srelplt;
4527
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4528
              break;
4529
 
4530
            case DT_PLTRELSZ:
4531
              s = htab->srelplt;
4532
              dyn.d_un.d_val = s->size;
4533
              break;
4534
 
4535
            case DT_RELASZ:
4536
              /* Don't count procedure linkage table relocs in the
4537
                 overall reloc count.  */
4538
              s = htab->srelplt;
4539
              if (s == NULL)
4540
                continue;
4541
              dyn.d_un.d_val -= s->size;
4542
              break;
4543
 
4544
            case DT_RELA:
4545
              /* We may not be using the standard ELF linker script.
4546
                 If .rela.plt is the first .rela section, we adjust
4547
                 DT_RELA to not include it.  */
4548
              s = htab->srelplt;
4549
              if (s == NULL)
4550
                continue;
4551
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4552
                continue;
4553
              dyn.d_un.d_ptr += s->size;
4554
              break;
4555
            }
4556
 
4557
          bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4558
        }
4559
    }
4560
 
4561
  if (htab->sgot != NULL && htab->sgot->size != 0)
4562
    {
4563
      /* Fill in the first entry in the global offset table.
4564
         We use it to point to our dynamic section, if we have one.  */
4565
      bfd_put_32 (output_bfd,
4566
                  sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4567
                  htab->sgot->contents);
4568
 
4569
      /* The second entry is reserved for use by the dynamic linker.  */
4570
      memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4571
 
4572
      /* Set .got entry size.  */
4573
      elf_section_data (htab->sgot->output_section)
4574
        ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4575
    }
4576
 
4577
  if (htab->splt != NULL && htab->splt->size != 0)
4578
    {
4579
      /* Set plt entry size.  */
4580
      elf_section_data (htab->splt->output_section)
4581
        ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4582
 
4583
      if (htab->need_plt_stub)
4584
        {
4585
          /* Set up the .plt stub.  */
4586
          memcpy (htab->splt->contents
4587
                  + htab->splt->size - sizeof (plt_stub),
4588
                  plt_stub, sizeof (plt_stub));
4589
 
4590
          if ((htab->splt->output_offset
4591
               + htab->splt->output_section->vma
4592
               + htab->splt->size)
4593
              != (htab->sgot->output_offset
4594
                  + htab->sgot->output_section->vma))
4595
            {
4596
              (*_bfd_error_handler)
4597
                (_(".got section not immediately after .plt section"));
4598
              return FALSE;
4599
            }
4600
        }
4601
    }
4602
 
4603
  return TRUE;
4604
}
4605
 
4606
/* Called when writing out an object file to decide the type of a
4607
   symbol.  */
4608
static int
4609
elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4610
{
4611
  if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4612
    return STT_PARISC_MILLI;
4613
  else
4614
    return type;
4615
}
4616
 
4617
/* Misc BFD support code.  */
4618
#define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
4619
#define bfd_elf32_bfd_reloc_type_lookup      elf_hppa_reloc_type_lookup
4620
#define bfd_elf32_bfd_reloc_name_lookup      elf_hppa_reloc_name_lookup
4621
#define elf_info_to_howto                    elf_hppa_info_to_howto
4622
#define elf_info_to_howto_rel                elf_hppa_info_to_howto_rel
4623
 
4624
/* Stuff for the BFD linker.  */
4625
#define bfd_elf32_mkobject                   elf32_hppa_mkobject
4626
#define bfd_elf32_bfd_final_link             elf32_hppa_final_link
4627
#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4628
#define bfd_elf32_bfd_link_hash_table_free   elf32_hppa_link_hash_table_free
4629
#define elf_backend_adjust_dynamic_symbol    elf32_hppa_adjust_dynamic_symbol
4630
#define elf_backend_copy_indirect_symbol     elf32_hppa_copy_indirect_symbol
4631
#define elf_backend_check_relocs             elf32_hppa_check_relocs
4632
#define elf_backend_create_dynamic_sections  elf32_hppa_create_dynamic_sections
4633
#define elf_backend_fake_sections            elf_hppa_fake_sections
4634
#define elf_backend_relocate_section         elf32_hppa_relocate_section
4635
#define elf_backend_hide_symbol              elf32_hppa_hide_symbol
4636
#define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
4637
#define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
4638
#define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
4639
#define elf_backend_init_index_section       _bfd_elf_init_1_index_section
4640
#define elf_backend_gc_mark_hook             elf32_hppa_gc_mark_hook
4641
#define elf_backend_gc_sweep_hook            elf32_hppa_gc_sweep_hook
4642
#define elf_backend_grok_prstatus            elf32_hppa_grok_prstatus
4643
#define elf_backend_grok_psinfo              elf32_hppa_grok_psinfo
4644
#define elf_backend_object_p                 elf32_hppa_object_p
4645
#define elf_backend_final_write_processing   elf_hppa_final_write_processing
4646
#define elf_backend_post_process_headers     _bfd_elf_set_osabi
4647
#define elf_backend_get_symbol_type          elf32_hppa_elf_get_symbol_type
4648
#define elf_backend_reloc_type_class         elf32_hppa_reloc_type_class
4649
#define elf_backend_action_discarded         elf_hppa_action_discarded
4650
 
4651
#define elf_backend_can_gc_sections          1
4652
#define elf_backend_can_refcount             1
4653
#define elf_backend_plt_alignment            2
4654
#define elf_backend_want_got_plt             0
4655
#define elf_backend_plt_readonly             0
4656
#define elf_backend_want_plt_sym             0
4657
#define elf_backend_got_header_size          8
4658
#define elf_backend_rela_normal              1
4659
 
4660
#define TARGET_BIG_SYM          bfd_elf32_hppa_vec
4661
#define TARGET_BIG_NAME         "elf32-hppa"
4662
#define ELF_ARCH                bfd_arch_hppa
4663
#define ELF_MACHINE_CODE        EM_PARISC
4664
#define ELF_MAXPAGESIZE         0x1000
4665
#define ELF_OSABI               ELFOSABI_HPUX
4666
#define elf32_bed               elf32_hppa_hpux_bed
4667
 
4668
#include "elf32-target.h"
4669
 
4670
#undef TARGET_BIG_SYM
4671
#define TARGET_BIG_SYM          bfd_elf32_hppa_linux_vec
4672
#undef TARGET_BIG_NAME
4673
#define TARGET_BIG_NAME         "elf32-hppa-linux"
4674
#undef ELF_OSABI
4675
#define ELF_OSABI               ELFOSABI_LINUX
4676
#undef elf32_bed
4677
#define elf32_bed               elf32_hppa_linux_bed
4678
 
4679
#include "elf32-target.h"
4680
 
4681
#undef TARGET_BIG_SYM
4682
#define TARGET_BIG_SYM          bfd_elf32_hppa_nbsd_vec
4683
#undef TARGET_BIG_NAME
4684
#define TARGET_BIG_NAME         "elf32-hppa-netbsd"
4685
#undef ELF_OSABI
4686
#define ELF_OSABI               ELFOSABI_NETBSD
4687
#undef elf32_bed
4688
#define elf32_bed               elf32_hppa_netbsd_bed
4689
 
4690
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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