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