Изменение 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?

да, точно так. Настройки лежат в ld.so.conf , с недавних пор еще и в ld.so.conf.d/ , при запуске системы отрабатывается обновление кеша

LDPATH - в этой переменной содержится список каталогов, разделенных двоеточиями, в которых динамический компоновщик ищет библиотеки.

не факт, не совсем и не всегда
полный список зарегестрированных библиотек можно получить по команде

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? причем и библиотека и программа собрана под этой системой??

скрытный секс :)

пройти функция подгрузки

 пройти функция подгрузки библиотеки через 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

alex000090 написал(а):
Здравствуйте!
Собственно вопрос в том, как можно сделать, чтобы программы понимали /opt, как корень?
Буду рад вашим предложениям!

Такая штука делается с помощью chroot, не знаю насколько это возможно в Вашем устройстве.

Здравствуйте! К сожалению,

Здравствуйте! К сожалению, chroot не подойдет.

Готов несколько уточнить задачу. Есть устройство (NAS) с предустановленным Linux и с малым количеством памяти (свободного места) на борту. Но linux стоит полноценный, то есть имеется возможность в том числе запускать сторонние программы. К устройству цепляется жесткий диск. Его часть я примонтировал к /opt. Именно поэтому все программы должны лежать в /opt. Однако, chroot использовать нельзя, так как это повлечет перенос настроек программ, расположенных на устройстве в /opt, чего делать не хочется. Плюс ко всему, предполагаю, что из-за chroot увеличится нагрузка на оперативную память и процессор.

Что мешает замонтировать хард

Что мешает замонтировать хард под корень или набить на харде разделов и замонтировать их в критические участки корня? ИМХО много проще, нежели косячить тучу собранных и заточенных под посикс стандарт программ.
Для справки. В каталогах /bin и /sbin /lib должно лежать системное ПО. Пользовательское ПО (не требуется для загрузки) согласно стандарту ложится в /usr или в /opt. Именно эти каталоги раздувает дополнительное установленное ПО. Еще кандидаты для выноса на хард /var и /tmp. Задача решается разбиением диска и правкой фстаб. Возможно заюзать лвм, для гентоо есть специальное хауту, в котором подробно расписано что стоит выносить из корня на лвм (или внешний хард), а что нет.

Что-то запутался

С одной стороны:

Цитата:
Требуется, чтобы все программы воспринимали /opt, как корень, и отсчитывали от него все свои пути.

Если программа рассматривает /opt как корень, то ей будет доступно только содержимое /opt.

С другой стороны:

Цитата:
так как это повлечет перенос настроек программ, расположенных на устройстве в /opt, чего делать не хочется

Т.е. для программы из /opt может потребоваться доступ к некоторым файлам из реального корня. Здесь может спасти "биндинг" -- напимер,

mount -o bind /etc /opt/etc

перед chroot позволит иметь копию каталога /etc в новом окружении.

chroot на устройстве не

chroot на устройстве не работает

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".