簡體   English   中英

我對C庫感到困惑

[英]I'm confused with C libraries

好的,這就是事情。

大多數人在第一次接觸C語言時同時了解C標准庫,我也不例外。 但是當我正在研究linux時,我傾向於與C庫混淆。 首先,我知道你在Linux發行版上安裝gcc作為一個靜態庫,你會得到一個很好的舊C標准庫。 在那之后,當你連接到互聯網時,你很快就會得到一個新的穩定版本的glibc。

我開始研究glibc API,這里我搞砸了。 glibc似乎支持大量的lib,基本上從POSIX C Standard lib(它實現標准的C lib(包括我知道的C99))到它自己的基於POSIX標准C lib的擴展。

這是否意味着glibc實際修改或添加了POSIX C標准庫中的函數? 甚至添加全新的標題集? 因為我看到一些函數不在標准C lib中但實際包含在標准C頭中(例如strnlen()in

還提到我提到的關於'glibc制作全新標題集'的內容,是因為我開始看到一些看起來非常獨特的頭文件,例如linux / blahblah.h或sys / syscalls.h <=(這些是只有glibc支持的庫?)

接下來的問題是我實際聽說linux是基於C語言構建的。 這是否意味着linux使用它自己的gcc編譯器編譯自己????????

對於第一個問題,glibc遵循標准C和POSIX,來自About glibc

GNU C庫主要設計為便攜式高性能C庫。 它遵循所有相關標准,包括ISO C11和POSIX.1-2008。 它也是國際化的,並且具有已知的最完整的國際化接口之一。

對於第二個問題,是的,您可以使用gcc編譯Linux。 甚至gcc本身也可以用gcc編譯,它叫做bootstrapping

Glibc實現了POSIX,ANSI和ISO C標准,並添加了自己的'fluff',它稱之為“glibc擴展”。 它們全部“混合在一起”的原因是因為它們將庫編寫為一個包,沒有單獨的POSIX-only glibc。

<linux/blah>不是glibc的一部分。 它是由glibc以外的人專門為操作系統編寫的集合頭,使程序員可以訪問Linux內核API。 它是Linux內核的“組成部分”,隨之安裝,用於內核黑客攻擊。 <sys/blah>是glibc的一部分,特定於Linux。 它可以訪問相當抽象的Linux系統API。

至於你的第二個問題,是的。 Linux是用C語言編寫的,因為它是(根據Linus)內核和系統編程的唯一編程語言。 這樣做的方法是通過一種稱為bootstrapping的技術,其中構建一個小編譯器(通常在ASM中手動)並構建整個內核或整個GCC。

還有一件事需要注意:libc的一個目的是從實際的系統內核中抽象出來。 因此,libc是應用程序中特定於內核的一部分。 如果你有一個具有不同系統調用的不同內核,則需要一個特殊編譯的libc。 因此,AFAIK通常將libc鏈接為共享庫。

在linux上,我們通常安裝了glibc,因為linux系統通常是GNU / Linux系統,在Linux內核之上有一個GNU工具鏈。

是的,glibc確實在某些地方擴展了標准: asprintf()函數例如起源於gnu-addition。 它隨后幾乎成為C11標准,但直到它成為它們的一部分,它的使用將需要一個基於glibc的系統,或靜態鏈接glibc。

默認情況下,glibc標頭不會定義這些gnu添加項。 您可以通過在包含適當的標頭之前定義預處理器宏GNU_SOURCE或通過將-std=gnu11指定給gcc調用來打開它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM