aarch64-linux-gnu 交叉编译 libpcap

1. 交叉编译工具下载

首先确认交叉编译工具的版本,不同的开发板自带的GLIBC版本可能不同,因此可能出现最新的交叉编译工具编译出的软件不能运行的问题,例如编译后的软件需要的GLIBC版本为2.34,开发板支持的为2.29,可通过如下指令查看开发板上的glibc版本。

ls -l /lib/libc.so.6

当遇到该问题时,可通过更换低版本的交叉编译工具或者找开发板厂商索取相应的交叉编译工具的方式进行解决。

本文所使用的交叉编译工具为aarch64-linux-gnu,读者可根据自己的需求下载安装其他版本。

2.交叉编译工具安装

下载完成后,进入下载文件目录并对下载文件进行解压,ubuntu系统可打开Filss切换到对应的目录右键直接解压,或者通过命令行进行解压,如下所示:

tar -xvf gcc-linaro-12.0.1-2022.02-x86_64_aarch64-linux-gnu

解压完成之后切换到/usr/local目录下,创建aarch64文件夹,并将刚解压后的内容拷贝到该文件夹下,如下所示:

sudo mkdir aarch64

sudo cp -r /home/forlinx/aarch64/gcc-linaro-12.0.1-2022.02-x86_64_aarch64-linux-gnu/* /usr/local/aarch64

其中文件路径根据自己实际路径进行修改。

3.配置交叉编译工具环境变量

在/etc/profile文件末尾增加如下代码:

export PATH=$PATH:/usr/local/aarch64/bin

修改完成后重启系统。

重启完成之后,终端输入如下指令检查交叉编译工具是否安装成功。

aarch64-linux-gnu-gcc -v

如果指令能够正常执行,则交叉编译工具安装成功。

4.libpcap源码下载和编译

TCPDUMP网站下载libpcap源码,下载完成后进行解压:

tar -xvf libpcap-1.10.1.tar.gz

解压完成后进入解压后的目录并进行配置,如下所示:

cd libpcap-1.10.1/

libpcap源码没有Makefile文件,需要通过configure命令进行配置生成Makefile文件,配置指令如下所示:

./configure --host=aarch64-linux-gnu --with-pcap=linux

配置的过程中注意观察打印信息,如下所示:

checking build system type... x86_64-pc-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking target system type... aarch64-unknown-linux-gnu
checking for aarch64-linux-gnu-gcc... aarch64-linux-gnu-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out

在使用./configure指令进行配置的过程中,有可能因为权限问题导致配置出现问题,一般反应为添加sudo进行配置,如下所示:

sudo ./configure --host=aarch64-linux-gnu --with-pcap=linux

但是此时注意观察会发现,终端输出内容中aarch64-linux-gnu-gcc会找不到,如下所示:

checking build system type... x86_64-pc-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking target system type... aarch64-unknown-linux-gnu
checking for aarch64-linux-gnu-gcc... no
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out

系统将编译器更改为gcc,检查生成的Makefile 文件,如下所示:

LD = /usr/bin/ld
CC = gcc
AR = aarch64-linux-gnu-ar

其中CC为gcc。

出现该问题的原因为sudo和普通用户在执行指令的时候,sudo会默认重置用户设置的环境便令,导致aarch64-linux-gnu-gcc查找不到,通过尝试在sudo后增加-E等均无法解决该问题。需要在sudo后重新配置环境变量,如下所示:

sudo env PATH=$PATH ./configure --host=aarch64-linux-gnu --with-pcap=linux

这样即可在使用sudo指令的同时查找到用户设置的环境变量。

配置完成之后打开Makefile文件进行检查,内容如下所示:

prefix = /usr/local
exec_prefix = ${prefix}
datarootdir = ${prefix}/share
# Pathname of directory to install the configure program
bindir = ${exec_prefix}/bin
# Pathname of directory to install the rpcapd daemon
sbindir = ${exec_prefix}/sbin
# Pathname of directory to install the include files
includedir = ${prefix}/include
# Pathname of directory to install the library
libdir =  ${exec_prefix}/lib
# Pathname of directory to install the man pages
mandir = ${datarootdir}/man

# VPATH
srcdir = .
top_srcdir = .


#
# You shouldn't need to edit anything below.
#

LD = /usr/bin/ld
CC = aarch64-linux-gnu-gcc
AR = aarch64-linux-gnu-ar
LN_S = ln -s
...

确认其中CC=aarch64-linux-gnu-gcc,而不是CC=gcc。

同时修改Makefile文件中prefix参数,该参数为安装文件的存放位置,默认为/usr/local,将其修改为/usr/local/aarch64,因为在通过aarch64-linux-gnu-gcc编译自己的c程序源码的时候,例如头文件包含pcap.h,交叉编译的时候,默认查找的路径为交叉编译器所在的位置下的include文件夹,因此如果放在/usr/local目录下,会导致找不到pcap.h的问题。gcc和aarch64-linux-gnu-gcc在编译程序的过程中,头文件的搜索路径是不同的,这一点需要进行注意。

执行make指令进行编译。

make

make完成之后执行make install指令。

make install

执行make install有可能报错,如下所示:

/usr/bin/install: cannot create regular file '/usr/local/aarch64/lib/libpcap.so.1.10.1': Permission denied
ln: failed to create symbolic link '/usr/local/aarch64/lib/libpcap.so.1': Permission denied
ln: failed to create symbolic link '/usr/local/aarch64/lib/libpcap.so': Permission denied
Makefile:684: recipe for target 'install-shared-so' failed
make: *** [install-shared-so] Error 1

加入sudo指令进行尝试,如果不行,在sudo之前加入环境变量,如下所示:

sudo env PATH=$PATH make install

等待libpcap安装,libpcap安装完成后会在/usr/local/aarch64文件夹的lib目录里生成编译后的libpcap.a、libpcap.so等文件,同时在/usr/local/aarch64文件夹的include中生成所需要的头文件,包括pcap.h等,可进入这些文件夹中检查是否生成成功。

5.libpcap测试

编译完成之后需要对libpcap进行测试,创建Test.c文件,内容如下所示:

#include <pcap.h>
#include <stdio.h>

int main()
{
  char errBuf[PCAP_ERRBUF_SIZE], * device;
  
  device = pcap_lookupdev(errBuf);
  
  if(device)
  {
    printf("success: device: %s\n", device);
  }
  else
  {
    printf("error: %s\n", errBuf);
  }
  
  return 0;
}

通过aarch64-linux-gnu-gcc进行编译:

aarch64-linux-gnu-gcc Test.c -o Test -lpcap

如果出现以下提示

fatal error: pcap.h: No such file or directory

则说明未找到相关的头文件,网上介绍的很多方法为需要安装libpcap-dev,发现并不能解决问题,输入如下命令:

 echo 'main(){}' | aarch64-linux-gnu-gcc -E -v -

打印的结果如下所示:

...
ignoring nonexistent directory "/usr/local/aarch64/bin/../aarch64-linux-gnu/libc/usr/include/aarch64-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/aarch64/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/include
 /usr/local/aarch64/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/include-fixed
 /usr/local/aarch64/bin/../lib/gcc/aarch64-linux-gnu/6.3.1/../../../../aarch64-linux-gnu/include
 /usr/local/aarch64/bin/../aarch64-linux-gnu/libc/usr/include
End of search list.
...

可以看到,aarch64-linux-gnu-gcc头文件的搜索路径为交叉编译工具所在目录下的lib/gcc/…/include文件夹,这也是为什么之前在编译libpcap时修改prefix的原因,默认安装在/usr/local下的话,是无法找到对应的.h头文件的,如果此处编译出错,请检查之前的Makefile文件中的prefix参数是否修改。

如果头文件没问题,此处还可能出现如下错误:

cannot find -lpcap

其中lpcap即为libpcap的意思,表示未找到对应的libpcap库文件,我们可以通过手动制定库文件位置的方式进行编译,如下所示:

aarch64-linux-gnu-gcc -L /usr/local/aarch64/lib Test.c -o Test -lpcap

通过-L指令制定库文件,即libpcap.a、libpcap.so文件所在的位置即可。

如果还是提示找不到-lpcap,看一下是否/usr/local/aarch64/lib下安装了多个版本的libpcap,如果是,删除掉即可。

最后编译完成即可。

通过ftp工具将编译后的Test可执行程序复制到开发板,执行如下命令使该文件可执行:

chmod +x Test

然后执行:

./Test

程序可正常执行,正常输出如下所示:

success: device: eth0

至此,整个libpcap库交叉编译和测试完成。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐