/* BFD back-end for Motorola MCore COFF/PE
- Copyright (C) 1999-2017 Free Software Foundation, Inc.
+ Copyright (C) 1999-2023 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
/* This file is compiled more than once, but we only compile the
final_link routine once. */
-extern bfd_boolean mcore_bfd_coff_final_link
+extern bool mcore_bfd_coff_final_link
(bfd *, struct bfd_link_info *);
static bfd_reloc_status_type mcore_coff_unsupported_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
{
/* Unused: */
HOWTO (IMAGE_REL_MCORE_ABSOLUTE,/* type */
- 0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
+ 0, /* rightshift */
+ 0, /* size */
+ 0, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_dont, /* dont complain_on_overflow */
- NULL, /* special_function */
- "ABSOLUTE", /* name */
- FALSE, /* partial_inplace */
- 0x00, /* src_mask */
- 0x00, /* dst_mask */
- FALSE), /* pcrel_offset */
+ NULL, /* special_function */
+ "ABSOLUTE", /* name */
+ false, /* partial_inplace */
+ 0x00, /* src_mask */
+ 0x00, /* dst_mask */
+ false), /* pcrel_offset */
HOWTO (IMAGE_REL_MCORE_ADDR32,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- FALSE, /* pc_relative */
- 0, /* bitpos */
+ 0, /* rightshift */
+ 4, /* size */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
- NULL, /* special_function */
- "ADDR32", /* name */
- TRUE, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ NULL, /* special_function */
+ "ADDR32", /* name */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ false), /* pcrel_offset */
/* 8 bits + 2 zero bits; jmpi/jsri/lrw instructions.
Should not appear in object files. */
HOWTO (IMAGE_REL_MCORE_PCREL_IMM8BY4, /* type */
2, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 2, /* size */
8, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
mcore_coff_unsupported_reloc, /* special_function */
- "IMM8BY4", /* name */
- FALSE, /* partial_inplace */
+ "IMM8BY4", /* name */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* bsr/bt/bf/br instructions; 11 bits + 1 zero bit
Span 2k instructions == 4k bytes.
Only useful pieces at the relocated address are the opcode (5 bits) */
HOWTO (IMAGE_REL_MCORE_PCREL_IMM11BY2,/* type */
1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 2, /* size */
11, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- NULL, /* special_function */
- "IMM11BY2", /* name */
- FALSE, /* partial_inplace */
+ NULL, /* special_function */
+ "IMM11BY2", /* name */
+ false, /* partial_inplace */
0x0, /* src_mask */
0x7ff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* 4 bits + 1 zero bit; 'loopt' instruction only; unsupported. */
HOWTO (IMAGE_REL_MCORE_PCREL_IMM4BY2, /* type */
1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 2, /* size */
4, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
mcore_coff_unsupported_reloc, /* special_function */
- "IMM4BY2", /* name */
- FALSE, /* partial_inplace */
+ "IMM4BY2", /* name */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* 32-bit pc-relative. Eventually this will help support PIC code. */
HOWTO (IMAGE_REL_MCORE_PCREL_32,/* type */
0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 4, /* size */
32, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
- NULL, /* special_function */
- "PCREL_32", /* name */
- FALSE, /* partial_inplace */
+ NULL, /* special_function */
+ "PCREL_32", /* name */
+ false, /* partial_inplace */
0x0, /* src_mask */
0xffffffff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* Like PCREL_IMM11BY2, this relocation indicates that there is a
'jsri' at the specified address. There is a separate relocation
is a relocation that we are allowed to safely ignore. */
HOWTO (IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2,/* type */
1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 2, /* size */
11, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- NULL, /* special_function */
- "JSR_IMM11BY2", /* name */
- FALSE, /* partial_inplace */
+ NULL, /* special_function */
+ "JSR_IMM11BY2", /* name */
+ false, /* partial_inplace */
0x0, /* src_mask */
0x7ff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
- HOWTO (IMAGE_REL_MCORE_RVA, /* type */
+ HOWTO (IMAGE_REL_MCORE_RVA, /* type */
0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 4, /* size */
32, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- NULL, /* special_function */
- "MCORE_RVA", /* name */
- TRUE, /* partial_inplace */
+ NULL, /* special_function */
+ "MCORE_RVA", /* name */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- TRUE) /* pcrel_offset */
+ true) /* pcrel_offset */
};
\f
/* Extend the coff_link_hash_table structure with a few M*Core specific fields.
/* The original coff_link_hash_table structure. MUST be first field. */
struct coff_link_hash_table root;
- bfd * bfd_of_toc_owner;
- long int global_toc_size;
- long int import_table_size;
- long int first_thunk_address;
- long int thunk_size;
+ bfd * bfd_of_toc_owner;
+ long int global_toc_size;
+ long int import_table_size;
+ long int first_thunk_address;
+ long int thunk_size;
}
mcore_hash_table;
\f
/* Add an entry to the base file. */
-static bfd_boolean
+static bool
mcore_emit_base_file_entry (struct bfd_link_info *info,
bfd *output_bfd,
asection *input_section,
bfd_vma reloc_offset)
{
bfd_vma addr = reloc_offset
- - input_section->vma
- + input_section->output_offset
- + input_section->output_section->vma;
+ - input_section->vma
+ + input_section->output_offset
+ + input_section->output_section->vma;
- if (coff_data (output_bfd)->pe)
+ if (obj_pe (output_bfd))
addr -= pe_data (output_bfd)->pe_opthdr.ImageBase;
if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
- return TRUE;
+ return true;
bfd_set_error (bfd_error_system_call);
- return FALSE;
+ return false;
}
\f
static bfd_reloc_status_type
BFD_ASSERT (reloc_entry->howto != (reloc_howto_type *)0);
/* xgettext: c-format */
- _bfd_error_handler (_("%B: Relocation %s (%d) is not currently supported.\n"),
+ _bfd_error_handler (_("%pB: Relocation %s (%d) is not currently supported.\n"),
abfd,
reloc_entry->howto->name,
reloc_entry->howto->type);
{
switch (code)
{
- HOW2MAP (BFD_RELOC_32, IMAGE_REL_MCORE_ADDR32);
- HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM8BY4, IMAGE_REL_MCORE_PCREL_IMM8BY4);
- HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM11BY2, IMAGE_REL_MCORE_PCREL_IMM11BY2);
- HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM4BY2, IMAGE_REL_MCORE_PCREL_IMM4BY2);
- HOW2MAP (BFD_RELOC_32_PCREL, IMAGE_REL_MCORE_PCREL_32);
+ HOW2MAP (BFD_RELOC_32, IMAGE_REL_MCORE_ADDR32);
+ HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM8BY4, IMAGE_REL_MCORE_PCREL_IMM8BY4);
+ HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM11BY2, IMAGE_REL_MCORE_PCREL_IMM11BY2);
+ HOW2MAP (BFD_RELOC_MCORE_PCREL_IMM4BY2, IMAGE_REL_MCORE_PCREL_IMM4BY2);
+ HOW2MAP (BFD_RELOC_32_PCREL, IMAGE_REL_MCORE_PCREL_32);
HOW2MAP (BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2, IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2);
- HOW2MAP (BFD_RELOC_RVA, IMAGE_REL_MCORE_RVA);
+ HOW2MAP (BFD_RELOC_RVA, IMAGE_REL_MCORE_RVA);
default:
return NULL;
}
* addendp = sec->vma - 2; /* XXX guess - is this right ? */
/* If the symbol is defined, then the generic code is going to
- add back the symbol value in order to cancel out an
- adjustment it made to the addend. However, we set the addend
- to 0 at the start of this function. We need to adjust here,
- to avoid the adjustment the generic code will make. FIXME:
- This is getting a bit hackish. */
+ add back the symbol value in order to cancel out an
+ adjustment it made to the addend. However, we set the addend
+ to 0 at the start of this function. We need to adjust here,
+ to avoid the adjustment the generic code will make. FIXME:
+ This is getting a bit hackish. */
if (sym != NULL && sym->n_scnum != 0)
* addendp -= sym->n_value;
}
/* Return TRUE if this relocation should appear in the output .reloc section.
This function is referenced in pe_mkobject in peicode.h. */
-static bfd_boolean
+static bool
in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED, reloc_howto_type * howto)
{
return ! howto->pc_relative && howto->type != IMAGE_REL_MCORE_RVA;
}
\f
/* The reloc processing routine for the optimized COFF linker. */
-static bfd_boolean
+static bool
coff_mcore_relocate_section (bfd * output_bfd,
struct bfd_link_info * info,
bfd * input_bfd,
thing. The caller will take care of adjusting the reloc
addresses and symbol indices. */
if (bfd_link_relocatable (info))
- return TRUE;
+ return true;
/* Check if we have the same endianness */
if ( input_bfd->xvec->byteorder != output_bfd->xvec->byteorder
{
_bfd_error_handler
/* xgettext: c-format */
- (_("%B: compiled for a %s system and target is %s.\n"),
+ (_("%pB: compiled for a %s system and target is %s.\n"),
input_bfd,
- bfd_big_endian (input_bfd) ? _("big endian") : _("little endian"),
- bfd_big_endian (output_bfd) ? _("big endian") : _("little endian"));
+ bfd_big_endian (input_bfd) ? _("big endian") : _("little endian"),
+ bfd_big_endian (output_bfd) ? _("big endian") : _("little endian"));
bfd_set_error (bfd_error_wrong_format);
- return FALSE;
+ return false;
}
rel = relocs;
for (; rel < relend; rel++)
{
- long symndx;
- struct internal_syment * sym;
- bfd_vma val;
- bfd_vma addend;
- bfd_reloc_status_type rstat;
- bfd_byte * loc;
- unsigned short r_type = rel->r_type;
- reloc_howto_type * howto = NULL;
+ long symndx;
+ struct internal_syment * sym;
+ bfd_vma val;
+ bfd_vma addend;
+ bfd_reloc_status_type rstat;
+ bfd_byte * loc;
+ unsigned short r_type = rel->r_type;
+ reloc_howto_type * howto = NULL;
struct coff_link_hash_entry * h;
- const char * my_name;
+ const char * my_name;
+ char buf[SYMNMLEN + 1];
symndx = rel->r_symndx;
loc = contents + rel->r_vaddr - input_section->vma;
howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
sym, & addend);
if (howto == NULL)
- return FALSE;
+ return false;
val = 0;
my_name = "*unknown*";
else if ( sym->_n._n_n._n_zeroes == 0
&& sym->_n._n_n._n_offset != 0)
- my_name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
+ {
+ if (sym->_n._n_n._n_offset < obj_coff_strings_len (input_bfd))
+ my_name = (obj_coff_strings (input_bfd)
+ + sym->_n._n_n._n_offset);
+ else
+ my_name = "?";
+ }
else
{
- static char buf [SYMNMLEN + 1];
-
strncpy (buf, sym->_n._n_name, SYMNMLEN);
buf[SYMNMLEN] = '\0';
my_name = buf;
else
(*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd, input_section,
- rel->r_vaddr - input_section->vma, TRUE);
+ rel->r_vaddr - input_section->vma, true);
my_name = h->root.root.string;
}
{
default:
/* xgettext: c-format */
- _bfd_error_handler (_("%B: unsupported relocation type 0x%02x"),
+ _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
input_bfd, r_type);
bfd_set_error (bfd_error_bad_value);
- return FALSE;
+ return false;
case IMAGE_REL_MCORE_ABSOLUTE:
_bfd_error_handler
/* xgettext: c-format */
- (_("Warning: unsupported reloc %s <file %B, section %A>\n"
- "sym %ld (%s), r_vaddr %ld (%lx)"),
- input_bfd, input_section, howto->name,
- rel->r_symndx, my_name, (long) rel->r_vaddr,
- (unsigned long) rel->r_vaddr);
+ (_("warning: unsupported reloc %s <file %pB, section %pA>\n"
+ "sym %ld (%s), r_vaddr %" PRId64 " (%#" PRIx64 ")"),
+ howto->name, input_bfd, input_section,
+ rel->r_symndx, my_name, (int64_t) rel->r_vaddr,
+ (uint64_t) rel->r_vaddr);
break;
case IMAGE_REL_MCORE_PCREL_IMM8BY4:
&& pe_data (output_bfd)->in_reloc_p (output_bfd, howto)
&& !mcore_emit_base_file_entry (info, output_bfd, input_section,
rel->r_vaddr))
- return FALSE;
+ return false;
switch (rstat)
{
}
}
- return TRUE;
+ return true;
}
\f
/* Tailor coffcode.h -- macro heaven. */
#define coff_bfd_reloc_type_lookup mcore_coff_reloc_type_lookup
#define coff_bfd_reloc_name_lookup mcore_coff_reloc_name_lookup
-#define coff_relocate_section coff_mcore_relocate_section
-#define coff_rtype_to_howto coff_mcore_rtype_to_howto
+#define coff_relocate_section coff_mcore_relocate_section
+#define coff_rtype_to_howto coff_mcore_rtype_to_howto
#define SELECT_RELOC(internal, howto) {internal.r_type = howto->type;}
/* Make sure that the 'r_offset' field is copied properly
so that identical binaries will compare the same. */
-#define SWAP_IN_RELOC_OFFSET H_GET_32
-#define SWAP_OUT_RELOC_OFFSET H_PUT_32
+#define SWAP_IN_RELOC_OFFSET H_GET_32
+#define SWAP_OUT_RELOC_OFFSET H_PUT_32
-#define COFF_PAGE_SIZE 0x1000
+#define COFF_PAGE_SIZE 0x1000
#include "coffcode.h"
\f