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

2018-06-16 Thread Mark Wielaard
Hi,

I added Richard to the CC, who added the original BPF support.
Who might remember where the R_BPF_MAP_FD comes from (see at the end).

On Fri, 2018-06-15 at 15:40 -0700, Yonghong Song wrote:
> 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".

Yes. elfutils/libdwfl only does "simple relocations", but that is all
you need anyway.

Do you have a test file (binary for something simple/trivial generated
by llc -march=bpf that contains at least one reloc). I looked at your
implementation and I am sure it works correctly. But having a small
testfile is always a plus.

> 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.
>
> Tested locally with building pahole with this patch and
> pahole is able to display structures in bpf object file properly.

Patch looks good. Thanks. I'll add a ChangeLog entry because that is
what we still do.

> Signed-off-by: Yonghong Song 
> ---
>  backends/Makefile.am   |  2 +-
>  backends/bpf_init.c|  1 +
>  backends/bpf_reloc.def |  3 ++-
>  backends/bpf_symbol.c  | 54
> ++
>  libelf/elf.h   |  3 ++-
>  5 files changed, 60 insertions(+), 3 deletions(-)
>  create mode 100644 backends/bpf_symbol.c
> [...]
> 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

We should sync this with glibc. This file really is a copy of elf/elf.h
in glibc, which we periodically sync. It would be good if all projects
agree on the constants.

I would like to understand where the R_BPF_MAP_FD comes from. But I
assume it was a typo for BPF_PSEUDO_MAP_FD from bpf.h (which has the
same constant number 1).

I'll sent a patch to libc-al...@sourceware.org unless you beat me to
it.

Thanks,

Mark


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

2018-06-16 Thread Yonghong Song
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  |   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  
+
+   * 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  
 
* 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 ..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 .  */
+
+#ifdef HAVE_CON

Re: [PATCH] libdw: Make __libdw_dieabbrev more robust on failure.

2018-06-16 Thread Mark Wielaard
On Thu, 2018-06-14 at 00:42 +0200, Mark Wielaard wrote:
> Make sure to always set die->abbrev to DWARF_END_ABBREV on failure.
> DWARF_END_ABBREV is also what the function reports on failure. And it
> will prevent trying to lookup the abbrev ever again.

Pushed to master.


Re: [PATCH] readelf: Make sure print_form_data always consumes DW_FORM_strx[1234] data.

2018-06-16 Thread Mark Wielaard
On Thu, 2018-06-14 at 01:10 +0200, Mark Wielaard wrote:
> Found by afl-fuzz. When printing DW_FORM_strx[1234] data eu-readelf didn't
> increase readp which meant eu-readelf would keep printing the same line
> dirs or files encoded with strx[1234] names. This meant that for insane
> large dir or file counts eu-readelf would just keep printing endlessly
> because we never reached and of the .debug_line buffer.

Pushed to master.


Re: [PATCH] readelf: Check there are at least 4 bytes available for DWARF_FORM_block4.

2018-06-16 Thread Mark Wielaard
On Thu, 2018-06-14 at 01:24 +0200, Mark Wielaard wrote:
> Found by afl-fuzz. When printing a DWARF_FORM_block4 we checked there
> were only 2 bytes available (copy/paste from DW_FORM_block2 right
> before). Obviously we need at least 4 bytes to read the length of a
> DW_FORM_block4.

Pushed to master.