mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-02 09:06:35 +00:00
e01b0e6981
* config.bfd (h8300*-*-elf): New case. * configure.in (bfd_elf32_h8300_vec): New case. * elf.c (prep_headers): Add case for bfd_arch_h8300. * reloc.c (BFD_RELOC_H8_DIR16A8): New relocation. (BFD_RELOC_H8_DIR16R8, BFD_RELOC_H8_DIR24A8): Likewise. (BFD_RELOC_H8_DIR24R8, BFD_RELOC_H8_DIR32A16): Likewise. * targets.c (bfd_target bfd_elf32_h8300_vec): New extern declaration. * elf32-h8300.c: New file. * Makefile.in, bfd-in2.h, libbfd.h, configure: Regenerated.
251 lines
7.7 KiB
C
251 lines
7.7 KiB
C
/* 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"
|