diff options
-rw-r--r-- | bfd/bpf-reloc.def | 17 | ||||
-rw-r--r-- | bfd/elf64-bpf.c | 1 |
2 files changed, 11 insertions, 7 deletions
diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def index 7e74978..42ba1a1 100644 --- a/bfd/bpf-reloc.def +++ b/bfd/bpf-reloc.def @@ -90,17 +90,20 @@ /* R_BPF_64_NODYLD32 is not used by GNU tools - but it is generated by LLVM. We provide an entry here so that tools like strip can safely handle BPF - binaries generated by other tools. */ + binaries generated by other tools. + R_BPF_64_NODYLD32 should be fixed at linker like a R_BPF_64_ABS32. + The difference to ABS32 is that LLVM execution engine does not resolve + R_BPF_64_NODYLD32 relocations. */ BPF_HOWTO (R_BPF_64_NODYLD32, /* type */ 0, /* rightshift */ - 0, /* size */ - 0, /* bitsize */ + 4, /* size */ + 32, /* bitsize */ false, /* pc_relative */ 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ + complain_overflow_bitfield, /* complain_on_overflow */ bpf_elf_generic_reloc, /* special_function */ "R_BPF_64_NODYLD32", /* name */ false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false) /* pcrel_offset */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + true) /* pcrel_offset */ diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c index c932a40..0bffe2c 100644 --- a/bfd/elf64-bpf.c +++ b/bfd/elf64-bpf.c @@ -276,6 +276,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, } case R_BPF_64_ABS64: case R_BPF_64_ABS32: + case R_BPF_64_NODYLD32: { addend = bfd_get (howto->bitsize, input_bfd, where); relocation += addend; |