bpf: Added linker support for R_BPF_64_NODYLD32.
authorCupertino Miranda <cupertino.miranda@oracle.com>
Wed, 20 Dec 2023 12:24:03 +0000 (12:24 +0000)
committerCupertino Miranda <cupertino.miranda@oracle.com>
Mon, 8 Jan 2024 20:44:37 +0000 (20:44 +0000)
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.

bfd/bpf-reloc.def
bfd/elf64-bpf.c

index 7e74978..42ba1a1 100644 (file)
 
   /* 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 */
index c932a40..0bffe2c 100644 (file)
@@ -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;