LINUX.ORG.RU

Кросскомпиляция новым GCC и линковка со старыми библиотеками

 , , , ,


1

2

Есть железка на arm cortex-a7. Есть к ней тулчейн от производителя GCC 4.8.3 + uClibc 0.9.33.2. Хелловорлды компилируются и запускаются. Всё хорошо.

Однако, мне нужен с++14. Поэтому решил обновить тулчейн. Взял gcc-linaro-7.2.1. Там используется glibc, поэтому я сделал sysroot на тулчейн от производителя. Но собранная им программа не запускается. Выдаёт:

/var/tmp # ./test 
-sh: ./test: not found
Файл существует и разрешение на запуск имеет.

Можно ли добиться работы от такой связки или придётся обновлять все библиотека и собирать новым компилятором? Busybox и uClibc я ещё могу пересобрать. Но у меня есть библиотеки от производителя с закрытым кодом. С ними нужно будет как-то линковаться.

P.S. на устройстве ядро 3.4.

★★★★★

Ответ на: комментарий от xaizek

На устройстве нет ldd. Через переменную среды тоже самое.

/var/tmp # LD_TRACE_LOADED_OBJECTS=1 ./test 
-sh: ./test: not found

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Эта переменная для динамического линкера, а не для приложения. Работает оно как-то так:

LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-2.23.so ./test
Но что-то мне подсказывает, что нужного динамического линкера на устройстве и нет. Можно глянуть, какой зашит так:
readelf -a ./test | grep interpreter

xaizek ★★★★★
()
Ответ на: комментарий от xaizek
/var/tmp # LD_TRACE_LOADED_OBJECTS=1 /lib/ld-uClibc-0.9.33.2.so ./test 
Standalone execution is not enabled

Если собирать новым gcc:

➜  test2 readelf -a ./test2 | grep interpreter                                         
      [Requesting program interpreter: /lib/ld-linux.so.3]

Если собирать gcc от производителя:

➜  test2 readelf -a ./test2 | grep interpreter                                         
      [Requesting program interpreter: /lib/ld-uClibc.so.0]

Ага, разные дин линкеры. Значит криво собираю.

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Standalone execution is not enabled

Я думаю LD_TRACE_LOADED_OBJECTS это фича glibc, хотя вариант ldd для uclibc вроде есть, просто может не так работает.

Значит криво собираю.

Не думаю, тулчейн же для glibc, вот он и ожидается на целевой системе. Можно попробовать собирать статически.

xaizek ★★★★★
()

Есть к ней тулчейн от производителя GCC 4.8.3 + uClibc 0.9.33.2.
Однако, мне нужен с++14. Поэтому решил обновить тулчейн. Взял gcc-linaro-7.2.1. Там используется glibc

Собери свой с uclibc например в buildroot, в последних версиях (начиная с версии Buildroot 2017.08) можно даже переносимый SDK делать

https://boundarydevices.com/buildroot-2017-08-imx-platforms/

anonymous
()
Ответ на: комментарий от xaizek

Можно попробовать собирать статически.

Плюсую статику. По первому впечатлинию у автора слишком большая нехватка скиллов чтобы ввязыватся в динамику на этой системе.

cvv ★★★★★
()
Ответ на: комментарий от cvv

По первому впечатлинию у автора слишком большая нехватка скиллов чтобы ввязыватся в динамику на этой системе.

Причем тут скилы автора ?

uClibc is designed to be source compatible with GLIBC, but it is not binary compatible.

http://www.eglibc.org/faq

anonymous
()
Ответ на: комментарий от anonymous

Собери свой с uclibc например в buildroot

Там же uclibc-ng. Не знаю насчёт бинарной совместимости. В идеале хотелось бы просто докинуть свой бинарник и запускать. А тут придётся обновлять библиотеки.

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от cvv

ввязыватся в динамику на этой системе.

Нужно будет запускать несколько приложений. Со статикой будет большой оверхед по памяти. Скорее всего не влезу во флешку.

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Если не будешь включать отладочную инфу, то далеко не факт.

cvv ★★★★★
()

-sh: ./test: not found

Известная фича, такое сообщение пишется, когда ELF-интепретатор не найден (ld-linux.so от новой glibc, прописанный в бинарник) Можешь залить новую glibc на девайс и patchelf'ом перебить путь в своем бинарнике. Если линкуешь с чужими либами, они могут поломаться - проси новые либы или собирай тулчейн с правильной версией glibc

Не glibc конечно, а uClibc 0.9.33.2

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от ox55ff

В идеале хотелось бы просто докинуть свой бинарник и запускать. А тут придётся обновлять библиотеки.

не знаю про твои идеалы, но производители дают проприетарные либы а все остальные копируют их в свою корневую, чаще конечно Yocto используют - там часто уже есть готовые адаптации под разные процессоры

https://layers.openembedded.org/layerindex/branch/master/layers/

anonymous
()
Ответ на: комментарий от annulen

patchelf'ом перебить путь в своем бинарнике.

Этот способ работает. Я сейчас сразу на стадии линковки указываю путь через опцию gcc:

-Wl,-dynamic-linker,/lib/ld-uClibc.so.0

ox55ff ★★★★★
() автор топика

Спасибо всем за помощь. На данном этапе проблема решена.

ox55ff ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.