為什麼 GLIBC 的代碼量這麼大?

從 http://http://linuxtoy.org/archives/how-much-gnu-is-there-in-gnu-linux.html 的中可以估算出,大約在百萬行級別(gcc的30%,gcc在百萬至千萬級)。按照我的理解,libc只是把kernel函數做一下封裝,為什麼需要這麼多代碼呢?


libc相當於msvcrt。

它的主要功能是給編程提供一些方便的庫,而並不僅僅是封裝內核調用。

拿 printf 為例,解析格式化字元串,讀入可變參數,這些都是用戶態的代碼,方便編程的,但它顯然不是封裝了一個內核調用那麼簡單。


大致搜了一下

Any Unix-like operating system needs a C library: the library which defines the ``system calls"" and other basic facilities such as open, malloc, printf, exit...

The GNU C Library is used as the C library in the GNU systems and most systems with the Linux kernel.

下面是它的文檔,它做的事情還是很多的

http://www.gnu.org/software/libc/manual/html_mono/libc.html


昨天剛好看了兩篇關於libc的文章,在

  • https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free

  • https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free1

在這兩篇文章雖然名字叫做"libc free",但是在介紹如何不使用libc讓程序正常運行的過程中比較底層的介紹了libc對於C程序起到的作用。這個系列的文章才寫到第二篇,讀完應該就會對libc有更加深入的了解,值得跟下去。

希望對樓主有點幫助

Update:

貌似上面這個系列文章中的第二篇還是2010寫的,part 3可能難產了。


一個簡單的例子, malloc, realloc, free 這一系列內存操作的函數,封裝的是 brk/mmap/mumap 這幾個系統調用。

而這幾個系統調用實現的是非常粗放的內存管理:

int brk(void *end_data_segment);
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);

函數原型就是這麼簡單,brk 的處理方式簡單粗暴,見c - What does brk( ) system call do?

mmap 原意為文件映射,也複雜不到那裡去(指對內存的操作,不指其本身的實現)。

而整個堆的具體的精細的實現和管理,其實都是 glibc 這樣的運行使庫實現的。

堆的管理本身是非常複雜的,可參考http://www.gfsoso.net/?q=Glibc+%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86+Ptmalloc2

而堆管理也只是 glibc 的功能之一罷了。


libc是非常非常非常強大的。它可不僅僅是只有一些低層調用而已。

它涵蓋了很多管理,還有錯誤控制等等。這些都會生成很多行代碼的。


推薦閱讀:

為什麼 Linux 下 PDF 閱讀器的生態這麼差?
Docker初體驗
Linux各發行版/桌面環境對於高分屏的支持怎麼樣?
祝賀 Linux 25 歲:25 個關於 Linux 的驚人真相!

TAG:Linux | 代碼 | 開源 | GNU | GLIBC |