iproute2: only link libelf where needed

The iproute2 build system links libelf support to every utility while only
the tc program actually requires libelf specific functionality.

Unfortunately the BPF ELF functionality is not confined into an own
compilation unit but added to the existing bpf.c sources of the shared
static libutil.a, causing every iproute2 applet to pick up an implicit
libelf.so dependency.

In order to avoid this requirement, patch the iproute2 build system to
create both a libutil.a and a libutil-elf.a, with the former being built
without libelf functionality and to only link the tc applet with the libelf
enabled libutil.

Finally, make the tc package depend on libelf to solve compilation errors.

Ref: https://github.com/openwrt/packages/issues/7728
Fixes: FS#2011
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
v19.07.3_mercusys_ac12_duma
Jo-Philipp Wich 5 years ago
parent 4b4e6a04ac
commit 386803a006

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=iproute2
PKG_VERSION:=4.19.0
PKG_RELEASE:=6
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
@ -53,7 +53,7 @@ endef
define Package/tc
$(call Package/iproute2/Default)
TITLE:=Traffic control utility
DEPENDS:=+kmod-sched-core +(PACKAGE_devlink||PACKAGE_rdma):libmnl
DEPENDS:=+kmod-sched-core +(PACKAGE_devlink||PACKAGE_rdma):libmnl +libelf1
endef
define Package/genl

@ -0,0 +1,60 @@
--- a/configure
+++ b/configure
@@ -257,8 +257,9 @@ check_elf()
echo "HAVE_ELF:=y" >>$CONFIG
echo "yes"
- echo 'CFLAGS += -DHAVE_ELF' `${PKG_CONFIG} libelf --cflags` >> $CONFIG
- echo 'LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG
+ echo 'CFLAGS += -DHAVE_ELF' >> $CONFIG
+ echo 'ELF_CFLAGS += ' `${PKG_CONFIG} libelf --cflags` >> $CONFIG
+ echo 'ELF_LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG
else
echo "no"
fi
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -11,9 +11,17 @@ UTILOBJ = utils.o rt_names.o ll_map.o ll
inet_proto.o namespace.o json_writer.o json_print.o \
names.o color.o bpf.o exec.o fs.o
+ELFOBJ=$(patsubst %.o,%.elf.o,$(UTILOBJ))
+
NLOBJ=libgenl.o libnetlink.o
-all: libnetlink.a libutil.a
+all: libnetlink.a libutil.a libutil-elf.a
+
+%.o: %.c
+ $(QUIET_CC)$(CC) $(CFLAGS) -UHAVE_ELF $(EXTRA_CFLAGS) -c -o $@ $<
+
+%.elf.o: %.c
+ $(QUIET_CC)$(CC) $(CFLAGS) $(ELF_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
libnetlink.a: $(NLOBJ)
$(QUIET_AR)$(AR) rcs $@ $^
@@ -21,7 +29,10 @@ libnetlink.a: $(NLOBJ)
libutil.a: $(UTILOBJ) $(ADDLIB)
$(QUIET_AR)$(AR) rcs $@ $^
+libutil-elf.a: $(ELFOBJ) $(ADDLIB)
+ $(QUIET_AR)$(AR) rcs $@ $^
+
install:
clean:
- rm -f $(NLOBJ) $(UTILOBJ) $(ADDLIB) libnetlink.a libutil.a
+ rm -f $(NLOBJ) $(UTILOBJ) $(ELFOBJ) $(ADDLIB) libnetlink.a libutil.a libutil-elf.a
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -132,8 +132,8 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
all: tc $(TCSO)
-tc: $(TCOBJ) $(LIBNETLINK) libtc.a
- $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
+tc: $(TCOBJ) $(subst libutil.a,libutil-elf.a,$(LIBNETLINK)) libtc.a
+ $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) $(ELF_LDLIBS) -o $@
libtc.a: $(TCLIB)
$(QUIET_AR)$(AR) rcs $@ $^
Loading…
Cancel
Save