All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yonghong Song <yhs@fb.com>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Andrii Nakryiko <andrii@kernel.org>, bpf <bpf@vger.kernel.org>,
	Networking <netdev@vger.kernel.org>,
	Alexei Starovoitov <ast@fb.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Kernel Team <kernel-team@fb.com>
Subject: Re: [PATCH v2 bpf-next 04/17] libbpf: mark BPF subprogs with hidden visibility as static for BPF verifier
Date: Thu, 22 Apr 2021 16:00:20 -0700	[thread overview]
Message-ID: <65869842-b1a0-5e95-9ca2-42aaf86644a8@fb.com> (raw)
In-Reply-To: <CAEf4BzYFHp8vt6rwgcZG5Lp-DQU0xrVq8QXvDqOyVOtx0gosnw@mail.gmail.com>



On 4/22/21 11:09 AM, Andrii Nakryiko wrote:
> On Wed, Apr 21, 2021 at 10:43 PM Yonghong Song <yhs@fb.com> wrote:
>>
>>
>>
>> On 4/16/21 1:23 PM, Andrii Nakryiko wrote:
>>> Define __hidden helper macro in bpf_helpers.h, which is a short-hand for
>>> __attribute__((visibility("hidden"))). Add libbpf support to mark BPF
>>> subprograms marked with __hidden as static in BTF information to enforce BPF
>>> verifier's static function validation algorithm, which takes more information
>>> (caller's context) into account during a subprogram validation.
>>>
>>> Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
>>> ---
>>>    tools/lib/bpf/bpf_helpers.h     |  8 ++++++
>>>    tools/lib/bpf/btf.c             |  5 ----
>>>    tools/lib/bpf/libbpf.c          | 45 ++++++++++++++++++++++++++++++++-
>>>    tools/lib/bpf/libbpf_internal.h |  6 +++++
>>>    4 files changed, 58 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/tools/lib/bpf/bpf_helpers.h b/tools/lib/bpf/bpf_helpers.h
>>> index 75c7581b304c..9720dc0b4605 100644
>>> --- a/tools/lib/bpf/bpf_helpers.h
>>> +++ b/tools/lib/bpf/bpf_helpers.h
>>> @@ -47,6 +47,14 @@
>>>    #define __weak __attribute__((weak))
>>>    #endif
>>>
>>> +/*
>>> + * Use __hidden attribute to mark a non-static BPF subprogram effectively
>>> + * static for BPF verifier's verification algorithm purposes, allowing more
>>> + * extensive and permissive BPF verification process, taking into account
>>> + * subprogram's caller context.
>>> + */
>>> +#define __hidden __attribute__((visibility("hidden")))
>>
>> To prevent potential external __hidden macro definition conflict, how
>> about
>>
>> #ifdef __hidden
>> #undef __hidden
>> #define __hidden __attribute__((visibility("hidden")))
>> #endif
>>
> 
> We do force #undef only with __always_inline because of the bad
> definition in linux/stddef.h And we check #ifndef for __weak, because
> __weak is defined in kernel headers. This is not really the case for
> __hidden, the only definition is in
> tools/lib/traceevent/event-parse-local.h, which I don't think we
> should worry about in BPF context. So I wanted to keep it simple and
> fix only if that really causes some real conflicts.
> 
> And keep in mind that in BPF code bpf_helpers.h is usually included as
> one of the first few headers anyways.

That is fine. Conflict of __hidden is a low risk and we can deal with it
later if needed.

> 
> 
>>> +
>>>    /* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include
>>>     * any system-level headers (such as stddef.h, linux/version.h, etc), and
>>>     * commonly-used macros like NULL and KERNEL_VERSION aren't available through
> 
> [...]
> 
>>> @@ -698,6 +700,15 @@ bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data,
>>>                if (err)
>>>                        return err;
>>>
>>> +             /* if function is a global/weak symbol, but has hidden
>>> +              * visibility (or any non-default one), mark its BTF FUNC as
>>> +              * static to enable more permissive BPF verification mode with
>>> +              * more outside context available to BPF verifier
>>> +              */
>>> +             if (GELF_ST_BIND(sym.st_info) != STB_LOCAL
>>> +                 && GELF_ST_VISIBILITY(sym.st_other) != STV_DEFAULT)
>>
>> Maybe we should check GELF_ST_VISIBILITY(sym.st_other) == STV_HIDDEN
>> instead?
> 
> It felt like only STV_DEFAULT should be "exported", semantically
> speaking. Everything else would be treated as if it was static, except
> that C rules require that function has to be global. Do you think
> there is some danger to do it this way?
> 
> Currently static linker doesn't do anything special for STV_INTERNAL
> and STV_PROTECTED, so we could just disable those. Do you prefer that?

Yes, let us just deal with STV_DEFAULT and STV_HIDDEN. We already
specialized STV_HIDDEN, so we should not treat STV_INTERNAL/PROTECTED
as what they mean in ELF standard, so let us disable them for now.

> 
> I just felt that there is no risk of regression if we do this for
> non-STV_DEFAULT generically.
> 
> 
>>
>>> +                     prog->mark_btf_static = true;
>>> +
>>>                nr_progs++;
>>>                obj->nr_programs = nr_progs;
>>>
> 
> [...]
> 

  reply	other threads:[~2021-04-22 23:00 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-16 20:23 [PATCH v2 bpf-next 00/17] BPF static linker: support externs Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 01/17] bpftool: support dumping BTF VAR's "extern" linkage Andrii Nakryiko
2021-04-22  3:02   ` Yonghong Song
2021-04-16 20:23 ` [PATCH v2 bpf-next 02/17] bpftool: dump more info about DATASEC members Andrii Nakryiko
2021-04-22  3:09   ` Yonghong Song
2021-04-16 20:23 ` [PATCH v2 bpf-next 03/17] libbpf: suppress compiler warning when using SEC() macro with externs Andrii Nakryiko
2021-04-22  3:47   ` Yonghong Song
2021-04-22  3:59     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 04/17] libbpf: mark BPF subprogs with hidden visibility as static for BPF verifier Andrii Nakryiko
2021-04-22  5:43   ` Yonghong Song
2021-04-22 18:09     ` Andrii Nakryiko
2021-04-22 23:00       ` Yonghong Song [this message]
2021-04-22 23:28         ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 05/17] libbpf: allow gaps in BPF program sections to support overriden weak functions Andrii Nakryiko
2021-04-22  6:25   ` Yonghong Song
2021-04-22 18:10     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 06/17] libbpf: refactor BTF map definition parsing Andrii Nakryiko
2021-04-22 15:33   ` Yonghong Song
2021-04-22 18:40     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 07/17] libbpf: factor out symtab and relos sanity checks Andrii Nakryiko
2021-04-22 16:06   ` Yonghong Song
2021-04-22 18:16     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 08/17] libbpf: make few internal helpers available outside of libbpf.c Andrii Nakryiko
2021-04-22 16:19   ` Yonghong Song
2021-04-22 18:18     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 09/17] libbpf: extend sanity checking ELF symbols with externs validation Andrii Nakryiko
2021-04-22 16:35   ` Yonghong Song
2021-04-22 18:20     ` Andrii Nakryiko
2021-04-22 23:13       ` Yonghong Song
2021-04-16 20:23 ` [PATCH v2 bpf-next 10/17] libbpf: tighten BTF type ID rewriting with error checking Andrii Nakryiko
2021-04-22 16:50   ` Yonghong Song
2021-04-22 18:24     ` Andrii Nakryiko
2021-04-23  2:54       ` Alexei Starovoitov
2021-04-23  4:25         ` Andrii Nakryiko
2021-04-23  5:11           ` Alexei Starovoitov
2021-04-23 16:09             ` Andrii Nakryiko
2021-04-23 16:18               ` Alexei Starovoitov
2021-04-23 16:30                 ` Andrii Nakryiko
2021-04-23 16:34                   ` Alexei Starovoitov
2021-04-23 17:02                     ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 11/17] libbpf: add linker extern resolution support for functions and global variables Andrii Nakryiko
2021-04-22 21:27   ` Yonghong Song
2021-04-22 22:12     ` Andrii Nakryiko
2021-04-22 23:57       ` Yonghong Song
2021-04-23  2:36         ` Yonghong Song
2021-04-23  4:28           ` Andrii Nakryiko
2021-04-23  4:27         ` Andrii Nakryiko
2021-04-16 20:23 ` [PATCH v2 bpf-next 12/17] libbpf: support extern resolution for BTF-defined maps in .maps section Andrii Nakryiko
2021-04-22 22:56   ` Yonghong Song
2021-04-22 23:32     ` Andrii Nakryiko
2021-04-16 20:24 ` [PATCH v2 bpf-next 13/17] selftests/bpf: use -O0 instead of -Og in selftests builds Andrii Nakryiko
2021-04-23  0:05   ` Yonghong Song
2021-04-16 20:24 ` [PATCH v2 bpf-next 14/17] selftests/bpf: omit skeleton generation for multi-linked BPF object files Andrii Nakryiko
2021-04-23  0:13   ` Yonghong Song
2021-04-16 20:24 ` [PATCH v2 bpf-next 15/17] selftests/bpf: add function linking selftest Andrii Nakryiko
2021-04-23  0:50   ` Yonghong Song
2021-04-23  2:34     ` Alexei Starovoitov
2021-04-23  4:29       ` Andrii Nakryiko
2021-04-23 17:18     ` Andrii Nakryiko
2021-04-23 17:35       ` Yonghong Song
2021-04-23 17:55         ` Andrii Nakryiko
2021-04-23 17:58           ` Yonghong Song
2021-04-23 17:59             ` Andrii Nakryiko
2021-04-16 20:24 ` [PATCH v2 bpf-next 16/17] selftests/bpf: add global variables " Andrii Nakryiko
2021-04-23  1:01   ` Yonghong Song
2021-04-16 20:24 ` [PATCH v2 bpf-next 17/17] sleftests/bpf: add map " Andrii Nakryiko
2021-04-23  1:20   ` Yonghong Song

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=65869842-b1a0-5e95-9ca2-42aaf86644a8@fb.com \
    --to=yhs@fb.com \
    --cc=andrii.nakryiko@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@fb.com \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kernel-team@fb.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.