Re: [PATCH] mk: fix underlinking issues of most librte libraries
From: Ferruh Yigit <hidden>
Date: 2016-05-26 13:14:13
Subsystem:
the rest · Maintainer:
Linus Torvalds
On 5/24/2016 11:11 AM, Christian Ehrhardt wrote:
Hi Panu, I already agreed to Thomas on IRC but won't have time until next week. Thanks for making a patch that does that already - I'll give it a look and some test on my end next week then. Christian Ehrhardt Software Engineer, Ubuntu Server Canonical Ltd On Tue, May 24, 2016 at 11:56 AM, Panu Matilainen [off-list ref] wrote:quoted
On 05/20/2016 08:08 PM, Thomas Monjalon wrote:quoted
2016-05-20 18:50, Christian Ehrhardt:quoted
The individual libraries have various cross dependencies. This is already refelcted in the DEPDIR dependency, but not yet in proper DT_NEEDED flags in the .so's. This adds the -l flags so that is properly stored in the .so's ELF headers.Why not filling LDLIBS by parsing DEPDIRS-y in rte.lib.mk?A fair question :) The thought has passed my mind too, but I thought it'd be too messy with differing library vs directory names and other exceptions. But in reality manually maintained separate LDLIBS is only going to get out of sync sooner or later, and turns out its not that bad anyway:diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index b420280..88b4e98 100644 --- a/mk/rte.lib.mk +++ b/mk/rte.lib.mk@@ -77,6 +77,12 @@ else _CPU_LDFLAGS := $(CPU_LDFLAGS) endif +# Translate DEPDIRS-y into LDLIBS +IGNORE_DEPS = -lrte_eal/% -lrte_net -lrte_compat +_LDDIRS = $(subst librte_ether,libethdev,$(DEPDIRS-y)) +_LDDEPS = $(subst lib/lib,-l,$(_LDDIRS)) +LDLIBS += $(filter-out $(IGNORE_DEPS), $(_LDDEPS)) + O_TO_A = $(AR) crDs $(LIB) $(OBJS-y) O_TO_A_STR = $(subst ','\'',$(O_TO_A)) #'# fix syntax highlight O_TO_A_DISP = $(if $(V),"$(O_TO_A_STR)"," AR $(@)")I'm also sure somebody more familiar with gmake could improve it, but it seems to work quite fine here. I'll wait a bit to see if there are other suggestions before sending it as a proper patch. - Panu -
I did test the patch with minor diff in rte.vars.mk [1], otherwise all libraries kept needed in final library. Patch itself looks good, overlinking problem in final binary seems fixed [2] [3]. But this cause a compilation error for cmdline_test [4]. This is because of cyclic dependency between librte_eal <-> librte_mempool. Other applications don't have this compilation error because they use librte_mempool, and since it is linked against application, this error not observed. cmdline_test itself doesn't have any direct call to librte_mempool. It is possible to add workaround to cmdline_test [5], (introduce overlinking back), but should we attack on cyclic dependency instead? Thanks, ferruh --- [1]
diff --git a/mk/exec-env/linuxapp/rte.vars.mkb/mk/exec-env/linuxapp/rte.vars.mk index d51bd17..10d37d5 100644
--- a/mk/exec-env/linuxapp/rte.vars.mk
+++ b/mk/exec-env/linuxapp/rte.vars.mk@@ -46,7 +46,7 @@ EXECENV_CFLAGS = -pthread endif # Workaround lack of DT_NEEDED entry -EXECENV_LDFLAGS = --no-as-needed +EXECENV_LDFLAGS = --as-needed EXECENV_LDLIBS = EXECENV_ASFLAGS =
[2]
# ldd build/app/testpmd
linux-vdso.so.1 (0x00007ffcff92e000)
librte_mbuf.so.2.1 => .../build/lib/librte_mbuf.so.2.1
libethdev.so.4.1 => .../build/lib/libethdev.so.4.1
librte_mempool.so.2.1 => .../build/lib/librte_mempool.so.2.1
librte_ring.so.1.1 => .../build/lib/librte_ring.so.1.1
librte_eal.so.2.1 => .../build/lib/librte_eal.so.2.1
librte_cmdline.so.2.1 => .../build/lib/librte_cmdline.so.2.1
librte_pmd_bond.so.1.1 => .../build/lib/librte_pmd_bond.so.1.1
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6879ff1000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6879c30000)
/lib64/ld-linux-x86-64.so.2 (0x0000564998dbd000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6879a2c000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6879814000)
librt.so.1 => /lib64/librt.so.1 (0x00007f687960c000)
librte_kvargs.so.1.1 => .../build/lib/librte_kvargs.so.1.1
[3]
# ldd -u -r build/app/testpmd
#
[4]
== Build app/cmdline_test
CC cmdline_test.o
CC commands.o
LD cmdline_test
.../build/lib/librte_eal.so: undefined reference to `rte_mempool_lookup'
.../build/lib/librte_eal.so: undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit status
.../mk/rte.app.mk:243: recipe for target 'cmdline_test' failed
make[3]: *** [cmdline_test] Error 1
[5]diff --git a/app/cmdline_test/Makefile b/app/cmdline_test/Makefile
index c6169f5..69ebfb2 100644
--- a/app/cmdline_test/Makefile
+++ b/app/cmdline_test/Makefile@@ -46,6 +46,7 @@ SRCS-y += commands.c CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +LDFLAGS += --no-as-needed # this application needs libraries first DEPDIRS-y += lib drivers