If BPF code contains unused BPF subprogram and there are no other subprogram calls (which can realistically happen in real-world applications given sufficiently smart Clang code optimizations), libbpf will erroneously assume that subprograms are entry-point programs and will attempt to load them with UNSPEC program type. Fix by not relying on subcall instructions and rather detect it based on the structure of BPF object's sections. Fixes: 9a94f277c4fb ("tools: libbpf: restore the ability to load programs from .text section") Reported-by: Dmitrii Banshchikov <dbanschikov@fb.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20201107000251.256821-1-andrii@kernel.org
38 lines
1.0 KiB
C
38 lines
1.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2020 Facebook */
|
|
#include <test_progs.h>
|
|
#include <time.h>
|
|
#include "test_subprogs.skel.h"
|
|
#include "test_subprogs_unused.skel.h"
|
|
|
|
static int duration;
|
|
|
|
void test_subprogs(void)
|
|
{
|
|
struct test_subprogs *skel;
|
|
struct test_subprogs_unused *skel2;
|
|
int err;
|
|
|
|
skel = test_subprogs__open_and_load();
|
|
if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
|
|
return;
|
|
|
|
err = test_subprogs__attach(skel);
|
|
if (CHECK(err, "skel_attach", "failed to attach skeleton: %d\n", err))
|
|
goto cleanup;
|
|
|
|
usleep(1);
|
|
|
|
CHECK(skel->bss->res1 != 12, "res1", "got %d, exp %d\n", skel->bss->res1, 12);
|
|
CHECK(skel->bss->res2 != 17, "res2", "got %d, exp %d\n", skel->bss->res2, 17);
|
|
CHECK(skel->bss->res3 != 19, "res3", "got %d, exp %d\n", skel->bss->res3, 19);
|
|
CHECK(skel->bss->res4 != 36, "res4", "got %d, exp %d\n", skel->bss->res4, 36);
|
|
|
|
skel2 = test_subprogs_unused__open_and_load();
|
|
ASSERT_OK_PTR(skel2, "unused_progs_skel");
|
|
test_subprogs_unused__destroy(skel2);
|
|
|
|
cleanup:
|
|
test_subprogs__destroy(skel);
|
|
}
|