* coff-h8300.c: Fix formatting.
* elf32-h8300.c: Likewise. * reloc16.c: Likewise.
This commit is contained in:
parent
01ad7f3617
commit
bc7eab726b
4 changed files with 141 additions and 140 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2002-11-11 Kazu Hirata <kazu@cs.umass.edu>
|
||||||
|
|
||||||
|
* coff-h8300.c: Fix formatting.
|
||||||
|
* elf32-h8300.c: Likewise.
|
||||||
|
* reloc16.c: Likewise.
|
||||||
|
|
||||||
2002-11-09 Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
|
2002-11-09 Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com>
|
||||||
|
|
||||||
* elf32-arm.h (elf32_arm_size_dynamic_sections): Don't strip output
|
* elf32-arm.h (elf32_arm_size_dynamic_sections): Don't strip output
|
||||||
|
|
|
@ -87,8 +87,7 @@ static boolean h8300_bfd_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *
|
||||||
the generic linker hash table, not the COFF backend linker hash
|
the generic linker hash table, not the COFF backend linker hash
|
||||||
table! We use this to attach additional data structures we
|
table! We use this to attach additional data structures we
|
||||||
need while linking on the h8300. */
|
need while linking on the h8300. */
|
||||||
struct h8300_coff_link_hash_table
|
struct h8300_coff_link_hash_table {
|
||||||
{
|
|
||||||
/* The main hash table. */
|
/* The main hash table. */
|
||||||
struct generic_link_hash_table root;
|
struct generic_link_hash_table root;
|
||||||
|
|
||||||
|
@ -135,7 +134,7 @@ funcvec_hash_newfunc (entry, gen_table, string)
|
||||||
|
|
||||||
/* Call the allocation method of the superclass. */
|
/* Call the allocation method of the superclass. */
|
||||||
ret = ((struct funcvec_hash_entry *)
|
ret = ((struct funcvec_hash_entry *)
|
||||||
bfd_hash_newfunc ((struct bfd_hash_entry *) ret, gen_table, string));
|
bfd_hash_newfunc ((struct bfd_hash_entry *) ret, gen_table, string));
|
||||||
|
|
||||||
if (ret == NULL)
|
if (ret == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -165,8 +164,8 @@ funcvec_hash_table_init (table, abfd, newfunc)
|
||||||
struct funcvec_hash_table *table;
|
struct funcvec_hash_table *table;
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
|
struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
|
||||||
struct bfd_hash_table *,
|
struct bfd_hash_table *,
|
||||||
const char *));
|
const char *));
|
||||||
{
|
{
|
||||||
/* Initialize our local fields, then call the generic initialization
|
/* Initialize our local fields, then call the generic initialization
|
||||||
routine. */
|
routine. */
|
||||||
|
@ -232,8 +231,7 @@ special (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static reloc_howto_type howto_table[] =
|
static reloc_howto_type howto_table[] = {
|
||||||
{
|
|
||||||
HOWTO (R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "8", false, 0x000000ff, 0x000000ff, false),
|
HOWTO (R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "8", false, 0x000000ff, 0x000000ff, false),
|
||||||
HOWTO (R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "16", false, 0x0000ffff, 0x0000ffff, false),
|
HOWTO (R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "16", false, 0x0000ffff, 0x0000ffff, false),
|
||||||
HOWTO (R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, special, "32", false, 0xffffffff, 0xffffffff, false),
|
HOWTO (R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, special, "32", false, 0xffffffff, 0xffffffff, false),
|
||||||
|
@ -270,9 +268,9 @@ static reloc_howto_type howto_table[] =
|
||||||
/* Turn a howto into a reloc number. */
|
/* Turn a howto into a reloc number. */
|
||||||
|
|
||||||
#define SELECT_RELOC(x,howto) \
|
#define SELECT_RELOC(x,howto) \
|
||||||
{ x.r_type = select_reloc(howto); }
|
{ x.r_type = select_reloc (howto); }
|
||||||
|
|
||||||
#define BADMAG(x) (H8300BADMAG(x) && H8300HBADMAG(x) && H8300SBADMAG(x))
|
#define BADMAG(x) (H8300BADMAG (x) && H8300HBADMAG (x) && H8300SBADMAG (x))
|
||||||
#define H8300 1 /* Customize coffcode.h */
|
#define H8300 1 /* Customize coffcode.h */
|
||||||
#define __A_MAGIC_SET__
|
#define __A_MAGIC_SET__
|
||||||
|
|
||||||
|
@ -365,15 +363,15 @@ rtype2howto (internal, dst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry)
|
#define RTYPE2HOWTO(internal, relocentry) rtype2howto (internal, relocentry)
|
||||||
|
|
||||||
/* Perform any necessary magic to the addend in a reloc entry. */
|
/* Perform any necessary magic to the addend in a reloc entry. */
|
||||||
|
|
||||||
#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
|
#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
|
||||||
cache_ptr->addend = ext_reloc.r_offset;
|
cache_ptr->addend = ext_reloc.r_offset;
|
||||||
|
|
||||||
#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
|
#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
|
||||||
reloc_processing(relent, reloc, symbols, abfd, section)
|
reloc_processing (relent, reloc, symbols, abfd, section)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reloc_processing (relent, reloc, symbols, abfd, section)
|
reloc_processing (relent, reloc, symbols, abfd, section)
|
||||||
|
@ -483,7 +481,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
|
||||||
/* If the distance is within -128..+128 inclusive, then we can relax
|
/* If the distance is within -128..+128 inclusive, then we can relax
|
||||||
this jump. +128 is valid since the target will move two bytes
|
this jump. +128 is valid since the target will move two bytes
|
||||||
closer if we do relax this branch. */
|
closer if we do relax this branch. */
|
||||||
if ((int)gap >= -128 && (int)gap <= 128 )
|
if ((int) gap >= -128 && (int) gap <= 128)
|
||||||
{
|
{
|
||||||
/* It's possible we may be able to eliminate this branch entirely;
|
/* It's possible we may be able to eliminate this branch entirely;
|
||||||
if the previous instruction is a branch around this instruction,
|
if the previous instruction is a branch around this instruction,
|
||||||
|
@ -546,7 +544,7 @@ h8300_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
|
||||||
/* If the distance is within -128..+128 inclusive, then we can relax
|
/* If the distance is within -128..+128 inclusive, then we can relax
|
||||||
this jump. +128 is valid since the target will move two bytes
|
this jump. +128 is valid since the target will move two bytes
|
||||||
closer if we do relax this branch. */
|
closer if we do relax this branch. */
|
||||||
if ((int)gap >= -128 && (int)gap <= 128 )
|
if ((int) gap >= -128 && (int) gap <= 128)
|
||||||
{
|
{
|
||||||
/* Change the reloc type. */
|
/* Change the reloc type. */
|
||||||
reloc->howto = howto_table + 15;
|
reloc->howto = howto_table + 15;
|
||||||
|
@ -736,7 +734,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (value <= 0xff
|
if (value <= 0xff
|
||||||
|| (value >= 0x0000ff00 && value <= 0x0000ffff)
|
|| (value >= 0x0000ff00 && value <= 0x0000ffff)
|
||||||
|| (value >= 0x00ffff00 && value <= 0x00ffffff)
|
|| (value >= 0x00ffff00 && value <= 0x00ffffff)
|
||||||
|| (value >= 0xffffff00 && value <= 0xffffffff))
|
|| (value >= 0xffffff00 && value <= 0xffffffff))
|
||||||
{
|
{
|
||||||
/* Everything looks OK. Apply the relocation and update the
|
/* Everything looks OK. Apply the relocation and update the
|
||||||
|
@ -804,7 +802,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||||
|
|
||||||
/* Fix the opcode. For all the move insns, we simply
|
/* Fix the opcode. For all the move insns, we simply
|
||||||
need to turn off bit 0x20 in the previous byte. */
|
need to turn off bit 0x20 in the previous byte. */
|
||||||
data[dst_address - 1] &= ~0x20;
|
data[dst_address - 1] &= ~0x20;
|
||||||
dst_address += 2;
|
dst_address += 2;
|
||||||
src_address += 4;
|
src_address += 4;
|
||||||
}
|
}
|
||||||
|
@ -815,7 +813,7 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||||
reloc->howto->name, reloc->addend, input_section->owner,
|
reloc->howto->name, reloc->addend, input_section->owner,
|
||||||
input_section, reloc->address)))
|
input_section, reloc->address)))
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* A 16bit absolute branch that is now an 8-bit pc-relative branch. */
|
/* A 16bit absolute branch that is now an 8-bit pc-relative branch. */
|
||||||
|
@ -912,14 +910,14 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output the target. */
|
/* Output the target. */
|
||||||
bfd_put_8 (abfd, gap, data + dst_address - 1);
|
bfd_put_8 (abfd, gap, data + dst_address - 1);
|
||||||
|
|
||||||
/* We don't advance dst_address -- the 8bit reloc is applied at
|
/* We don't advance dst_address -- the 8bit reloc is applied at
|
||||||
dst_address - 1, so the next insn should begin at dst_address. */
|
dst_address - 1, so the next insn should begin at dst_address. */
|
||||||
src_address += 2;
|
src_address += 2;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Similarly for a 24bit absolute that is now 8 bits. */
|
/* Similarly for a 24bit absolute that is now 8 bits. */
|
||||||
case R_JMPL2:
|
case R_JMPL2:
|
||||||
|
|
|
@ -61,8 +61,7 @@ static bfd_reloc_status_type special
|
||||||
/* This does not include any relocation information, but should be
|
/* This does not include any relocation information, but should be
|
||||||
good enough for GDB or objdump to read the file. */
|
good enough for GDB or objdump to read the file. */
|
||||||
|
|
||||||
static reloc_howto_type h8_elf_howto_table[] =
|
static reloc_howto_type h8_elf_howto_table[] = {
|
||||||
{
|
|
||||||
#define R_H8_NONE_X 0
|
#define R_H8_NONE_X 0
|
||||||
HOWTO (R_H8_NONE, /* type */
|
HOWTO (R_H8_NONE, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
|
@ -221,16 +220,14 @@ static reloc_howto_type h8_elf_howto_table[] =
|
||||||
|
|
||||||
/* This structure is used to map BFD reloc codes to H8 ELF relocs. */
|
/* This structure is used to map BFD reloc codes to H8 ELF relocs. */
|
||||||
|
|
||||||
struct elf_reloc_map
|
struct elf_reloc_map {
|
||||||
{
|
|
||||||
bfd_reloc_code_real_type bfd_reloc_val;
|
bfd_reloc_code_real_type bfd_reloc_val;
|
||||||
unsigned char howto_index;
|
unsigned char howto_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* An array mapping BFD reloc codes to SH ELF relocs. */
|
/* An array mapping BFD reloc codes to SH ELF relocs. */
|
||||||
|
|
||||||
static const struct elf_reloc_map h8_reloc_map[] =
|
static const struct elf_reloc_map h8_reloc_map[] = {
|
||||||
{
|
|
||||||
{ BFD_RELOC_NONE, R_H8_NONE_X },
|
{ BFD_RELOC_NONE, R_H8_NONE_X },
|
||||||
{ BFD_RELOC_32, R_H8_DIR32_X },
|
{ BFD_RELOC_32, R_H8_DIR32_X },
|
||||||
{ BFD_RELOC_16, R_H8_DIR16_X },
|
{ BFD_RELOC_16, R_H8_DIR16_X },
|
||||||
|
@ -271,7 +268,7 @@ elf32_h8_info_to_howto (abfd, bfd_reloc, elf_reloc)
|
||||||
|
|
||||||
r = ELF32_R_TYPE (elf_reloc->r_info);
|
r = ELF32_R_TYPE (elf_reloc->r_info);
|
||||||
for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
|
for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
|
||||||
if (h8_elf_howto_table[i].type== r)
|
if (h8_elf_howto_table[i].type == r)
|
||||||
{
|
{
|
||||||
bfd_reloc->howto = &h8_elf_howto_table[i];
|
bfd_reloc->howto = &h8_elf_howto_table[i];
|
||||||
return;
|
return;
|
||||||
|
@ -870,11 +867,10 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
= ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
= ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
ELF32_R_TYPE (R_H8_NONE));
|
ELF32_R_TYPE (R_H8_NONE));
|
||||||
|
|
||||||
last_reloc->r_info
|
last_reloc->r_info
|
||||||
= ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
= ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
ELF32_R_TYPE (R_H8_PCREL8));
|
ELF32_R_TYPE (R_H8_PCREL8));
|
||||||
last_reloc->r_addend = irel->r_addend;
|
last_reloc->r_addend = irel->r_addend;
|
||||||
|
|
||||||
|
|
||||||
code = bfd_get_8 (abfd,
|
code = bfd_get_8 (abfd,
|
||||||
contents + last_reloc->r_offset - 1);
|
contents + last_reloc->r_offset - 1);
|
||||||
|
@ -938,18 +934,18 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
/* If the distance is within -126..+130 inclusive, then we can
|
/* If the distance is within -126..+130 inclusive, then we can
|
||||||
relax this jump. +130 is valid since the target will move
|
relax this jump. +130 is valid since the target will move
|
||||||
two bytes closer if we do relax this branch. */
|
two bytes closer if we do relax this branch. */
|
||||||
if ((int)gap >= -126 && (int)gap <= 130)
|
if ((int) gap >= -126 && (int) gap <= 130)
|
||||||
{
|
{
|
||||||
unsigned char code;
|
unsigned char code;
|
||||||
|
|
||||||
/* Note that we've changed the relocs, section contents,
|
/* Note that we've changed the relocs, section contents,
|
||||||
etc. */
|
etc. */
|
||||||
elf_section_data (sec)->relocs = internal_relocs;
|
elf_section_data (sec)->relocs = internal_relocs;
|
||||||
elf_section_data (sec)->this_hdr.contents = contents;
|
elf_section_data (sec)->this_hdr.contents = contents;
|
||||||
symtab_hdr->contents = (unsigned char *) isymbuf;
|
symtab_hdr->contents = (unsigned char *) isymbuf;
|
||||||
|
|
||||||
/* Get the opcode. */
|
/* Get the opcode. */
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
||||||
|
|
||||||
if (code == 0x58)
|
if (code == 0x58)
|
||||||
{
|
{
|
||||||
|
@ -967,18 +963,18 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
/* Fix the relocation's type. */
|
/* Fix the relocation's type. */
|
||||||
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
R_H8_PCREL8);
|
R_H8_PCREL8);
|
||||||
irel->r_offset--;
|
irel->r_offset--;
|
||||||
|
|
||||||
/* Delete two bytes of data. */
|
/* Delete two bytes of data. */
|
||||||
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
||||||
irel->r_offset + 1, 2))
|
irel->r_offset + 1, 2))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* That will change things, so, we should relax again.
|
/* That will change things, so, we should relax again.
|
||||||
Note that this is not required, and it may be slow. */
|
Note that this is not required, and it may be slow. */
|
||||||
*again = true;
|
*again = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -990,53 +986,53 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
bfd_vma value = symval + irel->r_addend;
|
bfd_vma value = symval + irel->r_addend;
|
||||||
|
|
||||||
if ((bfd_get_mach (abfd) == bfd_mach_h8300
|
if ((bfd_get_mach (abfd) == bfd_mach_h8300
|
||||||
&& value >= 0xff00
|
&& value >= 0xff00
|
||||||
&& value <= 0xffff)
|
&& value <= 0xffff)
|
||||||
|| ((bfd_get_mach (abfd) == bfd_mach_h8300h
|
|| ((bfd_get_mach (abfd) == bfd_mach_h8300h
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300s)
|
|| bfd_get_mach (abfd) == bfd_mach_h8300s)
|
||||||
&& value >= 0xffff00
|
&& value >= 0xffff00
|
||||||
&& value <= 0xffffff))
|
&& value <= 0xffffff))
|
||||||
{
|
{
|
||||||
unsigned char code;
|
unsigned char code;
|
||||||
|
|
||||||
/* Note that we've changed the relocs, section contents,
|
/* Note that we've changed the relocs, section contents,
|
||||||
etc. */
|
etc. */
|
||||||
elf_section_data (sec)->relocs = internal_relocs;
|
elf_section_data (sec)->relocs = internal_relocs;
|
||||||
elf_section_data (sec)->this_hdr.contents = contents;
|
elf_section_data (sec)->this_hdr.contents = contents;
|
||||||
symtab_hdr->contents = (unsigned char *) isymbuf;
|
symtab_hdr->contents = (unsigned char *) isymbuf;
|
||||||
|
|
||||||
/* Get the opcode. */
|
/* Get the opcode. */
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
||||||
|
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (code != 0x6a)
|
if (code != 0x6a)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
||||||
|
|
||||||
if ((code & 0xf0) == 0x00)
|
if ((code & 0xf0) == 0x00)
|
||||||
bfd_put_8 (abfd,
|
bfd_put_8 (abfd,
|
||||||
(code & 0xf) | 0x20,
|
(code & 0xf) | 0x20,
|
||||||
contents + irel->r_offset - 2);
|
contents + irel->r_offset - 2);
|
||||||
else if ((code & 0xf0) == 0x80)
|
else if ((code & 0xf0) == 0x80)
|
||||||
bfd_put_8 (abfd,
|
bfd_put_8 (abfd,
|
||||||
(code & 0xf) | 0x30,
|
(code & 0xf) | 0x30,
|
||||||
contents + irel->r_offset - 2);
|
contents + irel->r_offset - 2);
|
||||||
else
|
else
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
/* Fix the relocation's type. */
|
/* Fix the relocation's type. */
|
||||||
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
R_H8_DIR8);
|
R_H8_DIR8);
|
||||||
|
|
||||||
/* Delete two bytes of data. */
|
/* Delete two bytes of data. */
|
||||||
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
||||||
irel->r_offset + 1, 2))
|
irel->r_offset + 1, 2))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* That will change things, so, we should relax again.
|
/* That will change things, so, we should relax again.
|
||||||
Note that this is not required, and it may be slow. */
|
Note that this is not required, and it may be slow. */
|
||||||
*again = true;
|
*again = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1048,52 +1044,52 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
bfd_vma value = symval + irel->r_addend;
|
bfd_vma value = symval + irel->r_addend;
|
||||||
|
|
||||||
if ((bfd_get_mach (abfd) == bfd_mach_h8300
|
if ((bfd_get_mach (abfd) == bfd_mach_h8300
|
||||||
&& value >= 0xff00
|
&& value >= 0xff00
|
||||||
&& value <= 0xffff)
|
&& value <= 0xffff)
|
||||||
|| ((bfd_get_mach (abfd) == bfd_mach_h8300h
|
|| ((bfd_get_mach (abfd) == bfd_mach_h8300h
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300s)
|
|| bfd_get_mach (abfd) == bfd_mach_h8300s)
|
||||||
&& value >= 0xffff00
|
&& value >= 0xffff00
|
||||||
&& value <= 0xffffff))
|
&& value <= 0xffffff))
|
||||||
{
|
{
|
||||||
unsigned char code;
|
unsigned char code;
|
||||||
|
|
||||||
/* Note that we've changed the relocs, section contents,
|
/* Note that we've changed the relocs, section contents,
|
||||||
etc. */
|
etc. */
|
||||||
elf_section_data (sec)->relocs = internal_relocs;
|
elf_section_data (sec)->relocs = internal_relocs;
|
||||||
elf_section_data (sec)->this_hdr.contents = contents;
|
elf_section_data (sec)->this_hdr.contents = contents;
|
||||||
symtab_hdr->contents = (unsigned char *) isymbuf;
|
symtab_hdr->contents = (unsigned char *) isymbuf;
|
||||||
|
|
||||||
/* Get the opcode. */
|
/* Get the opcode. */
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
|
||||||
|
|
||||||
/* Sanity check. */
|
/* Sanity check. */
|
||||||
if (code != 0x6a)
|
if (code != 0x6a)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
||||||
|
|
||||||
if ((code & 0xf0) == 0x00)
|
if ((code & 0xf0) == 0x00)
|
||||||
bfd_put_8 (abfd,
|
bfd_put_8 (abfd,
|
||||||
(code & 0xf) | 0x20,
|
(code & 0xf) | 0x20,
|
||||||
contents + irel->r_offset - 2);
|
contents + irel->r_offset - 2);
|
||||||
else if ((code & 0xf0) == 0x80)
|
else if ((code & 0xf0) == 0x80)
|
||||||
bfd_put_8 (abfd,
|
bfd_put_8 (abfd,
|
||||||
(code & 0xf) | 0x30,
|
(code & 0xf) | 0x30,
|
||||||
contents + irel->r_offset - 2);
|
contents + irel->r_offset - 2);
|
||||||
else
|
else
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
/* Fix the relocation's type. */
|
/* Fix the relocation's type. */
|
||||||
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
R_H8_DIR8);
|
R_H8_DIR8);
|
||||||
|
|
||||||
/* Delete two bytes of data. */
|
/* Delete two bytes of data. */
|
||||||
if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
|
if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset, 2))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* That will change things, so, we should relax again.
|
/* That will change things, so, we should relax again.
|
||||||
Note that this is not required, and it may be slow. */
|
Note that this is not required, and it may be slow. */
|
||||||
*again = true;
|
*again = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1107,34 +1103,34 @@ elf32_h8_relax_section (abfd, sec, link_info, again)
|
||||||
|
|
||||||
if (value <= 0x7fff || value >= 0xff8000)
|
if (value <= 0x7fff || value >= 0xff8000)
|
||||||
{
|
{
|
||||||
unsigned char code;
|
unsigned char code;
|
||||||
|
|
||||||
/* Note that we've changed the relocs, section contents,
|
/* Note that we've changed the relocs, section contents,
|
||||||
etc. */
|
etc. */
|
||||||
elf_section_data (sec)->relocs = internal_relocs;
|
elf_section_data (sec)->relocs = internal_relocs;
|
||||||
elf_section_data (sec)->this_hdr.contents = contents;
|
elf_section_data (sec)->this_hdr.contents = contents;
|
||||||
symtab_hdr->contents = (unsigned char *) isymbuf;
|
symtab_hdr->contents = (unsigned char *) isymbuf;
|
||||||
|
|
||||||
/* Get the opcode. */
|
/* Get the opcode. */
|
||||||
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
|
||||||
|
|
||||||
/* We just need to turn off bit 0x20. */
|
/* We just need to turn off bit 0x20. */
|
||||||
code &= ~0x20;
|
code &= ~0x20;
|
||||||
|
|
||||||
bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
|
bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
|
||||||
|
|
||||||
/* Fix the relocation's type. */
|
/* Fix the relocation's type. */
|
||||||
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
|
||||||
R_H8_DIR16A8);
|
R_H8_DIR16A8);
|
||||||
|
|
||||||
/* Delete two bytes of data. */
|
/* Delete two bytes of data. */
|
||||||
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
if (!elf32_h8_relax_delete_bytes (abfd, sec,
|
||||||
irel->r_offset + 1, 2))
|
irel->r_offset + 1, 2))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* That will change things, so, we should relax again.
|
/* That will change things, so, we should relax again.
|
||||||
Note that this is not required, and it may be slow. */
|
Note that this is not required, and it may be slow. */
|
||||||
*again = true;
|
*again = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,30 +199,31 @@ bfd_coff_reloc16_relax_section (abfd, input_section, link_info, again)
|
||||||
shrinks = (unsigned *) bfd_zmalloc (amt);
|
shrinks = (unsigned *) bfd_zmalloc (amt);
|
||||||
|
|
||||||
/* Loop until nothing changes in this section. */
|
/* Loop until nothing changes in this section. */
|
||||||
do {
|
do
|
||||||
arelent **parent;
|
{
|
||||||
unsigned int i;
|
arelent **parent;
|
||||||
long j;
|
unsigned int i;
|
||||||
|
long j;
|
||||||
|
|
||||||
another_pass = 0;
|
another_pass = 0;
|
||||||
|
|
||||||
for (i = 0, parent = reloc_vector; *parent; parent++, i++)
|
for (i = 0, parent = reloc_vector; *parent; parent++, i++)
|
||||||
{
|
{
|
||||||
/* Let the target/machine dependent code examine each reloc
|
/* Let the target/machine dependent code examine each reloc
|
||||||
in this section and attempt to shrink it. */
|
in this section and attempt to shrink it. */
|
||||||
shrink = bfd_coff_reloc16_estimate (abfd, input_section, *parent,
|
shrink = bfd_coff_reloc16_estimate (abfd, input_section, *parent,
|
||||||
shrinks[i], link_info);
|
shrinks[i], link_info);
|
||||||
|
|
||||||
/* If it shrunk, note it in the shrinks array and set up for
|
/* If it shrunk, note it in the shrinks array and set up for
|
||||||
another pass. */
|
another pass. */
|
||||||
if (shrink != shrinks[i])
|
if (shrink != shrinks[i])
|
||||||
{
|
{
|
||||||
another_pass = 1;
|
another_pass = 1;
|
||||||
for (j = i + 1; j <= reloc_count; j++)
|
for (j = i + 1; j <= reloc_count; j++)
|
||||||
shrinks[j] += shrink - shrinks[i];
|
shrinks[j] += shrink - shrinks[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (another_pass);
|
while (another_pass);
|
||||||
|
|
||||||
shrink = shrinks[reloc_count];
|
shrink = shrinks[reloc_count];
|
||||||
|
@ -235,12 +236,12 @@ bfd_coff_reloc16_relax_section (abfd, input_section, link_info, again)
|
||||||
}
|
}
|
||||||
|
|
||||||
bfd_byte *
|
bfd_byte *
|
||||||
bfd_coff_reloc16_get_relocated_section_contents(in_abfd,
|
bfd_coff_reloc16_get_relocated_section_contents (in_abfd,
|
||||||
link_info,
|
link_info,
|
||||||
link_order,
|
link_order,
|
||||||
data,
|
data,
|
||||||
relocateable,
|
relocateable,
|
||||||
symbols)
|
symbols)
|
||||||
bfd *in_abfd;
|
bfd *in_abfd;
|
||||||
struct bfd_link_info *link_info;
|
struct bfd_link_info *link_info;
|
||||||
struct bfd_link_order *link_order;
|
struct bfd_link_order *link_order;
|
||||||
|
@ -266,11 +267,11 @@ bfd_coff_reloc16_get_relocated_section_contents(in_abfd,
|
||||||
symbols);
|
symbols);
|
||||||
|
|
||||||
/* Read in the section. */
|
/* Read in the section. */
|
||||||
if (!bfd_get_section_contents(input_bfd,
|
if (!bfd_get_section_contents (input_bfd,
|
||||||
input_section,
|
input_section,
|
||||||
data,
|
data,
|
||||||
(bfd_vma) 0,
|
(bfd_vma) 0,
|
||||||
input_section->_raw_size))
|
input_section->_raw_size))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
|
reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
|
||||||
|
|
Loading…
Reference in a new issue