Сборка под 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 сборка доходит почти до конца, прекращаясь следующим образом:

make[2]: Вход в каталог `/usr/src/e2fsprogs-1.41.9/misc'
  CC util.c
util.c: In function 'check_plausibility':
util.c:83: error: storage size of 's' isn't known
make[2]: *** [util.o] Ошибка 1
make[1]: *** [all-progs-recursive] Ошибка 1
make: *** [all] Ошибка 2

Строки 83-85 этого файлы выглядят так:

	struct stat64 s;

	val = stat64(device, &s);

То есть, происходит объявление переменной 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, то создал условное исключение:

#ifndef __UCLIBC__
 #include <linux/types.h>
#endif

После чего всё прекрасно собралось, проинсталлировалось и даже заработало... кроме uuidgen, который стабильно оставлял core. Собирать с дебаггером и выяснять, где происходит косяк, я не стал -- всё равно не умею отправлять багрепорты :-( Поэтому я сделал так: просто make clean, переконфигурация обратно под dietlibc, make. Потом

user# cd util
user# make uuidgen; strip ./uuidgen

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

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".