Изменение ROOT директории внутри самих программ
Здравствуйте!
В ходе знакомства с crossdev появилась некоторая проблема. Crossdev при сборке программ меняет переменную root, но внутри программ линки не изменяются. На устройстве, под которое собираются программы, все программы должны находиться в /opt. Для удобства в /opt повторена структура корня /. Требуется, чтобы все программы воспринимали /opt, как корень, и отсчитывали от него все свои пути.
Пример: Есть собранная в crossdev p7zip. Все ее файлы вручную перенесены на устройство (согласно путям), но со смещением / -> /opt (то есть ко всем абсолютным путям добавлен префикс /opt). При запуске 7za ругается на отсутствие библиотеки "/usr/(и т.д.)", которой по этому пути и вправду нет, т.к. она перенесена в "/opt/usr(и т.д.)".
Собственно вопрос в том, как можно сделать, чтобы программы понимали /opt, как корень?
Как я понимаю, на этапе выполнения программ этого сделать нельзя (в 7za абсолютный путь к библиотеке был вшит при компиляции. Но лучше, чтобы я ошибался). Тогда, остается этап компиляции. Я уже пробовал менять префикс через EPATH_ECONT="--prefix=/opt/usr" и, там где это не работало, вручную менял префикс в ebuild-файлах. Но мне хочется автоматизированного варианта. А так как мне нужно не менять префикс полностью, а только добавлять к нему приставку /opt, то можно предположить, что это можно сделать с помощью какой-либо переменной Portage (идеальный вариант) или, например, написанием программы типа emerge (на основе ebuild - но лучше что-нибудь другое).
Буду рад вашим предложениям!
- Для комментирования войдите или зарегистрируйтесь
Что то мне не верится, что на
Что то мне не верится, что на целевой платформе нет разделяемых библиотек и их загрузчика. Или ты все с -rpath собирал ?
Может просто дать ld пути поиска библиотек ?
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Простите, не могли бы вы
Простите, не могли бы вы поподробнее рассказать об ld? Во-первых, мне не понятно, как на уровне emerge передать параметры к ld, через LDPATH, или я не прав? А во вторых, может глупость скажу, но что есть программе понадобятся не только библиотеки, а что-то еще, зависящее от префикса?
можно покопать Gentoo prefix
можно покопать Gentoo prefix - как они решают там эту проблему.
но, всёже интресна цель этих экспериментов
интересная тема :)
не совсем понятна суть проблемы.
я ошибаюсь, думая, что в программу не вписывается жестко путь до разделяемой библиотеки? а она подгружается при выполненни согласно настроек ld?
LDPATH - в этой переменной содержится список каталогов, разделенных двоеточиями, в которых динамический компоновщик ищет библиотеки.
скрытный секс :)
я ошибаюсь, думая, что в
практически не ошибаешся, если только программа не собрана с флагом линковки -rpath. ( см man ld)
да, точно так. Настройки лежат в ld.so.conf , с недавних пор еще и в ld.so.conf.d/ , при запуске системы отрабатывается обновление кеша
не факт, не совсем и не всегда
полный список зарегестрированных библиотек можно получить по команде
cat /etc/ld.so.cache :)
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
можно вопрос к тебе. по каким
можно вопрос к тебе. по каким причинам может не пройти функция подгрузки библиотеки через LD_PRELOAD? причем и библиотека и программа собрана под этой системой??
скрытный секс :)
пройти функция подгрузки
например он запрещен :)
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Crossdev не воспринимает LDPATH?
Простите, отойду немого от темы. Пытаюсь реализовать идею с путями ld. Соответственно в crossdev-овский make.conf (/usr/powerpc-603-linux-uclibc/etc/make.conf) переменную LDPATH="/lib:/usr/lib:/opt/lib:/opt/usr/lib" и с помощью emerge-powerpc-603-linux-uclibc собрал для пробы p7zip.
Однако, при запуске 7za на устройстве вылезает следующее: "exec: 10: /usr/lib64/p7zip/7z: not found". Хоть убейте, не понимаю, откуда там взялся lib64?
С другой стороны, кросскомпиляцию я произвожу именно на x86_64.
кэш ld перегенерил ?
кэш ld перегенерил ?
Имхо, ты собрал кросстулчейн, т.е 1-я стадия , теперь им ( а не кроссдевом) собери что надо: там всего то 3 перменных - вот ими и играйся
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
alex000090
Такая штука делается с помощью chroot, не знаю насколько это возможно в Вашем устройстве.
Здравствуйте! К сожалению,
Здравствуйте! К сожалению, chroot не подойдет.
Готов несколько уточнить задачу. Есть устройство (NAS) с предустановленным Linux и с малым количеством памяти (свободного места) на борту. Но linux стоит полноценный, то есть имеется возможность в том числе запускать сторонние программы. К устройству цепляется жесткий диск. Его часть я примонтировал к /opt. Именно поэтому все программы должны лежать в /opt. Однако, chroot использовать нельзя, так как это повлечет перенос настроек программ, расположенных на устройстве в /opt, чего делать не хочется. Плюс ко всему, предполагаю, что из-за chroot увеличится нагрузка на оперативную память и процессор.
Что мешает замонтировать хард
Что мешает замонтировать хард под корень или набить на харде разделов и замонтировать их в критические участки корня? ИМХО много проще, нежели косячить тучу собранных и заточенных под посикс стандарт программ.
Для справки. В каталогах /bin и /sbin /lib должно лежать системное ПО. Пользовательское ПО (не требуется для загрузки) согласно стандарту ложится в /usr или в /opt. Именно эти каталоги раздувает дополнительное установленное ПО. Еще кандидаты для выноса на хард /var и /tmp. Задача решается разбиением диска и правкой фстаб. Возможно заюзать лвм, для гентоо есть специальное хауту, в котором подробно расписано что стоит выносить из корня на лвм (или внешний хард), а что нет.
Что-то запутался
С одной стороны:
Если программа рассматривает /opt как корень, то ей будет доступно только содержимое /opt.
С другой стороны:
Т.е. для программы из /opt может потребоваться доступ к некоторым файлам из реального корня. Здесь может спасти "биндинг" -- напимер,
перед chroot позволит иметь копию каталога /etc в новом окружении.
chroot на устройстве не
chroot на устройстве не работает