Page 1 of 10 123 ... LastLast
Results 1 to 15 of 143

Thread: Переход от нативной компиляции к кросс-компиляции

  1. #1

    Thumbs up Переход от нативной компиляции к кросс-компиляции

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

    Итак, преамбула.

    Нативная компиляция, на мой взгляд, самый простой способ сборки ПО для роутера. Простота нативной компиляции состоит в том, что софт компилируется в самой благоприятной среде: общие библиотеки находятся в /opt/lib, заголовочные файлы в /opt/include, и пр. Кроме того, оценить получившийся результат можно сразу после компиляции. Но на ряду с простотой, нативный способ имеет следующие недостатки:
    • долгое время компиляции софта,
    • потенциальная нехватка памяти для работы компилятора,
    • устаревший тулчейн (главный недостаток!),
    • возможные проблемы с libtool, установленной в системе.


    Перечислю инструменты, предлагаемые для кросс-компиляции:
    1. Старый тулчейн Олега. gcc 4.1.1(?) + uClibc 0.9.19. В качестве инструмента не рассматриваю, он устарел.
    2. Тулчейн Optware. gcc 4.1.1 + uClibc 0.9.28. Кстати, именно эта связка инструментов используется при нативной компиляции. После установки этот тулчейн отпугнул меня своей кучей скриптов на все случаи жизни. Чтобы начать с ним работать, необходимо разобраться с шаблоном скрипта template.mk и действовать аналогично. Честно говоря, я не хочу разбираться с этой кучей скриптов, и, тем более, искать причину если что-то пойдёт не так.
    3. Тулчейн энтузиастов, gcc 4.3.5 + uClibc 0.9.30.1. Этим тулчейном собирается сама прошивка. Собранный с помощью него софт пойдёт только на нашей коробочке и не запустится на других optware-based роутерах. На сайте прошивки есть два архива - hndtools-mipsel-uclibc-4.3.5-2.tar.bz2 и появившийся несколько дней назад hndtools-mipsel-uclibc-4.3.5-x86_64-3.tar.bz2. Бинарники из второго в последней Ubuntu у меня выполняться отказались и я выбрал в качестве инструмента первый архив. Этот инструмент мне понравился больше всего: в нём содержатся исключительно исключительно инструменты для компиляции. Никаких скриптов, как в варианте optware нет, поэтому различные зависимости для компилировния софта придётся прописывать самому, что лучше всего подходит для понимания процесса.


    Теперь тестовый пример.
    Маленькая сетевая утилита Ping Tunnel, имеющая одну зависимость. Как нельзя лучше подходит для примера.

    Нативная компиляция.
    Устанавливаем зависимости:
    Code:
    $ ipkg install libpcap libpcap-dev
    Скачиваем, распаковываем исходники и компилируем:
    Code:
    $ wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.71.tar.gz
    $ tar -xvzf ./PingTunnel-0.71.tar.gz
    $ cd PingTunnel/
    $ make
    Готово!

    Кросс-компиляция тулчейном энтузиастов.
    1. Устанавливаю тулчейн в ~/newtoolchain,
    2. В ~/newtoolchain/opt/lib и в ~/newtoolchain/opt/include кладу распакованные из ipk-пакетов файлы зависимой библиотеки libpcap.
    3. Правлю Makefile софтины, указывая перечисленные выше директории для компилятора и линковщика соответственно. Меняю компилятор с gcc на mipsel-linux-uclibc-gcc.

    Code:
    # Makefile for the pingtunnel utility
    # (c) 2004-2009 Daniel Stoedle, daniels@cs.uit.no
    # ptunnel.exe target added by Mike Miller, mike@mikeage.net
    
    CC	 	= mipsel-linux-uclibc-gcc
    CFLAGS		= -Wall -g -I/home/al/newtoolchain/opt/include -I/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5/include
    LDOPTS		= -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
    PT_OBJS		= ptunnel.o md5.o
    ...
    • 4. Пытаюсь компилировать:

    Code:
    $ make
    mipsel-linux-uclibc-gcc -o ptunnel ptunnel.o md5.o -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
    /home/al/newtoolchain/opt/lib/libpcap.so: undefined reference to `__ctype_b_loc'
    collect2: ld returned 1 exit status
    make: *** [ptunnel] Ошибка 1
    В чём засада?
    Last edited by ryzhov_al; 21-12-2010 at 21:21.

  2. #2
    А чем стандартный путь не устраивает?
    http://www.nslu2-linux.org/wiki/Optw...ckageToOptware

    Тулчейн (свой) правда будет собираться долго. Если собирать не модуль ведра, а утилиту, то все вроде работает.
    Зря испугались пути номер 2.
    Last edited by Zyxmon; 22-12-2010 at 06:30.

  3. #3
    Quote Originally Posted by Zyxmon View Post
    А чем стандартный путь не устраивает?
    http://www.nslu2-linux.org/wiki/Optw...ckageToOptware
    Смотри п.2.

  4. #4
    Join Date
    Nov 2006
    Location
    Russia, Moscow
    Posts
    3,640
    Quote Originally Posted by ryzhov_al View Post
    [*]Старый тулчейн Олега. gcc 4.1.1(?) + uClibc 0.9.19. В качестве инструмента не рассматриваю, он устарел.
    gcc 3.2.3

    На сайте прошивки есть два архива - hndtools-mipsel-uclibc-4.3.5-2.tar.bz2 и появившийся несколько дней назад hndtools-mipsel-uclibc-4.3.5-x86_64-3.tar.bz2.
    Как легко догадаться, второй только для 64-битной системы. Свежий 32-битный выложит theMIROn, как сможет. Кросс-сборку 32-битного тулчейна на 64-битном хосте я еще не допилил, всё времени не хватает...

    Кросс-компиляция тулчейном энтузиастов.
    Code:
    # Makefile for the pingtunnel utility
    # (c) 2004-2009 Daniel Stoedle, daniels@cs.uit.no
    # ptunnel.exe target added by Mike Miller, mike@mikeage.net
    
    CC	 	= mipsel-linux-uclibc-gcc
    CFLAGS		= -Wall -g -I/home/al/newtoolchain/opt/include -I/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5/include
    LDOPTS		= -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
    PT_OBJS		= ptunnel.o md5.o
    ...
    Стандартные пути (/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5) не нужно включать, они подцепляются сами.

    Code:
    $ make
    mipsel-linux-uclibc-gcc -o ptunnel ptunnel.o md5.o -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
    /home/al/newtoolchain/opt/lib/libpcap.so: undefined reference to `__ctype_b_loc'
    collect2: ld returned 1 exit status
    make: *** [ptunnel] Ошибка 1
    В чём засада?
    Скорее всего, придётся пересобрать и libpcap под нашу uClibc. Различие в конфиге - у нас выключено UCLIBC_HAS_LOCALE.
    Last edited by lly; 22-12-2010 at 08:57.

  5. #5
    Quote Originally Posted by lly View Post
    Следует заметить, что весь optware'вский софт должен использовать свою версию uClibc.
    Значит, лучше не выделываться и собирать софт с помощью тулчейна optware. В противном случае нельзя будет использовать наработки optware.
    Энтузиастский тулчейн оставить в покое и использовать только для сбора прошивки.

  6. #6
    Join Date
    Nov 2006
    Location
    Russia, Moscow
    Posts
    3,640
    Quote Originally Posted by ryzhov_al View Post
    Значит, лучше не выделываться и собирать софт с помощью тулчейна optware. В противном случае нельзя будет использовать наработки optware.
    Энтузиастский тулчейн оставить в покое и использовать только для сбора прошивки.
    В зависимости от твоих целей. Я всегда пересобираю из исходников нашим тулчейном
    Взять хотя бы до сих пор неустранённые грабли с PIE бинарниками в optware (см. мои сообщения о баге в binutils)...

    Если очень хочется бинарной совместимости с optware uClibc, надо наш тулчейн пересобирать с uClibc 0.9.29 и бекпортить пару пудов патчей из 0.9.30.1

    Ну или спортировать фиксы в optware'вский тулчейн.
    Last edited by lly; 22-12-2010 at 11:07.

  7. #7
    причем второе гораздо кошернее
    p.s. тулчейн x86 постараюсь сегодня выложить

  8. #8
    Quote Originally Posted by ryzhov_al View Post
    Значит, лучше не выделываться и собирать софт с помощью тулчейна optware. В противном случае нельзя будет использовать наработки optware.
    Энтузиастский тулчейн оставить в покое и использовать только для сбора прошивки.
    наш тулчейн, помимо того, что озвучил lly позволяет использовать софт без optware, совсем.
    с другой стороны, если есть куча зависимостей - их проще решать через optware

  9. #9
    Quote Originally Posted by theMIROn View Post
    наш тулчейн, помимо того, что озвучил lly позволяет использовать софт без optware, совсем.
    Как? Статической линковкой?
    Quote Originally Posted by theMIROn View Post
    с другой стороны, если есть куча зависимостей - их проще решать через optware
    Получается так:
    • при малом числе зависимостей лучше собирать новым тулчейном, перекомпилировав зависимости. Результат слинковать статически.
    • если зависимостей много и пересобирать их задача нетривиальная, то лучше использовать тулчейн optware.

    Так? Значит, от optware'овского тулчейна мне никуда не деться и вопрос выбора тулчейна закрыт


    Кстати говоря, а чем присутствующие собирают ipk-пакет после компиляции? На www-просторах для этих целей есть куча самых разнообразных shell-скриптов. Тот, который использую я, имеет косяк в заполнении поля Description. Если в optware'овском тулчейне такой скрипт есть, то этот вопрос то же закрыт.
    Last edited by ryzhov_al; 22-12-2010 at 14:04.

  10. #10
    Join Date
    Nov 2006
    Location
    Russia, Moscow
    Posts
    3,640
    Quote Originally Posted by ryzhov_al View Post
    Как? Статической линковкой?
    зачем??? не выставляй LD_LIBRARY_PATH=/opt/lib и библиотеки из /lib найдутся сами. Ну можно добавить контрольный выстрел - rpath
    Кстати говоря, а чем присутствующие собирают ipk-пакет после компиляции?
    Ну например http://wl500g.googlecode.com/svn/ipk...es/ipkg-utils/

  11. #11
    Quote Originally Posted by lly View Post
    зачем??? не выставляй LD_LIBRARY_PATH=/opt/lib и библиотеки из /lib найдутся сами. Ну можно добавить контрольный выстрел - rpath
    Хотя бы за тем, чтобы не возник случай описанный в примере выше.
    • Обновлённая uClibc возьмётся из /lib. Согласен,
    • Зависимую libpcap всё равно придётся брать из /opt/lib.

    Финиш. В примере из первого поста софтина, собранная с uClibc 0.9.30.1 не слинковалась с динамической библиотекой libpcap из optware, так как библиотека была собрана с uClibc 0.9.28.

    Quote Originally Posted by lly View Post
    Очень хорошо. Пару скриптов ipkg-build* утащил к себе в нору.

  12. #12
    Join Date
    Nov 2006
    Location
    Russia, Moscow
    Posts
    3,640
    Quote Originally Posted by ryzhov_al View Post
    [*]Зависимую libpcap всё равно придётся брать из /opt/lib.
    Что мешает положить в /opt/lib пересобранную версию libpcap? Боишься, что кто-то еще будет использовать?
    Ну тогда делать отдельную /opt/lib.new и прописывать rpath.

  13. #13
    Кстати говоря, а чем присутствующие собирают ipk-пакет после компиляции?
    Если используете optware, то все просто
    Code:
    make mypackage-check
    При сборке скриптами optware "жестко" проставляется rpath и uClibc, и все библиотеки будут браться из /opt/lib.

    Если
    Ну или спортировать фиксы в optware'вский тулчейн.
    То можно жить без uClibc и пр. в /opt/lib

  14. #14
    Quote Originally Posted by lly View Post
    Что мешает положить в /opt/lib пересобранную версию libpcap? Боишься, что кто-то еще будет использовать?
    Ну тогда делать отдельную /opt/lib.new и прописывать rpath.
    За изобретательство велосипедов можно получить... лучи ненависти от пользователей.

    Пока не встречу серьёзных ограничений optware'овского тулчейна, буду работать с ним. Рано или поздно, optware будет вынужден обновить свой инструментарий. Благо большую часть репозитория можно пересобрать хоть сейчас, на автопилоте.

    Вопросов у меня ещё будет море Те, что будут касаться нашей коробочки, буду задавать здесь.

    Спасибо присутствующим! Помогли определиться с тулчейном.

  15. #15
    Join Date
    Nov 2006
    Location
    Russia, Moscow
    Posts
    3,640
    Quote Originally Posted by ryzhov_al View Post
    Рано или поздно, optware будет вынужден обновить свой инструментарий.
    Увы, насколько я понимаю ситуацию, сейчас это делать банально некому. Герои вроде Олега появляются очень редко.

Page 1 of 10 123 ... LastLast

Similar Threads

  1. Entware - новый репозиторий для роутеров (MIPS)
    By ryzhov_al in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 1390
    Last Post: 29-04-2017, 22:40
  2. Переход на летнее время - проблема с timezone
    By ABATAPA in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 101
    Last Post: 22-12-2014, 12:45
  3. Кросс-компиляция rTorrent
    By al37919 in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 94
    Last Post: 22-04-2012, 20:48

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •