From c1990d36cfe37a30bcc49422c37a6767fd190559 Mon Sep 17 00:00:00 2001 From: Yonghong Song Date: Sat, 16 Jun 2018 13:02:43 -0700 Subject: [PATCH] backends,bpf: add proper relocation support 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 --- backends/ChangeLog | 7 +++++ backends/Makefile.am | 2 +- backends/bpf_init.c | 1 + backends/bpf_reloc.def | 2 ++ backends/bpf_symbol.c | 54 ++++++++++++++++++++++++++++++++++++ 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 10 files changed, 111 insertions(+), 2 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 diff --git a/backends/ChangeLog b/backends/ChangeLog index e97e33d..3fa0f19 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,10 @@ +2018-06-16 Yonghong Song + + * 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-06-21 Mark Wielaard * bpf_reloc.def: Remove MAP_FD. diff --git a/backends/Makefile.am b/backends/Makefile.am index 0c14ec8..e42d674 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 8ea1bc1..a046e06 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 09ac3a6..59f519b 100644 --- a/backends/bpf_reloc.def +++ b/backends/bpf_reloc.def @@ -28,3 +28,5 @@ /* NAME, REL|EXEC|DYN */ RELOC_TYPE (NONE, 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 0000000..c9856f2 --- /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 . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#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/tests/ChangeLog b/tests/ChangeLog index 4abbd12..c494286 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,12 @@ +2018-06-16 Yonghong Song + + * 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 * run-readelf-const-values.sh: New test. diff --git a/tests/Makefile.am b/tests/Makefile.am index 2d63da6..bdb82fc 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 0000000..feb7557 --- /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 . + +. $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=qTMDc*Dbn#3v)%m@Yku;M~|@M6PmsAFl%fF)6kfC|!iOnE>EyUlcUG0+J5 yLir{49e`P$a#xI`NMX?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@5CtRMH5M& zO#wYaJyGgt0j7-spa9XPfHY~K4F-)e83xp3)$MAuIh0=s+XxN}y=nw9}*M9Yi~3{1N6kl8jIyEp{%jU;P@$sK`cVV?$m(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.7.4