--------------------------------------------------------------------------------
author:hjjdebug
date: 2019年 03月 04日 星期一 12:13:27 CST
description:
此文档,用来简述一个开源软件,如何进行交叉编译移植到嵌入式平台上,
以x86-64编译arm平台的arp-scan 程序为例,简述了编译带依赖库,不带依赖库的配置,编译方法!
--------------------------------------------------------------------------------
1. 下载arp-scan 源码,阅读其README,是标准autotool 工具的编译方式
按照其说明方式, autoreconf --install, ./congigure, make , make install 方式进行。
期间会用到libpcap 库.所以你需要先安装libpcap 库. sudo apt-get install libpcap-dev
这样小试身手,看看环境等工具是否齐全.
2. 下面我们直奔主题,用arm编译工具arm-linux-gnueabihf-gcc 來编译arp-scan 源码
$ CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux --prefix=/usr/hjj
解释一下:
CC=arm-linux-gnueabihf-gcc 是设置CC 变量,用arm编译工具进行编译
./configure 是重新生成Makefile
--host=arm-linux 是说明是交叉编译,编译的目标文件不需要在x86上测试
--prefix=/usr/hjj 是重新指定make install 的安装路径
上面是泛泛之谈,还要认真理解!
$CC=arm-linux-gnueabihf-gcc ./configure
checking whether we are cross compiling... configure: error: in `/home/hjj/gitSource/arp-scan':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
以上错误,要求你加上--host 以说明是交叉编译,不要进行本地运行测试
$CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux
configure: Cannot find pcap library containing pcap_open_live
configure: error: Check that you have libpcap version 1.0 or later installed
以上错误,说明缺少libpcap 的库, 这个库,当然要是arm 库了
3. 交叉编译libpcap 库
这个比较简单,因为它不再需要别的库了,不过在配置编译过程中,系统需要先安装flex,bison两个工具包
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux --prefix=/usr/hjj
make
make install 后将库文件安装到了/usr/hjj/lib 目录下
4. 编辑/etc/ld.conf, 在合适的位置加入/usr/hjj/lib 这个连接查找目录,然后执行sudo ldconf 使配置生效
5. 重新执行arm-scan 的配置,但它依然报找不到libpcap 库错误,这时候我想了一想,应该是没有去找/usr/hjj/lib
目录,我们把它的测试文件拎出来试验一下:
| ifdef __cplusplus
| extern "C"
| #endif
| char pcap_open_live ();
| int
| main ()
| {
| return pcap_open_live ();
| ;
| return 0;
| }
configure:4271: arm-linux-gnueabihf-gcc -o conftest -Wall -Wshadow -Wwrite-strings -Wextra -fstack-protector -D_FORTIFY_SOURCE=2 -Wformat
-Wformat-security conftest.c -lpcap >&5
/home/hjj/bin/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/ld:
cannot find -lpcap
collect2: error: ld returned 1 exit status
configure:4271: $? = 1
我们看到确实是没有加入-L/usr/hjj/lib, 看来ldconf 只是针对x86-64的,那如何加入连接路径呢? 用CFLAGS 变量
6. 添加编译变量export CFLAGS="-L/usr/hjj/lib"
然后:
$ CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux --prefix=/usr/hjj
配置通过!
由于在编译的时候还会有找不到头文件的问题,完整的编译变量应该是
export CFLAGS="-I/usr/hjj/include -L/usr/hjj/lib"
$ CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux --prefix=/usr/hjj
配置通过,编译通过!
可以把arp-scan 程序copy 到arm板上运行了。
把依赖库也要copy 过去 libpcap.so.0.8
cp libpcap.so.1.5.3 /usr/lib
ln -s libpcap.so.1.5.3 libpcap.so.0.8
执行,./arp-scan -l 有几个警告,不理会它也行, 不影响运行
如果想去掉, 把生成的文件3个txt 文本也copy到嵌入式对应目录就可以了,这是mac地址到vendor的映射文件
WARNING: Cannot open MAC/Vendor file /usr/hjj/share/arp-scan/ieee-oui.txt: No such file or directory
WARNING: Cannot open MAC/Vendor file /usr/hjj/share/arp-scan/ieee-iab.txt: No such file or directory
WARNING: Cannot open MAC/Vendor file /usr/hjj/share/arp-scan/mac-vendor.txt: No such file or directory
所以再总结一下: CC指明了编译器, host说明主机类型是否是交叉编译,CFLAGS用来调整CC的编译选项,--prefix说明安装目录,
用bcompare 可以观察到底引起了什么变化,变化都是很小的,甚至可以直接修改Makefile!!