如何从库中获取版本,例如 libSDL2-image.so.0

如何从库中获取版本,例如 libSDL2-image.so.0

我正在尝试找到一种方法来确定我的系统上安装了哪个版本的 SDL2-Image,但我没有找到任何对 bash 脚本有用的内容。我尝试使用以下命令来查找类似“2.0.1”的版本

期望的输出:

2.0.1

脚本:

#Variables
SDL2IDir=$(whereis libSDL2_image-2.0.so.0 | cut -d " " -f02 | cut -c1-8)
SDL2I=$(whereis libSDL2_image-2.0.so.0 | cut -d " " -f02)
SDL2I=$(ls -la "$SDL2I" | cut -d " " -f11)
SDL2I=$(echo "$SDL2IDir/$SDL2I")

#GatheringInfomation
file "$SDL2I"
/usr/lib/libSDL2_image-2.0.so.0.2.3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=fcba461f120fe345054f141b8286077e5c1bdf3c, not stripped


$ strings "$SDL2I"
Jd}zRV
xk)N
8YFL
__gmon_start__
_init
_fini
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
__cxa_finalize
_Jv_RegisterClasses
IMG_Linked_Version
IMG_Init
IMG_InitJPG
IMG_InitPNG
IMG_InitTIF
IMG_InitWEBP
IMG_Quit
IMG_QuitWEBP
IMG_QuitTIF
IMG_QuitPNG
IMG_QuitJPG
IMG_LoadTyped_RW
SDL_RWseek
SDL_toupper
SDL_SetError
SDL_RWclose
IMG_Load
SDL_RWFromFile
SDL_strrchr
IMG_Load_RW
IMG_LoadTexture
SDL_CreateTextureFromSurface
SDL_FreeSurface
IMG_LoadTexture_RW
IMG_LoadTextureTyped_RW
IMG_LoadTGA_RW
IMG_isCUR
IMG_LoadCUR_RW
IMG_isICO
IMG_LoadICO_RW
IMG_isBMP
IMG_LoadBMP_RW
IMG_isGIF
IMG_LoadGIF_RW
IMG_isJPG
IMG_LoadJPG_RW
IMG_isLBM
IMG_LoadLBM_RW
IMG_isPCX
IMG_LoadPCX_RW
IMG_isPNG
IMG_LoadPNG_RW
IMG_isPNM
IMG_LoadPNM_RW
IMG_isSVG
IMG_LoadSVG_RW
IMG_isTIF
IMG_LoadTIF_RW
IMG_isXCF
IMG_LoadXCF_RW
IMG_isXPM
IMG_LoadXPM_RW
IMG_isXV
IMG_LoadXV_RW
IMG_isWEBP
IMG_LoadWEBP_RW
SDL_RWtell
SDL_ReadLE16
SDL_ClearError
SDL_RWread
SDL_ReadLE32
SDL_Error
SDL_GetError
SDL_strcmp
SDL_CreateRGBSurface
SDL_strncmp
SDL_memcmp
SDL_memcpy
SDL_SetColorKey
SDL_snprintf
longjmp
SDL_ConvertSurfaceFormat
SDL_RWwrite
SDL_LoadObject
SDL_LoadFunction
SDL_UnloadObject
_setjmp
IMG_SaveJPG_RW
IMG_SaveJPG
SDL_memset
SDL_malloc
SDL_free
SDL_calloc
SDL_realloc
SDL_MapRGB
IMG_SavePNG_RW
IMG_SavePNG
SDL_isspace
SDL_isdigit
SDL_strchr
SDL_strlen
nsvg__colors
SDL_sscanf
SDL_sqrtf
SDL_strtoll
SDL_pow
SDL_strtol
SDL_acosf
SDL_fabs
SDL_sqrt
SDL_cosf
SDL_sinf
SDL_floorf
SDL_tanf
SDL_fabsf
SDL_strlcpy
SDL_strstr
SDL_ceilf
SDL_atan2f
nsvg__parseXML
nsvgDelete
nsvgParse
nsvgDeleteRasterizer
nsvgCreateRasterizer
nsvgRasterize
SDL_qsort
SDL_fmodf
SDL_LoadFile_RW
SDL_ReadBE32
SDL_RWsize
SDL_Log
SDL_UpperBlit
SDL_FillRect
SDL_strncasecmp
IMG_ReadXPMFromArray
libSDL2-2.0.so.0
libm.so.6
libdl.so.2
libpthread.so.0
librt.so.1
libc.so.6
_edata
__bss_start
_end
libSDL2_image-2.0.so.0
/usr/lib
GLIBC_2.2.5
AWAVAUE1

not enough memory for temporary buffer
unsupported PCX format
file truncated
decoding out of bounds (corrupt?)
1.6.28
Error writing the PNG file.
libpng16.so.16
png_create_info_struct
png_create_read_struct
png_destroy_read_struct
png_get_IHDR
png_get_io_ptr
png_get_channels
png_get_PLTE
png_get_tRNS
png_get_valid
png_read_image
png_read_info
png_read_update_info
png_set_expand
png_set_gray_to_rgb
png_set_packing
png_set_read_fn
png_set_strip_16
png_set_interlace_handling
png_sig_cmp
png_set_longjmp_fn
png_create_write_struct
png_destroy_write_struct
png_set_write_fn
png_set_IHDR
png_write_info
png_set_rows
png_write_png
png_set_PLTE
Error reading the PNG file.
Couldn't allocate memory for PNG file or incompatible PNG dll
Couldn't create image information for PNG file
Couldn't create palette for PNG file
Failed to convert and save image
IEND
QkkXa


unsupported PNM format
Unable to read image width and height
%d%[%%,     ]%d%[%%,    ]%d
%f%31s
path
defs
.symtab
.strtab
.shstrtab
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.data.rel.ro
.dynamic
.got.plt
.data
.bss
.comment

readelf -sV "$SDL2I"
readelf -d "$SDL2I"

readelf -d "$SDL2I" |grep SONAME
 0x000000000000000e (SONAME)             Nombre-so de la biblioteca: [libSDL2_image-2.0.so.0]

ldconfig -v | grep "$SDL2I"
ldconfig: No se puede efectuar `stat' sobre /lib/i686-linux-gnu: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib/i686-linux-gnu: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /opt/trinity/lib: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /opt/trinity/lib64: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /opt/trinity/lib/trinity: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /opt/trinity/lib64/trinity: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /lib32: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /libx32: No existe el fichero o el directorio
ldconfig: Se ha dado la ruta `/lib/x86_64-linux-gnu' más de una vez
ldconfig: Se ha dado la ruta `/usr/lib/x86_64-linux-gnu' más de una vez
ldconfig: /lib/i386-linux-gnu/ld-2.24.so is the dynamic linker, ignoring

ldconfig: /lib/x86_64-linux-gnu/ld-2.24.so is the dynamic linker, ignoring

ldconfig: /usr/lib/x86_64-linux-gnu/libschroedinger-1.0.so.0 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libnettle.so.4 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libhogweed.so.2 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libgif.so.4 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libavresample.so.2 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libavformat.so.56 no es un enlace simbólico

ldconfig: /usr/lib/x86_64-linux-gnu/libavcodec.so.56 no es un enlace simbólico

ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libBrokenLocale.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libanl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libcidn.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libcrypt.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libdl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libm.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnsl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_compat.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_dns.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_files.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_hesiod.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_nis.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libnss_nisplus.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libresolv.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/librt.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libthread_db.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/lib32/libutil.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libBrokenLocale.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libanl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libcidn.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libcrypt.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libdl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libmvec.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnsl.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_compat.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_dns.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_files.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_hesiod.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_nis.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libnss_nisplus.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libresolv.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/librt.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libthread_db.so: No existe el fichero o el directorio
ldconfig: No se puede efectuar `stat' sobre /usr/libx32/libutil.so: No existe el fichero o el directorio

ldd "$SDL2I"
    linux-vdso.so.1 (0x00007ffd905b1000)
    libSDL2-2.0.so.0 => /usr/lib/libSDL2-2.0.so.0 (0x00007fbcc1b97000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbcc1893000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbcc168f000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbcc1472000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbcc126a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbcc0ecb000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbcc2153000)

(输出因长度而被截断)

答案1

不幸的是,没有一种适用于所有情况的通用方法。

在维护良好的库中,soname 充当 ABI 基线,IE向后兼容性的指标。对于 SDL 图像,您可以使用以下命令检索该图像readelf

$ readelf -d /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libSDL2_image-2.0.so.0]

但这并没有给你补丁版本;据我所知,确定这一点的唯一方法是调用IMG_Linked_Version库中的函数:

#include <stdio.h>
#include <SDL2/SDL_image.h>

int main(int argc, char **argv) {
        const SDL_version *version = IMG_Linked_Version();
        printf("Running with SDL_image version %d.%d.%d\n",
                version->major, version->minor, version->patch);
        return 0;
}

使用-lSDL2_image(和 SDL 标头)构建它,然后运行它以查找版本:

Running with SDL_image version 2.0.4

有些库定义了您也可以使用的版本符号,尽管它们不一定包含补丁信息;例如,对于 GNU C 库:

$ nm -D /lib/x86_64-linux-gnu/libc-2.28.so | awk '/GLIBC_/ { print $3 }' | sort -V
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE

相关内容