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

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [gdb-5.0/] [bfd/] [elf32-hppa.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* BFD back-end for HP PA-RISC ELF files.
2
   Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3
   Free Software Foundation, Inc.
4
 
5
   Written by
6
 
7
        Center for Software Science
8
        Department of Computer Science
9
        University of Utah
10
 
11
This file is part of BFD, the Binary File Descriptor library.
12
 
13
This program is free software; you can redistribute it and/or modify
14
it under the terms of the GNU General Public License as published by
15
the Free Software Foundation; either version 2 of the License, or
16
(at your option) any later version.
17
 
18
This program is distributed in the hope that it will be useful,
19
but WITHOUT ANY WARRANTY; without even the implied warranty of
20
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
GNU General Public License for more details.
22
 
23
You should have received a copy of the GNU General Public License
24
along with this program; if not, write to the Free Software
25
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
26
 
27
#include "bfd.h"
28
#include "sysdep.h"
29
#include "libbfd.h"
30
#include "elf-bfd.h"
31
#include "elf/hppa.h"
32
#include "libhppa.h"
33
#include "elf32-hppa.h"
34
#define ARCH_SIZE               32
35
#include "elf-hppa.h"
36
 
37
 
38
/* We use three different hash tables to hold information for
39
   linking PA ELF objects.
40
 
41
   The first is the elf32_hppa_link_hash_table which is derived
42
   from the standard ELF linker hash table.  We use this as a place to
43
   attach other hash tables and static information.
44
 
45
   The second is the stub hash table which is derived from the
46
   base BFD hash table.  The stub hash table holds the information
47
   necessary to build the linker stubs during a link.  */
48
 
49
/* Hash table for linker stubs.  */
50
 
51
struct elf32_hppa_stub_hash_entry
52
{
53
  /* Base hash table entry structure, we can get the name of the stub
54
     (and thus know exactly what actions it performs) from the base
55
     hash table entry.  */
56
  struct bfd_hash_entry root;
57
 
58
  /* Offset of the beginning of this stub.  */
59
  bfd_vma offset;
60
 
61
  /* Given the symbol's value and its section we can determine its final
62
     value when building the stubs (so the stub knows where to jump.  */
63
  symvalue target_value;
64
  asection *target_section;
65
};
66
 
67
struct elf32_hppa_stub_hash_table
68
{
69
  /* The hash table itself.  */
70
  struct bfd_hash_table root;
71
 
72
  /* The stub BFD.  */
73
  bfd *stub_bfd;
74
 
75
  /* Where to place the next stub.  */
76
  bfd_byte *location;
77
 
78
  /* Current offset in the stub section.  */
79
  unsigned int offset;
80
 
81
};
82
 
83
struct elf32_hppa_link_hash_entry
84
{
85
  struct elf_link_hash_entry root;
86
};
87
 
88
struct elf32_hppa_link_hash_table
89
{
90
  /* The main hash table.  */
91
  struct elf_link_hash_table root;
92
 
93
  /* The stub hash table.  */
94
  struct elf32_hppa_stub_hash_table *stub_hash_table;
95
 
96
  /* A count of the number of output symbols.  */
97
  unsigned int output_symbol_count;
98
 
99
  /* Stuff so we can handle DP relative relocations.  */
100
  long global_value;
101
  int global_sym_defined;
102
};
103
 
104
/* ELF32/HPPA relocation support
105
 
106
        This file contains ELF32/HPPA relocation support as specified
107
        in the Stratus FTX/Golf Object File Format (SED-1762) dated
108
        February 1994.  */
109
 
110
#include "elf32-hppa.h"
111
#include "hppa_stubs.h"
112
 
113
static unsigned long hppa_elf_relocate_insn
114
  PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
115
           long, unsigned long, unsigned long, unsigned long));
116
 
117
static boolean elf32_hppa_add_symbol_hook
118
  PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
119
           const char **, flagword *, asection **, bfd_vma *));
120
 
121
static bfd_reloc_status_type elf32_hppa_bfd_final_link_relocate
122
  PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
123
           bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *,
124
           asection *, const char *, int));
125
 
126
static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
127
  PARAMS ((bfd *));
128
 
129
static struct bfd_hash_entry *
130
elf32_hppa_stub_hash_newfunc
131
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
132
 
133
static boolean
134
elf32_hppa_relocate_section
135
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
136
           bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
137
 
138
static boolean
139
elf32_hppa_stub_hash_table_init
140
  PARAMS ((struct elf32_hppa_stub_hash_table *, bfd *,
141
           struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *,
142
                                               struct bfd_hash_table *,
143
                                               const char *))));
144
 
145
static boolean
146
elf32_hppa_build_one_stub PARAMS ((struct bfd_hash_entry *, PTR));
147
 
148
static unsigned int elf32_hppa_size_of_stub
149
  PARAMS ((bfd_vma, bfd_vma, const char *));
150
 
151
static void elf32_hppa_name_of_stub
152
  PARAMS ((bfd_vma, bfd_vma, char *));
153
 
154
/* For linker stub hash tables.  */
155
#define elf32_hppa_stub_hash_lookup(table, string, create, copy) \
156
  ((struct elf32_hppa_stub_hash_entry *) \
157
   bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
158
 
159
#define elf32_hppa_stub_hash_traverse(table, func, info) \
160
  (bfd_hash_traverse \
161
   (&(table)->root, \
162
    (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
163
    (info)))
164
 
165
/* For HPPA linker hash table.  */
166
 
167
#define elf32_hppa_link_hash_lookup(table, string, create, copy, follow)\
168
  ((struct elf32_hppa_link_hash_entry *)                                \
169
   elf_link_hash_lookup (&(table)->root, (string), (create),            \
170
                         (copy), (follow)))
171
 
172
#define elf32_hppa_link_hash_traverse(table, func, info)                \
173
  (elf_link_hash_traverse                                               \
174
   (&(table)->root,                                                     \
175
    (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
176
    (info)))
177
 
178
/* Get the PA ELF linker hash table from a link_info structure.  */
179
 
180
#define elf32_hppa_hash_table(p) \
181
  ((struct elf32_hppa_link_hash_table *) ((p)->hash))
182
 
183
 
184
/* Assorted hash table functions.  */
185
 
186
/* Initialize an entry in the stub hash table.  */
187
 
188
static struct bfd_hash_entry *
189
elf32_hppa_stub_hash_newfunc (entry, table, string)
190
     struct bfd_hash_entry *entry;
191
     struct bfd_hash_table *table;
192
     const char *string;
193
{
194
  struct elf32_hppa_stub_hash_entry *ret;
195
 
196
  ret = (struct elf32_hppa_stub_hash_entry *) entry;
197
 
198
  /* Allocate the structure if it has not already been allocated by a
199
     subclass.  */
200
  if (ret == NULL)
201
    ret = ((struct elf32_hppa_stub_hash_entry *)
202
           bfd_hash_allocate (table,
203
                              sizeof (struct elf32_hppa_stub_hash_entry)));
204
  if (ret == NULL)
205
    return NULL;
206
 
207
  /* Call the allocation method of the superclass.  */
208
  ret = ((struct elf32_hppa_stub_hash_entry *)
209
         bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
210
 
211
  if (ret)
212
    {
213
      /* Initialize the local fields.  */
214
      ret->offset = 0;
215
      ret->target_value = 0;
216
      ret->target_section = NULL;
217
    }
218
 
219
  return (struct bfd_hash_entry *) ret;
220
}
221
 
222
/* Initialize a stub hash table.  */
223
 
224
static boolean
225
elf32_hppa_stub_hash_table_init (table, stub_bfd, newfunc)
226
     struct elf32_hppa_stub_hash_table *table;
227
     bfd *stub_bfd;
228
     struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
229
                                                struct bfd_hash_table *,
230
                                                const char *));
231
{
232
  table->offset = 0;
233
  table->location = 0;
234
  table->stub_bfd = stub_bfd;
235
  return (bfd_hash_table_init (&table->root, newfunc));
236
}
237
 
238
/* Create the derived linker hash table.  The PA ELF port uses the derived
239
   hash table to keep information specific to the PA ELF linker (without
240
   using static variables).  */
241
 
242
static struct bfd_link_hash_table *
243
elf32_hppa_link_hash_table_create (abfd)
244
     bfd *abfd;
245
{
246
  struct elf32_hppa_link_hash_table *ret;
247
 
248
  ret = ((struct elf32_hppa_link_hash_table *)
249
         bfd_alloc (abfd, sizeof (struct elf32_hppa_link_hash_table)));
250
  if (ret == NULL)
251
    return NULL;
252
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
253
                                      _bfd_elf_link_hash_newfunc))
254
    {
255
      bfd_release (abfd, ret);
256
      return NULL;
257
    }
258
  ret->stub_hash_table = NULL;
259
  ret->output_symbol_count = 0;
260
  ret->global_value = 0;
261
  ret->global_sym_defined = 0;
262
 
263
  return &ret->root.root;
264
}
265
 
266
/* Relocate the given INSN given the various input parameters.
267
 
268
   FIXME: endianness and sizeof (long) issues abound here.  */
269
 
270
static unsigned long
271
hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
272
                        r_addend, r_format, r_field, pcrel)
273
     bfd *abfd;
274
     asection *input_sect;
275
     unsigned long insn;
276
     unsigned long address;
277
     long sym_value;
278
     long r_addend;
279
     unsigned long r_format;
280
     unsigned long r_field;
281
     unsigned long pcrel;
282
{
283
  unsigned char opcode = get_opcode (insn);
284
  long constant_value;
285
 
286
  switch (opcode)
287
    {
288
    case LDO:
289
    case LDB:
290
    case LDH:
291
    case LDW:
292
    case LDWM:
293
    case STB:
294
    case STH:
295
    case STW:
296
    case STWM:
297
    case COMICLR:
298
    case SUBI:
299
    case ADDIT:
300
    case ADDI:
301
    case LDIL:
302
    case ADDIL:
303
      constant_value = HPPA_R_CONSTANT (r_addend);
304
 
305
      if (pcrel)
306
        sym_value -= address;
307
 
308
      sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
309
      return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
310
 
311
    case BL:
312
    case BE:
313
    case BLE:
314
      /* XXX computing constant_value is not needed??? */
315
      constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
316
                                    (insn & 0x00001ffc) >> 2,
317
                                    insn & 1);
318
 
319
      constant_value = (constant_value << 15) >> 15;
320
      if (pcrel)
321
        {
322
          sym_value -=
323
            address + input_sect->output_offset
324
            + input_sect->output_section->vma;
325
          sym_value = hppa_field_adjust (sym_value, -8, r_field);
326
        }
327
      else
328
        sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
329
 
330
      return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
331
 
332
    default:
333
      if (opcode == 0)
334
        {
335
          constant_value = HPPA_R_CONSTANT (r_addend);
336
 
337
          if (pcrel)
338
            sym_value -= address;
339
 
340
          return hppa_field_adjust (sym_value, constant_value, r_field);
341
        }
342
      else
343
        abort ();
344
    }
345
}
346
 
347
/* Relocate an HPPA ELF section.  */
348
 
349
static boolean
350
elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
351
                             contents, relocs, local_syms, local_sections)
352
     bfd *output_bfd;
353
     struct bfd_link_info *info;
354
     bfd *input_bfd;
355
     asection *input_section;
356
     bfd_byte *contents;
357
     Elf_Internal_Rela *relocs;
358
     Elf_Internal_Sym *local_syms;
359
     asection **local_sections;
360
{
361
  Elf_Internal_Shdr *symtab_hdr;
362
  Elf_Internal_Rela *rel;
363
  Elf_Internal_Rela *relend;
364
 
365
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
366
 
367
  rel = relocs;
368
  relend = relocs + input_section->reloc_count;
369
  for (; rel < relend; rel++)
370
    {
371
      int r_type;
372
      reloc_howto_type *howto;
373
      unsigned long r_symndx;
374
      struct elf_link_hash_entry *h;
375
      Elf_Internal_Sym *sym;
376
      asection *sym_sec;
377
      bfd_vma relocation;
378
      bfd_reloc_status_type r;
379
      const char *sym_name;
380
 
381
      r_type = ELF32_R_TYPE (rel->r_info);
382
      if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
383
        {
384
          bfd_set_error (bfd_error_bad_value);
385
          return false;
386
        }
387
      howto = elf_hppa_howto_table + r_type;
388
 
389
      r_symndx = ELF32_R_SYM (rel->r_info);
390
 
391
      if (info->relocateable)
392
        {
393
          /* This is a relocateable link.  We don't have to change
394
             anything, unless the reloc is against a section symbol,
395
             in which case we have to adjust according to where the
396
             section symbol winds up in the output section.  */
397
          if (r_symndx < symtab_hdr->sh_info)
398
            {
399
              sym = local_syms + r_symndx;
400
              if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
401
                {
402
                  sym_sec = local_sections[r_symndx];
403
                  rel->r_addend += sym_sec->output_offset;
404
                }
405
            }
406
 
407
          continue;
408
        }
409
 
410
      /* This is a final link.  */
411
      h = NULL;
412
      sym = NULL;
413
      sym_sec = NULL;
414
      if (r_symndx < symtab_hdr->sh_info)
415
        {
416
          sym = local_syms + r_symndx;
417
          sym_sec = local_sections[r_symndx];
418
          relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
419
                           ? 0 : sym->st_value)
420
                         + sym_sec->output_offset
421
                         + sym_sec->output_section->vma);
422
        }
423
      else
424
        {
425
          long indx;
426
 
427
          indx = r_symndx - symtab_hdr->sh_info;
428
          h = elf_sym_hashes (input_bfd)[indx];
429
          while (h->root.type == bfd_link_hash_indirect
430
                 || h->root.type == bfd_link_hash_warning)
431
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
432
          if (h->root.type == bfd_link_hash_defined
433
              || h->root.type == bfd_link_hash_defweak)
434
            {
435
              sym_sec = h->root.u.def.section;
436
              relocation = (h->root.u.def.value
437
                            + sym_sec->output_offset
438
                            + sym_sec->output_section->vma);
439
            }
440
          else if (h->root.type == bfd_link_hash_undefweak)
441
            relocation = 0;
442
          else
443
            {
444
              if (!((*info->callbacks->undefined_symbol)
445
                    (info, h->root.root.string, input_bfd,
446
                     input_section, rel->r_offset, true)))
447
                return false;
448
              break;
449
            }
450
        }
451
 
452
      if (h != NULL)
453
        sym_name = h->root.root.string;
454
      else
455
        {
456
          sym_name = bfd_elf_string_from_elf_section (input_bfd,
457
                                                      symtab_hdr->sh_link,
458
                                                      sym->st_name);
459
          if (sym_name == NULL)
460
            return false;
461
          if (*sym_name == '\0')
462
            sym_name = bfd_section_name (input_bfd, sym_sec);
463
        }
464
 
465
      r = elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
466
                                              input_section, contents,
467
                                              rel->r_offset, relocation,
468
                                              rel->r_addend, info, sym_sec,
469
                                              sym_name, h == NULL);
470
 
471
      if (r != bfd_reloc_ok)
472
        {
473
          switch (r)
474
            {
475
            /* This can happen for DP relative relocs if $global$ is
476
               undefined.  This is a panic situation so we don't try
477
               to continue.  */
478
            case bfd_reloc_undefined:
479
            case bfd_reloc_notsupported:
480
              if (!((*info->callbacks->undefined_symbol)
481
                    (info, "$global$", input_bfd,
482
                     input_section, rel->r_offset, true)))
483
                return false;
484
              return false;
485
            case bfd_reloc_dangerous:
486
              {
487
                /* We use this return value to indicate that we performed
488
                   a "dangerous" relocation.  This doesn't mean we did
489
                   the wrong thing, it just means there may be some cleanup
490
                   that needs to be done here.
491
 
492
                   In particular we had to swap the last call insn and its
493
                   delay slot.  If the delay slot insn needed a relocation,
494
                   then we'll need to adjust the next relocation entry's
495
                   offset to account for the fact that the insn moved.
496
 
497
                   This hair wouldn't be necessary if we inserted stubs
498
                   between procedures and used a "bl" to get to the stub.  */
499
                if (rel != relend)
500
                  {
501
                    Elf_Internal_Rela *next_rel = rel + 1;
502
 
503
                    if (rel->r_offset + 4 == next_rel->r_offset)
504
                      next_rel->r_offset -= 4;
505
                  }
506
                break;
507
              }
508
            default:
509
            case bfd_reloc_outofrange:
510
            case bfd_reloc_overflow:
511
              {
512
                if (!((*info->callbacks->reloc_overflow)
513
                      (info, sym_name, howto->name, (bfd_vma) 0,
514
                        input_bfd, input_section, rel->r_offset)))
515
                  return false;
516
              }
517
              break;
518
            }
519
        }
520
    }
521
 
522
  return true;
523
}
524
 
525
/* Actually perform a relocation as part of a final link.  This can get
526
   rather hairy when linker stubs are needed.  */
527
 
528
static bfd_reloc_status_type
529
elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
530
                                    input_section, contents, offset, value,
531
                                    addend, info, sym_sec, sym_name, is_local)
532
     reloc_howto_type *howto;
533
     bfd *input_bfd;
534
     bfd *output_bfd ATTRIBUTE_UNUSED;
535
     asection *input_section;
536
     bfd_byte *contents;
537
     bfd_vma offset;
538
     bfd_vma value;
539
     bfd_vma addend;
540
     struct bfd_link_info *info;
541
     asection *sym_sec;
542
     const char *sym_name;
543
     int is_local;
544
{
545
  unsigned long insn;
546
  unsigned long r_type = howto->type;
547
  unsigned long r_format = howto->bitsize;
548
  unsigned long r_field = e_fsel;
549
  bfd_byte *hit_data = contents + offset;
550
  boolean r_pcrel = howto->pc_relative;
551
 
552
  insn = bfd_get_32 (input_bfd, hit_data);
553
 
554
  /* Make sure we have a value for $global$.  FIXME isn't this effectively
555
     just like the gp pointer on MIPS?  Can we use those routines for this
556
     purpose?  */
557
  if (!elf32_hppa_hash_table (info)->global_sym_defined)
558
    {
559
      struct elf_link_hash_entry *h;
560
      asection *sec;
561
 
562
      h = elf_link_hash_lookup (elf_hash_table (info), "$global$", false,
563
                                 false, false);
564
 
565
      /* If there isn't a $global$, then we're in deep trouble.  */
566
      if (h == NULL)
567
        return bfd_reloc_notsupported;
568
 
569
      /* If $global$ isn't a defined symbol, then we're still in deep
570
         trouble.  */
571
      if (h->root.type != bfd_link_hash_defined)
572
        return bfd_reloc_undefined;
573
 
574
      sec = h->root.u.def.section;
575
      elf32_hppa_hash_table (info)->global_value = (h->root.u.def.value
576
                                                    + sec->output_section->vma
577
                                                    + sec->output_offset);
578
      elf32_hppa_hash_table (info)->global_sym_defined = 1;
579
    }
580
 
581
  switch (r_type)
582
    {
583
    case R_PARISC_NONE:
584
      break;
585
 
586
    case R_PARISC_DIR32:
587
    case R_PARISC_DIR17F:
588
    case R_PARISC_PCREL17C:
589
      r_field = e_fsel;
590
      goto do_basic_type_1;
591
    case R_PARISC_DIR21L:
592
    case R_PARISC_PCREL21L:
593
      r_field = e_lrsel;
594
      goto do_basic_type_1;
595
    case R_PARISC_DIR17R:
596
    case R_PARISC_PCREL17R:
597
    case R_PARISC_DIR14R:
598
    case R_PARISC_PCREL14R:
599
      r_field = e_rrsel;
600
      goto do_basic_type_1;
601
 
602
    /* For all the DP relative relocations, we need to examine the symbol's
603
       section.  If it's a code section, then "data pointer relative" makes
604
       no sense.  In that case we don't adjust the "value", and for 21 bit
605
       addil instructions, we change the source addend register from %dp to
606
       %r0.  */
607
    case R_PARISC_DPREL21L:
608
      r_field = e_lrsel;
609
      if (sym_sec->flags & SEC_CODE)
610
        {
611
          if ((insn & 0xfc000000) >> 26 == 0xa
612
               && (insn & 0x03e00000) >> 21 == 0x1b)
613
            insn &= ~0x03e00000;
614
        }
615
      else
616
        value -= elf32_hppa_hash_table (info)->global_value;
617
      goto do_basic_type_1;
618
    case R_PARISC_DPREL14R:
619
      r_field = e_rrsel;
620
      if ((sym_sec->flags & SEC_CODE) == 0)
621
        value -= elf32_hppa_hash_table (info)->global_value;
622
      goto do_basic_type_1;
623
    case R_PARISC_DPREL14F:
624
      r_field = e_fsel;
625
      if ((sym_sec->flags & SEC_CODE) == 0)
626
        value -= elf32_hppa_hash_table (info)->global_value;
627
      goto do_basic_type_1;
628
 
629
    /* These cases are separate as they may involve a lot more work
630
       to deal with linker stubs.  */
631
    case R_PARISC_PLABEL32:
632
    case R_PARISC_PLABEL21L:
633
    case R_PARISC_PLABEL14R:
634
    case R_PARISC_PCREL17F:
635
      {
636
        bfd_vma location;
637
        unsigned int len;
638
        char *new_name, *stub_name;
639
 
640
        /* Get the field selector right.  We'll need it in a minute.  */
641
        if (r_type == R_PARISC_PCREL17F
642
            || r_type == R_PARISC_PLABEL32)
643
          r_field = e_fsel;
644
        else if (r_type == R_PARISC_PLABEL21L)
645
          r_field = e_lrsel;
646
        else if (r_type == R_PARISC_PLABEL14R)
647
          r_field = e_rrsel;
648
 
649
        /* Find out where we are and where we're going.  */
650
        location = (offset +
651
                    input_section->output_offset +
652
                    input_section->output_section->vma);
653
 
654
        len = strlen (sym_name) + 1;
655
        if (is_local)
656
          len += 9;
657
        new_name = bfd_malloc (len);
658
        if (!new_name)
659
          return bfd_reloc_notsupported;
660
        strcpy (new_name, sym_name);
661
 
662
        /* Local symbols have unique IDs.  */
663
        if (is_local)
664
          sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
665
 
666
        /* Any kind of linker stub needed?  */
667
        if (((int)(value - location) > 0x3ffff)
668
            || ((int)(value - location) < (int)0xfffc0000))
669
          {
670
            struct elf32_hppa_stub_hash_table *stub_hash_table;
671
            struct elf32_hppa_stub_hash_entry *stub_hash;
672
            asection *stub_section;
673
 
674
            /* Build a name for the stub.  */
675
 
676
            len = strlen (new_name);
677
            len += 23;
678
            stub_name = bfd_malloc (len);
679
            if (!stub_name)
680
              return bfd_reloc_notsupported;
681
            elf32_hppa_name_of_stub (location, value, stub_name);
682
            strcat (stub_name, new_name);
683
            free (new_name);
684
 
685
            stub_hash_table = elf32_hppa_hash_table (info)->stub_hash_table;
686
 
687
            stub_hash
688
              = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
689
                                             false, false);
690
 
691
            /* We're done with that name.  */
692
            free (stub_name);
693
 
694
            /* The stub BFD only has one section.  */
695
            stub_section = stub_hash_table->stub_bfd->sections;
696
 
697
            if (stub_hash != NULL)
698
              {
699
                if (r_type == R_PARISC_PCREL17F)
700
                  {
701
                    unsigned long delay_insn;
702
                    unsigned int opcode, rtn_reg, ldo_target_reg, ldo_src_reg;
703
 
704
                    /* We'll need to peek at the next insn.  */
705
                    delay_insn = bfd_get_32 (input_bfd, hit_data + 4);
706
                    opcode = get_opcode (delay_insn);
707
 
708
                    /* We also need to know the return register for this
709
                       call.  */
710
                    rtn_reg = (insn & 0x03e00000) >> 21;
711
 
712
                    ldo_src_reg = (delay_insn & 0x03e00000) >> 21;
713
                    ldo_target_reg = (delay_insn & 0x001f0000) >> 16;
714
 
715
                    /* Munge up the value and other parameters for
716
                       hppa_elf_relocate_insn.  */
717
 
718
                    value = (stub_hash->offset
719
                             + stub_section->output_offset
720
                             + stub_section->output_section->vma);
721
 
722
                    r_format = 17;
723
                    r_field = e_fsel;
724
                    r_pcrel = 0;
725
                    addend = 0;
726
 
727
                    /* We need to peek at the delay insn and determine if
728
                       we'll need to swap the branch and its delay insn.  */
729
                    if ((insn & 2)
730
                        || (opcode == LDO
731
                            && ldo_target_reg == rtn_reg)
732
                        || (delay_insn == 0x08000240))
733
                      {
734
                        /* No need to swap the branch and its delay slot, but
735
                           we do need to make sure to jump past the return
736
                           pointer update in the stub.  */
737
                        value += 4;
738
 
739
                        /* If the delay insn does a return pointer adjustment,
740
                           then we have to make sure it stays valid.  */
741
                        if (opcode == LDO
742
                            && ldo_target_reg == rtn_reg)
743
                          {
744
                            delay_insn &= 0xfc00ffff;
745
                            delay_insn |= ((31 << 21) | (31 << 16));
746
                            bfd_put_32 (input_bfd, delay_insn, hit_data + 4);
747
                          }
748
                        /* Use a BLE to reach the stub.  */
749
                        insn = BLE_SR4_R0;
750
                      }
751
                    else
752
                      {
753
                        /* Wonderful, we have to swap the call insn and its
754
                           delay slot.  */
755
                        bfd_put_32 (input_bfd, delay_insn, hit_data);
756
                        /* Use a BLE,n to reach the stub.  */
757
                        insn = (BLE_SR4_R0 | 0x2);
758
                        bfd_put_32 (input_bfd, insn, hit_data + 4);
759
                        insn = hppa_elf_relocate_insn (input_bfd,
760
                                                       input_section,
761
                                                       insn, offset + 4,
762
                                                       value, addend,
763
                                                       r_format, r_field,
764
                                                       r_pcrel);
765
                        /* Update the instruction word.  */
766
                        bfd_put_32 (input_bfd, insn, hit_data + 4);
767
                        return bfd_reloc_dangerous;
768
                      }
769
                  }
770
                else
771
                  return bfd_reloc_notsupported;
772
              }
773
          }
774
        goto do_basic_type_1;
775
      }
776
 
777
do_basic_type_1:
778
      insn = hppa_elf_relocate_insn (input_bfd, input_section, insn,
779
                                     offset, value, addend, r_format,
780
                                     r_field, r_pcrel);
781
      break;
782
 
783
    /* Something we don't know how to handle.  */
784
    default:
785
      return bfd_reloc_notsupported;
786
    }
787
 
788
  /* Update the instruction word.  */
789
  bfd_put_32 (input_bfd, insn, hit_data);
790
  return (bfd_reloc_ok);
791
}
792
 
793
/* Undo the generic ELF code's subtraction of section->vma from the
794
   value of each external symbol.  */
795
 
796
static boolean
797
elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
798
     bfd *abfd ATTRIBUTE_UNUSED;
799
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
800
     const Elf_Internal_Sym *sym ATTRIBUTE_UNUSED;
801
     const char **namep ATTRIBUTE_UNUSED;
802
     flagword *flagsp ATTRIBUTE_UNUSED;
803
     asection **secp;
804
     bfd_vma *valp;
805
{
806
  *valp += (*secp)->vma;
807
  return true;
808
}
809
 
810
/* Determine the name of the stub needed to perform a call assuming the
811
   argument relocation bits for caller and callee are in CALLER and CALLEE
812
   for a call from LOCATION to DESTINATION.  Copy the name into STUB_NAME.  */
813
 
814
static void
815
elf32_hppa_name_of_stub (location, destination, stub_name)
816
     bfd_vma location ATTRIBUTE_UNUSED;
817
     bfd_vma destination ATTRIBUTE_UNUSED;
818
     char *stub_name;
819
{
820
  strcpy (stub_name, "_____long_branch_stub_");
821
}
822
 
823
/* Compute the size of the stub needed to call from LOCATION to DESTINATION
824
   (a function named SYM_NAME), with argument relocation bits CALLER and
825
   CALLEE.  Return zero if no stub is needed to perform such a call.  */
826
 
827
static unsigned int
828
elf32_hppa_size_of_stub (location, destination, sym_name)
829
     bfd_vma location, destination;
830
     const char *sym_name;
831
{
832
  /* Determine if a long branch stub is needed.  */
833
  if (!(((int)(location - destination) > 0x3ffff)
834
        || ((int)(location - destination) < (int)0xfffc0000)))
835
    return 0;
836
 
837
  if (!strncmp ("$$", sym_name, 2)
838
      && strcmp ("$$dyncall", sym_name))
839
    return 12;
840
  else
841
    return 16;
842
}
843
 
844
/* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
845
   IN_ARGS contains the stub BFD and link info pointers.  */
846
 
847
static boolean
848
elf32_hppa_build_one_stub (gen_entry, in_args)
849
     struct bfd_hash_entry *gen_entry;
850
     PTR in_args;
851
{
852
  void **args = (void **)in_args;
853
  bfd *stub_bfd = (bfd *)args[0];
854
  struct bfd_link_info *info = (struct bfd_link_info *)args[1];
855
  struct elf32_hppa_stub_hash_entry *entry;
856
  struct elf32_hppa_stub_hash_table *stub_hash_table;
857
  bfd_byte *loc;
858
  symvalue sym_value;
859
  const char *sym_name;
860
 
861
  /* Initialize pointers to the stub hash table, the particular entry we
862
     are building a stub for, and where (in memory) we should place the stub
863
     instructions.  */
864
  entry = (struct elf32_hppa_stub_hash_entry *)gen_entry;
865
  stub_hash_table = elf32_hppa_hash_table(info)->stub_hash_table;
866
  loc = stub_hash_table->location;
867
 
868
  /* Make a note of the offset within the stubs for this entry.  */
869
  entry->offset = stub_hash_table->offset;
870
 
871
  /* The symbol's name starts at offset 22.  */
872
  sym_name = entry->root.string + 22;
873
 
874
  sym_value = (entry->target_value
875
               + entry->target_section->output_offset
876
               + entry->target_section->output_section->vma);
877
 
878
  if (1)
879
    {
880
      /* Create one of two variant long branch stubs.  One for $$dyncall and
881
         normal calls, the other for calls to millicode.  */
882
      unsigned long insn;
883
      int millicode_call = 0;
884
 
885
      if (!strncmp ("$$", sym_name, 2) && strcmp ("$$dyncall", sym_name))
886
        millicode_call = 1;
887
 
888
      /* First the return pointer adjustment.  Depending on exact calling
889
         sequence this instruction may be skipped.  */
890
      bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
891
 
892
      /* The next two instructions are the long branch itself.  A long branch
893
         is formed with "ldil" loading the upper bits of the target address
894
         into a register, then branching with "be" which adds in the lower bits.
895
         Long branches to millicode nullify the delay slot of the "be".  */
896
      insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
897
                                hppa_field_adjust (sym_value, 0, e_lrsel), 21);
898
      bfd_put_32 (stub_bfd, insn, loc + 4);
899
      insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1 | (millicode_call ? 2 : 0),
900
                                hppa_field_adjust (sym_value, 0, e_rrsel) >> 2,
901
                                17);
902
      bfd_put_32 (stub_bfd, insn, loc + 8);
903
 
904
      if (!millicode_call)
905
        {
906
          /* The sequence to call this stub places the return pointer into %r31,
907
             the final target expects the return pointer in %r2, so copy the
908
              return pointer into the proper register.  */
909
          bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 12);
910
 
911
          /* Update the location and offsets.  */
912
          stub_hash_table->location += 16;
913
          stub_hash_table->offset += 16;
914
        }
915
      else
916
        {
917
          /* Update the location and offsets.  */
918
          stub_hash_table->location += 12;
919
          stub_hash_table->offset += 12;
920
        }
921
 
922
    }
923
  return true;
924
}
925
 
926
/* External entry points for sizing and building linker stubs.  */
927
 
928
/* Build all the stubs associated with the current output file.  The
929
   stubs are kept in a hash table attached to the main linker hash
930
   table.  This is called via hppaelf_finish in the linker.  */
931
 
932
boolean
933
elf32_hppa_build_stubs (stub_bfd, info)
934
     bfd *stub_bfd;
935
     struct bfd_link_info *info;
936
{
937
  /* The stub BFD only has one section.  */
938
  asection *stub_sec = stub_bfd->sections;
939
  struct elf32_hppa_stub_hash_table *table;
940
  unsigned int size;
941
  void *args[2];
942
 
943
  /* So we can pass both the BFD for the stubs and the link info
944
     structure to the routine which actually builds stubs.  */
945
  args[0] = stub_bfd;
946
  args[1] = info;
947
 
948
  /* Allocate memory to hold the linker stubs.  */
949
  size = bfd_section_size (stub_bfd, stub_sec);
950
  stub_sec->contents = (unsigned char *) bfd_zalloc (stub_bfd, size);
951
  if (stub_sec->contents == NULL)
952
    return false;
953
  table = elf32_hppa_hash_table(info)->stub_hash_table;
954
  table->location = stub_sec->contents;
955
 
956
  /* Build the stubs as directed by the stub hash table.  */
957
  elf32_hppa_stub_hash_traverse (table, elf32_hppa_build_one_stub, args);
958
 
959
  return true;
960
}
961
 
962
/* Determine and set the size of the stub section for a final link.
963
 
964
   The basic idea here is to examine all the relocations looking for
965
   PC-relative calls to a target that is unreachable with a "bl"
966
   instruction or calls where the caller and callee disagree on the
967
   location of their arguments or return value.  */
968
 
969
boolean
970
elf32_hppa_size_stubs (stub_bfd, output_bfd, link_info)
971
     bfd *stub_bfd;
972
     bfd *output_bfd ATTRIBUTE_UNUSED;
973
     struct bfd_link_info *link_info;
974
{
975
  bfd *input_bfd;
976
  asection *section, *stub_sec = 0;
977
  Elf_Internal_Shdr *symtab_hdr;
978
  Elf_Internal_Sym *local_syms, **all_local_syms;
979
  unsigned int i, index, bfd_count = 0;
980
  struct elf32_hppa_stub_hash_table *stub_hash_table = 0;
981
 
982
  /* Create and initialize the stub hash table.  */
983
  stub_hash_table = ((struct elf32_hppa_stub_hash_table *)
984
                     bfd_malloc (sizeof (struct elf32_hppa_stub_hash_table)));
985
  if (!stub_hash_table)
986
    goto error_return;
987
 
988
  if (!elf32_hppa_stub_hash_table_init (stub_hash_table, stub_bfd,
989
                                        elf32_hppa_stub_hash_newfunc))
990
    goto error_return;
991
 
992
  /* Attach the hash tables to the main hash table.  */
993
  elf32_hppa_hash_table(link_info)->stub_hash_table = stub_hash_table;
994
 
995
  /* Count the number of input BFDs.  */
996
  for (input_bfd = link_info->input_bfds;
997
       input_bfd != NULL;
998
       input_bfd = input_bfd->link_next)
999
     bfd_count++;
1000
 
1001
  /* Magic as we know the stub bfd only has one section.  */
1002
  stub_sec = stub_bfd->sections;
1003
 
1004
  /* If generating a relocateable output file, then we don't
1005
     have to examine the relocs.  */
1006
  if (link_info->relocateable)
1007
    {
1008
      for (i = 0; i < bfd_count; i++)
1009
        if (all_local_syms[i])
1010
          free (all_local_syms[i]);
1011
      free (all_local_syms);
1012
      return true;
1013
    }
1014
 
1015
  /* Now that we have argument location information for all the global
1016
     functions we can start looking for stubs.  */
1017
  for (input_bfd = link_info->input_bfds, index = 0;
1018
       input_bfd != NULL;
1019
       input_bfd = input_bfd->link_next, index++)
1020
    {
1021
      /* We'll need the symbol table in a second.  */
1022
      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1023
      if (symtab_hdr->sh_info == 0)
1024
        continue;
1025
 
1026
      local_syms = all_local_syms[index];
1027
 
1028
      /* Walk over each section attached to the input bfd.  */
1029
      for (section = input_bfd->sections;
1030
           section != NULL;
1031
           section = section->next)
1032
        {
1033
          Elf_Internal_Shdr *input_rel_hdr;
1034
          Elf32_External_Rela *external_relocs, *erelaend, *erela;
1035
          Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1036
 
1037
          /* If there aren't any relocs, then there's nothing to do.  */
1038
          if ((section->flags & SEC_RELOC) == 0
1039
              || section->reloc_count == 0)
1040
            continue;
1041
 
1042
          /* Allocate space for the external relocations.  */
1043
          external_relocs
1044
            = ((Elf32_External_Rela *)
1045
               bfd_malloc (section->reloc_count
1046
                           * sizeof (Elf32_External_Rela)));
1047
          if (external_relocs == NULL)
1048
            {
1049
              for (i = 0; i < bfd_count; i++)
1050
                if (all_local_syms[i])
1051
                  free (all_local_syms[i]);
1052
              free (all_local_syms);
1053
              goto error_return;
1054
            }
1055
 
1056
          /* Likewise for the internal relocations.  */
1057
          internal_relocs
1058
            = ((Elf_Internal_Rela *)
1059
               bfd_malloc (section->reloc_count * sizeof (Elf_Internal_Rela)));
1060
          if (internal_relocs == NULL)
1061
            {
1062
              free (external_relocs);
1063
              for (i = 0; i < bfd_count; i++)
1064
                if (all_local_syms[i])
1065
                  free (all_local_syms[i]);
1066
              free (all_local_syms);
1067
              goto error_return;
1068
            }
1069
 
1070
          /* Read in the external relocs.  */
1071
          input_rel_hdr = &elf_section_data (section)->rel_hdr;
1072
          if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0
1073
              || bfd_read (external_relocs, 1, input_rel_hdr->sh_size,
1074
                           input_bfd) != input_rel_hdr->sh_size)
1075
            {
1076
              free (external_relocs);
1077
              free (internal_relocs);
1078
              for (i = 0; i < bfd_count; i++)
1079
                if (all_local_syms[i])
1080
                  free (all_local_syms[i]);
1081
              free (all_local_syms);
1082
              goto error_return;
1083
            }
1084
 
1085
          /* Swap in the relocs.  */
1086
          erela = external_relocs;
1087
          erelaend = erela + section->reloc_count;
1088
          irela = internal_relocs;
1089
          for (; erela < erelaend; erela++, irela++)
1090
            bfd_elf32_swap_reloca_in (input_bfd, erela, irela);
1091
 
1092
          /* We're done with the external relocs, free them.  */
1093
          free (external_relocs);
1094
 
1095
          /* Now examine each relocation.  */
1096
          irela = internal_relocs;
1097
          irelaend = irela + section->reloc_count;
1098
          for (; irela < irelaend; irela++)
1099
            {
1100
              long r_type, size_of_stub;
1101
              unsigned long r_index;
1102
              struct elf_link_hash_entry *hash;
1103
              struct elf32_hppa_stub_hash_entry *stub_hash;
1104
              Elf_Internal_Sym *sym;
1105
              asection *sym_sec;
1106
              const char *sym_name;
1107
              symvalue sym_value;
1108
              bfd_vma location, destination;
1109
              char *new_name = NULL;
1110
 
1111
              r_type = ELF32_R_TYPE (irela->r_info);
1112
              r_index = ELF32_R_SYM (irela->r_info);
1113
 
1114
              if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1115
                {
1116
                  bfd_set_error (bfd_error_bad_value);
1117
                  free (internal_relocs);
1118
                  for (i = 0; i < bfd_count; i++)
1119
                    if (all_local_syms[i])
1120
                      free (all_local_syms[i]);
1121
                  free (all_local_syms);
1122
                  goto error_return;
1123
                }
1124
 
1125
              /* Only look for stubs on call instructions or plabel
1126
                 references.  */
1127
              if (r_type != R_PARISC_PCREL17F
1128
                  && r_type != R_PARISC_PLABEL32
1129
                  && r_type != R_PARISC_PLABEL21L
1130
                  && r_type != R_PARISC_PLABEL14R)
1131
                continue;
1132
 
1133
              /* Now determine the call target, its name, value, section
1134
                 and argument relocation bits.  */
1135
              hash = NULL;
1136
              sym = NULL;
1137
              sym_sec = NULL;
1138
              if (r_index < symtab_hdr->sh_info)
1139
                {
1140
                  /* It's a local symbol.  */
1141
                  Elf_Internal_Shdr *hdr;
1142
 
1143
                  sym = local_syms + r_index;
1144
                  hdr = elf_elfsections (input_bfd)[sym->st_shndx];
1145
                  sym_sec = hdr->bfd_section;
1146
                  sym_name = bfd_elf_string_from_elf_section (input_bfd,
1147
                                                              symtab_hdr->sh_link,
1148
                                                              sym->st_name);
1149
                  sym_value = (ELF_ST_TYPE (sym->st_info) == STT_SECTION
1150
                               ? 0 : sym->st_value);
1151
                  destination = (sym_value
1152
                                 + sym_sec->output_offset
1153
                                 + sym_sec->output_section->vma);
1154
 
1155
                  /* Tack on an ID so we can uniquely identify this local
1156
                     symbol in the stub or arg info hash tables.  */
1157
                  new_name = bfd_malloc (strlen (sym_name) + 10);
1158
                  if (new_name == 0)
1159
                    {
1160
                      free (internal_relocs);
1161
                      for (i = 0; i < bfd_count; i++)
1162
                        if (all_local_syms[i])
1163
                          free (all_local_syms[i]);
1164
                      free (all_local_syms);
1165
                      goto error_return;
1166
                    }
1167
                  sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
1168
                  sym_name = new_name;
1169
                }
1170
              else
1171
                {
1172
                  /* It's an external symbol.  */
1173
                  long index;
1174
 
1175
                  index = r_index - symtab_hdr->sh_info;
1176
                  hash = elf_sym_hashes (input_bfd)[index];
1177
                  if (hash->root.type == bfd_link_hash_defined
1178
                      || hash->root.type == bfd_link_hash_defweak)
1179
                    {
1180
                      sym_sec = hash->root.u.def.section;
1181
                      sym_name = hash->root.root.string;
1182
                      sym_value = hash->root.u.def.value;
1183
                      destination = (sym_value
1184
                                     + sym_sec->output_offset
1185
                                     + sym_sec->output_section->vma);
1186
                    }
1187
                  else
1188
                    {
1189
                      bfd_set_error (bfd_error_bad_value);
1190
                      free (internal_relocs);
1191
                      for (i = 0; i < bfd_count; i++)
1192
                        if (all_local_syms[i])
1193
                          free (all_local_syms[i]);
1194
                      free (all_local_syms);
1195
                      goto error_return;
1196
                    }
1197
                }
1198
 
1199
              /* Now determine where the call point is.  */
1200
              location = (section->output_offset
1201
                          + section->output_section->vma
1202
                          + irela->r_offset);
1203
 
1204
              /* We only care about the destination for PCREL function
1205
                 calls (eg. we don't care for PLABELS).  */
1206
              if (r_type != R_PARISC_PCREL17F)
1207
                location = destination;
1208
 
1209
              /* Determine what (if any) linker stub is needed and its
1210
                 size (in bytes).  */
1211
              size_of_stub = elf32_hppa_size_of_stub (location,
1212
                                                      destination,
1213
                                                      sym_name);
1214
              if (size_of_stub != 0)
1215
                {
1216
                  char *stub_name;
1217
                  unsigned int len;
1218
 
1219
                  /* Get the name of this stub.  */
1220
                  len = strlen (sym_name);
1221
                  len += 23;
1222
 
1223
                  stub_name = bfd_malloc (len);
1224
                  if (!stub_name)
1225
                    {
1226
                      /* Because sym_name was mallocd above for local
1227
                         symbols.  */
1228
                      if (r_index < symtab_hdr->sh_info)
1229
                        free (new_name);
1230
 
1231
                      free (internal_relocs);
1232
                      for (i = 0; i < bfd_count; i++)
1233
                        if (all_local_syms[i])
1234
                          free (all_local_syms[i]);
1235
                      free (all_local_syms);
1236
                      goto error_return;
1237
                    }
1238
                  elf32_hppa_name_of_stub (location, destination, stub_name);
1239
                  strcat (stub_name + 22, sym_name);
1240
 
1241
                  /* Because sym_name was malloced above for local symbols.  */
1242
                  if (r_index < symtab_hdr->sh_info)
1243
                    free (new_name);
1244
 
1245
                  stub_hash
1246
                    = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
1247
                                                   false, false);
1248
                  if (stub_hash != NULL)
1249
                    {
1250
                      /* The proper stub has already been created, nothing
1251
                         else to do.  */
1252
                      free (stub_name);
1253
                    }
1254
                  else
1255
                    {
1256
                      bfd_set_section_size (stub_bfd, stub_sec,
1257
                                            (bfd_section_size (stub_bfd,
1258
                                                               stub_sec)
1259
                                             + size_of_stub));
1260
 
1261
                      /* Enter this entry into the linker stub hash table.  */
1262
                      stub_hash
1263
                        = elf32_hppa_stub_hash_lookup (stub_hash_table,
1264
                                                       stub_name, true, true);
1265
                      if (stub_hash == NULL)
1266
                        {
1267
                          free (stub_name);
1268
                          free (internal_relocs);
1269
                          for (i = 0; i < bfd_count; i++)
1270
                            if (all_local_syms[i])
1271
                              free (all_local_syms[i]);
1272
                          free (all_local_syms);
1273
                          goto error_return;
1274
                        }
1275
 
1276
                      /* We'll need these to determine the address that the
1277
                         stub will branch to.  */
1278
                      stub_hash->target_value = sym_value;
1279
                      stub_hash->target_section = sym_sec;
1280
                    }
1281
                  free (stub_name);
1282
                }
1283
            }
1284
          /* We're done with the internal relocs, free them.  */
1285
          free (internal_relocs);
1286
        }
1287
    }
1288
  /* We're done with the local symbols, free them.  */
1289
  for (i = 0; i < bfd_count; i++)
1290
    if (all_local_syms[i])
1291
      free (all_local_syms[i]);
1292
  free (all_local_syms);
1293
  return true;
1294
 
1295
error_return:
1296
  /* Return gracefully, avoiding dangling references to the hash tables.  */
1297
  if (stub_hash_table)
1298
    {
1299
      elf32_hppa_hash_table(link_info)->stub_hash_table = NULL;
1300
      free (stub_hash_table);
1301
    }
1302
  /* Set the size of the stub section to zero since we're never going
1303
     to create them.   Avoids losing when we try to get its contents
1304
     too.  */
1305
  bfd_set_section_size (stub_bfd, stub_sec, 0);
1306
  return false;
1307
}
1308
 
1309
/* Misc BFD support code.  */
1310
#define bfd_elf32_bfd_reloc_type_lookup         elf_hppa_reloc_type_lookup
1311
#define bfd_elf32_bfd_is_local_label_name       elf_hppa_is_local_label_name
1312
#define elf_info_to_howto                       elf_hppa_info_to_howto
1313
#define elf_info_to_howto_rel                   elf_hppa_info_to_howto_rel
1314
 
1315
/* Stuff for the BFD linker.  */
1316
#define elf_backend_relocate_section            elf32_hppa_relocate_section
1317
#define elf_backend_add_symbol_hook             elf32_hppa_add_symbol_hook
1318
#define bfd_elf32_bfd_link_hash_table_create \
1319
  elf32_hppa_link_hash_table_create
1320
#define elf_backend_fake_sections               elf_hppa_fake_sections
1321
 
1322
 
1323
#define TARGET_BIG_SYM          bfd_elf32_hppa_vec
1324
#define TARGET_BIG_NAME         "elf32-hppa"
1325
#define ELF_ARCH                bfd_arch_hppa
1326
#define ELF_MACHINE_CODE        EM_PARISC
1327
#define ELF_MAXPAGESIZE         0x1000
1328
 
1329
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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