X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=bfd%2Felf32-sh.c;h=c0a3368cc88a57bee68875c54e1462c47883949b;hb=695344c018c8e462280c47a644df02ea472b0a4e;hp=7f108fb173ae9fae98a314ab899dfd383b2bbe82;hpb=1a0670f37442b7ae904932b347353046126b990c;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 7f108fb173..c0a3368cc8 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -487,6 +487,7 @@ sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) || (r >= R_SH_FIRST_INVALID_RELOC_5 && r <= R_SH_LAST_INVALID_RELOC_5) || (r >= R_SH_FIRST_INVALID_RELOC_6 && r <= R_SH_LAST_INVALID_RELOC_6)) { + /* xgettext:c-format */ _bfd_error_handler (_("%B: unrecognised SH reloc number: %d"), abfd, r); bfd_set_error (bfd_error_bad_value); @@ -575,6 +576,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, laddr = irel->r_offset + 4 + irel->r_addend; if (laddr >= sec->size) { + /* xgettext:c-format */ _bfd_error_handler (_("%B: 0x%lx: warning: bad R_SH_USES offset"), abfd, (unsigned long) irel->r_offset); continue; @@ -586,6 +588,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, if ((insn & 0xf000) != 0xd000) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"), abfd, (unsigned long) irel->r_offset, insn); continue; @@ -603,6 +606,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, if (paddr >= sec->size) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: warning: bad R_SH_USES load offset"), abfd, (unsigned long) irel->r_offset); continue; @@ -618,6 +622,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, if (irelfn >= irelend) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: warning: could not find expected reloc"), abfd, (unsigned long) paddr); continue; @@ -646,6 +651,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec)) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: warning: symbol in unexpected section"), abfd, (unsigned long) paddr); continue; @@ -775,6 +781,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, if (irelcount >= irelend) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: warning: could not find expected COUNT reloc"), abfd, (unsigned long) paddr); continue; @@ -784,6 +791,7 @@ sh_elf_relax_section (bfd *abfd, asection *sec, just deleted one. */ if (irelcount->r_addend == 0) { + /* xgettext:c-format */ _bfd_error_handler (_("%B: 0x%lx: warning: bad count"), abfd, (unsigned long) paddr); continue; @@ -1187,6 +1195,7 @@ sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, if (overflow) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), abfd, (unsigned long) irel->r_offset); bfd_set_error (bfd_error_bad_value); @@ -1557,6 +1566,7 @@ sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs, if (overflow) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), abfd, (unsigned long) irel->r_offset); bfd_set_error (bfd_error_bad_value); @@ -4007,6 +4017,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (howto->rightshift || howto->src_mask != 0xffffffff) { _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"), input_bfd, input_section, (long) rel->r_offset, howto->name); @@ -4124,6 +4135,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, != (bfd_vma) -1)) { _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, @@ -4202,6 +4214,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (disp & mask) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"), input_section->owner, (unsigned long) rel->r_offset); @@ -4235,6 +4248,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (relocation & 3) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), input_section->owner, (unsigned long) rel->r_offset, howto->name, @@ -4250,6 +4264,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (relocation & 1) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), input_section->owner, (unsigned long) rel->r_offset, howto->name, @@ -4264,6 +4279,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || (signed int)relocation > 32) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"), input_section->owner, (unsigned long) rel->r_offset, @@ -4278,6 +4294,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || (signed int)relocation > 16) { _bfd_error_handler + /* xgettext:c-format */ (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"), input_section->owner, (unsigned long) rel->r_offset, @@ -4422,6 +4439,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, input_section->output_section)) { _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), input_bfd, input_section, @@ -4900,6 +4918,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, reloc_section->output_section)) { _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), input_bfd, input_section, @@ -5007,6 +5026,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || !SYMBOL_FUNCDESC_LOCAL (info, h))) { _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""), input_bfd, input_section, (long) rel->r_offset, howto->name, h->root.root.string); @@ -5480,12 +5500,14 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (bfd_link_pic (info)) { info->callbacks->einfo + /* xgettext:c-format */ (_("%X%C: relocation to \"%s\" references a different segment\n"), input_bfd, input_section, rel->r_offset, symname); return FALSE; } else info->callbacks->einfo + /* xgettext:c-format */ (_("%C: warning: relocation to \"%s\" references a different segment\n"), input_bfd, input_section, rel->r_offset, symname); } @@ -6053,15 +6075,18 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC) && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL)) _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and FDPIC symbol"), abfd, h->root.root.string); else if (old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC) _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as FDPIC and thread local symbol"), abfd, h->root.root.string); else _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and thread local symbol"), abfd, h->root.root.string); return FALSE; @@ -6136,10 +6161,12 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, { if (old_got_type == GOT_NORMAL) _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as normal and FDPIC symbol"), abfd, h->root.root.string); else _bfd_error_handler + /* xgettext:c-format */ (_("%B: `%s' accessed both as FDPIC and thread local symbol"), abfd, h->root.root.string); } @@ -6414,13 +6441,64 @@ sh_find_elf_flags (unsigned int arch_set) return sh_elf_get_flags_from_mach (bfd_mach); } +/* Merge the architecture type of two BFD files, such that the + resultant architecture supports all the features required + by the two input BFDs. + If the input BFDs are multually incompatible - i.e. one uses + DSP while the other uses FPU - or there is no known architecture + that fits the requirements then an error is emitted. */ + +static bfd_boolean +sh_merge_bfd_arch (bfd *ibfd, struct bfd_link_info *info) +{ + bfd *obfd = info->output_bfd; + unsigned int old_arch, new_arch, merged_arch; + + if (! _bfd_generic_verify_endian_match (ibfd, info)) + return FALSE; + + old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd)); + new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd)); + + merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch); + + if (!SH_VALID_CO_ARCH_SET (merged_arch)) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: uses %s instructions while previous modules " + "use %s instructions"), + ibfd, + SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point", + SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp"); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + else if (!SH_VALID_ARCH_SET (merged_arch)) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("internal error: merge of architecture '%s' with " + "architecture '%s' produced unknown architecture"), + bfd_printable_name (obfd), + bfd_printable_name (ibfd)); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + + bfd_default_set_arch_mach (obfd, bfd_arch_sh, + sh_get_bfd_mach_from_arch_set (merged_arch)); + + return TRUE; +} + /* This routine initialises the elf flags when required and calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */ static bfd_boolean -sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) +sh_elf_merge_private_data (bfd *ibfd, struct bfd_link_info *info) { - extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *); + bfd *obfd = info->output_bfd; if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd)) return TRUE; @@ -6435,10 +6513,10 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) elf_elfheader (obfd)->e_flags &= ~EF_SH_PIC; } - if (! sh_merge_bfd_arch (ibfd, obfd)) + if (! sh_merge_bfd_arch (ibfd, info)) { - _bfd_error_handler ("%B: uses instructions which are incompatible " - "with instructions used in previous modules", + _bfd_error_handler (_("%B: uses instructions which are incompatible " + "with instructions used in previous modules"), ibfd); bfd_set_error (bfd_error_bad_value); return FALSE; @@ -6450,7 +6528,7 @@ sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) if (fdpic_object_p (ibfd) != fdpic_object_p (obfd)) { - _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects", + _bfd_error_handler (_("%B: attempt to mix FDPIC and non-FDPIC objects"), ibfd); bfd_set_error (bfd_error_bad_value); return FALSE;