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

作者&投稿:将往 (若有异议请与网页底部的电邮联系)
如何交叉编译mkfs.jffs2等工具链mtd-utils~

编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
编译语言是一种以编译器来实现的编程语言。它不像直译语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器码,再加以运行。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。

编译工具链一般最简化的为 binutils + gcc + glibc + kernel-header 组合的环境。 GCC 就是编译器,他的输出每次安装只能有针对一个架构的指令输出。如果要多个架构输出,那就要装多个 GCC ,所以编译工具链里面会有一个 GCC 。 交叉编译就是跨...

首先说明一下:
在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.bin;hexdump 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


如何交叉编译mkfs.jffs2等工具链mtd-utils
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.debia...

学习linux的困惑
1.linux驱动分字符驱动,块设备驱动和网络设备驱动三种。字符设备驱动比较简单,花几个月可以掌握。而其他两种驱动很复杂,短期内靠自学很难完全掌握,需要在工作中慢慢积累。编译用交叉编译器,一般开发板自带的光盘中会提供,烧写的软件也在光盘中且有使用手册教你如何烧写到开发板。每个厂家的烧写方法略...

qemu怎样为选择arm linux内核镜像选择运行arm平台
想必做嵌入式开发的朋友,对交叉编译工具链不陌生。如果你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。但在这里建议直接安装arm的交叉编译工具链:sudoapt-getinstallgcc-arm-linux-gnueabi 编译Linux内核 生成vexpress开发板子的config文件:makeCROSS_COMPILE=arm-linux-gnueabi-ARCH=armve...

如何将android linux烧到Raspberry Pi及其调试
选择第6个菜单。 然后进行编译 make -j8 等待编译成功,这可能需要几十分钟。 编译成功之后将”system”目录复制到root目录下,接下来我们可能会用到。 命令如下: cd <your_android_path> cp -r system out\/target\/product\/rpi\/root ps:编译时如果jdk版本不对,可将其改成jdk1.6 五.如何在Raspberry Pi上跑andro...

Linux系统分析、裁减及RAMOS制作
1.建立开发环境 操作系统一般使用RedHat-Linux,版本从7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(例如arm-Linux-gcc、arm-μclibc-gcc),或者安装产品厂家提供的交叉编译器。2.配置开发主机 配置MINICOM,一般的参数为波特率为115 200bps,数据位为8位,停止位为1...

如何制作和使用Jffs2文件系统
由于交叉编译mtd工具时需要zlib.h文件,所以在编译之前先安装zlib库文件。从网上下载 mtd-snapshot-20050519.tar.bz2 解压缩 $ cd mtd\/util 修改该目录下的Makefile:CROSS=arm-linux- make all 然后将该目录下生成的 flash_erase,flash_eraseall, mkfs.jffs2工具放在ramdisk 文件系统中(我这里放在\/...

jffs2文件系统制作出来一般多大
CC=gcc(由于我的mkfs.jffs2是在宿主机下制作文件系统用的,因此不需要采用交叉编译。下边的LDSHARED也是一样,不需要采用交叉工具)LDSHARED=ld -shared make all make install 注意:这里是安装在\/usr\/local\/arm\/arm-linux目录下 1.3. 安装mtd 从网上下载mtd-snapshot-20050519.tar.bz2 解压缩...

洛江区15841755089: 如何交叉编译mkfs.jffs2等工具链mtd - utils -
堵党诺森: 编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程. 2、用编译程序产生目标程序的动作. 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2...

洛江区15841755089: 如何构建交叉编译环境. -
堵党诺森: 你说的是我下面的回答吗?下面就一些问题作一个说明,以期抛砖引玉.基于Linux操作系统的应用开发环境一般是由目标系统硬件(开发板)和宿主PC机所构成.目标硬件开发板用于运行操作系统和系统应用软件,而目标板所用到的操作系统...

洛江区15841755089: 如何建立Linux交叉编译环境 -
堵党诺森: 从网上下载arm-linux-gcc 4.4.3的源码2 进入Linux的终端,将当前目录设为arm-linux-gcc的下载目录,输入tar -xzf arm-linux-gcc-4.4.3.tar.gz,将文件解压,解压后会有一个opt的文件夹.arm-linux-gcc交叉编译环境的安装3 在/usr/local/下建立一个...

洛江区15841755089: 如何进行Qt应用程序的交叉编译 -
堵党诺森: 首先得把我们在X86机上调好的程序进行交叉编译,如果在X86上都没有通过的话..那就不用交叉编译了,(肯定是通不过的),还是到正题吧,设置好环境变量,我们用以用echo 来查看环境变量,echo $TMAKEPATH ,如果返回的不是......

洛江区15841755089: Linux下的交叉编译环境设置 -
堵党诺森: 交叉编译环境,指的是你在PC的操作系统上编译ARM上能运行的程序的编译环境. 说白了,你在PC的操作系统上要的arm-none-linux-gnueabi-gcc等这些工具有一个网站上,交叉编译环境是直接安装后就可以用的 https://sourcery.mentor.com/...

洛江区15841755089: 怎样交叉编译环境搭建 -
堵党诺森: 主机安装工具链: $tar –jxvf cross-3.3.2.tar.bz2 $./3.3.2/bin/arm-linux-gcc –v 会出现信息:”--prefix=/usr/local/arm/3.3.2” 这就是GCC应该安装的路径.它是在GCC编译前通过prefix选项配置的. $mkdir –p /usr/local/arm $mv ./3.3.2 /usr/...

洛江区15841755089: LINUX下如何成功的交叉编译一个应用程序 -
堵党诺森: 这里需要注意的是所谓平台,实际上包含两个概念: 体系结构(Architecture)、操作系统(Operating System).同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行. 方法及步骤: 1、搭建交叉...

洛江区15841755089: 如何编译/交叉编译内核模块, Linux 2.6. -
堵党诺森: 椤?build 能够编译内核树目录内的内核模块,也能够编译内核树目录外的内核模块(外部内核模块).. 编译外部内核模块的命令: #cd #make -C M=`pwd` 其中 为要编译的内...

洛江区15841755089: 如何交叉编译Python到ARM - Linux平台 -
堵党诺森: 没有用过,建议有两条思路:1. 办法1,用交叉编译 ,需要下载相应的交叉编译工具包(又叫工具链),比如在linux下编译arm需要arm-linux-gcc等工具链2. 办法2,找一个性能好的arm平台,直接在arm平台下编译.比如树莓派的操作系统编译就是程序用多台高性能的arm平台单板机,分工合作共同编译完成的.

洛江区15841755089: 如何建立Linux下的ARM交叉编译环境 -
堵党诺森: 这个过程如下 1. 下载源文件、补丁和建立编译的目录 2. 建立内核头文件 3. 建立二进制工具(binutils) 4. 建立初始编译器(bootstrap gcc) 5. 建立c库(glibc) 6. 建立全套编译器(full gcc) 下载源文件、补丁和建立编译的目录 1. 选定软件版本...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网