LINUX.ORG.RU

А как вы кросс-компилируете util-linux?

 ,


0

3

Всем привет, возникло такое чувство, что только у меня возникают какие-то проблемы с кросс-компиляцией util-linux, потому что в интернетах на этот счёт пусто, но мне кажется, что моя проблема должна возникать просто у всех.

Итак, я собрал тулчейн (gcc, glibc, sysroot). Беру util-linux-2.27.1, распаковываю его, собираю:

$ ./configure --build=x86_64-pc-linux-gnu --host=arm-rpi-linux-gnueabihf
$ make V=1

Отлично, это всё прошло без ошибок. Смотрим, что там натворил libtool:

$ arm-rpi-linux-gnueabihf-objdump -x .libs/libblkid.so | grep RPATH
  RPATH                /tmp/util-linux-2.27.1/.libs

Собиралось это добро такой командой: http://pastebin.com/fsaCgF5n

Выхлоп от команды был следующий: http://pastebin.com/6geAwkKk

Было бы нехорошо такой бинарник ставить в таргет. Но ничего, на этот счёт у libtool есть свой костыль — relink. При make install перелинкуются заново все библиотеки без добавления каталога сборки в rpath.

Пробуем:

make install V=1 DESTDIR=/tmp/dest

Терпим фиаско при попытке релинка libblkid. Выхлоп по делу: http://pastebin.com/6ej6KNaw

Теперь сравниваем, как libtool вызывал gcc при первой линковке и при второй, пробуем также запускать обе команды с -Wl,--verbose и делаем следующие выводы:

Команды отличаются только тем, что в первую приходит -Wl,-rpath -Wl,/tmp/util-linux-2.27.1/.libs ./.libs/libuuid.so, а во вторую -L/tmp/dest/usr/lib -L/usr/lib -luuid.

Не линкуется во второй раз, потому что когда линкер ищет libc.so, то из-за флагов -L у второй команды он сначала пойдёт по этим директориям, в первой ничего не найдёт, а вот во второй найдёт /usr/lib/libc.so, представляющий собой ld-script, и дело закончится попыткой слинковаться с libc.so с хоста.

Осталось понять, откуда такие флаги у второй команды. Не вопрос, libtool'у аргументом приехал libuuid.la (libuuid тоже входит в состав util-linux), смотрим в него, а там:

# Directory that this library needs to be installed in:
libdir='/usr/lib'

Потом смотрим в код libtool, который поставляется с util-linux-2.27.1, строка 7342:

              # We cannot seem to hardcode it, guess we'll fake it.
              add_dir="-L$libdir"
              # Try looking first in the location we're being installed to.
              if test -n "$inst_prefix_dir"; then
                case $libdir in
                  [\\/]*)
                    add_dir+=" -L$inst_prefix_dir$libdir"
                    ;;
                esac
              fi
              add="-l$name"

Весь скрипт здесь: http://pastebin.com/fds2eKCA

Не копал, куда дальше уезжает эта переменная add_dir, но её изменение в этом месте приводит к изменению тех самых флагов -L, которые приезжают линкеру.

Простое решение, казалось бы, приходит сразу. Убираем add_dir="-L$libdir", потому что нам не нужно, чтобы линкеру передавался /usr/lib с хоста. Однако это вызывает массу вопросов:

  • Для чего-то же это сделано. Для чего-то при установке в DESTDIR линкеру передаётся и путь без DESTDIR тоже. Почему-то ведь нет проверки на то, кросс-компиляция это или нет. Почему-то никак не учитывается sysroot, хотя в libtool есть некая переменная lt_sysroot. Поэтому первый вопрос: почему сделано именно так?
  • Что сломается, если это изменить? Здесь я имею в виду не только util-linux, но и другие пакеты на libtool.
  • Почему я не нахожу других людей, сталкивающихся с этой проблемой? Очевидно, не я один кросс-компилирую util-linux. Может, я что-то делаю не так? Максимум, что я находил, это письмо разработчика buildroot с аналогичным вопросом. Ответы на него были полезными, но они не отвечают на мои вопросы.

Я также пробовал смотреть, как кросс-компилируют util-linux в других проектах:

  • CLFS безнадёжно протух, там очень древние версии всего, и там непохоже, чтобы они как-то пытались решить эту проблему. Возможно, там она и не возникает, но я пойти по их руководству и проверить пока не пробовал.
  • Buildroot не решает эту проблему. Он маскирует её другой, незаметной проблемой. Он накладывает патчи на libtool, после чего relink не выполняется в принципе, и в таргет отправляются бинарники с rpath, указывающим на каталог сборки на хосте.
  • В Gentoo при сборке util-linux на libtool тоже накладываются патчи, но они, как мне показалось, не касаются этой проблемы. Попытка кросс-компилировать util-linux с помощью portage успехом не увенчалась, до сборки дело просто не дошло. Я собрал тулчейн crossdev'ом, потом начал делать emerge, указав --root и --config-root, но portage не смог распарсить профиль. Возможно, дело в моей специфической конфигурации, но с этой проблемой мне предстоит справляться самому.

Основной и наиболее общий вопрос из всего этого: как всё-таки собрать util-linux правильно?

★★★★★

Последнее исправление: gentoo_root (всего исправлений: 1)

Мой опыт показывает, что проще забить и компилировать через qemu-user, потому что кросскомпиляция в современном гнутом лялексе с либтулом сотоварищи - это ад и израиль.

hateyoufeel ★★★★★
()

С рукописным мэйкфайлом всё всегда соберётся.

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

потому что кросскомпиляция в современном гнутом лялексе с либтулом сотоварищи - это ад и израиль.

++

Stil ★★★★★
()
Ответ на: комментарий от hateyoufeel

Мой опыт показывает, что проще забить и компилировать через qemu-user

Кстати, я (давненько, правда) заворачивал всё это libtool-говно в scratchbox2, волосы были вполне мягкими и шелковистыми.

Stil ★★★★★
()
Ответ на: комментарий от i_gnatenko_brain

А есть ли проекты по переводу всего и вся на cmake?

CYB3R ★★★★★
()

Для FreeScale iMX53, версия 2.22-rc1

lutil:
        $(call unpack_src, $(LINUXUTIL), tar.bz2)
        [ -f $(LINUXUTIL)/Makefile ] || \
                (cd $(LINUXUTIL) && \
                ./configure --prefix=/tmp/$@ --host=arm-fsl-linux-gnueabi \
                         --enable-gtk-doc=no --disable-largefile --disable-nls \
                         --disable-rpath --disable-tls \
                         --disable-libmount --enable-deprecated-mount=no --disable-mount \
                         --disable-losetup --disable-fsck --disable-partx --disable-uuidd \
                         --disable-mountpoint --disable-fallocate --disable-unshare \
                         --enable-arch=no --enable-ddate=no --disable-eject \
                         --disable-agetty --disable-cramfs --disable-switch_root \
                         --disable-pivot_root --enable-elvtune=no --disable-kill \
                         --enable-last=no --disable-utmpdump --enable-line=no \
                         --enable-mesg=no --enable-raw=no --disable-rename \
                         --enable-reset=no --enable-vipw=no --enable-newgrp=no \
                         --enable-chfn-chsh=no --disable-chsh-only-listed \
                         --disable-login --enable-login-chown-vcs=no \
                         --enable-login-stat-mail=no --disable-sulogin --disable-su \
                         --disable-schedutils --disable-wall --enable-write=no \
                         --enable-chkdupexe=no --enable-socket-activation=no \
                         --disable-pg-bell --disable-require-password \
                         --with-selinux=no --with-audit=no --without-udev \
                         --with-ncurses=no --with-slang=no --with-utempter=no \
                         CC=$(CROSS)gcc && \
                         ln --symbolic --force src libuuid/uuid)
        [ -d $(LINUXUTIL)/.libs ] || \
                make --jobs=$(CPU_NUMBER) --directory=$(LINUXUTIL)

imb ★★
()
Ответ на: комментарий от hateyoufeel

компилировать через qemu-user

Видимо, придётся так и сделать. В самом начале отмёл этот вариант из-за того, что тупить будет дико, но видимо, зря. Тогда я думал, что самые большие проблемы при кросс-компиляции будут решаться передачей нужных значений ac_cv_* в configure, ну или максимум патчами, которые что-то исправляют. Тут же не представляется исправляющего патча, потому что вообще непонятны изначальные идеи авторов libtool. Но раз уж многие успешно используют qemu, то пока что и я буду, придётся, правда, теперь всю систему сборки переписать.

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

В этом случае, правда, тоже возможны проблемы с кривыми configure-скриптами, которые любят проверять всё подряд в хостовой системе. Самый безгеморройный вариант - это сделать chroot/виртуалку с целевой системой и компилировать там.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Самый безгеморройный вариант - это сделать chroot/виртуалку с целевой системой и компилировать там.

Это в смысле эмулировать всю таргет-систему с помощью qemu-system? Это не так и безгеморройно, она должна уметь загружаться для этого.

Я планировал просто положить qemu-user в sysroot, сделать туда chroot и компилировать оттуда. С таким вариантом есть шанс утечки результатов каких-то проверок с хоста?

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

просто положить qemu-user в sysroot, сделать туда chroot и компилировать оттуда

Это разве будет работать?

С таким вариантом есть шанс утечки результатов каких-то проверок с хоста?

Бывает всякое. У многих программ configure пытается собрать какой-то код на C, который делает какую-то хрень, даже если --build и --target не совпадают. Perl приходит в голову в первую очередь. Плюс очень часто configure проверяет пути к библиотекам и т.п. и записывает из в какой-нибудь config.h. Если они потом не совпадут потом, будет не очень круто.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Это разве будет работать?

В смысле, а это разве надо делать как-то по-другому?

Ну вообще, насколько я представляю, qemu-user работает так, что я добавляю его в binfmt-misc, и у меня ядро начинает уметь запускать бинарники, собранные под arm. Если я положу бинарник qemu в sysroot по тому же пути, что и на хосте, и сделаю chroot в sysroot, то там всё запустится. Компилировать можно будет либо не-кросс-тулчейном, либо даже тем же самым кросс-тулчейном, если положить его по тому же самому пути. Или я что-то не так понимаю? Или есть какой-то другой вариант?

У многих программ configure пытается собрать какой-то код на C, который делает какую-то хрень, даже если --build и --target не совпадают.

Ну если компилировать в chroot так, как я описал, то хрень по идее должна запускаться и выдавать разумный результат.

Плюс очень часто configure проверяет пути к библиотекам и т.п. и записывает из в какой-нибудь config.h. Если они потом не совпадут потом, будет не очень круто.

Пути тоже там уже правильные, это же sysroot таргет-системы.

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

Неосилятор

В гнутом хламе как раз все элементарно, --host добавил и все нормально работает, даже либтул

annulen ★★★★★
()
Ответ на: комментарий от annulen

В гнутом хламе как раз все элементарно, --host добавил и все нормально работает, даже либтул

Если бы так было, этого треда бы не было. Прежде чем кричать про неосиляторство, прочитал бы лучше ОП с описанием конкретного бага libtool.

gentoo_root ★★★★★
() автор топика

Почему я не нахожу других людей, сталкивающихся с этой проблемой?

Наверное, потому что всем хватает busybox

annulen ★★★★★
()
Ответ на: комментарий от annulen

Наверное, потому что всем хватает busybox

Это объяснение звучит убедительно.

Мне, к сожалению, не хватило, по-моему, из-за того, что mount из busybox ведёт себя не так, как mount из util-linux. Когда systemd вызывал mount / -o remount, корень не перемонтировался в rw, если я использовал mount из busybox.

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

если systemd, тогда все ясно.

Ну я ожидал подобной реакции на ключевое слово "systemd" :D

Вот только в том, что mount из busybox ведёт себя несовместимо с mount из util-linux, виноват не systemd, да и кто бы ни был виноват, приходится-таки юзать util-linux.

gentoo_root ★★★★★
() автор топика

А как вы кросс-компилируете

По ночам, когда мамка не видит, глядя на скриншоты голой генты.

Alve ★★★★★
()
Ответ на: Мимопроходил от SysVinit-hater

Посмотри на proot ещё.

О, спасибо, выглядит очень круто! Не знал про такую программу, и мне нравится, что она работает через ptrace, а не через костыли с LD_PRELOAD.

gentoo_root ★★★★★
() автор топика
Ответ на: Мимопроходил от SysVinit-hater

блин, где ж ты был все эти годы ))

выглядит действительно вкусно, пасиб за proot, заценю

asavah
()

В Gentoo есть crossdev, попробуй собрать им, если удастся — смотри, что и как вызывалось

XMs ★★★★★
()
Ответ на: комментарий от SysVinit-hater

Вангую

если что и будет тормозить, так это qemu-user, а ptrace даст пренебрежимо малую добавку к этим тормозам.

SysVinit-hater
()
Ответ на: комментарий от SysVinit-hater

производительность мне пофигу в данном случае,
cross-сборка моей поделки (наколенная недо-ось для малины) у меня уже давно отлажена, тараканы отловлены, патчи проверены, proot хочу пощупать как замену полноценного chroot для выставления прав и пр. требухи помелочи, возможно упростит всю петрушку, пока не щупал

asavah
()
Ответ на: комментарий от Dark_SavanT

Может таки потому что надо mount / -oremount,rw ?

Не надо.

systemd делает mount / -o remount, и mount из util-linux берёт опции монтирования из /etc/fstab.

Если бы systemd явно делал -o remount,rw, то у меня не было бы способа сделать корень read-only. Кроме того, кроме этой опции есть ещё множество, которые могут быть прописаны в fstab, но не прописаны в параметр командной строки ядра rootflags=.

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.