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会起作用,因为当整个/
被复制时它会起作用
错误消息
Failed to exec: No such file or directory
是因为ld必须位于路径/lib64/ld-linux-x86-64.so.2
。尽管它指向的实际文件实际上是ld-2.27.so
:修复后,新的错误消息更有意义,指向丢失的
libpthread...
深入研究PyInstaller内部,它至少在内部打包了三个其他二进制可执行文件:一个python解释器和两个用于引导加载程序的二进制文件。因此,在PyInstaller使用的python上运行
ldd
,在site packages目录下的那两个引导加载程序上,它将是所需的所有依赖项。python解释器需要上面的libpthread...
并且
ldd
输出显示它希望库文件位于/lib/x86_64-linux-gnu/
而不是/lib/
之下{}和{}的最终内容是:
这似乎一直运作良好
这个目录可以在内核的裸机上运行,而不需要在rootfs中包含其他用户空间应用程序。它变得非常有趣
相关问题 更多 >
编程相关推荐