如何强制 Linux 二进制文件仅使用其自己提供的共享库?

如何强制 Linux 二进制文件仅使用其自己提供的共享库?

我正在使用一个应用程序,电源ISO,它没有源代码,只有二进制文件和所需的共享库。

我在 Debian 10 上用了好几年,但现在我使用的是 Debian 12,它不再起作用了。该程序带有自己的 bash 包装器脚本,该脚本在二进制目录中运行。它在执行二进制文件之前将环境变量设置LD_LIBRARY_PATHQT_QPA_PLATFORM_PLUGIN_PATH二进制文件和共享库所在的目录。然后LD_LIBRARY_PATH在退出程序时取消设置环境变量。

/主页/jimjamz/opt/poweriso-x64/poweriso.sh

export LD_LIBRARY_PATH=.
export QT_QPA_PLATFORM_PLUGIN_PATH=.
./poweriso
unset LD_LIBRARY_PATH

从同一目录内执行时,运行 poweriso.sh 包装脚本时会显示以下错误:

qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "."
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb (from .).

./poweriso.sh: line 3: 27182 Aborted                 ./poweriso

ldd库文件.so.1位于二进制目录中的报告正在使用的共享库位于/lib/x86_64-linux-gnu/并且不在同一个二进制目录中,其中有一个专门用于应用程序的单独副本:

$ ldd /home/jimjamz/opt/poweriso-x64/libxcb.so.1
linux-vdso.so.1 (0x00007ffe745ef000)
    libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007fe1bf7bf000)
    libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fe1bf400000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe1bf21f000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fe1bf7a9000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe1bf808000)
    libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007fe1bf79c000)

ldd在二进制文件上还显示来自其他目录的共享库,以及二进制文件自己的目录:

$ ldd /home/jimjamz/opt/poweriso-x64/poweriso
./poweriso: ./libc.so.6: version `GLIBC_2.34' not found (required by libGLX.so.0)
./poweriso: ./libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libGLdispatch.so.0)
./poweriso: ./libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libX11.so.6)
./poweriso: ./libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libX11.so.6)
./poweriso: ./libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libbsd.so.0)
./poweriso: ./libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libmd.so.0)
    linux-vdso.so.1 (0x00007ffc676ea000)
    libQt5Gui.so.5 => ./libQt5Gui.so.5 (0x00007f0550400000)
    libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007f054fc00000)
    libQt5Widgets.so.5 => ./libQt5Widgets.so.5 (0x00007f054f200000)
    libpthread.so.0 => ./libpthread.so.0 (0x00007f05511f6000)
    libstdc++.so.6 => ./libstdc++.so.6 (0x00007f0550c76000)
    libgcc_s.so.1 => ./libgcc_s.so.1 (0x00007f05511da000)
    libc.so.6 => ./libc.so.6 (0x00007f054f016000)
    libGL.so.1 => /home/jimjamz/opt/poweriso-x64/./libGL.so.1 (0x00007f0551146000)
    libz.so.1 => /home/jimjamz/opt/poweriso-x64/./libz.so.1 (0x00007f054ec00000)
    libm.so.6 => /home/jimjamz/opt/poweriso-x64/./libm.so.6 (0x00007f054fa73000)
    libicui18n.so.56 => /home/jimjamz/opt/poweriso-x64/./libicui18n.so.56 (0x00007f054e600000)
    libicuuc.so.56 => /home/jimjamz/opt/poweriso-x64/./libicuuc.so.56 (0x00007f054e200000)
    libicudata.so.56 => /home/jimjamz/opt/poweriso-x64/./libicudata.so.56 (0x00007f054c800000)
    libdl.so.2 => /home/jimjamz/opt/poweriso-x64/./libdl.so.2 (0x00007f055113e000)
    libgthread-2.0.so.0 => /home/jimjamz/opt/poweriso-x64/./libgthread-2.0.so.0 (0x00007f0551139000)
    libglib-2.0.so.0 => /home/jimjamz/opt/poweriso-x64/./libglib-2.0.so.0 (0x00007f054eef9000)
    ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f0551219000)
    libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f05510ea000)
    libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f054ee40000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f054eb88000)
    libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f054c6be000)
    libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f05510be000)
    libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f05510b9000)
    libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f054c400000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f0550c60000)
    libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007f05510ac000)

我不希望二进制文件使用除二进制文件自己的目录中已提供的共享库之外的任何共享库(/主页/jimjamz/opt/poweriso-x64),因为 GLIBC 2.33 和 2.34 不再存在于我当前的 Debian 发行版的 libc6 中。据我所知,libc 仅支持当前版本和以前的版本。就我而言,应该是 2.36 和 2.35:

libc6 is already the newest version (2.36-9+deb12u4).
ldd (Debian GLIBC 2.36-9+deb12u4) 2.36

lddlibc.so.6在二进制目录中,显示另一个目录,/lib64,也被使用:

$ ldd /home/jimjamz/opt/poweriso-x64/libc.so.6

/lib64/ld-linux-x86-64.so.2 (0x00007f4cb1d1d000)
    linux-vdso.so.1 (0x00007fff1a7f4000)

我创建我自己的 bash 包装脚本LD_LIBRARY_PATH将和环境变量设置QT_QPA_PLATFORM_PLUGIN_PATH为二进制文件的目录,但结果却出现了原来的错误消息。尝试将二进制文件目录包含在/etc/ld.so.conf.d/poweriso.conf或直接/etc/ld.so.conf是个坏主意,导致内核崩溃。

我读到类似问题及相关解决方案,使用patchelf设置rpath。

patchelf --set-rpath /home/jimjamz/opt/poweriso-x64 poweriso

并确认它被设置到正确的目录:

$ patchelf --print-rpath poweriso
/home/jimjamz/opt/poweriso-x64

但是,当我直接执行二进制文件时,我收到:

./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libGLX.so.0)
./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libGLdispatch.so.0)
./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libX11.so.6)
./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libX11.so.6)
./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libbsd.so.0)
./poweriso: /home/jimjamz/opt/poweriso-x64/libc.so.6: version `GLIBC_2.33' not found (required by /lib/x86_64-linux-gnu/libmd.so.0)

尽管使用 patchelf 设置 rpath,二进制文件仍然尝试链接到共享库/lib/x86_64-linux-gnu/

运行 patchelf--debug报告说没有任何变化,我通过对修补前后的二进制文件进行 SHA-1 比较来确认这一点:

patching ELF file 'poweriso'
not modified, but alwaysWrite=true
writing poweriso.log

我怀疑整个问题是因为二进制文件试图使用系统库而不是提供的库,如上所述这里

问:如何强制二进制文件将其自己的目录用于所需的共享库? 这是作者的意图,因此提供了上述库。

参考:

如何指定二进制文件库的位置?(linux)

https://stackoverflow.com/questions/68036484

答案1

本质上,您想将 PowerISO 制作成 SNAP 包,这不是一个坏主意,尽管我不知道如何做到这一点。

然而,PowerISO 有适用于 Windows 操作系统的版本. 根据葡萄酒兼容性数据库,版本 4.0 至 7.9电源ISO已经过测试,功能性评级为“白金”。自葡萄酒为每个应用程序创建一个独立的“Windows 系统”,以满足您的需求,即让电源ISO仅查看相关库。

尝试使用当前版本的电源ISO,v.8.7,如果不起作用,请尝试最后测试的葡萄酒,v.7.9。如果出现问题,更新至最新版本葡萄酒

顺便说一句,在基于 Debian 的发行版 Ubuntu 上,我发现7-Zip运行良好葡萄酒并提供了一些功能电源ISO. 不像电源ISO,似乎已于 2019 年停止开发,7-Zip正在保持最新状态。

相关内容