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


11

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

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

为了方便起见,是可由各种程序使用的函数-例如,当您需要PHP Javascript中的模块时。

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

Answers:


10

您的理解大体上是正确的,但还需要考虑一些其他事项:

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

由于上述几点,在不编写标准文档的人们中,更常见的术语是:

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

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

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

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

更不要忘了脚本文件,这些文件是可执行文件的特殊情况,因为它们依赖于一个二进制可执行文件(bashpython)来运行。而且,in脚本/lib可以被其他脚本使用。比较Python模块。
墨菲(Murphy)2017年

1
属于“由某些中间程序. Tow of the examples I listed for that (pydoc` 解释的cowsay脚本”。
奥斯汀·赫默尔加恩

澄清#3-模块是用于扩展功能的可加载代码位。Apache / php模块是解释脚本部分的一个很好的例子,但是内核模块也很重要...我还要加一点以涵盖大多数人类可读的解释语言,例如用于各种shell,php,perl等的脚本。每个FHS都将在/ bin或/ sbin目录中,因为它们是可执行程序
ivanivan

作为扩展的模块通常被称为插件。Apache的命名选择基于调用内核驱动程序模块的旧UNIX标准,并且现在已经成为Web服务器的通用术语(由于市场营销),但是与大多数其他软件相比,这是一个奇怪的情况,后者普遍使用“插件”或“扩展名”。
奥斯汀·海默加恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.