[英]System libraries in Linux vs. Windows
我的背景是 Windows,我是 Linux 菜鳥。 仍在嘗試圍繞一些基本概念,特別是系統庫:
這是正確的比喻嗎? (ntdll + CRT) <===> libc?
我意識到 C 和 Unix 一起進化,但我仍然感到驚訝。 是不是 C 接口硬連線到 Unix/Linux 的操作系統中? 在 Windows 中,非 C 程序鏈接到底層操作系統提供的 dll。 在 Linux 中是否可能沒有 OS/C 運行時邊界?
通常,大多數程序都鏈接到 libc,即使它們是用另一種語言編寫的。 它提供 C 標准庫接口(如 MSVCRT)、POSIX 功能(相當於 Win32 子系統的某些部分)和圍繞系統調用的包裝器。 例如,Rust 使用 libc,因為它提供了一個可移植的鏈接環境。
但是,在 Linux 上,您不必鏈接 libc。 Go 選擇直接進行系統調用,這意味着它可以發布沒有運行時依賴的 static 二進制文件。 這是可能的,因為 Linux 保證了穩定的 kernel ABI,但並非所有操作系統都這樣做(例如,macOS)。 因此,除非您擁有大量資源(例如整個編程語言團隊),否則這通常不是明智之舉,除非您只使用少數系統調用。
I should point out that even Windows is intrinsically wired into the C language: it uses C strings (granted, usually wide C strings) for its system calls, and much of the kernel is written in C. 即使您從頭開始使用 kernel,您仍然需要一個通用的 C 接口,因為幾乎每種編程語言都有與 C 交互的方式。
Linux系統調用記錄在syscalls(2)中,是用戶級程序的基礎。 調用約定記錄在ABI規范中。 ELF可執行格式已記錄在案,例如在elf(5)中。
另請閱讀高級 Linux 編程和Unix 理念。
您可以直接在匯編程序中進行系統調用。 Linux 組裝方法說明了這一點。 您會更喜歡使用 C 接口,因此最好使用libc
。 實際上, libc.so
是大多數 Linux 系統的基石。
玩ldd(1) , pmap(1) , strace(1) , BusyBox
一些編程語言實現幾乎沒有使用 C 並且可以直接調用系統調用(查看SBCL或Go ...)
Linux kernel和通常的GNU libc (或musl-libc ),以及GCC編譯器和binutils源代碼都是免費的,
另見http://linuxfromscratch.org/
圖形應用程序使用一些顯示服務器,通常是Xorg或Wayland 。 閱讀有關X11的信息。 您可能希望使用GTK或Qt 之類的 GUI 工具包對其進行編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.