/* BFD back-end for National Semiconductor's CRX ELF
- Copyright (C) 2004-2021 Free Software Foundation, Inc.
+ Copyright (C) 2004-2024 Free Software Foundation, Inc.
Written by Tomer Levi, NSC, Israel.
This file is part of BFD, the Binary File Descriptor library.
{
HOWTO (R_CRX_NONE, /* type */
0, /* rightshift */
- 3, /* size */
+ 0, /* size */
0, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL4, /* type */
1, /* rightshift */
- 0, /* size */
+ 1, /* size */
4, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL8, /* type */
1, /* rightshift */
- 0, /* size */
+ 1, /* size */
8, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL8_CMP, /* type */
1, /* rightshift */
- 0, /* size */
+ 1, /* size */
8, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL16, /* type */
1, /* rightshift */
- 1, /* size */
+ 2, /* size */
16, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL24, /* type */
1, /* rightshift */
- 2, /* size */
+ 4, /* size */
24, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REL32, /* type */
1, /* rightshift */
- 2, /* size */
+ 4, /* size */
32, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REGREL12, /* type */
0, /* rightshift */
- 1, /* size */
+ 2, /* size */
12, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REGREL22, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
22, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REGREL28, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
28, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_REGREL32, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
32, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_ABS16, /* type */
0, /* rightshift */
- 1, /* size */
+ 2, /* size */
16, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_ABS32, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
32, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_NUM8, /* type */
0, /* rightshift */
- 0, /* size */
+ 1, /* size */
8, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_NUM16, /* type */
0, /* rightshift */
- 1, /* size */
+ 2, /* size */
16, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_NUM32, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
32, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_IMM16, /* type */
0, /* rightshift */
- 1, /* size */
+ 2, /* size */
16, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
HOWTO (R_CRX_IMM32, /* type */
0, /* rightshift */
- 2, /* size */
+ 4, /* size */
32, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
between the reloc address and L2. */
HOWTO (R_CRX_SWITCH8, /* type */
0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 1, /* size */
8, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
between the reloc address and L2. */
HOWTO (R_CRX_SWITCH16, /* type */
0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 2, /* size */
16, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
between the reloc address and L2. */
HOWTO (R_CRX_SWITCH32, /* type */
0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 4, /* size */
32, /* bitsize */
false, /* pc_relative */
0, /* bitpos */
/* Apply dst_mask to select only relocatable part of the insn. */
Rvalue &= howto->dst_mask;
- switch (howto->size)
+ switch (bfd_get_reloc_size (howto))
{
- case 0:
+ case 1:
if (r_type == R_CRX_REL4)
{
Rvalue <<= 4;
bfd_put_8 (input_bfd, (unsigned char) Rvalue, hit_data);
break;
- case 1:
+ case 2:
if (r_type == R_CRX_REGREL12)
Rvalue |= (bfd_get_16 (input_bfd, hit_data) & 0xf000);
bfd_put_16 (input_bfd, Rvalue, hit_data);
break;
- case 2:
+ case 4:
if (r_type == R_CRX_REL24
|| r_type == R_CRX_REGREL22
|| r_type == R_CRX_REGREL28)
symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
+ bfd_byte *orig_data = data;
+ if (data == NULL)
+ {
+ data = bfd_malloc (input_section->size);
+ if (data == NULL)
+ return NULL;
+ }
memcpy (data, elf_section_data (input_section)->this_hdr.contents,
(size_t) input_section->size);
free (isymbuf);
if (elf_section_data (input_section)->relocs != internal_relocs)
free (internal_relocs);
+ if (orig_data == NULL)
+ free (data);
return NULL;
}
this section does not have relocs, or if this is not a
code section. */
if (bfd_link_relocatable (link_info)
- || (sec->flags & SEC_RELOC) == 0
|| sec->reloc_count == 0
+ || (sec->flags & SEC_RELOC) == 0
+ || (sec->flags & SEC_HAS_CONTENTS) == 0
|| (sec->flags & SEC_CODE) == 0)
return true;