Следующая страница Предыдущая страница Содержание

5. Перенос, компиляция и получение программ

-------------------------------------------------------------------------------

5.1 Как компилировать программы?

Большинство программного обеспечения Linux написано на С и откомпилировано GNU компилятором С. GCC является частью всех дистрибутивов Linux. Последняя версия компилятора С, документация и патчи находятся на ftp://ftp.gnu.org/pub/gnu/.

Программы, написанные на С++, должны быть откомпилированы GNU компилятором G++, который также включён в дистрибутивы Linux и доступен там же, где и GCC.

Чтобы создать версии ядра 2.0.x, вам понадобится GCC версии 2.7.2.х. Попытка создать ядро Linux другим компилятором, таким как GCC 2.8.x, EGCS или PGCC, может вызвать проблемы, зависящие от кода компиляторов 2.7.2.х.

Информация о компиляторе EGCS доступна на http://egcs.cygnus.com.

Помните, что сейчас разработчики ядра не занимаются багами в ядрах версий  2.0.х, а вместо этого сосредоточены на разработке ядра версий 2.1.х.

[J.H.M. Dassen]

-------------------------------------------------------------------------------

5.2 Как я могу перенести с другой платформы приложение XXX под Linux?

В основном, Unix-программам нужна очень небольшая доработка. Просто следуйте инструкциям по установке. Если вы чего-то не знаете - и не знаете, как это выяснить, - то для того, чтобы ответить на вопросы, возникающие во время процесса установки, вы можете догадаться сами, но это может вызвать ошибки при работе программы. В этом случае вам наверняка лучше попросить кого-нибудь другого осуществить перенос программы на платформу Linux.

Если у вас есть BSD-шные программы, попытайтесь использовать -I/usr/include/bsd и -lbsd в соответствующих участках кода компилируемой программы.

-------------------------------------------------------------------------------

5.3 Что такое ld.so и где мне его взять?

Ld.so представляет собой загрузчик динамических библиотек. Каждый исполняемый файл, использующий совместно используемые библиотеки, должен содержать 3 Кб начального машинного кода, чтобы найти и загрузить совместно используемые библиотеки. Сейчас этот код помещён в специальную библиотеку - /lib/ld.so - где все программы могут его найти, поэтому используют меньше дискового пространства и могут быть легко обновлены.

Ld.so можно взять на tsx-11.mit.edu/pub/linux/packages/GCC/ и зеркалах сайта. Название последней на данный момент версии пишется как ld.so.1.9.5.tar.gz.

/lib/ld-linux.so.1 - аналог для ELF ("А как насчёт ELF?") и поставляется в таких же пакетах, что и загрузчик a.out.

-------------------------------------------------------------------------------

5.4 Как мне обновить библиотеки безопасно для системы?

Примечание: У вас всегда должен быть набор аварийных дискет при выполнении этой процедуры на случай, если что-то пойдёт не так!

Эта процедура особенно трудна, если вы обновляете очень старые библиотеки типа libc4. Но вам необходимо сохранить в системе библиотеки libc4 вместе с libc5 для программ, всё ещё их использующих. То же самое справедливо и для обновления библиотек libc5 до более новых glibc2.

Проблема обновления динамических библиотек состоит в том, что в то время как вы удаляете старые библиотеки, приложения, которые вы хотите обновить новыми версиями библиотек, не работают. Есть несколько путей борьбы с этим явлением. Первый - временно сохранить запасные копии библиотек программ этапа исполнения, которые находятся в /lib/, /usr/lib/, /usr/local/lib/ или в другой директории из списка, указанного в файле /etc/ld.so.conf.

Например, когда обновляются библиотеки libc5, файлы в /lib/ могут выглядеть так:


libc.so.5

libc.so.5.4.33

libm.so.5

libm.so.5.0.9

Существуют библиотеки С и математические библиотеки. Скопируйте их в другую директорию из списка, указанного в /etc/ld.so.conf, типа /usr/lib/.


cp -df /lib/libc.so.5* /usr/lib/

cp -df /lib/libm.so.5* /usr/lib/

ldconfig

Убедитесь, что вы запустили ldconfig, чтобы обновить конфигурацию библиотек.

Файлы libc.so.5 и libm.so.5 являются символическими ссылками на действительными файлами библиотек. После обновления новые ссылки не будут созданы до тех пор, пока остаются старые ссылки и вы не используете cp с опцией -f. Команда cp с опцией -d скопирует только символическую ссылку, а не сам файл.

Если вам необходимо перезаписать непосредственную ссылку на библиотекой, используйте ln с опцией -f.

Например, чтобы скопировать новые библиотеки поверх старых, попробуйте следующее. Сначала создайте символические ссылки с новыми библиотеками, затем скопируйте библиотеки и ссылки в /lib/ при помощи следующих команд:


ln -sf ./libm.so.5.0.48 libm.so.5

ln -sf ./libc.so.5.0.48 libc.so.5

cp -df libm.so.5* /lib

cp -df libc.so.5* /lib

И опять же, не забудьте запустить ldconfig после копирования библиотек.

Если вы убедились в том, что всё работает нормально, можете удалить временные копии старых библиотек из /usr/lib/ или оттуда, куда вы их скопировали.

-------------------------------------------------------------------------------

5.5 Есть у кого-нибудь перенесенные  с других платформ / откомпилированные / написанные приложения для Linux?

Сперва просмотрите карту программного обеспечения Linux - она находится на sunsite.unc.edu/pub/Linux/docs/linux-software-map и на других сайтах FTP. Поисковый сервер в World Wide Web доступен на http://www.boutell.com/lsm/.

Проверьте сайты FTP ("Где я могу найти дистрибутив Linux через FTP?") - ищите файлы ls-lR или INDEX с нужными строками.

Также просмотрите карту проектов Linux - ftp.ix.de/pub/ix/Linux/docs/Projects-Map.gz.

Есть поисковый сервер для FTP-архивов Linux на http://lfw.linuxhq.com/.

Проверьте веб-сайт Freshmeat http://www.freshmeat.org, который действительно неплохой ("Какие есть онлайновые/бесплатные периодические издания о Linux?").

Если вы ничего не нашли, вы можете скачать исходники программ и откомпилировать их. Смотрите "Как я могу перенести с другой платформы приложение XXX под Linux?". Если это большой пакет программ, требующий некоторой доработки для Linux, отправьте сообщение на comp.os.linux.development.apps.

Если вы откомпилировали солидную программу, пожалуйста закачайте её на один или более сайтов FTP и отправьте сообщение на comp.os.linux.announce (linux-announce@news.ornl.gov).

Если вы ищите прикладную программу, есть шанс, что кто-то уже написал бесплатную версию. FAQ на comp.sources.wanted содержат советы по поиску исходников кода.

-------------------------------------------------------------------------------

5.6 Могу ли я использовать на моём 386 программу или компилятор, откомпилированные для 486?

Да, за исключением ядра.

Компонент -m486 в GCC, который используется для компиляции двоичных файлов для машин х486, изменяет параметры оптимизации. При этом двоичные файлы получаются немного больше и до некоторой степени быстрее запускаются на 486. Они продолжают устойчиво работать и на 386 однако немного уступают в производительности.

Тем не менее, начиная с версии 1.3.35, ядро использует характерные команды 486 или Pentium, если оно сконфигурировано для процессора 486 или Pentium, что делает невозможным его использование на 386.

GCC может быть сконфигурирован для 386 или 486; единственное различие состоит в том, что конфигурирование для 386 делает -m386 компонентом по умолчанию, а конфигурирование для 486 делает -m486 компонентом по умолчанию. В любом случае они могут быть перекрыты производным классом виртуальных функций базового класса при каждой компиляции или редактированием файла /usr/lib/gcc-lib/i*-linux/n.n.n/specs.

Существует альфа-версия GCC, которая может осуществлять оптимизацию для 586, но это довольно ненадёжно, особенно при повышенных настройках оптимизации. Pentium GCC может быть найден на tsx-11.mit.edu в директории /pub/linux/ALPHA/pentium-gcc. Я бы посоветовал использовать обыкновенный 486 GCC; к слову сказать, используя -m386, двоичный код получается лучше для Pentuim или, по крайней мере, немного меньше.

-------------------------------------------------------------------------------

5.7 Что делает GCC -O6?

В настоящее время то же самое, что и -O2 (GCC 2.5) или -O3 (GCC 2.6, 2.7). Любая версия с более старшим номером функционирует  точно так же. Makefiles более нового ядра использует -О2 и вы получите то же самое.

-------------------------------------------------------------------------------

5.8 Где находятся linux/*.h и asm/*.h?

Файлы /usr/include/linux/ и /usr/include/asm/ часто являются ссылками на директории, где находятся заголовки ядра. Обычно они находятся в /usr/src/kernel*/.

Если у вас нет исходников ядра, скачайте их - смотрите "Как мне обновить/перекомпилировать ядро?".

Затем используйте rm, чтобы удалить весь мусор, и ln, чтобы создать ссылки:


rm -rf /usr/include/linux /usr/include/asm

ln -sf /usr/src/linux/include/linux /usr/include/linux

ln -sf /usr/src/linux/include/asm /usr/include/asm

/usr/src/linux/include/asm/ является символической ссылкой на структурированную директорию asm - если у вас есть только что распакованный исходник ядра в виде дерева, вы должны создать символические ссылки. Вы также обнаружите, что вам может понадобится выполнить 'make config' в только что распакованном дереве исходников ядра, чтобы создать linux/autoconf.h.

-------------------------------------------------------------------------------

5.9 У меня возникли ошибки при попытке откомпилировать ядро.

Смотрите предыдущий вопрос, касающийся заголовочных файлов.

Remember that when you apply a patch to the kernel, you must use the -p0 or -p1 option: otherwise, the patch may be misapplied. See the patch manual page for details.

``ld: unrecognized option `-qmagic''' means that you should get a newer linker, from ftp://tsx-11.mit.edu/pub/linux/packages/GCC/, in the file binutils-2.8.1.0.1.bin.tar.gz.

-------------------------------------------------------------------------------

5.10 Как мне создать совместно используемую библиотеку?

Для ELF,


   gcc -fPIC -c *.c

   gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o

Для a.out, скачайте пакет программ tools-n.nn.tar.gz с сайта tsx-11.mit.edu из директории /pub/linux/packages/GCC/src/. Он поставляется вместе с документацией, которая расскажет вам что делать. Запомните, что совместно используемые библиотеки под a.out являются очень сложным механизмом. Рассмотрите вопрос обновления ваших библиотек до ELF. Прочтите документ ELF HOWTO наt sunsite.unc.edu/pub/Linux/docs/HOWTO/.

-------------------------------------------------------------------------------

5.11 Мои исполняемые файлы имеют (очень) большой размер.

Используя компилятор ELF ("Как насчёт ELF?"), наиболее общей причиной большого размера исполняемых файлов является отсутствие соответствующей ссылки .so на одну из используемых вами библиотек. Это должна быть ссылка типа libc.so для каждой библиотеки libc.so.5.2.18.

Используя компилятор a.out, наиболее частой причиной является флаг -g компоновщика (компилятора). При этом производится (так же, как и отлаживаемые данных в выходном файле) статически связанная программа - она содержит в своём коде копию библиотеки С, вместо динамически подключаемой копии.

Другие причины, которые стоит изучить - это опции -O и -O2, активизирующие оптимизацию (см. документацию GCC), и -s (или команда strip), "выдирающая" символьную информацию из получаемого двоичного файла (делающая процесс отладки практически невозможной).

Вы можете попробовать использовать опцию -N для очень маленьких исполняемых файлов (меньше 8 Кб с использованием  -N), но вы не должны делать этого до тех пор, пока не разберётесь с её влиянием на производительность, и не никогда применяйте её для демонов.

-------------------------------------------------------------------------------

5.12 Поддерживает ли Linux потоки или облегчённые процессы?

Так же как и в Unix мультипроцессорная модель, включающая в себя перетяжелённые процессы, которые являются неотъемлемой частью стандартного ядра Linux, имеет различные виды реализации облегчённых процессов или потоков. Последние версии ядра реализовывают потоковую модель - kthreads. Вдобавок ко всему, ещё существуют дополнительные пакеты, применимые для Linux:

По вопросам получения более подробной информации обращайтесь, пожалуйста, к авторам пакетов.

-------------------------------------------------------------------------------

5.13 Где я могу найти 'lint' для Linux?

Грубый эквивалент функциональных возможностей встроен в GCC. Используйте опцию -Wall для включения большинства полезных дополнительных предупреждений. Для более детальной информации смотрите руководство GCC (введите control-h следом после i в Emacs и выберите пункт GCC).

Есть свободно распространяемая программа, называемая 'lclint', которая обладает большинством возможностей lint. Анонс и исходники доступны на larch.lcs.mit.edu в директории /pub/Larch/lclint/; в World Wide Web ищите на http://larch-www.lcs.mit.edu:8001/larch/lclint.html.

-------------------------------------------------------------------------------

5.14 Где я могу найти kermit для Linux?

Kermit распространяется под авторскими правами non-GPL, что делает сроки её распространения несколько отличными от оригинала GPL. Исходники и некоторые двоичные файлы доступны на kermit.columbia.edu.

В WWW домашняя страница проекта Columbia University Kermit находится на http://www.columbia.edu/kermit/.


Следующая страница Предыдущая страница Содержание