天天看點

uclibc、eglibc、glibc、Musl-libc之間的差別和聯系

1.Glibc glibc是GNU C Library 是GNU項目(GNU Project),所實作的 C語言标準庫(C standard library)。 目前,常見的桌面和伺服器中的GNU/Linux類的系統中,都是用的這套C語言标準庫。 其實作了常見的C庫的函數,支援很多種系統平台,功能很全,但是也相對比較臃腫和龐大。

2.uClibc 一個小型的C語言标準庫,主要用于嵌入式。其最開始設計用于uClinux(注:uClinux不支援MMU),是以比較适用于微處理器中。此處的u意思是μ,是Micro微小的意思。uClibc的特點:

  1. uClibc比glibc要小很多。
  2. uClibc是獨立的,為了應用于嵌入式系統中,完全重新實作出來的。和glibc在源碼結構和二進制上,都不相容。

3.EGLIBC Embedded GLIBC是glibc的原創作組織FSF所(新)推出的glibc的一種變體,目的在于将glibc用于嵌入式系統。 EGLIBC的目标是:

  1. 保持源碼和二進制級别的相容,與Glibc 源代碼架構和ABI層面相容。如果真正實作了這個目标,那意味着你之前用glibc編譯的程式可以直接用eglibc替換,而不需要重新編譯。 這樣就可以複用之前的很多的程式了。
  2. 降低(記憶體)資源占用/消耗
  3. 使更多的子產品為可配置的(以實作按需裁剪不需要的子產品)
  4. 提高對于交叉編譯(cross-compilation)和交叉測試(cross-testing)的支援

Eglibc的最主要特點就是可配置,這樣對于嵌入式系統中,你所不需要的子產品,比如NIS,locale等,就可以裁剪掉不把其編譯到庫中,使得降低生成的庫的大小。

4. Musl-libc C語言标準庫Musl-libc項目釋出了1.0版。Musl是一個輕量級的C标準庫,設計作為GNU C library (glibc)、 uClibc或Android Bionic的替代用于嵌入式作業系統和移動裝置。它遵循POSIX 2008規格和 C99 标準,采用MIT許可證授權,使用Musl的Linux發行版和項目包括sabotage,bootstrap-linux,LightCube OS等等。

目前openwrt LEDE預設使用Musl-libc了。。。CC分支還是uclibc

1. 寫程式,需要用到很多c語言的庫函數。所有的庫函數加起來,就是對應的C語言(标準)函數庫。 目前在普通GNU/Linux系統中所用的C語言标準庫,叫做glibc。其功能很全,函數很多,但是代碼太多,編譯出來的函數庫的大小也很大,即資源占用也很多。 嵌入式系統中,也需要C語言寫代碼實作特定功能,也需要用到C語言函數庫,但是由于嵌入式系統中,一般資源比較有限,是以不适合直接使用(太占用資源的)gLibc。 是以有人就又(沒有參考glibc,而是從頭開始,)重新實作了一個用于嵌入式系統中的,代碼量不是很大的,資源占用相對較少的,C語言函數庫,叫做uClibc,并且uClibc不支援MMU(記憶體管理單元)。而後來,glibc的開發者,又推出個Embedded glibc,簡稱eglibc,其主要目的也是将glibc用于嵌入式領域。相應最大的改動就在于,把更多的庫函數,改為可配置的,這樣,如果你的嵌入式系統中不需要某些函數,就可以裁剪掉,不把該函數編譯到你的eglibc庫中,使得最終生成的eglibc庫的大小變小,最終符合你的嵌入式系統的要求(不能超過一定的大小),這樣就實作了把glibc引用于嵌入式系統中的目的了。可以簡單的了解為: glibc,uClibc,eglibc都是C語言函數庫:

  1. uClibc是嵌入式系統中用的,glibc是桌面系統用的
  2. eglibc也是嵌入式系統中用的,是glibc的嵌入式版本,和glibc在源碼和二進制上相容。