LINUX.ORG.RU

Кросс-компиляция wiringPi с динамическими библиотеками

 , , ,


0

1

Добрый день. Пытаюсь развернуть на хосте(x86) сборку проекта для orange pi zero 3 (aarch64).

1. На устройстве aarch64 собрал wiringPi и проверил его работоспособность. 2. На хосте ставил и gcc linaro и собирал ct-ng для aarch64. Простые проекты типо hello-world запускались на устройстве. 3. Для кросс-компиляции я скопировал с устройства aarch64 на x86 в sysroot следующие директории: usr/local/lib usr/lib usr/include

Вывод компилятора:

Building file: ../src/cr_gpio.c
Invoking: Cross GCC Compiler
aarch64-unknown-linux-gnu-gcc -I/root/project/cross_t1/opi-sysroot/usr/include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/cr_gpio.d" -MT"src/cr_gpio.o" -o "src/cr_gpio.o" "../src/cr_gpio.c"
Finished building: ../src/cr_gpio.c

Вывод линкера:

Building target: cr_gpio
Invoking: Cross GCC Linker
aarch64-unknown-linux-gnu-gcc -L/root/project/cross_t1/opi-sysroot/local -L/root/project/cross_t1/opi-sysroot/usr/lib -o "cr_gpio" ./src/cr_gpio.o    -lwiringPi -lwiringPiDev -lcrypt -lm -lrt -lpthread
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find -lcrypt: Нет такого файла или каталога
collect2: error: ld returned 1 exit status
make: *** [makefile:43: cr_gpio] Ошибка 1
"make all" terminated with exit code 2. Build might be incomplete.

Тут я отправился на поиски crypt:

find . -name libcryp*

Найден был:

./opi-sysroot/usr/lib/aarch64-linux-gnu/libcrypt.so

Т.е. в путях к линкеру он присутствует, но почему он его не видит?

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

В /etc/ld.so.conf путь где искать библиотеки. В линуксе как правило /lib, /usr/lib, /otp, короче если ты нестандартно ставил библиотеку. ☝️ Но это рекомендательный совет из разряда «наши руки не для скуки»😀️. А так - кастани когонибудь тут, может помогут

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

Рекурсии там нет, пробуй:

aarch64-unknown-linux-gnu-gcc -L/root/project/cross_t1/opi-sysroot/local -L/root/project/cross_t1/opi-sysroot/usr/lib -L/root/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu -o "cr_gpio" ./src/cr_gpio.o    -lwiringPi -lwiringPiDev -lcrypt -lm -lrt -lpthread
EXL ★★★★★
()
Ответ на: комментарий от EXL

Добавил путь на расположение либы crypt Та ошибка ушла, но две другие зависимые либы вылезли

make all 
Building file: ../src/cr_gpio.c
Invoking: Cross GCC Compiler
aarch64-unknown-linux-gnu-gcc -I/root/project/cross_t1/opi-sysroot/usr/include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/cr_gpio.d" -MT"src/cr_gpio.o" -o "src/cr_gpio.o" "../src/cr_gpio.c"
Finished building: ../src/cr_gpio.c
 
Building target: cr_gpio
Invoking: Cross GCC Linker
aarch64-unknown-linux-gnu-gcc -L/root/project/cross_t1/opi-sysroot/local -L/root/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu -L/root/project/cross_t1/opi-sysroot/usr/lib -o "cr_gpio" ./src/cr_gpio.o    -lwiringPi -lwiringPiDev -lcrypt -lm -lrt -lpthread
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /lib/aarch64-linux-gnu/libm.so.6: Нет такого файла или каталога
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /lib/aarch64-linux-gnu/libmvec.so.1: Нет такого файла или каталога
collect2: error: ld returned 1 exit status
make: *** [makefile:43: cr_gpio] Ошибка 1

Что странно, ведь они тоже лежат рядом с той библиотекой:

root@dean:~/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu# ls libm*
libm-2.38.a        libmd.so.0            libmnl.so.0          libmpc.so.3.3.1      libmvec.a
libm.a             libmd.so.0.1.0        libmnl.so.0.2.0      libmpfr.so.6         libmvec.so
libmad.so.0        libmemusage.so        libmount.so.1        libmpfr.so.6.2.1     libmvec.so.1
libmad.so.0.2.1    libmenuw.so.6         libmount.so.1.1.0    libmpg123.so.0
libmagic.so.1      libmenuw.so.6.4       libmp3lame.so.0      libmpg123.so.0.48.2
libmagic.so.1.0.0  libmm-glib.so.0       libmp3lame.so.0.0.0  libm.so
libmcheck.a        libmm-glib.so.0.10.0  libmpc.so.3          libm.so.6

Иииии вторая:

root@dean:~/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu# ls libmvec*
libmvec.a  libmvec.so  libmvec.so.1

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

Всё страннее и страннее) Я решил попросту скопировать либы в opi-sysroot/lib/

root@dean:~/project/cross_t1/opi-sysroot/lib# ls libm*
libm-2.38.a        libmcheck.a      libmm-glib.so.0       libmp3lame.so.0      libmpg123.so.0
libm.a             libmd.so.0       libmm-glib.so.0.10.0  libmp3lame.so.0.0.0  libmpg123.so.0.48.2
libmad.so.0        libmd.so.0.1.0   libmnl.so.0           libmpc.so.3          libm.so
libmad.so.0.2.1    libmemusage.so   libmnl.so.0.2.0       libmpc.so.3.3.1      libm.so.6
libmagic.so.1      libmenuw.so.6    libmount.so.1         libmpfr.so.6         libmvec.a
libmagic.so.1.0.0  libmenuw.so.6.4  libmount.so.1.1.0     libmpfr.so.6.2.1     libmvec.so.1

Казалось бы, что теперь либы должны быть найдены, но ошибка та же:

make all 
Building file: ../src/cr_gpio.c
Invoking: Cross GCC Compiler
aarch64-unknown-linux-gnu-gcc -I/root/project/cross_t1/opi-sysroot/usr/include -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/cr_gpio.d" -MT"src/cr_gpio.o" -o "src/cr_gpio.o" "../src/cr_gpio.c"
Finished building: ../src/cr_gpio.c
 
Building target: cr_gpio
Invoking: Cross GCC Linker
aarch64-unknown-linux-gnu-gcc -L/root/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu -L/root/project/cross_t1/opi-sysroot/lib -L/root/project/cross_t1/opi-sysroot/local -o "cr_gpio" ./src/cr_gpio.o    -lwiringPi -lwiringPiDev -lcrypt -lm -lrt -lpthread
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /lib/aarch64-linux-gnu/libm.so.6: Нет такого файла или каталога
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /lib/aarch64-linux-gnu/libmvec.so.1: Нет такого файла или каталога
collect2: error: ld returned 1 exit status
make: *** [makefile:43: cr_gpio] Ошибка 1
"make all" terminated with exit code 2. Build might be incomplete.
megaloldean
() автор топика
Ответ на: комментарий от megaloldean

Кстати, вижу странность: Компилятор то у меня называется: aarch64-unknown-linux-gnu а ругается на путь: /lib/aarch64-linux-gnu/

Почему линковщик идёт искать файлы вообще в другое место?

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

сделал, но результат компиляции не изменился. Решил глянуть внутри каталога, как изменились ссылки:

root@dean:~/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu# find . -maxdepth 1 -lname '/*' -ls
  1990003      0 lrwxrwxrwx   1 root     root           37 янв 30 21:28 ./libresolv.so -> /lib/aarch64-linux-gnu/libresolv.so.2
  1989765      0 lrwxrwxrwx   1 root     root           43 янв 30 21:28 ./libBrokenLocale.so -> /lib/aarch64-linux-gnu/libBrokenLocale.so.1
  1989950      0 lrwxrwxrwx   1 root     root           35 янв 30 21:28 ./libmvec.so -> /lib/aarch64-linux-gnu/libmvec.so.1
  1989780      0 lrwxrwxrwx   1 root     root           34 янв 30 21:28 ./libanl.so -> /lib/aarch64-linux-gnu/libanl.so.1
  1989813      0 lrwxrwxrwx   1 root     root           45 янв 30 21:28 ./libc_malloc_debug.so -> /lib/aarch64-linux-gnu/libc_malloc_debug.so.0
  1990039      0 lrwxrwxrwx   1 root     root           40 янв 30 21:28 ./libthread_db.so -> /lib/aarch64-linux-gnu/libthread_db.so.1
  1989963      0 lrwxrwxrwx   1 root     root           41 янв 30 21:28 ./libnss_compat.so -> /lib/aarch64-linux-gnu/libnss_compat.so.2
  1990043      0 lrwxrwxrwx   1 root     root           40 ноя 13 02:45 ./libtirpc.so -> /lib/aarch64-linux-gnu/libtirpc.so.3.0.0
  1989964      0 lrwxrwxrwx   1 root     root           41 янв 30 21:28 ./libnss_hesiod.so -> /lib/aarch64-linux-gnu/libnss_hesiod.so.2

Попробую завтра перевязать либы и отпишусь. Спасибо за помощь!

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

Итак, продолжим тред.

  1. Я так понял линковщик продолжает искать либы не в том месте куда я ему указал, а идёт по пути где на хосте у меня lib/aarch64-linux-gnu. Для решения проблемы я скопировал либы по этому пути, теперь другая ошибка:
 make all 
Building target: cr_gpio
Invoking: Cross GCC Linker
aarch64-unknown-linux-gnu-gcc -L/root/project/cross_t1/opi-sysroot/usr/lib/aarch64-linux-gnu -L/root/project/cross_t1/opi-sysroot/local -o "cr_gpio" ./src/cr_gpio.o    -lwiringPi -lwiringPiDev -lcrypt -lm -lrt -lpthread
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /lib/aarch64-linux-gnu/libc.so.6: Нет такого файла или каталога
/home/dean/x-tools/aarch64-unknown-linux-gnu/lib/gcc/aarch64-unknown-linux-gnu/13.2.0/../../../../aarch64-unknown-linux-gnu/bin/ld.bfd: cannot find /usr/lib/aarch64-linux-gnu/libc_nonshared.a: Нет такого файла или каталога
collect2: error: ld returned 1 exit status
make: *** [makefile:43: cr_gpio] Ошибка 1
"make all" terminated with exit code 2. Build might be incomplete.
  1. Новые ошибки были связаны с libc.so . Я снова закинул в директории на которые ругался линковщик , в этот раз это были usr/lib и lib. И только после этого профит и всё работает. Я видимо чего-то вообще не понимаю когда указываю пути для линковки -L. Видимо есть какие-то настройки в самом eclipse из-за которых линковщик по умолчанию идёт искать в системных библиотеках. Всем спасибо за помощь.
megaloldean
() автор топика
Ответ на: комментарий от megaloldean

На счет линковки согласен , но почему то вами предложенный вариант не сработал. Собирал ct-ng из samples-list(aarch64-unknown-linux-gnu-gcc без каких либо своих измений в config.

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

Вообще всё безобразие началось с того, что ругался на glibc. Эту проблему я толком и не смог решить. Я просто обновил на x86 glibc до 2.38, чтобы совпадало с aarch

Проблема такая:

aarch64-linux-gnu-gcc -L/home/user/eclipse-workspace/sysroot/lib/lib -L/home/user/eclipse-workspace/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu/lib -o "test_gpio" ./src/test_gpio.o    -lpthread -lwiringPi -lwiringPiDev -lcrypt -lm -lrt
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `pthread_join@GLIBC_2.34'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `__isoc23_strtol@GLIBC_2.38'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `shm_open@GLIBC_2.34'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `crypt@XCRYPT_2.0'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `pow@GLIBC_2.29'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `pthread_cancel@GLIBC_2.34'
/home/user/eclipse-workspace/sysroot/lib/lib/libwiringPi.so: undefined reference to `pthread_create@GLIBC_2.34'

megaloldean
() автор топика