Add tests for libbpf relocation of static variable references into the .data, .rodata and .bss sections of the ELF, also add read-only test for .rodata. All passing: # ./test_progs [...] test_global_data:PASS:load program 0 nsec test_global_data:PASS:pass global data run 925 nsec test_global_data_number:PASS:relocate .bss reference 925 nsec test_global_data_number:PASS:relocate .data reference 925 nsec test_global_data_number:PASS:relocate .rodata reference 925 nsec test_global_data_number:PASS:relocate .bss reference 925 nsec test_global_data_number:PASS:relocate .data reference 925 nsec test_global_data_number:PASS:relocate .rodata reference 925 nsec test_global_data_number:PASS:relocate .bss reference 925 nsec test_global_data_number:PASS:relocate .bss reference 925 nsec test_global_data_number:PASS:relocate .rodata reference 925 nsec test_global_data_number:PASS:relocate .rodata reference 925 nsec test_global_data_number:PASS:relocate .rodata reference 925 nsec test_global_data_string:PASS:relocate .rodata reference 925 nsec test_global_data_string:PASS:relocate .data reference 925 nsec test_global_data_string:PASS:relocate .bss reference 925 nsec test_global_data_string:PASS:relocate .data reference 925 nsec test_global_data_string:PASS:relocate .bss reference 925 nsec test_global_data_struct:PASS:relocate .rodata reference 925 nsec test_global_data_struct:PASS:relocate .bss reference 925 nsec test_global_data_struct:PASS:relocate .rodata reference 925 nsec test_global_data_struct:PASS:relocate .data reference 925 nsec test_global_data_rdonly:PASS:test .rodata read-only map 925 nsec [...] Summary: 229 PASSED, 0 FAILED Note map helper signatures have been changed to avoid warnings when passing in const data. Joint work with Daniel Borkmann. Signed-off-by: Joe Stringer <joe@wand.net.nz> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
107 lines
2.4 KiB
C
107 lines
2.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
// Copyright (c) 2019 Isovalent, Inc.
|
|
|
|
#include <linux/bpf.h>
|
|
#include <linux/pkt_cls.h>
|
|
#include <string.h>
|
|
|
|
#include "bpf_helpers.h"
|
|
|
|
struct bpf_map_def SEC("maps") result_number = {
|
|
.type = BPF_MAP_TYPE_ARRAY,
|
|
.key_size = sizeof(__u32),
|
|
.value_size = sizeof(__u64),
|
|
.max_entries = 11,
|
|
};
|
|
|
|
struct bpf_map_def SEC("maps") result_string = {
|
|
.type = BPF_MAP_TYPE_ARRAY,
|
|
.key_size = sizeof(__u32),
|
|
.value_size = 32,
|
|
.max_entries = 5,
|
|
};
|
|
|
|
struct foo {
|
|
__u8 a;
|
|
__u32 b;
|
|
__u64 c;
|
|
};
|
|
|
|
struct bpf_map_def SEC("maps") result_struct = {
|
|
.type = BPF_MAP_TYPE_ARRAY,
|
|
.key_size = sizeof(__u32),
|
|
.value_size = sizeof(struct foo),
|
|
.max_entries = 5,
|
|
};
|
|
|
|
/* Relocation tests for __u64s. */
|
|
static __u64 num0;
|
|
static __u64 num1 = 42;
|
|
static const __u64 num2 = 24;
|
|
static __u64 num3 = 0;
|
|
static __u64 num4 = 0xffeeff;
|
|
static const __u64 num5 = 0xabab;
|
|
static const __u64 num6 = 0xab;
|
|
|
|
/* Relocation tests for strings. */
|
|
static const char str0[32] = "abcdefghijklmnopqrstuvwxyz";
|
|
static char str1[32] = "abcdefghijklmnopqrstuvwxyz";
|
|
static char str2[32];
|
|
|
|
/* Relocation tests for structs. */
|
|
static const struct foo struct0 = {
|
|
.a = 42,
|
|
.b = 0xfefeefef,
|
|
.c = 0x1111111111111111ULL,
|
|
};
|
|
static struct foo struct1;
|
|
static const struct foo struct2;
|
|
static struct foo struct3 = {
|
|
.a = 41,
|
|
.b = 0xeeeeefef,
|
|
.c = 0x2111111111111111ULL,
|
|
};
|
|
|
|
#define test_reloc(map, num, var) \
|
|
do { \
|
|
__u32 key = num; \
|
|
bpf_map_update_elem(&result_##map, &key, var, 0); \
|
|
} while (0)
|
|
|
|
SEC("static_data_load")
|
|
int load_static_data(struct __sk_buff *skb)
|
|
{
|
|
static const __u64 bar = ~0;
|
|
|
|
test_reloc(number, 0, &num0);
|
|
test_reloc(number, 1, &num1);
|
|
test_reloc(number, 2, &num2);
|
|
test_reloc(number, 3, &num3);
|
|
test_reloc(number, 4, &num4);
|
|
test_reloc(number, 5, &num5);
|
|
num4 = 1234;
|
|
test_reloc(number, 6, &num4);
|
|
test_reloc(number, 7, &num0);
|
|
test_reloc(number, 8, &num6);
|
|
|
|
test_reloc(string, 0, str0);
|
|
test_reloc(string, 1, str1);
|
|
test_reloc(string, 2, str2);
|
|
str1[5] = 'x';
|
|
test_reloc(string, 3, str1);
|
|
__builtin_memcpy(&str2[2], "hello", sizeof("hello"));
|
|
test_reloc(string, 4, str2);
|
|
|
|
test_reloc(struct, 0, &struct0);
|
|
test_reloc(struct, 1, &struct1);
|
|
test_reloc(struct, 2, &struct2);
|
|
test_reloc(struct, 3, &struct3);
|
|
|
|
test_reloc(number, 9, &struct0.c);
|
|
test_reloc(number, 10, &bar);
|
|
|
|
return TC_ACT_OK;
|
|
}
|
|
|
|
char _license[] SEC("license") = "GPL";
|