makefile: support libbpf symbol versioning in shared library mode

Similarly to Linux's 1bd63524593b ("libbpf: handle symbol versioning properly
for libbpf.a"), add necessary changes to build static and shared object
files separately with extra shared library flags. This allows to
properly handle symbol versioning in shared library mode, while still
having statically linkable library.

Cc: Yonghong Song <yhs@fb.com>
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
This commit is contained in:
Andrii Nakryiko
2019-09-30 20:41:39 -07:00
committed by Andrii Nakryiko
parent 886e8149a0
commit 8b2782a1f2
2 changed files with 29 additions and 17 deletions

2
src/.gitignore vendored
View File

@@ -2,3 +2,5 @@
*.a *.a
/libbpf.pc /libbpf.pc
/libbpf.so* /libbpf.so*
/staticobjs
/sharedobjs

View File

@@ -15,9 +15,7 @@ ifneq ($(FEATURE_REALLOCARRAY),)
ALL_CFLAGS += -DCOMPAT_NEED_REALLOCARRAY ALL_CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
endif endif
ifndef BUILD_STATIC_ONLY SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED
ALL_CFLAGS += -fPIC -fvisibility=hidden
endif
CFLAGS ?= -g -O2 -Werror -Wall CFLAGS ?= -g -O2 -Werror -Wall
ALL_CFLAGS += $(CFLAGS) ALL_CFLAGS += $(CFLAGS)
@@ -31,22 +29,25 @@ else
endif endif
OBJDIR ?= . OBJDIR ?= .
SHARED_OBJDIR := $(OBJDIR)/sharedobjs
OBJS := $(addprefix $(OBJDIR)/,bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ STATIC_OBJDIR := $(OBJDIR)/staticobjs
OBJS := bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \
nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o xsk.o \ nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o xsk.o \
btf_dump.o hashmap.o) btf_dump.o hashmap.o
SHARED_OBJS := $(addprefix $(SHARED_OBJDIR)/,$(OBJS))
STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS))
LIBS := $(OBJDIR)/libbpf.a STATIC_LIBS := $(OBJDIR)/libbpf.a
ifndef BUILD_STATIC_ONLY ifndef BUILD_STATIC_ONLY
LIBS += $(OBJDIR)/libbpf.so \ SHARED_LIBS := $(OBJDIR)/libbpf.so \
$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \ $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \
$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
VERSION_SCRIPT := libbpf.map VERSION_SCRIPT := libbpf.map
endif endif
HEADERS := bpf.h libbpf.h btf.h xsk.h libbpf_util.h HEADERS := bpf.h libbpf.h btf.h xsk.h libbpf_util.h
UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,bpf.h bpf_common.h \ UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,\
btf.h) bpf.h bpf_common.h btf.h)
PC_FILE := $(OBJDIR)/libbpf.pc PC_FILE := $(OBJDIR)/libbpf.pc
@@ -65,9 +66,9 @@ LIBDIR ?= $(PREFIX)/$(LIBSUBDIR)
INCLUDEDIR ?= $(PREFIX)/include INCLUDEDIR ?= $(PREFIX)/include
UAPIDIR ?= $(PREFIX)/include UAPIDIR ?= $(PREFIX)/include
all: $(LIBS) $(PC_FILE) all: $(STATIC_LIBS) $(SHARED_LIBS) $(PC_FILE)
$(OBJDIR)/libbpf.a: $(OBJS) $(OBJDIR)/libbpf.a: $(STATIC_OBJS)
$(AR) rcs $@ $^ $(AR) rcs $@ $^
$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) $(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION)
@@ -76,7 +77,7 @@ $(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION)
$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION)
ln -sf $(^F) $@ ln -sf $(^F) $@
$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(OBJS) $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS)
$(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \ $(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \
-Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
$^ $(ALL_LDFLAGS) -o $@ $^ $(ALL_LDFLAGS) -o $@
@@ -87,9 +88,18 @@ $(OBJDIR)/libbpf.pc:
-e "s|@VERSION@|$(LIBBPF_VERSION)|" \ -e "s|@VERSION@|$(LIBBPF_VERSION)|" \
< libbpf.pc.template > $@ < libbpf.pc.template > $@
$(OBJDIR)/%.o: %.c $(STATIC_OBJDIR):
mkdir -p $(STATIC_OBJDIR)
$(SHARED_OBJDIR):
mkdir -p $(SHARED_OBJDIR)
$(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR)
$(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@ $(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@
$(SHARED_OBJDIR)/%.o: %.c | $(SHARED_OBJDIR)
$(CC) $(ALL_CFLAGS) $(SHARED_CFLAGS) $(CPPFLAGS) -c $< -o $@
define do_install define do_install
if [ ! -d '$(DESTDIR)$2' ]; then \ if [ ! -d '$(DESTDIR)$2' ]; then \
$(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \
@@ -120,4 +130,4 @@ install_pkgconfig: $(PC_FILE)
$(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644) $(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644)
clean: clean:
rm -f *.o *.a *.so *.so.* *.pc rm -rf *.o *.a *.so *.so.* *.pc $(SHARED_OBJDIR) $(STATIC_OBJDIR)