btf: Avoid weak external references

JIRA: https://issues.redhat.com/browse/RHEL-30773

commit fc5eb4a84e4c063e75a6a6e92308e9533c0f19b5
Author: Ard Biesheuvel <ardb@kernel.org>
Date:   Mon Apr 15 18:20:45 2024 +0200

    btf: Avoid weak external references
    
    If the BTF code is enabled in the build configuration, the start/stop
    BTF markers are guaranteed to exist. Only when CONFIG_DEBUG_INFO_BTF=n,
    the references in btf_parse_vmlinux() will remain unsatisfied, relying
    on the weak linkage of the external references to avoid breaking the
    build.
    
    Avoid GOT based relocations to these markers in the final executable by
    dropping the weak attribute and instead, make btf_parse_vmlinux() return
    ERR_PTR(-ENOENT) directly if CONFIG_DEBUG_INFO_BTF is not enabled to
    begin with.  The compiler will drop any subsequent references to
    __start_BTF and __stop_BTF in that case, allowing the link to succeed.
    
    Note that Clang will notice that taking the address of __start_BTF can
    no longer yield NULL, so testing for that condition becomes unnecessary.
    
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Andrii Nakryiko <andrii@kernel.org>
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/bpf/20240415162041.2491523-8-ardb+git@google.com

Signed-off-by: Viktor Malik <vmalik@redhat.com>
This commit is contained in:
Viktor Malik 2024-10-23 13:58:33 +02:00
parent 306e6f87be
commit 18e3a2d83a
No known key found for this signature in database
GPG Key ID: AF7A2E1F6EE74FB3
2 changed files with 8 additions and 5 deletions

View File

@ -5643,8 +5643,8 @@ errout_free:
return ERR_PTR(err);
}
extern char __weak __start_BTF[];
extern char __weak __stop_BTF[];
extern char __start_BTF[];
extern char __stop_BTF[];
extern struct btf *btf_vmlinux;
#define BPF_MAP_TYPE(_id, _ops)
@ -5972,6 +5972,9 @@ struct btf *btf_parse_vmlinux(void)
struct btf *btf = NULL;
int err;
if (!IS_ENABLED(CONFIG_DEBUG_INFO_BTF))
return ERR_PTR(-ENOENT);
env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
if (!env)
return ERR_PTR(-ENOMEM);

View File

@ -9,8 +9,8 @@
#include <linux/sysfs.h>
/* See scripts/link-vmlinux.sh, gen_btf() func for details */
extern char __weak __start_BTF[];
extern char __weak __stop_BTF[];
extern char __start_BTF[];
extern char __stop_BTF[];
static ssize_t
btf_vmlinux_read(struct file *file, struct kobject *kobj,
@ -32,7 +32,7 @@ static int __init btf_vmlinux_init(void)
{
bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF;
if (!__start_BTF || bin_attr_btf_vmlinux.size == 0)
if (bin_attr_btf_vmlinux.size == 0)
return 0;
btf_kobj = kobject_create_and_add("btf", kernel_kobj);