mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
S12Z: Rename reloc R_S12Z_UKNWN_3 to R_S12Z_EXT18 and implement according to recently inferred information about this reloc.
* bfd/elf32-s12z.c: (opru18_reloc): New function. * bfd/elf32-s12z.c: (elf_s12z_howto_table): Adjust Howto according to new knowledge. * include/elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.
This commit is contained in:
parent
4895f384b4
commit
4e57b45639
@ -1,3 +1,8 @@
|
||||
2018-08-23 John Darington <john@darrington.wattle.id.au>
|
||||
|
||||
* elf32-s12z.c (opru18_reloc): New function.
|
||||
* elf32-s12z.c (elf_s12z_howto_table): Adjust Howto according to new knowledge.
|
||||
|
||||
2018-08-21 mephi42 <mephi42@gmail.com>
|
||||
|
||||
PR binutils/23315
|
||||
|
@ -33,6 +33,38 @@ static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
|
||||
static bfd_boolean s12z_info_to_howto_rel
|
||||
(bfd *, arelent *, Elf_Internal_Rela *);
|
||||
|
||||
static bfd_reloc_status_type
|
||||
opru18_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol,
|
||||
void *data, asection *input_section ATTRIBUTE_UNUSED,
|
||||
bfd *output ATTRIBUTE_UNUSED, char **msg ATTRIBUTE_UNUSED)
|
||||
{
|
||||
/* This reloc is used for 18 bit General Operand Addressing Postbyte in the
|
||||
INST opru18 form. This is an 18 bit reloc, but the most significant bit
|
||||
is shifted one place to the left of where it would normally be. See
|
||||
Appendix A.4 of the S12Z reference manual. */
|
||||
|
||||
bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
|
||||
bfd_vma result = bfd_get_24 (abfd, (unsigned char *) data + octets);
|
||||
bfd_vma val = bfd_asymbol_value (symbol);
|
||||
|
||||
/* Keep the wanted bits and discard the rest. */
|
||||
result &= 0xFA0000;
|
||||
|
||||
val += symbol->section->output_section->vma;
|
||||
val += symbol->section->output_offset;
|
||||
|
||||
/* The lowest 17 bits are copied verbatim. */
|
||||
result |= val & 0x1FFFF;
|
||||
|
||||
/* The 18th bit is put into the 19th position. */
|
||||
result |= (val & 0x020000) << 1;
|
||||
|
||||
bfd_put_24 (abfd, result, (unsigned char *) data + octets);
|
||||
|
||||
return bfd_reloc_ok;
|
||||
}
|
||||
|
||||
|
||||
static bfd_reloc_status_type
|
||||
shift_addend_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED, asection *input_section ATTRIBUTE_UNUSED,
|
||||
@ -136,19 +168,19 @@ static reloc_howto_type elf_s12z_howto_table[] =
|
||||
0x00ffffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* The purpose of this reloc is not known */
|
||||
HOWTO (R_S12Z_UKNWN_3, /* type */
|
||||
/* An 18 bit absolute relocation */
|
||||
HOWTO (R_S12Z_EXT18, /* type */
|
||||
0, /* rightshift */
|
||||
3, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
0, /* bitsize */
|
||||
5, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
18, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont,/* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_S12Z_UKNWN_3", /* name */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
opru18_reloc, /* special_function */
|
||||
"R_S12Z_EXT18", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
0x0005ffff, /* src_mask */
|
||||
0x0005ffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* A 32 bit absolute relocation */
|
||||
|
@ -1,3 +1,7 @@
|
||||
2018-08-23 John Darrington <john@darrington.wattle.id.au>
|
||||
|
||||
* elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.
|
||||
|
||||
2018-08-21 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* opcode/ppc.h (struct powerpc_operand): Correct "insert" comment.
|
||||
|
@ -29,7 +29,7 @@ START_RELOC_NUMBERS (elf_s12z_reloc_type)
|
||||
RELOC_NUMBER (R_S12Z_UKNWN_2, 2)
|
||||
RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
|
||||
RELOC_NUMBER (R_S12Z_EXT24, 4)
|
||||
RELOC_NUMBER (R_S12Z_UKNWN_3, 5)
|
||||
RELOC_NUMBER (R_S12Z_EXT18, 5)
|
||||
RELOC_NUMBER (R_S12Z_EXT32, 6)
|
||||
END_RELOC_NUMBERS (R_S12Z_max)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user