X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-m68hc1x.c;h=68ace451eaa899e5d234db19f46da53722fdcf8c;hb=94403fc6cd6f69e61001fcbcb8370312399c72d0;hp=8739ca86c13a4810f0c1d22ea4938e5c6613f47d;hpb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c index 8739ca86c1..68ace451ea 100644 --- a/bfd/elf32-m68hc1x.c +++ b/bfd/elf32-m68hc1x.c @@ -899,6 +899,29 @@ elf32_m68hc11_check_relocs (bfd *abfd, struct bfd_link_info *info, return TRUE; } +static bfd_boolean ATTRIBUTE_PRINTF (6, 7) +reloc_warning (struct bfd_link_info *info, const char *name, bfd *input_bfd, + asection *input_section, const Elf_Internal_Rela *rel, + const char *fmt, ...) +{ + va_list ap; + char *buf; + int ret; + + va_start (ap, fmt); + ret = vasprintf (&buf, fmt, ap); + va_end (ap); + if (ret < 0) + { + bfd_set_error (bfd_error_no_memory); + return FALSE; + } + info->callbacks->warning (info, buf, name, input_bfd, input_section, + rel->r_offset); + free (buf); + return TRUE; +} + /* Relocate a 68hc11/68hc12 ELF section. */ bfd_boolean elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, @@ -951,8 +974,7 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, bfd_boolean is_section_symbol = FALSE; struct elf_link_hash_entry *h; bfd_vma val; - const char * msg; - char * buf; + const char *msg; r_symndx = ELF32_R_SYM (rel->r_info); r_type = ELF32_R_TYPE (rel->r_info); @@ -1108,17 +1130,13 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, break; case R_M68HC11_16: - /* Get virtual address of instruction having the relocation. */ if (is_far) { - msg = _("reference to the far symbol `%s' using a wrong " - "relocation may result in incorrect execution"); - buf = xmalloc (strlen (msg) + strlen (name) + 10); - sprintf (buf, msg, name); - - (*info->callbacks->warning) - (info, buf, name, input_bfd, NULL, rel->r_offset); - free (buf); + if (!reloc_warning (info, name, input_bfd, input_section, rel, + _("reference to the far symbol `%s' using a " + "wrong relocation may result in incorrect " + "execution"), name)) + return FALSE; } /* Get virtual address of instruction having the relocation. */ @@ -1145,47 +1163,43 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, } else { - msg = _("XGATE address (%lx) is not within shared RAM" - "(0xE000-0xFFFF), therefore you must manually offset " - "the address, and possibly manage the page, in your " - "code."); - buf = xmalloc (strlen (msg) + 128); - sprintf (buf, msg, phys_addr); - (*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, insn_addr); - free (buf); + if (!reloc_warning (info, name, input_bfd, input_section, rel, + _("XGATE address (%lx) is not within " + "shared RAM(0xE000-0xFFFF), therefore " + "you must manually offset the address, " + "and possibly manage the page, in your " + "code."), (long) phys_addr)) + return FALSE; break; } } if (m68hc11_addr_is_banked (pinfo, relocation + rel->r_addend) && m68hc11_addr_is_banked (pinfo, insn_addr) - && phys_page != insn_page && !(e_flags & E_M68HC11_NO_BANK_WARNING)) + && phys_page != insn_page + && !(e_flags & E_M68HC11_NO_BANK_WARNING)) { - /* xgettext:c-format */ - msg = _("banked address [%lx:%04lx] (%lx) is not in the same bank " - "as current banked address [%lx:%04lx] (%lx)"); - buf = xmalloc (strlen (msg) + 128); - sprintf (buf, msg, phys_page, phys_addr, - (long) (relocation + rel->r_addend), - insn_page, m68hc11_phys_addr (pinfo, insn_addr), - (long) (insn_addr)); - (*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, rel->r_offset); - free (buf); + if (!reloc_warning (info, name, input_bfd, input_section, rel, + _("banked address [%lx:%04lx] (%lx) is not " + "in the same bank as current banked " + "address [%lx:%04lx] (%lx)"), + (long) phys_page, (long) phys_addr, + (long) (relocation + rel->r_addend), + (long) insn_page, + (long) m68hc11_phys_addr (pinfo, insn_addr), + (long) insn_addr)) + return FALSE; break; } if (phys_page != 0 && insn_page == 0) { - /* xgettext:c-format */ - msg = _("reference to a banked address [%lx:%04lx] in the " - "normal address space at %04lx"); - buf = xmalloc (strlen (msg) + 128); - sprintf (buf, msg, phys_page, phys_addr, insn_addr); - (*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, insn_addr); - free (buf); + if (!reloc_warning (info, name, input_bfd, input_section, rel, + _("reference to a banked address [%lx:%04lx] " + "in the normal address space at %04lx"), + (long) phys_page, (long) phys_addr, + (long) insn_addr)) + return FALSE; relocation = phys_addr; break; } @@ -1216,18 +1230,12 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, relocation += 0xC000; else { - /* Get virtual address of instruction having the relocation. */ - insn_addr = input_section->output_section->vma - + input_section->output_offset + rel->r_offset; - - msg = _("S12 address (%lx) is not within shared RAM" - "(0x2000-0x4000), therefore you must manually " - "offset the address in your code"); - buf = xmalloc (strlen (msg) + 128); - sprintf (buf, msg, phys_addr); - (*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, insn_addr); - free (buf); + if (!reloc_warning (info, name, input_bfd, input_section, rel, + _("S12 address (%lx) is not within " + "shared RAM(0x2000-0x4000), therefore " + "you must manually offset the address " + "in your code"), (long) phys_addr)) + return FALSE; break; } } @@ -1448,20 +1456,21 @@ static void scan_sections_for_abi (bfd *abfd ATTRIBUTE_UNUSED, /* Tweak the OSABI field of the elf header. */ -void -elf32_m68hc11_post_process_headers (bfd *abfd, struct bfd_link_info *link_info) +bfd_boolean +elf32_m68hc11_init_file_header (bfd *abfd, struct bfd_link_info *link_info) { struct m68hc11_scan_param param; struct m68hc11_elf_link_hash_table *htab; - _bfd_elf_post_process_headers (abfd, link_info); + if (!_bfd_elf_init_file_header (abfd, link_info)) + return FALSE; if (link_info == NULL) - return; + return TRUE; htab = m68hc11_elf_hash_table (link_info); if (htab == NULL) - return; + return TRUE; m68hc11_elf_get_bank_parameters (link_info); @@ -1477,4 +1486,5 @@ elf32_m68hc11_post_process_headers (bfd *abfd, struct bfd_link_info *link_info) i_ehdrp = elf_elfheader (abfd); i_ehdrp->e_flags |= E_M68HC12_BANKS; } + return TRUE; }