/* Linux bpf specific support for 64-bit ELF
- Copyright (C) 2019 Free Software Foundation, Inc.
+ Copyright (C) 2019-2020 Free Software Foundation, Inc.
Contributed by Oracle Inc.
This file is part of BFD, the Binary File Descriptor library.
MINUS_ONE, /* dst_mask */
TRUE), /* pcrel_offset */
- /* 32-immediate in LDDW instruction. */
+ /* 32-immediate in many instructions. Note: handled manually. */
HOWTO (R_BPF_INSN_32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
name = bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name);
- name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+ name = name == NULL ? bfd_section_name (sec) : name;
}
else
{
r = bfd_reloc_ok;
break;
}
+ case R_BPF_INSN_32:
+ {
+ /* Write relocated value */
+ bfd_put (howto->bitsize, input_bfd, relocation,
+ contents + rel->r_offset + 4);
+
+ r = bfd_reloc_ok;
+ break;
+ }
+ case R_BPF_INSN_64:
+ {
+ /*
+ LDDW instructions are 128 bits long, with a 64-bit immediate.
+ The lower 32 bits of the immediate are in the same position
+ as the imm32 field of other instructions.
+ The upper 32 bits of the immediate are stored at the end of
+ the instruction.
+ */
+ bfd_put (32, input_bfd, (relocation & 0xFFFFFFFF),
+ contents + rel->r_offset + 4);
+ bfd_put (32, input_bfd, (relocation >> 32),
+ contents + rel->r_offset + 12);
+ r = bfd_reloc_ok;
+ break;
+ }
default:
r = _bfd_final_link_relocate (howto, input_bfd, input_section,
contents, rel->r_offset, relocation,