DPVS recomienda hacer uso de dpdk-stable-18.11.2 para compilar con Makefile. Pero la versión actual 18.11.11 de DPDK LTS admite el sistema de compilación meson-ninja junto con el sistema Makefile.

He estado experimentando con el código de port to a more recent DPDK version que solo admite meson-ninja en lugar del obsoleto sistema Makefile. Mi problema problema de enlace DPVS es que no puedo resolver los problemas de dependencia al vincular contra el DPDK que se construye usando el meson-ninja. Lo mismo funciona sin problemas cuando trato de vincular contra el DPDK 18.11 construido usando Makefiles. Estoy ejecutando un sistema operativo invitado con NIC Virtio / E1000 usando KVM-QEMU. El sistema operativo invitado es Ubuntu 18.04 LTS (x64) .

Las bibliotecas DPDK están vinculadas por el proyecto DPVS por dpdk.mk, y las opciones de vinculación actuales son:

LIBS += -Wl,--no-as-needed -fvisibility=default \
        -Wl,--whole-archive -lrte_pmd_vmxnet3_uio -lrte_pmd_i40e -lrte_pmd_ixgbe \
        -lrte_pmd_e1000 -lrte_pmd_bnxt -lrte_pmd_ring -lrte_pmd_bond -lrte_ethdev -lrte_ip_frag \
        -Wl,--whole-archive -lrte_hash -lrte_kvargs -Wl,-lrte_mbuf -lrte_eal \
        -Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni \
        -lrte_mempool_ring -lrte_timer -lrte_net -Wl,-lrte_pmd_virtio \
        -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
        -Wl,--no-whole-archive -lrt -lm -ldl -lcrypto

Lo que he probado hasta ahora:

  • Verificado que la vinculación es exitosa usando el sistema Makefile
  • Se aseguró de que no haya problemas de 'no se pudo encontrar la biblioteca' agregando la ruta de la biblioteca adecuada al vincularla con la compilación de Meson
  • No quiero moverlo a la carpeta de aplicaciones de DPDK y crear archivos de compilación Meson para él todavía (aún no lo he aprendido).

Por lo tanto, ayude a resolver este problema de vinculación (parece ser un problema general relacionado con la vinculación con las opciones de marca -Wl).

¡Gracias! :)


Editar: registros de errores actualizados

cc -D DPVS_MAX_SOCKET=1 -D DPVS_MAX_LCORE=3 -D CONFIG_DPVS_TRACING \
-D CONFIG_DPVS_NEIGH_DEBUG -D CONFIG_DPVS_IPVS_DEBUG -D DPVS_CFG_PARSER_DEBUG \
-D CONFIG_DPVS_IP_HEADER_DEBUG -D CONFIG_DPVS_PDUMP \
-D CONFIG_DPVS_IPSET_DEBUG -D CONFIG_MSG_DEBUG \
-include /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/include/rte_config.h -march=native \
-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 \
-DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 \
-DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2  \
-D __DPVS__ -DDPVS_VERSION=\"1.8-4\" \
-DDPVS_BUILD_DATE=\"2021.01.25.10:11:27\" \
-Werror -Wstrict-prototypes -Wmissing-prototypes \
-mcmodel=medium -fgnu89-inline -Wno-format-truncation \
-Wno-stringop-truncation -Wstringop-overflow=0 -g -O0 \
-D DEBUG -rdynamic \
-I /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/include \
-I /home/anshul/loadbalancer/dpvs/src//../include \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/ \
-L /home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/dpdk/pmds-18.11 \
-Wl,--no-as-needed -fvisibility=default \
-Wl,--whole-archive -lrte_pmd_vmxnet3 -lrte_pmd_i40e -lrte_pmd_ixgbe -lrte_pmd_e1000 -lrte_pmd_bnxt -lrte_pmd_ring -lrte_pmd_bond -lrte_ethdev -lrte_ip_frag \
-Wl,--whole-archive -lrte_hash -lrte_kvargs \
-Wl,-lrte_mbuf -lrte_eal \
-Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni -lrte_mempool_ring -lrte_timer -lrte_net \
-Wl,-lrte_pmd_virtio -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
-Wl,--no-whole-archive -lrt -lm -ldl -lcrypto \
-Wl,-rpath,/home/anshul/loadbalancer/dpdk-stable-18.11.10/sdk/build/lib/x86_64-linux-gnu/ -lpthread -lnuma /home/anshul/loadbalancer/dpvs/src/cfgfile.o ... -o dpvs
/home/anshul/loadbalancer/dpvs/src/netif.o: In function `get_bond_status':
/home/anshul/loadbalancer/dpvs/src/netif.c:4738: undefined reference to `rte_eth_bond_link_monitoring_get'
/home/anshul/loadbalancer/dpvs/src/netif.c:4739: undefined reference to `rte_eth_bond_link_down_prop_delay_get'
/home/anshul/loadbalancer/dpvs/src/netif.c:4740: undefined reference to `rte_eth_bond_link_up_prop_delay_get'
/home/anshul/loadbalancer/dpvs/src/netif.o: In function `set_bond':
/home/anshul/loadbalancer/dpvs/src/netif.c:5030: undefined reference to `rte_eth_bond_link_down_prop_delay_set'
/home/anshul/loadbalancer/dpvs/src/netif.c:5039: undefined reference to `rte_eth_bond_link_up_prop_delay_set'
collect2: error: ld returned 1 exit status
Makefile:71: recipe for target 'dpvs' failed
make[1]: *** [dpvs] Error 1
make[1]: Leaving directory '/home/anshul/loadbalancer/dpvs/src'
Makefile:33: recipe for target 'all' failed
make: *** [all] Error 1

Actualización: las opciones que se utilizan actualmente en dpdk.mk son:

CFLAGS += -march=native \
          -DRTE_MACHINE_CPUFLAG_SSE \
          -DRTE_MACHINE_CPUFLAG_SSE2 \
          -DRTE_MACHINE_CPUFLAG_SSE3 \
          -DRTE_MACHINE_CPUFLAG_SSSE3 \
          -DRTE_MACHINE_CPUFLAG_SSE4_1 \
          -DRTE_MACHINE_CPUFLAG_SSE4_2 

LIBS += -L $(DPDKDIR)/lib
LIBS += -L $(DPDKDIR)/lib/x86_64-linux-gnu/
LIBS += -L $(DPDKDIR)/lib/x86_64-linux-gnu/dpdk/pmds-20.11
 
LIBS += -Wl,--no-as-needed -fvisibility=default \
        -Wl,--whole-archive -lrte_net_vmxnet3 -lrte_net_i40e -lrte_net_ixgbe \
        -lrte_net_e1000 -lrte_net_bnxt -lrte_net_ring -lrte_ip_frag \
        -Wl,--whole-archive -lrte_hash -lrte_kvargs -Wl,-lrte_mbuf -lrte_eal \
        -Wl,--whole-archive -l:librte_net_bond.a -l:librte_ethdev.a \
        -Wl,-lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrte_kni \
        -lrte_mempool_ring -lrte_timer -lrte_net -Wl,-lrte_net_virtio \
        -lrte_pci -lrte_bus_pci -lrte_bus_vdev -lrte_lpm -lrte_pdump \
        -Wl,--no-whole-archive -lrt -lm -ldl -lcrypto -lrte_telemetry

LIBS += -Wl,-rpath,$(DPDKDIR)/lib/x86_64-linux-gnu/

Resumen:

  • Se eliminó -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2 de CFLAGS para evitar errores de redefinición.
  • Rutas de biblioteca actualizadas en la variable LIBS para reflejar las rutas al SDK. La carpeta SDK (DPDKDIR) es la carpeta donde ninja install había instalado los archivos y las bibliotecas.
  • Se agregó la opción -Wl,-rpath,$(DPDKDIR)/lib/x86_64-linux-gnu/ para problemas perdidos que hacen referencia a algunas bibliotecas *.so.11
  • Vinculación a bibliotecas estáticas para vincular y ethdev usando las opciones -l:librte_net_bond.a -l:librte_ethdev.a.

0
Anshul 22 ene. 2021 a las 14:21

1 respuesta

La mejor respuesta

El problema al que se enfrenta es el uso inadecuado de los enlaces de bibliotecas. La solución más sencilla es

  1. Descargue DPDK 18.11.11 LTS que admite meson.
  2. Cree bibliotecas dpdk e instálelas en la ruta deseada.
  3. modificar dpvs src/dpdk.mk para comprobar si hay libdpdk a través de pkg-conf
  4. modificar src/makefile para adaptarse a los cambios de las bibliotecas DPDK

Una explicación de los pasos se menciona brevemente en la sección 3.24 Aplicación Buidlign con DPDK instalado.

[EDIT-1] nota: Dado que no hay actualizaciones sobre los cambios realizados en Makefile desde @Anshul, he creado un push solicitud para apoyar el mismo.

Diff para src / Makefile

index 02f288c..f2aefdb 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -34,10 +34,14 @@ DATE_STRING := $(shell date +%Y.%m.%d.%H:%M:%S)
 # same path of THIS Makefile
 SRCDIR := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))

+ifeq ($(shell pkg-config --exists libdpdk && echo 0),0)
+else
 ifeq ($(RTE_SDK),)
        $(error "The variable RTE_SDK is not defined.")
 endif
 include $(RTE_SDK)/mk/rte.vars.mk
+LIBS += -lpthread -lnuma
+endif

 include $(SRCDIR)/config.mk
 include $(SRCDIR)/dpdk.mk
@@ -62,7 +66,6 @@ else
        CFLAGS += -rdynamic
 endif

-LIBS += -lpthread -lnuma

Diff para src / dpdk.mk

 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
+ifeq ($(shell pkg-config --exists libdpdk && echo 0),0)
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API -static $(shell pkg-config --cflags libdpdk)
+LIBS += $(shell pkg-config --libs --static libdpdk)
+
+else

 ifeq ($(RTE_SDK),)
 $(error "The variable RTE_SDK is not defined.")
@@ -58,3 +64,4 @@ LIBS += -Wl,--whole-archive -lrte_pmd_mlx5 -Wl,--no-whole-archive
 LIBS += -libverbs -lmlx5 -lmnl
 endif

+endif
1
Vipin Varghese 25 ene. 2021 a las 17:06