diff options
author | Cupertino Miranda <cupertino.miranda@oracle.com> | 2023-12-20 12:24:03 +0000 |
---|---|---|
committer | Cupertino Miranda <cupertino.miranda@oracle.com> | 2024-01-08 20:44:37 +0000 |
commit | ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5 (patch) | |
tree | 0556a97a3867d50e3f70626cf3b268eff793115d | |
parent | 30a9c613dfaf228d0bd1a5ff4db3a2b07374916a (diff) | |
download | binutils-ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5.zip binutils-ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5.tar.gz binutils-ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5.tar.bz2 |
bpf: Added linker support for R_BPF_64_NODYLD32.
This patch adds linker support to patch R_BPF_64_NODYLD32 relocations.
The implementation was based on comments and code in LLVM, as the GNU
toolchain does not uses this relocation type.
-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; |