Зависимости библиотеки PyInstaller OS и Chroot - PullRequest
1 голос
/ 28 февраля 2020

В документации 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 будет работать, потому что он работает, когда копируется весь /.

1 Ответ

1 голос
/ 28 февраля 2020

Сообщение об ошибке 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 и два двоичных файла для загрузчика. Таким образом, запустите ldd на python, который использует PyInstaller, и на тех двух загрузчиках, которые находятся в каталоге пакетов сайта, будут все необходимые зависимости. Вышеуказанный libpthread... требуется для интерпретатора python.

И вывод ldd показывает, что он хочет, чтобы файлы библиотеки находились в /lib/x86_64-linux-gnu/ вместо /lib/.

Конечное содержание lib/ и lib64/:

# 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. Это становится очень интересным.

...