Herramienta de gestión de red de compilación cruzada iproute2

Herramienta de gestión de red de compilación cruzada iproute2

El comando ip integrado en busybox no es compatible con netns y bridge, así que trasplanté uno por mí mismo consultando la guía de documentos web.

Referencia: https://blog.csdn.net/u013401853/article/details/71126645

Lanzamiento: 03 de mayo de 2017 17:04:58 Constante de Planck

  • 1) Descarga el código fuente

  • 2) Descomprime y modifica Makefile

    • Modificar CC en Makefille como un compilador cruzado
      CC = /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
      
    • Constantes de Planck / PS : como solo necesito el comando ip, modifique la línea 38 para compilar solo la herramienta ip SUBDIRS = ip
    • Acerca de la versión 4.19.0
      // 修改 Makefile --- 交叉编译器
      CC = /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
      // 修改config.mk --- 交叉编译器
      AR:=/usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-ar
      CC:=/usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
      // 修改config.mk --- 去除对SELinux和CAP的支持
      HAVE_SELINUX:=
      #LDLIBS += -lselinux
      #CFLAGS += -DHAVE_SELINUX
      CFLAGS += -DNEED_STRLCPY
      HAVE_CAP:=
      #CFLAGS += -DHAVE_LIBCAP
      #LDLIBS += -lcap
      
  • 3) hacer

    make LDFLAGS=-static  ## 静态连接,否则,运行时报缺少.so文件
    

    PD :

    • El proceso de creación no será completamente exitoso, pero la ip requerida ha sido compilada, y la ip en el directorio ip es el programa ejecutable de ip requerido.
    • La versión descargada 4.19 requiere que el compilador tenga selinux.h y capacidad.h (gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi no es compatible), así que descargué la versión 4.13 y la compilé
  • 4) Compilar la resolución de errores

    • Debido al compilador gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi, la función establece conflictos de declaración, de la siguiente manera:
      In file included from utils.c:36:0:
      ../include/namespace.h:35:19: error: static declaration of ‘setns’ follows non-static declaration
      static inline int setns(int fd, int nstype)
                        ^~~~~
      In file included from /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include/sched.h:43:0,
                      from ../include/namespace.h:4,
                      from utils.c:36:
      /usr/arm/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include/bits/sched.h:91:12: note: previous declaration of ‘setns’ was here
      extern int setns (int __fd, int __nstype) __THROW;  
      
      Solución: Edite ./include/namespace.hy use la declaración de bits / sched.h
      #ifndef HAVE_SETNS
      extern int setns (int __fd, int __nstype) __THROW;
      /*
      static inline int setns(int fd, int nstype)
      {
      ...
      }
      */
      #endif /* HAVE_SETNS */  
      
    • libmnl requerido para soporte de errores

      lib ## 编译 iproute2-4.19/lib目录
      libnetlink.c:120:2: warning: #warning "libmnl required for error support" [-Wcpp]
      #warning "libmnl required for error support"
      

      Compruebe el código fuente de lib / libnetlink.c. Si la macro HAVE_LIBMNL no está definida, aparecerá la advertencia anterior. Puede descargar libmnl del sitio web oficial http://ftp.netfilter.org/pub/libmnl/ y compilarlo. Esta prueba no se hace aquí.

    • Cuando está vinculado estáticamente, la ejecución ip link add veth0a type veth peer name veth0bfalla

      # 在 CentOS 7 中静态链接,出现同样问题,侧面佐证静态链接不可行;
      # 在 ./ip/iplink.c 中加入跟踪代码,发现问题出在 dlh = BODY = dlopen(NULL, RTLD_LAZY) 时为(明显地,必须是动态链接)
      

      Compile dinámicamente, copie libdl.so.2.23 en la máquina de destino y ln -s como libdl.so.2, ejecute ldd, de la siguiente manera:

      /root # ldd ./ip
              linux-vdso.so.1 (0x7ee1e000)
              libdl.so.2 => /lib/libdl.so.2 (0x76fa0000)
              libc.so.6 => /lib/libc.so.6 (0x76eb3000)
              /lib/ld-linux.so.3 (0x76fb3000)
      

      Entonces, la ejecución es ip link add veth0a type veth peer name veth0bexitosa.

  • 5) Coloque el programa ip en el directorio ip de la placa para ver si se puede ejecutar

    Puede correr directamente

    Constantes de Planck / PS : Solía ​​pensar que la versión de iproute2 correspondiente al kernel debe descargarse para que funcione normalmente, pero compilé la última versión de iiproute y la puse en la placa para que se ejecutara.

    # 动态链接时,报告缺少.so文件
    /root # ./ip --help
    ./ip: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory  
    
  • referencia:

Supongo que te gusta

Origin blog.csdn.net/hylaking/article/details/95336108
Recomendado
Clasificación