X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-s12z.c;h=3bd828804f17d5b2918838d2ff496c7487299e19;hb=63ffd7c9131c0e9723016d33cf8d435cc508d02b;hp=d2ea4ecaf2f6fb05935d201e4ebdcedb501672bf;hpb=e6d9d9285574ba3e157a29bd40cf6ab4bbaeeaf0;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-s12z.c b/bfd/elf32-s12z.c index d2ea4ecaf2..3bd828804f 100644 --- a/bfd/elf32-s12z.c +++ b/bfd/elf32-s12z.c @@ -1,5 +1,5 @@ /* Freescale S12Z-specific support for 32-bit ELF - Copyright (C) 1999-2018 Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. (Heavily copied from the D10V port by Martin Hunt (hunt@cygnus.com)) This file is part of BFD, the Binary File Descriptor library. @@ -27,6 +27,9 @@ #include "elf/s12z.h" +/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */ +#define OCTETS_PER_BYTE(ABFD, SEC) 1 + /* Relocation functions. */ static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); @@ -43,7 +46,8 @@ opru18_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol, 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_size_type octets = (reloc_entry->address + * OCTETS_PER_BYTE (abfd, input_section)); bfd_vma result = bfd_get_24 (abfd, (unsigned char *) data + octets); bfd_vma val = bfd_asymbol_value (symbol); @@ -119,7 +123,7 @@ static reloc_howto_type elf_s12z_howto_table[] = shift_addend_reloc, "R_S12Z_OPR", /* name */ FALSE, /* partial_inplace */ - 0x00000000, /* src_mask */ + 0x00ffffff, /* src_mask */ 0x00ffffff, /* dst_mask */ FALSE), /* pcrel_offset */ @@ -183,6 +187,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 */ @@ -209,11 +236,12 @@ struct s12z_reloc_map static const struct s12z_reloc_map s12z_reloc_map[] = { - /* bfd reloc val */ /* elf reloc val */ - {BFD_RELOC_NONE, R_S12Z_NONE}, - {BFD_RELOC_32, R_S12Z_EXT32}, - {BFD_RELOC_24, R_S12Z_EXT24}, - {BFD_RELOC_16_PCREL, R_S12Z_PCREL_7_15} + /* bfd reloc val */ /* elf reloc val */ + {BFD_RELOC_NONE, R_S12Z_NONE}, + {BFD_RELOC_32, R_S12Z_EXT32}, + {BFD_RELOC_24, R_S12Z_EXT24}, + {BFD_RELOC_16_PCREL, R_S12Z_PCREL_7_15}, + {BFD_RELOC_S12Z_OPR, R_S12Z_OPR} }; static reloc_howto_type * @@ -293,7 +321,5 @@ s12z_elf_set_mach_from_flags (bfd *abfd) #define elf_info_to_howto NULL #define elf_info_to_howto_rel s12z_info_to_howto_rel #define elf_backend_object_p s12z_elf_set_mach_from_flags -#define elf_backend_final_write_processing NULL -#define elf_backend_can_gc_sections 1 #include "elf32-target.h"