导航:首页 > 源码编译 > linux嵌入式编译

linux嵌入式编译

发布时间:2022-06-13 11:42:24

linux嵌入式交叉编译工具链问题 浅谈

简介

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。有时出于减小libc库大小的考虑,也可以用别的c库来代替glibc,例如uClibc、dietlibc和newlib。交叉编译工具链主要包括针对目标系统的编译器gcc、目标系统的二进制工具binutils、目标系统的标准c库glibc和目标系统的Linux内核头文件。第一个步骤就是确定目标平台。每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。因此,当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。例如,建立基于ARM平台的交叉工具链,目标平台名为arm-linux-gnu。

交叉编译工具链的制作方法

  1. 分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。

  2. 通过Crosstool脚本工具来实现一次编译生成交叉编译工具链。

  3. 直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。

方法1相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法2或方法3构建交叉工具链。方法3的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议你慎用此方法。


方法1:分步构建交叉编译工具链


  1. 下载所需的源代码包

  2. 建立工作目录

  3. 建立环境变量

  4. 编译、安装Binutils

  5. 获取内核头文件

  6. 编译gcc的辅助编译器

  7. 编译生成glibc库

  8. 编译生成完整的gcc

由于在问答中的篇幅,我不能细述具体的步骤,兴趣的同学请自行阅读开源共创协议的《Linux from scratch》,网址是:linuxfromscratch dot org


方法2:用Crosstool工具构建交叉工具链(推荐)

Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是kegel dot com/crosstool。用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的你,建议使用此方法。

运行which makeinfo,如果不能找见该命令,在解压texinfo-4.11.tar.bz2,进入texinfo-4.11目录,执行./configure&&make&&make install完成makeinfo工具的安装

下载所需资源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/目录下解压crosstool-0.43.tar.gz,命

令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz

接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模板,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:

# cd crosstool-0.43

# cp demo-arm.sh arm.sh

# vi arm.sh

修改后的arm.sh脚本内容如下:

#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定义工具链源码所存放位置。
RESULT_TOP=$HOME/arm-bin#定义工具链的安装目录
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定义支持C,C++语言
exportGCC_LANGUAGES
#创建/opt/crosstool目录
mkdir-p$RESULT_TOP
#编译工具链,该过程需要数小时完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.

在arm.sh脚本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。

KERNELCONFIG='pwd'/arm.config#内核的配置
TARGET=arm-linux#编译生成的工具链名称
TARGET_CFLAGS="-O"#编译选项


gcc-3.3.6-glibc-2.3.2.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果在编译过程中发现有些库不存在时,Crosstool会自动在相关网站上下载,该工具在这点上相对比较智能,也非常有用。

BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根据实际情况填写)
GDB_DIR=gdb-6.5

将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

#cdcrosstool-0.43
#./arm.sh

经过数小时的漫长编译之后,会在/opt/crosstool目录下生成新的交叉编译工具,其中包括以下内容:

arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf

然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/ bashrc文件的最后添加下面一行,在bashrc文件中添加环境变量

export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH

至此,arm-linux下的交叉编译工具链已经完成,现在就可以使用arm-linux-gcc来生成试验箱上的程序了!












Ⅱ 嵌入式Linux开发中的交叉编译是什么意思

所谓交叉编译是指在A系统上编译B系统的二进制代码。
嵌入式的应用程序,甚至操作系统是运行在特定目标平台上,例如一块arm架构的目标板。而编译程序的时候通常是在普通x86构架下的Linux操作系统的PC上。在PC上编译嵌入式应用程序的过程叫做交叉编译。

Ⅲ 嵌入式linux的程序怎样编译

编译及安装简要步骤: 编辑Makefile版本信息 定义内核特性,生成配置文件.config,用于编译:make xconfig 编译内核:make 安装内核:make install 安装模块:make moles_install

Ⅳ 嵌入式Linux内核编译求解!!!!!

本人也是试验中的菜鸟一枚,有些经验还有理解大家分享。
你说的这些步骤,是开发板移植或者产品移植过程中的一环,移植,就是把PC上编写好的,已经可以完成功能的程序编程开发板芯片,你用的是arm的芯片,那就是用arm的指令系统可以辨认执行的文件。
zimage是内核映像的image文件的压缩版,主要减少映像大小。如果是用pc机的编译系统编译出来,就是能在PC机上运行的linux内核,OS,放在开发板上,也是一样的功用。
至于开发板内核会不会变,应该说你每一次烧入一个内核的时候,效果都相当于对PC机进行了一次系统重装,系统肯定是会变的,变成了你烧录进去的编译好的linux2.6.28.这一点可以肯定。但是是不是变得和以前不一样就不一定了,也许内核的文件从头到尾都是一个,更有可能的是你手上就没有出厂时烧入的内核程序,人家没给你,那么你除非不烧,掠过内核的部分永远不变,只改变文件系统,那么内核肯定是会变的。另外对内核改变不需要太犹豫,没有那块开发板上的文件从头到尾没变过的,内核文件也一样,会有这种情况的只有出厂产品。开发板就是大胆折腾,才能把开发板玩好。
系统内核用zimage这样的形式,是深层的原因是因为节省固化flash空间,还是有利于cpu内部结构运行,没有研究过。
zimage不是直接下到板子里就能运行的,配置的问题先不说,启动不是直接从zimage启动的,因为这个是压缩文件,至少要解压之后才能使用。
但是实际上用的也不是zimage映像文件。而是uimage文件。zimage和uimage差不多。
uimage文件是用于被uboot引导的文件,是一个64K的文件头和一个zimage文件组成的。
从编译角度来说,现在手上的内核的创建映像的makefile文件中的目标似乎是一口气把这几个映像文件都生成了。单独使用make uimage也能生成uimage映像文件。但既然uimage是从zimage转化而来,那么应该是必须先要编译出了zimage才能有uimage文件生成。
有了uimage文件后,就要有uboot文件,有的板子因为搬运和运行的操作流程,还会有一级bootstrap,这是因为内部ram大小决定的。uboot是为了必要的硬件初始化和引导内核和文件系统而存在的,uboot将内核需要的软件和硬件环境都配置好了之后,将内核复制解压到内存中,并跳转到内存里内核的入口,将操作权交给内核。内核正是启动,配置无误后挂载文件系统。
如果这些程序都完成,那么开发板就可以运行起来了。
很不幸,我现在还没有搞定。
但是如果你不需要移植,只是要运用一个配置好的开发板,那么你想了解的可能是这个,下载到flash中文件的名称和顺序和地址。
名称没有确定的,但是大概是这样的形式:bootloader.bin(其中包括uboot和其它形式boot,可能最初还会有bootstrap)+zimage+root.(jffs*/yaffs*/etx*)等。
烧入的地址也是要严格对应程序,或者手册说明建议中的,如果出现相互覆盖或者该有的文件不在应该的位置,那么也是不会启动成功的。
linux和嵌入式linux都不是很简单的,任重道远,共同进步吧。

Ⅳ 我是个嵌入式新手,在编译linux-2.6.30.1的时候出现了如下错误: /tmp/ccygt4eh.s:34169: Fatal error: can

嵌入式系统是面向用户、面向产品、面向应用的,它必须与具体应用相结合才会具有生命力、才更具有优势。因此可以这样理解上述三个面向的含义,即嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。所以嵌入式系统有以下几个特点:

简述嵌入式系统的特点

1、系统内核小。由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多。比如Enea公司的OSE分布式系统,内核只有5K,而Windows的内核简直没有可比性。

2、专用性强。嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全两个概念。

3、系统精简。嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。

4、高实时性的系统软件(OS)是嵌入式软件的基本要求。而且软件要求固态存储,以提高速度;软件代码要求高质量和高可靠性。

5、嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。嵌入式系统的应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。

6、嵌入式系统开发需要开发工具和环境。由于其本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。

7、嵌入式系统与具体应用有机结合在一起,升级换代也是同步进行。因此,嵌入式系统产品一旦进入市场,具有较长的生命周期。

Ⅵ 在嵌入式LINUX中,可以直接编译并运行程序吗

当然可以。理论上,你只需要在平台中有一个可以跑的编译器(准确说环境比较合适吧。。),可以把你的代码翻译成平台可以运行的格式,那么就行了。。理论上,你甚至自己可以做一个
“编译器”,如何在嵌入式系统中,把你的某个代码,比如:“主函数**打印
¥我爱XXX¥退出”翻译成你的平台可以执行的格式,然后运行。。。^_^,起码我是这样理解的。但是MS还没有人这样做。原因可能主要是几个:1.嵌入式平台的资源有限。2.目前MS在里面搭一个合适的开发环境,无疑是很痛苦的事情。

Ⅶ 在嵌入式LINUX中,可以直接编译并运行程序吗

当然可以。
理论上,你只需要在平台中有一个可以跑的编译器(准确说环境比较合适吧。。),可以把你的代码翻译成平台可以运行的格式,那么就行了。。
理论上,你甚至自己可以做一个 “编译器”,如何在嵌入式系统中,把你的某个代码,比如:

主函数**
打印 ¥我爱XXX¥
退出

翻译成你的平台可以执行的格式,然后运行。。。
^_^,起码我是这样理解的。
但是MS还没有人这样做。
原因可能主要是几个:
1.嵌入式平台的资源有限。
2.目前MS在里面搭一个合适的开发环境,无疑是很痛苦的事情。

Ⅷ linux嵌入式系统的开发为什么要用到交叉编译器交叉编译器的作用是什么

linux嵌入式系统的开发的应用资料,交叉编译器等等,这方面的资料,

到“工搜网资料文库”索取吧。那里有详细的资料

Ⅸ 嵌入式linux应用程序通常用什么编译器编译

Linux有一系列功能强大的编译器:vi、emace是屏幕交互式编译器,GNU CC是GNU项目中符合ANSI C标准的编译系统。

vi命令是Linux下全屏幕文本编辑,虽然这个编译器特简陋,对于初学者来说不是很友好,但是在Linux中vi的作用非常大。

主要的三种模式:命令模式、输入模式、末行模式。

掌握这三种模式十分重要:

命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。

输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。

末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。

vim是vi编辑器的改进版本,在vi编译的基础上扩展了很多实用的功能。

至于vi/vim的命令就不给大家介绍了,我们在日常实际的使用之中随着积累都会掌握。

Ⅹ 请简述嵌入式linux内核的编译过程

编译及安装简要步骤:
编辑Makefile版本信息

定义内核特性,生成配置文件.config,用于编译:make xconfig

编译内核:make

安装内核:make install

安装模块:make moles_install

具体步骤如下:

内核配置

先定义内核需要什么特性,并进行配置。内核构建系统(The kernel build system)远不是简单用来构建整个内核和模块,想了解更多的高级内核构建选项,你可以查看 Documentation/kbuild 目录内的内核文档。

可用的配置命令和方式:

make menuconfig

命令:make menuconfig

编译内核

编译和安装内核

编译步骤:

$ cd /usr/src/linux2.6

$ make

安装步骤 (logged as

$ make install

$ make moles_install

提升编译速度

多花一些时间在内核配置上,并且只编译那些你硬件需要的模块。这样可以把编译时间缩短为原来的1/30,并且节省数百MB的空间。另外,你还可以并行编译多个文件:

$ make -j <number>

make 可以并行执行多个目标(target)(KEMIN:前提是目标规则间没有交叉依赖项,这个怎么做到的?)

$ make -j 4

即便是在单处理器的工作站上也会很快,读写文件的时间被节省下来了。多线程让CPU保持忙碌。

number大于4不见得有效了,因为上下文切换过多反而降低的工作的速度。

make -j <4*number_of_processors>

内核编译tips

查看完整的 (gcc, ld)命令行: $ make V=1

清理所有的生成文件 (to create patches...): $ make mrproper

部分编译:$ make M=drivers/usb/serial

单独模块编译:$ make drivers/usb/serial/visor.ko

最终生成的文件

vmlinux 原始内核镜像,非压缩的

arch/<arch>/boot/zImage zlib压缩的内核镜像(Default image on arm)

arch/<arch>/boot/bzImage bzip2压缩的内核镜像。通常很小,足够放入一张软盘(Default image on i386)

阅读全文

与linux嵌入式编译相关的资料

热点内容
python怎么调用knn 浏览:807
excel怎么保存pdf 浏览:68
模拟退火算法matlab代码 浏览:115
算法工程师年龄大了以后怎么办 浏览:261
人教版高中化学pdf 浏览:706
pic单片机网口编程 浏览:25
大学必须学python吗 浏览:870
养什么植物解压 浏览:464
华为云服务器怎么装 浏览:481
ensp查看配置好的命令 浏览:85
短视频推荐系统python 浏览:805
加密超级大师怎么恢复文件 浏览:274
浏览器下载图片解压失败 浏览:197
android抢单 浏览:22
电信用联通游戏服务器地址 浏览:75
安卓缺什么软件 浏览:221
安卓app如何植入群号 浏览:765
php排序按钮 浏览:637
php位异或运算 浏览:866
服务器共享型有什么坏处 浏览:28