Сборка.

Тема в разделе "Флудилка", создана пользователем Igor68, 3 янв 2019.

  1. Igor68

    Igor68 Гуру

    Итак:
    перетаскиваю файл config.guess на устройство в RAM-диск и стартую и вот:
    Код (Text):
    www-data@Moxa:~/ramdisk$ ./config.guess
    armv4tl-unknown-linux-gnu
    www-data@Moxa:~/ramdisk$
    т.е. наш хост для исполнения armv4tl-unknown-linux-gnu нет не тот чем компилируем, а тот где должно работать. попробую его указать для configure
     
  2. Igor68

    Igor68 Гуру

    сделал скрипт по образу и подобию ссылки:
    Код (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 и т.п.), но далее???
     
  3. AlexU

    AlexU Гуру

    Почти по образу и подобию. За исключением вызова скрипта конфигурации:
    Код (Bash):
    ./configure --host=arm-linux
    PS: похоже упустил по невнимательности -- что пытаетесь собрать?
     
  4. Igor68

    Igor68 Гуру

    это верно --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':
     
    наверное можно где-то носом ткнуть, не везде же править.
     
  5. AlexU

    AlexU Гуру

    По умолчанию 'target' равен 'host', поэтому можно и не задавать. Да и в списке параметров (./configure --help) такого параметра как 'target' нет.
     
  6. Igor68

    Igor68 Гуру

    Это для 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!

    А то, что я указал - это пробую то одно, то другое... ну и таскаю скрипт туда-сюда.
     
  7. AlexU

    AlexU Гуру

    Ради интереса взглянул одним глазком на 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), то сборка завершается успешно. Но насколько полученный файл будет работоспособным не понятно.
     
  8. Igor68

    Igor68 Гуру

    точно так... '--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 на самом устройстве.
     
  9. Igor68

    Igor68 Гуру

    Это и делал ранее. Но вот если CC=arm-linux-gcc и т.п. сделать как параметр в ./configue то CC в Makefile сам встанет какой надо. И есть предположение, что много ещё чего надо поставить/изменить указав параметр. Кстати компиляция nmap-6.40 из исходников на малине прошла нормально и... и медленно. Да всё было на SD-карте. А вот компиляция(сборка) на RAM-диске дала совсем другую скорость. Правда не nmap-6.40, больно много места занял.
     
  10. Igor68

    Igor68 Гуру

    ...И ещё: Там достаточно вложенных директорий и в каждой свой Makefile и ещё configure в довесок.
     
  11. AlexU

    AlexU Гуру

    Делал просто:
    Код (Bash):
    ./configure --host=arm-linux
    БЕЗ всяких:
    Код (Bash):
    export CC="$_target-gcc"
    export NM="$_target-nm"
    и т.п.
    В большей части Makefile'ов подставились правильные 'arm-linux-gcc' и т.п. За исключением встроенной libz. Наверно конфигуратор криво сгенерировал Makefile. И вполне возможно предварительные export'ы нужных переменных эту проблему решат.
     
  12. AlexU

    AlexU Гуру

    В большинстве случаев это дополнительные библиотеки, которые можно скачать и прилепить к сборке. А можно не качать и воспользоваться теми, что поставщик nmap заботливо упаковал в свой архив.
     
  13. Igor68

    Igor68 Гуру

    да понятно, спасибо. Вот только я делал в скрипте
    Код (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)
     
  14. Igor68

    Igor68 Гуру

    А что по поводу заботливых поставщиков, то вот libpcap.so.1.2.1 готовый для малины на малине
    snapshot27.png
    для moxa - удалось частично собрать
    snapshot28.png
    Поверьте они разные, так же как для x86(и семейства) и подойдут только для совместимой архитектуры, так же и другие.

    Я говорю неправду? Может что-то не понимаю? Будьте добры поясните!
     
    Последнее редактирование: 9 янв 2019
  15. AlexU

    AlexU Гуру

    Вы не понимаете того, что разделяемые библиотеки собраны разными версиями компиляторов с разными параметрами сборки. Потому бинарники и отличаются, хотя делают одно и то же.
    Вот начали смотреть внутренности бинарников и что там хотели увидеть?
     
  16. AlexU

    AlexU Гуру

    Третьи "Кеды" с "Дельфином", да "ПолуночныйКомандир" -- как давно это было.....
     
  17. Igor68

    Igor68 Гуру

    Да нет, это я понимаю. Только вот среагировал на фразу:
    Хотя может не так пониял/прочитал.
     
    Последнее редактирование: 11 янв 2019
  18. Igor68

    Igor68 Гуру

    Доброго времени суток!
    А вот 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:~$
     
  19. Igor68

    Igor68 Гуру

    Доброго времени суток!!!
    Заранее прошу прощения за длинную фразу!

    Исходное:
    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

    спасибо!
     
    Последнее редактирование: 27 янв 2019
  20. ZAZ-965

    ZAZ-965 Гуру

    День добрый, @Igor68. Взять cifs-utils можно на samba.org Посмотрел отличия от соответствующего пакета в Debian - добавлена только папка Debian со скриптами для генерации deb файла. Судя по зависимостям в Debian (в Makefile.am из samba.org такие же) нужны keyutils, libkeyutils1, libcap-ng ...