我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

( )将数百条常用的Unix/Linux命令集成到一个可执行文件(named)中,体积虽小但功能强大,可以提供常用Linux命令实现的所有功能,甚至还提供了tftp、http服务程序,虽然少数Linux命令的部分选项没有提供,但这并不影响它在嵌入式Linux系统中的流行。

有了它,将应用程序添加到为目标系统构建的根文件系统就变得轻而易举了。想象一下单独交叉编译每个 UNIX/Linux 应用程序是多么艰巨的任务。

它可以用glibc或库进行链接编译,可以动态链接,也可以静态链接(配置选项中可选)。即使用glibc进行静态链接,生成的文件大小也可以轻松控制在1MB以内(配置时不要选择不必要的函数)。用动态链接得到的可执行文件就更小了。这对于存储空间有限的嵌入式Linux系统来说,非常合适。因此,有人把它称为嵌入式系统的瑞士军刀。更形象的比喻就是:Linux系统中的各个命令是电路中分立的元件,而把它们集成在一起的IC:功能不变,体积却大大缩小了。

本文讨论编译和安装。包括在本地主机上的安装和在 ARM 目标系统上的安装。

配置

配置和Linux内核配置方法很类似,思路也类似:也是基于源码树目录中的 . 文件。还是建议使用配置工具。

以下工作均在解压后的源码树的根目录中完成。

$ make :大多数用户的默认配置

$ make :取消全部选中

$ make:全选

一般先make,然后使用。

$make help 查看 make 选项帮助。

就像配置 Linux 内核一样,您也可以使用现有(和重命名)文件。您可以加载和导出配置文件。

下面列出了一些值得注意的配置选项:

建造:

构建为(无库):将动态或静态链接。

- 您想使用交叉编译器吗?:选择一个交叉编译器。

默认情况下,运行make后会安装到./目录中。

根据具体需求进行配置:不需要的就不要选择。

NFS必须选择。使用NFS将主机文件系统挂载到目标板上。这是嵌入式Linux程序开发的一个重要方面。既然可以使用NFS,那么在主机上可以实现的功能就不需要在目标板上实现了。取消全选,取消全选,取消全选。对于解压工具,只安装解压工具。并且只选择一个:bzip2相关,以及tar工具(只需要目标板能够解压tar.bz2文件)。使用ash作为shell。

编译

完成配置工作后就可以编译安装,可以用于各种架构的CPU,这里列出本机系统的和ARM目标系统的。另外,可以动态或静态地与glibc链接,下面分别介绍不同的情况:

对于这台机器

该机器的编译过程非常简单,只需运行make即可。

交叉编译

交叉编译与针对本地系统进行编译类似,唯一的区别是它需要使用交叉编译工具。还要注意库的链接方法:如果目标系统上没有某个库,则应将其静态链接到该库。编译步骤如下:

1.修改PATH变量:

$ 路径=:$路径

2.调用make命令时,指定CROSS变量。

$ make =arm CROSS=arm-linux-

新版本可以在配置过程中设置交叉编译工具,这样针对目标系统编译的make命令和针对本地主机编译的make命令就没有任何区别了!

我这里用的是针对ARM目标系统进行编译。(见这篇博客:用它开发嵌入式Linux)。安装完成后,可以在配置时安装各种交叉编译工具:arm-linux-gcc(与glibc链接),arm-linux--gcc(与glibc链接),也可以为本地系统(x86)安装与glibc链接的gcc。这样就可以直接指定相应的编译器了。不需要单独安装库。

为了加快编译速度,可以将CC="$()"修改为CC="$()"。也可以使用$make -j2,使用2个任务来执行编译过程。

例子

下面通过几个例子来介绍一下编译方法:

1. 使用 glib 为本地主机进行编译和链接

由于 glibc 已安装在 GNU/Linux 系统中,因此您无需使用提供的编译器。此外,您可以将其配置为动态链接 glibc 库。所有其他选项均设置为默认值。

$ make ;默认配置

$ make ;选择使用 glibc 动态链接

$ make -j2

$ make

可以使用ls -l,file命令查看生成的可执行文件信息,注意在源码树的根目录下还生成了一个文件,可以通过剥离它来获取。

默认配置,使用 glibc 动态链接后的大小:858K

2. 编译并链接本地主机

我没有在本地主机上安装任何其他东西,而是使用了提供的编译工具:i386-gcc-3.3.2---。由于本地主机上没有库,因此将与库进行静态链接。其他选项设置为默认

$ PATH= /home/zp//sb///i386-gcc-3.3.2---/bin :$PATH

$ make

$ make CROSS=i386-linux---j2

$ make

默认配置,静态链接后大小:1.1M

3. 针对 ARM 目标系统进行编译并与 glibc 动态链接

使用中提供的arm-linux-gcc交叉编译工具,这里我没有使用默认的配置,而是只选择了我认为需要的功能。

$ PATH=/home/zp//sb///arm-linux-gcc3.4.cs-.3/bin:$PATH

$ make

$ make CROSS=arm-linux- -j2

$ make

删除不需要的内容后,使用glibc动态链接后的大小为:382K

4. 针对 ARM 目标系统进行编译和静态链接

使用中提供的arm-linux--gcc交叉编译工具,这里我没有使用默认的配置,而是只选择了我认为需要的功能。

$ PATH=:/home/zp//sb///arm-linux-gcc3.4.cs-.9.27/bin$PATH

$ make

$ make CROSS=arm-linux- -j2

$ make

删除不需要的内容后,静态链接后的大小为:509K

注意:在针对 ARM 目标进行编译时,您可以选择特定的交叉编译器。这将与针对本地主机进行编译相同,而无需更改 PATH 和 CROSS 变量。

安装、运行

编译完成后输入$ make 进行安装。

默认情况下,将在当前目录(源树的根目录)中创建一个名为“”的新目录。安装目录可以在配置期间设置。

安装完成后./目录下有如下文件和目录:

宾语 sbin usr

bin、sbin、usr 目录下存放着一些我们熟悉的程序,在 PC 上这些程序位于 /bin、/sbin、/usr/bin、/usr/sbin 目录下,这些安装的程序都是指向文件(位于 .//bin 目录下)本身的符号链接。

当你运行“已安装”的程序时,你实际上是在调用这个单一程序。例如:$ ./ls -l 实际上向它传递了两个参数:ls 和 -l。前面的命令相当于 $ ./ ls -l 。

对于前面编译示例中的安装,我们分别讨论了针对本地主机的编译和针对ARM目标系统的编译。

本地主机

很简单,你可以直接调用它,也可以调用连接到它的符号链接。当然,你也可以修改PATH变量来直接调用它们。

$./ls-l

$./ls-l

ARM 目标系统

可以使用模拟工具来运行,这里我们使用qemu,在/下安装qemu:$ sudo apt-get qemu

$ qemu-arm./ls -l

这里有一个问题,如果它与 C 库(甚至与 glibc 库)动态链接,那么运行它会产生分段错误:

加载

故障(核心)

如果使用静态链接,则没有问题。

它也提供了与init类似的功能,也非常适合嵌入式系统。

参考

1、

2、《构建嵌入式Linux系统》第6章。

3、

4.命令:

二维码
扫一扫在手机端查看

本文链接:https://by928.com/3460.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线