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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [elf-m10200.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Matsushita 10200 specific support for 32-bit ELF
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001
3
   Free Software Foundation, Inc.
4
 
5
This file is part of BFD, the Binary File Descriptor library.
6
 
7
This program is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 2 of the License, or
10
(at your option) any later version.
11
 
12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
 
21
#include "bfd.h"
22
#include "sysdep.h"
23
#include "libbfd.h"
24
#include "elf-bfd.h"
25
 
26
static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
27
  PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
28
static void mn10200_info_to_howto
29
  PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
30
static boolean mn10200_elf_relax_delete_bytes
31
  PARAMS ((bfd *, asection *, bfd_vma, int));
32
static boolean mn10200_elf_symbol_address_p
33
  PARAMS ((bfd *, asection *, Elf32_External_Sym *, bfd_vma));
34
 
35
/* We have to use RELA instructions since md_apply_fix3 in the assembler
36
   does absolutely nothing.  */
37
#define USE_RELA
38
 
39
enum reloc_type {
40
  R_MN10200_NONE = 0,
41
  R_MN10200_32,
42
  R_MN10200_16,
43
  R_MN10200_8,
44
  R_MN10200_24,
45
  R_MN10200_PCREL8,
46
  R_MN10200_PCREL16,
47
  R_MN10200_PCREL24,
48
  R_MN10200_MAX
49
};
50
 
51
static reloc_howto_type elf_mn10200_howto_table[] = {
52
  /* Dummy relocation.  Does nothing.  */
53
  HOWTO (R_MN10200_NONE,
54
         0,
55
         2,
56
         16,
57
         false,
58
         0,
59
         complain_overflow_bitfield,
60
         bfd_elf_generic_reloc,
61
         "R_MN10200_NONE",
62
         false,
63
         0,
64
         0,
65
         false),
66
  /* Standard 32 bit reloc.  */
67
  HOWTO (R_MN10200_32,
68
         0,
69
         2,
70
         32,
71
         false,
72
         0,
73
         complain_overflow_bitfield,
74
         bfd_elf_generic_reloc,
75
         "R_MN10200_32",
76
         false,
77
         0xffffffff,
78
         0xffffffff,
79
         false),
80
  /* Standard 16 bit reloc.  */
81
  HOWTO (R_MN10200_16,
82
         0,
83
         1,
84
         16,
85
         false,
86
         0,
87
         complain_overflow_bitfield,
88
         bfd_elf_generic_reloc,
89
         "R_MN10200_16",
90
         false,
91
         0xffff,
92
         0xffff,
93
         false),
94
  /* Standard 8 bit reloc.  */
95
  HOWTO (R_MN10200_8,
96
         0,
97
         0,
98
         8,
99
         false,
100
         0,
101
         complain_overflow_bitfield,
102
         bfd_elf_generic_reloc,
103
         "R_MN10200_8",
104
         false,
105
         0xff,
106
         0xff,
107
         false),
108
  /* Standard 24 bit reloc.  */
109
  HOWTO (R_MN10200_24,
110
         0,
111
         2,
112
         24,
113
         false,
114
         0,
115
         complain_overflow_bitfield,
116
         bfd_elf_generic_reloc,
117
         "R_MN10200_24",
118
         false,
119
         0xffffff,
120
         0xffffff,
121
         false),
122
  /* Simple 8 pc-relative reloc.  */
123
  HOWTO (R_MN10200_PCREL8,
124
         0,
125
         0,
126
         8,
127
         true,
128
         0,
129
         complain_overflow_bitfield,
130
         bfd_elf_generic_reloc,
131
         "R_MN10200_PCREL8",
132
         false,
133
         0xff,
134
         0xff,
135
         true),
136
  /* Simple 16 pc-relative reloc.  */
137
  HOWTO (R_MN10200_PCREL16,
138
         0,
139
         1,
140
         16,
141
         true,
142
         0,
143
         complain_overflow_bitfield,
144
         bfd_elf_generic_reloc,
145
         "R_MN10200_PCREL16",
146
         false,
147
         0xffff,
148
         0xffff,
149
         true),
150
  /* Simple 32bit pc-relative reloc with a 1 byte adjustment
151
     to get the pc-relative offset correct.  */
152
  HOWTO (R_MN10200_PCREL24,
153
         0,
154
         2,
155
         24,
156
         true,
157
         0,
158
         complain_overflow_bitfield,
159
         bfd_elf_generic_reloc,
160
         "R_MN10200_PCREL24",
161
         false,
162
         0xffffff,
163
         0xffffff,
164
         true),
165
};
166
 
167
struct mn10200_reloc_map {
168
  bfd_reloc_code_real_type bfd_reloc_val;
169
  unsigned char elf_reloc_val;
170
};
171
 
172
static const struct mn10200_reloc_map mn10200_reloc_map[] = {
173
  { BFD_RELOC_NONE    , R_MN10200_NONE   , },
174
  { BFD_RELOC_32      , R_MN10200_32     , },
175
  { BFD_RELOC_16      , R_MN10200_16     , },
176
  { BFD_RELOC_8       , R_MN10200_8      , },
177
  { BFD_RELOC_24      , R_MN10200_24     , },
178
  { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , },
179
  { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, },
180
  { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, },
181
};
182
 
183
static reloc_howto_type *
184
bfd_elf32_bfd_reloc_type_lookup (abfd, code)
185
     bfd *abfd ATTRIBUTE_UNUSED;
186
     bfd_reloc_code_real_type code;
187
{
188
  unsigned int i;
189
 
190
  for (i = 0;
191
       i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map);
192
       i++)
193
    {
194
      if (mn10200_reloc_map[i].bfd_reloc_val == code)
195
        return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val];
196
    }
197
 
198
  return NULL;
199
}
200
 
201
/* Set the howto pointer for an MN10200 ELF reloc.  */
202
 
203
static void
204
mn10200_info_to_howto (abfd, cache_ptr, dst)
205
     bfd *abfd ATTRIBUTE_UNUSED;
206
     arelent *cache_ptr;
207
     Elf32_Internal_Rela *dst;
208
{
209
  unsigned int r_type;
210
 
211
  r_type = ELF32_R_TYPE (dst->r_info);
212
  BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX);
213
  cache_ptr->howto = &elf_mn10200_howto_table[r_type];
214
}
215
 
216
/* Perform a relocation as part of a final link.  */
217
static bfd_reloc_status_type
218
mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
219
                                 input_section, contents, offset, value,
220
                                 addend, info, sym_sec, is_local)
221
     reloc_howto_type *howto;
222
     bfd *input_bfd;
223
     bfd *output_bfd ATTRIBUTE_UNUSED;
224
     asection *input_section;
225
     bfd_byte *contents;
226
     bfd_vma offset;
227
     bfd_vma value;
228
     bfd_vma addend;
229
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
230
     asection *sym_sec ATTRIBUTE_UNUSED;
231
     int is_local ATTRIBUTE_UNUSED;
232
{
233
  unsigned long r_type = howto->type;
234
  bfd_byte *hit_data = contents + offset;
235
 
236
  switch (r_type)
237
    {
238
 
239
    case R_MN10200_NONE:
240
      return bfd_reloc_ok;
241
 
242
    case R_MN10200_32:
243
      value += addend;
244
      bfd_put_32 (input_bfd, value, hit_data);
245
      return bfd_reloc_ok;
246
 
247
    case R_MN10200_16:
248
      value += addend;
249
 
250
      if ((long) value > 0x7fff || (long) value < -0x8000)
251
        return bfd_reloc_overflow;
252
 
253
      bfd_put_16 (input_bfd, value, hit_data);
254
      return bfd_reloc_ok;
255
 
256
    case R_MN10200_8:
257
      value += addend;
258
 
259
      if ((long) value > 0x7f || (long) value < -0x80)
260
        return bfd_reloc_overflow;
261
 
262
      bfd_put_8 (input_bfd, value, hit_data);
263
      return bfd_reloc_ok;
264
 
265
    case R_MN10200_24:
266
      value += addend;
267
 
268
      if ((long) value > 0x7fffff || (long) value < -0x800000)
269
        return bfd_reloc_overflow;
270
 
271
      value &= 0xffffff;
272
      value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
273
      bfd_put_32 (input_bfd, value, hit_data);
274
      return bfd_reloc_ok;
275
 
276
    case R_MN10200_PCREL8:
277
      value -= (input_section->output_section->vma
278
                + input_section->output_offset);
279
      value -= (offset + 1);
280
      value += addend;
281
 
282
      if ((long) value > 0xff || (long) value < -0x100)
283
        return bfd_reloc_overflow;
284
 
285
      bfd_put_8 (input_bfd, value, hit_data);
286
      return bfd_reloc_ok;
287
 
288
    case R_MN10200_PCREL16:
289
      value -= (input_section->output_section->vma
290
                + input_section->output_offset);
291
      value -= (offset + 2);
292
      value += addend;
293
 
294
      if ((long) value > 0xffff || (long) value < -0x10000)
295
        return bfd_reloc_overflow;
296
 
297
      bfd_put_16 (input_bfd, value, hit_data);
298
      return bfd_reloc_ok;
299
 
300
    case R_MN10200_PCREL24:
301
      value -= (input_section->output_section->vma
302
                + input_section->output_offset);
303
      value -= (offset + 3);
304
      value += addend;
305
 
306
      if ((long) value > 0xffffff || (long) value < -0x1000000)
307
        return bfd_reloc_overflow;
308
 
309
      value &= 0xffffff;
310
      value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
311
      bfd_put_32 (input_bfd, value, hit_data);
312
      return bfd_reloc_ok;
313
 
314
    default:
315
      return bfd_reloc_notsupported;
316
    }
317
}
318
 
319
/* Relocate an MN10200 ELF section.  */
320
static boolean
321
mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
322
                              contents, relocs, local_syms, local_sections)
323
     bfd *output_bfd;
324
     struct bfd_link_info *info;
325
     bfd *input_bfd;
326
     asection *input_section;
327
     bfd_byte *contents;
328
     Elf_Internal_Rela *relocs;
329
     Elf_Internal_Sym *local_syms;
330
     asection **local_sections;
331
{
332
  Elf_Internal_Shdr *symtab_hdr;
333
  struct elf_link_hash_entry **sym_hashes;
334
  Elf_Internal_Rela *rel, *relend;
335
 
336
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
337
  sym_hashes = elf_sym_hashes (input_bfd);
338
 
339
  rel = relocs;
340
  relend = relocs + input_section->reloc_count;
341
  for (; rel < relend; rel++)
342
    {
343
      int r_type;
344
      reloc_howto_type *howto;
345
      unsigned long r_symndx;
346
      Elf_Internal_Sym *sym;
347
      asection *sec;
348
      struct elf_link_hash_entry *h;
349
      bfd_vma relocation;
350
      bfd_reloc_status_type r;
351
 
352
      r_symndx = ELF32_R_SYM (rel->r_info);
353
      r_type = ELF32_R_TYPE (rel->r_info);
354
      howto = elf_mn10200_howto_table + r_type;
355
 
356
      if (info->relocateable)
357
        {
358
          /* This is a relocateable link.  We don't have to change
359
             anything, unless the reloc is against a section symbol,
360
             in which case we have to adjust according to where the
361
             section symbol winds up in the output section.  */
362
          if (r_symndx < symtab_hdr->sh_info)
363
            {
364
              sym = local_syms + r_symndx;
365
              if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
366
                {
367
                  sec = local_sections[r_symndx];
368
                  rel->r_addend += sec->output_offset + sym->st_value;
369
                }
370
            }
371
 
372
          continue;
373
        }
374
 
375
      /* This is a final link.  */
376
      h = NULL;
377
      sym = NULL;
378
      sec = NULL;
379
      if (r_symndx < symtab_hdr->sh_info)
380
        {
381
          sym = local_syms + r_symndx;
382
          sec = local_sections[r_symndx];
383
          relocation = (sec->output_section->vma
384
                        + sec->output_offset
385
                        + sym->st_value);
386
        }
387
      else
388
        {
389
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
390
          while (h->root.type == bfd_link_hash_indirect
391
                 || h->root.type == bfd_link_hash_warning)
392
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
393
          if (h->root.type == bfd_link_hash_defined
394
              || h->root.type == bfd_link_hash_defweak)
395
            {
396
              sec = h->root.u.def.section;
397
              relocation = (h->root.u.def.value
398
                            + sec->output_section->vma
399
                            + sec->output_offset);
400
            }
401
          else if (h->root.type == bfd_link_hash_undefweak)
402
            relocation = 0;
403
          else
404
            {
405
              if (! ((*info->callbacks->undefined_symbol)
406
                     (info, h->root.root.string, input_bfd,
407
                      input_section, rel->r_offset, true)))
408
                return false;
409
              relocation = 0;
410
            }
411
        }
412
 
413
      r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
414
                                           input_section,
415
                                           contents, rel->r_offset,
416
                                           relocation, rel->r_addend,
417
                                           info, sec, h == NULL);
418
 
419
      if (r != bfd_reloc_ok)
420
        {
421
          const char *name;
422
          const char *msg = (const char *) 0;
423
 
424
          if (h != NULL)
425
            name = h->root.root.string;
426
          else
427
            {
428
              name = (bfd_elf_string_from_elf_section
429
                      (input_bfd, symtab_hdr->sh_link, sym->st_name));
430
              if (name == NULL || *name == '\0')
431
                name = bfd_section_name (input_bfd, sec);
432
            }
433
 
434
          switch (r)
435
            {
436
            case bfd_reloc_overflow:
437
              if (! ((*info->callbacks->reloc_overflow)
438
                     (info, name, howto->name, (bfd_vma) 0,
439
                      input_bfd, input_section, rel->r_offset)))
440
                return false;
441
              break;
442
 
443
            case bfd_reloc_undefined:
444
              if (! ((*info->callbacks->undefined_symbol)
445
                     (info, name, input_bfd, input_section,
446
                      rel->r_offset, true)))
447
                return false;
448
              break;
449
 
450
            case bfd_reloc_outofrange:
451
              msg = _("internal error: out of range error");
452
              goto common_error;
453
 
454
            case bfd_reloc_notsupported:
455
              msg = _("internal error: unsupported relocation error");
456
              goto common_error;
457
 
458
            case bfd_reloc_dangerous:
459
              msg = _("internal error: dangerous error");
460
              goto common_error;
461
 
462
            default:
463
              msg = _("internal error: unknown error");
464
              /* fall through */
465
 
466
            common_error:
467
              if (!((*info->callbacks->warning)
468
                    (info, msg, name, input_bfd, input_section,
469
                     rel->r_offset)))
470
                return false;
471
              break;
472
            }
473
        }
474
    }
475
 
476
  return true;
477
}
478
 
479
/* This function handles relaxing for the mn10200.
480
 
481
   There's quite a few relaxing opportunites available on the mn10200:
482
 
483
        * jsr:24 -> jsr:16                                         2 bytes
484
 
485
        * jmp:24 -> jmp:16                                         2 bytes
486
        * jmp:16 -> bra:8                                          1 byte
487
 
488
                * If the previous instruction is a conditional branch
489
                around the jump/bra, we may be able to reverse its condition
490
                and change its target to the jump's target.  The jump/bra
491
                can then be deleted.                               2 bytes
492
 
493
        * mov abs24 -> mov abs16        2 byte savings
494
 
495
        * Most instructions which accept imm24 can relax to imm16  2 bytes
496
        - Most instructions which accept imm16 can relax to imm8   1 byte
497
 
498
        * Most instructions which accept d24 can relax to d16      2 bytes
499
        - Most instructions which accept d16 can relax to d8       1 byte
500
 
501
        abs24, imm24, d24 all look the same at the reloc level.  It
502
        might make the code simpler if we had different relocs for
503
        the various relaxable operand types.
504
 
505
        We don't handle imm16->imm8 or d16->d8 as they're very rare
506
        and somewhat more difficult to support.  */
507
 
508
static boolean
509
mn10200_elf_relax_section (abfd, sec, link_info, again)
510
     bfd *abfd;
511
     asection *sec;
512
     struct bfd_link_info *link_info;
513
     boolean *again;
514
{
515
  Elf_Internal_Shdr *symtab_hdr;
516
  Elf_Internal_Rela *internal_relocs;
517
  Elf_Internal_Rela *free_relocs = NULL;
518
  Elf_Internal_Rela *irel, *irelend;
519
  bfd_byte *contents = NULL;
520
  bfd_byte *free_contents = NULL;
521
  Elf32_External_Sym *extsyms = NULL;
522
  Elf32_External_Sym *free_extsyms = NULL;
523
 
524
  /* Assume nothing changes.  */
525
  *again = false;
526
 
527
  /* We don't have to do anything for a relocateable link, if
528
     this section does not have relocs, or if this is not a
529
     code section.  */
530
  if (link_info->relocateable
531
      || (sec->flags & SEC_RELOC) == 0
532
      || sec->reloc_count == 0
533
      || (sec->flags & SEC_CODE) == 0)
534
    return true;
535
 
536
  /* If this is the first time we have been called for this section,
537
     initialize the cooked size.  */
538
  if (sec->_cooked_size == 0)
539
    sec->_cooked_size = sec->_raw_size;
540
 
541
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
542
 
543
  /* Get a copy of the native relocations.  */
544
  internal_relocs = (_bfd_elf32_link_read_relocs
545
                     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
546
                      link_info->keep_memory));
547
  if (internal_relocs == NULL)
548
    goto error_return;
549
  if (! link_info->keep_memory)
550
    free_relocs = internal_relocs;
551
 
552
  /* Walk through them looking for relaxing opportunities.  */
553
  irelend = internal_relocs + sec->reloc_count;
554
  for (irel = internal_relocs; irel < irelend; irel++)
555
    {
556
      bfd_vma symval;
557
 
558
      /* If this isn't something that can be relaxed, then ignore
559
         this reloc.  */
560
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
561
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
562
          || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
563
        continue;
564
 
565
      /* Get the section contents if we haven't done so already.  */
566
      if (contents == NULL)
567
        {
568
          /* Get cached copy if it exists.  */
569
          if (elf_section_data (sec)->this_hdr.contents != NULL)
570
            contents = elf_section_data (sec)->this_hdr.contents;
571
          else
572
            {
573
              /* Go get them off disk.  */
574
              contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
575
              if (contents == NULL)
576
                goto error_return;
577
              free_contents = contents;
578
 
579
              if (! bfd_get_section_contents (abfd, sec, contents,
580
                                              (file_ptr) 0, sec->_raw_size))
581
                goto error_return;
582
            }
583
        }
584
 
585
      /* Read this BFD's symbols if we haven't done so already.  */
586
      if (extsyms == NULL)
587
        {
588
          /* Get cached copy if it exists.  */
589
          if (symtab_hdr->contents != NULL)
590
            extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
591
          else
592
            {
593
              /* Go get them off disk.  */
594
              extsyms = ((Elf32_External_Sym *)
595
                         bfd_malloc (symtab_hdr->sh_size));
596
              if (extsyms == NULL)
597
                goto error_return;
598
              free_extsyms = extsyms;
599
              if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
600
                  || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
601
                      != symtab_hdr->sh_size))
602
                goto error_return;
603
            }
604
        }
605
 
606
      /* Get the value of the symbol referred to by the reloc.  */
607
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
608
        {
609
          Elf_Internal_Sym isym;
610
          asection *sym_sec;
611
 
612
          /* A local symbol.  */
613
          bfd_elf32_swap_symbol_in (abfd,
614
                                    extsyms + ELF32_R_SYM (irel->r_info),
615
                                    &isym);
616
 
617
          sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
618
          symval = (isym.st_value
619
                    + sym_sec->output_section->vma
620
                    + sym_sec->output_offset);
621
        }
622
      else
623
        {
624
          unsigned long indx;
625
          struct elf_link_hash_entry *h;
626
 
627
          /* An external symbol.  */
628
          indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
629
          h = elf_sym_hashes (abfd)[indx];
630
          BFD_ASSERT (h != NULL);
631
          if (h->root.type != bfd_link_hash_defined
632
              && h->root.type != bfd_link_hash_defweak)
633
            {
634
              /* This appears to be a reference to an undefined
635
                 symbol.  Just ignore it--it will be caught by the
636
                 regular reloc processing.  */
637
              continue;
638
            }
639
 
640
          symval = (h->root.u.def.value
641
                    + h->root.u.def.section->output_section->vma
642
                    + h->root.u.def.section->output_offset);
643
        }
644
 
645
      /* For simplicity of coding, we are going to modify the section
646
         contents, the section relocs, and the BFD symbol table.  We
647
         must tell the rest of the code not to free up this
648
         information.  It would be possible to instead create a table
649
         of changes which have to be made, as is done in coff-mips.c;
650
         that would be more work, but would require less memory when
651
         the linker is run.  */
652
 
653
      /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
654
         branch/call.  */
655
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
656
        {
657
          bfd_vma value = symval;
658
 
659
          /* Deal with pc-relative gunk.  */
660
          value -= (sec->output_section->vma + sec->output_offset);
661
          value -= (irel->r_offset + 3);
662
          value += irel->r_addend;
663
 
664
          /* See if the value will fit in 16 bits, note the high value is
665
             0x7fff + 2 as the target will be two bytes closer if we are
666
             able to relax.  */
667
          if ((long) value < 0x8001 && (long) value > -0x8000)
668
            {
669
              unsigned char code;
670
 
671
              /* Get the opcode.  */
672
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
673
 
674
              if (code != 0xe0 && code != 0xe1)
675
                continue;
676
 
677
              /* Note that we've changed the relocs, section contents, etc.  */
678
              elf_section_data (sec)->relocs = internal_relocs;
679
              free_relocs = NULL;
680
 
681
              elf_section_data (sec)->this_hdr.contents = contents;
682
              free_contents = NULL;
683
 
684
              symtab_hdr->contents = (bfd_byte *) extsyms;
685
              free_extsyms = NULL;
686
 
687
              /* Fix the opcode.  */
688
              if (code == 0xe0)
689
                bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
690
              else if (code == 0xe1)
691
                bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
692
 
693
              /* Fix the relocation's type.  */
694
              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
695
                                           R_MN10200_PCREL16);
696
 
697
              /* The opcode got shorter too, so we have to fix the offset.  */
698
              irel->r_offset -= 1;
699
 
700
              /* Delete two bytes of data.  */
701
              if (!mn10200_elf_relax_delete_bytes (abfd, sec,
702
                                                   irel->r_offset + 1, 2))
703
                goto error_return;
704
 
705
              /* That will change things, so, we should relax again.
706
                 Note that this is not required, and it may be slow.  */
707
              *again = true;
708
            }
709
        }
710
 
711
      /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
712
         branch.  */
713
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
714
        {
715
          bfd_vma value = symval;
716
 
717
          /* Deal with pc-relative gunk.  */
718
          value -= (sec->output_section->vma + sec->output_offset);
719
          value -= (irel->r_offset + 2);
720
          value += irel->r_addend;
721
 
722
          /* See if the value will fit in 8 bits, note the high value is
723
             0x7f + 1 as the target will be one bytes closer if we are
724
             able to relax.  */
725
          if ((long) value < 0x80 && (long) value > -0x80)
726
            {
727
              unsigned char code;
728
 
729
              /* Get the opcode.  */
730
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
731
 
732
              if (code != 0xfc)
733
                continue;
734
 
735
              /* Note that we've changed the relocs, section contents, etc.  */
736
              elf_section_data (sec)->relocs = internal_relocs;
737
              free_relocs = NULL;
738
 
739
              elf_section_data (sec)->this_hdr.contents = contents;
740
              free_contents = NULL;
741
 
742
              symtab_hdr->contents = (bfd_byte *) extsyms;
743
              free_extsyms = NULL;
744
 
745
              /* Fix the opcode.  */
746
              bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
747
 
748
              /* Fix the relocation's type.  */
749
              irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
750
                                           R_MN10200_PCREL8);
751
 
752
              /* Delete one byte of data.  */
753
              if (!mn10200_elf_relax_delete_bytes (abfd, sec,
754
                                                   irel->r_offset + 1, 1))
755
                goto error_return;
756
 
757
              /* That will change things, so, we should relax again.
758
                 Note that this is not required, and it may be slow.  */
759
              *again = true;
760
            }
761
        }
762
 
763
      /* Try to eliminate an unconditional 8 bit pc-relative branch
764
         which immediately follows a conditional 8 bit pc-relative
765
         branch around the unconditional branch.
766
 
767
            original:           new:
768
            bCC lab1            bCC' lab2
769
            bra lab2
770
           lab1:               lab1:
771
 
772
         This happens when the bCC can't reach lab2 at assembly time,
773
         but due to other relaxations it can reach at link time.  */
774
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
775
        {
776
          Elf_Internal_Rela *nrel;
777
          bfd_vma value = symval;
778
          unsigned char code;
779
 
780
          /* Deal with pc-relative gunk.  */
781
          value -= (sec->output_section->vma + sec->output_offset);
782
          value -= (irel->r_offset + 1);
783
          value += irel->r_addend;
784
 
785
          /* Do nothing if this reloc is the last byte in the section.  */
786
          if (irel->r_offset == sec->_cooked_size)
787
            continue;
788
 
789
          /* See if the next instruction is an unconditional pc-relative
790
             branch, more often than not this test will fail, so we
791
             test it first to speed things up.  */
792
          code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
793
          if (code != 0xea)
794
            continue;
795
 
796
          /* Also make sure the next relocation applies to the next
797
             instruction and that it's a pc-relative 8 bit branch.  */
798
          nrel = irel + 1;
799
          if (nrel == irelend
800
              || irel->r_offset + 2 != nrel->r_offset
801
              || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8)
802
            continue;
803
 
804
          /* Make sure our destination immediately follows the
805
             unconditional branch.  */
806
          if (symval != (sec->output_section->vma + sec->output_offset
807
                         + irel->r_offset + 3))
808
            continue;
809
 
810
          /* Now make sure we are a conditional branch.  This may not
811
             be necessary, but why take the chance.
812
 
813
             Note these checks assume that R_MN10200_PCREL8 relocs
814
             only occur on bCC and bCCx insns.  If they occured
815
             elsewhere, we'd need to know the start of this insn
816
             for this check to be accurate.  */
817
          code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
818
          if (code != 0xe0 && code != 0xe1 && code != 0xe2
819
              && code != 0xe3 && code != 0xe4 && code != 0xe5
820
              && code != 0xe6 && code != 0xe7 && code != 0xe8
821
              && code != 0xe9 && code != 0xec && code != 0xed
822
              && code != 0xee && code != 0xef && code != 0xfc
823
              && code != 0xfd && code != 0xfe && code != 0xff)
824
            continue;
825
 
826
          /* We also have to be sure there is no symbol/label
827
             at the unconditional branch.  */
828
          if (mn10200_elf_symbol_address_p (abfd, sec, extsyms,
829
                                            irel->r_offset + 1))
830
            continue;
831
 
832
          /* Note that we've changed the relocs, section contents, etc.  */
833
          elf_section_data (sec)->relocs = internal_relocs;
834
          free_relocs = NULL;
835
 
836
          elf_section_data (sec)->this_hdr.contents = contents;
837
          free_contents = NULL;
838
 
839
          symtab_hdr->contents = (bfd_byte *) extsyms;
840
          free_extsyms = NULL;
841
 
842
          /* Reverse the condition of the first branch.  */
843
          switch (code)
844
            {
845
            case 0xfc:
846
              code = 0xfd;
847
              break;
848
            case 0xfd:
849
              code = 0xfc;
850
              break;
851
            case 0xfe:
852
              code = 0xff;
853
              break;
854
            case 0xff:
855
              code = 0xfe;
856
              break;
857
            case 0xe8:
858
              code = 0xe9;
859
              break;
860
            case 0xe9:
861
              code = 0xe8;
862
              break;
863
            case 0xe0:
864
              code = 0xe2;
865
              break;
866
            case 0xe2:
867
              code = 0xe0;
868
              break;
869
            case 0xe3:
870
              code = 0xe1;
871
              break;
872
            case 0xe1:
873
              code = 0xe3;
874
              break;
875
            case 0xe4:
876
              code = 0xe6;
877
              break;
878
            case 0xe6:
879
              code = 0xe4;
880
              break;
881
            case 0xe7:
882
              code = 0xe5;
883
              break;
884
            case 0xe5:
885
              code = 0xe7;
886
              break;
887
            case 0xec:
888
              code = 0xed;
889
              break;
890
            case 0xed:
891
              code = 0xec;
892
              break;
893
            case 0xee:
894
              code = 0xef;
895
              break;
896
            case 0xef:
897
              code = 0xee;
898
              break;
899
            }
900
          bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
901
 
902
          /* Set the reloc type and symbol for the first branch
903
             from the second branch.  */
904
          irel->r_info = nrel->r_info;
905
 
906
          /* Make the reloc for the second branch a null reloc.  */
907
          nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
908
                                       R_MN10200_NONE);
909
 
910
          /* Delete two bytes of data.  */
911
          if (!mn10200_elf_relax_delete_bytes (abfd, sec,
912
                                               irel->r_offset + 1, 2))
913
            goto error_return;
914
 
915
          /* That will change things, so, we should relax again.
916
             Note that this is not required, and it may be slow.  */
917
          *again = true;
918
        }
919
 
920
      /* Try to turn a 24bit immediate, displacement or absolute address
921
         into a 16bit immediate, displacement or absolute address.  */
922
      if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24)
923
        {
924
          bfd_vma value = symval;
925
 
926
          /* See if the value will fit in 16 bits.
927
             We allow any 16bit match here.  We prune those we can't
928
             handle below.  */
929
          if ((long) value < 0x7fff && (long) value > -0x8000)
930
            {
931
              unsigned char code;
932
 
933
              /* All insns which have 24bit operands are 5 bytes long,
934
                 the first byte will always be 0xf4, but we double check
935
                 it just in case.  */
936
 
937
              /* Get the first opcode.  */
938
              code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
939
 
940
              if (code != 0xf4)
941
                continue;
942
 
943
              /* Get the second opcode.  */
944
              code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
945
 
946
              switch (code & 0xfc)
947
                {
948
                /* mov imm24,dn -> mov imm16,dn */
949
                case 0x70:
950
                  /* Not safe if the high bit is on as relaxing may
951
                     move the value out of high mem and thus not fit
952
                     in a signed 16bit value.  */
953
                  if (value & 0x8000)
954
                    continue;
955
 
956
                  /* Note that we've changed the reldection contents, etc.  */
957
                  elf_section_data (sec)->relocs = internal_relocs;
958
                  free_relocs = NULL;
959
 
960
                  elf_section_data (sec)->this_hdr.contents = contents;
961
                  free_contents = NULL;
962
 
963
                  symtab_hdr->contents = (bfd_byte *) extsyms;
964
                  free_extsyms = NULL;
965
 
966
                  /* Fix the opcode.  */
967
                  bfd_put_8 (abfd, 0xf8 + (code & 0x03),
968
                             contents + irel->r_offset - 2);
969
 
970
                  /* Fix the relocation's type.  */
971
                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
972
                                               R_MN10200_16);
973
 
974
                  /* The opcode got shorter too, so we have to fix the
975
                     offset.  */
976
                  irel->r_offset -= 1;
977
 
978
                  /* Delete two bytes of data.  */
979
                  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
980
                                                       irel->r_offset + 1, 2))
981
                    goto error_return;
982
 
983
                  /* That will change things, so, we should relax again.
984
                     Note that this is not required, and it may be slow.  */
985
                  *again = true;
986
                  break;
987
 
988
                /* mov imm24,an -> mov imm16,an
989
                   cmp imm24,an -> cmp imm16,an
990
                   mov (abs24),dn -> mov (abs16),dn
991
                   mov dn,(abs24) -> mov dn,(abs16)
992
                   movb dn,(abs24) -> movb dn,(abs16)
993
                   movbu (abs24),dn -> movbu (abs16),dn */
994
                case 0x74:
995
                case 0x7c:
996
                case 0xc0:
997
                case 0x40:
998
                case 0x44:
999
                case 0xc8:
1000
                  /* Note that we've changed the reldection contents, etc.  */
1001
                  elf_section_data (sec)->relocs = internal_relocs;
1002
                  free_relocs = NULL;
1003
 
1004
                  elf_section_data (sec)->this_hdr.contents = contents;
1005
                  free_contents = NULL;
1006
 
1007
                  symtab_hdr->contents = (bfd_byte *) extsyms;
1008
                  free_extsyms = NULL;
1009
 
1010
                  if ((code & 0xfc) == 0x74)
1011
                    code = 0xdc + (code & 0x03);
1012
                  else if ((code & 0xfc) == 0x7c)
1013
                    code = 0xec + (code & 0x03);
1014
                  else if ((code & 0xfc) == 0xc0)
1015
                    code = 0xc8 + (code & 0x03);
1016
                  else if ((code & 0xfc) == 0x40)
1017
                    code = 0xc0 + (code & 0x03);
1018
                  else if ((code & 0xfc) == 0x44)
1019
                    code = 0xc4 + (code & 0x03);
1020
                  else if ((code & 0xfc) == 0xc8)
1021
                    code = 0xcc + (code & 0x03);
1022
 
1023
                  /* Fix the opcode.  */
1024
                  bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1025
 
1026
                  /* Fix the relocation's type.  */
1027
                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1028
                                               R_MN10200_16);
1029
 
1030
                  /* The opcode got shorter too, so we have to fix the
1031
                     offset.  */
1032
                  irel->r_offset -= 1;
1033
 
1034
                  /* Delete two bytes of data.  */
1035
                  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1036
                                                       irel->r_offset + 1, 2))
1037
                    goto error_return;
1038
 
1039
                  /* That will change things, so, we should relax again.
1040
                     Note that this is not required, and it may be slow.  */
1041
                  *again = true;
1042
                  break;
1043
 
1044
                /* cmp imm24,dn -> cmp imm16,dn
1045
                   mov (abs24),an -> mov (abs16),an
1046
                   mov an,(abs24) -> mov an,(abs16)
1047
                   add imm24,dn -> add imm16,dn
1048
                   add imm24,an -> add imm16,an
1049
                   sub imm24,dn -> sub imm16,dn
1050
                   sub imm24,an -> sub imm16,an
1051
                   And all d24->d16 in memory ops.  */
1052
                case 0x78:
1053
                case 0xd0:
1054
                case 0x50:
1055
                case 0x60:
1056
                case 0x64:
1057
                case 0x68:
1058
                case 0x6c:
1059
                case 0x80:
1060
                case 0xf0:
1061
                case 0x00:
1062
                case 0x10:
1063
                case 0xb0:
1064
                case 0x30:
1065
                case 0xa0:
1066
                case 0x20:
1067
                case 0x90:
1068
                  /* Not safe if the high bit is on as relaxing may
1069
                     move the value out of high mem and thus not fit
1070
                     in a signed 16bit value.  */
1071
                  if (((code & 0xfc) == 0x78
1072
                       || (code & 0xfc) == 0x60
1073
                       || (code & 0xfc) == 0x64
1074
                       || (code & 0xfc) == 0x68
1075
                       || (code & 0xfc) == 0x6c
1076
                       || (code & 0xfc) == 0x80
1077
                       || (code & 0xfc) == 0xf0
1078
                       || (code & 0xfc) == 0x00
1079
                       || (code & 0xfc) == 0x10
1080
                       || (code & 0xfc) == 0xb0
1081
                       || (code & 0xfc) == 0x30
1082
                       || (code & 0xfc) == 0xa0
1083
                       || (code & 0xfc) == 0x20
1084
                       || (code & 0xfc) == 0x90)
1085
                      && (value & 0x8000) != 0)
1086
                    continue;
1087
 
1088
                  /* Note that we've changed the reldection contents, etc.  */
1089
                  elf_section_data (sec)->relocs = internal_relocs;
1090
                  free_relocs = NULL;
1091
 
1092
                  elf_section_data (sec)->this_hdr.contents = contents;
1093
                  free_contents = NULL;
1094
 
1095
                  symtab_hdr->contents = (bfd_byte *) extsyms;
1096
                  free_extsyms = NULL;
1097
 
1098
                  /* Fix the opcode.  */
1099
                  bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2);
1100
 
1101
                  if ((code & 0xfc) == 0x78)
1102
                    code = 0x48 + (code & 0x03);
1103
                  else if ((code & 0xfc) == 0xd0)
1104
                    code = 0x30 + (code & 0x03);
1105
                  else if ((code & 0xfc) == 0x50)
1106
                    code = 0x20 + (code & 0x03);
1107
                  else if ((code & 0xfc) == 0x60)
1108
                    code = 0x18 + (code & 0x03);
1109
                  else if ((code & 0xfc) == 0x64)
1110
                    code = 0x08 + (code & 0x03);
1111
                  else if ((code & 0xfc) == 0x68)
1112
                    code = 0x1c + (code & 0x03);
1113
                  else if ((code & 0xfc) == 0x6c)
1114
                    code = 0x0c + (code & 0x03);
1115
                  else if ((code & 0xfc) == 0x80)
1116
                    code = 0xc0 + (code & 0x07);
1117
                  else if ((code & 0xfc) == 0xf0)
1118
                    code = 0xb0 + (code & 0x07);
1119
                  else if ((code & 0xfc) == 0x00)
1120
                    code = 0x80 + (code & 0x07);
1121
                  else if ((code & 0xfc) == 0x10)
1122
                    code = 0xa0 + (code & 0x07);
1123
                  else if ((code & 0xfc) == 0xb0)
1124
                    code = 0x70 + (code & 0x07);
1125
                  else if ((code & 0xfc) == 0x30)
1126
                    code = 0x60 + (code & 0x07);
1127
                  else if ((code & 0xfc) == 0xa0)
1128
                    code = 0xd0 + (code & 0x07);
1129
                  else if ((code & 0xfc) == 0x20)
1130
                    code = 0x90 + (code & 0x07);
1131
                  else if ((code & 0xfc) == 0x90)
1132
                    code = 0x50 + (code & 0x07);
1133
 
1134
                  bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1135
 
1136
                  /* Fix the relocation's type.  */
1137
                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1138
                                               R_MN10200_16);
1139
 
1140
                  /* Delete one bytes of data.  */
1141
                  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1142
                                                       irel->r_offset + 2, 1))
1143
                    goto error_return;
1144
 
1145
                  /* That will change things, so, we should relax again.
1146
                     Note that this is not required, and it may be slow.  */
1147
                  *again = true;
1148
                  break;
1149
 
1150
                /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1151
                case 0xc4:
1152
                  /* Note that we've changed the reldection contents, etc.  */
1153
                  elf_section_data (sec)->relocs = internal_relocs;
1154
                  free_relocs = NULL;
1155
 
1156
                  elf_section_data (sec)->this_hdr.contents = contents;
1157
                  free_contents = NULL;
1158
 
1159
                  symtab_hdr->contents = (bfd_byte *) extsyms;
1160
                  free_extsyms = NULL;
1161
 
1162
                  bfd_put_8 (abfd, 0xcc + (code & 0x03),
1163
                             contents + irel->r_offset - 2);
1164
 
1165
                  bfd_put_8 (abfd, 0xb8 + (code & 0x03),
1166
                             contents + irel->r_offset - 1);
1167
 
1168
                  /* Fix the relocation's type.  */
1169
                  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1170
                                               R_MN10200_16);
1171
 
1172
                  /* The reloc will be applied one byte in front of its
1173
                     current location.  */
1174
                  irel->r_offset -= 1;
1175
 
1176
                  /* Delete one bytes of data.  */
1177
                  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1178
                                                       irel->r_offset + 2, 1))
1179
                    goto error_return;
1180
 
1181
                  /* That will change things, so, we should relax again.
1182
                     Note that this is not required, and it may be slow.  */
1183
                  *again = true;
1184
                  break;
1185
                }
1186
            }
1187
        }
1188
    }
1189
 
1190
  if (free_relocs != NULL)
1191
    {
1192
      free (free_relocs);
1193
      free_relocs = NULL;
1194
    }
1195
 
1196
  if (free_contents != NULL)
1197
    {
1198
      if (! link_info->keep_memory)
1199
        free (free_contents);
1200
      else
1201
        {
1202
          /* Cache the section contents for elf_link_input_bfd.  */
1203
          elf_section_data (sec)->this_hdr.contents = contents;
1204
        }
1205
      free_contents = NULL;
1206
    }
1207
 
1208
  if (free_extsyms != NULL)
1209
    {
1210
      if (! link_info->keep_memory)
1211
        free (free_extsyms);
1212
      else
1213
        {
1214
          /* Cache the symbols for elf_link_input_bfd.  */
1215
          symtab_hdr->contents = extsyms;
1216
        }
1217
      free_extsyms = NULL;
1218
    }
1219
 
1220
  return true;
1221
 
1222
 error_return:
1223
  if (free_relocs != NULL)
1224
    free (free_relocs);
1225
  if (free_contents != NULL)
1226
    free (free_contents);
1227
  if (free_extsyms != NULL)
1228
    free (free_extsyms);
1229
  return false;
1230
}
1231
 
1232
/* Delete some bytes from a section while relaxing.  */
1233
 
1234
static boolean
1235
mn10200_elf_relax_delete_bytes (abfd, sec, addr, count)
1236
     bfd *abfd;
1237
     asection *sec;
1238
     bfd_vma addr;
1239
     int count;
1240
{
1241
  Elf_Internal_Shdr *symtab_hdr;
1242
  Elf32_External_Sym *extsyms;
1243
  int shndx, index;
1244
  bfd_byte *contents;
1245
  Elf_Internal_Rela *irel, *irelend;
1246
  Elf_Internal_Rela *irelalign;
1247
  bfd_vma toaddr;
1248
  Elf32_External_Sym *esym, *esymend;
1249
  struct elf_link_hash_entry *sym_hash;
1250
 
1251
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1252
  extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1253
 
1254
  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1255
 
1256
  contents = elf_section_data (sec)->this_hdr.contents;
1257
 
1258
  /* The deletion must stop at the next ALIGN reloc for an aligment
1259
     power larger than the number of bytes we are deleting.  */
1260
 
1261
  irelalign = NULL;
1262
  toaddr = sec->_cooked_size;
1263
 
1264
  irel = elf_section_data (sec)->relocs;
1265
  irelend = irel + sec->reloc_count;
1266
 
1267
  /* Actually delete the bytes.  */
1268
  memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1269
  sec->_cooked_size -= count;
1270
 
1271
  /* Adjust all the relocs.  */
1272
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1273
    {
1274
      /* Get the new reloc address.  */
1275
      if ((irel->r_offset > addr
1276
           && irel->r_offset < toaddr))
1277
        irel->r_offset -= count;
1278
    }
1279
 
1280
  /* Adjust the local symbols defined in this section.  */
1281
  esym = extsyms;
1282
  esymend = esym + symtab_hdr->sh_info;
1283
  for (; esym < esymend; esym++)
1284
    {
1285
      Elf_Internal_Sym isym;
1286
 
1287
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1288
 
1289
      if (isym.st_shndx == shndx
1290
          && isym.st_value > addr
1291
          && isym.st_value < toaddr)
1292
        {
1293
          isym.st_value -= count;
1294
          bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1295
        }
1296
    }
1297
 
1298
  /* Now adjust the global symbols defined in this section.  */
1299
  esym = extsyms + symtab_hdr->sh_info;
1300
  esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1301
  for (index = 0; esym < esymend; esym++, index++)
1302
    {
1303
      Elf_Internal_Sym isym;
1304
 
1305
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1306
      sym_hash = elf_sym_hashes (abfd)[index];
1307
      if (isym.st_shndx == shndx
1308
          && ((sym_hash)->root.type == bfd_link_hash_defined
1309
              || (sym_hash)->root.type == bfd_link_hash_defweak)
1310
          && (sym_hash)->root.u.def.section == sec
1311
          && (sym_hash)->root.u.def.value > addr
1312
          && (sym_hash)->root.u.def.value < toaddr)
1313
        {
1314
          (sym_hash)->root.u.def.value -= count;
1315
        }
1316
    }
1317
 
1318
  return true;
1319
}
1320
 
1321
/* Return true if a symbol exists at the given address, else return
1322
   false.  */
1323
static boolean
1324
mn10200_elf_symbol_address_p (abfd, sec, extsyms, addr)
1325
     bfd *abfd;
1326
     asection *sec;
1327
     Elf32_External_Sym *extsyms;
1328
     bfd_vma addr;
1329
{
1330
  Elf_Internal_Shdr *symtab_hdr;
1331
  int shndx;
1332
  Elf32_External_Sym *esym, *esymend;
1333
  struct elf_link_hash_entry **sym_hash, **sym_hash_end;
1334
 
1335
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1336
  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1337
 
1338
  /* Examine all the symbols.  */
1339
  esym = extsyms;
1340
  esymend = esym + symtab_hdr->sh_info;
1341
  for (; esym < esymend; esym++)
1342
    {
1343
      Elf_Internal_Sym isym;
1344
 
1345
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1346
 
1347
      if (isym.st_shndx == shndx
1348
          && isym.st_value == addr)
1349
        return true;
1350
    }
1351
 
1352
  sym_hash = elf_sym_hashes (abfd);
1353
  sym_hash_end = (sym_hash
1354
                  + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1355
                     - symtab_hdr->sh_info));
1356
  for (; sym_hash < sym_hash_end; sym_hash++)
1357
    {
1358
      if (((*sym_hash)->root.type == bfd_link_hash_defined
1359
           || (*sym_hash)->root.type == bfd_link_hash_defweak)
1360
          && (*sym_hash)->root.u.def.section == sec
1361
          && (*sym_hash)->root.u.def.value == addr)
1362
        return true;
1363
    }
1364
  return false;
1365
}
1366
 
1367
/* This is a version of bfd_generic_get_relocated_section_contents
1368
   which uses mn10200_elf_relocate_section.  */
1369
 
1370
static bfd_byte *
1371
mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1372
                                            data, relocateable, symbols)
1373
     bfd *output_bfd;
1374
     struct bfd_link_info *link_info;
1375
     struct bfd_link_order *link_order;
1376
     bfd_byte *data;
1377
     boolean relocateable;
1378
     asymbol **symbols;
1379
{
1380
  Elf_Internal_Shdr *symtab_hdr;
1381
  asection *input_section = link_order->u.indirect.section;
1382
  bfd *input_bfd = input_section->owner;
1383
  asection **sections = NULL;
1384
  Elf_Internal_Rela *internal_relocs = NULL;
1385
  Elf32_External_Sym *external_syms = NULL;
1386
  Elf_Internal_Sym *internal_syms = NULL;
1387
 
1388
  /* We only need to handle the case of relaxing, or of having a
1389
     particular set of section contents, specially.  */
1390
  if (relocateable
1391
      || elf_section_data (input_section)->this_hdr.contents == NULL)
1392
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1393
                                                       link_order, data,
1394
                                                       relocateable,
1395
                                                       symbols);
1396
 
1397
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1398
 
1399
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1400
          input_section->_raw_size);
1401
 
1402
  if ((input_section->flags & SEC_RELOC) != 0
1403
      && input_section->reloc_count > 0)
1404
    {
1405
      Elf_Internal_Sym *isymp;
1406
      asection **secpp;
1407
      Elf32_External_Sym *esym, *esymend;
1408
 
1409
      if (symtab_hdr->contents != NULL)
1410
        external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1411
      else
1412
        {
1413
          external_syms = ((Elf32_External_Sym *)
1414
                           bfd_malloc (symtab_hdr->sh_info
1415
                                       * sizeof (Elf32_External_Sym)));
1416
          if (external_syms == NULL && symtab_hdr->sh_info > 0)
1417
            goto error_return;
1418
          if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1419
              || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
1420
                            symtab_hdr->sh_info, input_bfd)
1421
                  != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
1422
            goto error_return;
1423
        }
1424
 
1425
      internal_relocs = (_bfd_elf32_link_read_relocs
1426
                         (input_bfd, input_section, (PTR) NULL,
1427
                          (Elf_Internal_Rela *) NULL, false));
1428
      if (internal_relocs == NULL)
1429
        goto error_return;
1430
 
1431
      internal_syms = ((Elf_Internal_Sym *)
1432
                       bfd_malloc (symtab_hdr->sh_info
1433
                                   * sizeof (Elf_Internal_Sym)));
1434
      if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1435
        goto error_return;
1436
 
1437
      sections = (asection **) bfd_malloc (symtab_hdr->sh_info
1438
                                           * sizeof (asection *));
1439
      if (sections == NULL && symtab_hdr->sh_info > 0)
1440
        goto error_return;
1441
 
1442
      isymp = internal_syms;
1443
      secpp = sections;
1444
      esym = external_syms;
1445
      esymend = esym + symtab_hdr->sh_info;
1446
      for (; esym < esymend; ++esym, ++isymp, ++secpp)
1447
        {
1448
          asection *isec;
1449
 
1450
          bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1451
 
1452
          if (isymp->st_shndx == SHN_UNDEF)
1453
            isec = bfd_und_section_ptr;
1454
          else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
1455
            isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1456
          else if (isymp->st_shndx == SHN_ABS)
1457
            isec = bfd_abs_section_ptr;
1458
          else if (isymp->st_shndx == SHN_COMMON)
1459
            isec = bfd_com_section_ptr;
1460
          else
1461
            {
1462
              /* Who knows?  */
1463
              isec = NULL;
1464
            }
1465
 
1466
          *secpp = isec;
1467
        }
1468
 
1469
      if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
1470
                                     input_section, data, internal_relocs,
1471
                                     internal_syms, sections))
1472
        goto error_return;
1473
 
1474
      if (sections != NULL)
1475
        free (sections);
1476
      sections = NULL;
1477
      if (internal_syms != NULL)
1478
        free (internal_syms);
1479
      internal_syms = NULL;
1480
      if (external_syms != NULL && symtab_hdr->contents == NULL)
1481
        free (external_syms);
1482
      external_syms = NULL;
1483
      if (internal_relocs != elf_section_data (input_section)->relocs)
1484
        free (internal_relocs);
1485
      internal_relocs = NULL;
1486
    }
1487
 
1488
  return data;
1489
 
1490
 error_return:
1491
  if (internal_relocs != NULL
1492
      && internal_relocs != elf_section_data (input_section)->relocs)
1493
    free (internal_relocs);
1494
  if (external_syms != NULL && symtab_hdr->contents == NULL)
1495
    free (external_syms);
1496
  if (internal_syms != NULL)
1497
    free (internal_syms);
1498
  if (sections != NULL)
1499
    free (sections);
1500
  return NULL;
1501
}
1502
 
1503
#define TARGET_LITTLE_SYM       bfd_elf32_mn10200_vec
1504
#define TARGET_LITTLE_NAME      "elf32-mn10200"
1505
#define ELF_ARCH                bfd_arch_mn10200
1506
#define ELF_MACHINE_CODE        EM_CYGNUS_MN10200
1507
#define ELF_MAXPAGESIZE         0x1000
1508
 
1509
#define elf_info_to_howto       mn10200_info_to_howto
1510
#define elf_info_to_howto_rel   0
1511
#define elf_backend_relocate_section mn10200_elf_relocate_section
1512
#define bfd_elf32_bfd_relax_section     mn10200_elf_relax_section
1513
#define bfd_elf32_bfd_get_relocated_section_contents \
1514
                                mn10200_elf_get_relocated_section_contents
1515
 
1516
#define elf_symbol_leading_char '_'
1517
 
1518
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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