\documentclass{article}
\usepackage{url, html, hyperref}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[russian]{babel}
% Title
\title{Устранение проблем компиляции в Borland Kylix 3 при glibc 2.3.2}
\author{Сердцев А.А. (\url{mailto:stolia@mail.ru})}
\date{2004.03.16}
\pagestyle{headings}
\makeindex
\begin{document}
\maketitle
\abstract{В статье описывается как устранить проблемы
компиляции в среде Borland Kylix 3 при glibc 2.3.2.}
\section{Проблема}
Ошибки, возникающие при компиляции проектов в Kylix 3,
связаны с тем, что он настроен на работу с библиотекой
glibc версии 2.1.2.
А сейчас, на дистрибутивах устанавливаются новые версии
этой библиотеки, которые уже не имеют обратной
совместимости со своими старыми версиями (по крайней
мере могу утверждать про glibc 2.3.2). Главным
различием между 2.1.2 и 2.3.2 является способ запуска
программ, вернее передачи управления функции main
(для этого при сборке программы прицепляется
объектный файл crt1.o).
В 2.3.2 для передачи управления используются так называемые
функции init/fini, которые задаются линковщиком!
А вот о них то, как раз, и не знает борландовский
<<связник>>.
Предлагается два пути решения:
\begin{enumerate}
\item
Настроить Kylix под пакет compat-glibc-6.2-2.1.3.2, под который
Kylix и создавалась.
\item
Пропатчить Kylix для
работы с glibc 2.3.
\end{enumerate}
Оба способа выдуманы не мной,
поэтому отправляю к оригиналам: первый~---
\url{http://www.linuxquestions.org/questions/archive/9/2003/08/3/42518},
второй~--- \url{http://www.kylix-patch.de.vu/}.
Советую применять второй способ для устранения проблемы,
т.к. он не только подстраивает Kylix под glibc 2.3, что
даёт больше возможностей программисту, но и
исправляет некоторые баги.
Неважно какой вы способ выбрали, сперва нужно
перебраться на ядро 2.4.21 или выше (как с ядрами
из ветки 2.6 я не в курсе). Если этого не сделать
происходит зависание Kylix при вызовах диалогов open/save
(если это произошло, то нужно правильно убивать,
иначе комп повиснет; убиение происходит по схеме~---
от потомков к родителям). А при закрытии Kylix компьютер
точно повиснет (и не важно каков ваш статус в системе
и приоритетность выполнения задачи).
\section{Решение. Способ N1}
Итак, первый вариант:
\begin{enumerate}
\item
Установка compat-glibc 2.1. Именно эту версию и будем
использовать для компиляции проектов Kylix.
Подойдет пакет compat-glibc-6.2-2.1.3.2.rpm
из Redhat 7.2, или, откуда я взял, compat-glibc-6.2-2.1.3.2.0.asp.i386.rpm
из ASPLinux 7.2. Файлы пакета, после установки, должны быть
в директории /usr/i386-glibc21-linux, так что они ни
как не повлияют на работу gcc и на загрузку so-файлов.
\item
Установка Kylix 3:
\texttt{[root]\$ sh setup.sh -m}
Далее идёт регистрация лицензии, если, конечно,
она есть в наличии. Нет~--- найди.
\item
Запусти Kylix и закрой все проекты (File->Close All). Это
нужно для того, чтобы настроить опции по умолчанию.
Затем, открой окно настройки опций (Project->Options), вкладку
Directories/Conditionals и замени в Include path
/usr/include на /usr/i386-glibc21-linux/include
и в Library path /usr/lib на /usr/i386-glibc21-linux/lib
\item
Для того что бы заголовочные файлы Kylix ссылались
на /usr/i386-glibc21-linux/include, а не на
/usr/include нужно в директории K3\_HOME/include
подправить файлы \_defs.h and defs.h следующим образом:
заменить строки
\texttt{\#define \_STD\_HEADER\_(\_\_a) }
на
\texttt{\#define \_STD\_HEADER\_(\_\_a) }
\item
Проделанных шагов уже хватит, что бы собрать проект,
но на некоторых системах при запуске скомпилированного
приложения из IDE Kylix
происходит зависание оболочки (как правило,
эта проблема исчезает, когда переползаешь на
новое ядро).
Для решения этой проблемы при запуске Kylix нужно задать перременную
LD\_ASSUME\_KERNEL=2.2.5:
\texttt{[user]\$ export LD\_ASSUME\_KERNEL=2.2.5; startbcb}
\end{enumerate}
Вот и всё, что касается первого способа.
\section{Решение. Способ N2}
Второй способ очень прост. Просто, нужно зайти на
\url{http://www.kylix-patch.de.vu/} и скачать
патчи. Там их несколько и все их желательно применить.
Далее следуйте по инструкции установки, ничего сложного и
ставятся они без проблем.
Главный патч, который нам нужен,
обозван как k3fix.tar.gz. Но, при установке, он
меняет карту символов. Для
устранения этого неудобства просто удалите
в домашней директории файл .Xmodmap:
\texttt{[user]\$ rm $\sim$/.Xmodmap}
Вот и всё, должно работать и прописывать переменною
LD\_ASSUME\_KERNEL=2.2.5 не требуется. Пользуйтесь.
\section{Решение. Резервный вариант}
Есть еще и третий способ, который проделал я,
путём проб и ошибок. Это я уже потом обнаружил
второй способ, так что можно сказать, что сейчас он
не актуален.
Мой способ является чем-то средним между
первым и вторым~--- используется библиотека
glibc 2.3.2,
но её нужно собирать, и, соответственно, установленная на
системе glibc
не используется. И для этого способа нужно собрать ядро выше 2.4.20.
Немного опишу его, на тот случай, если
патч не подойдёт для установленной glibc, например
выйдет более новая версия glibc.
Лень писать всё (да кому это собственно надо), поэтому,
повествую на идейном уровне.
Главное это собрать glibc. Но прежде чем её компилять
нужно немного подправить исходники: в configure добавить
строку libc\_cv\_initfinit\_array=no (строка 4830, проверка поддержки
.preinit\_array/.init\_array/.fini\_array), тем самым отказываемся
от использования функций init/fini в компилируемой glibc,
что, собственно, и не устраивало борландовский линковщик.
Но у меня возникли дополнительные проблемы с этим же линковщиком~---
он отказывался находить функцию \_nl\_archive\_subfreeres, хотя
она и была определена в готовом файле libc.a (чужая душа~--- потёмки).
Для решения этой проблемы я перенёс функцию \_nl\_archive\_subfreeres
из файла loacale/loadarchive.c в файл locale/setlocale.c
(в loacale/loadarchive.c эту функцию закоментарил). Тогда всё удалось.
Далее идет сборка. Собирать glibc нужно как обычно,
но директорию установки нужно указать иную, чем по умолчанию
(опция \mbox{--{}--prefix}, например,
\mbox{--{}--prefix=/usr/local/glibc-2.3.2-for-kylix3})~---
зачем нужны лишние проблемы. Затем идут шаги идентичные в способе N1
при настройки Kylix под нужную glibc (см. выше). Всё должно заработать.
Предложенный способ является тернистым, но то же имеет право
на существование: Х\_йня война~--- главное манёвры.
\section{.PS}
Описанные мною действия восстановлены по памяти.
Поэтому, может быть я что-то и упустил, но это возможно
только в плане мелочей.
Надеюсь эта статья вам помогла. Удачи!
Сердцев А.А. (stolia@mail.ru)
\end{document}