-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Currently weak typeless ksyms have default value zero, when they don't exist in the kernel. However, weak typed ksyms are rejected by libbpf if they can not be resolved. This means that if a bpf object contains the declaration of a nonexistent weak typed ksym, it will be rejected even if there is no program that references the symbol. Nonexistent weak typed ksyms can also default to zero just like typeless ones. This allows programs that access weak typed ksyms to be accepted by verifier, if the accesses are guarded. For example, extern const int bpf_link_fops3 __ksym __weak; /* then in BPF program */ if (&bpf_link_fops3) { /* use bpf_link_fops3 */ } If actual use of nonexistent typed ksym is not guarded properly, verifier would see that register is not PTR_TO_BTF_ID and wouldn't allow to use it for direct memory reads or passing it to BPF helpers. Signed-off-by: Hao Luo <haoluo@google.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210812003819.2439037-1-haoluo@google.com
- Loading branch information
Hao Luo
authored and
Andrii Nakryiko
committed
Aug 13, 2021
1 parent
cf7a5cb
commit 2211c82
Showing
3 changed files
with
96 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Test weak ksyms. | ||
* | ||
* Copyright (c) 2021 Google | ||
*/ | ||
|
||
#include "vmlinux.h" | ||
|
||
#include <bpf/bpf_helpers.h> | ||
|
||
int out__existing_typed = -1; | ||
__u64 out__existing_typeless = -1; | ||
|
||
__u64 out__non_existent_typeless = -1; | ||
__u64 out__non_existent_typed = -1; | ||
|
||
/* existing weak symbols */ | ||
|
||
/* test existing weak symbols can be resolved. */ | ||
extern const struct rq runqueues __ksym __weak; /* typed */ | ||
extern const void bpf_prog_active __ksym __weak; /* typeless */ | ||
|
||
|
||
/* non-existent weak symbols. */ | ||
|
||
/* typeless symbols, default to zero. */ | ||
extern const void bpf_link_fops1 __ksym __weak; | ||
|
||
/* typed symbols, default to zero. */ | ||
extern const int bpf_link_fops2 __ksym __weak; | ||
|
||
SEC("raw_tp/sys_enter") | ||
int pass_handler(const void *ctx) | ||
{ | ||
struct rq *rq; | ||
|
||
/* tests existing symbols. */ | ||
rq = (struct rq *)bpf_per_cpu_ptr(&runqueues, 0); | ||
if (rq) | ||
out__existing_typed = rq->cpu; | ||
out__existing_typeless = (__u64)&bpf_prog_active; | ||
|
||
/* tests non-existent symbols. */ | ||
out__non_existent_typeless = (__u64)&bpf_link_fops1; | ||
|
||
/* tests non-existent symbols. */ | ||
out__non_existent_typed = (__u64)&bpf_link_fops2; | ||
|
||
if (&bpf_link_fops2) /* can't happen */ | ||
out__non_existent_typed = (__u64)bpf_per_cpu_ptr(&bpf_link_fops2, 0); | ||
|
||
return 0; | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |