aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/elf32-s12z.c23
-rw-r--r--binutils/readelf.c3
-rw-r--r--include/elf/s12z.h3
3 files changed, 27 insertions, 2 deletions
diff --git a/bfd/elf32-s12z.c b/bfd/elf32-s12z.c
index d2ea4ec..05e5153 100644
--- a/bfd/elf32-s12z.c
+++ b/bfd/elf32-s12z.c
@@ -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 */
diff --git a/binutils/readelf.c b/binutils/readelf.c
index fff50c6..d8d0d6e 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -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:
diff --git a/include/elf/s12z.h b/include/elf/s12z.h
index fc74b9a..f42fa11 100644
--- a/include/elf/s12z.h
+++ b/include/elf/s12z.h
@@ -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