diff options
author | John Darrington <john@darrington.wattle.id.au> | 2018-10-03 12:26:42 +0200 |
---|---|---|
committer | John Darrington <john@darrington.wattle.id.au> | 2018-10-23 16:09:30 +0200 |
commit | 2849d19feb458ade67cdcc6a82f0e7b1be99b46b (patch) | |
tree | ad7171222c73e3906dd555edd8c1568831928810 | |
parent | 405b61965ff7608840cfda36083c1be1f926ccdb (diff) | |
download | gdb-2849d19feb458ade67cdcc6a82f0e7b1be99b46b.zip gdb-2849d19feb458ade67cdcc6a82f0e7b1be99b46b.tar.gz gdb-2849d19feb458ade67cdcc6a82f0e7b1be99b46b.tar.bz2 |
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.
-rw-r--r-- | bfd/elf32-s12z.c | 23 | ||||
-rw-r--r-- | binutils/readelf.c | 3 | ||||
-rw-r--r-- | include/elf/s12z.h | 3 |
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 |