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:
parent
405b61965f
commit
2849d19feb
3 changed files with 27 additions and 2 deletions
|
@ -183,6 +183,29 @@ static reloc_howto_type elf_s12z_howto_table[] =
|
||||||
0x0005ffff, /* dst_mask */
|
0x0005ffff, /* dst_mask */
|
||||||
FALSE), /* pcrel_offset */
|
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 */
|
/* A 32 bit absolute relocation */
|
||||||
HOWTO (R_S12Z_EXT32, /* type */
|
HOWTO (R_S12Z_EXT32, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
|
|
|
@ -12386,7 +12386,8 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
|
||||||
case EM_68HC12:
|
case EM_68HC12:
|
||||||
return reloc_type == 6; /* R_M68HC11_32. */
|
return reloc_type == 6; /* R_M68HC11_32. */
|
||||||
case EM_S12Z:
|
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:
|
case EM_MCORE:
|
||||||
return reloc_type == 1; /* R_MCORE_ADDR32. */
|
return reloc_type == 1; /* R_MCORE_ADDR32. */
|
||||||
case EM_CYGNUS_MEP:
|
case EM_CYGNUS_MEP:
|
||||||
|
|
|
@ -30,7 +30,8 @@ START_RELOC_NUMBERS (elf_s12z_reloc_type)
|
||||||
RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
|
RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
|
||||||
RELOC_NUMBER (R_S12Z_EXT24, 4)
|
RELOC_NUMBER (R_S12Z_EXT24, 4)
|
||||||
RELOC_NUMBER (R_S12Z_EXT18, 5)
|
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)
|
END_RELOC_NUMBERS (R_S12Z_max)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue