EDN首页   博客首页

0

关于投票
arm-elf与arm-linux的区别
    作者: forest  出自: http://www.linuxdiyf.com

    在基于ARM的嵌入式系统开发中,常常用到交叉编译的GCC工具链有两种:arm-linux-*和 arm-elf-*,两者区别主要在于使用不同的C库文件。arm-linux-*使用GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT专门为嵌入式系统的开发的C库newlib.Glibc。uClibc/uC-libc以及 newlib都是C语言库文件,只是所应用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型化C语言库,实现了Glibc部分功能。

  关于uClibc/uC-libc的说明,详见如下:

  There are two libc libraries commonly used with uClinux. uC-libc and uClibc. They are quite different despite their similar names. Here is a quick overview of how they are different.

  uC-libc is the original library for uClinux. It was based on sources from the Linux-8086 C library which was part of the ELKs project with m68000 support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete libc implementation, however, some of the API's are a little non-standard and quite a few common libc routines are not present. Currently it has stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was primary design goal is to be small and light weight. It does try to conform to any standards, although its API tries to be compatible with most libcs, it is not always exactly the same.

  The uClinux distribution provides an environment that can compile using either uC-libc or uClibc depending on your needs. For m68000 and Coldfire platforms it is generally better to chose uC-libc as it supports shared libraries and is the most commonly used libc for these CPUs. uClibc also works quite well with almost all platforms supported by the distribution. Which libc you choose to use will be decided by your requirements

uClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差别,下面就简单的介绍一下二者的不同之处。uC -libc是最早为uClinux开发的库,是Jeff Dionne和Kenneth Albanowski为在EKLs项目中支持m68000在Linux-8086 C库源码上移植的。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的标准也没有实现。uC-libc稳定地支持 m68000,ColdFire和没有MMU的ARM。其主要设计目标是“小”、"轻",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎 并不像它期望的那样和所有标准一致。

uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确的返回类型,参数等等),它弥补了uC-libc中没有 实现的libc标准,现在已经被移植到多种架构中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以在许多支持MMU的平台上被编译成共享库。Erik Anderson在uClibc背后做了很多的工作。uClibc支持许多系列的处理器:m68000,Coldfire,ARM,MIPS,v850, x86,i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc能够很容易的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是uClibc编 译。对于m68000和Coldfire平台来说,选择uC-libc还是稍微好一点,因为它支持共享库,而共享库是这些cpu经常使用的 libc.uClibc也几乎和所有的平台都能很好的工作。选择哪种libc取决于你的需求。

newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到很多CPU结构上。newlib实现 了许多复杂的功能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。

在为ARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用--with-newlib时,gcc编译器不使用Glibc。当没有交叉编译Glibc时,可以使用--with-newlib禁止连 接Glibc而编译bootstrap gcc编译器。从gcc源目录下的config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影响gcc连接C语 言库,t-linux(--target=arm-linux)默认使用Glibc,-arm-elf(--target=arm-elf)使用- Dinhibit_libc禁止连接Glibc,这时我们就可以使用newlib等其他C语言库编译GCC工具链。

虽然GCC工具链配置了不同的的C语言库,但由于这些C语言库都可以用来支持GCC,它们对核心数据的处理上不存在较大出入。因而arm-linux-* 和 arm-elf-*区别主要表现在C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI\启动代码以及不同系统特性等微小的差别。

arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可以编译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只是在遵循下面的描述时系统程序显得更加协调:

arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。

arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib等其他C语言库,不要求操作系统支持,当其使用为嵌 入式系统而设计的一些轻巧的C语言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等能使得系统程序更加小巧 快捷。
系统分类: ARM
用户分类: Linux
标签: 无标签
来源: 转贴
发表评论 阅读全文(2103) | 回复(1)

0

关于投票
Linux(Ubuntu)便笺
常用命令:
NO   分类   PS1  命令名   用法及参数   功能注解         
1   文件管理   #   ls   ls -a   列出当前目录下的所有文件,包括以.头的隐含文件         
    文件管理   #   ls   ls -l或ll   列出当前目录下文件的详细信息         
    文件管理   #   pwd   pwd   查看当前所在目录的绝对路经         
    文件管理   #   cd   cd ..   回当前目录的上一级目录         
    文件管理   #   cd   cd -   回上一次所在的目录         
    文件管理   #   cd   cd ~ 或 cd   回当前用户的宿主目录         
    文件管理   #   cd   cd ~用户名   回指定用户的宿主目录         
2   文件管理   #   mkdir   mkdir 目录名   创建一个目录         
    文件管理   #   mkdir   mkdir –p   递归式去创建一些嵌套目录         
    文件管理   #   rmdir   Rmdir 空目录名   删除一个空目录         
3   文件管理   #   rm   rm 文件名 文件名   删除一个文件或多个文件         
    文件管理   #   rm   rm -rf 非空目录名   递归删除一个非空目录下的一切,不让提式-f         
4   文件管理   #   cat   cat文件名   一屏查看文件内容         
5   文件管理   #   more   more文件名   分页查看文件内容         
6   文件管理   #   less   less 文件名   可控分页查看文件内容         
7   文件管理   #   grep   grep字符 文件名   根据字符匹配来查看文件部分内容         
8   文件管理   #   mv   mv 路经/文件  /经/文件   移动相对路经下的文件到绝对路经下         
    文件管理   #   mv   mv 文件名 新名称   在当前目录下改名         
9   文件管理   #   cp   cp /路经/文件  ./   移动绝对路经下的文件到当前目录下         
10  文件管理   #   find   find 路经 -name “字符串”   查找路经所在范围内满足字符串匹配的文件和目录
11  文件管理   #   ln   ln 源文件 链接名   创建当前目录源文件的硬链接         
                         ln /home/test /usr/test1   在/usr下建立/home/test的硬链接         
12  文件管理   #   ln   Ln -s a b   创建当前目录下a的符号链接b      
13  文件管理   #   touch   touch file1 file2   创建两个空文件         
14  磁盘管理   #   df   df   用于报告文件系统的总容量,使用量,剩余容量。         
15  磁盘管理   #   du   du -b /home   查看目前/HOME目录的容量(k)及子目录的容量(k)。         
16  磁盘管理   #   fdisk   fdisk -l   查看系统分区信息      
17  磁盘管理   #   fdisk   fdisk /dev/sdb   为一块新的SCSI硬盘进行分区      
18  磁盘管理   #   mkfs.ext3   Mkfs.ext3 /dev/sdb1 为第一块SCSI硬盘的第一主分区
格式化成ext3的文件系统      
                 mkfs.ext2   Mkfs.ext2/dev/sdb2    格式化成ext2文件系统      
19  磁盘管理   #   mount   mount -t 文件系统类型 设备路经  访问路经         
    磁盘管理   #      文件系统类型            
                       Iso9660   光驱文件系统         
                          vfat   Fat文件系统(windows)         
    挂载光驱   #   mount –t iso9660 /dev/cdrom /mnt/cdrom           
    挂载FAT   #   mount –t vfat /dev/hda5 /mnt/cdrom    挂第一个ide的第五个逻辑分区      
17  磁盘管理   #   Umount /mnt/cdrom     卸载/mnt/cdrom为空      
18  文件权限   #   chmod   chmod u+s file   为file的属主加上特殊权限         
           chmod g+r file   为file的属组加上读权限         
           chmod o+w file   为file的其它用户加上写权限         
           chmod a-x file   为file的所有用户减去执行权限      
           chmod 765 file   为file的属主设为完全权限,属组设成读写权,其它用户具有读和执心权限
点击看大图   
19  文件权限   #   chown   chown root /home   把/home的属主改成root用户      
20  文件权限   #   chgrp   chgrp root /home   把/home的属组改成root组      
21  打印管理   #   redhat-config-printer-tui   进入安装打印机界面         
22  打印管理   #   lp   lp –d hptr file   打印file到hptr的打印机上         
23  打印管理   #   lpq   Lpq –P 打印机名   查看打印机的状态         
24  打印管理   #   lprm   Lprm –P 打印机名 a   删除打印机内的打印作业         
25  打印管理   #   disable   Disable –r “changing paper” HPtr    禁用打印机并提示原因      
26  打印管理   #   enable   Enable HPtr   重新启用被禁用的         
27  用户管理   #   useradd   Useradd   创建一个新的用户         
28  用户管理   #   groupadd   Groupadd 组名   创建一个新的组         
29  用户管理   #   passwd   Passwd 用户名   为用户创建密码         
30  用户管理   #   Passwd -d   Passwd -d用户名   删除用户密码也能登陆         
31  用户管理   #   Passwd -l   Passwd -l用户名   锁定账号密码         
32  用户管理   #   Passwd -u   Passwd -u用户名   解锁账号密码         
33  用户管理   #   Passwd -S   Passwd -S用户名   查询账号密码         
34  用户管理   #   Usermod -l   Usermod -l 新用户名 老用户名   为用户改名
35  用户管理   #   Usermod -L   Usermod -L 要锁定用户名   锁定用户登陆         
36  用户管理   #   Usermod -U   Usermod –U解锁用户名   解锁用户登陆         
37  用户管理   #   Usermod -u   Usermod –u 501用户名   改变用户UID         
38  用户管理   #   Userdel   Userdel–r 用户名   删除用户一切         
39  用户管理   #   Groupmod -n   Groupmod –n新用户名 老用户名   为组改名         
40  用户管理   #   Groupmod -g   Groupmod –g 501 组名   改变组GID         
41  用户管理   #   groupdel   Groupdel组名    先应删它的用户   删除组         
42  用户管理   #   gpasswd -a   gpasswd -a 用户名 组名   增加用户到组         
43  用户管理   #   Id    id   用户名   查用户信息         
44  软件管理   #   rpm -qa   rpm –qa | less   查询已安装RPM         
45  软件管理   #      rpm –qa | grep ftp   查询指定RPM         
46  软件管理   #   rpm -q   rpm -q 已安装的RPM包   查是否安装         
47  软件管理   #      rpm -q telnet-server   查看telnet服务器包      
48  软件管理   #   rpm -qi   rpm –qi 软件包名称   查看软件的描述信息      
49  软件管理   #   rpm -ql   rpm –ql软件包名称   查询软件包的文件列表      
50  软件管理   #   rpm -qf   rpm –qf软件包名称   查询某个文件所属的软件包      
51  软件管理   #   rpm -qp   rpm –qp软件包全名   查询未安装的软件包信息      
52  软件管理   #   rpm -e   rpm –e 软件包名称   删除具体的软件包      
53  软件管理   #   rpm -U   rpm –Uvh软件包全名   升级软件包并显示过程      
54  软件管理   #   rpm -ivh   rpm –ivh 软件包全名   安装软件包并显示过程      
55  软件管理   #   rpm -V   rpm –V软件包名称   验证软件包的大小,类型等      
56  软件管理   #   tar    -c 创建包 –x 释放包  -v 显示命令过程 –z 代表压缩包      
57  软件管理   #   tar -cf   tar –cvf benet.tar /home/benet   把/home/benet目录打包      
58  软件管理   #   tar -czf   tar –zcvf benet.tar.gz /mnt   把目录打包并压缩      
59  软件管理   #   tar –tf   tar –tf benet.tar   看非压缩包的文件列表      
60  软件管理   #   tar –tzf   tar –tf benet.tar.gz   看压缩包的文件列表      
61  软件管理   #   tar –xf   tar –xf benet.tar   非压缩包的文件恢复      
62  软件管理   #   tar –zxvf   tar –zxvf benet.tar.gz   压缩包的文件解压恢复      
63  软件管理   #   tar -jxvf   tar –jxvf benet.tar.bz2         
64  软件管理   #   diff   diff file1 file2 > 补丁名.patch   为新旧文件生成补丁文件      
65  软件管理   #   diff   diff file1 file2   比较两个文件的区别

(Ubuntu)
Q:如何清空回收站
A:sudo rm ~/.Trash/* -fr

Q:如何安装/卸载 .deb 文件?
A:安装sudo dpkg -i package_file.deb
   卸载sudo dpkg -r package_name

Q: 如何转换 .rpm 文件到 .deb 文件?
A:sudo alien package_file.rpm


Q: 如何创建root账户密码?
A:sudo passwd root

-------------------------------



系统分类: 自由话题
用户分类: Linux
标签: 无标签
来源: 无分类
发表评论 阅读全文(832) | 回复(0)
总共 , 当前 /