X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-mep.c;h=c5775de6496dfbf63d76d1f48134a4e6bff6f395;hb=966dc1a27c55ccb298cb8c7c41c9cc2985cc321a;hp=f356fd06ffe0c2010a10f2b091ddf4bb7b059fce;hpb=545fd46b6bb24535905e4bc69b91537fee065bf3;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-mep.c b/bfd/elf32-mep.c index f356fd06ff..c5775de649 100644 --- a/bfd/elf32-mep.c +++ b/bfd/elf32-mep.c @@ -1,6 +1,5 @@ /* MeP-specific support for 32-bit ELF. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2001-2020 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -31,42 +30,39 @@ /* Private relocation functions. */ #define MEPREL(type, size, bits, right, left, pcrel, overflow, mask) \ - {(unsigned)type, right, size, bits, pcrel, left, overflow, mep_reloc, #type, FALSE, 0, mask, 0 } + HOWTO (type, right, size, bits, pcrel, left, overflow, bfd_elf_generic_reloc, #type, FALSE, 0, mask, 0) #define N complain_overflow_dont #define S complain_overflow_signed #define U complain_overflow_unsigned -static bfd_reloc_status_type mep_reloc (bfd *, arelent *, struct bfd_symbol *, - void *, asection *, bfd *, char **); - static reloc_howto_type mep_elf_howto_table [] = { /* type, size, bits, leftshift, rightshift, pcrel, OD/OS/OU, mask. */ - MEPREL (R_MEP_NONE, 0, 0, 0, 0, 0, N, 0), - MEPREL (R_RELC, 0, 0, 0, 0, 0, N, 0), + MEPREL (R_MEP_NONE, 3, 0, 0, 0, 0, N, 0), + MEPREL (R_RELC, 0, 0, 0, 0, 0, N, 0), /* MEPRELOC:HOWTO */ /* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */ - MEPREL (R_MEP_8, 0, 8, 0, 0, 0, U, 0xff), - MEPREL (R_MEP_16, 1, 16, 0, 0, 0, U, 0xffff), - MEPREL (R_MEP_32, 2, 32, 0, 0, 0, U, 0xffffffff), + MEPREL (R_MEP_8, 0, 8, 0, 0, 0, U, 0xff), + MEPREL (R_MEP_16, 1, 16, 0, 0, 0, U, 0xffff), + MEPREL (R_MEP_32, 2, 32, 0, 0, 0, U, 0xffffffff), MEPREL (R_MEP_PCREL8A2, 1, 8, 1, 1, 1, S, 0x00fe), MEPREL (R_MEP_PCREL12A2,1, 12, 1, 1, 1, S, 0x0ffe), MEPREL (R_MEP_PCREL17A2,2, 17, 0, 1, 1, S, 0x0000ffff), MEPREL (R_MEP_PCREL24A2,2, 24, 0, 1, 1, S, 0x07f0ffff), MEPREL (R_MEP_PCABS24A2,2, 24, 0, 1, 0, U, 0x07f0ffff), - MEPREL (R_MEP_LOW16, 2, 16, 0, 0, 0, N, 0x0000ffff), - MEPREL (R_MEP_HI16U, 2, 32, 0,16, 0, N, 0x0000ffff), - MEPREL (R_MEP_HI16S, 2, 32, 0,16, 0, N, 0x0000ffff), - MEPREL (R_MEP_GPREL, 2, 16, 0, 0, 0, S, 0x0000ffff), - MEPREL (R_MEP_TPREL, 2, 16, 0, 0, 0, S, 0x0000ffff), - MEPREL (R_MEP_TPREL7, 1, 7, 0, 0, 0, U, 0x007f), + MEPREL (R_MEP_LOW16, 2, 16, 0, 0, 0, N, 0x0000ffff), + MEPREL (R_MEP_HI16U, 2, 32, 0,16, 0, N, 0x0000ffff), + MEPREL (R_MEP_HI16S, 2, 32, 0,16, 0, N, 0x0000ffff), + MEPREL (R_MEP_GPREL, 2, 16, 0, 0, 0, S, 0x0000ffff), + MEPREL (R_MEP_TPREL, 2, 16, 0, 0, 0, S, 0x0000ffff), + MEPREL (R_MEP_TPREL7, 1, 7, 0, 0, 0, U, 0x007f), MEPREL (R_MEP_TPREL7A2, 1, 7, 1, 1, 0, U, 0x007e), MEPREL (R_MEP_TPREL7A4, 1, 7, 2, 2, 0, U, 0x007c), - MEPREL (R_MEP_UIMM24, 2, 24, 0, 0, 0, U, 0x00ffffff), + MEPREL (R_MEP_UIMM24, 2, 24, 0, 0, 0, U, 0x00ffffff), MEPREL (R_MEP_ADDR24A4, 2, 24, 0, 2, 0, U, 0x00fcffff), MEPREL (R_MEP_GNU_VTINHERIT,1, 0,16,32, 0, N, 0x0000), - MEPREL (R_MEP_GNU_VTENTRY,1, 0,16,32, 0, N, 0x0000), + MEPREL (R_MEP_GNU_VTENTRY,1, 0,16,32, 0, N, 0x0000), /* MEPRELOC:END */ }; @@ -76,20 +72,6 @@ static reloc_howto_type mep_elf_howto_table [] = #undef N #undef S #undef U - -static bfd_reloc_status_type -mep_reloc - (bfd * abfd ATTRIBUTE_UNUSED, - arelent * reloc_entry ATTRIBUTE_UNUSED, - struct bfd_symbol * symbol ATTRIBUTE_UNUSED, - void * data ATTRIBUTE_UNUSED, - asection * input_section ATTRIBUTE_UNUSED, - bfd * output_bfd ATTRIBUTE_UNUSED, - char ** error_message ATTRIBUTE_UNUSED) -{ - return bfd_reloc_ok; -} - #define BFD_RELOC_MEP_NONE BFD_RELOC_NONE @@ -154,14 +136,15 @@ mep_reloc_type_lookup default: /* Pacify gcc -Wall. */ - (*_bfd_error_handler) (_("mep: no reloc for code %d"), code); + _bfd_error_handler (_("mep: no reloc for code %d"), code); return NULL; } if (mep_elf_howto_table[type].type != type) { - (*_bfd_error_handler) (_("MeP: howto %d has type %d"), - type, mep_elf_howto_table[type].type); + /* xgettext:c-format */ + _bfd_error_handler (_("MeP: howto %d has type %d"), + type, mep_elf_howto_table[type].type); abort (); } @@ -230,12 +213,12 @@ mep_sdaoff_base (bfd_vma ofs) static bfd_reloc_status_type mep_final_link_relocate - (reloc_howto_type * howto, - bfd * input_bfd, - asection * input_section, - bfd_byte * contents, + (reloc_howto_type * howto, + bfd * input_bfd, + asection * input_section, + bfd_byte * contents, Elf_Internal_Rela * rel, - bfd_vma relocation) + bfd_vma relocation) { unsigned long u; long s; @@ -392,16 +375,24 @@ mep_final_link_relocate /* Set the howto pointer for a MEP ELF reloc. */ -static void -mep_info_to_howto_rela - (bfd * abfd ATTRIBUTE_UNUSED, - arelent * cache_ptr, - Elf_Internal_Rela * dst) +static bfd_boolean +mep_info_to_howto_rela (bfd * abfd, + arelent * cache_ptr, + Elf_Internal_Rela * dst) { unsigned int r_type; r_type = ELF32_R_TYPE (dst->r_info); + if (r_type >= R_MEP_max) + { + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } cache_ptr->howto = & mep_elf_howto_table [r_type]; + return TRUE; } /* Relocate a MEP ELF section. @@ -439,19 +430,19 @@ mep_info_to_howto_rela static bfd_boolean mep_elf_relocate_section - (bfd * output_bfd ATTRIBUTE_UNUSED, + (bfd * output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info * info, - bfd * input_bfd, - asection * input_section, - bfd_byte * contents, + bfd * input_bfd, + asection * input_section, + bfd_byte * contents, Elf_Internal_Rela * relocs, - Elf_Internal_Sym * local_syms, - asection ** local_sections) + Elf_Internal_Sym * local_syms, + asection ** local_sections) { - Elf_Internal_Shdr * symtab_hdr; + Elf_Internal_Shdr * symtab_hdr; struct elf_link_hash_entry ** sym_hashes; - Elf_Internal_Rela * rel; - Elf_Internal_Rela * relend; + Elf_Internal_Rela * rel; + Elf_Internal_Rela * relend; symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; sym_hashes = elf_sym_hashes (input_bfd); @@ -461,15 +452,15 @@ mep_elf_relocate_section for (rel = relocs; rel < relend; rel ++) { - reloc_howto_type * howto; - unsigned long r_symndx; - Elf_Internal_Sym * sym; - asection * sec; + reloc_howto_type * howto; + unsigned long r_symndx; + Elf_Internal_Sym * sym; + asection * sec; struct elf_link_hash_entry * h; - bfd_vma relocation; - bfd_reloc_status_type r; - const char * name = NULL; - int r_type; + bfd_vma relocation; + bfd_reloc_status_type r; + const char * name = NULL; + int r_type; r_type = ELF32_R_TYPE (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info); @@ -486,16 +477,16 @@ mep_elf_relocate_section name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name); - name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; + name = name == NULL ? bfd_section_name (sec) : name; } else { - bfd_boolean warned, unresolved_reloc; + bfd_boolean warned, unresolved_reloc, ignored; RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); name = h->root.root.string; } @@ -504,7 +495,7 @@ mep_elf_relocate_section RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; if (r_type == R_RELC) @@ -521,13 +512,13 @@ mep_elf_relocate_section switch (r) { case bfd_reloc_overflow: - r = info->callbacks->reloc_overflow + (*info->callbacks->reloc_overflow) (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - r = info->callbacks->undefined_symbol + (*info->callbacks->undefined_symbol) (info, name, input_bfd, input_section, rel->r_offset, TRUE); break; @@ -549,11 +540,8 @@ mep_elf_relocate_section } if (msg) - r = info->callbacks->warning - (info, msg, name, input_bfd, input_section, rel->r_offset); - - if (! r) - return FALSE; + (*info->callbacks->warning) (info, msg, name, input_bfd, + input_section, rel->r_offset); } } @@ -580,41 +568,26 @@ mep_elf_set_private_flags (bfd * abfd, return TRUE; } -static bfd_boolean -mep_elf_copy_private_bfd_data (bfd * ibfd, bfd * obfd) -{ - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - elf_flags_init (obfd) = TRUE; - - /* Copy object attributes. */ - _bfd_elf_copy_obj_attributes (ibfd, obfd); - - return TRUE; -} - /* Merge backend specific data from an object file to the output object file when linking. */ static bfd_boolean -mep_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) +mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; static bfd *last_ibfd = 0; flagword old_flags, new_flags; flagword old_partial, new_partial; /* Check if we have the same endianness. */ - if (_bfd_generic_verify_endian_match (ibfd, obfd) == FALSE) + if (!_bfd_generic_verify_endian_match (ibfd, info)) return FALSE; new_flags = elf_elfheader (ibfd)->e_flags; old_flags = elf_elfheader (obfd)->e_flags; #ifdef DEBUG - _bfd_error_handler ("%B: old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s", + _bfd_error_handler ("%pB: old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s", ibfd, old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no"); #endif @@ -645,7 +618,9 @@ mep_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) old_flags = (old_flags & ~EF_MEP_CPU_MASK) | new_partial; else { - _bfd_error_handler (_("%B and %B are for different cores"), last_ibfd, ibfd); + /* xgettext:c-format */ + _bfd_error_handler (_("%pB and %pB are for different cores"), + last_ibfd, ibfd); bfd_set_error (bfd_error_invalid_target); return FALSE; } @@ -662,7 +637,9 @@ mep_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) old_flags = (old_flags & ~EF_MEP_INDEX_MASK) | new_partial; else { - _bfd_error_handler (_("%B and %B are for different configurations"), last_ibfd, ibfd); + /* xgettext:c-format */ + _bfd_error_handler (_("%pB and %pB are for different configurations"), + last_ibfd, ibfd); bfd_set_error (bfd_error_invalid_target); return FALSE; } @@ -740,17 +717,17 @@ mep_elf_object_p (bfd * abfd) } static bfd_boolean -mep_elf_section_flags (flagword * flags, const Elf_Internal_Shdr * hdr) +mep_elf_section_flags (const Elf_Internal_Shdr *hdr) { if (hdr->sh_flags & SHF_MEP_VLIW) - * flags |= SEC_MEP_VLIW; + hdr->bfd_section->flags |= SEC_MEP_VLIW; return TRUE; } static bfd_boolean -mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED, +mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED, Elf_Internal_Shdr * hdr, - asection * sec) + asection * sec) { if (sec->flags & SEC_MEP_VLIW) hdr->sh_flags |= SHF_MEP_VLIW; @@ -762,23 +739,22 @@ mep_elf_fake_sections (bfd * abfd ATTRIBUTE_UNUSED, #define ELF_MACHINE_CODE EM_CYGNUS_MEP #define ELF_MAXPAGESIZE 0x1000 -#define TARGET_BIG_SYM bfd_elf32_mep_vec +#define TARGET_BIG_SYM mep_elf32_vec #define TARGET_BIG_NAME "elf32-mep" -#define TARGET_LITTLE_SYM bfd_elf32_mep_little_vec +#define TARGET_LITTLE_SYM mep_elf32_le_vec #define TARGET_LITTLE_NAME "elf32-mep-little" #define elf_info_to_howto_rel NULL #define elf_info_to_howto mep_info_to_howto_rela #define elf_backend_relocate_section mep_elf_relocate_section -#define elf_backend_object_p mep_elf_object_p +#define elf_backend_object_p mep_elf_object_p #define elf_backend_section_flags mep_elf_section_flags #define elf_backend_fake_sections mep_elf_fake_sections #define bfd_elf32_bfd_reloc_type_lookup mep_reloc_type_lookup #define bfd_elf32_bfd_reloc_name_lookup mep_reloc_name_lookup #define bfd_elf32_bfd_set_private_flags mep_elf_set_private_flags -#define bfd_elf32_bfd_copy_private_bfd_data mep_elf_copy_private_bfd_data #define bfd_elf32_bfd_merge_private_bfd_data mep_elf_merge_private_bfd_data #define bfd_elf32_bfd_print_private_bfd_data mep_elf_print_private_bfd_data