1*14f1aae1SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0 2*14f1aae1SAndrii Nakryiko /* Copyright (c) 2021 Facebook */ 3*14f1aae1SAndrii Nakryiko 4*14f1aae1SAndrii Nakryiko #include "vmlinux.h" 5*14f1aae1SAndrii Nakryiko #include <bpf/bpf_helpers.h> 6*14f1aae1SAndrii Nakryiko #include <bpf/bpf_tracing.h> 7*14f1aae1SAndrii Nakryiko 8*14f1aae1SAndrii Nakryiko extern int LINUX_KERNEL_VERSION __kconfig; 9*14f1aae1SAndrii Nakryiko /* this weak extern will be strict due to the other file's strong extern */ 10*14f1aae1SAndrii Nakryiko extern bool CONFIG_BPF_SYSCALL __kconfig __weak; 11*14f1aae1SAndrii Nakryiko extern const void bpf_link_fops __ksym __weak; 12*14f1aae1SAndrii Nakryiko 13*14f1aae1SAndrii Nakryiko int input_bss1; 14*14f1aae1SAndrii Nakryiko int input_data1 = 1; 15*14f1aae1SAndrii Nakryiko const volatile int input_rodata1 = 11; 16*14f1aae1SAndrii Nakryiko 17*14f1aae1SAndrii Nakryiko int input_bss_weak __weak; 18*14f1aae1SAndrii Nakryiko /* these two definitions should win */ 19*14f1aae1SAndrii Nakryiko int input_data_weak __weak = 10; 20*14f1aae1SAndrii Nakryiko const volatile int input_rodata_weak __weak = 100; 21*14f1aae1SAndrii Nakryiko 22*14f1aae1SAndrii Nakryiko extern int input_bss2; 23*14f1aae1SAndrii Nakryiko extern int input_data2; 24*14f1aae1SAndrii Nakryiko extern const int input_rodata2; 25*14f1aae1SAndrii Nakryiko 26*14f1aae1SAndrii Nakryiko int output_bss1; 27*14f1aae1SAndrii Nakryiko int output_data1; 28*14f1aae1SAndrii Nakryiko int output_rodata1; 29*14f1aae1SAndrii Nakryiko 30*14f1aae1SAndrii Nakryiko long output_sink1; 31*14f1aae1SAndrii Nakryiko get_bss_res(void)32*14f1aae1SAndrii Nakryikostatic __noinline int get_bss_res(void) 33*14f1aae1SAndrii Nakryiko { 34*14f1aae1SAndrii Nakryiko /* just make sure all the relocations work against .text as well */ 35*14f1aae1SAndrii Nakryiko return input_bss1 + input_bss2 + input_bss_weak; 36*14f1aae1SAndrii Nakryiko } 37*14f1aae1SAndrii Nakryiko 38*14f1aae1SAndrii Nakryiko SEC("raw_tp/sys_enter") BPF_PROG(handler1)39*14f1aae1SAndrii Nakryikoint BPF_PROG(handler1) 40*14f1aae1SAndrii Nakryiko { 41*14f1aae1SAndrii Nakryiko output_bss1 = get_bss_res(); 42*14f1aae1SAndrii Nakryiko output_data1 = input_data1 + input_data2 + input_data_weak; 43*14f1aae1SAndrii Nakryiko output_rodata1 = input_rodata1 + input_rodata2 + input_rodata_weak; 44*14f1aae1SAndrii Nakryiko 45*14f1aae1SAndrii Nakryiko /* make sure we actually use above special externs, otherwise compiler 46*14f1aae1SAndrii Nakryiko * will optimize them out 47*14f1aae1SAndrii Nakryiko */ 48*14f1aae1SAndrii Nakryiko output_sink1 = LINUX_KERNEL_VERSION 49*14f1aae1SAndrii Nakryiko + CONFIG_BPF_SYSCALL 50*14f1aae1SAndrii Nakryiko + (long)&bpf_link_fops; 51*14f1aae1SAndrii Nakryiko return 0; 52*14f1aae1SAndrii Nakryiko } 53*14f1aae1SAndrii Nakryiko 54*14f1aae1SAndrii Nakryiko char LICENSE[] SEC("license") = "GPL"; 55