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 /* when an extern is defined as both strong and weak, resulting symbol will be strong */ 10*14f1aae1SAndrii Nakryiko extern bool CONFIG_BPF_SYSCALL __kconfig; 11*14f1aae1SAndrii Nakryiko extern const void __start_BTF __ksym; 12*14f1aae1SAndrii Nakryiko 13*14f1aae1SAndrii Nakryiko int input_bss2; 14*14f1aae1SAndrii Nakryiko int input_data2 = 2; 15*14f1aae1SAndrii Nakryiko const volatile int input_rodata2 = 22; 16*14f1aae1SAndrii Nakryiko 17*14f1aae1SAndrii Nakryiko int input_bss_weak __weak; 18*14f1aae1SAndrii Nakryiko /* these two weak variables should lose */ 19*14f1aae1SAndrii Nakryiko int input_data_weak __weak = 20; 20*14f1aae1SAndrii Nakryiko const volatile int input_rodata_weak __weak = 200; 21*14f1aae1SAndrii Nakryiko 22*14f1aae1SAndrii Nakryiko extern int input_bss1; 23*14f1aae1SAndrii Nakryiko extern int input_data1; 24*14f1aae1SAndrii Nakryiko extern const int input_rodata1; 25*14f1aae1SAndrii Nakryiko 26*14f1aae1SAndrii Nakryiko int output_bss2; 27*14f1aae1SAndrii Nakryiko int output_data2; 28*14f1aae1SAndrii Nakryiko int output_rodata2; 29*14f1aae1SAndrii Nakryiko 30*14f1aae1SAndrii Nakryiko int output_sink2; 31*14f1aae1SAndrii Nakryiko get_data_res(void)32*14f1aae1SAndrii Nakryikostatic __noinline int get_data_res(void) 33*14f1aae1SAndrii Nakryiko { 34*14f1aae1SAndrii Nakryiko /* just make sure all the relocations work against .text as well */ 35*14f1aae1SAndrii Nakryiko return input_data1 + input_data2 + input_data_weak; 36*14f1aae1SAndrii Nakryiko } 37*14f1aae1SAndrii Nakryiko 38*14f1aae1SAndrii Nakryiko SEC("raw_tp/sys_enter") BPF_PROG(handler2)39*14f1aae1SAndrii Nakryikoint BPF_PROG(handler2) 40*14f1aae1SAndrii Nakryiko { 41*14f1aae1SAndrii Nakryiko output_bss2 = input_bss1 + input_bss2 + input_bss_weak; 42*14f1aae1SAndrii Nakryiko output_data2 = get_data_res(); 43*14f1aae1SAndrii Nakryiko output_rodata2 = 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_sink2 = LINUX_KERNEL_VERSION 49*14f1aae1SAndrii Nakryiko + CONFIG_BPF_SYSCALL 50*14f1aae1SAndrii Nakryiko + (long)&__start_BTF; 51*14f1aae1SAndrii Nakryiko 52*14f1aae1SAndrii Nakryiko return 0; 53*14f1aae1SAndrii Nakryiko } 54*14f1aae1SAndrii Nakryiko 55*14f1aae1SAndrii Nakryiko char LICENSE[] SEC("license") = "GPL"; 56