二进制文件和库有什么区别?

二进制文件和库有什么区别?

我正在尝试了解文件系统层次结构标准。我已经查找了二进制文件和库,据我目前的理解:

二进制文件是二进制格式的计算机可读代码文件,直接用位控制 CPU 和处理器。

图书馆是各种程序可以使用的函数,为了方便起见 - 就像当您需要 PHP 的 Javascript 中的模块时一样。

这种理解正确吗?如果是,为什么我们仍然将库和二进制文件分开?一些图书馆二进制文件,对吗?一些二进制文件(cat、less、date、rm、cp 等)被使用和重用,就像它们是库一样......有人可以帮助解释其中的区别并帮助我找到这两个词的更好定义吗?谢谢。

答案1

您的理解大部分是正确的,但还有一些额外的事情需要考虑:

  1. “二进制”指的是人类不可读的东西。这通常指的是机器代码,但从这个意义上讲,许多其他文件也是二进制文件,大多数多媒体格式就是一个很好的例子。然而,FHS 对于该术语有更具体的用法。
  2. 库可以是二进制代码。事实上,其中的大部分内容/lib都是编译为机器代码的库。
  3. 虽然类似的东西cat在 shell 脚本中使用,例如调用库中的代码,但它们不是 FHS 意义上的库,因为它们可以自行运行。

由于这些观点,不编写标准文档的人中更常见的术语是:

  • 目标文件:这些是本机编译的机器代码,但甚至可能无法运行或不可调用。它们通常有一个.o扩展,除非它们属于其他类别之一,并且除了构建软件时之外,在大多数系统上几乎从未见过。我将它们列在这里是因为它们对于理解下面的一些事情很重要。

  • 可执行文件:这些文件主要由可直接运行的自包含代码组成。它们可能是特殊格式的目标文件,可以直接由内核加载(例如catbash、 和python都是此类可执行文件),或者由一些本身就是可执行文件的中间程序解释(Minecraft、pydoc、 和cowsay都是示例)这种类型的可执行文件)。第一种类型的可执行文件在 UNIX 系统上几乎没有文件扩展名,而第二种类型的可执行文件可能有也可能没有。这就是 FHS 所说的“二进制文件”。它们可以从其他可执行文件运行,但需要调用特殊函数来调用它们(fork()exec()C 和 C++ 中,在 Python 中模块外的东西subprocess等)并作为单独的进程运行。

  • 库:这些文件包含可重用代码,可以由另一个库或可执行文件调用。一旦库被加载(在谈论编译代码时称为“链接”),库中的代码(大多数)直接被其他代码调用,并在与调用它的代码相同的进程中运行。库分为三种通用类型:

    1. 静态库:这些是原始版本。它们由一个存档文件(通常是 AR 格式)组成,其中包含大量目标文件,每个目标文件对应库中的每个函数。目标文件链接到使用它们的可执行文件中,因此仅使用静态库的可执行文件本质上 100% 独立于任何其他代码。在 UNIX 系统上,它们通常具有.a扩展名。静态库的概念在编译的编程语言之外并不真正存在。
    2. 动态库:这些是当今最常用的库类型。动态库是一种特殊的目标文件,通常.so在 UNIX 上具有扩展名(.dll是 Windows 上的标准),在运行时由使用它的可执行文件加载。您在生产系统中发现的大部分内容/lib都是动态库。
    3. 模块:这相当于解释语言的动态库。处理与编译语言略有不同,与编译语言不同的是,文件可能既是模块又是可执行文件(请参阅http.serverPython 标准库中的示例)。

相关内容