X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-sh64.c;h=4e88de936d6611119a516d44322a000db8a929f9;hb=c88960d081f0b37ec03c66a13115e2a68e40d1ad;hp=62cf2e61a8dd424368ceb011ccf505f04a8a30ee;hpb=beb8df56a1b4c58ed3d79b3cec93c15f91290147;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-sh64.c b/bfd/elf32-sh64.c index 62cf2e61a8..4e88de936d 100644 --- a/bfd/elf32-sh64.c +++ b/bfd/elf32-sh64.c @@ -1,11 +1,11 @@ /* SuperH SH64-specific support for 32-bit ELF - Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2000-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, @@ -15,12 +15,13 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ #define SH64_ELF -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "elf-bfd.h" #include "../opcodes/sh64-opc.h" #include "elf32-sh64.h" @@ -58,11 +59,11 @@ static int sh64_elf_get_symbol_type static bfd_boolean sh64_elf_add_symbol_hook (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **, flagword *, asection **, bfd_vma *); -static bfd_boolean sh64_elf_link_output_symbol_hook +static int sh64_elf_link_output_symbol_hook (struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *, struct elf_link_hash_entry *); static bfd_boolean sh64_backend_section_from_shdr - (bfd *, Elf_Internal_Shdr *, const char *); + (bfd *, Elf_Internal_Shdr *, const char *, int); static void sh64_elf_final_write_processing (bfd *, bfd_boolean); static bfd_boolean sh64_bfd_elf_copy_private_section_data @@ -102,10 +103,12 @@ static void sh64_find_section_for_address /* This COFF-only function (only compiled with COFF support, making ELF-only chains problematic) returns TRUE early for SH4, so let's just define it TRUE here. */ -#define _bfd_sh_align_load_span(a,b,c,d,e,f,g,h,i,j) TRUE +#define _bfd_sh_align_load_span(a,b,c,d,e,f,g,h,i,j) \ + ((void) f, (void) h, (void) i, TRUE) #define GOT_BIAS (-((long)-32768)) #define INCLUDE_SHMEDIA +#define SH_TARGET_ALREADY_DEFINED #include "elf32-sh.c" /* Tack some extra info on struct bfd_elf_section_data. */ @@ -113,13 +116,16 @@ static void sh64_find_section_for_address static bfd_boolean sh64_elf_new_section_hook (bfd *abfd, asection *sec) { - struct _sh64_elf_section_data *sdata; - bfd_size_type amt = sizeof (*sdata); + if (!sec->used_by_bfd) + { + struct _sh64_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); - sdata = (struct _sh64_elf_section_data *) bfd_zalloc (abfd, amt); - if (sdata == NULL) - return FALSE; - sec->used_by_bfd = sdata; + sdata = bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = sdata; + } return _bfd_elf_new_section_hook (abfd, sec); } @@ -192,7 +198,8 @@ sh64_elf_copy_private_data (bfd * ibfd, bfd * obfd) == elf_elfheader (ibfd)->e_flags)); elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - return TRUE; + + return _bfd_elf_copy_private_bfd_data (ibfd, obfd); } static bfd_boolean @@ -251,13 +258,14 @@ sh64_elf_merge_private_data (bfd *ibfd, bfd *obfd) } /* Handle a SH64-specific section when reading an object file. This - is called when elfcode.h finds a section with an unknown type. + is called when bfd_section_from_shdr finds a section with an unknown + type. We only recognize SHT_SH5_CR_SORTED, on the .cranges section. */ bfd_boolean sh64_backend_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, - const char *name) + const char *name, int shindex) { flagword flags = 0; @@ -282,7 +290,7 @@ sh64_backend_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, return FALSE; } - if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) + if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex)) return FALSE; if (flags @@ -389,7 +397,7 @@ sh64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, right, and tweak the name when it's output. Otherwise, we make an indirect symbol of it. */ flagword flags - = info->relocatable || info->emitrelocations + = bfd_link_relocatable (info) || info->emitrelocations ? BSF_GLOBAL : BSF_GLOBAL | BSF_INDIRECT; char *dl_name @@ -424,7 +432,7 @@ sh64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, } h = (struct elf_link_hash_entry *) bh; - h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; + h->non_elf = 0; h->type = STT_DATALABEL; } else @@ -433,9 +441,9 @@ sh64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, free (dl_name); if (h->type != STT_DATALABEL - || ((info->relocatable || info->emitrelocations) + || ((bfd_link_relocatable (info) || info->emitrelocations) && h->root.type != bfd_link_hash_undefined) - || (! info->relocatable && !info->emitrelocations + || (! bfd_link_relocatable (info) && !info->emitrelocations && h->root.type != bfd_link_hash_indirect)) { /* Make sure we don't get confused on invalid input. */ @@ -470,7 +478,7 @@ sh64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, we don't need to look up and make sure to emit the main symbol for each DataLabel symbol. */ -bfd_boolean +static int sh64_elf_link_output_symbol_hook (struct bfd_link_info *info, const char *cname, Elf_Internal_Sym *sym, @@ -479,13 +487,13 @@ sh64_elf_link_output_symbol_hook (struct bfd_link_info *info, { char *name = (char *) cname; - if (info->relocatable || info->emitrelocations) + if (bfd_link_relocatable (info) || info->emitrelocations) { if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL) name[strlen (name) - strlen (DATALABEL_SUFFIX)] = 0; } - return TRUE; + return 1; } /* Check a SH64-specific reloc and put the value to relocate to into @@ -522,11 +530,9 @@ shmedia_prepare_reloc (struct bfd_link_info *info, bfd *abfd, && ((*relocation + rel->r_addend) & 1) == 0) msg = _("PTA mismatch: a SHcompact address (bit 0 == 0)"); - if (msg != NULL - && ! ((*info->callbacks->reloc_dangerous) - (info, msg, abfd, input_section, - rel->r_offset))) - return FALSE; + if (msg != NULL) + (*info->callbacks->reloc_dangerous) + (info, msg, abfd, input_section, rel->r_offset); } else { @@ -587,9 +593,9 @@ shmedia_prepare_reloc (struct bfd_link_info *info, bfd *abfd, if (dropped != 0) { (*_bfd_error_handler) - (_("%s: error: unaligned relocation type %d at %08x reloc %08x\n"), - bfd_get_filename (input_section->owner), ELF32_R_TYPE (rel->r_info), - (unsigned)rel->r_offset, (unsigned)relocation); + (_("%B: error: unaligned relocation type %d at %08x reloc %p\n"), + input_section->owner, ELF32_R_TYPE (rel->r_info), + (unsigned) rel->r_offset, relocation); return FALSE; } @@ -605,6 +611,7 @@ sh64_find_section_for_address (bfd *abfd ATTRIBUTE_UNUSED, { bfd_vma vma; bfd_size_type size; + struct sh64_find_section_vma_data *fsec_datap = (struct sh64_find_section_vma_data *) data; @@ -620,11 +627,7 @@ sh64_find_section_for_address (bfd *abfd ATTRIBUTE_UNUSED, if (fsec_datap->addr < vma) return; - /* FIXME: section->reloc_done isn't set properly; a generic buglet - preventing us from using bfd_get_section_size_after_reloc. */ - size - = section->_cooked_size ? section->_cooked_size : section->_raw_size; - + size = section->size; if (fsec_datap->addr >= vma + size) return; @@ -655,9 +658,7 @@ sh64_elf_final_write_processing (bfd *abfd, = sh64_elf_section_data (cranges)->sh64_info->cranges_growth) != 0) { bfd_vma incoming_cranges_size - = ((cranges->_cooked_size != 0 - ? cranges->_cooked_size : cranges->_raw_size) - - ld_generated_cranges_size); + = cranges->size - ld_generated_cranges_size; if (! bfd_set_section_contents (abfd, cranges, cranges->contents @@ -700,9 +701,7 @@ sh64_elf_final_write_processing (bfd *abfd, /* If we have a .cranges section, sort the entries. */ if (cranges != NULL) { - bfd_size_type cranges_size - = (cranges->_cooked_size != 0 - ? cranges->_cooked_size : cranges->_raw_size); + bfd_size_type cranges_size = cranges->size; /* We know we always have these in memory at this time. */ BFD_ASSERT (cranges->contents != NULL); @@ -743,9 +742,9 @@ static void sh64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h, const Elf_Internal_Sym *isym, bfd_boolean definition, - bfd_boolean dynamic) + bfd_boolean dynamic ATTRIBUTE_UNUSED) { - if (isym->st_other != 0 && dynamic) + if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0) { unsigned char other; @@ -758,18 +757,18 @@ sh64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h, return; } -static struct bfd_elf_special_section const sh64_elf_special_sections[]= +static const struct bfd_elf_special_section sh64_elf_special_sections[] = { - { ".cranges", 8, 0, SHT_PROGBITS, 0 }, - { NULL, 0, 0, 0, 0 } + { STRING_COMMA_LEN (".cranges"), 0, SHT_PROGBITS, 0 }, + { NULL, 0, 0, 0, 0 } }; #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_sh64_vec +#define TARGET_BIG_SYM sh64_elf32_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-sh64" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_sh64l_vec +#define TARGET_LITTLE_SYM sh64_elf32_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-sh64l" @@ -777,15 +776,16 @@ static struct bfd_elf_special_section const sh64_elf_special_sections[]= /* NetBSD support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_sh64nbsd_vec +#define TARGET_BIG_SYM sh64_elf32_nbsd_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-sh64-nbsd" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_sh64lnbsd_vec +#define TARGET_LITTLE_SYM sh64_elf32_nbsd_le_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-sh64l-nbsd" #undef ELF_MAXPAGESIZE #define ELF_MAXPAGESIZE 0x10000 +#undef ELF_COMMONPAGESIZE #undef elf_symbol_leading_char #define elf_symbol_leading_char 0 #undef elf32_bed @@ -795,15 +795,17 @@ static struct bfd_elf_special_section const sh64_elf_special_sections[]= /* Linux support. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_sh64blin_vec +#define TARGET_BIG_SYM sh64_elf32_linux_be_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-sh64big-linux" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfd_elf32_sh64lin_vec +#define TARGET_LITTLE_SYM sh64_elf32_linux_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-sh64-linux" #undef elf32_bed #define elf32_bed elf32_sh64_lin_bed +#undef ELF_COMMONPAGESIZE +#define ELF_COMMONPAGESIZE 0x1000 #include "elf32-target.h"