| Index: bfd/elf-m10200.c
|
| diff --git a/bfd/elf-m10200.c b/bfd/elf-m10200.c
|
| index a38f4db8a0a4a8d5d4366c782904f249044e2bac..f427f97cbf9095cd3fdfb9a00c1cba733cb1d3bd 100644
|
| --- a/bfd/elf-m10200.c
|
| +++ b/bfd/elf-m10200.c
|
| @@ -1,6 +1,6 @@
|
| /* Matsushita 10200 specific support for 32-bit ELF
|
| Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
| - 2007, 2010
|
| + 2007, 2010, 2012
|
| Free Software Foundation, Inc.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
| @@ -25,29 +25,13 @@
|
| #include "libbfd.h"
|
| #include "elf-bfd.h"
|
|
|
| -static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
|
| - PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
|
| -static void mn10200_info_to_howto
|
| - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
|
| -static bfd_boolean mn10200_elf_relax_delete_bytes
|
| - PARAMS ((bfd *, asection *, bfd_vma, int));
|
| -static bfd_boolean mn10200_elf_symbol_address_p
|
| - PARAMS ((bfd *, asection *, Elf_Internal_Sym *, bfd_vma));
|
| -static bfd_reloc_status_type mn10200_elf_final_link_relocate
|
| - PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
|
| - bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
|
| - struct bfd_link_info *, asection *, int));
|
| -static bfd_boolean mn10200_elf_relocate_section
|
| - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
|
| - bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *,
|
| - asection **));
|
| -static bfd_boolean mn10200_elf_relax_section
|
| - PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
|
| -static bfd_byte * mn10200_elf_get_relocated_section_contents
|
| - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
|
| - bfd_byte *, bfd_boolean, asymbol **));
|
| -
|
| -enum reloc_type {
|
| +static bfd_boolean
|
| +mn10200_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
|
| +static bfd_boolean
|
| +mn10200_elf_symbol_address_p (bfd *, asection *, Elf_Internal_Sym *, bfd_vma);
|
| +
|
| +enum reloc_type
|
| +{
|
| R_MN10200_NONE = 0,
|
| R_MN10200_32,
|
| R_MN10200_16,
|
| @@ -59,7 +43,8 @@ enum reloc_type {
|
| R_MN10200_MAX
|
| };
|
|
|
| -static reloc_howto_type elf_mn10200_howto_table[] = {
|
| +static reloc_howto_type elf_mn10200_howto_table[] =
|
| +{
|
| /* Dummy relocation. Does nothing. */
|
| HOWTO (R_MN10200_NONE,
|
| 0,
|
| @@ -175,12 +160,14 @@ static reloc_howto_type elf_mn10200_howto_table[] = {
|
| TRUE),
|
| };
|
|
|
| -struct mn10200_reloc_map {
|
| +struct mn10200_reloc_map
|
| +{
|
| bfd_reloc_code_real_type bfd_reloc_val;
|
| unsigned char elf_reloc_val;
|
| };
|
|
|
| -static const struct mn10200_reloc_map mn10200_reloc_map[] = {
|
| +static const struct mn10200_reloc_map mn10200_reloc_map[] =
|
| +{
|
| { BFD_RELOC_NONE , R_MN10200_NONE , },
|
| { BFD_RELOC_32 , R_MN10200_32 , },
|
| { BFD_RELOC_16 , R_MN10200_16 , },
|
| @@ -192,9 +179,8 @@ static const struct mn10200_reloc_map mn10200_reloc_map[] = {
|
| };
|
|
|
| static reloc_howto_type *
|
| -bfd_elf32_bfd_reloc_type_lookup (abfd, code)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - bfd_reloc_code_real_type code;
|
| +bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
| + bfd_reloc_code_real_type code)
|
| {
|
| unsigned int i;
|
|
|
| @@ -229,10 +215,9 @@ bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
| /* Set the howto pointer for an MN10200 ELF reloc. */
|
|
|
| static void
|
| -mn10200_info_to_howto (abfd, cache_ptr, dst)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - arelent *cache_ptr;
|
| - Elf_Internal_Rela *dst;
|
| +mn10200_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
|
| + arelent *cache_ptr,
|
| + Elf_Internal_Rela *dst)
|
| {
|
| unsigned int r_type;
|
|
|
| @@ -244,20 +229,17 @@ mn10200_info_to_howto (abfd, cache_ptr, dst)
|
| /* Perform a relocation as part of a final link. */
|
|
|
| static bfd_reloc_status_type
|
| -mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
| - input_section, contents, offset, value,
|
| - addend, info, sym_sec, is_local)
|
| - reloc_howto_type *howto;
|
| - bfd *input_bfd;
|
| - bfd *output_bfd ATTRIBUTE_UNUSED;
|
| - asection *input_section;
|
| - bfd_byte *contents;
|
| - bfd_vma offset;
|
| - bfd_vma value;
|
| - bfd_vma addend;
|
| - struct bfd_link_info *info ATTRIBUTE_UNUSED;
|
| - asection *sym_sec ATTRIBUTE_UNUSED;
|
| - int is_local ATTRIBUTE_UNUSED;
|
| +mn10200_elf_final_link_relocate (reloc_howto_type *howto,
|
| + bfd *input_bfd,
|
| + bfd *output_bfd ATTRIBUTE_UNUSED,
|
| + asection *input_section,
|
| + bfd_byte *contents,
|
| + bfd_vma offset,
|
| + bfd_vma value,
|
| + bfd_vma addend,
|
| + struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
| + asection *sym_sec ATTRIBUTE_UNUSED,
|
| + int is_local ATTRIBUTE_UNUSED)
|
| {
|
| unsigned long r_type = howto->type;
|
| bfd_byte *hit_data = contents + offset;
|
| @@ -347,16 +329,14 @@ mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
|
|
| /* Relocate an MN10200 ELF section. */
|
| static bfd_boolean
|
| -mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
| - contents, relocs, local_syms, local_sections)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *info;
|
| - bfd *input_bfd;
|
| - asection *input_section;
|
| - bfd_byte *contents;
|
| - Elf_Internal_Rela *relocs;
|
| - Elf_Internal_Sym *local_syms;
|
| - asection **local_sections;
|
| +mn10200_elf_relocate_section (bfd *output_bfd,
|
| + struct bfd_link_info *info,
|
| + bfd *input_bfd,
|
| + asection *input_section,
|
| + bfd_byte *contents,
|
| + Elf_Internal_Rela *relocs,
|
| + Elf_Internal_Sym *local_syms,
|
| + asection **local_sections)
|
| {
|
| Elf_Internal_Shdr *symtab_hdr;
|
| struct elf_link_hash_entry **sym_hashes;
|
| @@ -401,9 +381,9 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
| unresolved_reloc, warned);
|
| }
|
|
|
| - if (sec != NULL && elf_discarded_section (sec))
|
| + if (sec != NULL && discarded_section (sec))
|
| RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
| - rel, relend, howto, contents);
|
| + rel, 1, relend, howto, 0, contents);
|
|
|
| if (info->relocatable)
|
| continue;
|
| @@ -475,6 +455,78 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
| return TRUE;
|
| }
|
|
|
| +/* Delete some bytes from a section while relaxing. */
|
| +
|
| +static bfd_boolean
|
| +mn10200_elf_relax_delete_bytes (bfd *abfd, asection *sec,
|
| + bfd_vma addr, int count)
|
| +{
|
| + Elf_Internal_Shdr *symtab_hdr;
|
| + unsigned int sec_shndx;
|
| + bfd_byte *contents;
|
| + Elf_Internal_Rela *irel, *irelend;
|
| + bfd_vma toaddr;
|
| + Elf_Internal_Sym *isym;
|
| + Elf_Internal_Sym *isymend;
|
| + struct elf_link_hash_entry **sym_hashes;
|
| + struct elf_link_hash_entry **end_hashes;
|
| + unsigned int symcount;
|
| +
|
| + sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
|
| +
|
| + contents = elf_section_data (sec)->this_hdr.contents;
|
| +
|
| + toaddr = sec->size;
|
| +
|
| + irel = elf_section_data (sec)->relocs;
|
| + irelend = irel + sec->reloc_count;
|
| +
|
| + /* Actually delete the bytes. */
|
| + memmove (contents + addr, contents + addr + count,
|
| + (size_t) (toaddr - addr - count));
|
| + sec->size -= count;
|
| +
|
| + /* Adjust all the relocs. */
|
| + for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
|
| + {
|
| + /* Get the new reloc address. */
|
| + if ((irel->r_offset > addr
|
| + && irel->r_offset < toaddr))
|
| + irel->r_offset -= count;
|
| + }
|
| +
|
| + /* Adjust the local symbols defined in this section. */
|
| + symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
| + isym = (Elf_Internal_Sym *) symtab_hdr->contents;
|
| + for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
|
| + {
|
| + if (isym->st_shndx == sec_shndx
|
| + && isym->st_value > addr
|
| + && isym->st_value < toaddr)
|
| + isym->st_value -= count;
|
| + }
|
| +
|
| + /* Now adjust the global symbols defined in this section. */
|
| + symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
|
| + - symtab_hdr->sh_info);
|
| + sym_hashes = elf_sym_hashes (abfd);
|
| + end_hashes = sym_hashes + symcount;
|
| + for (; sym_hashes < end_hashes; sym_hashes++)
|
| + {
|
| + struct elf_link_hash_entry *sym_hash = *sym_hashes;
|
| + if ((sym_hash->root.type == bfd_link_hash_defined
|
| + || sym_hash->root.type == bfd_link_hash_defweak)
|
| + && sym_hash->root.u.def.section == sec
|
| + && sym_hash->root.u.def.value > addr
|
| + && sym_hash->root.u.def.value < toaddr)
|
| + {
|
| + sym_hash->root.u.def.value -= count;
|
| + }
|
| + }
|
| +
|
| + return TRUE;
|
| +}
|
| +
|
| /* This function handles relaxing for the mn10200.
|
|
|
| There are quite a few relaxing opportunities available on the mn10200:
|
| @@ -505,11 +557,10 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
| and somewhat more difficult to support. */
|
|
|
| static bfd_boolean
|
| -mn10200_elf_relax_section (abfd, sec, link_info, again)
|
| - bfd *abfd;
|
| - asection *sec;
|
| - struct bfd_link_info *link_info;
|
| - bfd_boolean *again;
|
| +mn10200_elf_relax_section (bfd *abfd,
|
| + asection *sec,
|
| + struct bfd_link_info *link_info,
|
| + bfd_boolean *again)
|
| {
|
| Elf_Internal_Shdr *symtab_hdr;
|
| Elf_Internal_Rela *internal_relocs;
|
| @@ -533,7 +584,7 @@ mn10200_elf_relax_section (abfd, sec, link_info, again)
|
|
|
| /* Get a copy of the native relocations. */
|
| internal_relocs = (_bfd_elf_link_read_relocs
|
| - (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
|
| + (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
|
| link_info->keep_memory));
|
| if (internal_relocs == NULL)
|
| goto error_return;
|
| @@ -1174,89 +1225,13 @@ mn10200_elf_relax_section (abfd, sec, link_info, again)
|
| return FALSE;
|
| }
|
|
|
| -/* Delete some bytes from a section while relaxing. */
|
| -
|
| -static bfd_boolean
|
| -mn10200_elf_relax_delete_bytes (abfd, sec, addr, count)
|
| - bfd *abfd;
|
| - asection *sec;
|
| - bfd_vma addr;
|
| - int count;
|
| -{
|
| - Elf_Internal_Shdr *symtab_hdr;
|
| - unsigned int sec_shndx;
|
| - bfd_byte *contents;
|
| - Elf_Internal_Rela *irel, *irelend;
|
| - bfd_vma toaddr;
|
| - Elf_Internal_Sym *isym;
|
| - Elf_Internal_Sym *isymend;
|
| - struct elf_link_hash_entry **sym_hashes;
|
| - struct elf_link_hash_entry **end_hashes;
|
| - unsigned int symcount;
|
| -
|
| - sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
|
| -
|
| - contents = elf_section_data (sec)->this_hdr.contents;
|
| -
|
| - toaddr = sec->size;
|
| -
|
| - irel = elf_section_data (sec)->relocs;
|
| - irelend = irel + sec->reloc_count;
|
| -
|
| - /* Actually delete the bytes. */
|
| - memmove (contents + addr, contents + addr + count,
|
| - (size_t) (toaddr - addr - count));
|
| - sec->size -= count;
|
| -
|
| - /* Adjust all the relocs. */
|
| - for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
|
| - {
|
| - /* Get the new reloc address. */
|
| - if ((irel->r_offset > addr
|
| - && irel->r_offset < toaddr))
|
| - irel->r_offset -= count;
|
| - }
|
| -
|
| - /* Adjust the local symbols defined in this section. */
|
| - symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
| - isym = (Elf_Internal_Sym *) symtab_hdr->contents;
|
| - for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
|
| - {
|
| - if (isym->st_shndx == sec_shndx
|
| - && isym->st_value > addr
|
| - && isym->st_value < toaddr)
|
| - isym->st_value -= count;
|
| - }
|
| -
|
| - /* Now adjust the global symbols defined in this section. */
|
| - symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
|
| - - symtab_hdr->sh_info);
|
| - sym_hashes = elf_sym_hashes (abfd);
|
| - end_hashes = sym_hashes + symcount;
|
| - for (; sym_hashes < end_hashes; sym_hashes++)
|
| - {
|
| - struct elf_link_hash_entry *sym_hash = *sym_hashes;
|
| - if ((sym_hash->root.type == bfd_link_hash_defined
|
| - || sym_hash->root.type == bfd_link_hash_defweak)
|
| - && sym_hash->root.u.def.section == sec
|
| - && sym_hash->root.u.def.value > addr
|
| - && sym_hash->root.u.def.value < toaddr)
|
| - {
|
| - sym_hash->root.u.def.value -= count;
|
| - }
|
| - }
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| /* Return TRUE if a symbol exists at the given address, else return
|
| FALSE. */
|
| static bfd_boolean
|
| -mn10200_elf_symbol_address_p (abfd, sec, isym, addr)
|
| - bfd *abfd;
|
| - asection *sec;
|
| - Elf_Internal_Sym *isym;
|
| - bfd_vma addr;
|
| +mn10200_elf_symbol_address_p (bfd *abfd,
|
| + asection *sec,
|
| + Elf_Internal_Sym *isym,
|
| + bfd_vma addr)
|
| {
|
| Elf_Internal_Shdr *symtab_hdr;
|
| unsigned int sec_shndx;
|
| @@ -1297,14 +1272,12 @@ mn10200_elf_symbol_address_p (abfd, sec, isym, addr)
|
| which uses mn10200_elf_relocate_section. */
|
|
|
| static bfd_byte *
|
| -mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
|
| - data, relocatable, symbols)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *link_info;
|
| - struct bfd_link_order *link_order;
|
| - bfd_byte *data;
|
| - bfd_boolean relocatable;
|
| - asymbol **symbols;
|
| +mn10200_elf_get_relocated_section_contents (bfd *output_bfd,
|
| + struct bfd_link_info *link_info,
|
| + struct bfd_link_order *link_order,
|
| + bfd_byte *data,
|
| + bfd_boolean relocatable,
|
| + asymbol **symbols)
|
| {
|
| Elf_Internal_Shdr *symtab_hdr;
|
| asection *input_section = link_order->u.indirect.section;
|
| @@ -1336,7 +1309,7 @@ mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
|
| bfd_size_type amt;
|
|
|
| internal_relocs = (_bfd_elf_link_read_relocs
|
| - (input_bfd, input_section, (PTR) NULL,
|
| + (input_bfd, input_section, NULL,
|
| (Elf_Internal_Rela *) NULL, FALSE));
|
| if (internal_relocs == NULL)
|
| goto error_return;
|
|
|