Coverage Report

Created: 2026-03-10 08:46

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