@@ -8701,6 +8701,7 @@ static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_lin
87018701static int attach_raw_tp (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
87028702static int attach_trace (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
87038703static int attach_kprobe_multi (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
8704+ static int attach_uprobe_multi (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
87048705static int attach_lsm (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
87058706static int attach_iter (const struct bpf_program * prog , long cookie , struct bpf_link * * link );
87068707
@@ -8716,6 +8717,10 @@ static const struct bpf_sec_def section_defs[] = {
87168717 SEC_DEF ("uretprobe.s+" , KPROBE , 0 , SEC_SLEEPABLE , attach_uprobe ),
87178718 SEC_DEF ("kprobe.multi+" , KPROBE , BPF_TRACE_KPROBE_MULTI , SEC_NONE , attach_kprobe_multi ),
87188719 SEC_DEF ("kretprobe.multi+" , KPROBE , BPF_TRACE_KPROBE_MULTI , SEC_NONE , attach_kprobe_multi ),
8720+ SEC_DEF ("uprobe.multi+" , KPROBE , BPF_TRACE_UPROBE_MULTI , SEC_NONE , attach_uprobe_multi ),
8721+ SEC_DEF ("uretprobe.multi+" , KPROBE , BPF_TRACE_UPROBE_MULTI , SEC_NONE , attach_uprobe_multi ),
8722+ SEC_DEF ("uprobe.multi.s+" , KPROBE , BPF_TRACE_UPROBE_MULTI , SEC_SLEEPABLE , attach_uprobe_multi ),
8723+ SEC_DEF ("uretprobe.multi.s+" , KPROBE , BPF_TRACE_UPROBE_MULTI , SEC_SLEEPABLE , attach_uprobe_multi ),
87198724 SEC_DEF ("ksyscall+" , KPROBE , 0 , SEC_NONE , attach_ksyscall ),
87208725 SEC_DEF ("kretsyscall+" , KPROBE , 0 , SEC_NONE , attach_ksyscall ),
87218726 SEC_DEF ("usdt+" , KPROBE , 0 , SEC_NONE , attach_usdt ),
@@ -10922,6 +10927,37 @@ static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, stru
1092210927 return libbpf_get_error (* link );
1092310928}
1092410929
10930+ static int attach_uprobe_multi (const struct bpf_program * prog , long cookie , struct bpf_link * * link )
10931+ {
10932+ char * probe_type = NULL , * binary_path = NULL , * func_name = NULL ;
10933+ LIBBPF_OPTS (bpf_uprobe_multi_opts , opts );
10934+ int n , ret = - EINVAL ;
10935+
10936+ * link = NULL ;
10937+
10938+ n = sscanf (prog -> sec_name , "%m[^/]/%m[^:]:%ms" ,
10939+ & probe_type , & binary_path , & func_name );
10940+ switch (n ) {
10941+ case 1 :
10942+ /* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */
10943+ ret = 0 ;
10944+ break ;
10945+ case 3 :
10946+ opts .retprobe = strcmp (probe_type , "uretprobe.multi" ) == 0 ;
10947+ * link = bpf_program__attach_uprobe_multi (prog , -1 , binary_path , func_name , & opts );
10948+ ret = libbpf_get_error (* link );
10949+ break ;
10950+ default :
10951+ pr_warn ("prog '%s': invalid format of section definition '%s'\n" , prog -> name ,
10952+ prog -> sec_name );
10953+ break ;
10954+ }
10955+ free (probe_type );
10956+ free (binary_path );
10957+ free (func_name );
10958+ return ret ;
10959+ }
10960+
1092510961static void gen_uprobe_legacy_event_name (char * buf , size_t buf_sz ,
1092610962 const char * binary_path , uint64_t offset )
1092710963{
0 commit comments