Сборка под x86_64-uClibc-static: продолжаются танцы с бубном
Итак, экспериментальное последовательное переползание на 64 бита продолжается.
На днях решил перевести на 64 бита архиваторы. bzip2, zip/unzip собрались и установились без проблем. Не желал собираться tar. Про константы O_BINARY, S_IXUGO, S_IRWXUGO и прочие знает только glibc, в uClibc их нету. Они определены в инклюде sys/stat.h.
Со всем ГНУтым софтом идёт «кодотека» gnulib (не буду здесь рассказывать, для чего она нужна), и в моём случае скрипты Makefile неправильно работают со сгенерированными кусками её кода. В частности, скрипт «думает», что раз gnulib была вынуждена сгенерировать свой собственный sys/stat.h, то значит его в системе не существует. А он есть (с) Но препроцессор почему-то всё время подключает «системный» sys/stat.h, то есть тот, что идёт вместе с uClibc. В котором нету констант, означенных выше. Поэтому сборка останавливалась с ошибками линковки типа «Undefined reference...»
Пришлось в некоторые файлы вписать следующее:
#ifndef S_IRWXUGO #include "../lib/sys/stat.h" #endif
Сборка продолжилась, но на этом сюрпризы не закончились. Оказывается, gnulib сгенерировала собственные определения PROGRAM_INVOCATION_NAME и PROGRAM_SHORT_INVOCATION_NAME, из-за которых, конечно же, обламывалась линковка. Возможно, что с динамической uClibc всё собралось бы без проблем. Правильнее было бы скомпоновать tar.o вручную в два этапа, сначала со сгенерированной $(SRCDIR)/lib/libtar.a, затем уже получить желаемый tar. Но меня уже харило, просто поудалял #define и перегенерировал libtar.a. Тогда всё собралось и безошибочно прошло тесты. make install.
Ещё хуже дела были с gzip-1.3.13. Ко всех описаным выше проблемам ещё configure-скрипт gnulib'а сказал: «Мужик, а функции fprintf и vfprintf у тебя не кошерные, неПОСИКСные тобишь! Дай-ка я их своими подменю.» Я удивился: это в uClibc-то неПОСИКСные? Да не может быть! Но вобщем gzip после обработки некоторых частей скриптов кувалдой и напильником, всё-таки собрал. Потом я узнал, что уже вышел gzip-1.4, где устранён некоторый страшный баг, из-за которого gzip валится в корку, причём проявляется он как раз на x86_64-системах. Но пересобирать не стал, думаю, как-нибудь переживу.
Вопрос: кто имеет опыт сборки со статической uClibc-x86_64? Это у меня одного такие грабли, или они проявляются всегда?
ЗЫ. coreutils-8.4 с сабжем так и не собрались, пришлось собрать busybox. Ничего, скоро избавлюсь от последних необходимых 32-битных программ (e2fsprogs, util-linux, fdisk, login, m*getty), соберу нормальную glibc.
- Для комментирования войдите или зарегистрируйтесь
e2fsprogs-1.41.9 не захотели собираться под uClibc
С e2fsprogs вообще непонятно что делать, а читерствовать (то есть скачать прекомпилированные исполняемые файлы) я принципиально не желаю. Ни с uClibc, ни с dietlibc их собрать пока не удалось, хотя поддержка собираемости под dietlibc заявлена прямым текстом. И даже опция в конфигурялке есть: --with-diet-libc.
Собственно, под dietlibc сборка доходит почти до конца, прекращаясь следующим образом:
Строки 83-85 этого файлы выглядят так:
То есть, происходит объявление переменной s типа struct stat64 БЕЗ ИНИЦИАЛИЗАЦИИ, в результате размер самой структуры неизвестен. А автор dietlibc говорит прямым текстом, что его библиотека не содержит автоматических инициализаторов, чтобы минимизировать количество кода. Поэтому данный фрагмент ВПРИНЦИПЕ не может быть собран с dietlibc!
С uClibc всё ещё печальнее: сборка прерывается ещё раньше из-за переопределения «встроенных» типов __s8, __u8, __s16, __u16, __s32, __u32, __s64, __u64. Закомментировать в соответствующем инклюде объявление этих типов можно, но это не помогает, сборка всё равно прерывается с ещё более непонятными ошибками.
Вряд ли это так и должно быть. Раз задекларирована совместимость с dietlibc, то и собираться всё должно с dietlibc, так что код, скорее всего, должен быть пофиксен. Но кто бы могог мне сделать багрепорт, по-аглицки изъясняться не умею, токмо читаю :-(
the Aquihost Rigorous Builder
я так и не понял цели этого
я так и не понял цели этого квеста.
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Цель любого квеста - его прохождение, получение экспы и LevelUp!
И я многое узнал, когда немного разобрался в базовых компонентах Линукса. Даже в планах есть желание перейти с init на cinit либо runit.
the Aquihost Rigorous Builder
SOLVED! e2fsprogs таки собрались, ура!
Скаал самый послежний снапшот, наивно полагая, что там как-то пофиксили проблемы с собираемостью. Фиг там. С dietlibc по-прежнему компиляция останавливается на том же самом месте: не хочет собирать misc/util.c. Потом пробую с uClibc. Опять та же ошибка с переопределением встроенных целочисленных типов разной разрядности, но компиляция идёт немного дальше, запинаясь на файле filefrag.c. Начал отслеживать инклюды, дошёл до lib/ext2fs/fiemap.h, который, сопсна, и включал
. И чуть ниже переопределял типы от __s8 и до __u64. Причём, ни filefrag.c, ни какой-либо другой сопутствующий код не использует linux-специфичных типов переменных. Тогда я решил просто исключить соответствующую строчку из fiemap.h. Но поскольку я не знаю и не могу знать, как её наличие или отсуствие влияет на собираемость с другими *libc, то создал условное исключение:
После чего всё прекрасно собралось, проинсталлировалось и даже заработало... кроме uuidgen, который стабильно оставлял core. Собирать с дебаггером и выяснять, где происходит косяк, я не стал -- всё равно не умею отправлять багрепорты :-( Поэтому я сделал так: просто make clean, переконфигурация обратно под dietlibc, make. Потом
uuidgen собрался и работал. Переместил я его в /bin вместо его кривого брата-близнеца, на этом работа с e2fsprogs была завершена.
После этой маленькой победы были без серьёзных проблем собраны все «штатные» интерпретаторы: sed (провалил 1 тест), libsigsegv (прошло все тесты), gawk (6 тестов провалено), bison-2.4 (17 тестов провалено), flex (7 тестов провалено).
Дальше решил собрать procps-3.2.8. Сборка до конца не проходит (буду разбираться), а то, что собралось, работает неправильно. В частности, w показывает, что в системе залогинено 0 пользователей. Где-то читал, что на 64-битных системах формат файлов /var/run/utmp и /var/run/wtmp немного отличается от того, что на 32-битных системах, и говорят, что в предпоследнем снапшоте uClibc уже есть фикс и work-around. Буду разбираться дальше.
the Aquihost Rigorous Builder