mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 14:02:06 -04:00
selftests/bpf: Ignore .llvm.<hash> suffix in kallsyms_find()
I hit the following failure when running selftests with internal backported upstream kernel: test_ksyms:PASS:kallsyms_fopen 0 nsec test_ksyms:FAIL:ksym_find symbol 'bpf_link_fops' not found #123 ksyms:FAIL In /proc/kallsyms, we have $ cat /proc/kallsyms | grep bpf_link_fops ffffffff829f0cb0 d bpf_link_fops.llvm.12608678492448798416 The CONFIG_LTO_CLANG_THIN is enabled in the kernel which is responsible for bpf_link_fops.llvm.12608678492448798416 symbol name. In prog_tests/ksyms.c we have kallsyms_find("bpf_link_fops", &link_fops_addr) and kallsyms_find() compares "bpf_link_fops" with symbols in /proc/kallsyms in order to find the entry. With bpf_link_fops.llvm.<hash> in /proc/kallsyms, the kallsyms_find() failed. To fix the issue, in kallsyms_find(), if a symbol has suffix .llvm.<hash>, that suffix will be ignored for comparison. This fixed the test failure. Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20240604180034.1356016-1-yonghong.song@linux.dev
This commit is contained in:
committed by
Andrii Nakryiko
parent
61ce0ea759
commit
898ac74c5b
@@ -211,7 +211,7 @@ long ksym_get_addr(const char *name)
|
||||
*/
|
||||
int kallsyms_find(const char *sym, unsigned long long *addr)
|
||||
{
|
||||
char type, name[500];
|
||||
char type, name[500], *match;
|
||||
unsigned long long value;
|
||||
int err = 0;
|
||||
FILE *f;
|
||||
@@ -221,6 +221,17 @@ int kallsyms_find(const char *sym, unsigned long long *addr)
|
||||
return -EINVAL;
|
||||
|
||||
while (fscanf(f, "%llx %c %499s%*[^\n]\n", &value, &type, name) > 0) {
|
||||
/* If CONFIG_LTO_CLANG_THIN is enabled, static variable/function
|
||||
* symbols could be promoted to global due to cross-file inlining.
|
||||
* For such cases, clang compiler will add .llvm.<hash> suffix
|
||||
* to those symbols to avoid potential naming conflict.
|
||||
* Let us ignore .llvm.<hash> suffix during symbol comparison.
|
||||
*/
|
||||
if (type == 'd') {
|
||||
match = strstr(name, ".llvm.");
|
||||
if (match)
|
||||
*match = '\0';
|
||||
}
|
||||
if (strcmp(name, sym) == 0) {
|
||||
*addr = value;
|
||||
goto out;
|
||||
|
||||
Reference in New Issue
Block a user