@vipermagi
Вечный ученик.

Как сделать переносимый кросскомпилятор g++?

Делаю appimage образ тулсы с кросскомпилятором внутри. Каждый раз при запуске образа он монтирует себя по рандомному пути. И при попытке запуска изнутри образа кросскомпилятора g++ выдаёт ошибку, такой фал не существует.

Суть в том, что внутри кросскомпиляторного бинарника g++ вшита зависимость /fixed/path/devkit-x86/sysroots/x86_64-pokysdk-linux/lib/ld-linux-x86-64.so.2 и при переносе в среду, где этот файл в несоответствующем вшитому путю месте, g++ "не обнаруживает себя".

Если написать нечто такое patchelf --set-interpreter /new/path/devkit-x86/sysroots/x86_64-pokysdk-linux/lib/ld-linux-x86-64.so.2 g++, то g++ снова будет работать, до запаковки в образ. Вот только образ монтируется read-only и я так решить эту проблему не могу.

Ещё пробовал такой финт: g++ -Wl,-dynamic-linker,/new/path/devkit-x86/sysroots/x86_64-pokysdk-linux/lib/ld-linux-x86-64.so.2, но не помогло.

Как быть?
  • Вопрос задан
  • 559 просмотров
Решения вопроса 1
@vipermagi Автор вопроса
Вечный ученик.
В общем, решением проблемы стал такой не очень универсальный костыль.

Внутри уже созданного образа есть запускатор AppRun в котором я прописал сразу после монтирования узнавать текущий каталог вот так:
HERE=$(dirname $(readlink -f "${0}"))
export MYAPP_DIR="${HERE}/opt/myApp"


за тем создавать симлинк в /tmp :
mkdir -p "/tmp/myApp.AppImage/lib64"
ln -sf ${MYAPP_DIR}/devkit-x86/sysroots/x86_64-pokysdk-linux/lib/ld-2.20.so /tmp/myApp.AppImage/lib64/ld-linux-x86-64.so.2


А в скрипте, создающем образ, я патчу пути до динамик лоадера во всех всех бинарниках кросскомпилятора вот так:
find "${PROGNAME_APPDIR}/opt/myApp/devkit-x86/sysroots/x86_64-pokysdk-linux" -type f -exec patchelf --set-interpreter "/tmp/myApp.AppImage/lib64/ld-linux-x86-64.so.2" '{}' \;


Кому будет интересно, кросскомпилятор для Intel Edison я засовываю в образ AppImage. В каталоге едисоновского тулчейна лежат два подкаталога: каталог sysroot с файлами и библиотеками целевой архитектуры; каталог кросс-компилятора для архитектуры, на которой происходит кросс-компиляция. По причине того, что разные каталоги, а так же, что кросс-компилятор уже собран не мной и желания с временем на перепиливание у меня нет, способы предложенные jcmvbkbc не подходят. По этому я оставляю компилятор как есть и горожу вот этот вот костыль.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Из описания не совсем понятно, кто кого не обнаруживает.
Для полноты картины приведи полный текст ошибки и вывод команды g++ -v.

Если компилятор не может найти свой sysroot попробуй запускать его так:
g++ --sysroot=/new/path/devkit-x86/sysroots/x86_64-pokysdk-linux

Более полное решение этой проблемы -- конфигурировать gcc с опцией --with-sysroot указывающей внутрь каталога, указанного в --prefix. В этом случае sysroot будет найден даже при перемещении всей инсталляции. См. https://gcc.gnu.org/install/configure.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы