Итак: перетаскиваю файл config.guess на устройство в RAM-диск и стартую и вот: Код (Text): www-data@Moxa:~/ramdisk$ ./config.guess armv4tl-unknown-linux-gnu www-data@Moxa:~/ramdisk$ т.е. наш хост для исполнения armv4tl-unknown-linux-gnu нет не тот чем компилируем, а тот где должно работать. попробую его указать для configure
сделал скрипт по образу и подобию ссылки: Код (Text): #!/bin/sh # echo "----- conf.sh for UC7112-Lx-Plus ----" ./configure --help _target="/usr/local/arm-linux/bin/arm-linux" export CC="$_target-gcc" export NM="$_target-nm" export AR="$_target-ar" export AS="$_target-as" export LD="$_target-ld" export GDB="$_target-gdb" export RANLIB="$_target-ranlib" export OBJCOPY="$_target-oblcopy" export OBJDUMP="$_target-objdump" ./configure --target=arm-linux И вот: Код (Text): loading cache ./config.cache checking host system type... x86_64-unknown-linux-gnu checking target system type... arm-unknown-linux-gnu checking build system type... x86_64-unknown-linux-gnu checking for x86_64-unknown-linux-gnu-ar... (cached) /usr/local/arm-linux/bin/arm-linux-ar checking for x86_64-unknown-linux-gnu-as... (cached) /usr/local/arm-linux/bin/arm-linux-as checking for x86_64-unknown-linux-gnu-dlltool... no checking for dlltool... (cached) dlltool checking for x86_64-unknown-linux-gnu-ld... (cached) /usr/local/arm-linux/bin/../lib/gcc-lib/arm-linux/3.3.2/../../../../arm-linux/bin/ld checking for x86_64-unknown-linux-gnu-nm... (cached) /usr/local/arm-linux/bin/arm-linux-nm checking for x86_64-unknown-linux-gnu-ranlib... (cached) /usr/local/arm-linux/bin/arm-linux-ranlib checking for x86_64-unknown-linux-gnu-windres... no checking for windres... (cached) windres checking for x86_64-unknown-linux-gnu-objcopy... (cached) /usr/local/arm-linux/bin/arm-linux-oblcopy checking for x86_64-unknown-linux-gnu-objdump... (cached) /usr/local/arm-linux/bin/arm-linux-objdump checking for arm-linux-ar... no checking for arm-linux-as... no checking for arm-linux-dlltool... no checking for arm-linux-ld... no checking for arm-linux-nm... no checking for arm-linux-ranlib... no checking for arm-linux-windres... no checking whether to enable maintainer-specific portions of Makefiles... no creating ./config.status creating Makefile сначала он сказал, что есть arm-linux-XX(ar, gcc и т.п.), но далее???
Почти по образу и подобию. За исключением вызова скрипта конфигурации: Код (Bash): ./configure --host=arm-linux PS: похоже упустил по невнимательности -- что пытаетесь собрать?
это верно --host, но и --target надо. В первом случае собираю в процессе обучения nmap-7.70 во стором случае хочу бинутилиты именно на устройство. Но... но много проблем возникает. Правила хоть и с конфигами (./configure) разные... довольно разные, но это и понятно. Там надо это, там надо то. Иногда приходится править и некоторые места в C, C++ файлах. Где-то забыли указать тип данных и т.п. Но пока вот как по началу темы. В идеале конечно пакет GCC для устройства. Кстати ./configure запускал и на устройстве... но понятно там нет компилятора. Кстати это Код (Text): /usr/local/arm-linux/arm-linux/sys-include/net/route.h:66: error: field `dst' has incomplete type /usr/local/arm-linux/arm-linux/sys-include/net/route.h:125: error: parse error before "old_gw" /usr/local/arm-linux/arm-linux/sys-include/net/route.h:130: error: parse error before "u32" /usr/local/arm-linux/arm-linux/sys-include/net/route.h:135: error: parse error before "addr" /usr/local/arm-linux/arm-linux/sys-include/net/route.h:138: error: parse error before '*' token /usr/local/arm-linux/arm-linux/sys-include/net/route.h:143: error: parse error before "u32" /usr/local/arm-linux/arm-linux/sys-include/net/route.h: In function `ip_route_output': наверное можно где-то носом ткнуть, не везде же править.
По умолчанию 'target' равен 'host', поэтому можно и не задавать. Да и в списке параметров (./configure --help) такого параметра как 'target' нет.
Это для nmap: Код (Text): System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] точно нет. А это binutils-2.14 Код (Text): Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] тут есть. И ещё много чего разного имеется. Только понятно для, что для бинутилит надо указать - для кого они будут работать... они же не nmap! А то, что я указал - это пробую то одно, то другое... ну и таскаю скрипт туда-сюда.
Ради интереса взглянул одним глазком на nmap (брал здесь https://nmap.org). В общем всё немножко грустно. Во-первых help выдаваемый скриптом configure не совсем соответствует истине. В частности указано, что можно использовать поставляемый libpcap через параметр '--with-libpcap=included', но это не работает. Нужно использовать параметр '--with-pcap=...". При чём, что писать вместо точек, страшная тайна, т.к. если накарябать 'included', то сборка будет завершаться ошибкой. Методом научного тыка выяснил, что нужно задавать параметр '--with-libpcap=linux', но правда это или нет точно сказать не могу. Так же и другие аналогичные параметры, которые допускают 'included' (например, --with-libssh2=included) не работают -- библиотеки игнорируются. А те которые работают, формируют некорректные Makefile'ы для соответствующих библиотек. В частности для '--with-libz=included' игнорируется параметр '--host=arm-linux' -- сборка всё-равно будет производится компилятором для системы, на которой производится сборка. Что приводит к ошибкам во время линовки. Если ручками поправить Makefile (заменить CC и тому подобное на arm-linux-gcc), то сборка завершается успешно. Но насколько полученный файл будет работоспособным не понятно.
точно так... '--with-libpcap=linux' А выяснил, что Makefile в ./configure без параметров сделан был так(вырезка): Код (Text): PSRC = pcap-linux.c pcap-usb-linux.c pcap-can-linux.c FSRC = fad-getad.c SSRC = CSRC = pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \ savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \ bpf_image.c bpf_dump.c GENSRC = scanner.c grammar.c bpf_filter.c version.c LIBOBJS = SRC = $(PSRC) $(FSRC) $(CSRC) $(SSRC) $(GENSRC) Но это то же научный тык. А CC и т.п. работает. Ну и другие опции. Пока, что ориентируюсь на сравнении с configure без параметрв (по умолчанию). Но самое оптимальное (на мой взгляд) это конфигурация без параметров... ну понятно, что это только для своей платформы - а это значит надо иметь GCC на самом устройстве.
Это и делал ранее. Но вот если CC=arm-linux-gcc и т.п. сделать как параметр в ./configue то CC в Makefile сам встанет какой надо. И есть предположение, что много ещё чего надо поставить/изменить указав параметр. Кстати компиляция nmap-6.40 из исходников на малине прошла нормально и... и медленно. Да всё было на SD-карте. А вот компиляция(сборка) на RAM-диске дала совсем другую скорость. Правда не nmap-6.40, больно много места занял.
Делал просто: Код (Bash): ./configure --host=arm-linux БЕЗ всяких: Код (Bash): export CC="$_target-gcc" export NM="$_target-nm" и т.п. В большей части Makefile'ов подставились правильные 'arm-linux-gcc' и т.п. За исключением встроенной libz. Наверно конфигуратор криво сгенерировал Makefile. И вполне возможно предварительные export'ы нужных переменных эту проблему решат.
В большинстве случаев это дополнительные библиотеки, которые можно скачать и прилепить к сборке. А можно не качать и воспользоваться теми, что поставщик nmap заботливо упаковал в свой архив.
да понятно, спасибо. Вот только я делал в скрипте Код (Text): CC="$_target-gcc" где _target не target вовсе... не смотрите название. А тот самый _target: Код (Text): _target="/usr/local/arm-linux/bin/arm-linux" А arm-linux-gcc вообще не установлен как надо а по пути: Код (Text): /usr/local/arm-linux/bin/arm-linux-gcc Это сделал инсталятор на диске от MOXA, который туда в /usr/local/arm-linux положил и bin и include и lib и т.п. Потому и вызываю с указанием полного пути. Понимаю, что криво... но он (CD от MOXA) так же кинул arm-elf-gcc и т.п. но уже для uLinux для moxa uc7101-Lx. И сей компилятор уже установлены по нормальному вот посмотрите по TAB: Код (Text): igor@debian-i:/usr/local/arm-elf$ arm arm2hpdl arm-elf-c++filt arm-elf-ld arm-elf-protoize arm-elf-strip arm-none-eabi-gcc arm-none-eabi-gcov arm-elf-addr2line arm-elf-elf2flt arm-elf-ld.real arm-elf-ranlib arm-elf-unprotoize arm-none-eabi-gcc-4.8 arm-elf-ar arm-elf-flthdr arm-elf-nm arm-elf-readelf arm-none-eabi-c++ arm-none-eabi-gcc-ar arm-elf-as arm-elf-g++ arm-elf-objcopy arm-elf-size arm-none-eabi-cpp arm-none-eabi-gcc-nm arm-elf-c++ arm-elf-gcc arm-elf-objdump arm-elf-strings arm-none-eabi-g++ arm-none-eabi-gcc-ranlib igor@debian-i:/usr/local/arm-elf$ arm а arm-none-eabi-gcc я уже ставил сам для своих целей. Может надо поставить и по другому. Но вот мой шаблонный Makefile, который применяю для своих проектов для IA240LX/UC7112-LX-plus Код (Text): ########################### # Simple Generic Makefile # ########################### PREFIXPATH=/usr/local/arm-linux/bin CC=$(PREFIXPATH)/arm-linux-gcc CFLAGS=-c -Wall LDFLAGS=-lpthread #SOURCES=*.c SOURCES=$(shell ls *.c) OBJECTS=$(SOURCES:.c=.o) EXECUTABLE=../bin/modbusRTUserverS all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .c.o: $(CC) $(CFLAGS) $< -o $@ install: install -m 0755 $(EXECUTABLE) $(HOME)/local/bin clean: rm -rf *o $(EXECUTABLE)
А что по поводу заботливых поставщиков, то вот libpcap.so.1.2.1 готовый для малины на малине для moxa - удалось частично собрать Поверьте они разные, так же как для x86(и семейства) и подойдут только для совместимой архитектуры, так же и другие. Я говорю неправду? Может что-то не понимаю? Будьте добры поясните!
Вы не понимаете того, что разделяемые библиотеки собраны разными версиями компиляторов с разными параметрами сборки. Потому бинарники и отличаются, хотя делают одно и то же. Вот начали смотреть внутренности бинарников и что там хотели увидеть?
Доброго времени суток! А вот curl-7.63.0 собрал спокойно. Конфигурацию делал так: Код (Bash): #!/bin/sh echo "------ для UC7112LX-plus ------" _path="/usr/local/arm-linux/bin/" _pr="arm-linux-" _host="arm-linux" export CC=$_path$_pr"gcc" export CXX=$_path$_pr"g++" export AR=$_path$_pr"ar" export AS=$_path$_pr"as" export LD=$_path$_pr"ld" export OBJDUMP=$_path$_pr"objdump" export STRIP=$_path$_pr"strip" export GDB=$_path$_pr"gdb" ./configure --host=$_host \ --with-nghttp2 Ну потом make и забрал файлы curl и libcurl.so.4.5.0 и положил их в устройство соответственно первый в /usr/bin а второй в /lib. Сделал линк /lib/libcurl.so.4 ну и результат: Код (Text): www-data@Moxa:~$ curl --version curl 7.63.0 (arm-unknown-linux-gnu) libcurl/7.63.0 OpenSSL/0.9.8i Release-Date: 2018-12-12 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL UnixSockets HTTPS-proxy www-data@Moxa:~$
Доброго времени суток!!! Заранее прошу прощения за длинную фразу! Исходное: UC-7112-LX-Plus; тулчейн, который поставляется на диске вместе с устройством. Цель: Для работы и дальнейшего эксперимента надо монтировать сетевые папки по smb, потому как кругом в сети толпа машин с windows и на ряде указанных есть расшареные директории. Пробы: Собрал curl (предыдущий пост). Код (Text): www-data@Moxa:~$ curl --version curl 7.63.0 (arm-unknown-linux-gnu) libcurl/7.63.0 OpenSSL/0.9.8i Release-Date: 2018-12-12 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL UnixSockets HTTPS-proxy www-data@Moxa:~$ Видите есть smb! Провёл опыт копирования файлов в сетевую директорию. Всё устраивает. Но надо что бы некая директория в сети была примонтирована где-то в /mnt samba - тяжела, да и сервер smbd поднимать на устройстве не надо. Наткнулся на cifs утилиты был конечно рад собрал для простого ПК - работает, а при запуске mount.cifs как надо потребовал root, как и ожидалость и примонтировал папку как надо. Код (Text): root@debianConsole:/home/igor/coding/cifs-utils-6.8# ./mount.cifs //192.168.7.23/shared /mnt Password for root@//192.168.7.23/shared: root@debianConsole:/home/igor/coding/cifs-utils-6.8# ls /mnt Мир песен и музыки Франца Шуберта.pptx root@debianConsole:/home/igor/coding/cifs-utils-6.8# //192.168.7.23/shared on /mnt type cifs (rw,relatime,vers=1.0,cache=strict,username=root,domain=WINXP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.7.23,file_mode=0755,dir_mode=0755,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1) При сборке только ./configure и потом make А вот так с бубном: Код (Text): #!/bin/sh echo "------ для UC7112LX-plus ------" ./configure \ ARCH=arm \ CC=/usr/local/arm-linux/bin/arm-linux-gcc \ CROSS_COMPILE=/usr/local/arm-linux/bin/arm-linux- \ LDFLAGS="-L/usr/local/arm-linux/lib" \ --host=arm-linux \ --enable-pie=no \ ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes А вот и бубен (есть ещё и в mount.cifs.c) Код (Text): cc1: error: unrecognized option `-Wextra' убрал в makefile собрал и для устройства и на устройстве Код (Text): root@Moxa:/home/httpd/ramdisk# ./mount.cifs Usage: mount.cifs <remotetarget> <dir> -o <options> Mount the remote target, specified as a UNC name, to a local directory. Options: user=<arg> pass=<arg> dom=<arg> Less commonly used options: credentials=<filename>,guest,perm,noperm,setuids,nosetuids,rw,ro, sep=<char>,iocharset=<codepage>,suid,nosuid,exec,noexec,serverino, mapchars,nomapchars,nolock,servernetbiosname=<SRV_RFC1001NAME> directio,nounix,cifsacl,sec=<authentication mechanism>,sign,seal,fsc Options not needed for servers supporting CIFS Unix extensions (e.g. unneeded for mounts to most Samba versions): uid=<uid>,gid=<gid>,dir_mode=<mode>,file_mode=<mode>,sfu Rarely used options: port=<tcpport>,rsize=<size>,wsize=<size>,unc=<unc_name>,ip=<ip_address>, dev,nodev,nouser_xattr,netbiosname=<OUR_RFC1001NAME>,hard,soft,intr, nointr,ignorecase,noposixpaths,noacl,prefixpath=<path>,nobrl Options are described in more detail in the manual page man 8 mount.cifs To display the version number of the mount helper: mount.cifs -V root@Moxa:/home/httpd/ramdisk# Но это просто пыстышка, которая запускается под root Код (Text): $ ./mount.cifs This program is not installed setuid root - "user" CIFS mounts not supported. А ведь не хватает ещё и: cifs.upcall cifs.idmap cifs.upcall cifsacl и может и ещё что-то. Хоть и в описании сказано, что должны быть и эти бинарники в /sbin. Про библиотеки сказано, что они не нужны. Не удивлен, потому как curl имеет библиотеку, после сборки и её надо положить только в /lib. А вот если в ./configure добавить: --enable-cifsupcall --enable-cifscreds --enable-cifsidmap --enable-cifsacl то сразу нужны файлы которых нет в исходниках. Вот и вопрос: Где взять cifs-utils src с полным комплектом? Лично сам применял cifs-utils-6.8 спасибо!
День добрый, @Igor68. Взять cifs-utils можно на samba.org Посмотрел отличия от соответствующего пакета в Debian - добавлена только папка Debian со скриптами для генерации deb файла. Судя по зависимостям в Debian (в Makefile.am из samba.org такие же) нужны keyutils, libkeyutils1, libcap-ng ...