1

I am trying to find a way to determine which version of SDL2-Image is installed on my system, but I have not found anything useful for a bash script. I tried with the following to find just the version something like "2.0.1"

Desired output:

2.0.1

Script:

#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)

(output truncated due to length)

  • 1
    Have you seen this: unix.stackexchange.com/questions/58846/… – Edward Jul 31 at 6:34
  • No, but i put the rest of result if this web allow me – inukaze Jul 31 at 15:51
  • Are the libraries compiled or installed via a package manager? Which flavor of linux do you use? If it is debian/ubuntu you can do a dpkg -l |grep <libname> to get the version. – Panagiotis Jul 31 at 19:07
  • No, i use : GoboLinux, Gentoo, Slackware, Linux From Scratch, Sorcerer Linux, etc . . . i don't use "apt, dpkg, pacman" – inukaze Jul 31 at 20:47
1

Unfortunately there’s no generic approach which will work in all cases.

In well-maintained libraries, the soname serves as the ABI baseline, i.e. an indicator of backwards compatibility. For SDL image, you can retrieve this using 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]

That doesn’t give you the patch version though; as far as I can tell the only way to determine that is to call the IMG_Linked_Version function in the library:

#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;
}

Build that with -lSDL2_image (and the SDL headers), then run it to find the version:

Running with SDL_image version 2.0.4

Some libraries define version symbols which you can use too, although again they don’t necessarily include patch information; for example, for the GNU C library:

$ 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.