Files

二進製文件和庫有什麼區別?

  • December 30, 2019

我正在嘗試了解文件系統層次結構標準。我已經查找了二進製文件和庫,據我所知:

二進製文件是二進制格式的電腦可讀程式碼文件,它直接用位控制 CPU 和處理器。

是各種程序可以使用的函式,為了方便起見 - 比如當您需要 PHP 的 Javascript 中的模組時。

這種理解正確嗎?如果是,我們為什麼還要將庫和二進製文件分開?有些庫二進製文件,對吧?並且一些二進製文件(cat、less、date、rm、cp 等)被使用和重用,就好像它們是庫一樣……有人可以幫助解釋差異並幫助我找到這兩個詞的更好定義嗎?謝謝你。

您的理解大部分是正確的,但還有一些額外的事情需要考慮:

  1. “二進制”是指人類不可讀的東西。這通常是指機器程式碼,但許多其他文件在這個意義上也是二進製文件,大多數多媒體格式就是一個很好的例子。然而,FHS 對該術語有更具體的用法。
  2. 庫可以是二進制程式碼。事實上,其中的大部分內容/lib都是編譯為機器程式碼的庫。
  3. 雖然cat在 shell 腳本中使用了類似呼叫庫中程式碼的東西,但它們不是 FHS 意義上的庫,因為它們可以自己執行。

由於這些觀點,不編寫標准文件的人中更常見的術語是:

  • 目標文件:這些是本機編譯的機器程式碼,但甚至可能無法執行或無法呼叫。.o除非它們屬於其他類別之一,否則它們通常具有副檔名,並且在大多數係統上幾乎從未見過,除非在建構軟體時。我在這裡列出了它們,因為它們對於理解下面的一些事情很重要。

  • 執行檔:這些文件主要由可直接執行的自包含程式碼組成。它們可能是可以由核心直接載入的特殊格式的目標文件(像cat,bashpython都是這種類型的執行檔),或者由一些本身是執行檔的中間程序解釋(Minecraft pydoc, 和cowsay都是範例這種類型的執行檔)。第一種類型的執行檔在 UNIX 系統上幾乎沒有文件副檔名,而第二種類型的執行檔可能有也可能沒有。這就是 FHS 所說的“二進製文件”。它們可以從其他執行檔執行,但需要呼叫特殊函式來呼叫它們(在 Cfork()exec()C++ 中,subprocessPython 等中的模組)並作為單獨的程序執行。

  • 庫:這些文件包含可被另一個庫或執行檔呼叫的可重用程式碼。一旦庫被載入(在談論編譯程式碼時稱為“連結”),庫中的程式碼(大部分)由其他程式碼直接呼叫,並在與呼叫它的程式碼相同的程序中執行。共有三種通用類型的庫:

    1. 靜態庫:這些是原始的品種。它們由一個存檔文件(通常是 AR 格式)組成,其中包含大量目標文件,庫中的每個函式都有一個。目標文件被連結到使用它們的執行檔中,因此僅使用靜態庫的執行檔基本上 100% 獨立於任何其他程式碼。在 UNIX 系統上,它們通常具有.a副檔名。靜態庫的概念在編譯的程式語言之外並不真正存在。
    2. 動態庫:這些是當今使用的最常見的庫類型。動態庫是一個特殊的對象文件,通常在 UNIX 上具有.so副檔名(.dll是 Windows 上的標準),在執行時由使用它的執行檔載入。您會在/lib生產系統中找到的大部分內容都是動態庫。
    3. 模組:這相當於解釋語言的動態庫。處理與編譯語言略有不同,並且與編譯語言不同,文件可能既是模組又是執行檔(參見http.serverPython 標準庫中的範例)。

引用自:https://unix.stackexchange.com/questions/390922