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; |