在基于ARM的嵌入式系統開發中,常常用到交叉編譯的GCC工具鏈有兩種:


arm-linux-*arm-elf-*,兩者區別主要在于使用不同的C程式庫檔案。arm-linux-*使用


GNUGlibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統


的開發的C程式庫newlib.GlibcuClibc/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-libcuClibc。雖然兩者名字很相似,其實有差


別,下面就簡單的介紹一下二者的不同之處。uC -libc是最早為uClinux開發的程式庫,是


Jeff DionneKenneth Albanowski為在EKLs項目中支援m68000Linux-8086 C程式庫源碼


上移植的。uC-libc是一個完全的libc實現,但其中有一些api是非標准的,有些libc


標准也沒有實現。uC-libc穩定地支援 m68000ColdFire和沒有MMUARM。其主要設計


目標是“小”、"",并儘量與標准一致,雖然它的API和很多libc相容,但是似乎并


不像它期望的那樣和所有標准一致。




uClibc就是為了解決這個問題從uC-libc中發展出來的。它的所有API都是標准的(正確


的傳回類別,參數等等),它彌補了uC-libc中沒有實現的libc標准,現在已經被移植到


多種架搆中。一般來講,它儘量相容glibc以便使應用程式用uClibc改寫變的容易。


uClibc能夠在標准的 VM linuxuClinux上面使用。為了應用程式的簡潔,它甚至可以


在許多支援MMU的平台上被編譯成共用程式庫。Erik AndersonuClibc背后做了很多的工


作。uClibc支援許多家族的處理器:m68000ColdfireARMMIPSv850x86


i960SparcSuperHAlphaPowerPCHitachi 8。不斷增加的平台支援察看uClibc


能夠很容易的適應新的架搆。uClinux發行版提供了環境能夠讓你選取使用uC-libc或是


uClibc編譯。對于m68000Coldfire平台來說,選取uC-libc還是稍微好一點,因為它


支援共用程式庫,而共用程式庫是這些cpu經常使用的 libc.uClibc也几乎和所有的平台都能很好的工作。選取哪種libc取決于你的需求。




newlib 是一個用于嵌入式系統的開放來源碼的C語言程式程式庫,由libclibm兩個程式庫組成,特點是輕型級,速度快,可攜式到很多CPU架構上。newlib實現了許多複雜的功


能,包括字串支援,浮點運算,記憶體配置(malloc)I/O流函數(printffprinf()


等等)。其中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-linuxt-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-*針對執行linuxARM機器,其依賴于指定的C語言程式庫Glibc,因為同樣使用Glibclinux而使得arm-linux-*在執行linuxARM機器上編譯顯得更加和諧。




arm-elf-*則是一個獨立的編譯體系,不依賴于指定的C語言程式庫Glibc,可以使用newlib


等其他C語言程式庫,不要求作業系統支援,當其使用為嵌入式系統而設計的一些輕巧的C語言程式庫時編譯裸機程式(沒有linux等大型作業系統的程式),如監控程式,bootloader


能使得系統程式更加小巧快捷。





本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xuxinshao/archive/2007/08/29/1763503.aspx

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()