• 交叉编译RF_RING


    PF_RING介绍

    PF_RING是Luca研究出来的基于Linux内核级的高效数据包捕获技术。简单来说PF_RING 是一个高速数据包捕获库,通过它可以实现将通用 PC 计算机变成一个有效且便宜的网络测量工具箱,进行数据包和现网流量的分析和操作。同时支持调用用户级别的API来创建更有效的应用程序。现在我们知道PF_RING是拥有一套完整开发接口的高速数据包捕捉库,与我们熟知的libpcap十分相似,但其性能要优于libpcap

    PF_RING下载(2018年1月)

    https://www.ntop.org/get-started/download/#PF_RING

    编译

    cd PF_RING

    make

    交叉编译:

    背景:项目中需要在一个openwrt环境下植入PF_RING动态库。首先是生产此库。

    平台:编译平台为ubuntu12.04, 交叉编译平台为高通ipq4019, arm7;

    步骤:

    1.建立package/utils/pfring,文件结构如下;

    2.将网上下载RF_RING下的文件拷贝到src目录下,文件结构如下;

    ├── pfring
    │   ├── Makefile
    │   └── src
    │       ├── ChangeLog
    │       ├── doc
    │       ├── drivers
    │       ├── kernel
    │       ├── LICENSE
    │       ├── Makefile
    │       ├── package
    │       ├── README
    │       ├── README.FIRST
    │       ├── README.md
    │       ├── tools
    │       └── userland

    3. pfring/Makefile如下:

    include $(TOPDIR)/rules.mk
    
    PKG_NAME:=pfring
    PKG_RELEASE:=1
    PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
    
    include $(INCLUDE_DIR)/package.mk
    
    define Package/pfring
      SECTION:=utils
      CATEGORY:=Utilities
      TITLE:=pf_ring -- output libpfring.so
    endef
    
    define Package/pfring/description
        It's my first package demo.
    endef
    
    define Build/Prepare
            echo "Here is Package/Prepare"
            mkdir -p $(PKG_BUILD_DIR)
            $(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
    
    define Package/pfring/install
            echo "Here is Package/install"
    #       $(INSTALL_DIR) $(1)/bin
    #       $(INSTALL_BIN) $(PKG_BUILD_DIR)/pfring $(1)/bin/
            $(INSTALL_DIR) $(1)/usr/lib
            $(CP) $(PKG_BUILD_DIR)/userland/deplib/* $(1)/usr/lib
            $(CP) $(PKG_BUILD_DIR)/userland/lib/*.so $(1)/usr/lib
    endef
    
    $(eval $(call BuildPackage,pfring))
    ~                                                                                                                                                                                                            
    ~        
    View Code

    4. 修改src下makefile,使用交叉工具链

    主Makefile如下,

    all:
            cd kernel; make
            cd userland; make
            cd drivers; make
    
    clean:
            cd kernel; make clean
            cd userland; make clean
            cd drivers; make clean
            -cd userland/snort/pfring-daq-module; make clean
    
    snort:
            cd userland/snort/pfring-daq-module; autoreconf -ivf; ./configure; make
            cd userland/snort/pfring-daq-module-zc; autoreconf -ivf; ./configure; make
    
    changelog:
            git log --since={`curl -s https://sourceforge.net/projects/ntop/files/PF_RING/|grep -o "<td headers="files_date_h" class="opt"><abbr title="[^"]*">[^<]*</abbr></td>"|head -n 3|tail -n 1|egrep -o "[0-9]+-[0-9]+-[0-9]+"|head -n 1`} --name-only --pretty=format:" - %s" > ./doc/Changelog.txt
    
    documentation:
            cd doc; make
            cd doc/doxygen; doxygen Doxyfile

    此处主要使用make all和make clean;使用交叉编译工具链,需要在make 后加入参数如下:

    make CROSS_COMPILE=arm-openwrt-linux-uclibcgnueabi- ARCH=arm

    整过过程是逢山开路,遇水搭桥,不过过程艰辛。有问题的可以私聊。主要遇到的问题归结如下

    错误1

     CC [M]  /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel/pf_ring.o

    cc1: note: someone does not honour COPTS correctly, passed 0 times

    In file included from include/asm-generic/int-ll64.h:10:0,

                     from ./arch/arm/include/asm/types.h:4,

                     from include/uapi/linux/types.h:4,

                     from include/linux/types.h:5,

                     from include/linux/list.h:4,

                     from include/linux/module.h:9,

                     from /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel/pf_ring.c:78:

    include/uapi/asm-generic/int-ll64.h:11:29: fatal error: asm/bitsperlong.h: No such file or directory

    compilation terminated.

    make[6]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel/pf_ring.o] Error 1

    make[5]: *** [_module_/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel] Error 2

    make[5]: Leaving directory `/usr/src/linux-headers-4.4.0-31-generic'

    make[4]: *** [all] Error 2

    make[4]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel'

    make[3]: *** [all] Error 2

    make[3]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring'

    make[2]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/.built] Error 2

    make[2]: Leaving directory `/home/box/work/xitong/qca/qca.git/qsdk/package/utils/pfring'

    make[1]: *** [package/utils/pfring/compile] Error 2

    make[1]: Leaving directory `/home/box/work/xitong/qca/qca.git/qsdk'

    make: *** [package/utils/pfring/compile] Error 2

    1) 在vi kernel/pf_ring.c下增加kernel/pf_ring.c

    2)在qca/src/linux-3.14/include/ uapi/asm-generic/int-ll64.h修改

    //#include <asm/bitsperlong.h>

    #include <asm-generic/bitsperlong.h>

    思路:此处一直认为是内核库里没有bitsperlong.h文件,随着查资料才知道是因为没有使用交叉编译工具导致。如果使用平台的编译工具,编译时用的是gcc, 如果使用交叉编译环境,编译工具为arm-openwrt-linux-uclibcgnueabi-gcc;

    在PF_RING中需要修改交叉编译变量,方法如下,在make中加入参数CROSS_COMPILE=arm-openwrt-linux-uclibcgnueabi- ARCH=arm

    Make à

    Make CROSS_COMPILE=arm-openwrt-linux-uclibcgnueabi- ARCH=arm

    错误2

    include/uapi/linux/types.h:4:23: fatal error: asm/types.h: No such file or directory

    #include <asm/types.h>

                           ^

    compilation terminated.

    make[6]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel/pf_ring.o] Error 1

    make[5]: *** [_module_/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel] Error 2

    make[5]: Leaving directory `/usr/src/linux-headers-3.11.0-15-generic'

    make[4]: *** [all] Error 2

    make[4]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel'

    make[3]: *** [all] Error 2

    make[3]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring'

    make[2]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/.built] Error 2

    make[2]: Leaving directory `/home/pon/qca/qca.git/qsdk/package/utils/pfring'

    make[1]: *** [package/utils/pfring/compile] Error 2

    make[1]: Leaving directory `/home/pon/qca/qca.git/qsdk'

    有以下解释

    http://blog.csdn.net/luckywang1103/article/details/38112281

    在linux中包含头文件时,有不少类似如下的写法:#include<asm/types.h>,但在linux kernel的include文件夹下并没有这个文件夹,倒是有不少以asm打头的文件夹,如:asm_powerpc、asm_ppc等。

    源代码中没有asm这个文件夹,asm是一个符号连接,只有在你的主makefile的ARCH 变量赋值,编译内核的时候根据ARCH 的配置,

    临时的生成asm文件夹及其下的文件,然后指向对应的体系结构的文件,如/include/asm-arm/ ,/include/asm-x86/

    这样#include <asm/types.h> ==/include/asm-x86/types.h

    错误1,2的解决方法:

    上面两个问题是编译kernel没有编译通过:

    修改makefile中的make如下:

    /home/pon/qca/qca.git/qsdk/package/utils/pfring/src/kernel/Makefile:

    修改前:

    $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules

    修改后:

    make CROSS_COMPILE=arm-openwrt-linux-uclibcgnueabi- ARCH=arm -C /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/linux-3.14.77/ M=/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/kernel EXTRA_CFLAGS='${EXTRA_CFLAGS}' modules

    注意:此处存在隐患,如果工程更改了位置,此处需要路径需要修改;

    错误3

    checking for gcc... arm-openwrt-linux-uclibcgnueabi-gcc

    checking whether the C compiler works... yes

    checking for C compiler default output file name... a.out

    checking for suffix of executables...

    checking whether we are cross compiling... configure: error: in `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland':

    configure: error: cannot run C compiled programs.

    If you meant to cross compile, use `--host'.

    See `config.log' for more details

    make[4]: *** [lib/Makefile] Error 1

    make[4]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland'

    make[3]: *** [all] Error 2

    make[3]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring'

    make[2]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/.built] Error 2

    make[2]: Leaving directory `/home/pon/qca/qca.git/qsdk/package/utils/pfring'

    make[1]: *** [package/utils/pfring/compile] Error 2

    make[1]: Leaving directory `/home/pon/qca/qca.git/qsdk'

    make: *** [package/utils/pfring/compile] 错误 2

    原因:

    没有编译平台信息;

    解决:

    在编译平台上运行uname -m,查看平台信息,将其放在--host=后面

    修改文件package/utils/pfring/src/userland/Makefile,增加--host=arm

    lib/Makefile:

            ./configure --host=arm

    错误4

    ar rs libpfring.a pfring.o pfring_mod.o pfring_utils.o pfring_mod_stack.o pfring_hw_filtering.o pfring_hw_timestamp.o pfring_mod_sysdig.o          `ar t ../nbpf/libnbpf.a | grep -F .o | tr ' ' ' '`

    ranlib libpfring.a

    =*= making library libpfring.so =*=

    gcc -Wl,-soname,libpfring.so.1 -g -shared pfring.o pfring_mod.o pfring_utils.o pfring_mod_stack.o pfring_hw_filtering.o pfring_hw_timestamp.o pfring_mod_sysdig.o          `ar t ../nbpf/libnbpf.a | grep -F .o | tr ' ' ' '` -lpthread  -lrt -ldl -lnl-genl-3 -lnl-3    -o libpfring.so

    /usr/bin/ld: error: cannot find -lnl-genl-3

    /usr/bin/ld: error: cannot find -lnl-3

    collect2: ld returned 1 exit status

    make[5]: *** [libpfring.so] Error 1

    make[5]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland/lib'

    make[4]: *** [libpfring] Error 2

    make[4]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland'

    make[3]: *** [all] Error 2

    make[3]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring'

    make[2]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/.built] Error 2

    make[2]: Leaving directory `/home/pon/qca/qca.git/qsdk/package/utils/pfring'

    make[1]: *** [package/utils/pfring/compile] Error 2

    make[1]: Leaving directory `/home/pon/qca/qca.git/qsdk'

    make: *** [package/utils/pfring/compile] 错误 2

    思路:

    提示缺少两个库libnl-genl-3.so,libnl-3.so

    pon@ubuntu:~/qca/qca.git/qsdk/build_dir$ find -name libnl-genl-3.so

    ./target-arm_cortex-a7_uClibc-1.0.14_eabi/libnl-3.2.21/ipkg-install/usr/lib/libnl-genl-3.so

    ./target-arm_cortex-a7_uClibc-1.0.14_eabi/libnl-3.2.21/lib/.libs/libnl-genl-3.so

    pon@ubuntu:~/qca/qca.git/qsdk/build_dir$

    pon@ubuntu:~/qca/qca.git/qsdk/build_dir$ find -name libnl-3.so

    ./target-arm_cortex-a7_uClibc-1.0.14_eabi/libnl-3.2.21/ipkg-install/usr/lib/libnl-3.so

    ./target-arm_cortex-a7_uClibc-1.0.14_eabi/libnl-3.2.21/lib/.libs/libnl-3.so

    pon@ubuntu:~/qca/qca.git/qsdk/build_dir$

    搜索文档发现是有有这两个库,只是编译过程中没有找到这两个库;

    在package/utils/pfring/src/userland/configure:3605行通过-L加入.so绝对路径,编程错误提示

    unsupported ELF machine number 40

    考虑此处应该引用编译平台的库文件。在系统/usr/lib下没有找到libnl-genl-3.so和libnl-3.so,通过下面命令按照这两个库

    sudo apt-get install libnl-3-dev

    sudo apt-get install libnl-genl-3-dev

    然后编译通过,编译后运行

    file pfring/userland/lib/libpfring.so

    pfring/userland/lib/libpfring.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x889bffb8f6b7d868873ea99fa9cfd5a0cd91a8e0, not stripped

    说明没有通过交叉编译生产lib库;

    在package/utils/pfring/src/userland/Makefile中make增加参数

    make CROSS_COMPILE=arm-openwrt-linux-uclibcgnueabi- ARCH=arm

    错误5

    编译后

    cc1: note: someone does not honour COPTS correctly, passed 0 times

    =*= making library libpfring.a =*=

    ar rs libpfring.a pfring.o pfring_mod.o pfring_utils.o pfring_mod_stack.o pfring_hw_filtering.o pfring_hw_timestamp.o pfring_mod_sysdig.o          `ar t ../nbpf/libnbpf.a | grep -F .o | tr ' ' ' '`

    ranlib libpfring.a

    =*= making library libpfring.so =*=

    arm-openwrt-linux-uclibcgnueabi-gcc -Wl,-soname,libpfring.so.1 -g -shared pfring.o pfring_mod.o pfring_utils.o pfring_mod_stack.o pfring_hw_filtering.o pfring_hw_timestamp.o pfring_mod_sysdig.o          `ar t ../nbpf/libnbpf.a | grep -F .o | tr ' ' ' '` -lpthread  -lrt -ldl -lnl-genl-3 -lnl-3    -o libpfring.so

    /home/pon/qca/qca.git/qsdk/staging_dir/toolchain-arm_cortex-a7_gcc-4.8-linaro_uClibc-1.0.14_eabi/lib/gcc/arm-openwrt-linux-uclibcgnueabi/4.8.3/../../../../arm-openwrt-linux-uclibcgnueabi/bin/ld: nbpf_mod_rdif.o: Relocations in generic ELF (EM: 3)

    /home/pon/qca/qca.git/qsdk/staging_dir/toolchain-arm_cortex-a7_gcc-4.8-linaro_uClibc-1.0.14_eabi/lib/gcc/arm-openwrt-linux-uclibcgnueabi/4.8.3/../../../../arm-openwrt-linux-uclibcgnueabi/bin/ld: nbpf_mod_rdif.o: Relocations in generic ELF (EM: 3)

    nbpf_mod_rdif.o: error adding symbols: File in wrong format

    collect2: error: ld returned 1 exit status

    make[5]: *** [libpfring.so] Error 1

    make[5]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland/lib'

    make[4]: *** [libpfring] Error 2

    make[4]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland'

    make[3]: *** [all] Error 2

    make[3]: Leaving directory `/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring'

    make[2]: *** [/home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/.built] Error 2

    make[2]: Leaving directory `/home/pon/qca/qca.git/qsdk/package/utils/pfring'

    make[1]: *** [package/utils/pfring/compile] Error 2

    make[1]: Leaving directory `/home/pon/qca/qca.git/qsdk'

    make: *** [package/utils/pfring/compile] 错误 2

    原因:

    file pfring/userland/lib/nbpf_mod_rdif.o,

    nbpf_mod_rdif.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not strippe

    说明没有按照交叉编译编译生成nbpf_mod_rdif.o

    解决:

    修改/pfring/src/userland/nbpf/Makefile文件“

    CC=arm-openwrt-linux-uclibcgnueabi-gcc

    错误6

    编译成功后,将其拷贝到/usr/lib下会出现下面错误:

    install -d -m0755 /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/ipkg-ipq806x/pfring/usr/lib

    cp -fpR /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/userland/lib/*.so /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/ipkg-ipq806x/pfring/usr/lib

    find /home/...../build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/pfring/ipkg-ipq806x/pfring -name 'CVS' -o -name '.svn' -o -name '.#*' -o -name '*~'| xargs -r rm -rf

    Package pfring is missing dependencies for the following libraries:

    libnl-3.so.200

    libnl-genl-3.so.200

    libpthread.so.1

    librt.so.1

    解决方法:

    在/usr/lib下有libnl-3.so.200,libnl-genl-3.so.200,libpthread.so.1,librt.so.1,但需要建立软连接;

    这四个文件存在于文件系统中,如下:

    build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/root-ipq806x/usr/lib/libnl-3.so.200

    uild_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/root-ipq806x/usr/lib/libnl-genl-3.so.200

    build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/root-ipq806x/lib/libpthread.so.1

    build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/root-ipq806x/lib/librt.so.1

    将其拷贝到下面文件下:

    /package/utils/pfring/src/userland/deplib,

    并修改

    package/utils/pfring/Makefile,增加下面代码:

    $(CP) $(PKG_BUILD_DIR)/userland/deplib/* $(1)/usr/lib

  • 相关阅读:
    Spring Boot启动命令参数详解及源码分析
    面试题-关于Java线程池一篇文章就够了
    Spring Boot中@ConditionalOnProperty使用详解
    Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
    Spring Boot 注解之ObjectProvider源码追踪
    软件从业者不可不读的一本书
    SpringBoot之DispatcherServlet详解及源码解析
    书终于交稿了,聊聊写技术书这件事
    Python IDE:pycharm
    python安装
  • 原文地址:https://www.cnblogs.com/mahj/p/8392500.html
Copyright © 2020-2023  润新知