Mam router Asus RT-AC68R z podmontowanym do /opt penem 32 GB. Na nim zainstalowane jest entware w tym wszystkie narzędzia do kompilacji programów natywnie na platformę ARMv7
Napisałem program do obsługi modułu opartego na chipie FT245 połączonego przez USB do routera. Program ten skompilowany na Linuxie x86_64 pracuje prawidłowo na zwykłym komputerze z Linuxem. Całość wymagała doinstalowania biblioteki dostarczanej przez producenta. Producent dostarcza wspomniane biblioteki na różne platformy, w tym na ARMv7 w wersji soft i hard float. Na routerze zainstalowałem bibliotekę hard float.
Wspomniane biblioteki znajdują się http://www.ftdichip.com/Drivers/D2XX.htm
Próbuję więc skompilować program, po uprzedniej instalacji na penie bibliotek FTDI, zgodnie z dokumentacją. Niestety po uruchomieniu programu występuje błąd biblioteki.
root@asus:/opt# gcc -Wl,-rpath=/opt/usr/local/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 -L/opt/usr/local/lib -O2 -pipe
-march=armv7-a -mtune=cortex-a9 -fno-caller-saves -mfloat-abi=soft -l ftd2xx arco.c -o arco
root@asus:/opt# ./arco
./arco: error while loading shared libraries: /opt/usr/local/lib/libftd2xx.so: internal error
Jestem dość nowy jeżeli chodzi o zabawy "w te klocki" ale może coś jest w tym że w opcjach kompilacji używam:
a zainstalowana biblioteka jest hard-float. Nie wiem czy to może być przyczyna więc oczekuję rady Kolegów.
Z góry dziękuję za odpowiedzi !
W załączeniu źródło programu o którym mowa. Jest to program do obsługi modułu firmy ARCO, posiadającego 4 wejścia optoizolowane i 4 wyjścia przekaźnikowe. Idealne do domowego systemu automatyki.
Połączony z 13 wrzesień 2016 08:09:02:
Wypróbowałem różne opcje kompilacji. Aby znaleźć powód błędu, dodałem do opcji kompilacji "-v" czyli verbose. I tak. Kompilacja programu za pomocą polecenia:
gcc -v -Wl,-rpath=/opt/usr/local/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 -L/op/usr/local/lib -O2 -pipe -march=armv7-a -mtune=cortex-a9 -fno-caller-saves -mfloat-abi=soft -l ftd2xx arco.c -o arco
daje wynik:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/lto-wrapper
Target: arm-openwrt-linux-gnueabi
Configured with: /media/ware3/Entware-ng.2016.08/build_dir/target-arm_cortex-a9_glibc-2.23_eabi/gcc-5.4.0/configure --target=arm-openwrt-linux --host=arm-openwrt-linux --build=x86_64-linux-gnu --program-prefix= --program-suffix= --prefix=/opt --exec-prefix=/opt --bindir=/opt/bin --sbindir=/opt/sbin --libexecdir=/opt/lib --sysconfdir=/opt/etc --datadir=/opt/share --localstatedir=/opt/var --mandir=/opt/man --infodir=/opt/info --disable-nls --build=x86_64-linux-gnu --host=arm-openwrt-linux-gnueabi --target=arm-openwrt-linux-gnueabi --enable-languages=c,c++ --with-bugurl=https://dev.openwrt.org/ --with-pkgversion='OpenWrt GCC 5.4.0' --enable-shared --enable-__cxa_atexit --with-default-libstdcxx-abi=gcc4-compatible --enable-target-optspace --with-gnu-ld --with-stage1-ldflags='-Wl,-rpath=/opt/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3' --with-boot-ldflags='static-libstdc++ -static-libgcc -Wl,-rpath=/opt/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3' --disable-nls --disable-libsanitizer --disable-libvtv --disable-libcilkrts --disable-libmudflap --disable-multilib --disable-libgomp --disable-libquadmath --disable-libssp --disable-decimal-float --disable-libstdcxx-pch --with-host-libstdcxx=-lstdc++ --prefix=/opt --libexecdir=/opt/lib --with-local-prefix=/opt --with-float=soft --with-default-libstdcxx-abi=gcc4-compatible
Thread model: posix
gcc version 5.4.0 (OpenWrt GCC 5.4.0)
COLLECT_GCC_OPTIONS='-v' '-L/opt/usr/local/lib' '-O2' '-pipe' '-march=armv7-a' '-mtune=cortex-a9' '-fno-caller-saves' '-mfloat-abi=soft' '-o' 'arco' '-mtls-dialect=gnu'
/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/cc1 -quiet -v -imultilib . -imultiarch arm-linux-gnueabi arco.c -quiet -dumpbase arco.c -march=armv7-a -mtune=cortex-a9 -mfloat-abi=soft -mtls-dialect=gnu -auxbase arco -O2 -version -fno-caller-saves -o - |
as -v -march=armv7-a -mfloat-abi=soft -meabi=5 -o /opt/tmp/cchRPE4Y.o
GNU assembler version 2.26.1 (arm-openwrt-linux-gnueabi) using BFD version (GNU Binutils) 2.26.1
GNU C11 (OpenWrt GCC 5.4.0) version 5.4.0 (arm-openwrt-linux-gnueabi)
compiled by GNU C version 5.4.0, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=31954
ignoring nonexistent directory "/opt/include/arm-linux-gnueabi"
ignoring nonexistent directory "/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/../../../../arm-openwrt-linux-gnueabi/include"
ignoring nonexistent directory "/usr/include/arm-linux-gnueabi"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/include
/opt/include
/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/include-fixed
End of search list.
GNU C11 (OpenWrt GCC 5.4.0) version 5.4.0 (arm-openwrt-linux-gnueabi)
compiled by GNU C version 5.4.0, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=31954
Compiler executable checksum: a589712d81e28a1300ccb0e03d994135
COMPILER_PATH=/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/:/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/:/opt/lib/gcc/arm-openwrt-linux-gnueabi/:/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/:/opt/lib/gcc/arm-openwrt-linux-gnueabi/
LIBRARY_PATH=/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/:/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-L/opt/usr/local/lib' '-O2' '-pipe' '-march=armv7-a' '-mtune=cortex-a9' '-fno-caller-saves' '-mfloat-abi=soft' '-o' 'arco' '-mtls-dialect=gnu'
/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/collect2 -plugin /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/liblto_plugin.so -plugin-opt=/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/lto-wrapper -plugin-opt=-fresolution=/opt/tmp/ccIMfua6.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --eh-frame-hdr -dynamic-linker /lib/ld-linux.so.3 -X -m armelf_linux_eabi -o arco /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/crt1.o /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/crti.o /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/crtbegin.o -L/opt/usr/local/lib -L/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0 -L/opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/../../.. -rpath=/opt/usr/local/lib --dynamic-linker=/opt/lib/ld-linux.so.3 -lftd2xx /opt/tmp/cchRPE4Y.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/crtend.o /opt/lib/gcc/arm-openwrt-linux-gnueabi/5.4.0/crtn.o
Co dziwne, jak przyjrzeć się komunikatowi z kompilacji, to w pierwszej częci występuje:
-dynamic-linker /opt/lib/ld-linux.so.3
A w drugiej
-dynamic-linker /lib/ld-linux.so.3
Czyli komunikat pojawiający się po uruchomienu programu czyli:
./arco: error while loading shared libraries: /opt/usr/local/lib/libftd2xx.so: internal error
wydaje się uzasadniony bo bo w katalogu /lib nie ma pliku ld-linux.so.3
Są więc dwie możliwości. Albo popełniam jakiś błąd w wyniku czego wskazywane położenie linkera jest błędne albo trzeba skopiować/linkować plik ld-linux.so.3 do /lib. No tylko że katalog /lib jest na filesystemie read only i nijak nie można tego zrobić.
Zastosowałem też inne wywołanie kompilacji, ściśle według rady Kolegi Steel_Rat, czyli:
gcc -v -Wl,-rpath=/opt/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 -L/opt/lib -O2 -pipe -march=armv7-a -mtune=cortex-a9 -fno-caller-saves -mfloat-abi=soft -l ftd2xx arco.c -o arco
ale wtedy występuje dodatkowo błąd kompilacji:
/opt/bin/ld: cannot find -lftd2xx
i także komunikat z kompilacji, jak w poprzednim przykładzie, pokazuje dwa różne miejsca położenia pliku ld-linux.so.3
Z kolei nie rozumiem tego ostatniego komunikatu bo do zmiennej określającej położenie bibliotek wpisałem wszystkie możliwe lokalizacje. I tak:
root@asus:/opt# echo $LD_LIBRARY_PATH
/lib:/usr/lib:/usr/local/lib:/opt/lib:/opt/usr/lib:/opt/include:/opt/usr/local/lib:/opt/usr/include
Czy ktoś z Kolegów pomoże rozwiązać mi tą zagadkę?
mackowiakp załączono następujące plik:
Nie masz uprawnień, by zobaczyć załączniki w tym wątku.
Edytowany przez mackowiakp dnia 13-09-2016 08:09
UWAGA ! Administrator ma prawo do odmowy instalacji WINDOWS, powołując się na klauzulę sumienia
WARNING ! The administrator has the right to refuse to install WINDOWS, invoking the conscience clause
|