简易解inode认证实战


1

2

3

4

5

6、交叉编译


经过一番折腾,我们终于写完了这一个认证过程,并且在Linux系统上运行正常。

本篇主要内容为编译&&交叉编译


Hello World编译流程:

一、假定我们有这么一个helloworld.c的文件

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("hello world");return 0;
}

(1)我们可以用gcc来编译

gcc -c helloworld.c

命令执行后,没有错误的话,会多出一个文件helloworld.o

(2)也可以用g++来编译

g++ -c helloworld.c

同样的,多出了.o文件

(3)连接,同样用gcc或者g++都可以

gcc helloworld.o -o helloworld

g++ helloworld.o -o helloworld

执行完后,会有如下:helloword文件,

输入如下命令执行:

./helloworld

 二、如果我们的文件是cpp文件,即C++

#include <iostream>
using namespace std;
int main()
{cout<<"hello world"<<endl;return 0;
}

则,编译:可用gcc或g++,   连接:一般只能用g++。

若链接用gcc,大概会报如下错误:

三、关于Makefile

我们可以使用makefile来将编译和连接的步骤连起来,相当于一个脚本

.c的Makefile

helloworld : helloworld.o$(CC) $(LDFLAGS) helloworld.o -o helloworldhelloworld.o : helloworld.c$(CC) $(CFLAGS) -c helloworld.cclean :rm *.o

.cpp的Makefile

helloworld : helloworld.o$(CXX) $(LDFLAGS) helloworld.o -o helloworldhelloworld.o : helloworld.cpp$(CXX) $(CFLAGS) -c helloworld.cppclean :rm *.o

就是把CC改成CXX而已,

CC:指用gcc

CXX:指用g++

然后在目录下执行make,即生成.o 以及执行文件helloworld

执行make clean,则会清除.o文件


一、Debian Linux下编译&&连接

(1)先检查一下我们的代码包括了哪些文件

  • main.cpp
  • MD5.cpp
  • MD5.h
  • packethandle.cpp
  • packethandle.h

(2)由上面的helloworld例子,我们可以跟着写出Makefile如下,注意到是CPP,因此用CXX:

Makefile:

main : main.o MD5.o packethandle.o$(CXX) $(LDFLAGS) main.o MD5.o packethandle.o  -lpcap  -Istdc++ -o mainMD5.o : MD5.h MD5.cpp$(CXX) $(CFLAGS) -c MD5.cpppackethandle.o : packethandle.h packethandle.cpp$(CXX) $(CFLAGS) -c packethandle.cpp -lpcapmain.o : main.cpp$(CXX) $(CFLAGS) -c main.cpp -lpcapclean :rm *.o

(3)执行一下make,不报错的话,有如下文件

(4)测试一下文件是否可以正常运行:

ok,正常运行,那么在Debian Linux下编译连接工作就到这里。接下来就是交叉编译了


二、交叉编译

(1)先确定好固件类型、版本号,我们才能选择对应的SDK,否则编译出来的程序不能在平台上运行【很重要】

比如我有不可描述的K2路由器,则进入192.168.1.1,描述如下

可以看到,我们路由器运行pandoraBox 17.09版本

当然,我们也可以用xshell,192.168.1.1,端口22,连接后有如下,也可以看版本

(2)确定版本后,我们选择对应SDK下载【当然,也要知道你路由器的硬件配置,主要是CPU】

  • 下载SDK的地址:http://download.pandorabox.com.tw:99/pandorabox/17.09/
  • 我的路由是MT7620的,那么我就下载7620的SDK,注意,标明了SDK的才是,其他都是编译好的固件
  • 我选了下图的来下载:

(3)将下载文件放入虚拟机,(必备啊)

  • mkdir build         我新建了个文件夹来放
  • tar xvJf  ***.tar.xz  ,解压
tar xvjf PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64.tar.xz
  • 解压完后,需要在bashrc文件上加入对应环境
  • 可以改/etc/bash.bashrc  或者/home/$USER/.bashrc    ,$USER是你的用户名,自行替换即可
  • 这里我改/home/$USER/.bashrc 文件
gedit /home/msi/.bashrc

在文件末尾,添加类似如下,至于路径,则自行根据环境修改【即不要直接复制我的,根据自己环境修改】

export PATH=$PATH:/home/msi/build/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-1.0.x/bin
export STAGING_DIR=/home/msi/build/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/staging_dir/

(4)检查toochains环境配置是否完成

  • 在命令行中输入lip, 按TAB,看是否会自动补全
  • 如下:

自动补全,则环境配置完成

(5)尝试利用mipsel-openwrt-linux-gcc,来编译连接我们刚刚的helloworld

  • 在helloworld目录下,执行
mipsel-openwrt-linux-g++ -c helloworld.cpp
mipsel-openwrt-linux-g++  helloworld.o -o helloworld

如果编译链接报错,那么可能是本机缺少一些SDK运行所需的库,先检查一下,

一个关键的c库【提示什么cloog、C compiler cannot可以尝试以下来解决】:

sudo apt-get install ccache
sudo apt-get update
sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk
sudo apt-get install subversion mercurial
  • 这个操作,实际上就是交叉编译了,我们利用的是SDK中的Pandorabox平台的编译器
  • 这个过程,很像上面一开始的编译连接过程,只不过是gcc变成了lip。。。。-gcc。
  • 我们尝试在Debian Linux下执行编译出来的文件,提示错误,这是正常的,因为这是openwrt环境下的可执行文件

(6) 接下来,将这个helloworld文件,从虚拟机拖到电脑上,再利用winscp工具,将它上传到路由器上,看能否执行

  • winscp到处都能下,就不提供下载地址了
  • 上传的步骤如下:
  • 打开winscp,登录 192.168.1.1 账户 root 密码 admin,然后将helloworld拖到root目录下

  • 再登录XSHELL,执行如下:
chmod +x helloworld
./helloworld
  • 如果可正常输出,则表示SDK版本选择对了
  • 如果提示缺失一个什么libstdc++.so.6文件,而你的路由此时不能上网,那么可以回到虚拟机,在SDK的文件下中寻找该文件,然后将libstdc++.so.6文件拖到路由器的/lib 目录即可
  • 如果提示segment fault,那么很可能你的SDK版本对不上你的固件,也有可能是程序的问题,但是一般helloworld不会出现这个问题,所以helloworld的作用也在这里体现了
  • 如果你的libstdc++.so.6文件是网上下载的,也有可能版本不对,貌似也会出现segment fault的问题
  • 如果执行输出如下,恭喜你,可以进行下一步操作了

(7)既然成功交叉编译了hellowrold,那么我们可以用同样的套路来编译我们的认证程序

  • 在程序目录下,依次执行
mipsel-openwrt-linux-g++ -c MD5.cpp
mipsel-openwrt-linux-g++ -c packethandle.cpp
mipsel-openwrt-linux-g++ -c main.cpp
  • 链接obj
mipsel-openwrt-linux-g++ main.o MD5.o packethandle.o -o main
  • 一般来说,会报错如下:

原因是,我们的认证程序用到了libpcap,而这个libpcap并没有在SDK的平台上,因此,我们需要给它装上这个库

a)下载libpcap-1.6.2

链接:https://pan.baidu.com/s/16RO8ByXcXclj0Cbgoe105Q 提取码:o7dl

b)解压,进入对应文件夹

c)安装,注意并非安装到本机目录,而是要安装到SDK的目录下,因此./configure时,要添加参数

./configure --host=mipsel CC=/home/msi/build/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-1.0.x/bin/mipsel-openwrt-linux-gcc --prefix=/home/msi/build/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/PandoraBox-SDK-ralink-mt7620_gcc-4.8-linaro_uClibc-1.0.x.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-1.0.x/ --with-pcap=linux

--host 表示你要安装的平台,然后  CC= 填写你SDK中toolchain-mipsel,gcc的地址,

--prefix表示安装的路径,--with-pcap=linux , 【路径那些,按照你的本地环境SDK路径改就好了】

d)安装成功,继续操作

  • 再次链接obj,这时要加上参数  -pcap,表示用这个库
mipsel-openwrt-linux-g++ main.o MD5.o packethandle.o -pacp -o main

这时候应该就可以链接成功了,生成如下

(8)路由器上测试我们的程序

  • 同样winscp上传
  • chmod +x main
  • ./main
  • 如果提示缺失libstdc++.so.6,按上面提到的方法处理即可【后面会有更好的方法解决】
  • 如果提示缺libpcap库,这里给一个下载地址尝试安装该库:链接:https://pan.baidu.com/s/15wWwMcqzaMnpIYWD6-Ihdw 提取码:mcfd   【一般来说应该不会,貌似我们的程序静态编译了这个库?】
  • 路由器opkg安装ipk文件,貌似要进行配置,请参见:https://blog.csdn.net/weixin_29465425/article/details/82668292

成功运行如下:

(9)到这里,我们的交叉编译可执行文件基本就OK了。接下来会讲利用SDK生成IPK安装包


三、利用SDK生成IPK安装包

(1)如果我们交叉编译的可执行文件可以在路由上运行,那么实际上已经成功了大半

(2)接下来,我们还是先以helloworld为例子,生成其ipk文件

  • 进入程序文件夹,新建一个src文件夹,并将helloworld.cpp  Makefile移入src文件夹
  • 检查src文件夹内的Makefile文件
  • src:Makefile:  里面都是$(CXX), 而不是直接的g++,因为生成ipk时会自动改成mipsel-openwrt-linux-g++
helloworld : helloworld.o$(CXX) $(LDFLAGS) helloworld.o -o helloworldhelloworld.o : helloworld.cpp$(CXX) $(CFLAGS) -c helloworld.cppclean :rm *.o

(3)我们在原来Makefile【上面的Makefile已经被移到src文件夹了】的位置,重新建一个Makefile:

警告:从这里复制过去的Makefile,可执行命令前面都变成空格,请自行将空格重新替换为TAB,否则接下来你会很头疼,会提示什么missing separator

include $(TOPDIR)/rules.mkPKG_NAME:=helloworld
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/helloworldSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Helloworld -- prints a snarky message
endefdefine Package/helloworld/descriptionIt's my first package demo.
endefdefine Buile/Preparemkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/
endefdefine Package/helloworld/installecho "Here is Package/install***********************"$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef$(eval $(call BuildPackage,helloworld))
  • 关于Makefile,这里不说太多【因为个人也不太懂】
  • 只讲关键的:
  • PKG_NAME:=  _这里填文件夹的名字_, 例:文件夹名字为helloworld,则填hellworld
  • define Package/_这里同上_,  即宏定义中Package/后面跟着文件夹名字,
  • 重点:define Package/helloworld/install 宏定义中,第三条 $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/   ,红字helloworld并非代表文件夹,而是代表最终输出的可执行文件的名字,如果你src中的Makefile 链接 -o main,则红字改成main
  • 其他一般不会有太大改动

(4)到这里,文档编辑类基本完成,先看看目录包含什么:

(5)接下来,将整个文件夹复制到SDK目录的Package目录下

(6)在SDK目录下,执行 make menuconfig,如果提示错误,请检查依赖库是否安装(自行百度)

make menuconfig

出现如下界面:

  • 可在键盘敲 "/",进入搜索模式,然后输入helloworld进行搜索,搜索结果显示在Utilities,选择它,按空格进入
  • 选中helloworld,按空格,使它前面的M变成*号,表示参加build
  • 保存,退出

(7)返回命令行,执行

make package/helloworld/compile

输出:

然后报错如下:

Package helloworld is missing dependencies for the following libraries:
libstdc++.so.6

说少了这个依赖库,但是实际上我们是可以在SDK包中找到这个文件的,查找结果如下:

结合实际编译执行的感受,他这个提示可能是说,他这个版本的固件本身不带这个库,实际操作上也是,编译CPP程序到刷了这个PandoraBox 17.09固件上执行,会提示缺失这个库

解决方案:

解决方案参考自:https://my.oschina.net/hevakelcj/blog/411944  ,并对其方案三(这里的方案2)作出了修正

方案(1):在 Makefile 中的 Package/helloworld/install 宏中准备所需的库文件,即可以在这个宏里,将它需要的几个库文件复制到 $(1) 对应的目录下。

即修改Makefile:

define Package/helloworld/install$(INSTALL_DIR) $(1)/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin$(INSTALL_DIR) $(1)/usr/lib$(INSTALL_DATA) $(TOOLCHAIN_DIR)/lib/libstdc++.so.6 $(1)/usr/lib
endef

警告:从这里复制过去的Makefile,可执行命令前面都变成空格,请自行将空格重新替换为TAB,否则接下来你会很头疼,会提示什么missing separator

方案(2):在 Makefile 文件的 Package/helloworld宏中加 DEPENDS 描述

define Package/helloworld...<略>DEPENDS+=libstdcpp
endef

警告:从这里复制过去的Makefile,可执行命令前面都变成空格,请自行将空格重新替换为TAB,否则接下来你会很头疼,会提示什么missing separator

(8)Makefile修改完成后,重新 make package/helloworld/compile

make package/helloworld/compile

这时候应该没有报错了。

我们去bin目录看一下生成的IPK

(9)对于我们的认证程序,操作步骤基本同步骤(1)~(8),这里就不再展示了

(10)将编译完成的IPK上传的路由器root目录,进行安装

chmod +x helloworld_1_mipsel_24kec_dsp.ipk
opkg install helloworld_1_mipsel_24kec_dsp.ipk

安装完成后,直接用helloworld,即可执行

(11)如果编译过程中,make Package/inode/compile,报错如下:

Package inode is missing dependencies for the following libraries:
libc.so.6
libm.so.6
libpcap.so.0.8

建议清理 掉所有的.o和可执行文件,重新生成

简易解inode802.1x认证实战(6)交叉编译相关推荐

  1. Windows Server 2008 R2Cisco2960 配置Radius服务 实现802.1x认证 实战

    实战配置Windows Server 2008 R2 Radius服务 与Cisco 2960 实现 802.1x认证 实验拓扑 1.Radius服务器 安装 dc  域名 wjl.com ,和ca  ...

  2. wifi无线认证,802.1x认证上网方式详解

    图片描述(最多50字) 这里,主要介绍一下802.1x认证上网: 1 802.1x认证上网简介802.1x认证上网是指在无线网络认证界面,点击相应的无线网络,弹出账户密码输入框,用户输入账号密码的一种 ...

  3. AAA之802.1x认证详解(一)

    ACS上的配置:System Configuration 打开ACS的配置界面,点Network Configuration,在AAA Servers里点击Add Entry配置AAA服务器. 配置A ...

  4. 无线路由器上安装OpenWRT,在需要标准802.1x认证的网络中无线上网

    学校一直用H3C客户端上网,因此无法直接使用无线路由器.后来去一些论坛时常看见DD-WRT和OpenWrt这两个词,也初步了解到wpa_supplicant.njit-client.mentohust ...

  5. Web协议详解与抓包实战之HTTP1.1 学习笔记【一】

    Web协议详解与抓包实战之HTTP1.1[一] 前言 <Web协议详解与抓包实战>课程学习,陶辉老师主讲 学习内容: HTTP–TLS/SSL–TCP/IP自上而下根据应用学习web协议H ...

  6. 魔豆路由器802.1x认证(中山大学东校区)

    魔豆路由器802.1x认证(中山大学东校区) 最近更新:2015-04-25 时间过去了这么久,魔豆系统都已经更新了好多版了,据不完全统计,原先的应用sysu_802_1x不支持1.0以后的系统版本, ...

  7. lumen认证中出现unauthorized._网工知识角|一分钟搞定802.1x认证配置,了解三种授权模式的区别...

    k点上方蓝字关注公众号,坚持每天技术打卡 学网络,就在IE-LAB 国内最著名的高端网络工程师培养基地 今天让我们简单看下802.1x的基本配置. 我们先考虑一下配置接口的授权方式: 接口的802.1 ...

  8. 802.1x认证EAP包结构

    当用户需要访问外部网络时打开802.1X客户端程序,输入已经申请.登记过的用户名和密码,发起连接请求.此时,客户端程序将向设备端发出认证请求报文(EAPoL-Start),开始启动一次认证过程. 设备 ...

  9. ffmpeg解封装及解码实战

    ffmpeg解封装及解码实战 目录 封装格式相关函数 解封装流程 补充 分离AAC和H264 1. 封装格式相关函数 1. 基本概念 2. 相关函数 1. avformat_alloc_context ...

  10. python权限管理系统_Django 自定义权限管理系统详解(通过中间件认证)

    1. 创建工程文件, 修改setting.py文件 django-admin.py startproject project_name 特别是在 windows 上,如果报错,尝试用 django-a ...

最新文章

  1. Java学习总结:53(单对象保存父接口:Collection)
  2. jsp点击按钮弹出输入框_按键精灵UI界面的输入框原来是这样使用的
  3. java B2B2C Springcloud多租户电子商城系统-消息驱动的微服务(消费分区)
  4. Android Shape使用
  5. python3精要(61)-线性回归
  6. python爬虫和数据分析电脑推荐_大数据分析必备的5款Python爬虫库
  7. C# - DynamicObject with Dynamic
  8. python观察日志(part7)--可变长参数元祖
  9. 作者:周园春(1975-),男,中国科学院计算机网络信息中心研究员、博士生导师...
  10. TNFBA治疗极早期中轴型nrSpA随机双盲试验后长达6年的放射学随访
  11. python编写数据库连接工具_详解使用Python写一个向数据库填充数据的小工具(推荐)...
  12. 形式的化简与和式的展开
  13. el-dialog 一些问题 局中滚动
  14. CLR寄宿(中) 托管exe文件的加载和执行
  15. 将运算放大器(运放)用作比较器
  16. web前端开发基础入门教程之HTML5 浏览器支持
  17. html网页中加入音乐播放器,如何在网页中插入音乐播放器
  18. 互联网运营工作需要做什么?
  19. 如何在网页下载腾讯视频为本地MP4格式
  20. (极值点偏移问题的几种方案)已知$\dfrac{\ln x_1}{x_1}=\dfrac{\ln x_2}{x_2}$,求证:$x_1+x_22\text{e}$....

热门文章

  1. 关于 Axure 动态面板
  2. GIS制图人员的自我修养(1)--制图误区
  3. C# 如何在PDF文档中根据关键字查找文本并给文本设置背景颜色
  4. python中关于__new__和__init__的个人理解
  5. 小程序毕设作品之微信评选投票小程序毕业设计(4)开题报告
  6. JavaScript -- Map数据结构
  7. Linux查看系统自启动服务
  8. c51单片机渐变流水灯汇编语言,单片机闪烁灯流水灯汇编代码大全
  9. Android开机执行指定shell脚本
  10. Scala:par并行集合计算(fold、aggregate)结果与cpu内核线程的关系