1 Description: backport of dpdk 16.07 fix for library underlinking - stage 3/4
3 This is a merge of related upstream fixes:
4 - cb8e39da mk: sort drivers in static application link list
5 - ea469893 mk: fix driver dependencies order for static application
6 - 4e04fd45 mk: remove library grouping during application linking
7 - 6248e442 mk: prevent overlinking in applications
8 - ce18c527 mk: sort libraries in level order when linking
9 - 95dc3c3c mk: reduce scope of whole-archive static linking
11 Forwarded: yes (in DPDK 16.07)
12 Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
13 Last-Update: 2016-06-14
15 Index: dpdk/mk/rte.app.mk
16 ===================================================================
17 --- dpdk.orig/mk/rte.app.mk
18 +++ dpdk/mk/rte.app.mk
19 @@ -50,6 +50,9 @@ ifeq ($(NO_LDSCRIPT),)
20 LDSCRIPT = $(RTE_LDSCRIPT)
23 +# Link only the libraries used in the application
24 +LDFLAGS += --as-needed
26 # default path for libs
27 _LDLIBS-y += -L$(RTE_SDK_BIN)/lib
29 @@ -57,11 +60,6 @@ _LDLIBS-y += -L$(RTE_SDK_BIN)/lib
30 # Order is important: from higher level to lower level
33 -_LDLIBS-y += --whole-archive
35 -_LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor
36 -_LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder
38 ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)
39 _LDLIBS-$(CONFIG_RTE_LIBRTE_KNI) += -lrte_kni
40 _LDLIBS-$(CONFIG_RTE_LIBRTE_IVSHMEM) += -lrte_ivshmem
41 @@ -70,51 +68,25 @@ endif
42 _LDLIBS-$(CONFIG_RTE_LIBRTE_PIPELINE) += -lrte_pipeline
43 _LDLIBS-$(CONFIG_RTE_LIBRTE_TABLE) += -lrte_table
44 _LDLIBS-$(CONFIG_RTE_LIBRTE_PORT) += -lrte_port
45 -_LDLIBS-$(CONFIG_RTE_LIBRTE_TIMER) += -lrte_timer
46 -_LDLIBS-$(CONFIG_RTE_LIBRTE_HASH) += -lrte_hash
47 -_LDLIBS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += -lrte_jobstats
48 -_LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm
49 -_LDLIBS-$(CONFIG_RTE_LIBRTE_POWER) += -lrte_power
50 -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl
52 +_LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor
53 +_LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER) += -lrte_reorder
54 +_LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag
55 _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter
56 _LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrte_sched
57 -_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lrte_vhost
58 +_LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm
59 +_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl
60 +_LDLIBS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += -lrte_jobstats
61 +_LDLIBS-$(CONFIG_RTE_LIBRTE_POWER) += -lrte_power
63 -# The static libraries do not know their dependencies.
64 -# So linking with static library requires explicit dependencies.
65 -ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
66 -_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lm
67 -_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrt
68 -_LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lm
69 -ifeq ($(CONFIG_RTE_LIBRTE_VHOST_NUMA),y)
70 -_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lnuma
72 -ifeq ($(CONFIG_RTE_LIBRTE_VHOST_USER),n)
73 -_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lfuse
75 -_LDLIBS-$(CONFIG_RTE_PORT_PCAP) += -lpcap
76 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lpcap
77 -_LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lz
78 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -libverbs
79 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -libverbs
80 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lsze2
81 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lxenstore
82 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lgxio
83 -_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lm
84 -# QAT / AESNI GCM PMDs are dependent on libcrypto (from openssl)
85 -# for calculating HMAC precomputes
86 -ifeq ($(CONFIG_RTE_LIBRTE_PMD_QAT),y)
87 -_LDLIBS-y += -lcrypto
88 -else ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM),y)
89 -_LDLIBS-y += -lcrypto
91 -endif # !CONFIG_RTE_BUILD_SHARED_LIBS
92 +_LDLIBS-y += --whole-archive
94 -_LDLIBS-y += --start-group
95 +_LDLIBS-$(CONFIG_RTE_LIBRTE_TIMER) += -lrte_timer
96 +_LDLIBS-$(CONFIG_RTE_LIBRTE_HASH) += -lrte_hash
97 +_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lrte_vhost
99 _LDLIBS-$(CONFIG_RTE_LIBRTE_KVARGS) += -lrte_kvargs
100 _LDLIBS-$(CONFIG_RTE_LIBRTE_MBUF) += -lrte_mbuf
101 -_LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag
102 _LDLIBS-$(CONFIG_RTE_LIBRTE_ETHER) += -lethdev
103 _LDLIBS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += -lrte_cryptodev
104 _LDLIBS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += -lrte_mempool
105 @@ -123,61 +95,65 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)
106 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE) += -lrte_cmdline
107 _LDLIBS-$(CONFIG_RTE_LIBRTE_CFGFILE) += -lrte_cfgfile
108 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_BOND) += -lrte_pmd_bond
110 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lrte_pmd_xenvirt
111 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += -lrte_pmd_xenvirt -lxenstore
113 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
114 # plugins (link only if static libraries)
116 -_LDLIBS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += -lrte_pmd_vmxnet3_uio
117 -_LDLIBS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += -lrte_pmd_virtio
118 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet
119 _LDLIBS-$(CONFIG_RTE_LIBRTE_BNX2X_PMD) += -lrte_pmd_bnx2x
120 _LDLIBS-$(CONFIG_RTE_LIBRTE_CXGBE_PMD) += -lrte_pmd_cxgbe
121 +_LDLIBS-$(CONFIG_RTE_LIBRTE_E1000_PMD) += -lrte_pmd_e1000
122 +_LDLIBS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += -lrte_pmd_ena
123 _LDLIBS-$(CONFIG_RTE_LIBRTE_ENIC_PMD) += -lrte_pmd_enic
124 -_LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD) += -lrte_pmd_i40e
125 _LDLIBS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += -lrte_pmd_fm10k
126 +_LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD) += -lrte_pmd_i40e
127 _LDLIBS-$(CONFIG_RTE_LIBRTE_IXGBE_PMD) += -lrte_pmd_ixgbe
128 -_LDLIBS-$(CONFIG_RTE_LIBRTE_E1000_PMD) += -lrte_pmd_e1000
129 -_LDLIBS-$(CONFIG_RTE_LIBRTE_ENA_PMD) += -lrte_pmd_ena
130 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -lrte_pmd_mlx4
131 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -lrte_pmd_mlx5
132 -_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lrte_pmd_nfp
133 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lrte_pmd_szedata2
134 -_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lrte_pmd_mpipe
135 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_RING) += -lrte_pmd_ring
136 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lrte_pmd_pcap
137 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AF_PACKET) += -lrte_pmd_af_packet
138 +_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -lrte_pmd_mlx4 -libverbs
139 +_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -lrte_pmd_mlx5 -libverbs
140 +_LDLIBS-$(CONFIG_RTE_LIBRTE_MPIPE_PMD) += -lrte_pmd_mpipe -lgxio
141 +_LDLIBS-$(CONFIG_RTE_LIBRTE_NFP_PMD) += -lrte_pmd_nfp -lm
142 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += -lrte_pmd_null
143 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += -lrte_pmd_pcap -lpcap
144 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_RING) += -lrte_pmd_ring
145 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += -lrte_pmd_szedata2 -lsze2
146 +_LDLIBS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += -lrte_pmd_virtio
147 +ifeq ($(CONFIG_RTE_LIBRTE_VHOST),y)
148 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += -lrte_pmd_vhost
149 +endif # $(CONFIG_RTE_LIBRTE_VHOST)
150 +_LDLIBS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += -lrte_pmd_vmxnet3_uio
152 ifeq ($(CONFIG_RTE_LIBRTE_CRYPTODEV),y)
153 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_QAT) += -lrte_pmd_qat
154 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += -lrte_pmd_aesni_mb
155 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -lrte_pmd_aesni_gcm
156 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_MB) += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
157 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -lrte_pmd_aesni_gcm
158 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM) += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
159 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO) += -lrte_pmd_null_crypto
161 -# AESNI MULTI BUFFER / GCM PMDs are dependent on the IPSec_MB library
162 -ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_MB),y)
163 -_LDLIBS-y += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
164 -else ifeq ($(CONFIG_RTE_LIBRTE_PMD_AESNI_GCM),y)
165 -_LDLIBS-y += -L$(AESNI_MULTI_BUFFER_LIB_PATH) -lIPSec_MB
168 -# SNOW3G PMD is dependent on the LIBSSO library
169 +_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_QAT) += -lrte_pmd_qat
170 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SNOW3G) += -lrte_pmd_snow3g
171 _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SNOW3G) += -L$(LIBSSO_PATH)/build -lsso
172 endif # CONFIG_RTE_LIBRTE_CRYPTODEV
174 -ifeq ($(CONFIG_RTE_LIBRTE_VHOST),y)
176 -_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_VHOST) += -lrte_pmd_vhost
177 +endif # !CONFIG_RTE_BUILD_SHARED_LIBS
179 -endif # $(CONFIG_RTE_LIBRTE_VHOST)
180 +_LDLIBS-y += --no-whole-archive
182 -endif # ! $(CONFIG_RTE_BUILD_SHARED_LIB)
183 +ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n)
184 +# The static libraries do not know their dependencies.
185 +# So linking with static library requires explicit dependencies.
186 +_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lm
187 +_LDLIBS-$(CONFIG_RTE_LIBRTE_SCHED) += -lrt
188 +_LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lm
189 +ifeq ($(CONFIG_RTE_LIBRTE_VHOST_NUMA),y)
190 +_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lnuma
192 +ifeq ($(CONFIG_RTE_LIBRTE_VHOST_USER),n)
193 +_LDLIBS-$(CONFIG_RTE_LIBRTE_VHOST) += -lfuse
195 +_LDLIBS-$(CONFIG_RTE_PORT_PCAP) += -lpcap
196 +endif # !CONFIG_RTE_BUILD_SHARED_LIBS
198 _LDLIBS-y += $(EXECENV_LDLIBS)
199 -_LDLIBS-y += --end-group
200 -_LDLIBS-y += --no-whole-archive
202 LDLIBS += $(_LDLIBS-y) $(CPU_LDLIBS) $(EXTRA_LDLIBS)
204 Index: dpdk/mk/exec-env/linuxapp/rte.vars.mk
205 ===================================================================
206 --- dpdk.orig/mk/exec-env/linuxapp/rte.vars.mk
207 +++ dpdk/mk/exec-env/linuxapp/rte.vars.mk
208 @@ -45,9 +45,6 @@ else
209 EXECENV_CFLAGS = -pthread
212 -# Workaround lack of DT_NEEDED entry
213 -EXECENV_LDFLAGS = --no-as-needed