bfd: fix handling of R_BPF_INSN_{32,64} relocations.
2020-05-28 David Faust <david.faust@oracle.com> * elf64-bpf.c (bpf_elf_relocate_section): Fix handling of R_BPF_INSN_{32,64} relocations.
This commit is contained in:
parent
78c1c35437
commit
12adf8053b
@ -1,3 +1,8 @@
|
||||
2020-05-28 David Faust <david.faust@oracle.com>
|
||||
|
||||
* elf64-bpf.c (bpf_elf_relocate_section): Fix handling of
|
||||
R_BPF_INSN_{32,64} relocations.
|
||||
|
||||
2020-05-28 Stephen Casner <casner@acm.org>
|
||||
|
||||
* pdp11.c: Implement BRD_RELOC_32 to relocate the low 16 bits of
|
||||
|
@ -64,7 +64,7 @@ static reloc_howto_type bpf_elf_howto_table [] =
|
||||
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) */
|
||||
@ -460,6 +460,31 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user