On Fri, 25 Mar 2022, Andrii Nakryiko wrote: > Extend urandom_read helper binary to include USDTs of 4 combinations: > semaphore/semaphoreless (refcounted and non-refcounted) and based in > executable or shared library. We also extend urandom_read with ability > to report it's own PID to parent process and wait for parent process to > ready itself up for tracing urandom_read. We utilize popen() and > underlying pipe properties for proper signaling. > > Once urandom_read is ready, we add few tests to validate that libbpf's > USDT attachment handles all the above combinations of semaphore (or lack > of it) and static or shared library USDTs. Also, we validate that libbpf > handles shared libraries both with PID filter and without one (i.e., -1 > for PID argument). > > Having the shared library case tested with and without PID is important > because internal logic differs on kernels that don't support BPF > cookies. On such older kernels, attaching to USDTs in shared libraries > without specifying concrete PID doesn't work in principle, because it's > impossible to determine shared library's load address to derive absolute > IPs for uprobe attachments. Without absolute IPs, it's impossible to > perform correct look up of USDT spec based on uprobe's absolute IP (the > only kind available from BPF at runtime). This is not the problem on > newer kernels with BPF cookie as we don't need IP-to-ID lookup because > BPF cookie value *is* spec ID. > > So having those two situations as separate subtests is good because > libbpf CI is able to test latest selftests against old kernels (e.g., > 4.9 and 5.5), so we'll be able to disable PID-less shared lib attachment > for old kernels, but will still leave PID-specific one enabled to validate > this legacy logic is working correctly. > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> haven't looked at this in depth yet, but hit a compilation error on aarch64: LIB liburandom_read.so /usr/bin/ld: /tmp/ccNy8cuv.o: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `urandlib_read_with_sema_semaphore' which may bind externally can not be used when making a shared object; recompile with -fPIC /tmp/ccNy8cuv.o: In function `urandlib_read_with_sema': /home/opc/src/bpf-next/tools/testing/selftests/bpf/urandom_read_lib1.c:12:(.text+0x10): dangerous relocation: unsupported relocation collect2: error: ld returned 1 exit status make: *** [Makefile:173: /home/opc/src/bpf-next/tools/testing/selftests/bpf/liburandom_read.so] Error 1 following did fix it: diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 58da22c019a8..c89e2948276b 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -170,7 +170,7 @@ $(OUTPUT)/%:%.c $(OUTPUT)/liburandom_read.so: urandom_read_lib1.c urandom_read_lib2.c $(call msg,LIB,,$@) - $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) --shared -o $@ + $(Q)$(CC) $(CFLAGS) -fPIC $(LDFLAGS) $^ $(LDLIBS) --shared -o $@ $(OUTPUT)/urandom_read: urandom_read.c urandom_read_aux.c $(OUTPUT)/liburandom_read.so $(call msg,BINARY,,$@)