zoukankan      html  css  js  c++  java
  • 交叉编译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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/mahj/p/8392500.html
Copyright © 2011-2022 走看看