busybox详解制作根文件系统

合集下载

使用BusyBox制作linux根文件系统

使用BusyBox制作linux根文件系统

使⽤BusyBox制作linux根⽂件系统操作系统:Ubuntu9.04内核版本:linux-2.6.24.7开发板:博创arm2410s交叉编译⼯具:arm-linux-gcc-4.1.1BusyBox:busybox-1.11.1CramFS:CramFS-1.1注意:由于要制作的根⽂件系统使⽤了mdev(BusyBox简化版的udev),因此,需要内核⽀持sysfs、procfs和ramfs(tmpfs)⽂件系统以及hotplug(uevent)事件机制。

浅蓝⾊为命令,橘红⾊为代码和脚步1、准备根⽂件系统使⽤shell脚本create_rootfs.sh,建⽴根⽂件系统的⽬录框架lingd@ubuntu:~/arm2410s$ vi create_rootfs.shcreate_rootfs.sh 内容如下:#!/bin/shecho "------Create rootfs directons......"mkdir rootfscd rootfsecho "--------Create root,dev......"mkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modulesmkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.dmkdir lib/moduleschmod 1777 tmpcd ..echo "-------make direction done---------"为 create_rootfs.sh添加执⾏权限lingd@ubuntu:~/arm2410s$ chmod a+x create_rootfs.sh执⾏create_rootfs.sh,建⽴根⽂件系统的⽬录框架lingd@ubuntu:~/arm2410s$ ./create_rootfs.shlingd@ubuntu:~/arm2410s$ cd rootfslingd@ubuntu:~/arm2410s/rootfs$ lsbin dev etc home lib mnt proc root sbin sys tmp usr var2、创建设备⽂件mdev 是通过 init 进程来启动的,在使⽤ mdev 构造 /dev ⽬录之前,init ⾄少要⽤到设备⽂件/dev/console、/dev/null,所以需要事先建⽴这两个设备⽂件:lingd@ubuntu:~/arm2410s/rootfs$ cd devlingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 console c 204 64[sudo] password for lingd:lingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 null c 1 3lingd@ubuntu:~/arm2410s/rootfs/dev$ ls -ltotal 0crw-rw---- 1 root root 5, 1 2010-04-02 15:49 consolecrw-rw---- 1 root root 1, 3 2010-04-02 15:50 null注意:本来console的主次设备号应为5和1.但是因为init在执⾏完/etc/init.d/rcS脚本后,就会在⼀个控制台上,按照inittab的指⽰开⼀个shell(或者是开getty+login,这样⽤户就会看到提⽰输⼊⽤户名的提⽰符)。

用Busybox制作嵌入式Linux根文件系统

用Busybox制作嵌入式Linux根文件系统

用Busybox制作嵌入式Linux根文件系统Use Busybox to Make Embedded Root Filesystem(曲阜师范大学自动化研究所)邵长彬李洪亮Shao Changbin Li Hongliang 摘要:根文件系统为Linux的运行提供最基本的工具、库、脚本和一些特殊文件的支持。

Busybox是制作嵌入式Linux文件系统的快捷工具,本文通过配置、编译、安装Busybox,以及生成根文件系统映像文件,介绍了用Busybox制作嵌入式Linux根文件系统的一般方法。

关键词:嵌入式Linux,根文件系统,Busybox中图分类号: TP316.2文献标识码:AAbstract: Root filesystem affords Linux most basic tools, lib, scripts and some special files. Busybox is a key tool to make embedded Linux filesystems. This paper, through configure, compile and install Busybox, delivers a normal method to make root filesystem.Key words: embedded Linux, root filesystem, BusyboxCLC number: TP316.2 Document code: A1 根文件系统简介根文件系统是存放Linux系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以包括各种软件包。

根文件系统一般包括如下内容:1)基本的文件系统结构,包含一些必须的目录,比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp。

2)基本程序运行所需的库函数,如:Glibc/uC-libc。

移植busybox构建最小根文件系统的步骤详解

移植busybox构建最小根文件系统的步骤详解

移植busybox构建最⼩根⽂件系统的步骤详解Busybox:瑞⼠军⼑,⾥⾯装有很多⼩命令。

STEP 1:构建⽬录结构创建根⽂件系统⽬录,主要包括以下⽬录/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys#mkdir /home/rootfs#cd /home/rootfs#mkdir dev etc lib usr var proc tmp home root mnt sysSTEP 2: 使⽤busybox构建/bin /sbin linuxrc进⼊busybox-1.16.1⽬录,执⾏#make defconfig#make menuconfigBusybox Setting ----->Build Options ----->//1选择将busybox进⾏静态编译[*]Build BusyBox as a static binary (no shared libs)//2.指定交叉编译器为(/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefixInstallation Options -----> (选择⽣成的⽂件存放⽬录,也可以直接放在rootfs下就不⽤拷贝了)//3.选择上 Don't use /usrBusybox Library Tuning--->[*]Username completion[*]Fancy shell prompts[*]Query cursor position from terminal//4.编译出的busybox的shell命令解释器⽀持显⽰当前路径及主机信息保存退出#make #make install在busybox⽬录下会看见 _install⽬录,⾥⾯有/bin /sbin linuxrc三个⽂件将这三个⽬录或⽂件拷到第⼀步所建的rootfs⽂件夹下。

busybox制作ramdisk全过程

busybox制作ramdisk全过程

Busybox Settings > General Configuration > [*] Support for devfs Build Options > [*] Build BusyBox as a static binary (no shared libs) /* 将busybox编译为静态连接,少了启动时找动态库的麻烦*/ [*] Do you want to build BusyBox with a Cross Compiler? (/usr/local/ arm/3.3.2/bin/armlinux) Cross Compiler prefix/* 指定交叉编译工具路径*/Init Utilities > [*] init [*] Support reading an inittab file /* 支持init读取/etc/inittab配置文件,一定要选上*/Shells > Choose your default shell (ash) > /* (X) ash 选中ash,这样生成的时候才会生成bi n/sh文件* 看看我们前头的linuxrc脚本的头一句:* #!/bin/sh 是由bin/sh来解释执行的*/ [*] ashCoreutils > [*] cp [*] cat [*] ls [*] mkdir [*] echo (basic SuSv3 version taking no opt ions) [*] env [*] mv [*] pwd [*] rm [*]touch Editors > [*] viLinux System Utilities > [*] mount [*] umount [*] Support loopback mounts [*] Supp ort for the old /etc/mtab fileNetworking Utilities > [*] inetd /* * 支持inetd超级服务器*/3.3 编译并安装Busybox(如果busybox编译不过去就换个版本的编译工具)。

如何用busybox构建一个最小根文件系统

如何用busybox构建一个最小根文件系统

用busybox构建一个最小根文件系统busybox是所有命令的集合体,是一个工具集,包括了我们常用的工具。

一、一个最小根文件系统包括:(1) /dev/console/dev/null(2) init => busybox(3) /etc/inittab(4) 配置文件指定的应用程序(5) C库二、执行步骤:(一)配置编译busybox(1)下载源码:busybox-1.7.0.tar.bz2a.创建一个文件firstfs,将该文件保存其中b.解压cd firstfstar xjf busybox-1.7.0.tar.bz2执行上述命令后,解压出来busybox-1.7.0文件夹,c.配置在busybox-1.7.0目录下执行“make menuconfig”命令即可进入配置界面。

一般选择默认配置就行,现添加一个TAB补全功能:Busybox Settings------>Busybox Library Turning------>[*]Tab completion用“+/-”选好选项,输入y ,然后按tab选exit(2)编译busyboxa.修改busybox目录下的Makefile执行命令:vi Makefile ,然后输入“/CROSS”找到(“+/-”选择行)CROSS_COMPILE ?=arm-linux-输入“:wq”保存退出b.执行“make”命令编译busybox编译完成,出现如下界面:(3)安装busybox在交叉编译环境,千万不要直接执行make install,这样会破坏我们的操系统。

创建一个新文件夹first_fsmake CONFIG_PREFIX=first_fs install就会在这个文件夹下面生成bin,sbin,usr,linuxrc四个文件目录。

(二) 创建设备文件:/dev/console 和/dev/null(查看ls /dev/console /dev/null –l)mkdir devcd dev/sudo mknod console c 5 1 (创建终端字符设备主为5 次为1)sudo mknod null c 1 3(可以查看:ls –l)(三) 创建配置文件/etc/inittab (最简单基本的配置文件:标准输入、输出和错误信息定义到console)init进程根据/etc/inittab文件来创建其他子进程,etc目录下的内容取决与要运行的程序,本次只需要创建3个文件:etc/inittab, etc/init.d/rcS, etc/fstab。

busybox制作根文件系统

busybox制作根文件系统

用Busybox制作嵌入式Linux的文件系统1 busybox简介BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。

有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。

简单的说BusyBox就好像是个大工具箱(只有一个可执行程序busybox,其他命令都是指向该可执行程序的连接),它集成压缩了 Linux 的许多工具和命令。

BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。

2编译busybox :#make3安装busybox:#make install执行 make install后,会生成一个_install文件夹。

进入_install目录,可以看到一共有3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。

这三个目录有很多快捷方式,都是指向了/bin/ busybox。

这就是busybox的特点,即可执行程序只有一个,其他的都是link。

●bin目录包含用户工具,其中,busybox可执行文件就在这个目录下。

●sbin目录包含操作系统工具,同样也指向busybox。

●linuxrc是一个链接文件,指向busybox。

4 其他目录首先,我们创建一个rootfs的目录,把_install目录下的内容复制过来。

此时,rootfs目录中包含3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。

但是,仅仅有上述目录还不足以构成一个可用的文件系统,必须还要手工加一些其他的目录及配置文件、启动脚本等。

下面是几个必须有的目录|___ etc / 配置文件|___ dev / 设备节点目录|___ lib / 库|___ modules / 驱动下面是最好有的几个目录|___ proc /|___ sys /|___ var /|___ tmp /|___ root /|___ opt /|___ mnt /4.1 创建etc目录下的文件etc目录里添加配置文件,是最主要的工作。

[实践]busybox1.16.1建立文件系统

[实践]busybox1.16.1建立文件系统

[实践]busybox1.16.1建立文件系统[实践]busybox1.16.1建立文件系统(未完成)#1建立根文件系统目录#!/bin/shecho “——Create rootfs_new directons start…”mkdir rootfs_newcd rootfs_newecho “——Create root,dev…”mkdir bin sbin lib dev etc mnt usrmkdir root home sys proc bootmkdir tmp vartouch linuxrcmkdir etc/init.d etc/rc.d etc/sysconfigmkdir usr/bin usr/sbin usr/lib usr/modulesmkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmpchmod 1777 tmpchmod 1777 var/tmpecho “——Create dir done…”#2创建设备文件echo “——Make node in dev…”mknod -m 600 mem c 1 1mknod -m 600 dev/console c 5 1mknod -m 600 dev/null c 1 3mknod -m 644 dev/random c 1 8mknod -m 644 dev/urandom c 1 9mknod -m 660 dev/mtd0 c 90 0mknod -m 660 dev/mtd1 c 90 2mknod -m 660 dev/mtd2 c 90 4mknod -m 660 dev/mtd3 c 90 6mknod -m 660 dev/mtdblock0 b 31 0mknod -m 660 dev/mtdblock1 b 31 1mknod -m 660 dev/mtdblock2 b 31 2mknod -m 660 dev/mtdblock3 b 31 3mknod -m 660 dev/ttySAC0 c 204 64mknod -m 666 dev/tty c 5 0mknod -m 600 dev/tty0 c 4 0mknod -m 600 dev/tty1 c 4 1mknod -m 600 dev/tty2 c 4 2mknod -m 600 dev/tty3 c 4 3mknod -m 600 dev/ttyS0 c 4 64mknod -m 600 dev/ttyS1 c 4 65mknod -m 600 dev/ttyS2 c 4 66mknod -m 600 dev/ttyS3 c 4 67mknod -m 600 dev/ttyUSB0 c 188 0mknod -m 600 dev/ttyUSB1 c 188 1mknod -m 600 dev/ttyUSB2 c 188 2mknod -m 600 dev/ttyUSB3 c 188 3mknod -m 600 dev/ppp c 108 0echo “——Make node done…”echo “——Cp lib…”#3建立动态链接库cp /usr/local/arm/3.4.1/arm-linux/lib/*.so* ./lib -d echo “——Cp lib done”4、交叉编译BosyboxA.修改Makefile交叉器vim MakefileCROSS_COMPILE =arm-linux- //第164 行ARCH =arm //第189行B.修改交叉编译器路径make menuconfigBusybox Settings —>Build Options —>修改[*] Build BusyBox as a static binary (no shared libs)修改Cross Compiler prefix为/usr/local/arm/3.4.1/bin/arm-linux-C.修改安装地址make TARGET_ARCH=arm PREFIX=/source/tmp1/rootfs_new/错误1:miscutils/flash_eraseall.c:14:26: mtd/mtd-user.h: No such file or directoryfind / -name “mtd-user.h”/opt/linuxcore/linux-2.6.33.3/include/mtd/mtd-user.h/usr/include/mtd/mtd-user.h/usr/src/linux-headers-2.6.32-21/include/mtd/mtd-user.h原因:找不到mtd-user.h解决:cp /usr/include/mtd/ ./include/mtd/ -a错误2:miscutils/inotifyd.c:31:25: sys/inotify.h: No such file or directoryfind / -name “inotify.h”/opt/linuxcore/linux-2.6.33.3/include/config/inotify.h/opt/linuxcore/linux-2.6.33.3/include/linux/inotify.h/opt/linuxcore/linux-2.6.33.3/fs/notify/inotify/inotify.h/usr/include/linux/inotify.h/usr/include/sys/inotify.h/usr/src/linux-headers-2.6.32-21/include/linux/inotify.h/usr/src/linux-headers-2.6.32-21-generic/include/config/inotify.h/usr/src/linux-headers-2.6.32-21-generic/include/linux/inotify.h原因:据说是busybox中ionice的bug解决:Miscellaneous Utilities->关闭ionice关闭inotifyd关闭taskset错误3:networking/interface.c:818: error: `ARPHRD_INFINIBAND’ undeclared here (not in a function)修改networking/interface.cvim networking/interface.c添加define ARPHRD_INFINIBAND 32 /* InfiniBand */错误4:util-linux/acpid.c: In function `acpid_main’:util-linux/acpid.c:146: error: `EV_SW’ undeclared (first use in this function)util-linux/acpid.c:146: error: (Each undeclared identifier is reported only onceutil-linux/acpid.c:146: error: for each function it appears in.) util-lin ux/acpid.c:147: error: `SW_LID’ undeclared (first use in this function)原因:可能input.h太陈旧,没有EV_SW的定义解决:cp /opt/linuxcore/linux-2.6.33.3/include/linux/ ./include/ -a5.在Linux内核中把module安装到文件系统目录,[疑问:是否是必须的?]make modules_installINSTALL_MOD_PATH=/source/tmp1/rootfs_new/5、建立etc目录下的配置文件A/etc/inittab #重要#指定初始化文件::sysinit:/etc/init.d/rcS#启动时执行的shell::respawn:/bin/shttyS0::askfirst:-/bin/sh#重启时动作::restart:/sbin/init::ctrlaltdel:/sbin/reboot#关机时动作,卸载所有文件系统::shutdown:/bin/umount -a –rB/etc/init.d/rcS #重要C/etc/fstab #重要proc /proc proc defaults 1 1none /dev/pts devpts gid=5,mode=620 0 0proc /proc proc defaults 0 0none /tmp ramfs defaults 0 0mdev /dev ramfs defaults 0 0sysfs /sys sysfs defaults 0 0D/etc/profile #重要#例子1#!/bin/shecho “profile processing”export LD_LIBRARY_PATH=/lib:/usr/libHOSTNAME=’bin/hostname’export HOSTNAMEPATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH#例子2# Set search library path# 这条语句设置动态库的搜索路径,极其重要echo “Set search library path int /etc/profile”export LD_LIBRARY_PATH=/lib:/usr/lib# Set user pathecho “Set user path in /etc/profile”PATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH6、制作根文件系统映像文件参考资料:<<制作嵌入式根文件系统常见问题详解>>使用Busybox制作Cramfs根文件系统.pdf天嵌Linux移植.pdf。

busybox制作根文件系统

busybox制作根文件系统

使用Busybox制作CRAMFS文件系统成功来源: ChinaUnix博客日期:2008.08.20 16:16(共有条评论) 我要评论这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failed to execute /linuxrc.Attempting defaults...“的错误。

到网上查了大量的资料,并做了大量的实验,发现都不能成功。

今天下午突然发现一个能够仿真arm的软件qemu,在Ubuntu中的安装方法:sudo apt-get install qemu,Busybox编译后,可以通过arm仿真来测试:qemu-arm ./busybox ls,如果成功,则会显示当前目录下的文件列表。

我对Busybox1.10编译后的结果进行测试,发现出现错误:qemu: unhandled CPU exception 0x8 - abortingR00=001c596c R01=00000000 R02=001c5960 R03=00000001R04=000cbf94 R05=00000000 R06=00000000 R07=00000000R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0PSR=20000010 --C- A usr32 ffff0fa0s00=00000000( 0) s01=00000000( 0) d00=0000000000000000( 0)s02=00000000( 0) s03=00000000( 0) d01=0000000000000000( 0)s04=00000000( 0) s05=00000000( 0) d02=0000000000000000( 0)s06=00000000( 0) s07=00000000( 0) d03=0000000000000000( 0)s08=00000000( 0) s09=00000000( 0) d04=0000000000000000( 0)s10=00000000( 0) s11=00000000( 0) d05=0000000000000000( 0)s12=00000000( 0) s13=00000000( 0) d06=0000000000000000( 0)s14=00000000( 0) s15=00000000( 0) d07=0000000000000000( 0)s16=00000000( 0) s17=00000000( 0) d08=0000000000000000( 0)s18=00000000( 0) s19=00000000( 0) d09=0000000000000000( 0)s20=00000000( 0) s21=00000000( 0) d10=0000000000000000( 0)s22=00000000( 0) s23=00000000( 0) d11=0000000000000000( 0)s24=00000000( 0) s25=00000000( 0) d12=0000000000000000( 0)s26=00000000( 0) s27=00000000( 0) d13=0000000000000000( 0)s28=00000000( 0) s29=00000000( 0) d14=0000000000000000( 0)s30=00000000( 0) s31=00000000( 0) d15=0000000000000000( 0)FPSCR: 00000000qemu: uncaught target signal 6 (Aborted) - exiting说明,所编译得到的busybox不能使用在arm处理器,由于时间关系就放弃了使用Buxybox1.10版本。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解制作根文件系统单击,返回主页,查看更多内容一、FHS(Filesystem Hierarchy Standard)标准介绍当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。

该标准规定了根目录下各个子目录的名称及其存放的内容:制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。

其过程大体包括:•编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录•利用交叉编译工具链,构建/lib目录•手工构建/etc目录•手工构建最简化的/dev目录•创建其它空目录•配置系统自动生成/proc目录•利用udev构建完整的/dev目录•制作根文件系统的jffs2映像文件下面就来详细介绍这个过程。

二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。

如果要自己编写这几百个常用命令的源程序,my god,这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多。

1、从/下载busybox-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux-4、make menuconfig配置busyboxbusybox配置主要分两部分。

第一部分是Busybox Settings,主要编译和安装busybox的一些选项。

这里主要需要配置:1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。

我们选择动态链接C库。

2)、Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox 时,将各个命令安装为指向busybox的软链接还是硬链接。

我们选择软链接。

3)、Installation Options -- (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。

我们选择/work/nfs_root/fs_mini34)Busybox Library Tuning。

保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全第二部分是Applets,他将busybox的支持的几百个命令分门别类。

我们只要在各个门类下选择想要的命令即可。

这里我们基本保持默认设置。

1)选中Networking Utilities -- httpd下的Enable -u <user> option,以启用http服务器的功能allows the server to run as a specific user5、编译busyboxmake6、安装busyboxmake install安装完成后,可以看到在/work/nfs_root/fs_mini3目录下生成了binsbinusr/binusr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小不到800K:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup -> busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser -> busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash -> busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat –> busybox而普通PC机上的ls命令就有差不多80K的大小:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/lsbusybox以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。

据说,busybox的作者身患绝症,这更让人钦佩GNU开源软件的作者们。

三、利用交叉编译工具链,构建/lib目录光有应用程序(命令)是不够的,因为应用程序本身需要使用C库的库函数,因此还必需制作for ARM的C库,并将其放置于/lib目录。

my god,要自己写C库的源代码吗?不用!还记得交叉编译工具链的3个组成部分吗?交叉编译器、for ARM的C库和二进制工具。

哈哈,for ARM的C库是现成的,我们只需要拷贝过来就可以了。

遗憾的是:整个C库目录下的文件总大小有26M。

而我们根文件系统所在分区不过区区16M而已,根本放不下。

怎么办呢?dennis@dennis-desktop:/work/nfs_root/fs_mini3$ du -s --si/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib需要C库目录下所有的文件吗?no,absolutely no! 让我们来分析一下glibc库目录下内容的组成。

该目录下的子目录和文件共分8类:•目标文件,如crtn.o,用于gcc链接可执行文件•libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件•gconv目录,里面是各种链接脚本,在编译应用程序时,他们用于指定程序的运行地址,各段的位置等•静态库文件(.a),例如libm.a,libc.a•动态库文件(.so、.so.[0-9]*)•动态链接库加载器ld-2.3.6.so、ld-linux.so.2•其它目录及文件很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。

由于动态链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。

除此之外,第5类文件当然要拷贝。

但第5类文件的大小也相当大。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c --si *.so* 7.2M total需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。

如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可。

通过执行dennis@dennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep 'Shared'0x00000001 (NEEDED) Shared library: [libcrypt.so.1]0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [libc.so.6]可知:busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。

但是每个库都有4个文件,4个文件都要拷贝吗?当然不是。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt[.-]* -rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r--r-- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so -> libcrypt.so.1 lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 -> libcrypt-2.3.6.so dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm[.-]*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r--r-- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis 9 2008-12-22 15:38 libm.so -> libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 -> libm-2.3.6.sodennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc[.-]*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r--r-- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a-rw-r--r-- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 -> libc-2.3.6.so4个文件中的.a文件是静态库文件,是不需要拷贝的。

相关文档
最新文档