CentOS6 上OpenWRT交叉编译

目的不是为了编译固件,而是为了一个是编译可执行文件,放倒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 就不错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值