diff options
-rw-r--r-- | bfd/ChangeLog | 13 | ||||
-rw-r--r-- | bfd/cpu-h8300.c | 19 | ||||
-rw-r--r-- | bfd/elf.c | 14 | ||||
-rw-r--r-- | bfd/elf32-h8300.c | 109 |
4 files changed, 140 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 52fd4b0..1f6d5b3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,4 +1,15 @@ -2001-08-29 Alan Modra <amodra@bigpond.net.au> +2000-08-29 Jeff Law <law@redhat.com> + + * cpu-h8300.c (h8300_scan, compatible): Prototype. + (h8300_scan): Handle architecture:machine encodings typically + found in linker scripts. + * elf.c (prep_headers): Do not try to do H8 machine recognition + here. + * elf32-h8300.c: Add some missing prototypes. + (elf32_h8_mach, elf32_h8_final_write_processing): New functions. + (elf32_h8_object_p): Similarly. + +2000-08-29 Alan Modra <amodra@bigpond.net.au> * targmatch.sed: Delete case statements. * config.bfd <powerpc-*-aix* entry>: Select 64 bit xcoff for diff --git a/bfd/cpu-h8300.c b/bfd/cpu-h8300.c index b25842e..4e36952 100644 --- a/bfd/cpu-h8300.c +++ b/bfd/cpu-h8300.c @@ -1,5 +1,5 @@ /* BFD library support routines for the Hitachi H8/300 architecture. - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2000 + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 2000, 2001 Free Software Foundation, Inc. Hacked by Steve Chamberlain of Cygnus Support. @@ -25,6 +25,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ int bfd_default_scan_num_mach (); +static boolean h8300_scan + PARAMS ((const struct bfd_arch_info *, const char *)); +static const bfd_arch_info_type * compatible + PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); + static boolean h8300_scan (info, string) const struct bfd_arch_info *info; @@ -52,6 +57,18 @@ h8300_scan (info, string) string++; if (*string == '-') string++; + + /* In ELF linker scripts, we typically express the architecture/machine + as architecture:machine. + + So if we've matched so far and encounter a colon, try to match the + string following the colon. */ + if (*string == ':') + { + string++; + h8300_scan (info, string); + } + if (*string == 'h' || *string == 'H') { return (info->mach == bfd_mach_h8300h); @@ -3452,19 +3452,7 @@ prep_headers (abfd) break; /* Also note that EM_M32, AT&T WE32100 is unknown to bfd. */ case bfd_arch_h8300: - switch (bfd_get_mach (abfd)) - { - default: - case bfd_mach_h8300: - i_ehdrp->e_machine = EM_H8_300; - break; - case bfd_mach_h8300h: - i_ehdrp->e_machine = EM_H8_300H; - break; - case bfd_mach_h8300s: - i_ehdrp->e_machine = EM_H8S; - break; - } + i_ehdrp->e_machine = EM_H8_300; break; case bfd_arch_h8500: i_ehdrp->e_machine = EM_H8_500; diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c index c2474dd..01a6355 100644 --- a/bfd/elf32-h8300.c +++ b/bfd/elf32-h8300.c @@ -184,6 +184,15 @@ static const struct elf_reloc_map h8_reloc_map[] = { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X }, }; +static reloc_howto_type *elf32_h8_reloc_type_lookup + PARAMS ((bfd *, bfd_reloc_code_real_type)); +static void elf32_h8_info_to_howto + PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *)); +static void elf32_h8_info_to_howto_rel + PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); +static int elf32_h8_mach + PARAMS ((flagword)); + static reloc_howto_type * elf32_h8_reloc_type_lookup (abfd, code) bfd *abfd ATTRIBUTE_UNUSED; @@ -231,6 +240,97 @@ elf32_h8_info_to_howto_rel (abfd, bfd_reloc, elf_reloc) bfd_reloc->howto = &h8_elf_howto_table[r]; } +/* Object files encode the specific H8 model they were compiled + for in the ELF flags field. + + Examine that field and return the proper BFD machine type for + the object file. */ +static int +elf32_h8_mach (flags) + flagword flags; +{ + switch (flags & EF_H8_MACH) + { + case E_H8_MACH_H8300: + default: + return bfd_mach_h8300; + + case E_H8_MACH_H8300H: + return bfd_mach_h8300h; + + case E_H8_MACH_H8300S: + return bfd_mach_h8300s; + } +} + +/* The final processing done just before writing out a H8 ELF object + file. We use this opportunity to encode the BFD machine type + into the flags field in the object file. */ + +void +elf32_h8_final_write_processing (abfd, linker) + bfd *abfd; + boolean linker ATTRIBUTE_UNUSED; +{ + unsigned long val; + + switch (bfd_get_mach (abfd)) + { + default: + case bfd_mach_h8300: + val = E_H8_MACH_H8300; + break; + + case bfd_mach_h8300h: + val = E_H8_MACH_H8300H; + break; + + case bfd_mach_h8300s: + val = E_H8_MACH_H8300S; + break; + } + + elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH); + elf_elfheader (abfd)->e_flags |= val; +} + +/* Return nonzero if ABFD represents a valid H8 ELF object file; also + record the encoded machine type found in the ELF flags. */ + +boolean +elf32_h8_object_p (abfd) + bfd *abfd; +{ + bfd_default_set_arch_mach (abfd, bfd_arch_h8300, + elf32_h8_mach (elf_elfheader (abfd)->e_flags)); + return true; +} + +/* Merge backend specific data from an object file to the output + object file when linking. The only data we need to copy at this + time is the architecture/machine information. */ + +boolean +elf32_h8_merge_private_bfd_data (ibfd, obfd) + bfd *ibfd; + bfd *obfd; +{ + if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour + || bfd_get_flavour (obfd) != bfd_target_elf_flavour) + return true; + + if (bfd_get_arch (obfd) == bfd_get_arch (ibfd) + && bfd_get_mach (obfd) < bfd_get_mach (ibfd)) + { + if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), + bfd_get_mach (ibfd))) + return false; + } + + return true; +} + + #define TARGET_BIG_SYM bfd_elf32_h8300_vec #define TARGET_BIG_NAME "elf32-h8300" #define ELF_ARCH bfd_arch_h8300 @@ -240,6 +340,15 @@ elf32_h8_info_to_howto_rel (abfd, bfd_reloc, elf_reloc) #define elf_info_to_howto elf32_h8_info_to_howto #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel +/* So we can set/examine bits in e_flags to get the specific + H8 architecture in use. */ +#define elf_backend_final_write_processing \ + elf32_h8_final_write_processing +#define elf_backend_object_p \ + elf32_h8_object_p +#define bfd_elf32_bfd_merge_private_bfd_data \ + elf32_h8_merge_private_bfd_data + /* ??? when elf_backend_relocate_section is not defined, elf32-target.h defaults to using _bfd_generic_link_hash_table_create, but elflink.h:bfd_elf32_size_dynamic_sections uses |