Создание приложения без зависимостей

Опрос

Какую технологию выбрать для создания приложения не зависящего (почти) от окружения?
Flatpack
Snap
Appimage
Виртуальная машина
Docker контейнер
LXC контейнер
Пересобирать по необходмости
Другое
archevator, способов много, советую погуглить по фразе LD_LIBRARY_PATH=
Конечно самый правильный добавить свой файл в ld.so.conf.d, в котором указать полный путь до нужных либ и запустить ldconfig ...
но можно и самый простой, который применил ты - создать скрипт для запуска, но только нужно изменить - будет типа такого
cat proga.sh
#!/bin/sh
export LD_LIBRARY_PATH="/любой/path/"
proga
В /любой/path/ скопировать нужные либы, запуск из терминала proga.sh ... или как нравится ... можно и без скрипта, а все указать в команде

Есть много и других способов прописки, все-таки рекомендую погуглить и почитать.

EDIT 1 - и в /любой/path/ закидывать только действительно необходимые либы, а не все ...
Ошибки не исчезают с опытом - они просто умнеют
Провел эксперимент
ldd /usr/bin/ls
	linux-vdso.so.1 (0x00007fffbdf7c000)
	libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fed3bfce000)
	libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fed3bfc7000)
	libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fed3bfbf000)
mkdir ~/lib_ls
cp /usr/lib/libxcb.so.1 ~/lib_ls
cp /usr/lib/libXau.so.6 ~/lib_ls
cat ~/ls.sh
#!/bin/sh
export LD_LIBRARY_PATH="/home/vasek/lib_ls"
ls
Используя отладку LD_DEBUG при запуске ~/ls.sh видим какие либы берутся из /home/vasek/lib_ls
37338:	file=libXau.so.6 [0];  needed by /home/vasek/lib_ls/libxcb.so.1 [0]
37338:	file=libXau.so.6 [0];  generating link map
37338:	  dynamic: 0x00007f333be99cf8  base: 0x00007f333be96000   size: 0x0000000000004028
37338:	    entry: 0x00007f333be97040  phdr: 0x00007f333be96040  phnum:                  9
37338:
37338:	file=libXdmcp.so.6 [0];  needed by /home/vasek/lib_ls/libxcb.so.1 [0]
37338:	file=libXdmcp.so.6 [0];  generating link map
37338:	  dynamic: 0x00007f333be94d30  base: 0x00007f333be8e000   size: 0x0000000000007010
37338:	    entry: 0x00007f333be90020  phdr: 0x00007f333be8e040  phnum:                  9
Ошибки не исчезают с опытом - они просто умнеют
vasek
archevator, способов много, советую погуглить по фразе LD_LIBRARY_PATH=
Конечно самый правильный добавить свой файл в ld.so.conf.d, в котором указать полный путь до нужных либ и запустить ldconfig …
но можно и самый простой, который применил ты - создать скрипт для запуска, но только нужно изменить - будет типа такого
cat proga.sh
#!/bin/sh
export LD_LIBRARY_PATH="/любой/path/"
proga
В /любой/path/ скопировать нужные либы, запуск из терминала proga.sh … или как нравится … можно и без скрипта, а все указать в команде
Есть много и других способов прописки, все-таки рекомендую погуглить и почитать.
Да, спасибо, по ссылке ходил, будем пробовать дальше.
vasek
Провел эксперимент
Тоже провел, работает, только зависимости у меня для ls другие:
user@archlinux:~/temp$ LD_LIBRARY_PATH=~/temp/lslibs ldd /bin/ls
	linux-vdso.so.1 (0x00007fff3bdeb000)
	libcap.so.2 => /home/ivan/temp/lslibs/libcap.so.2 (0x00007f7d06190000)
	libc.so.6 => /home/ivan/temp/lslibs/libc.so.6 (0x00007f7d05fc9000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7d061be000)
Пробую снова для своего приложения, скопировал библиотеки в папку:
user@archlinux:/usr/lib/firebird/bin$ ls -l fblib
итого 61320
-rwxr-xr-x 2 root root   198392 ноя 13 19:16 ld-linux-x86-64.so.2
-rwxr-xr-x 2 root root  2149496 ноя 13 19:16 libc.so.6
-rwxr-xr-x 2 root root    14512 ноя 13 19:16 libdl.so.2
-rw-r--r-- 2 root root   873816 окт 30 17:24 libgcc_s.so.1
-rwxr-xr-x 2 root root 27984536 ноя 12 03:13 libicudata.so.65
-rwxr-xr-x 2 root root  1959712 ноя 12 03:13 libicuuc.so.65
-rwxr-xr-x 2 root root  1329264 ноя 13 19:16 libm.so.6
-rwxr-xr-x 2 root root   159824 ноя 13 19:16 libpthread.so.0
-rwxr-xr-x 2 root root 22616248 окт 30 17:24 libstdc++.so.6
Проверяю зависимости для fbserver
user@archlinux:/usr/lib/firebird/bin$ ldd fbserver
	linux-vdso.so.1 (0x00007ffdcf3ef000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f35e8ee7000)
	libicuuc.so.65 => /usr/lib/libicuuc.so.65 (0x00007f35e8d05000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f35e8b1b000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f35e89d5000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f35e89bb000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f35e8999000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f35e87d0000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f35e9436000)
        libicudata.so.65 => /usr/lib/libicudata.so.65 (0x00007f35e6d1f000)
Проверяю зависимости для библиотеки в созданной папке, путь поиска библиотек указан явно, ldd находит библиотеки по указанному пути:
user@archlinux:/usr/lib/firebird/bin$ LD_LIBRARY_PATH="/usr/lib/firebird/bin/fblib" ldd fblib/libicuuc.so.65
	linux-vdso.so.1 (0x00007ffdf39e8000)
	libicudata.so.65 => /usr/lib/firebird/bin/fblib/libicudata.so.65 (0x00007f4ab05f2000)
	libpthread.so.0 => /usr/lib/firebird/bin/fblib/libpthread.so.0 (0x00007f4ab05d0000)
	libdl.so.2 => /usr/lib/firebird/bin/fblib/libdl.so.2 (0x00007f4ab05cb000)
	libstdc++.so.6 => /usr/lib/firebird/bin/fblib/libstdc++.so.6 (0x00007f4ab03e1000)
	libm.so.6 => /usr/lib/firebird/bin/fblib/libm.so.6 (0x00007f4ab029b000)
	libgcc_s.so.1 => /usr/lib/firebird/bin/fblib/libgcc_s.so.1 (0x00007f4ab0281000)
	libc.so.6 => /usr/lib/firebird/bin/fblib/libc.so.6 (0x00007f4ab00b8000)
	/usr/lib64/ld-linux-x86-64.so.2 (0x00007f4ab2287000)
Проверяю зависимости для fbserver с указанием явного пути для поиска библиотек:
user@archlinux:/usr/lib/firebird/bin$ LD_LIBRARY_PATH="/usr/lib/firebird/bin/fblib" ldd ./fbserver
	linux-vdso.so.1 (0x00007ffcd9de1000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fbc3839b000)
	libicuuc.so.65 => /usr/lib/libicuuc.so.65 (0x00007fbc381b9000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fbc37fcf000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007fbc37e89000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fbc37e6f000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fbc37e4d000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007fbc37c84000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fbc388ea000)
	libicudata.so.65 => /usr/lib/libicudata.so.65 (0x00007fbc361d3000)
ldd находит библиотеки в системных каталогах, несмотря на то для поиска библиотек явно задан каталог.
Почему-то в одном случае указание пути поиска LD_LIBRARY_PATH работает как ожидается, а в другом - нет.
При запуске с LD_DEBUG=libs получаем следующее:
user@archlinux:/usr/lib/firebird/bin$ LD_DEBUG=libs LD_LIBRARY_PATH="/usr/lib/firebird/bin/fblib" ldd ./fbserver
     20449:	find library=libreadline.so.8 [0]; searching
     20449:	 search path=/usr/lib/firebird/bin/fblib/tls/x86_64/x86_64:/usr/lib/firebird/bin/fblib/tls/x86_64:/usr/lib/firebird/bin/fblib/tls/x86_64:/usr/lib/firebird/bin/fblib/tls:/usr/lib/firebird/bin/fblib/x86_64/x86_64:/usr/lib/firebird/bin/fblib/x86_64:/usr/lib/firebird/bin/fblib/x86_64:/usr/lib/firebird/bin/fblib		(LD_LIBRARY_PATH)
     20449:	  trying file=/usr/lib/firebird/bin/fblib/tls/x86_64/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/tls/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/tls/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/tls/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/x86_64/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/x86_64/libreadline.so.8
     20449:	  trying file=/usr/lib/firebird/bin/fblib/libreadline.so.8
     20449:	 search cache=/etc/ld.so.cache
     20449:	  trying file=/usr/lib/libreadline.so.8
     20449:
     20449:	find library=libdl.so.2 [0]; searching
     20449:	 search path=/usr/lib/firebird/bin/fblib		(LD_LIBRARY_PATH)
     20449:	  trying file=/usr/lib/firebird/bin/fblib/libdl.so.2
     20449:
     20449:	find library=libc.so.6 [0]; searching
     20449:	 search path=/usr/lib/firebird/bin/fblib		(LD_LIBRARY_PATH)
     20449:	  trying file=/usr/lib/firebird/bin/fblib/libc.so.6
     20449:
     20449:	find library=libncursesw.so.6 [0]; searching
     20449:	 search path=/usr/lib/firebird/bin/fblib		(LD_LIBRARY_PATH)
     20449:	  trying file=/usr/lib/firebird/bin/fblib/libncursesw.so.6
     20449:	 search cache=/etc/ld.so.cache
     20449:	  trying file=/usr/lib/libncursesw.so.6
     20449:
     20449:
     20449:	calling init: /usr/lib/firebird/bin/fblib/libc.so.6
     20449:
     20449:
     20449:	calling init: /usr/lib/libncursesw.so.6
     20449:
     20449:
     20449:	calling init: /usr/lib/firebird/bin/fblib/libdl.so.2
     20449:
     20449:
     20449:	calling init: /usr/lib/libreadline.so.8
     20449:
     20449:
     20449:	initialize program: /usr/bin/bash
     20449:
     20449:
     20449:	transferring control: /usr/bin/bash
     20449:
     20453:
     20453:	calling fini: /usr/bin/bash [0]
     20453:
     20453:
     20453:	calling fini: /usr/lib/libreadline.so.8 [0]
     20453:
     20453:
     20453:	calling fini: /usr/lib/firebird/bin/fblib/libdl.so.2 [0]
     20453:
     20453:
     20453:	calling fini: /usr/lib/libncursesw.so.6 [0]
     20453:
     20454:	find library=libdl.so.2 [0]; searching
     20454:	 search path=/usr/lib/tls/x86_64/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64/x86_64:/usr/lib/x86_64:/usr/lib/x86_64:/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/tls/x86_64/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/tls/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/tls/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/tls/libdl.so.2
     20454:	  trying file=/usr/lib/x86_64/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/x86_64/libdl.so.2
     20454:	  trying file=/usr/lib/libdl.so.2
     20454:
     20454:	find library=libicuuc.so.65 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libicuuc.so.65
     20454:
     20454:	find library=libstdc++.so.6 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libstdc++.so.6
     20454:
     20454:	find library=libm.so.6 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libm.so.6
     20454:
     20454:	find library=libgcc_s.so.1 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libgcc_s.so.1
     20454:
     20454:	find library=libpthread.so.0 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libpthread.so.0
     20454:
     20454:	find library=libc.so.6 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libc.so.6
     20454:
     20454:	find library=libicudata.so.65 [0]; searching
     20454:	 search path=/usr/lib		(system search path)
     20454:	  trying file=/usr/lib/libicudata.so.65
     20454:
	linux-vdso.so.1 (0x00007ffde6fff000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f58dde8b000)
	libicuuc.so.65 => /usr/lib/libicuuc.so.65 (0x00007f58ddca9000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f58ddabf000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f58dd979000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f58dd95f000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f58dd93d000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f58dd774000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f58de3da000)
	libicudata.so.65 => /usr/lib/libicudata.so.65 (0x00007f58dbcc3000)
     20452:
     20452:	calling fini: /usr/bin/bash [0]
     20452:
     20452:
     20452:	calling fini: /usr/lib/libreadline.so.8 [0]
     20452:
     20452:
     20452:	calling fini: /usr/lib/firebird/bin/fblib/libdl.so.2 [0]
     20452:
     20452:
     20452:	calling fini: /usr/lib/libncursesw.so.6 [0]
     20452:
     20449:
     20449:	calling fini: /usr/bin/bash [0]
     20449:
     20449:
     20449:	calling fini: /usr/lib/libreadline.so.8 [0]
     20449:
     20449:
     20449:	calling fini: /usr/lib/firebird/bin/fblib/libdl.so.2 [0]
     20449:
     20449:
     20449:	calling fini: /usr/lib/libncursesw.so.6 [0]
archevator
LD_DEBUG=libs
Лучше использовать LD_DEBUG=files, а если полный анализ, то all ... но вывод будет громадный и лучше выводить лог в файл.

И не все так просто с этим динамическими билиотеками - их два типа, которые вызываются по разному, плюс к этому не все либы присутствуют в выводе ldd и нужно делать полный анализ запуска проги. И для полного анализа иногда применяют и дополнительные утилиты типа strace, ltrace.
А, главное, если хочешь обеспечить полный запуск своего приложения не зависимо от среды ОС, то с простым копированием библиотек, имхо, не всегда и получится.
А потому лучше от самоделок отказаться - если есть желание для такого запуска, то лучше использовать готовые решения, а не изобретать велосипед.

EDIT 1 - и зачем такие сложности, если это так необходимо и редко используется
archevator
Бывает редко, но мне нужно что-то проверить, как будет рабоать тот или иной запрос в базе данных для этого сервера. Поскольку этот пакет есть только в AUR, то пришлось его устанавливать после локальной сборки.
не проще ли изготовить LiveCD с установленной нужной прогой или установить систему на флэшку в нужном окружении и с нужным ПО - понадобилось, загрузился, проверил.

EDIT 2 - на всякий случай кидаю 2 ссылки .. 1 .. и .. 2 .. ...... и более правильный путь через ld.so.conf.d и ldconfig, как описывал выше (должен быть указан и в приведенных ссылка, но не проверял)
Ошибки не исчезают с опытом - они просто умнеют
archevator
ldd находит библиотеки в системных каталогах, несмотря на то для поиска библиотек явно задан каталог.
Почему-то в одном случае указание пути поиска LD_LIBRARY_PATH работает как ожидается, а в другом - нет.
Подробно не смотрел, но похоже не верно используется LD_LIBRARY_PATH ...

EDIT 1 - проверил на ls - скопировал 3 либы в /home/vasek/lib_ls - запускаем
LD_LIBRARY_PATH="/home/vasek/lib_ls" ldd /usr/bin/ls
... и видим эти 3 файла (остальные как обычно из системной директории /usr/lib/... - не привел)
libxcb.so.1 => /home/vasek/lib_ls/libxcb.so.1 (0x00007f0832095000)
libXau.so.6 => /home/vasek/lib_ls/libXau.so.6 (0x00007f083208e000)
libXdmcp.so.6 => /home/vasek/lib_ls/libXdmcp.so.6 (0x00007f0832086000)
Так что нужно смотреть подробнее, что за прога, точнее, как включены эти динамические либы.
Ошибки не исчезают с опытом - они просто умнеют
archevator
ldd fbserver | cut -d' ' -f3 | xargs sudo cp -t ld
Мои скрипты автоматизации портирования :
dep-find - показывает недостающие либы
mkport - помогает перенести в /opt и создать запускающий скрипт
PuppyRusArch (PRA)
 
Зарегистрироваться или войдите чтобы оставить сообщение.