การดูข้อมูล Linux Library / รุ่นที่ทำงานได้


37

ใน Windows EXE และ DLL มีข้อมูลรุ่นรวมถึงอย่างน้อยฟิลด์ต่อไปนี้:

  1. เวอร์ชันไฟล์
  2. รุ่นผลิตภัณฑ์
  3. ชื่อภายใน
  4. ชื่อผลิตภัณฑ์
  5. ลิขสิทธิ์

ในห้องสมุด Linux / ปฏิบัติการ:

  • มีเขตข้อมูลใดบ้าง
  • วิธีการดูข้อมูลดังกล่าว?
  • เครื่องมืออะไร / ห้องสมุดที่จะอ่าน

ฉันได้อัปเดตบางอย่างเพิ่มเติมโปรดตรวจสอบตอนนี้ ..
Rahul Patil

ldconfig ต้องการรูทหรือไม่ สิ่งที่เกี่ยวกับการตรวจสอบไฟล์ libxxx.so ที่เฉพาะเจาะจงและไม่ต้องการรัน exe ด้วย --version (อาจล้มเหลว)
linquize

ไม่จำเป็นต้องรูทเนื่องจาก / sbin / พา ธ ไม่ได้ตั้งค่าในสภาพแวดล้อมผู้ใช้ปกติคุณสามารถดำเนินการที่ใช้พา ธ สัมบูรณ์เช่น /sbin/ldconfig -p
ราหุลปาติล

คำตอบ:


36

ข้อมูลรุ่นในไม่แน่ชัดเก็บไว้ในแฟ้มเอลฟ์ สิ่งที่คุณมีอยู่ในนั้นคือชื่อของไลบรารีsonameซึ่งรวมถึงเวอร์ชันหลัก โดยปกติเวอร์ชันเต็มจะถูกจัดเก็บเป็นส่วนหนึ่งของชื่อไฟล์ไลบรารี

หากคุณมีห้องสมุดให้พูดlibtest.soตามปกติคุณจะมี:

  • libtest.so.1.0.1 - ไฟล์ไลบรารีของตัวเองที่มีเวอร์ชันเต็ม
  • libtest.so.1- Symlink ไปยังlibtest.so.1.0.1โดยใช้ชื่อเดียวกันกับsoname
  • libtest.so- Symlink ที่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 ไม่มีข้อมูลดังกล่าว (อย่างน้อยก็ไม่ใช่ตามค่าเริ่มต้น) ในไฟล์ที่ปฏิบัติการได้

หรือคุณสามารถพึ่งพาโปรแกรมเองหรือระบบบรรจุภัณฑ์ของคุณตามที่ราหุลพาติลเขียน


ข้อมูลที่ดีมันเป็นเรื่องใหม่สำหรับฉันที่ไม่เคยใช้ readelf ถ้าคุณไม่รังเกียจฉันจะถามคุณว่าทำไมและทำไมต้องใช้ readelf
Rahul Patil

Readelf (และเครื่องมือที่คล้ายกัน) มีประโยชน์เมื่อคุณต้องการดูไฟล์ elf ใน :) ฉันใช้ส่วนใหญ่เมื่อเขียนโปรแกรมเพื่อค้นหาสัญลักษณ์ในไลบรารี (เมื่อบางสิ่งบางอย่างไม่ทำงาน) หรือเมื่อมีปัญหากับไลบรารี ( มนุษย์อ่านเอง )
v154c1

13

คุณสามารถใช้ldconfig -v | grep librarynameคำสั่งยังมีตัวเลือกcommand -Vหรือbinaryfile --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.

คุณยังสามารถใช้ยำหรือความถนัดตาม distro ที่คุณใช้เช่น

ใน 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 pkgnameหรือdpkg --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 <ubuntu-devel-discuss@lists.ubuntu.com>
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.

สำหรับrpmฉันคิดว่าคุณจะต้องการrpm --query pkgnameแสดงรายการสตริงเวอร์ชัน ( rpm --versionจะพิมพ์เวอร์ชั่นของrpmตัวเองซึ่งอาจเป็นจริงสำหรับdpkg)
hoc_age

5

สำหรับระบบที่ใช้ Redhat ให้ทำสิ่งนี้:

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

ลองใช้ไฟล์แพ็คเกจที่จำเป็นตรวจสอบให้แน่ใจว่าไม่มีชื่อพา ธ ในชื่อไฟล์ไลบรารี ถ้าเป็นเช่นนั้นให้ลบออกดังนั้น "/bin/lib/libx.so.1" เปลี่ยนเป็น "libx.so.1"

ค้นหาแพ็คเกจที่มีห้องสมุด

yum -y provides [lib name]

หรือใส่สิ่งนี้ลงในสคริปต์หรือเรียกใช้จากบรรทัด cmd:

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

ถัดไปสร้างสคริปต์ต่อไปนี้หรือเรียกใช้จากบรรทัด cmd:

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

คุณทำเสร็จแล้วเปิดโปรแกรม หากคุณได้รับข้อผิดพลาด GUI เมื่อทำงาน คัดลอกมันลงมาและหากเป็นการอ้างอิงไลบรารีให้ค้นหาแพ็คเกจสำหรับสิ่งเหล่านั้นและติดตั้งด้วยวิธีเดียวกัน


2

เรียกใช้สิ่งนี้เพื่อรับข้อมูลรุ่น - 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.