Linux 中(共享对象)文件名如何工作
介绍
Linux 是一个开源操作系统,为用户提供了广泛的特性和功能。 Linux 的重要方面之一是共享对象 (so) 文件的使用。共享对象是 Linux 程序用来在不同进程之间共享代码和数据的文件。在本文中,我们将讨论共享对象文件名在 Linux 中的工作原理,并提供示例来说明概念。
什么是共享对象 (so) 文件?
共享对象是一种文件类型,包含可以在 Linux 中的多个进程之间共享的代码和数据。它们类似于Windows系统中的动态链接库(DLL)。当Linux程序需要使用共享对象时,它将其加载到内存中并使用文件中包含的代码和数据。
共享对象用于减少可执行文件的大小并减少运行程序所需的内存量。它们还提供了一种在不同程序之间共享代码和数据的方法,从而实现更高效和模块化的编程。
共享对象文件名的工作原理
Linux 中的共享对象文件名遵循用于标识文件及其内容的特定命名约定。文件名由几个部分组成,每个部分都提供有关文件的信息。
共享对象文件名的命名约定如下 -
lib<name>.so.<major version>.<minor version>
文件名的部分是 -
lib - 这是一个前缀,表明该文件是一个共享库。
- 这是库的名称。它通常是一个简短的描述性名称,用于标识库的用途。 .so - 这是一个后缀,表明该文件是共享对象。
<主要版本> - 这是一个表示库主要版本的数字。主版本号的变化表明库的 API 或 ABI 发生了重大变化。
<次要版本> - 这是一个表示库次要版本的数字。次要版本号的更改表示库的 API 或 ABI 发生了微小变化。
共享对象文件名示例
让我们看一下共享对象文件名的一些示例,看看它们是如何工作的。
libcrypto.so.1.1
该文件名表明该文件是一个名为“crypto”的共享库。主版本号为 1,次版本号为 1。这表明这是库的第一个主版本,并且对 API 或 ABI 进行了一些细微更改。
libssl.so.1.1
该文件名表明该文件是一个名为“ssl”的共享库。主版本号为 1,次版本号为 1。这表明这是库的第一个主版本,并且对 API 或 ABI 进行了一些细微更改。
libX11.so.6
该文件名表明该文件是一个名为“X11”的共享库。主要版本号为 6,次要版本号为 0。这表明这是库的第六个主要版本,并且 API 或 ABI 没有任何细微更改。
libgtk-3.so.0
该文件名表明该文件是一个名为“gtk-3”的共享库。主版本号为 0,次版本号为 0。这表明这是库的第一个主版本,并且 API 或 ABI 没有发生任何细微更改。
如何找到共享对象文件
动态链接器在运行时搜索并加载共享对象。动态链接器负责解析符号并将共享对象与程序的其余部分链接。
动态链接器在多个目录中搜索共享对象,包括 -
/lib
/usr
/usr/local/lib
LD_LIBRARY_PATH 环境变量中列出的目录
编译程序时,它包含运行所需的共享对象依赖项的列表。当程序执行时,动态链接器在上面列出的目录中搜索这些依赖项。如果它找到所需的共享对象,它将它们加载到内存中并将它们与程序链接。
如果没有找到所需的共享对象,程序将无法运行,并显示错误消息。要解决此问题,您可以安装缺少的共享对象或将包含缺少的共享对象的目录添加到 LD_LIBRARY_PATH 环境变量。
共享对象的好处
共享对象比静态库有几个好处,包括 -
减少内存使用 - 共享对象仅在需要时才加载到内存中,从而减少运行程序所需的内存量。
动态链接 - 共享对象允许程序在运行时与库链接,使它们能够适应环境的变化并仅在需要时加载库。
代码可重用性 - 共享对象允许开发人员在不同程序之间重用代码,从而减少开发时间并提高代码可维护性。
更快的程序启动 - 共享对象仅在需要时加载,减少程序启动时间并提高程序性能。
主要版本号与次要版本号
共享对象文件名中的主版本号和次版本号提供有关库与其他程序的兼容性的信息。主版本号的变化表明库的 API 或 ABI 发生了重大变化。使用旧版本库的程序可能与新版本不兼容。
次要版本号的更改表示库的 API 或 ABI 发生了微小变化。使用旧版本库的程序仍应与新版本兼容,但可能无法利用库的新功能或改进。
管理共享对象
在 Linux 中管理共享对象可能具有挑战性,特别是在处理库之间的依赖关系时。以下是在 Linux 中管理共享对象的一些技巧 -
使用包管理器 - 大多数 Linux 发行版都附带包管理器,允许您安装和管理共享对象及其依赖项。使用包管理器可以帮助确保您的系统是最新的并且拥有所有必要的依赖项。
避免修改系统目录 - 修改系统目录(例如 /lib 和 /usr)可能会导致动态链接器出现问题,并可能破坏其他程序。相反,应将共享对象安装在 /usr/local/lib 等目录或您的主目录中。
使用符号链接 - 如果您有共享对象的多个版本,则可以使用符号链接指向当前版本。这可以帮助确保依赖共享对象的程序仍然可以找到它,即使版本号发生变化。
检查 LD_LIBRARY_PATH - 如果您遇到缺少共享对象的问题,请检查 LD_LIBRARY_PATH 环境变量以确保它包含包含所需共享对象的目录。
结论
共享对象是 Linux 操作系统的重要组成部分。它们允许程序在进程之间共享代码和数据,从而减少可执行文件的大小和运行程序所需的内存量。 Linux 中的共享对象文件名遵循特定的命名约定,该约定提供有关文件内容的信息,包括库名称、主要和次要版本号以及文件类型。动态链接器在运行时在多个目录中搜索共享对象,包括 /lib、/usr 以及 LD_LIBRARY_PATH 环境变量中列出的目录。了解共享对象文件名的工作原理对于高效开发和运行 Linux 程序至关重要。