lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c9367c9d-527c-ba50-bb28-59abad9f5009@fb.com>
Date:   Wed, 21 Apr 2021 20:47:57 -0700
From:   Yonghong Song <yhs@...com>
To:     Andrii Nakryiko <andrii@...nel.org>, <bpf@...r.kernel.org>,
        <netdev@...r.kernel.org>, <ast@...com>, <daniel@...earbox.net>
CC:     <kernel-team@...com>
Subject: Re: [PATCH v2 bpf-next 03/17] libbpf: suppress compiler warning when
 using SEC() macro with externs



On 4/16/21 1:23 PM, Andrii Nakryiko wrote:
> When used on externs SEC() macro will trigger compilation warning about
> inapplicable `__attribute__((used))`. That's expected for extern declarations,
> so suppress it with the corresponding _Pragma.
> 
> Signed-off-by: Andrii Nakryiko <andrii@...nel.org>

Ack with some comments below.
Acked-by: Yonghong Song <yhs@...com>

> ---
>   tools/lib/bpf/bpf_helpers.h | 11 +++++++++--
>   1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/lib/bpf/bpf_helpers.h b/tools/lib/bpf/bpf_helpers.h
> index b904128626c2..75c7581b304c 100644
> --- a/tools/lib/bpf/bpf_helpers.h
> +++ b/tools/lib/bpf/bpf_helpers.h
> @@ -25,9 +25,16 @@
>   /*
>    * Helper macro to place programs, maps, license in
>    * different sections in elf_bpf file. Section names
> - * are interpreted by elf_bpf loader
> + * are interpreted by libbpf depending on the context (BPF programs, BPF maps,
> + * extern variables, etc).
> + * To allow use of SEC() with externs (e.g., for extern .maps declarations),
> + * make sure __attribute__((unused)) doesn't trigger compilation warning.
>    */
> -#define SEC(NAME) __attribute__((section(NAME), used))
> +#define SEC(name) \
> +	_Pragma("GCC diagnostic push")					    \
> +	_Pragma("GCC diagnostic ignored \"-Wignored-attributes\"")	    \
> +	__attribute__((section(name), used))				    \
> +	_Pragma("GCC diagnostic pop")					    \

The 'used' attribute is mostly useful for static variable/functions
since otherwise if not really used, the compiler could delete them
freely. The 'used' attribute does not really have an impact on
global variables regardless whether they are used or not in a particular
compilation unit. We could drop 'used' here and selftests should still
work. The only worry is that if people define something like
    static int _version SEC("version") = 1;
    static char _license[] SEC("license") = "GPL";
Removing 'used' may cause failure.

Since we don't want to remove 'used', then adding _Pragma to silence
the warning is a right thing to do here.

>   
>   /* Avoid 'linux/stddef.h' definition of '__always_inline'. */
>   #undef __always_inline
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ