如何交叉编译mkfs.jffs2等工具链mtd-utils

如何交叉编译mkfs.jffs2等工具链mtd-utils,第1张

首先说明一下:

在YAFFS2源文件的utils目录下,执行make就可以生成 mkyaffs2image工具,执行

.(要制作yaffs2的目录) (目标镜像)/mkyaffs2image

acl_2.2.47.orig.tar.gz

lzo-2.03.tar.gz

mtd-utils_20080508.orig.tar.gz

zlib-1.2.3.tar.gz

mkfs.jffs2.for.arm-linux-gcc.3.4.1平台.tar.bz2

mkfs.jffs2.for.arm-linux-gcc.4.3.2平台.tar.bz2

mkfs.jffs2.for.pc平台.tar.bz2

如果只需要mkfs.jffs2工具,那么ubuntu 8.10下直接安装jffnms软件包即可,

luther@gliethttp:~$ sudo apt-get install jffnms

如果需要将jffs2移植到arm开发板上,那么就需要下载源码进行交叉编译了,这就是本文的内容.

1.下载工具软件源码包

luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz

luther@gliethttp:~$ wget http://www.zlib.net/zlib-1.2.3.tar.gz

luther@gliethttp:~$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz

luther@gliethttp:~$ mkdir libs 用来存放下面生成的lib库.

2.编译zlib库

luther@gliethttp:~/zlib-1.2.3$ ./configure --prefix=~/libs --shared

对于交叉编译输入如下指令

luther@gliethttp:~/zlib-1.2.3$ CC=arm-linux-gcc ./configure --prefix=~/libs --shared

luther@gliethttp:~/zlib-1.2.3$ make -j4

luther@gliethttp:~/zlib-1.2.3$ make install

luther@gliethttp:~$ tree ~/libs

/home/ubuntu/libs

|-- include

| |-- zconf.h

| `-- zlib.h

|-- lib

| |-- libz.so ->libz.so.1.2.3

| |-- libz.so.1 ->libz.so.1.2.3

| `-- libz.so.1.2.3

`-- share

`-- man

`-- man3

`-- zlib.3

5 directories, 6 files

这就表示完成了.

3.编译lzo库

luther@gliethttp:~/lzo-2.03$ ./configure --prefix=/home/ubuntu/libs --enable-shared

对于交叉编译输入如下指令

luther@gliethttp:~/lzo-2.03$ CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/ubuntu/libs --enable-shared --disable-static

这个还必须要绝对路径才行.

luther@gliethttp:~/lzo-2.03$ make

luther@gliethttp:~/lzo-2.03$ make install

luther@gliethttp:~$ tree ~/libs

.

|-- include

| |-- lzo

| | |-- lzo1.h

| | |-- lzo1a.h

| | |-- lzo1b.h

| | |-- lzo1c.h

| | |-- lzo1f.h

| | |-- lzo1x.h

| | |-- lzo1y.h

| | |-- lzo1z.h

| | |-- lzo2a.h

| | |-- lzo_asm.h

| | |-- lzoconf.h

| | |-- lzodefs.h

| | `-- lzoutil.h

| |-- zconf.h

| `-- zlib.h

|-- lib

| |-- liblzo2.a

| |-- liblzo2.la

| |-- liblzo2.so ->liblzo2.so.2.0.0

| |-- liblzo2.so.2 ->liblzo2.so.2.0.0

| |-- liblzo2.so.2.0.0

| `-- libz.a

`-- share

`-- man

`-- man3

`-- zlib.3

6 directories, 22 files

手工将静态库删掉就行了,

如果是arm平台还需要strip优化.

4.编译mtd-utils-20080508前的准备工作.

编译之前的代码工作

luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/a/acl/acl_2.2.47.orig.tar.gz

luther@gliethttp:~$ mkdir libs/include/sys -p

luther@gliethttp:~$ cp acl-2.2.47/include/acl.h libs/include/sys

luther@gliethttp:~/mtd-utils-20080508$ export LD_LIBRARY_PATH=~/libs/lib:$LD_LIBRARY_PATH

如果还找不到-llzo2,那么把他拷到/usr/lib下,对于交叉编译器,就是拷贝到

比如

luther@gliethttp:~/libs/lib$ sudo cp -a * /vobs/tools/arm-tools/arm-linux-gcc-3.4.1/arm-linux/lib/

luther@gliethttp:~/mtd-utils-20080508$ vim Makefile

修改安装路径

DESTDIR=.

SBINDIR=gliethttp/sbin

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

修改CFLAGS变量

CFLAGS := -I./include -I/home/ubuntu/libs/include $(OPTFLAGS)

如果是arm-linux-gcc定义为

CFLAGS := -I./include -I/home/ubuntu/libs/include -DAI_ADDRCONFIG=0x0020 $(OPTFLAGS)

来自/usr/include/netdb.h

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/Makefile

DESTDIR := ~/mtd-utils-20080508

SBINDIR=gliethttp/sbin

MANDIR=gliethttp/share/man

INCLUDEDIR=gliethttp/include

luther@gliethttp:~/mtd-utils-20080508$ vim recv_image.c

拷贝/usr/include/netinet/in.h文件中

arm-linux-gcc中不需要拷贝它.

struct ip_mreq

{

struct in_addr imr_multiaddr

struct in_addr imr_interface

}

结构体数据到头部,否则在u盘版的ubuntu 8.10上老是提示没有ip_mreq定义,虽然上面明明写了#define _USE_MISC

arm-linux-gcc中还需要创建如3下个目录

luther@gliethttp:~/mtd-utils-20080508$ mkdir arm-linux

luther@gliethttp:~/mtd-utils-20080508$ cp -r ubi-utils arm-linux/

luther@gliethttp:~/mtd-utils-20080508$ cp -r include arm-linux/

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/libpfiflash.c

将所有EBUF(PFIFLASH_ERRSTR[-rc])全部替换为EBUF("%s", PFIFLASH_ERRSTR[-rc])

vim下替换脚本为

:%s/EBUF(PFIFLASH_ERRSTR\[-rc\])/EBUF("\%s", PFIFLASH_ERRSTR\[-rc\])/g

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/ubimirror.c

将第206行的

fprintf(stderr, err_buf)

改为

fprintf(stderr, "%s", err_buf) // 想法是好的,因为err_buf中含有%d等format信息,这样接口更加统一,但是编译器似乎还并不支持这样的 *** 作.[luther.gliethttp]

luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/unubi.c

将第898行

char fname[PATH_MAX]

改为

char fname[PATH_MAX+1]

luther@gliethttp:~/mtd-utils-20080508$ cd ubi-utils/new-utils

因为-O2优化的原因,会导致如下log信息

error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

所有手工先编译.o

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

对于交叉编译执行如下1条语句

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ arm-linux-gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o

luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ cd -

好了,上面的所有修改完成之后,就可以执行make成功编译了[luther.gliethttp].

luther@gliethttp:~/mtd-utils-20080508$ make

如果是交叉编译,执行

luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux-

luther@gliethttp:~/mtd-utils-20080508$ make install

对于交叉编译,执行

luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux- install

luther@gliethttp:~/mtd-utils-20080508$ tree gliethttp/

gliethttp/

|-- sbin

| |-- bin2nand

| |-- doc_loadbios

| |-- docfdisk

| |-- flash_erase

| |-- flash_eraseall

| |-- flash_info

| |-- flash_lock

| |-- flash_otp_dump

| |-- flash_otp_info

| |-- flash_unlock

| |-- flashcp

| |-- ftl_check

| |-- ftl_format

| |-- jffs2dump

| |-- mkbootenv

| |-- mkfs.jffs2

| |-- mkpfi

| |-- mtd_debug

| |-- nand2bin

| |-- nanddump

| |-- nandtest

| |-- nandwrite

| |-- nftl_format

| |-- nftldump

| |-- pddcustomize

| |-- pfi2bin

| |-- pfiflash

| |-- recv_image

| |-- rfddump

| |-- rfdformat

| |-- serve_image

| |-- sumtool

| |-- ubiattach

| |-- ubicrc32

| |-- ubicrc32.pl

| |-- ubidetach

| |-- ubigen

| |-- ubimirror

| |-- ubimkvol

| |-- ubinfo

| |-- ubinize

| |-- ubirmvol

| |-- ubiupdatevol

| `-- unubi

`-- share

`-- man

`-- man1

`-- mkfs.jffs2.1.gz

4 directories, 45 files

ep9312开发板上没有任何文件系统flash数据读取

# ./mtd_debug read /dev/mtd0 0 100 gliethttp.bin

Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin

# hexdump gliethttp.bin

0000000 03ff ea00 350c e59f 001c e583 410e e3a0

0000010 4004 e583 4a03 e3a0 4001 e254 fffd 1aff

0000020 4106 e3a0 4004 e583 420f e202 5000 e594

0000030 4001 e084 5000 e594 4001 e084 5000 e594

0000040 4001 e084 5000 e594 4010 e3a0 4008 e583

0000050 4050 e3a0 4001 e254 fffd 1aff 4e1e e3a0

0000060 4008 e583

0000064

#

# ./mtd_debug read /dev/mtd2 0 100 gliethttp.binhexdump gliethttp.bin -Cv

Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin

00000000 1f 8b 08 00 ca 14 7d 4a 02 03 e4 5a 0f 70 93 e7 |......}J...Z.p..|

00000010 79 7f 3f 49 36 b2 31 41 80 a0 0e 38 cd 57 70 16 |y.?I6.1A...8.Wp.|

00000020 93 18 f3 19 3b 60 12 9a d9 60 08 09 4e 22 c0 a4 |....`...`..N"..|

00000030 b4 81 ca 42 92 6d 0d 59 d2 49 72 02 2b 4d dd 60 |...B.m.Y.Ir.+M.`|

00000040 72 84 e1 86 03 a7 21 01 8a d2 b2 4b 2e f3 56 76 |r.....!....K..Vv|

00000050 63 b7 34 0b 1d cd b1 1d 6b b3 95 36 dc 95 db d1 |c.4.....k..6....|

00000060 8b 90 d1 ea |....|

00000064

不行,不过可以配合tar对目录进行打包。

tar c test/ | lzop - >test.tar.lzo

lzop -dc test.tar.lzo | tar x

一、预先安装必要软件

1、需要的软件:java, svn, autoconf, automake, libtool, ncurses-devel, openssl-devel, gcc, lzo-devel, zlib-devel, znt, maven, protobuf, cmake

检测系统中是否已安装了某一软件命令:rpm -qa|grep 软件名,如检测系统中是否安装了svn:

$ rpm -qa|grep svn

2、如果已安装,则跳过,如果没有安装,用命令:yum install svn进行安装,如:

$ yum install svn

如果yum命令安装失败(找不到相应的包),则需手动下载相应的软件包进行安装,比如maven, protobuf这两个个软件;

二、安装maven

1、软件包:apache-maven-3.0.5-bin.tar.gz

不要使用最新的Maven3.1.1,与Maven3.0.x存在兼容性问题,所以老是出现java.lang.NoClassDefFoundError: org/sonatype/aether/graph/DependencyFilter之类的错误。选择3.0.5版本:apache-maven-3.0.5-bin.tar.gz

将apache-maven-3.0.5-bin.tar.gz移动到/usr目录(软件包所在目录):

# mv ./apache-maven-3.0.5-bin.tar.gz /usr

进入/usr目录,解压(/usr目录):

# tar –zxvf apache-maven-3.0.5-bin.tar.gz ./

删除解压后的压缩包(/usr目录):

# rm –rf apache-maven-3.0.5-bin.tar.gz

将/usr / apache-maven-3.0.5/bin加到环境变量中

# vi /etc/profile

在PATH行的最后加上“:/usr/apache-maven-3.0.5/bin”

2、使配置生效:

# source /etc/profile

验证是否安装成功:

# mvn –version

三、安装protobuf

1、软件包:protobuf-2.5.0.tar.gz

将protobuf-2.5.0.tar.gz移动到/usr目录(软件包所在目录):

# mv ./ protobuf-2.5.0.tar.gz /usr

进入/usr目录,解压(/usr目录):

# tar –zxvf protobuf-2.5.0.tar.gz ./

删除解压后的压缩包(/usr目录):

# rm –rf protobuf-2.5.0.tar.gz

进入/usr/protobuf-2.5.0目录:

# cd /usr/protobuf-2.5.0

2、依次执行下列命令:

# ./configure

# make

# make check

# make install

检测是否安装成功:

# protoc --version

四、下载hadoop-2.2.0源码并编译

在/usr目录进行

用svn下载hadoop-2.2.0源码,命令:

$ svn checkout 'http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.2.0'

源码下载完成后,在/usr目录下会有一个release-2.2.0目录,进入该目录:

$ cd /usr/release-2.2.0

$ ls –la

编译源码:

$ mvn package -Pdist,native -DskipTests –Dtar --不生成文档

$ mvn package -Pdist,native,docs,src -DskipTests –Dtar --生成文档,需要安装findbugs,并设置FINDBUGS_HOME环境变量

编译的时间比较久,编译过程中会联网下载所需要的包,机子没联网是不会成功编译的。

编译结束,最后打印的信息如下,每一项均是‘SUCCESS’,则编译成功:

编译好的代码包在/usr/release-2.2.0/hadoop-dist/target目录下:

$ cd /usr/release-2.2.0/hadoop-dist/target

$ ls –la

因为是在64位系统下编译的,所以编译出来的代码包是64位版本的;可以直接将/usr/release-2.2.0/hadoop-dist/target目录下的hadoop-2.2.0或者hadoop-2.2.0.tar.gz拷贝到其他linux64位平台进行搭建hadoop集群。

说明:

1、 机器得连网,如果没联网找可以联网的机器下载,但是编译时还是要下载一些东西,所以,实在不行。最好找相同平台(可以是虚拟机)能上网的机器做下面工作,弄好了再把编译好的代码包拷回来。

2、 命令 *** 作中,‘#’开头的是在root用户进行,‘$’开头的是在普通用户下进行


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7329171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存