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 <y...@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 <y...@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 <sch...@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 <y...@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 <m...@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