[PATCH] BPF relocations review / refactoring
Jose E. Marchesi
jose.marchesi@oracle.com
Wed Mar 15 16:39:01 GMT 2023
Hi Cupertino.
The approach, the switch to the consolidated BPF relocs, and the patch
itself LGTM.
The only comment I have is: will bpf-reloc.def be included in the
binutils distribution tarball? The binutils releases are done by
running the src-release.sh. So we need to make sure the .def file ends
in the tarball...
> - 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 */
More information about the Binutils
mailing list