【发布时间】:2020-06-12 01:19:39
【问题描述】:
PyInstaller documentation 状态
PyInstaller 不包含在任何安装此操作系统时都应该存在的库。例如在 GNU/Linux 中,它不会捆绑来自 /lib 或 /usr/lib 的任何文件,假设这些文件可以在每个系统中找到。
但是,目标环境可能安装了同一组库的不同版本。有没有办法找出 pyisntaller 生成的二进制文件所依赖的所有操作系统库?
我使用 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 会起作用,因为它会在复制整个 / 时起作用。
【问题讨论】:
标签: python dependencies pyinstaller chroot