CentOS6 上OpenWRT交叉编译

2023-02-23,,

目的不是为了编译固件,而是为了一个是编译可执行文件,放倒op的路由器上跑,另一个目的是安装一些开源软件折腾下(例如ss-lib),需要打包成 .ipk 格式

路由设备信息

erya@ERYA:~$ cat /proc/cpuinfo
system type     : Atheros AR9341 rev 1
machine         : Atheros DB120 reference board
processor       : 0
cpu model       : MIPS 74Kc V4.12
BogoMIPS        : 266.64
wait instruction    : yes
microsecond timers  : yes
tlb_entries     : 32
extra interrupt vector  : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0000, 0x0ff8, 0x0ff8, 0x0ff8]
isa         : mips1 mips2 mips32r1 mips32r2
ASEs implemented    : mips16 dsp dsp2
shadow register sets    : 1
kscratch registers  : 0
core            : 0
VCED exceptions     : not available
VCEI exceptions     : not available

erya@ERYA:~$ uname -a
Linux ERYA 3.10.10 #10 Mon Sep 7 10:04:34 CST 2015 mips GNU/Linux

怎么交叉编译出一个可执行文件 ?

现在Centos上测试,需要特殊的GCC,也叫toolchain工具链 文档, 大部分的教程的做法都是自己下载源码来 编译工具链,比较漫长的过程。

只找到了14.07版本预编译的工具链,15版本已经不提供了, toolchain没写是Ubuntu还是哪个发行版本,测试没成功 官方的交叉编译步骤 ,看样子还是需要源码编译 toolchain,然后在编译相应的软件。

Compile program for OpenWrt

OP交叉编译好教材 编译可执行文件

build-package-your-software-for-openwrt

centos openwrt 主要参考

中文安装wiki

Building Openwrt Packages

openwrt feed是什么? feeds 中对应的是一个软件list地址,可以把这些软件编译到openwrt固件中,使得系统使用更方面。

如果我只想编译 toolchain? 在编译配置的时候 make menuconfig 选择编译toolchain Build the OpenWrt based toolchainAdvanced configuration options 选择 gdb和 debugging symbols

编译包下载慢怎么解决? 编译时候下载的包一般在 ./dl/ 目录下,这里有个国内收集好的下载地址, 可以在编译下载中断的时候,在这里下载那些下载不到的包放到 dl目录,正常情况下是会有几个包下载不了。

———————- Centos6 编译toolchain ——————

用的是dreambox版本测试,不要用root用来操作,麻烦的是下载慢,编译慢(大概5个小时)

yum install -y subversion binutils bzip2 gcc gcc-c++ gawk gettext flex
yum install -y ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker
yum install -y glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget

$ git clone git://git.openwrt.org/14.07/openwrt.git
$ cd openwrt
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a
$ ./scripts/feeds list -s #查看feed源
$ make defconfig
$ make menuconfig #Target System,Subtarget
$ make V=s 2>&1 | tee build.log | grep -i error #等吧 很久

编译toolchain之后开始配置编译环境来编译 hello world,一种是编译成可执行文件,一种是编译成 ipk包。

直接编译可执行文件, hello.c放在 openwrt 根目录下

[lzz@orangleliu openwrt]$ cat hello.c
#include <stdio.h>
int main(void)
{
        printf("Hello World\n");
        return 0;
}

# 设置环境变量(可以写到文件中自动加载 如果LDCFLAGS,LD_LIBRARY_PATH文件夹为空,请看target-mips_34kc_uClibc-0.9.33.2)
export STAGING_DIR=/data/openwrt/staging_dir
export TOOLCHAIN_DIR=$STAGING_DIR/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
export LDCFLAGS=$TOOLCHAIN_DIR/usr/lib
export LD_LIBRARY_PATH=$TOOLCHAIN_DIR/usr/lib
export PATH=$TOOLCHAIN_DIR/bin:$PATH
$ mips-openwrt-linux-gcc hello.c -o hello

[lzz@orangleliu openwrt]$ file hello
hello: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 ... #在路由上测试可以执行

如果编译需要依赖其他动态库,例如lua,native 平台只要 -llua就行了,交叉编译怎么做呢?

是build toolchain时候没有选择liblua,重新选择后编译,发现 头文件在 staging_dir/target-xxx 文件下,staging/toolchain-xxx下并没找到 lua.h等文件(配置有没搞懂的地方)

比如说编译时候少了一个库,每次需要增加的时候都要重新编译整个工具链,非常慢,怎么搞?

一个思路是利用编译的cache, openwrt中也有ccache,开发环境可以开启,

一个思路是只编译需要的部分,在 make menuconfig 选择到包,然后 类似make package/network/utils/curl/compile V=s

编译之后生成的 build_dir 和 staging_dir 有什么不同?

build_dir 存放是源码解压之后的文件,使用他们来编译

staging_dir 编译好的工具,包,固件等

toolchain 是给host主机用的, target 是给目标主机(openwrt安装机器)用的

menuconfig Libraries选项中,module 和 build-in 的区别是什么?

module选择的时候显示M,表示只编译成ipk,并不打到固件中

编译好的 .ipk在哪里 ?

./bin/ 目录下, 例如 ./bin/ar71xx/packages/

Makefile编译ipk && 开源项目编译(例如tcpdump,nginx), 后续使用时记录

编译一个ipk

开源项目的第三方packages是最好的学习案例 https://github.com/shadowsocks/openwrt-shadowsocks 就不错

CentOS6 上OpenWRT交叉编译的相关教程结束。

《CentOS6 上OpenWRT交叉编译.doc》

下载本文的Word格式文档,以方便收藏与打印。