[PATCH] BPF relocations review / refactoring

Cupertino Miranda cupertino.miranda@oracle.com
Thu Mar 2 11:25:31 GMT 2023


- Removed not needed relocations.
- Renamed relocations to match llvm and linux kernel.

Relocation changes:
  R_BPF_INSN_64 	=> R_BPF_64_64
  R_BPF_INSN_DISP32 	=> R_BPF_64_32
  R_BPF_DATA_32 	=> R_BPF_64_ABS32
  R_BPF_DATA_64 	=> R_BPF_64_ABS64

ChangeLog:

  * bfd/bpf-reloc.def: Created file with BPF_HOWTO macro entries.
  * bfd/reloc.c: Removed non needed relocations.
  * bfd/bfd-in2.h: regenerated.
  * bfd/libbfd.h: regenerated.
  * bfd/elf64-bpf.c: Changed relocations.
  * include/elf/bpf.h: Adapted relocation values/names.
  * gas/config/tc-bpf.c: Changed relocation mapping.
---
 bfd/bfd-in2.h       |   3 -
 bfd/bpf-reloc.def   |  74 +++++++++++
 bfd/elf64-bpf.c     | 314 +++++++-------------------------------------
 bfd/libbfd.h        |   3 -
 bfd/reloc.c         |   6 -
 gas/config/tc-bpf.c |   7 -
 include/elf/bpf.h   |  22 ++--
 7 files changed, 129 insertions(+), 300 deletions(-)
 create mode 100644 bfd/bpf-reloc.def

diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 7c5953442aa..b60ff960f08 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -6079,9 +6079,6 @@ assembler and not (currently) written to any object files.  */
 
 /* Linux eBPF relocations.  */
   BFD_RELOC_BPF_64,
-  BFD_RELOC_BPF_32,
-  BFD_RELOC_BPF_16,
-  BFD_RELOC_BPF_DISP16,
   BFD_RELOC_BPF_DISP32,
 
 /* Adapteva EPIPHANY - 8 bit signed pc-relative displacement  */
diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def
new file mode 100644
index 00000000000..b1be2eb66f6
--- /dev/null
+++ b/bfd/bpf-reloc.def
@@ -0,0 +1,74 @@
+  /* This reloc does nothing.  */
+  BPF_HOWTO (R_BPF_NONE,		/* type */
+	 0,			/* rightshift */
+	 0,			/* size */
+	 0,			/* bitsize */
+	 false,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_dont, /* complain_on_overflow */
+	 bpf_elf_generic_reloc, /* special_function */
+	 "R_BPF_NONE",		/* name */
+	 false,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0,			/* dst_mask */
+	 false)		/* pcrel_offset */
+
+  /* 64-immediate in LDDW instruction.  */
+  BPF_HOWTO (R_BPF_64_64,		/* type */
+	 0,			/* rightshift */
+	 8,			/* size */
+	 64,			/* bitsize */
+	 false,			/* pc_relative */
+	 32,			/* bitpos */
+	 complain_overflow_signed, /* complain_on_overflow */
+	 bpf_elf_generic_reloc, /* special_function */
+	 "R_BPF_64_64",	/* name */
+	 true,			/* partial_inplace */
+	 MINUS_ONE,		/* src_mask */
+	 MINUS_ONE,		/* dst_mask */
+	 true)			/* pcrel_offset */
+
+  /* 32-bit data.  */
+  BPF_HOWTO (R_BPF_64_ABS32,		/* type */
+	 0,			/* rightshift */
+	 4,			/* size */
+	 32,			/* bitsize */
+	 false,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield, /* complain_on_overflow */
+	 bpf_elf_generic_reloc, /* special_function */
+	 "R_BPF_64_ABS32",	/* name */
+	 false,			/* partial_inplace */
+	 0xffffffff,		/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 true)			/* pcrel_offset */
+
+  /* 64-bit data.  */
+  BPF_HOWTO (R_BPF_64_ABS64,		/* type */
+	 0,			/* rightshift */
+	 8,			/* size */
+	 64,			/* bitsize */
+	 false,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield, /* complain_on_overflow */
+	 bpf_elf_generic_reloc, /* special_function */
+	 "R_BPF_64_ABS64",	/* name */
+	 false,			/* partial_inplace */
+	 0,			/* src_mask */
+	 MINUS_ONE,		/* dst_mask */
+	 true)			/* pcrel_offset */
+
+  /* 32-bit PC-relative address in call instructions.  */
+  BPF_HOWTO (R_BPF_64_32,      /* type */
+        0,                     /* rightshift */
+        4,                     /* size */
+        32,                    /* bitsize */
+        true,                  /* pc_relative */
+        32,                    /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        bpf_elf_generic_reloc, /* special_function */
+        "R_BPF_64_32",         /* name */
+        true,                  /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        true)                  /* pcrel_offset */
diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c
index 4f9949b515b..ef34d62df01 100644
--- a/bfd/elf64-bpf.c
+++ b/bfd/elf64-bpf.c
@@ -34,214 +34,40 @@
 static bfd_reloc_status_type bpf_elf_generic_reloc
   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
 
+#undef BPF_HOWTO
+#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name,   \
+		  inplace, src_mask, dst_mask, pcrel_off)                  \
+	type##_IDX,
+enum bpf_reloc_index {
+  R_BPF_INVALID_IDX = -1,
+#include "bpf-reloc.def"
+  R_BPF_SIZE
+};
+#undef BPF_HOWTO
+
 /* Relocation tables.  */
+#define BPF_HOWTO(...) HOWTO(__VA_ARGS__),
 static reloc_howto_type bpf_elf_howto_table [] =
 {
-  /* This reloc does nothing.  */
-  HOWTO (R_BPF_NONE,		/* type */
-	 0,			/* rightshift */
-	 0,			/* size */
-	 0,			/* bitsize */
-	 false,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_dont, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_NONE",		/* name */
-	 false,			/* partial_inplace */
-	 0,			/* src_mask */
-	 0,			/* dst_mask */
-	 false),		/* pcrel_offset */
-
-  /* 64-immediate in LDDW instruction.  */
-  HOWTO (R_BPF_INSN_64,		/* type */
-	 0,			/* rightshift */
-	 8,			/* size */
-	 64,			/* bitsize */
-	 false,			/* pc_relative */
-	 32,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_INSN_64",	/* name */
-	 true,			/* partial_inplace */
-	 MINUS_ONE,		/* src_mask */
-	 MINUS_ONE,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  /* 32-immediate in many instructions.  */
-  HOWTO (R_BPF_INSN_32,		/* type */
-	 0,			/* rightshift */
-	 4,			/* size */
-	 32,			/* bitsize */
-	 false,			/* pc_relative */
-	 32,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_INSN_32",	/* name */
-	 true,			/* partial_inplace */
-	 0xffffffff,		/* src_mask */
-	 0xffffffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  /* 16-bit offsets in instructions.  */
-  HOWTO (R_BPF_INSN_16,		/* type */
-	 0,			/* rightshift */
-	 2,			/* size */
-	 16,			/* bitsize */
-	 false,			/* pc_relative */
-	 16,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_INSN_16",	/* name */
-	 true,			/* partial_inplace */
-	 0x0000ffff,		/* src_mask */
-	 0x0000ffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  /* 16-bit PC-relative address in jump instructions.  */
-  HOWTO (R_BPF_INSN_DISP16,	/* type */
-	 0,			/* rightshift */
-	 2,			/* size */
-	 16,			/* bitsize */
-	 true,			/* pc_relative */
-	 16,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_INSN_DISP16",   /* name */
-	 true,			/* partial_inplace */
-	 0xffff,		/* src_mask */
-	 0xffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_8_PCREL,
-	 0,			/* rightshift */
-	 1,			/* size */
-	 8,			/* bitsize */
-	 true,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_8_PCREL",	/* name */
-	 true,			/* partial_inplace */
-	 0xff,			/* src_mask */
-	 0xff,			/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_16_PCREL,
-	 0,			/* rightshift */
-	 2,			/* size */
-	 16,			/* bitsize */
-	 true,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_16_PCREL",	/* name */
-	 false,			/* partial_inplace */
-	 0xffff,		/* src_mask */
-	 0xffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_32_PCREL,
-	 0,			/* rightshift */
-	 4,			/* size */
-	 32,			/* bitsize */
-	 true,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_32_PCREL",	/* name */
-	 false,			/* partial_inplace */
-	 0xffffffff,		/* src_mask */
-	 0xffffffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_8,
-	 0,			/* rightshift */
-	 1,			/* size */
-	 8,			/* bitsize */
-	 false,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_unsigned, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_DATA_8",	/* name */
-	 true,			/* partial_inplace */
-	 0xff,			/* src_mask */
-	 0xff,			/* dst_mask */
-	 false),		/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_16,
-	 0,			/* rightshift */
-	 2,			/* size */
-	 16,			/* bitsize */
-	 false,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_unsigned, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_DATA_16",	/* name */
-	 false,			/* partial_inplace */
-	 0xffff,		/* src_mask */
-	 0xffff,		/* dst_mask */
-	 false),		/* pcrel_offset */
-
-  /* 32-bit PC-relative address in call instructions.  */
-  HOWTO (R_BPF_INSN_DISP32,	/* type */
-	 0,			/* rightshift */
-	 4,			/* size */
-	 32,			/* bitsize */
-	 true,			/* pc_relative */
-	 32,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_INSN_DISP32",   /* name */
-	 true,			/* partial_inplace */
-	 0xffffffff,		/* src_mask */
-	 0xffffffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  /* 32-bit data.  */
-  HOWTO (R_BPF_DATA_32,		/* type */
-	 0,			/* rightshift */
-	 4,			/* size */
-	 32,			/* bitsize */
-	 false,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_bitfield, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_DATA_32",	/* name */
-	 false,			/* partial_inplace */
-	 0xffffffff,		/* src_mask */
-	 0xffffffff,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  /* 64-bit data.  */
-  HOWTO (R_BPF_DATA_64,		/* type */
-	 0,			/* rightshift */
-	 8,			/* size */
-	 64,			/* bitsize */
-	 false,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_bitfield, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_DATA_64",	/* name */
-	 false,			/* partial_inplace */
-	 0,			/* src_mask */
-	 MINUS_ONE,		/* dst_mask */
-	 true),			/* pcrel_offset */
-
-  HOWTO (R_BPF_DATA_64_PCREL,
-	 0,			/* rightshift */
-	 8,			/* size */
-	 64,			/* bitsize */
-	 true,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_signed, /* complain_on_overflow */
-	 bpf_elf_generic_reloc, /* special_function */
-	 "R_BPF_64_PCREL",	/* name */
-	 false,			/* partial_inplace */
-	 MINUS_ONE,		/* src_mask */
-	 MINUS_ONE,		/* dst_mask */
-	 true),			/* pcrel_offset */
+  #include "bpf-reloc.def"
 };
 #undef AHOW
+#undef BPF_HOWTO
+
+#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name,   \
+		  inplace, src_mask, dst_mask, pcrel_off)                  \
+    case type: { return type##_IDX; }
+static enum bpf_reloc_index
+bpf_index_for_rtype(unsigned int r_type)
+{
+  switch(r_type) {
+#include "bpf-reloc.def"
+    default:
+      /* Unreachable code. */
+      BFD_ASSERT(0);
+      return -1;
+  };
+}
 
 /* Map BFD reloc types to bpf ELF reloc types.  */
 
@@ -249,44 +75,20 @@ static reloc_howto_type *
 bpf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
                         bfd_reloc_code_real_type code)
 {
-  /* Note that the bpf_elf_howto_table is indexed by the R_ constants.
-     Thus, the order that the howto records appear in the table *must*
-     match the order of the relocation types defined in
-     include/elf/bpf.h.  */
-
   switch (code)
     {
     case BFD_RELOC_NONE:
-      return &bpf_elf_howto_table[ (int) R_BPF_NONE];
-
-    case BFD_RELOC_8_PCREL:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_8_PCREL];
-    case BFD_RELOC_16_PCREL:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_16_PCREL];
-    case BFD_RELOC_32_PCREL:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_32_PCREL];
-    case BFD_RELOC_64_PCREL:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_64_PCREL];
-
-    case BFD_RELOC_8:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_8];
-    case BFD_RELOC_16:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_16];
+      return &bpf_elf_howto_table[ (int) R_BPF_NONE_IDX];
+
     case BFD_RELOC_32:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_32];
+      return &bpf_elf_howto_table[ (int) R_BPF_64_ABS32_IDX];
     case BFD_RELOC_64:
-      return &bpf_elf_howto_table[ (int) R_BPF_DATA_64];
+      return &bpf_elf_howto_table[ (int) R_BPF_64_ABS64_IDX];
 
     case BFD_RELOC_BPF_64:
-      return &bpf_elf_howto_table[ (int) R_BPF_INSN_64];
-    case BFD_RELOC_BPF_32:
-      return &bpf_elf_howto_table[ (int) R_BPF_INSN_32];
-    case BFD_RELOC_BPF_16:
-      return &bpf_elf_howto_table[ (int) R_BPF_INSN_16];
-    case BFD_RELOC_BPF_DISP16:
-      return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP16];
+      return &bpf_elf_howto_table[ (int) R_BPF_64_64_IDX];
     case BFD_RELOC_BPF_DISP32:
-      return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP32];
+      return &bpf_elf_howto_table[ (int) R_BPF_64_32_IDX];
 
     default:
       /* Pacify gcc -Wall.  */
@@ -302,7 +104,7 @@ bpf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
 {
   unsigned int i;
 
-  for (i = 0; i < ARRAY_SIZE (bpf_elf_howto_table); i++)
+  for (i = 0; i < R_BPF_SIZE; i++)
     if (bpf_elf_howto_table[i].name != NULL
 	&& strcasecmp (bpf_elf_howto_table[i].name, r_name) == 0)
       return &bpf_elf_howto_table[i];
@@ -317,9 +119,11 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
                     Elf_Internal_Rela *elf_reloc)
 {
   unsigned int r_type;
-
+  unsigned int i;
   r_type = ELF64_R_TYPE (elf_reloc->r_info);
-  if (r_type >= (unsigned int) R_BPF_max)
+
+  i = bpf_index_for_rtype(r_type);
+  if (i == (unsigned int) -1)
     {
       /* xgettext:c-format */
       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -328,7 +132,7 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
       return false;
     }
 
-  bfd_reloc->howto = &bpf_elf_howto_table [r_type];
+  bfd_reloc->howto = &bpf_elf_howto_table [i];
   return true;
 }
 
@@ -438,8 +242,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 
       switch (howto->type)
         {
-        case R_BPF_INSN_DISP16:
-        case R_BPF_INSN_DISP32:
+	case R_BPF_64_32:
           {
             /* Make the relocation PC-relative, and change its unit to
                64-bit words.  Note we need *signed* arithmetic
@@ -465,10 +268,8 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
             r = bfd_reloc_ok;
             break;
           }
-	case R_BPF_DATA_8:
-	case R_BPF_DATA_16:
-	case R_BPF_DATA_32:
-	case R_BPF_DATA_64:
+	case R_BPF_64_ABS64:
+	case R_BPF_64_ABS32:
 	  {
 	    addend = bfd_get (howto->bitsize, input_bfd, where);
 	    relocation += addend;
@@ -477,28 +278,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
 	    r = bfd_reloc_ok;
 	    break;
 	  }
-	case R_BPF_INSN_16:
-	  {
-
-	    addend = bfd_get_16 (input_bfd, where + 2);
-	    relocation += addend;
-	    bfd_put_16 (input_bfd, relocation, where + 2);
-
-	    r = bfd_reloc_ok;
-	    break;
-	  }
-        case R_BPF_INSN_32:
-          {
-            /*  Write relocated value */
-
-	    addend = bfd_get_32 (input_bfd, where + 4);
-	    relocation += addend;
-            bfd_put_32 (input_bfd, relocation, where + 4);
-
-            r = bfd_reloc_ok;
-            break;
-          }
-        case R_BPF_INSN_64:
+	case R_BPF_64_64:
           {
             /*
                 LDDW instructions are 128 bits long, with a 64-bit immediate.
@@ -610,7 +390,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   /* Sanity check that the address is in range.  */
   bfd_size_type end = bfd_get_section_limit_octets (abfd, input_section);
   bfd_size_type reloc_size;
-  if (reloc_entry->howto->type == R_BPF_INSN_64)
+  if (reloc_entry->howto->type == R_BPF_64_64)
     reloc_size = 16;
   else
     reloc_size = (reloc_entry->howto->bitsize
@@ -642,7 +422,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
     return status;
 
   /* Now finally install the relocation.  */
-  if (reloc_entry->howto->type == R_BPF_INSN_64)
+  if (reloc_entry->howto->type == R_BPF_64_64)
     {
       /* lddw is a 128-bit (!) instruction that allows loading a 64-bit
 	 immediate into a register. the immediate is split in half, with the
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index e75935133ac..fa6f2d71b60 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -3340,9 +3340,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
   "BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
   "BFD_RELOC_BPF_64",
-  "BFD_RELOC_BPF_32",
-  "BFD_RELOC_BPF_16",
-  "BFD_RELOC_BPF_DISP16",
   "BFD_RELOC_BPF_DISP32",
   "BFD_RELOC_EPIPHANY_SIMM8",
   "BFD_RELOC_EPIPHANY_SIMM24",
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 346dd7638db..16540632613 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -7749,12 +7749,6 @@ ENUMDOC
 
 ENUM
   BFD_RELOC_BPF_64
-ENUMX
-  BFD_RELOC_BPF_32
-ENUMX
-  BFD_RELOC_BPF_16
-ENUMX
-  BFD_RELOC_BPF_DISP16
 ENUMX
   BFD_RELOC_BPF_DISP32
 ENUMDOC
diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
index aa701584470..1f8b0cc2ede 100644
--- a/gas/config/tc-bpf.c
+++ b/gas/config/tc-bpf.c
@@ -274,15 +274,8 @@ md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
 {
   switch (operand->type)
     {
-    case BPF_OPERAND_OFFSET16:
-      return BFD_RELOC_BPF_16;
-    case BPF_OPERAND_IMM32:
-      return BFD_RELOC_BPF_32;
     case BPF_OPERAND_IMM64:
       return BFD_RELOC_BPF_64;
-    case BPF_OPERAND_DISP16:
-      fixP->fx_pcrel = 1;
-      return BFD_RELOC_BPF_DISP16;
     case BPF_OPERAND_DISP32:
       fixP->fx_pcrel = 1;
       return BFD_RELOC_BPF_DISP32;
diff --git a/include/elf/bpf.h b/include/elf/bpf.h
index e52f481b2be..fb1936010bf 100644
--- a/include/elf/bpf.h
+++ b/include/elf/bpf.h
@@ -26,20 +26,14 @@
 
 /* Relocations.  */
 START_RELOC_NUMBERS (elf_bpf_reloc_type)
-  RELOC_NUMBER (R_BPF_NONE,		0)
-  RELOC_NUMBER (R_BPF_INSN_64,		1)
-  RELOC_NUMBER (R_BPF_INSN_32,		2)
-  RELOC_NUMBER (R_BPF_INSN_16,          3)
-  RELOC_NUMBER (R_BPF_INSN_DISP16,	4)
-  RELOC_NUMBER (R_BPF_DATA_8_PCREL,	5)
-  RELOC_NUMBER (R_BPF_DATA_16_PCREL,	6)
-  RELOC_NUMBER (R_BPF_DATA_32_PCREL,	7)
-  RELOC_NUMBER (R_BPF_DATA_8,		8)
-  RELOC_NUMBER (R_BPF_DATA_16,		9)
-  RELOC_NUMBER (R_BPF_INSN_DISP32,	10)
-  RELOC_NUMBER (R_BPF_DATA_32,		11)
-  RELOC_NUMBER (R_BPF_DATA_64,		12)
-  RELOC_NUMBER (R_BPF_DATA_64_PCREL,	13)
+  RELOC_NUMBER (R_BPF_NONE,			0)
+  RELOC_NUMBER (R_BPF_64_64,       		1)
+  RELOC_NUMBER (R_BPF_64_ABS64,    		2)
+  RELOC_NUMBER (R_BPF_64_ABS32,    		3)
+/* R_BPF_64_NODYLD32 is not used by GNU tools.
+ * It is kept in this file to remind that the value is already taken. */
+  RELOC_NUMBER (R_BPF_64_NODYLD32, 		4)
+  RELOC_NUMBER (R_BPF_64_32,      		10)
 END_RELOC_NUMBERS (R_BPF_max)
 
 #endif /* _ELF_BPF_H  */
-- 
2.30.2



More information about the Binutils mailing list