[PATCH v2] backends,bpf: add proper relocation support

Yonghong Song yhs@fb.com
Sat Jun 16 20:02:00 GMT 2018


Due to libdw does not have proper BPF relocation support,
the pahole cannot display filenames correctly for objects
with default llvm options. So we have to invent
a special option "llc -march=bpf -mattr=dwarfris" to
prevent llvm from generating cross-section dwarf relocation
records (https://reviews.llvm.org/rL326505).
The pahole related discussion is in linux netdev
mailing list (http://lists.openwall.net/netdev/2018/06/15/38, etc.)

We would like to add proper BPF relocation support
to libdw so eventually we could retire the special llc bpf
flag "-mattr=dwarfris".

The bpf relocations are defined in
llvm_repo:include/llvm/BinaryFormat/ELFRelocs/BPF.def:
  ELF_RELOC(R_BPF_NONE,        0)
  ELF_RELOC(R_BPF_64_64,       1)
  ELF_RELOC(R_BPF_64_32,      10)

Removed the relocation type R_BPF_MAP_FD whoes name does not
confirm to llvm definition and replaced it with R_BPF_64_64.
The BPF object is just a relocatible object, not an executable or
a shared library, so assign ELF type to REL only in bpf_reloc.def.

Signed-off-by: Yonghong Song <yhs@fb.com>
---
 backends/ChangeLog                  |   7 +++++
 backends/Makefile.am                |   2 +-
 backends/bpf_init.c                 |   1 +
 backends/bpf_reloc.def              |   3 +-
 backends/bpf_symbol.c               |  54 ++++++++++++++++++++++++++++++++++++
 libelf/elf.h                        |   3 +-
 tests/ChangeLog                     |   9 ++++++
 tests/Makefile.am                   |   5 +++-
 tests/run-reloc-bpf.sh              |  33 ++++++++++++++++++++++
 tests/testfile-bpf-reloc.expect.bz2 | Bin 0 -> 300 bytes
 tests/testfile-bpf-reloc.o.bz2      | Bin 0 -> 933 bytes
 11 files changed, 113 insertions(+), 4 deletions(-)
 create mode 100644 backends/bpf_symbol.c
 create mode 100755 tests/run-reloc-bpf.sh
 create mode 100644 tests/testfile-bpf-reloc.expect.bz2
 create mode 100644 tests/testfile-bpf-reloc.o.bz2

Note:
 I didn't add the Changelog to libelf/elf.h as I anticipate the
 change will come from sync'ing with glibc.
 If this patch version looks good, I can send another revision
 once the libelf/elf.h is synced.

diff --git a/backends/ChangeLog b/backends/ChangeLog
index 0dde0ff3..1ffe5ba4 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,10 @@
+2018-06-16  Yonghong Song  <yhs@fb.com>
+
+	* Makefile.am (bpf_SRCS): Add bpf_symbol.c.
+	* bpf_init.c (bpf_init): Add reloc_simple_type HOOK.
+	* bpf_reloc.def: Add RELOC_TYPE 64_64 and 64_32.
+	* bpf_symbol.c: New file.
+
 2018-05-15  Andreas Schwab  <schwab@suse.de>
 
 	* riscv_init.c (riscv_init): Hook check_special_symbol.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 80aa00e7..b5e721d8 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -126,7 +126,7 @@ am_libebl_m68k_pic_a_OBJECTS = $(m68k_SRCS:.c=.os)
 # an issue.
 m68k_corenote_no_Wpacked_not_aligned = yes
 
-bpf_SRCS = bpf_init.c bpf_regs.c
+bpf_SRCS = bpf_init.c bpf_regs.c bpf_symbol.c
 cpu_bpf = ../libcpu/libcpu_bpf.a
 libebl_bpf_pic_a_SOURCES = $(bpf_SRCS)
 am_libebl_bpf_pic_a_OBJECTS = $(bpf_SRCS:.c=.os)
diff --git a/backends/bpf_init.c b/backends/bpf_init.c
index 8ea1bc1a..a046e069 100644
--- a/backends/bpf_init.c
+++ b/backends/bpf_init.c
@@ -53,6 +53,7 @@ bpf_init (Elf *elf __attribute__ ((unused)),
   bpf_init_reloc (eh);
   HOOK (eh, register_info);
   HOOK (eh, disasm);
+  HOOK (eh, reloc_simple_type);
 
   return MODVERSION;
 }
diff --git a/backends/bpf_reloc.def b/backends/bpf_reloc.def
index a410da97..59f519b5 100644
--- a/backends/bpf_reloc.def
+++ b/backends/bpf_reloc.def
@@ -28,4 +28,5 @@
 /*	    NAME,		REL|EXEC|DYN	*/
 
 RELOC_TYPE (NONE,		EXEC|DYN)
-RELOC_TYPE (MAP_FD,		REL|EXEC|DYN)
+RELOC_TYPE (64_64,		REL)
+RELOC_TYPE (64_32,		REL)
diff --git a/backends/bpf_symbol.c b/backends/bpf_symbol.c
new file mode 100644
index 00000000..c9856f26
--- /dev/null
+++ b/backends/bpf_symbol.c
@@ -0,0 +1,54 @@
+/* BPF specific symbolic name handling.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <elf.h>
+#include <stddef.h>
+#include <string.h>
+
+#define BACKEND bpf_
+#include "libebl_CPU.h"
+
+
+/* Check for the simple reloc types.  */
+Elf_Type
+bpf_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
+{
+  switch (type)
+    {
+    case R_BPF_64_64:
+      return ELF_T_XWORD;
+    case R_BPF_64_32:
+      return ELF_T_WORD;
+    default:
+      return ELF_T_NUM;
+    }
+}
diff --git a/libelf/elf.h b/libelf/elf.h
index f7748983..940e88dd 100644
--- a/libelf/elf.h
+++ b/libelf/elf.h
@@ -3848,7 +3848,8 @@ enum
 /* BPF specific declarations.  */
 
 #define R_BPF_NONE		0	/* No reloc */
-#define R_BPF_MAP_FD		1	/* Map fd to pointer */
+#define R_BPF_64_64		1
+#define R_BPF_64_32		10
 
 /* Imagination Meta specific relocations. */
 
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 4abbd125..c4942860 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,12 @@
+2018-06-16  Yonghong Song  <yhs@fb.com>
+
+	* run-reloc-bpf.sh: New test.
+	* testfile-bpf-reloc.o.bz2: New test file.
+	* testfile-bpf-reloc.expect.bz2: New test file.
+	* Makefile.am (TESTS): Add run-reloc-bpf.sh.
+	(EXTRA_DIST): Add run-reloc-bpf.sh, testfile-bpf-reloc.o.bz2 and
+	testfile-bpf-reloc.expect.bz2.
+
 2018-06-13  Mark Wielaard  <mark@klomp.org>
 
 	* run-readelf-const-values.sh: New test.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2d63da6a..bdb82fc0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -146,7 +146,8 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
 	run-dwarf-die-addr-die.sh \
 	run-get-units-invalid.sh run-get-units-split.sh \
 	run-attr-integrate-skel.sh \
-	run-all-dwarf-ranges.sh run-unit-info.sh
+	run-all-dwarf-ranges.sh run-unit-info.sh \
+	run-reloc-bpf.sh
 
 if !BIARCH
 export ELFUTILS_DISABLE_BIARCH = 1
@@ -376,6 +377,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
 	     run-zstrptr.sh run-compress-test.sh \
 	     run-disasm-bpf.sh \
 	     testfile-bpf-dis1.expect.bz2 testfile-bpf-dis1.o.bz2 \
+	     run-reloc-bpf.sh \
+	     testfile-bpf-reloc.expect.bz2 testfile-bpf-reloc.o.bz2 \
 	     testfile-m68k-core.bz2 testfile-m68k.bz2 testfile-m68k-s.bz2 \
 	     run-dwarf-die-addr-die.sh \
 	     run-get-units-invalid.sh run-get-units-split.sh \
diff --git a/tests/run-reloc-bpf.sh b/tests/run-reloc-bpf.sh
new file mode 100755
index 00000000..feb75575
--- /dev/null
+++ b/tests/run-reloc-bpf.sh
@@ -0,0 +1,33 @@
+#! /bin/sh
+# Copyright (C) 2018 Facebook, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# This test file is created with
+# $ cat t.c
+# struct tt {
+#   int a;
+#   char b;
+# };
+# int test(struct tt *t) {
+#    return t->a;
+# }
+# $ clang -O2 -g -emit-llvm -c t.c -o - | llc -march=bpf -filetype=obj -o t.o
+# $ mv t.o testfile-bpf-reloc.o
+
+testfiles testfile-bpf-reloc.o testfile-bpf-reloc.expect
+testrun_compare ${abs_top_builddir}/src/objdump -r testfile-bpf-reloc.o < testfile-bpf-reloc.expect
diff --git a/tests/testfile-bpf-reloc.expect.bz2 b/tests/testfile-bpf-reloc.expect.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..0ff8cc4cce9180c8dc17c52d9dd417c04cf0628e
GIT binary patch
literal 300
zcmV+{0n`3MT4*^jL0KkKSz!M=9{>TbUw{FcKm&j9KPBHPzvtgzFabCe8kAu$L4h#?
zCIAxwl3{?*007Vc0000HQ2`oE$R>uEjTr`I02*mBrw_?KNzzFRv_=vU7`$+c(3A{9
z`U+SsK-!e1)YzD=qTM<q#~8pS(=Fa9j!ac$ctQbsA&^nZsi<9A`z0<G79=1c0|a$6
zOdQY<oymUW)oN}^1UIIX&X%RA5jCXA+MCj04T(y5B<X5nOH!1=mnEVU34tg`2wapU
zNm6f23BfR>Dc*Dbn#3v)%m@Yku;M~|@M6PmsAFl%fF)6kfC|!iOnE>EyUlcUG0+J5
yLir{49e`P$a#xI`NM<uila<1bQxuZdCFhWCyc*`LfD@&E;_gVN3K9$-=VRc>X?uA9

literal 0
HcmV?d00001

diff --git a/tests/testfile-bpf-reloc.o.bz2 b/tests/testfile-bpf-reloc.o.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..295634f909b2b58f6a3e3ffc729507cd7e7e1fce
GIT binary patch
literal 933
zcmV;W16uq-T4*^jL0KkKSx{G18vp~3|NsC0`~64x|NGNqa9h9s-}TWE0zg9G1ONy{
zP|!dC0Ej>X1C#=3X@;hn3VI2tsiXBHPe{?|*+~6S=``}2(vMJPpdORd$OF`905s9$
zOv-wgH8h0HG@5Ct<u;Q927#fV0MGyc0001J8UO=;000000000000000000>RMH5M&
zO#wYaJyGgt0j7-spa9XPfHY~K4F-)e83xp3)$MAuIh0=s+XxN}y=nw9<Ukk(MU-tZ
zp;J0$@$)mM?rL52{O)C<T+|G#aR6jCieeWtIU|se`xta_-=9g_SG%uv76d7zaS{`M
z2JiQKe-0?$vt#{4BTWF(7CJS#=BI3sz3A3oOYOP8OS3EeCL(r=jLOW7i?wG!U4#Wy
zf(>}*M9Yi~3{1N6kl8jIyEp{%<G&wIO7HTer+EgbNi0_}GlFoMARYz;l}jzUs#0+}
zgr_Akm37C=$fvD6H&}rnA`(IX5D-8b<N`b_B*g|nf=H7RTMY+o+rffMzR+*p(Sd@&
z25j&`Ex9x{g+mg|VnT}nWi+J4*VZ*hXH3ccX3!YUcAgfTYB`wZ^u{{YVnvszC#C;x
zcd4FM;uwup0%<^DC@YM_l+lB(Fk6;I(Z+@{WoFqXWM_Oea&{-?FsSWSf#$UY1X)eu
ziU@$(N#F7apkAh5Ifk@#C4F{Eqp<VcbAt?KXfl?Zppk|+G>jU;P@$sK`cVV?$m(<A
zNsesrj9Nimsbs(_?7bEg%~_jf0gt`E3W%)l>8WO9S%@hJA%IKQX^gf!U00GPqkm)a
zzA-GM9welkot--y1-+3Nf$F1f>`H`~aMyq@2qFXu8%Qt&focb+f3fmAa5B)qt~<17
z-0(iU2&9Th_&Q*Y)c8X<@h8KU(=g?@!c=wGt2YV768YAR({+mwFdAynRYb|beuf;H
z2K9U@53X_-lRznEu`RMf5;9}Z7_;+cr>~<}CJ`Wqme^{n6ddez3p@cZCaS1_A2zbs
z9$4`Z0H$~@+~+_CQVT{Y%r(&>#z+ej%ua4|f>{Oxa1gvLmoaVN6Kw04vsk_|FoM4p
z_QEJAuoZ)95vR)SSB#I-EMgJF)4o5XhEg9wq=i>7WhRQb7@BoMF1gA0L`ggvB;ZsK
zn97EI2naHvpxnSf2y&wU%#}`tV_9U)Y{e+#ptT#^1Z?_SXaTCyBq6O)yM$fI6yZWa
HL0wdAEl8b`

literal 0
HcmV?d00001

-- 
2.14.3



More information about the Elfutils-devel mailing list