X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-dlx.c;h=b5c7d6e8a80387191eb9ddf9de0de59ef8b2f3bb;hb=f4583255d5a16b76c249e3c28ab9c8dd9e7a110e;hp=ae42baf3a632c424b3b7088c9704a64fb4497f68;hpb=47b0e7ad8c60ea4b45b22ad5cb376f068991bc88;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-dlx.c b/bfd/elf32-dlx.c index ae42baf3a6..b5c7d6e8a8 100644 --- a/bfd/elf32-dlx.c +++ b/bfd/elf32-dlx.c @@ -1,11 +1,11 @@ /* DLX specific support for 32-bit ELF - Copyright 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2002-2016 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -18,8 +18,8 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "libbfd.h" #include "elf-bfd.h" #include "elf/dlx.h" @@ -27,6 +27,7 @@ #define USE_REL 1 #define bfd_elf32_bfd_reloc_type_lookup elf32_dlx_reloc_type_lookup +#define bfd_elf32_bfd_reloc_name_lookup elf32_dlx_reloc_name_lookup #define elf_info_to_howto elf32_dlx_info_to_howto #define elf_info_to_howto_rel elf32_dlx_info_to_howto_rel #define elf_backend_check_relocs elf32_dlx_check_relocs @@ -137,9 +138,8 @@ elf32_dlx_relocate16 (bfd *abfd, /* Can not support a long jump to sections other then .text. */ if (strcmp (input_section->name, symbol->section->output_section->name) != 0) { - fprintf (stderr, - "BFD Link Error: branch (PC rel16) to section (%s) not supported\n", - symbol->section->output_section->name); + (*_bfd_error_handler) (_("BFD Link Error: branch (PC rel16) to section (%s) not supported"), + symbol->section->output_section->name); return bfd_reloc_undefined; } @@ -200,9 +200,8 @@ elf32_dlx_relocate26 (bfd *abfd, /* Can not support a long jump to sections other then .text */ if (strcmp (input_section->name, symbol->section->output_section->name) != 0) { - fprintf (stderr, - "BFD Link Error: jump (PC rel26) to section (%s) not supported\n", - symbol->section->output_section->name); + (*_bfd_error_handler) (_("BFD Link Error: jump (PC rel26) to section (%s) not supported"), + symbol->section->output_section->name); return bfd_reloc_undefined; } @@ -238,7 +237,7 @@ static reloc_howto_type dlx_elf_howto_table[]= /* No relocation. */ HOWTO (R_DLX_NONE, /* Type. */ 0, /* Rightshift. */ - 0, /* size (0 = byte, 1 = short, 2 = long). */ + 3, /* size (0 = byte, 1 = short, 2 = long). */ 0, /* Bitsize. */ FALSE, /* PC_relative. */ 0, /* Bitpos. */ @@ -426,18 +425,15 @@ elf32_dlx_check_relocs (bfd *abfd, const Elf_Internal_Rela *relocs) { Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; + struct elf_link_hash_entry **sym_hashes; const Elf_Internal_Rela *rel; const Elf_Internal_Rela *rel_end; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; sym_hashes = elf_sym_hashes (abfd); - sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym); - if (!elf_bad_symtab (abfd)) - sym_hashes_end -= symtab_hdr->sh_info; rel_end = relocs + sec->reloc_count; for (rel = relocs; rel < rel_end; rel++) @@ -454,6 +450,10 @@ elf32_dlx_check_relocs (bfd *abfd, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + + /* PR15323, ref flags aren't set for references in the same + object. */ + h->root.non_ir_ref = 1; } switch (ELF32_R_TYPE (rel->r_info)) @@ -468,7 +468,9 @@ elf32_dlx_check_relocs (bfd *abfd, /* This relocation describes which C++ vtable entries are actually used. Record for later use during GC. */ case R_DLX_GNU_VTENTRY: - if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + BFD_ASSERT (h != NULL); + if (h != NULL + && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) return FALSE; break; } @@ -505,6 +507,31 @@ elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, } } +static reloc_howto_type * +elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, + const char *r_name) +{ + unsigned int i; + + for (i = 0; + i < sizeof (dlx_elf_howto_table) / sizeof (dlx_elf_howto_table[0]); + i++) + if (dlx_elf_howto_table[i].name != NULL + && strcasecmp (dlx_elf_howto_table[i].name, r_name) == 0) + return &dlx_elf_howto_table[i]; + + if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0) + return &elf_dlx_gnu_rel16_s2; + if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0) + return &elf_dlx_gnu_rel26_s2; + if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0) + return &elf_dlx_reloc_16_hi; + if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0) + return &elf_dlx_reloc_16_lo; + + return NULL; +} + static reloc_howto_type * dlx_rtype_to_howto (unsigned int r_type) { @@ -512,21 +539,19 @@ dlx_rtype_to_howto (unsigned int r_type) { case R_DLX_RELOC_16_PCREL: return & elf_dlx_gnu_rel16_s2; - break; case R_DLX_RELOC_26_PCREL: return & elf_dlx_gnu_rel26_s2; - break; case R_DLX_RELOC_16_HI: return & elf_dlx_reloc_16_hi; - break; case R_DLX_RELOC_16_LO: return & elf_dlx_reloc_16_lo; - break; - default: - BFD_ASSERT (r_type < (unsigned int) R_DLX_max); + if (r_type >= (unsigned int) R_DLX_max) + { + _bfd_error_handler (_("Invalid DLX reloc number: %d"), r_type); + r_type = 0; + } return & dlx_elf_howto_table[r_type]; - break; } } @@ -550,7 +575,7 @@ elf32_dlx_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, return; } -#define TARGET_BIG_SYM bfd_elf32_dlx_big_vec +#define TARGET_BIG_SYM dlx_elf32_be_vec #define TARGET_BIG_NAME "elf32-dlx" #define ELF_ARCH bfd_arch_dlx #define ELF_MACHINE_CODE EM_DLX