[dpdk-dev] [PATCH 1/7] build: always link-whole DPDK static libraries

Bruce Richardson bruce.richardson at intel.com
Wed Apr 29 12:42:32 CEST 2020


On Wed, Apr 29, 2020 at 12:18:19PM +0200, Thomas Monjalon wrote:
> 29/04/2020 12:08, Bruce Richardson:
> > To ensure all constructors are included in static build, we need to pass
> > the --whole-archive flag when linking, which is used with the
> > "link_whole" meson option. Since we use link_whole for all libs, we no
> > longer need to track the lib as part of the static dependency, just the
> > path to the headers for compiling.
> 
> Please could you add the generated command line before/after?
> 
> I would like to make sure that the external dependencies are out of
> the whole-archive option.
> 
> Thanks
> 
Sure,

the link args for the helloworld example from build.ninja are now (snipping
out some .a's from the middle for brevity):

 LINK_ARGS = -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -Wl,--whole-archive
-Wl,--start-group lib/librte_telemetry.a lib/librte_bpf.a
lib/librte_flow_classify.a lib/librte_pipeline.a lib/librte_table.a
lib/librte_port.a lib/librte_fib.a lib/librte_ipsec.a lib/librte_vhost.a
lib/librte_stack.a lib/librte_security.a lib/librte_sched.a
lib/librte_reorder.a lib/librte_rib.a lib/librte_rawdev.a
lib/librte_pdump.a lib/librte_power.a lib/librte_member.a lib/librte_lpm.a
lib/librte_latencystats.a lib/librte_kni.a lib/librte_jobstats.a
lib/librte_ip_frag.a lib/librte_gso.a lib/librte_gro.a
  <snip> 
drivers/librte_pmd_mlx5_vdpa.a drivers/librte_pmd_bbdev_null.a
drivers/librte_pmd_bbdev_turbo_sw.a drivers/librte_pmd_bbdev_fpga_lte_fec.a
drivers/librte_pmd_bbdev_fpga_5gnr_fec.a -Wl,--no-whole-archive
-Wl,--no-as-needed -pthread -lm -ldl -lnuma -lpcap
/usr/lib/x86_64-linux-gnu/libbsd.so /usr/lib/x86_64-linux-gnu/libjansson.so
/usr/lib/x86_64-linux-gnu/libelf.so -lpcap -lpcap -lpcap -lpcap
/usr/lib/x86_64-linux-gnu/libmlx5.so
/usr/lib/x86_64-linux-gnu/libibverbs.so /usr/lib/x86_64-linux-gnu/libz.so
/usr/lib/x86_64-linux-gnu/libmlx4.so -lpcap -lpcap -Wl,--end-group

The before case is below (again snipping some drivers):

 LINK_ARGS = -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -Wl,--whole-archive
-Wl,--start-group drivers/librte_common_cpt.a drivers/librte_common_dpaax.a
drivers/librte_common_iavf.a drivers/librte_common_mlx5.a
drivers/librte_common_octeontx.a drivers/librte_common_octeontx2.a
drivers/librte_bus_dpaa.a drivers/librte_bus_fslmc.a
drivers/librte_bus_ifpga.a drivers/librte_bus_pci.a
  <snip>
drivers/librte_pmd_octeontx_event.a drivers/librte_pmd_bbdev_null.a
drivers/librte_pmd_bbdev_turbo_sw.a drivers/librte_pmd_bbdev_fpga_lte_fec.a
drivers/librte_pmd_bbdev_fpga_5gnr_fec.a -Wl,--no-whole-archive
-Wl,--no-as-needed -pthread -lm -ldl -lnuma lib/librte_eal.a
lib/librte_kvargs.a lib/librte_mempool.a lib/librte_ring.a lib/librte_net.a
lib/librte_mbuf.a lib/librte_ethdev.a lib/librte_meter.a
lib/librte_cmdline.a lib/librte_pci.a lib/librte_cryptodev.a
lib/librte_hash.a lib/librte_eventdev.a lib/librte_timer.a
lib/librte_rawdev.a lib/librte_stack.a lib/librte_sched.a
lib/librte_ip_frag.a lib/librte_security.a lib/librte_kni.a
lib/librte_pipeline.a lib/librte_port.a lib/librte_table.a lib/librte_lpm.a
lib/librte_acl.a lib/librte_gso.a lib/librte_vhost.a lib/librte_reorder.a
lib/librte_compressdev.a lib/librte_bbdev.a -lpcap
/usr/lib/x86_64-linux-gnu/libbsd.so /usr/lib/x86_64-linux-gnu/libmlx5.so
/usr/lib/x86_64-linux-gnu/libibverbs.so /usr/lib/x86_64-linux-gnu/libz.so
/usr/lib/x86_64-linux-gnu/libmlx4.so -lpcap -lpcap -lpcap -lpcap -lpcap
-lIPSec_MB -lIPSec_MB /usr/lib/x86_64-linux-gnu/libcrypto.so
/usr/lib/x86_64-linux-gnu/libisal.so -Wl,--end-group
'-Wl,-rpath,$$ORIGIN/../lib' -Wl,-rpath-link,/home/bruce/dpdk.org/build/lib

These both come from builds with meson 0.54. I can also check that things
look the same for 0.47 too.

/Bruce


More information about the dev mailing list