aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-h8300.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf32-h8300.c')
-rw-r--r--bfd/elf32-h8300.c250
1 files changed, 250 insertions, 0 deletions
diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c
new file mode 100644
index 0000000..c2474dd
--- /dev/null
+++ b/bfd/elf32-h8300.c
@@ -0,0 +1,250 @@
+/* Generic support for 32-bit ELF
+ Copyright 1993, 1995, 1998, 1999 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
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+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. */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "elf-bfd.h"
+#include "elf/h8.h"
+
+static reloc_howto_type *elf32_h8_reloc_type_lookup
+ PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
+static void elf32_h8_info_to_howto
+ PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
+
+/* This does not include any relocation information, but should be
+ good enough for GDB or objdump to read the file. */
+
+static reloc_howto_type h8_elf_howto_table[] =
+{
+#define R_H8_NONE_X 0
+ HOWTO (R_H8_NONE, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_NONE", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR32_X (R_H8_NONE_X + 1)
+ HOWTO (R_H8_DIR32, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR32", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR16_X (R_H8_DIR32_X + 1)
+ HOWTO (R_H8_DIR16, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR16", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR8_X (R_H8_DIR16_X + 1)
+ HOWTO (R_H8_DIR8, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR16", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0x000000ff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
+ HOWTO (R_H8_DIR16A8, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR16A8", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
+ HOWTO (R_H8_DIR16R8, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR16R8", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
+ HOWTO (R_H8_DIR24A8, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR24A8", /* name */
+ true, /* partial_inplace */
+ 0xff000000, /* src_mask */
+ 0x00ffffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
+ HOWTO (R_H8_DIR24R8, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR24R8", /* name */
+ true, /* partial_inplace */
+ 0xff000000, /* src_mask */
+ 0x00ffffff, /* dst_mask */
+ false), /* pcrel_offset */
+#define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
+ HOWTO (R_H8_DIR32A16, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ NULL, /* special_function */
+ "R_H8_DIR32", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ false), /* pcrel_offset */
+};
+
+/* This structure is used to map BFD reloc codes to H8 ELF relocs. */
+
+struct elf_reloc_map
+{
+ bfd_reloc_code_real_type bfd_reloc_val;
+ unsigned char howto_index;
+};
+
+/* An array mapping BFD reloc codes to SH ELF relocs. */
+
+static const struct elf_reloc_map h8_reloc_map[] =
+{
+ { BFD_RELOC_NONE, R_H8_NONE_X },
+ { BFD_RELOC_32, R_H8_DIR32_X },
+ { BFD_RELOC_16, R_H8_DIR16_X },
+ { BFD_RELOC_8, R_H8_DIR8_X },
+ { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
+ { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
+ { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
+ { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
+ { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
+};
+
+static reloc_howto_type *
+elf32_h8_reloc_type_lookup (abfd, code)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ bfd_reloc_code_real_type code;
+{
+ unsigned int i;
+
+ for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
+ {
+ if (h8_reloc_map[i].bfd_reloc_val == code)
+ return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
+ }
+ return NULL;
+}
+
+static void
+elf32_h8_info_to_howto (abfd, bfd_reloc, elf_reloc)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ arelent *bfd_reloc;
+ Elf32_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED;
+{
+ unsigned int r;
+ unsigned int i;
+
+ r = ELF32_R_TYPE (elf_reloc->r_info);
+ for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
+ if (h8_elf_howto_table[i].type== r)
+ {
+ bfd_reloc->howto = &h8_elf_howto_table[i];
+ return;
+ }
+ abort ();
+}
+
+static void
+elf32_h8_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ arelent *bfd_reloc;
+ Elf32_Internal_Rel *elf_reloc ATTRIBUTE_UNUSED;
+{
+ unsigned int r;
+
+ abort ();
+ r = ELF32_R_TYPE (elf_reloc->r_info);
+ bfd_reloc->howto = &h8_elf_howto_table[r];
+}
+
+#define TARGET_BIG_SYM bfd_elf32_h8300_vec
+#define TARGET_BIG_NAME "elf32-h8300"
+#define ELF_ARCH bfd_arch_h8300
+#define ELF_MACHINE_CODE EM_H8_300
+#define ELF_MAXPAGESIZE 0x1
+#define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
+#define elf_info_to_howto elf32_h8_info_to_howto
+#define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
+
+/* ??? 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
+ dynobj = elf_hash_table (info)->dynobj;
+ and thus requires an elf hash table. */
+#define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
+
+#include "elf32-target.h"