From: Bruce Richardson Date: Tue, 30 Jun 2020 14:14:33 +0000 (+0100) Subject: build/pkg-config: prevent overlinking X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=b98447077b0609750c10b84b7b2e7be0c8504fad build/pkg-config: prevent overlinking Add the --as-needed linker flag to the DPDK library list in the pkg-config file so as to prevent overlinking. Without this flag, when linking statically using flags from $(pkg-config --static --libs libdpdk), all DPDK drivers and libs were statically linked in, but the binary was also requiring all the shared versions be present to run. The real root-cause of this issue is that the DPDK libraries need to be duplicated in the linker command when doing static linking, due to the behaviour of pkg-config, but since that behaviour cannot be easily changed, this is a simple workaround to avoid problems. Signed-off-by: Bruce Richardson Acked-by: Luca Boccassi Acked-by: Sunil Pai G Signed-off-by: Thomas Monjalon --- diff --git a/buildtools/pkg-config/meson.build b/buildtools/pkg-config/meson.build index dacc5dbfb1..5f19304289 100644 --- a/buildtools/pkg-config/meson.build +++ b/buildtools/pkg-config/meson.build @@ -21,6 +21,11 @@ endif # Another requirement is to allow linking dependencies as shared libraries, # while linking static DPDK libraries and drivers. It is satisfied by # listing the static files in Libs.private with the explicit syntax -l:libfoo.a. +# As a consequence, the regular DPDK libraries are already listed as static +# in the field Libs.private. The second occurences of DPDK libraries, +# included from Requires and used for shared library linkage case, +# are skipped in the case of static linkage thanks to the flag --as-needed. + pkg.generate(name: 'dpdk-libs', filebase: 'libdpdk-libs', @@ -29,7 +34,7 @@ Use libdpdk.pc instead of this file to query DPDK compile/link arguments''', version: meson.project_version(), subdirs: [get_option('include_subdir_arch'), '.'], extra_cflags: pkg_extra_cflags, - libraries: dpdk_libraries, + libraries: ['-Wl,--as-needed'] + dpdk_libraries, libraries_private: dpdk_extra_ldflags) pkg.generate(name: 'DPDK', # main DPDK pkgconfig file