Visualizando informações da versão da biblioteca Linux / executável

38

No Windows, EXE e DLL têm informações de versão, incluindo pelo menos os seguintes campos:

  1. versão do arquivo
  2. Versão do produto
  3. nome interno
  4. Nome do Produto
  5. direito autoral

Na Biblioteca Linux / Executável:

  • Quais campos estão presentes?
  • Como visualizar essas informações?
  • Quais ferramentas / bibliotecas para ler?
ceder
fonte
Eu atualizei mais algumas coisas por favor, verifique agora ..
Rahul Patil
O ldconfig precisa de root? Que tal verificar um específico libxxx.so arquivo e não quer executar um exe com --version (ele pode falhar)
linquize
não há necessidade de raiz, já que / sbin / path não está definido no ambiente normal do usuário, você pode executá-lo usando o caminho absoluto, por exemplo. /sbin/ldconfig -p
Rahul Patil

Respostas:

36

As informações da versão não são armazenadas explicitamente em um arquivo ELF . O que você tem lá é o nome da biblioteca, o soname, que inclui a versão principal. A versão completa é geralmente armazenada como parte do nome do arquivo da biblioteca.

Se você tem uma biblioteca, digamos libtest.so, normalmente você tem:

  • libtest.so.1.0.1 - O próprio arquivo da biblioteca, contendo a versão completa
  • libtest.so.1- Ligação simbólica para libtest.so.1.0.1, com o mesmo nome desoname
  • libtest.so- Link simbólico libtest.so.1usado para vincular.

No arquivo da biblioteca libtest.so.1.0.1, haverá uma entrada chamada SONAMEna seção dinâmica, que dirá que essa biblioteca é chamada libtest.so.1. Quando você vincula um programa a essa biblioteca, o programa vinculado armazena o sonameda biblioteca na NEEDEDentrada na seção dinâmica.

Se você deseja verificar o que exatamente está em qual arquivo ELF, você pode tentar executar:

readelf -a -W elffile

onde elffilepode ser uma biblioteca de um executável.

Se você simplesmente deseja obter a versão da biblioteca, pode jogar com:

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

AFAIK, não existe essa informação (pelo menos não por padrão) nos arquivos executáveis.

Ou você pode confiar no próprio programa ou no seu sistema de embalagem, como escreveu Rahul Patil.

v154c1
fonte
boa informação, que é novo para mim readelf nunca usado, se você não se importa, posso perguntar-lhe onde e por que usar readelf
Rahul Patil
O Readelf (e ferramentas similares) é útil quando você deseja procurar dentro de um arquivo elf :). Eu o uso principalmente na programação para procurar símbolos nas bibliotecas (quando algo não funciona) ou quando há algum problema com uma biblioteca. ( man readelf )
v154c1
13

Você pode usar ldconfig -v | grep libraryname, também o comando tem opção command -Voubinaryfile --version

exemplo:

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.

Além disso, você pode usar o yum ou o aptitude com base na distribuição que está usando, por exemplo.

No RHEL5 / CENTOS5 / Fedora você pode usar yum info packagenameou, se instalado, usarrpm --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.

No Ubuntu, você pode usar aptitude show pkgnameoudpkg --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.
Rahul Patil
fonte
Para rpm, eu acho que você vai querer rpm --query pkgnamepara listar a cadeia de versão ( rpm --versionimprimirá a versão de rpmsi mesmo, o mesmo pode ser verdade para dpkg)
hoc_age
5

Para sistemas baseados em Redhat, faça o seguinte:

ldd [file you want to run] | > needed-packages

Verifique o arquivo de pacotes necessários, verifique se não há nomes de caminho nos nomes dos arquivos da biblioteca. Nesse caso, remova-os, então "/bin/lib/libx.so.1" mude para "libx.so.1"

Descubra qual pacote contém a biblioteca

yum -y provides [lib name]

Ou coloque isso em um script ou execute a partir da linha cmd:

for lib in `cat libs.txt`;
do
   yum -y provides $lib | head -2 | grep " : " >> packages.list
done

Em seguida, crie o seguinte script ou execute a partir da linha cmd:

for package in `cat packages.list | awk '{ print $1 }'`;
do
    yum -y install $package
done

Você está pronto, execute seu programa. Se você receber erros de GUI ao executar. Copie-os e, se forem referências de biblioteca, encontre os pacotes para eles e instale da mesma maneira.

JMirabile
fonte
2

Execute isso para obter informações da versão - 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
yarick
fonte