aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorCupertino Miranda <cupertino.miranda@oracle.com>2023-12-20 12:24:03 +0000
committerCupertino Miranda <cupertino.miranda@oracle.com>2024-01-08 20:44:37 +0000
commitad4e57ab110aba9cd90a76539ed480e9d1f8cfa5 (patch)
tree0556a97a3867d50e3f70626cf3b268eff793115d /bfd
parent30a9c613dfaf228d0bd1a5ff4db3a2b07374916a (diff)
downloadfsf-binutils-gdb-ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5.zip
fsf-binutils-gdb-ad4e57ab110aba9cd90a76539ed480e9d1f8cfa5.tar.gz
fsf-binutils-gdb-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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/bpf-reloc.def17
-rw-r--r--bfd/elf64-bpf.c1
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;