Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools build: Add capability-related feature detection

Add utilities to help checking capabilities of the running procss. Make
perf link with libcap, if it is available. If no libcap-dev[el], assume
no capabilities.

Committer testing:

$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/home/acme/git/perf/tools/perf'
BUILD: Doing 'make -j8' parallel build

Auto-detecting system features:
<SNIP>
... libbfd: [ on ]
... libcap: [ OFF ]
... libelf: [ on ]
<SNIP>
Makefile.config:833: No libcap found, disables capability support, please install libcap-devel/libcap-dev
<SNIP>
$ grep libcap /tmp/build/perf/FEATURE-DUMP
feature-libcap=0
$ cat /tmp/build/perf/feature/test-libcap.make.output
test-libcap.c:2:10: fatal error: sys/capability.h: No such file or directory
2 | #include <sys/capability.h>
| ^~~~~~~~~~~~~~~~~~
compilation terminated.
$

Now install libcap-devel and try again:

$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/home/acme/git/perf/tools/perf'
BUILD: Doing 'make -j8' parallel build
Warning: Kernel ABI header at 'tools/include/linux/bits.h' differs from latest version at 'include/linux/bits.h'
diff -u tools/include/linux/bits.h include/linux/bits.h
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/cpufeatures.h' differs from latest version at 'arch/x86/include/asm/cpufeatures.h'
diff -u tools/arch/x86/include/asm/cpufeatures.h arch/x86/include/asm/cpufeatures.h

Auto-detecting system features:
<SNIP>
... libbfd: [ on ]
... libcap: [ on ]
... libelf: [ on ]
<SNIP>>
CC /tmp/build/perf/jvmti/libjvmti.o
<SNIP>>
$ grep libcap /tmp/build/perf/FEATURE-DUMP
feature-libcap=1
$ cat /tmp/build/perf/feature/test-libcap.make.output
$ ldd /tmp/build/perf/feature/test-libcap.make.bin
ldd: /tmp/build/perf/feature/test-libcap.make.bin: No such file or directory
$ ldd /tmp/build/perf/feature/test-libcap.bin
linux-vdso.so.1 (0x00007ffc35bfe000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007ff9c62ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff9c6139000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff9c6326000)
$

Signed-off-by: Igor Lubashev <ilubashe@akamai.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: James Morris <jmorris@namei.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
[ split from a larger patch ]
Link: http://lkml.kernel.org/r/8a1e76cf5c7c9796d0d4d240fbaa85305298aafa.1565188228.git.ilubashe@akamai.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Igor Lubashev and committed by
Arnaldo Carvalho de Melo
74d5f3d0 40d81772

+39
+2
tools/build/Makefile.feature
··· 42 42 gtk2-infobar \ 43 43 libaudit \ 44 44 libbfd \ 45 + libcap \ 45 46 libelf \ 46 47 libelf-getphdrnum \ 47 48 libelf-gelf_getnote \ ··· 111 110 gtk2 \ 112 111 libaudit \ 113 112 libbfd \ 113 + libcap \ 114 114 libelf \ 115 115 libnuma \ 116 116 numa_num_possible_cpus \
+4
tools/build/feature/Makefile
··· 20 20 test-libbfd-liberty.bin \ 21 21 test-libbfd-liberty-z.bin \ 22 22 test-cplus-demangle.bin \ 23 + test-libcap.bin \ 23 24 test-libelf.bin \ 24 25 test-libelf-getphdrnum.bin \ 25 26 test-libelf-gelf_getnote.bin \ ··· 105 104 106 105 $(OUTPUT)test-bionic.bin: 107 106 $(BUILD) 107 + 108 + $(OUTPUT)test-libcap.bin: 109 + $(BUILD) -lcap 108 110 109 111 $(OUTPUT)test-libelf.bin: 110 112 $(BUILD) -lelf
+20
tools/build/feature/test-libcap.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include <sys/capability.h> 3 + #include <linux/capability.h> 4 + 5 + int main(void) 6 + { 7 + cap_flag_value_t val; 8 + cap_t caps = cap_get_proc(); 9 + 10 + if (!caps) 11 + return 1; 12 + 13 + if (cap_get_flag(caps, CAP_SYS_ADMIN, CAP_EFFECTIVE, &val) != 0) 14 + return 1; 15 + 16 + if (cap_free(caps) != 0) 17 + return 1; 18 + 19 + return 0; 20 + }
+11
tools/perf/Makefile.config
··· 824 824 endif 825 825 endif 826 826 827 + ifndef NO_LIBCAP 828 + ifeq ($(feature-libcap), 1) 829 + CFLAGS += -DHAVE_LIBCAP_SUPPORT 830 + EXTLIBS += -lcap 831 + $(call detected,CONFIG_LIBCAP) 832 + else 833 + msg := $(warning No libcap found, disables capability support, please install libcap-devel/libcap-dev); 834 + NO_LIBCAP := 1 835 + endif 836 + endif 837 + 827 838 ifndef NO_BACKTRACE 828 839 ifeq ($(feature-backtrace), 1) 829 840 CFLAGS += -DHAVE_BACKTRACE_SUPPORT
+2
tools/perf/Makefile.perf
··· 88 88 # 89 89 # Define NO_LIBBPF if you do not want BPF support 90 90 # 91 + # Define NO_LIBCAP if you do not want process capabilities considered by perf 92 + # 91 93 # Define NO_SDT if you do not want to define SDT event in perf tools, 92 94 # note that it doesn't disable SDT scanning support. 93 95 #