Visualización de la información de la versión ejecutable / biblioteca de Linux

38

En Windows, EXE y DLL tienen información de versión, que incluye al menos los siguientes campos:

  1. versión del archivo
  2. version del producto
  3. nombre interno
  4. nombre del producto
  5. derechos de autor

En la biblioteca de Linux / ejecutable:

  • ¿Qué campos están presentes?
  • ¿Cómo ver esa información?
  • ¿Qué herramientas / bibliotecas para leer?
linquizar
fuente
He actualizado algunas cosas más, compruebe ahora ..
Rahul Patil
ldconfig necesita root? ¿Qué hay de comprobar un archivo específico libxxx.so y no quiere ejecutar un exe con --version (que puede fallar)
linquize
no necesita root, ya que / sbin / path no está configurado en el entorno de usuario normal, puede ejecutar esa ruta usando eg. /sbin/ldconfig -p
Rahul Patil

Respuestas:

36

La información de la versión no se almacena explícitamente en un archivo ELF . Lo que tiene allí es el nombre de la biblioteca soname, que incluye la versión principal. La versión completa generalmente se almacena como parte del nombre del archivo de la biblioteca.

Si tiene biblioteca, por ejemplo libtest.so, generalmente tiene:

  • libtest.so.1.0.1 - El archivo de la biblioteca en sí, que contiene la versión completa
  • libtest.so.1- Enlace simbólico a libtest.so.1.0.1, que tiene el mismo nombre quesoname
  • libtest.so- Enlace simbólico a libtest.so.1utilizado para vincular.

En el archivo de la biblioteca libtest.so.1.0.1, habrá una entrada llamada SONAMEen la sección dinámica, que dirá que se llama a esta biblioteca libtest.so.1. Cuando vincula un programa con esta biblioteca, el programa vinculado almacenará el sonamede la biblioteca bajo la NEEDEDentrada en la sección dinámica.

Si desea verificar, qué es exactamente en qué archivo ELF, puede intentar ejecutar:

readelf -a -W elffile

donde elffilepuede ser una biblioteca de un ejecutable.

Si simplemente quieres obtener la versión de la biblioteca, puedes jugar con:

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

AFAIK, no existe dicha información (al menos no de manera predeterminada) en los archivos ejecutables.

O puede confiar en el programa en sí o en su sistema de empaque, como escribió Rahul Patil.

v154c1
fuente
buena información, que es nuevo para mí readelf nunca usado, si no te importa, ¿puedo preguntarle dónde y por qué el uso readelf
Rahul Patil
Readelf (y herramientas similares) es útil cuando quieres mirar dentro de un archivo elfo :). Lo uso principalmente cuando programo para buscar símbolos en bibliotecas (cuando algo no funciona), o cuando hay algún problema con una biblioteca. ( hombre readelf )
v154c1
13

Puede usar ldconfig -v | grep libraryname, también el comando tiene la opción command -Vobinaryfile --version

ejemplo:

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.

También puede usar yum o aptitude en función de la distribución que está utilizando, por ejemplo.

en RHEL5 / CENTOS5 / Fedora puede usar yum info packagenameo si está instalado, userpm --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.

En Ubuntu puedes usar aptitude show pkgnameodpkg --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
fuente
Porque rpm, creo que querrás rpm --query pkgnameenumerar la cadena de versión ( rpm --versionimprimirá la versión de rpmsí mismo; lo mismo podría ser cierto para dpkg)
hoc_age
5

Para los sistemas basados ​​en Redhat, haga esto:

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

Consulte el archivo de paquetes necesarios, asegúrese de que no haya nombres de ruta en los nombres de archivo de la biblioteca. Si es así, quítelos, así que "/bin/lib/libx.so.1" cambie a "libx.so.1"

Descubra qué paquete contiene la biblioteca

yum -y provides [lib name]

O ponga esto en un script o ejecute desde la línea cmd:

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

A continuación, cree el siguiente script o ejecútelo desde la línea cmd:

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

Ya terminaste, ejecuta tu programa. Si obtiene errores de GUI cuando se ejecuta. Cópielos y, si son referencias de biblioteca, busque los paquetes para ellos e instálelos de la misma manera.

JMirabile
fuente
2

Ejecute esto para obtener información de la versión: 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
fuente