From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jesper Dangaard Brouer Subject: [bpf-next PATCH 5/5] tools/libbpf: handle issues with bpf ELF objects containing .eh_frames Date: Sat, 27 Jan 2018 18:27:22 +0100 Message-ID: <151707404245.12604.8486643930465492577.stgit@firesoul> References: <151707400217.12604.5522514180508858186.stgit@firesoul> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Cc: acme@redhat.com, joe@ovn.org, jakub.kicinski@netronome.com, eric@regit.org, Jesper Dangaard Brouer To: netdev@vger.kernel.org, Daniel Borkmann , Alexei Starovoitov , wangnan0@huawei.com Return-path: Received: from mx1.redhat.com ([209.132.183.28]:42106 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752685AbeA0R1X (ORCPT ); Sat, 27 Jan 2018 12:27:23 -0500 In-Reply-To: <151707400217.12604.5522514180508858186.stgit@firesoul> Sender: netdev-owner@vger.kernel.org List-ID: If clang >= 4.0.1 is missing the option '-target bpf', it will cause llc/llvm to create two ELF sections for "Exception Frames", with section names '.eh_frame' and '.rel.eh_frame'. The BPF ELF loader library libbpf fails when loading files with these sections. The other in-kernel BPF ELF loader in samples/bpf/bpf_load.c, handle this gracefully. And iproute2 loader also seems to work with these "eh" sections. The issue in libbpf is caused by bpf_object__elf_collect() skip the '.eh_frame' and thus doesn't create an internal data structure pointing to this ELF section index. Later when the relocation section '.rel.eh_frame' is processed, it tries to find the '.eh_frame' via the ELF section idx, which is that fails (in bpf_object__collect_reloc). I couldn't find a way to see that the '.rel.eh_frame' was irrelevant (that is only determined by looking at the section it reference, which we no longer have info available on). Thus, my solution is simply to match on the name of the relocation section, to skip that too. Signed-off-by: Jesper Dangaard Brouer --- 0 files changed diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index b4eeaa3ebff5..84e8bbe07347 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -822,6 +822,13 @@ static int bpf_object__elf_collect(struct bpf_object *obj) void *reloc = obj->efile.reloc; int nr_reloc = obj->efile.nr_reloc + 1; + /* Skip decoding of "eh" exception frames */ + if (strcmp(name, ".rel.eh_frame") == 0) { + pr_debug("skip relo section %s(%d) for section(%d)\n", + name, idx, sh.sh_info); + continue; + } + reloc = realloc(reloc, sizeof(*obj->efile.reloc) * nr_reloc); if (!reloc) {