PyOS库依赖项和Chroot

2024-06-09 19:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

PyInstallerdocumentation声明

PyInstaller does not include libraries that should exist in any installation of this OS. For example in GNU/Linux, it does not bundle any file from /lib or /usr/lib, assuming these will be found in every system.

但是,目标环境可能已安装同一组库的不同版本。有没有办法找出pyisntaller生成的二进制文件所依赖的所有OS库

我使用pyisntaller创建了一个二进制文件my_app/myapp。然后使用ldd列出它所依赖的所有.so文件,并将它们全部复制到分发目录中。在我的假设中,生成的dist目录可以用作chroot环境的根目录。但是,它不起作用

ldd输出:

# ldd my_app/my_app 
    linux-vdso.so.1 (0x00007ffdddc67000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6d3342f000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6d33212000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6d32e21000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6d3384e000)

看起来只有这些库是必需的依赖项:

# ls -l lib
-rwxr-xr-x 1 root root  170960 Apr 16  2018 ld-2.27.so
-rwxr-xr-x 1 root root 2030544 Apr 16  2018 libc-2.27.so
lrwxrwxrwx 1 root root      12 Apr 16  2018 libc.so.6 -> libc-2.27.so
-rw-r--r-- 1 root root   14560 Apr 16  2018 libdl-2.27.so
lrwxrwxrwx 1 root root      13 Apr 16  2018 libdl.so.2 -> libdl-2.27.so
lrwxrwxrwx 1 root root      14 May 23  2017 libz.so.1 -> libz.so.1.2.11
-rw-r--r-- 1 root root  116960 May 23  2017 libz.so.1.2.11

当我运行chroot ./ /lib/ld-2.27.so /my_app/my_app时,屏幕显示

[26499] PyInstaller Bootloader 3.x
[26499] LOADER: Cannot get fullpath for /my_app/my_app
[26499] LOADER: homepath is /my_app
[26499] LOADER: _MEIPASS2 is NULL
[26499] LOADER: archivename is /my_app/my_app
[26499] LOADER: Extracting binaries
[26499] LOADER: Executing self as child
[26499] LOADER: set _MEIPASS2 to /my_app
[26499] LOADER: LD_LIBRARY_PATH=/my_app
[26499] LOADER: Registering signal handlers
[26500] Failed to exec: No such file or directory

最后一行应该是[99] PyInstaller Bootloader 3.x,然后程序应该继续

我知道chroot会起作用,因为当整个/被复制时它会起作用


Tags: 文件inappsomylinuxlibroot
1条回答
网友
1楼 · 发布于 2024-06-09 19:59:26

错误消息Failed to exec: No such file or directory是因为ld必须位于路径/lib64/ld-linux-x86-64.so.2。尽管它指向的实际文件实际上是ld-2.27.so

ls -l /lib64/
/lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.27.so

修复后,新的错误消息更有意义,指向丢失的libpthread...

深入研究PyInstaller内部,它至少在内部打包了三个其他二进制可执行文件:一个python解释器和两个用于引导加载程序的二进制文件。因此,在PyInstaller使用的python上运行ldd,在site packages目录下的那两个引导加载程序上,它将是所需的所有依赖项。python解释器需要上面的libpthread...

并且ldd输出显示它希望库文件位于/lib/x86_64-linux-gnu/而不是/lib/之下

{}和{}的最终内容是:

# ls -l lib
-rwxr-xr-x    170960 Apr 16  2018 ld-2.27.so
-rwxr-xr-x   2030544 Apr 16  2018 libc-2.27.so
lrwxrwxrwx        12 Apr 16  2018 libc.so.6 -> libc-2.27.so
-rw-r r      14560 Apr 16  2018 libdl-2.27.so
lrwxrwxrwx        13 Apr 16  2018 libdl.so.2 -> libdl-2.27.so
lrwxrwxrwx        17 Sep 10 11:05 libexpat.so.1 -> libexpat.so.1.6.7
-rw-r r     202880 Sep 10 11:05 libexpat.so.1.6.7
-rw-r r    1700792 Apr 16  2018 libm-2.27.so
lrwxrwxrwx        12 Apr 16  2018 libm.so.6 -> libm-2.27.so
-rwxr-xr-x    144976 Apr 16  2018 libpthread-2.27.so
lrwxrwxrwx        18 Apr 16  2018 libpthread.so.0 -> libpthread-2.27.so
-rw-r r      10592 Apr 16  2018 libutil-2.27.so
lrwxrwxrwx        15 Apr 16  2018 libutil.so.1 -> libutil-2.27.so
lrwxrwxrwx        14 May 23  2017 libz.so.1 -> libz.so.1.2.11
-rw-r r     116960 May 23  2017 libz.so.1.2.11
lrwxrwxrwx         1 Feb 27 17:14 x86_64-linux-gnu -> .

# ls -l lib64
lrwxrwxrwx   32 Apr 16  2018 ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.27.so

这似乎一直运作良好

这个目录可以在内核的裸机上运行,而不需要在rootfs中包含其他用户空间应用程序。它变得非常有趣

相关问题 更多 >