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

hou*_*let 17 fhs libraries binary files

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

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

是各种程序可以使用的函数,为了方便起见——比如当你需要一个 PHP 的 Javascript 模块时。

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

Aus*_*arn 17

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

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

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

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

  • 可执行文件:这些文件主要由可以直接运行的自包含代码组成。它们可以专门被任一格式,可直接由内核(东西等进行加载的对象的文件catbash以及python是所有这种类型的可执行文件),或者通过一些中介程序,它是本身可执行(的Minecraft被解释,pydoc以及cowsay是所有实施例这种类型的可执行文件)。第一种类型的可执行文件在 UNIX 系统上几乎从不具有文件扩展名,而第二种类型的可执行文件可能会也可能不会。这就是 FHS 所说的“二进制文件”。他们可以从其他可执行文件运行,但需要调用特殊功能调用它们(fork()以及exec()在C和C ++,东西出来的subprocess Python 等中的模块)并作为单独的进程运行。

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

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