В документации PyInstaller указано
PyInstaller не включает библиотеки, которые должны существовать в любой установке этой ОС. Например, в GNU / Linux он не связывает никакие файлы из / lib или / usr / lib, при условии, что они будут найдены в каждой системе.
Однако целевая среда, возможно, установила разные версии одного и того же набора библиотек. Есть ли способ узнать все библиотеки ОС, от которых зависит двоичный файл, сгенерированный pyisntaller?
Я создал двоичный файл my_app/myapp
, используя pyisntaller. Затем использовал ldd
для вывода списка всех файлов .so
, от которых он зависит, и скопировал их все в каталог распространения. В моем предположении, результирующий каталог dist может использоваться как root для среды ch root. Однако это не работает.
Из вывода 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
и оттуда программа должна продолжаться.
Я знаю, что ch root будет работать, потому что он работает, когда копируется весь /
.