皮皮网

皮皮网

【html源码更改】【溯源码被查】【源码拉新】uclibc源码

时间:2024-12-25 15:18:10 分类:综合

1.arm-linux-gcc 和 arm-elf-gcc 的区别
2.openWRT发展历程
3.如何在OpenWRT环境下做开发
4.route OS与openWRT区别

uclibc源码

arm-linux-gcc 和 arm-elf-gcc 的区别

       åœ¨åŸºäºŽ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的说明,详见如下:

       ã€€ã€€The源码html源码更改re 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- C library which was part of the ELKs project with m

       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 m, 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 m 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项目中支持m在Linux- C库源码

       ä¸Šç§»æ¤çš„。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的

       æ ‡å‡†ä¹Ÿæ²¡æœ‰å®žçŽ°ã€‚uC-libc稳定地支持 m,ColdFire和没有MMU的ARM。其主要设计

       ç›®æ ‡æ˜¯â€œå°â€ã€"è½»",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并

       ä¸åƒå®ƒæœŸæœ›çš„那样和所有标准一致。

       uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确

       çš„返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到

       å¤šç§æž¶æž„中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。

       uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以

       åœ¨è®¸å¤šæ”¯æŒMMU的平台上被编译成共享库。Erik Anderson在uClibc背后做了很多的工

       ä½œã€‚uClibc支持许多系列的处理器:m,Coldfire,ARM,MIPS,v, x,

       i,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc

       èƒ½å¤Ÿå¾ˆå®¹æ˜“的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是

       uClibc编译。对于m和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等

       èƒ½ä½¿å¾—系统程序更加小巧快捷。

       Linaro prebuilt toolchain does support both hard and soft floating

       point. You can get it from pile?\n\n"); 

       return 0; 

       }

       ã€€ã€€ç¼–写Makefile文件

       # build helloworld executable when user executes "make"

       ã€€ã€€helloworld: helloworld.o

       $(CC) $(LDFLAGS) helloworld.o -o helloworld

       ã€€ã€€helloworld.o: helloworld.c

       $(CC) $(CFLAGS) -c helloworld.c

       ã€€ã€€# remove object files and executable when user executes "make clean"

       clean: 

       rm *.o helloworld 

       åœ¨è¿™ä¸¤ä¸ªæ–‡ä»¶çš„目录下,执行make 应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell! O' world, why won't my code compile?”。 这一步,主要保证我们的源程序是可以正常编译的。下面我们将其移植到OpenWRT上。

       ã€€ã€€ï¼ˆ2)将OpenWrt-SDK-brcmxx-for-Linux-x_-gcc-4.3.3+cs_uClibc-0.9..1.tar.bz2解压

       tar –xvf OpenWrt-SDK-brcmxx-for-Linux-x_-gcc-4.3.3+cs_uClibc-0.9..1.tar.bz2

       ã€€ã€€ï¼ˆ3)进入SDK

       cd OpenWrt-SDK-brcmxx-for-Linux-x_-gcc-4.3.3+cs_uClibc-0.9..1 

       å¯ä»¥çœ‹åˆ°é‡Œé¢çš„目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下

       ã€€ã€€ï¼ˆ4)在package目录下创建helloworld目录

       cd package 

       mkdir helloworld 

       cd helloworld

       ã€€ã€€ï¼ˆ5)创建src目录,拷贝 helloworld文件

       mkdir src 

       cp /home/wrt/test/helloworld.c src 

       cp /home/wrt/test/Makefile src

       ã€€ã€€ï¼ˆ6)在helloworld目录下创建Makefile文件

       è¿™ä¸ªMakefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。

       ã€€ã€€touch Makefile

       vim Makefile

       ã€€ã€€Makefile文件模板内容如下:

       ############################################## 

       # OpenWrt Makefile for helloworld program 

       # 

       # 

       # Most of the variables used here are defined in 

       # the include directives below. We just need to 

       # specify a basic description of the package, 

       # where to build our program, where to find 

       # the source files, and where to install the 

       # compiled program on the router. 

       # 

       # Be very careful of spacing in this file. 

       # Indents should be tabs, not spaces, and 

       # there should be no trailing whitespace in 

       # lines that are not commented. 

       # 

       ##############################################

       ã€€ã€€include $(TOPDIR)/rules.mk

       ã€€ã€€# Name and release number of this package

       PKG_NAME:=helloworld 

       PKG_RELEASE:=1

       ã€€ã€€# This specifies the directory where we're going to build the program.

       # The root build directory, $(BUILD_DIR), is by default the build_mipsel 

       # directory in your OpenWrt SDK directory 

       PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

       ã€€ã€€include $(INCLUDE_DIR)/package.mk

       ã€€ã€€# Specify package information for this program.

       # The variables defined here should be self explanatory. 

       # If you are running Kamikaze, delete the DESCRIPTION 

       # variable below and uncomment the Kamikaze define 

       # directive for the description below 

       define Package/helloworld 

       SECTION:=utils 

       CATEGORY:=Utilities 

       TITLE:=Helloworld -- prints a snarky message 

       endef

       ã€€ã€€# Uncomment portion below for Kamikaze and delete DESCRIPTION variable above

       define Package/helloworld/description 

       If you can't figure out what this program does, you're probably 

       brain-dead and need immediate medical attention. 

       endef

       ã€€ã€€# Specify what needs to be done to prepare for building the package.

       # In our case, we need to copy the source files to the build directory. 

       # This is NOT the default. The default uses the PKG_SOURCE_URL and the 

       # PKG_SOURCE which is not defined here to download the source from the web. 

       # In order to just build a simple program that we have just written, it is 

       # much easier to do it this way. 

       define Build/Prepare 

       mkdir -p $(PKG_BUILD_DIR) 

       $(CP) ./src/* $(PKG_BUILD_DIR)/ 

       endef

       ã€€ã€€# We do not need to define Build/Configure or Build/Compile directives

       # The defaults are appropriate for compiling a simple program such as this one

       ã€€ã€€# Specify where and how to install the program. Since we only have one file,

       # the helloworld executable, install it by copying it to the /bin directory on 

       # the router. The $(1) variable represents the root directory on the router running 

       # OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install 

       # directory if it does not already exist. Likewise $(INSTALL_BIN) contains the 

       # command to copy the binary file from its current location (in our case the build 

       # directory) to the install directory. 

       define Package/helloworld/install 

       $(INSTALL_DIR) $(1)/bin 

       $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/ 

       endef

       ã€€ã€€# This line executes the necessary commands to compile our program.

       # The above define directives specify all the information needed, but this 

       # line calls BuildPackage which in turn actually uses this information to 

       # build a package. 

       $(eval $(call BuildPackage,helloworld))

       ã€€ã€€ï¼ˆ7)返回到SDK的根目录

       æ‰§è¡Œmake进行编译 

       ç¼–译过程会在build_dir目录下完成 

       ç¼–译结果会放在 bin/[yourtarget]/package目录下helloworld_1_bcmxx.ipk

       ã€€ã€€ï¼ˆ8)上传helloworld_1_bcmxx.ipk

       ä½¿ç”¨sftp软件上传helloworld_1_bcmxx.ipk至路由器 

       æ‰§è¡Œ opkg install helloworld_1_bcmxx.ipk 

       è¾“å…¥hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。 

       æ‰§è¡Œ helloworld 查看程序的效果。

       ã€€ã€€Hell! O' world, why won't my code compile?

       ã€€ã€€ã€End】

       ã€€ã€€å¸Œæœ›å¯¹å¤§å®¶èƒ½æœ‰å¸®åŠ© :)

route OS与openWRT区别

       OpenWrt 项目由 å¹´ 1 月开始, 第一个版本是基于 Linksys 提供的 GPL 源码及 uclibc 中的 buildroot 项目,这个版本称为 “stable” 版, 在网上至今仍有很多项目使用这个版本,小米路由器的“MiWiFi”系统正是基于OpenWrt打造,MiWiFi系统界面很友好