分类: LINUX
2012-04-09 16:52:45
mtd-utils-1.4.6编译
对于mtd-utils-1.4.6的编译,需要以下几个软件包:mtd-utils-1.4.6.tar.bz2、 zlib-1.2.3.tar.gz 、lzo-2.04.tar.gz 、e2fsprogs-1.41.3.tar.gz。本次编译使用的编译工具链是arm-linux-gcc 3.4.6, 开发环境是Red Hat Enterprise Linux 5。下面开始详细的编译过程介绍(带#开头的表示linux终端输入的命令):
1、 解压mtd-utils-1.4.6.tar.bz2:
# tar -xjvf mtd-utils-1.4.6.tar.bz2
2、 解压安装zlib-1.2.3.tar.gz:
# tar -xzvf zlib-1.2.3.tar.gz
# cd zlib-1.2.3
# CC=arm-linux-gcc ./configure --shared --prefix=/root/HH/mtd-utils-1.4.6/arm-linux
# make
# make install
编译完成以后,通过make install将头文件以及编译生成的库文件安装(copy)到/root/HH/mtd-utils-1.4.6/arm-linux目录,即$(BUILDDIR)中。此后在安装mtd-utils-1.4.6.tar.bz2时要记得修改mtd-utils-1.4.6目录下的Makefile文件,在第一行添加如下内容:
export ZLIBCPPFLAGS=-I/root/HH/mtd-utils-1.4.6/arm-linux/include
目的是指定刚刚安装的zlib库的头文件所在目录(下面要安装的lzo-2.04.tar.gz和e2fsprogs-1.41.3.tar.gz也是使用该目录)。此处使用export声明一个变量是为了在接下来调用其它Makefile时该变量依然有效。否则,在执行mtd-utils-1.4.6/mkfs.ubifs/Makefile时会报错。
3、 解压安装lzo-2.04.tar.gz
# tar -xzvf lzo-2.04.tar.gz
# cd lzo-2.04
# CC=arm-linux-gcc ./configure --host=arm-linux \ --prefix=/root/HH/mtd-utils-1.4.6/arm-linux --enable-shared
# make
# make install
4、 解压安装e2fsprogs-1.41.3.tar.gz(如果仅需要nand flash相关工具的话,这个可以不安装,以后在安装mtd-utils-1.4.6.tar.bz2时会出现错误:mkfs.ubifs.h:48:23: error: uuid/uuid.h: No such file or directory但可不理会);
# tar -xzvf e2fsprogs-1.41.3.tar.gz
# cd e2fsprogs-1.41.3
# CC=arm-linux-gcc ./configure --host=arm-linux \ --prefix=/root/HH/mtd-utils-1.4.6/arm-linux
# make
# make install-libs
5、 安装mtd-utils-1.4.6.tar.bz2:
# cd mtd-utils-1.4.6
A. 在Makefile 中加入
export ZLIBCPPFLAGS=-I/root/HH/mtd-utils-1.4.6/arm-linux/include
B. 在serve_image.c, recv_image.c中预定义AI_ADDRCONFIG,
# define AI_ADDRCONFIG 0x0020 (来自于4.3.2)
也可在Makefile的TARGETS=…中注释掉serve_image, recv_image以不生成serve_image, recv_image.
C. 在include/mtd目录的ubi-media.h中加入:
#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif
typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
#if defined(__GNUC__)
typedef __u64 __bitwise __le64;
typedef __u64 __bitwise __be64;
#endif
typedef __u16 __bitwise __sum16;
typedef __u32 __bitwise __wsum;
D. 在mkfs.ubifs目录的mkfs.bbifs.h中加入
#define FS_COMPR_FL 0x00000004 /* Compress file */
#define FS_SYNC_FL 0x00000008 /* Synchronous updates */
#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */
#define FS_APPEND_FL 0x00000020 /* writes to file may only append */
#define FS_DIRSYNC_FL 0x00010000 /* dirsync behavior */
#define FS_IOC_GETFLAGS _IOR( 'f', 1, long )
# make CROSS=arm-linux- WITHOUT_XATTR=1
其中CROSS= arm-linux- 指定编译器前缀。WITHOUT_XATTR=1是因为mtd-utils中有些源码使用了zlib.h中的库文件而不使用acl.h的库文件。
附:
1、如果在安装mtd-utils-1.4.6.tar.bz2时出现如下错误:
是因没有指定WITHOUT_XATTR=1
WITHOUT_XATTR=1是因为mtd-utils中有些源码使用了zlib.h中的库文件而不使用acl.h的库文件。
如在mkfs.jfFs2.c文件中:
#ifndef WITHOUT_XATTR
#include
#include
#endif
#include
#define crc32 __zlib_crc32
#include
#undef crc32
2、如果在安装mtd-utils-1.4.6.tar.bz2时出现如下错误:
compr_zlib.c:39:18: error: zlib.h: No such file or directory
是因为没有安装zlib库的原因
3、如果在安装mtd-utils-1.4.6.tar.bz2时出现如下错误:
是因为没有安装lzo库的原因
4、使用编译工具链arm-linux-gcc 3.4.6时会出现如下错误:
可能是因为编译器太老,在相关头文件中没有预定义
现在解决的方法是人为预定义(来自于4.3.2)
# define AI_ADDRCONFIG 0x0020
也可在Makefile的TARGETS=…中注释掉serve_image, recv_image以不生成serve_image, recv_image.
在include/mtd目录的ubi-media.h中加入:(来自于4.3.2)
#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif
typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
#if defined(__GNUC__)
typedef __u64 __bitwise __le64;
typedef __u64 __bitwise __be64;
#endif
typedef __u16 __bitwise __sum16;
typedef __u32 __bitwise __wsum;
在mkfs.ubifs目录的mkfs.bbifs.h中加入(来自于4.3.2)
#define FS_COMPR_FL 0x00000004 /* Compress file */
#define FS_SYNC_FL 0x00000008 /* Synchronous updates */
#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */
#define FS_APPEND_FL 0x00000020 /* writes to file may only append */
#define FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour */
#define FS_IOC_GETFLAGS _IOR( 'f', 1, long )
5、如果在安装mtd-utils-1.4.6.tar.bz2时出现如下错误:
是因为没有安装e2fsprogs库的原因,如果仅需要nand flash相关工具的话,这个可以不安装