查看 Linux 库/可执行文件版本信息

查看 Linux 库/可执行文件版本信息

在Windows中,EXE和DLL都有版本信息,至少包括以下字段:

  1. 文件版本
  2. 产品版本
  3. 内部名称
  4. 产品名称
  5. 版权

在 Linux 库/可执行文件中:

  • 存在哪些字段?
  • 如何查看此类信息?
  • 要阅读哪些工具/库?

答案1

版本信息未明确存储在ELF 文件。其中包含库的名称,其中soname包括主要版本。完整版本通常存储为库文件名的一部分。

如果你有图书馆,比如说libtest.so,那么你通常有:

  • libtest.so.1.0.1- 库文件本身,包含完整版本
  • libtest.so.1- 符号链接libtest.so.1.0.1,与 具有相同的名称soname
  • libtest.so-libtest.so.1用于链接的符号链接。

在库文件中libtest.so.1.0.1,动态部分将有一个条目叫作SONAME,即表示该库名为libtest.so.1.当您将程序链接到该库时,链接的程序将在动态部分的条目soname下存储库的信息。NEEDED

如果你想验证哪个ELF文件到底是什么,你可以尝试运行:

readelf -a -W elffile

其中elffile可以是可执行文件的库。

如果您只想获取库版本,您可以使用:

readelf -d  /path/to/library.so |grep SONAME

AFAIK,可执行文件中没有此类信息(至少默认情况下没有)。

或者,您可以依赖程序本身或您的打包系统,正如 Rahul Patil 所写的那样。

答案2

您可以使用ldconfig -v | grep libraryname,命令也有选项command -Vbinaryfile --version

例子 :

test@ubuntukrb12:~# ls --version
ls (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

您还可以根据您正在使用的发行版使用 yum 或 aptitude,例如。

在 RHEL5/CENTOS5/Fedora 中您可以使用yum info packagename或者如果安装了则使用rpm --version packagename

 [root@ldap1 ~]# yum info bind97
    Loaded plugins: downloadonly, fastestmirror, security
    Loading mirror speeds from cached hostfile
     * base: mirrors.sin3.sg.voxel.net
     * epel: mirror.imt-systems.com
     * extras: mirrors.sin3.sg.voxel.net
     * updates: mirrors.sin3.sg.voxel.net
    Installed Packages
    Name       : bind97
    Arch       : i386
    Epoch      : 32
    Version    : 9.7.0
    Release    : 10.P2.el5_8.4
    Size       : 6.3 M
    Repo       : installed
    Summary    : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
    URL        : http://www.isc.org/products/BIND/
    License    : ISC
    Description: BIND (Berkeley Internet Name Domain) is an implementation of the DNS
               : (Domain Name System) protocols. BIND includes a DNS server (named),
               : which resolves host names to IP addresses; a resolver library
               : (routines for applications to use when interfacing with DNS); and
               : tools for verifying that the DNS server is operating properly.

在 Ubuntu 中你可以使用aptitude show pkgnamedpkg --version pkgname

root@ubuntukrb12:~# aptitude show bind9utils
Package: bind9utils
State: installed
Automatically installed: yes
Version: 1:9.8.1.dfsg.P1-4ubuntu0.4
Priority: optional
Section: net
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Uncompressed Size: 306 k
Depends: libbind9-80, libc6 (>= 2.14), libdns81, libisc83, libisccc80, libisccfg82
Conflicts: bind9utils
Replaces: bind9 (<= 1:9.5.0~b2-1), bind9 (<= 1:9.5.0~b2-1)
Description: Utilities for BIND
 This package provides various utilities that are useful for maintaining a working BIND installation.

答案3

运行此命令以获取版本信息 -strings libssl.so.1.0.0 | grep "1\.0"

SSLv3 part of OpenSSL 1.0.2p-fips  14 Aug 2018
OpenSSL 1.0.2p-fips  14 Aug 2018
TLSv1 part of OpenSSL 1.0.2p-fips  14 Aug 2018
DTLSv1 part of OpenSSL 1.0.2p-fips  14 Aug 2018

答案4

根本的答案是Linux可执行文件和库二进制文件中没有这样的标准元数据。通常,询问发行版的包管理器是您能做的最好的事情 - 或者,正如其他答案中的一些示例所示,希望程序本身恰好包含识别字符串。

随着(在撰写本文时即将发布)Fedora Linux 36 版本,我们添加了将信息封装到ELF对象中。 Debian 也有一个这样做的概念证明。

一旦到位,您可以执行以下操作(例如):

$ readelf --notes /lib/libedit.so.0 |grep -A3 .note.package
Displaying notes found in: .note.package
  Owner                Data size    Description
  FDO                  0x00000084   FDO_PACKAGING_METADATA
    Packaging Metadata: {"type":"rpm","name":"libedit","version":"3.1-41.20210910cvs.fc36","architecture":"i386","osCpe":"cpe:/o:fedoraproject:fedora:36"}

...然后从那里,您可以获得包信息,其中包括其他信息,包括许可证、项目 URL 等。

相关内容