From 8c091e4ffdb0a482c0bcd77115e67260823b6c28 Mon Sep 17 00:00:00 2001 From: Andrey Ignatov Date: Tue, 2 Apr 2019 16:33:00 -0700 Subject: [PATCH 1/4] Enable version script for DSO building Version script was synced from kernel tree but not enabled in Makefile. Enable it same way it's done in kernel tree. % readelf -s --wide src/libbpf.so | grep -Eo '[^ ]+@LIBBPF_.*' | \ cut -d@ -f 3 | sort | uniq -c 121 LIBBPF_0.0.1 29 LIBBPF_0.0.2 Signed-off-by: Andrey Ignatov --- src/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index 64cde38..a37849f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -33,6 +33,7 @@ OBJS := $(addprefix $(OBJDIR)/,bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ LIBS := $(OBJDIR)/libbpf.a ifndef BUILD_STATIC_ONLY LIBS += $(OBJDIR)/libbpf.so + VERSION_SCRIPT := libbpf.map endif HEADERS := bpf.h libbpf.h btf.h @@ -62,7 +63,8 @@ $(OBJDIR)/libbpf.a: $(OBJS) $(AR) rcs $@ $^ $(OBJDIR)/libbpf.so: $(OBJS) - $(CC) -shared $(ALL_LDFLAGS) $^ -o $@ + $(CC) -shared $(ALL_LDFLAGS) -Wl,--version-script=$(VERSION_SCRIPT) \ + $^ -o $@ $(OBJDIR)/libbpf.pc: sed -e "s|@PREFIX@|$(PREFIX)|" \ From c3b329c387c329dc05396a58cbc3a8637fee97ba Mon Sep 17 00:00:00 2001 From: Andrey Ignatov Date: Tue, 2 Apr 2019 16:37:26 -0700 Subject: [PATCH 2/4] Add LIBBPF_VERSION LIBBPF_VERSION is already used to generate libbpf.pc file but was not actuall set. Set it same way it's done in kernel tree. Version is in sync with version script for DSO. Before: % grep Version src/libbpf.pc Version: After: % grep Version src/libbpf.pc Version: 0.0.2 Fixes: 93bc1d0 ("makefile: sync generate pkg-config file for libbpf") Signed-off-by: Andrey Ignatov --- src/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Makefile b/src/Makefile index a37849f..9bd670d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,11 @@ # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +VERSION = 0 +PATCHLEVEL = 0 +EXTRAVERSION = 2 + +LIBBPF_VERSION = $(VERSION).$(PATCHLEVEL).$(EXTRAVERSION) + TOPDIR = .. INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi From db1adc86580361e6acda632515756df0f0528e70 Mon Sep 17 00:00:00 2001 From: Andrey Ignatov Date: Tue, 2 Apr 2019 18:07:41 -0700 Subject: [PATCH 3/4] Add symlinks for DSO Add symlinks with version suffix in a way similar to how it's done in kernel tree. The differences with kernel tree version: * LIBS is used to handle both files and targets w/o separation; * Version symlink is created in corresponding target as opposed to do everything in libbpf.so.$(LIBBPF_VERSION). Example: % OBJDIR=build DESTDIR=root make install ... % find root/ ! -type d -exec ls -l {} + -rw-r--r--. 1 rdna users 6046 Apr 2 18:09 root/usr/include/bpf/bpf.h -rw-r--r--. 1 rdna users 3485 Apr 2 18:09 root/usr/include/bpf/btf.h -rw-r--r--. 1 rdna users 16454 Apr 2 18:09 root/usr/include/bpf/libbpf.h -rw-r--r--. 1 rdna users 602030 Apr 2 18:09 root/usr/lib64/libbpf.a lrwxrwxrwx. 1 rdna users 11 Apr 2 18:09 root/usr/lib64/libbpf.so -> libbpf.so.0 lrwxrwxrwx. 1 rdna users 15 Apr 2 18:09 root/usr/lib64/libbpf.so.0 -> libbpf.so.0.0.2 -rwxr-xr-x. 1 rdna users 377640 Apr 2 18:09 root/usr/lib64/libbpf.so.0.0.2 -rw-r--r--. 1 rdna users 241 Apr 2 18:09 root/usr/lib64/pkgconfig/libbpf.pc Signed-off-by: Andrey Ignatov --- src/Makefile | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Makefile b/src/Makefile index 9bd670d..1014ce3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -38,7 +38,9 @@ OBJS := $(addprefix $(OBJDIR)/,bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ LIBS := $(OBJDIR)/libbpf.a ifndef BUILD_STATIC_ONLY - LIBS += $(OBJDIR)/libbpf.so + LIBS += $(OBJDIR)/libbpf.so \ + $(OBJDIR)/libbpf.so.$(VERSION) \ + $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) VERSION_SCRIPT := libbpf.map endif @@ -68,7 +70,13 @@ all: $(LIBS) $(PC_FILE) $(OBJDIR)/libbpf.a: $(OBJS) $(AR) rcs $@ $^ -$(OBJDIR)/libbpf.so: $(OBJS) +$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(VERSION) + ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) + ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(OBJS) $(CC) -shared $(ALL_LDFLAGS) -Wl,--version-script=$(VERSION_SCRIPT) \ $^ -o $@ @@ -88,8 +96,16 @@ define do_install $(INSTALL) $1 $(if $3,-m $3,) '$(DESTDIR)$2' endef +# Preserve symlinks at installation. +define do_s_install + if [ ! -d '$(DESTDIR)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ + fi; \ + cp -fpR $1 '$(DESTDIR)$2' +endef + install: all install_headers install_pkgconfig - $(call do_install,$(LIBS),$(LIBDIR)) + $(call do_s_install,$(LIBS),$(LIBDIR)) install_headers: $(call do_install,$(HEADERS),$(INCLUDEDIR)/bpf,644) @@ -103,4 +119,4 @@ install_pkgconfig: $(PC_FILE) $(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644) clean: - rm -f *.o *.a *.so *.pc + rm -f *.o *.a *.so *.so.* *.pc From 23a177a0ced75cebac744d2a2d5edfce58089aa9 Mon Sep 17 00:00:00 2001 From: Andrey Ignatov Date: Tue, 2 Apr 2019 18:41:41 -0700 Subject: [PATCH 4/4] Add SONAME to DSO Adopting common practice that was adopted earlier in kernel tree. Resulting DSO: % readelf -d root/usr/lib64/libbpf.so | grep SONAME 0x000000000000000e (SONAME) Library soname: [libbpf.so.0] Signed-off-by: Andrey Ignatov --- src/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile b/src/Makefile index 1014ce3..35b4818 100644 --- a/src/Makefile +++ b/src/Makefile @@ -78,6 +78,7 @@ $(OBJDIR)/libbpf.so.$(VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(OBJS) $(CC) -shared $(ALL_LDFLAGS) -Wl,--version-script=$(VERSION_SCRIPT) \ + -Wl,-soname,libbpf.so.$(VERSION) \ $^ -o $@ $(OBJDIR)/libbpf.pc: