S12Z: New 32 bit Reloc.

Third party tools produce 32 bit relocs  at index 6 with strange properties.
This change moves the existing 32 bit reloc (R_S12Z_EXT32) to index 7
and introduces a new one (R_S12Z_CW32) at index 6 to try to support code
generated by these tools.

  * bfd/elf32-s12z.c (elf_s12z_howto_table) [R_S12Z_CW32]: New member.
  * binutils/readelf.c (is_32bit_abs_reloc): Reloc type 7 is also 32 bit.
  * include/elf/s12z.h (elf_s12z_reloc_tpe) [RELOC_NUMBER (R_S12Z_CW32)]: New enum.
This commit is contained in:
John Darrington 2018-10-03 12:26:42 +02:00
parent 405b61965f
commit 2849d19feb
3 changed files with 27 additions and 2 deletions

View File

@ -183,6 +183,29 @@ static reloc_howto_type elf_s12z_howto_table[] =
0x0005ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A 32 bit absolute relocation. This kind of relocation is
schizophrenic - Although they appear in sections named .rela.debug.*
in some sections they behave as RELA relocs, but in others they have
an added of zero and behave as REL.
It is not recommended that new code emits this reloc. It is here
only to support existing elf files generated by third party
applications. */
HOWTO (R_S12Z_CW32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_S12Z_CW32", /* name */
FALSE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A 32 bit absolute relocation */
HOWTO (R_S12Z_EXT32, /* type */
0, /* rightshift */

View File

@ -12386,7 +12386,8 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
case EM_68HC12:
return reloc_type == 6; /* R_M68HC11_32. */
case EM_S12Z:
return reloc_type == 6; /* R_S12Z_EXT32. */
return reloc_type == 7 || /* R_S12Z_EXT32 */
reloc_type == 6; /* R_S12Z_CW32. */
case EM_MCORE:
return reloc_type == 1; /* R_MCORE_ADDR32. */
case EM_CYGNUS_MEP:

View File

@ -30,7 +30,8 @@ START_RELOC_NUMBERS (elf_s12z_reloc_type)
RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
RELOC_NUMBER (R_S12Z_EXT24, 4)
RELOC_NUMBER (R_S12Z_EXT18, 5)
RELOC_NUMBER (R_S12Z_EXT32, 6)
RELOC_NUMBER (R_S12Z_CW32, 6)
RELOC_NUMBER (R_S12Z_EXT32, 7)
END_RELOC_NUMBERS (R_S12Z_max)
#endif