perlsolaris
СОДЕРЖАНИЕ
- ИМЯ
- ОПИСАНИЕ
- РЕСУРСЫ
- НАСТРОЙКА
- ЗАПУСК CONFIGURE.
- ПРОБЛЕМЫ С MAKE.
- ТЕСТ MAKE
- КРОСС-КОМПИЛЯЦИЯ
- ПРЕКОМПИЛИРОВАННЫЕ БИНАРИ ДЛЯ PERL НА SOLARIS.
- ПРОБЛЕМЫ ПРИ РАБОТЕ PERL НА SOLARIS.
- СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS МОДУЛИ.
- ПРОБЛЕМЫ С МОДУЛЯМИ СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
- SunOS 4.x
- АВТОР
ИМЯ
perlsolaris - Perl версия 5 на системах Solaris
ОПИСАНИЕ
Этот документ описывает различные особенности операционной системы Sun Solaris, которые повлияют на компиляцию и/или выполнение Perl версии 5 (далее просто perl). Также обсуждаются некоторые проблемы, связанные со старой SunOS 4.x, хотя они могут быть устаревшими.
В основном, всё должно работать.
Начиная с Solaris 8, perl5.00503 (или выше) поставляется с операционной системой, поэтому вам может даже не понадобиться создавать новую версию perl. Поставленная Sun версия установлена в /usr/perl5 с /usr/bin/perl, указывающим на /usr/perl5/bin/perl. Не трогайте эту установку, если вы не знаете, что делаете. Если вы удалите perl, который поставляется с ОС, некоторые части вашей системы станут неработоспособными. Если вы хотите установить более новую версию perl, установите её с другим префиксом, отличным от /usr/perl5. Общими префиксами являются /usr/local и /opt/perl.
Вы можете поместить вашу версию perl в PATH всех пользователей, изменив ссылку /usr/bin/perl. Это, вероятно, нормально, так как большинство скриптов perl, поставляемых с Solaris, используют явный путь. (Существуют некоторые исключения, такие как /usr/bin/rpm2cpio и /etc/rcm/scripts/README, но они также достаточно универсальны, что фактическая версия perl, вероятно, не имеет большого значения.)
Solaris поставляется с набором модулей, специфичных для Solaris. Если вы решите установить свою собственную версию perl, вы найдёте исходный код многих из этих модулей на CPAN в пространстве имён Sun::Solaris::.
Solaris может включать две версии perl, например, Solaris 9 включает как 5.005_03, так и 5.6.1. Это для обеспечения стабильности через релизы Solaris в случаях, когда более поздняя версия perl имеет несовместимости с версией, включённой в предыдущую версию Solaris. По умолчанию всегда будет использоваться самая последняя версия perl, и, как правило, старая версия будет сохраняться только для одного релиза Solaris. Обратите также внимание, что по умолчанию perl НЕ будет настроен для поиска модулей в более старой версии, опять же из-за проблем с совместимостью/стабильностью. Вследствие этого, если вы обновите Solaris, вам придётся пересобрать/переустановить любые дополнительные модули CPAN, которые вы установили для предыдущей версии Solaris. См. страницу справки CPAN по «autobundle» для быстрого способа сделать это.
В качестве временной меры вы можете либо изменить строку #! в своих скриптах, чтобы она конкретно указывала на старую версию perl, например, в Solaris 9 используйте #!/usr/perl5/5.00503/bin/perl, чтобы использовать версию perl, которая была по умолчанию для Solaris 8, или, если у вас много скриптов, может быть удобнее сделать старую версию perl по умолчанию в вашей системе. Вы можете сделать это, изменив соответствующие ссылки под /usr/perl5 следующим образом (пример для Solaris 9):
В обоих случаях это следует рассматривать только как временную меру — вы должны перейти к более поздней версии perl как можно скорее.
Обратите также внимание, что утилиты perl командной строки (например, perldoc) и любые, добавленные модулями, которые вы устанавливаете, будут находиться в /usr/perl5/bin, поэтому этот каталог следует добавить в ваш PATH.
Номера версий Solaris.
Для соответствия общепринятому использованию, скрипт Configure perl выполняет некоторые незначительные преобразования имени операционной системы и номера версии, как сообщается командой uname. Вот частичная таблица преобразования:
Полную таблицу можно найти в FAQ Sun Managers ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq в разделе "9.1) Какие модели Sun запускают какие версии SunOS?".
РЕСУРСЫ
Существует множество источников информации о Solaris. Вот некоторые важные из них для perl:
- FAQ по Solaris
-
FAQ по Solaris доступен по адресу http://www.science.uva.nl/pub/solaris/solaris2.html.
FAQ Sun Managers доступен по адресу ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq
- Прекомпилированные бинарники
-
Прекомпилированные бинарники, ссылки на многие сайты и многое другое доступны по адресам http://www.sunfreeware.com/ и http://www.blastwave.org/.
- Документация по Solaris
-
Вся документация по Solaris доступна онлайн по адресу http://docs.sun.com/.
НАСТРОЙКА
Проблемы с извлечением файлов на Solaris.
Убедитесь, что вы используете программу tar, скомпилированную под Solaris (а не SunOS 4.x), для извлечения файла perl-5.x.x.tar.gz. Не используйте GNU tar, скомпилированный для SunOS4 на Solaris. (GNU tar, скомпилированный для Solaris, должен быть в порядке). При запуске бинарников SunOS4 на Solaris, система выполнения волшебным образом изменяет имена путей, соответствующие m#lib/locale#, так что когда tar пытается создать lib/locale.pm, вместо этого создаётся файл с именем lib/oldlocale.pm. Если вы нашли это сообщение слишком поздно и всё-таки использовали скомпилированный под SunOS4 tar, вы должны найти неправильно переименованный файл и переместить его обратно в lib/locale.pm.
Компилятор и связанные инструменты на Solaris.
Для построения perl необходимо использовать компилятор ANSI C. Perl можно скомпилировать либо с помощью дополнительного компилятора C Sun, либо с помощью gcc. Компилятор C, поставляемый с SunOS4, не подойдёт.
Включить /usr/ccs/bin/ в ваш PATH.
Некоторые инструменты, необходимые для построения perl, находятся в /usr/ccs/bin/: ar, as, ld и make. Убедитесь, что /usr/ccs/bin/ находится в вашем PATH.
Во всех выпущенных версиях Solaris (8, 9 и 10) необходимо убедиться, что установлены следующие пакеты (эта информация взята из FAQ по Solaris):
для инструментов (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool, SUNWsprot, SUNWtoo
для библиотек и заголовков: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh, SUNWcg6h, SUNWxwinc
Кроме того, в Solaris 8 и 9 также нужны:
для 64-битного разработки: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux, SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx
И только в Solaris 8 также нужны:
для библиотек и заголовков: SUNWolinc
Если вы сомневаетесь, какой пакет содержит отсутствующий файл, попробуйте найти установку, в которой этот файл есть. Затем выполните
Это отобразит строку, подобную этой:
/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
Последний элемент (SUNWhea в этом примере) — это необходимый пакет.
Избегать /usr/ucb/cc.
Вам не нужно иметь /usr/ucb/ в вашем PATH для построения perl. Если вы всё равно хотите /usr/ucb/ в вашем PATH, убедитесь, что /usr/ucb/ НЕ находится в вашем PATH перед каталогом, содержащим правильный компилятор C.
Компилятор C Sun
Если вы используете компилятор C Sun, убедитесь, что правильный каталог (обычно /opt/SUNWspro/bin/) находится в вашем PATH (перед /usr/ucb/).
GCC
Если вы используете gcc, убедитесь, что ваша установка актуальна и полна. Версии perl с 5.6.0 успешно строятся с gcc > 2.8.1 на Solaris >= 2.6.
Вы должны настроить perl с
```Если вы обновили свою версию Solaris, вам также может потребоваться обновить gcc. Например, если вы используете Solaris 2.6, а ваш gcc установлен в /usr/local, проверьте /usr/local/lib/gcc-lib и убедитесь, что у вас есть соответствующий каталог, sparc-sun-solaris2.6/ или i386-pc-solaris2.6/. Если каталог gcc предназначен для другой версии Solaris, чем та, которую вы используете, вам потребуется перестроить gcc для вашей новой версии Solaris.
Вы можете получить предварительно скомпилированную версию gcc с http://www.sunfreeware.com/ или http://www.blastwave.org/. Убедитесь, что вы выбрали пакет для вашей версии Solaris.
Если вы хотите использовать gcc для построения дополнительных модулей для использования с perl, поставляемым с Solaris, вы должны использовать модуль Solaris::PerlGcc, который доступен из CPAN. Perl, поставляемый с Solaris, настроен и собран с помощью компиляторов Sun, и информация о конфигурации компилятора, хранящаяся в Config.pm, поэтому относится только к компиляторам Sun. Модуль Solaris:PerlGcc содержит замену Config.pm, которая корректна для gcc - см. модуль для получения подробностей.
GNU as и GNU ld
Следующая информация относится к версии gcc 2. Добровольцы по обновлению ее для версии gcc 3 приветствуются.
Версии as и ld, поставляемые с Solaris, работают отлично для сборки perl. Обычно нет необходимости устанавливать версии GNU для компиляции perl.
Если вы решите проигнорировать это предупреждение и использовать версии GNU все равно, то убедитесь, что они относительно новые. Версии, более новые чем 2.7, по-видимому, достаточно новые. Более старые версии могут испытывать проблемы с динамической загрузкой.
Если вы хотите использовать GNU ld, вам нужно передать ему флаг -Wl,-E. Файл hints/solaris_2.sh пытается сделать это автоматически, установив следующие переменные Configure:
ccdlflags="$ccdlflags -Wl,-E"
lddlflags="$lddlflags -Wl,-E -G" Однако, с течением времени, изменения в gcc, GNU ld и Solaris ld затруднили автоматическое определение того, какой ld в конечном итоге вызывается. Вам может потребоваться вручную отредактировать config.sh и добавить флаги -Wl,-E самостоятельно, или же запустить Configure в интерактивном режиме и добавить флаги в соответствующих подсказках.
Если ваш gcc настроен на использование GNU as и ld, но вы хотите использовать вместо этого Solaris as и ld для сборки perl, вам нужно добавить -B/usr/ccs/bin/ в командную строку gcc. Один удобный способ сделать это —
$ sh Configure -Dcc='gcc -B/usr/ccs/bin/' Обратите внимание, что конечный слэш обязателен. Это приведет к некоторым безобидным предупреждениям при запуске Configure:
gcc: file path prefix `/usr/ccs/bin/' never used Эти сообщения можно безопасно игнорировать. (Обратите внимание, что для системы SunOS4 вы должны использовать -B/bin/.)
В качестве альтернативы, вы можете использовать переменную среды GCC_EXEC_PREFIX для обеспечения использования as и ld Sun. Обратитесь к документации gcc для получения дополнительной информации об опции -B и переменной GCC_EXEC_PREFIX.
Sun и GNU make
Make в /usr/ccs/bin работает отлично для сборки perl. Если у вас есть компиляторы Sun C, у вас также будет параллельная версия make (dmake). Она работает отлично для сборки perl, но иногда может вызывать проблемы при выполнении 'make test' из-за неточно определенных зависимостей между различными файлами набора для тестирования. Та же проблема может также повлиять на сборку некоторых дополнительных модулей, поэтому в таких случаях либо укажите '-m serial' в командной строке dmake, либо используйте /usr/ccs/bin/make вместо этого. Если вы хотите использовать GNU make, убедитесь, что бит set-group-id не установлен. Если он установлен, настройте переменную PATH так, чтобы /usr/ccs/bin/make находился перед GNU make, или попросите системного администратора отключить бит set-group-id для GNU make.
Избегайте libucb.
Solaris предоставляет некоторые функции совместимости с BSD в /usr/ucblib/libucb.a. Perl не будет правильно собираться и работать, если связан с -lucb, так как он содержит процедуры, несовместимые со стандартной Solaris libc. Обычно это не проблема, так как файл советов solaris предотвращает Configure от поиска библиотек в /usr/ucblib и также явно пропускает -lucb.
Среда для компиляции perl на Solaris
PATH
Убедитесь, что ваш PATH включает компилятор (/opt/SUNWspro/bin/, если вы используете компилятор Sun), а также /usr/ccs/bin/ для выбора других инструментов разработки (таких как make, ar, as и ld). Убедитесь, что ваш путь не включает /usr/ucb или что он включает его после компилятора, инструментов компилятора и других стандартных каталогов Solaris. Вам определенно не нужен /usr/ucb/cc.
LD_LIBRARY_PATH
Если у вас установлена переменная среды LD_LIBRARY_PATH, убедитесь, что она НЕ включает /lib или /usr/lib. Если вы будете собирать расширения, которые вызывают сторонние динамические библиотеки (например, Berkeley DB), убедитесь, что ваша переменная среды LD_LIBRARY_PATH включает каталог с этой библиотекой (например, /usr/local/lib).
Если вы получите сообщение об ошибке
dlopen: stub interception failed вероятно, это связано с тем, что ваша переменная среды LD_LIBRARY_PATH включает каталог, который является символьной ссылкой на /usr/lib (например, /lib). Причина, по которой это вызывает проблему, довольно тонкая. Файл libdl.so.1.0 на самом деле *только* содержит функции, которые генерируют ошибки «неудачная интерцепция подстановки». Загрузчик времени выполняет интерцепцию ссылок на "/usr/lib/libdl.so.1.0" и подключает внутренние реализации этих функций вместо них. [Спасибо Тиму Бэнсу за это объяснение.]
ЗАПУСК CONFIGURE.
См. файл INSTALL для общей информации о Configure. Здесь обсуждаются только проблемы, специфичные для Solaris. Обычно значения по умолчанию должны подойти.
64-битный perl на Solaris.
См. файл INSTALL для общей информации о 64-битных компиляциях. В общем, значения по умолчанию должны подойти большинству людей.
По умолчанию perl-5.6.0 (или более поздняя версия) компилируется как 32-битное приложение с поддержкой largefile и long-long.
Общие проблемы 32-битной и 64-битной архитектуры.
Solaris 7 и выше будут работать в 32-битном или 64-битном режиме на процессорах SPARC с помощью перезагрузки. Вы можете собрать 64-битные приложения при работе в 32-битном режиме и наоборот. 32-битные приложения будут работать под Solaris, работающем в 32- или 64-битном режиме. 64-битные приложения требуют, чтобы Solaris работал в 64-битном режиме.
Существующие 32-битные приложения корректно известны как LP32, т.е. длинные целые числа и указатели имеют 32 бита. 64-битные приложения более точно известны как LP64. Отличительной чертой приложения LP64 является его способность использовать 64-битное адресное пространство. Совершенно возможно иметь приложение LP32, которое поддерживает как 64-битные целые числа (long long), так и largefiles (> 2 ГБ), и это значение по умолчанию для perl-5.6.0.
Для более подробного объяснения проблем с 64-битными приложениями см. «Руководство разработчика Solaris 64-bit» по адресу http://docs.sun.com/
Вы можете определить режим ОС, используя «isainfo -v», например:
$ isainfo -v # Ultra 30 in 64 bit mode
64-bit sparcv9 applications
32-bit sparc applications По умолчанию perl будет скомпилирован как 32-битное приложение. Если вы не хотите выделять более ~4 ГБ памяти внутри perl или если вам не нужны более 255 открытых файлов, вам, вероятно, не нужно, чтобы perl был 64-битным приложением.
Поддержка больших файлов
Для Solaris 2.6 и более поздних версий существует два разных способа для 32-битных приложений для работы с большими файлами (файлами, размер которых превышает 2 ГБ). (64-битное приложение автоматически имеет встроенную поддержку largefile по умолчанию.)
Первый — «переходная среда компиляции», описанная в lfcompile64(5). Согласно справке,
The transitional compilation environment exports all the
explicit 64-bit functions (xxx64()) and types in addition to
all the regular functions (xxx()) and types. Both xxx() and
xxx64() functions are available to the program source. A
32-bit application must use the xxx64() functions in order
to access large files. See the lf64(5) manual page for a
complete listing of the 64-bit transitional interfaces. Переходная среда компиляции получается с помощью следующих флагов компилятора и компоновщика:
getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE
getconf LFS64_LDFLAG # nothing special needed
getconf LFS64_LIBS # nothing special needed Второй — «среда компиляции больших файлов», описанная в lfcompile(5). Согласно справке,
Each interface named xxx() that needs to access 64-bit entities
to access large files maps to a xxx64() call in the
resulting binary. All relevant data types are defined to be
of correct size (for example, off_t has a typedef definition
for a 64-bit entity).
An application compiled in this environment is able to use
the xxx() source interfaces to access both large and small
files, rather than having to explicitly utilize the transitional
xxx64() interface calls to access large files. Два исключения — fseek() и ftell(). 32-битные приложения должны использовать fseeko(3C) и ftello(3C). Они будут автоматически сопоставлены с fseeko64() и ftello64().
Среда компиляции больших файлов достигается с помощью
getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
getconf LFS_LDFLAGS # nothing special needed
getconf LFS_LIBS # nothing special needed По умолчанию perl использует среду компиляции больших файлов и полагается на Solaris для выполнения базового сопоставления интерфейсов.
Сборка LP64 perl
Для компиляции 64-битного приложения на UltraSparc с помощью недавнего компилятора Sun требуется использование флага «-xarch=v9». getconf(1) сообщит вам об этом, например:
$ getconf -a | grep v9
XBS5_LP64_OFF64_CFLAGS: -xarch=v9
XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
_XBS5_LP64_OFF64_CFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9 Этот флаг поддерживается компиляторами Sun WorkShop 5.0 и более поздними версиями (сейчас продаётся под названием Forte) при использовании на Solaris 7 или более поздних версиях на системах UltraSparc.
Если вы используете gcc, вам потребуется использовать -mcpu=v9 -m64 вместо этого. Эта опция ещё не поддерживается по состоянию на gcc 2.95.2; из install/SPECIFIC в этом выпуске:
GCC version 2.95 is not able to compile code correctly for sparc64
targets. Users of the Linux kernel, at least, can use the sparc32
program to start up a new shell invocation with an environment that
causes configure to recognize (via uname -a) the system as sparc-*-*
instead. Всё это должно обрабатываться автоматически файлом советов, если это запрошено.
Длинные числа с плавающей точкой.
Начиная с версии 5.8.1, длинные числа с плавающей точкой работают, если вы используете компиляторы Sun (необходимы для дополнительных математических процедур, не включённых в libm).
Потоки в perl на Solaris.
Возможна сборка потоковой версии perl на Solaris. Однако вся реализация потоков perl всё ещё находится в экспериментальной стадии, поэтому будьте осторожны.
Проблемы с malloc в perl на Solaris.
Начиная с perl 5.7.1, perl использует Solaris malloc, так как perl malloc ломается при работе с более чем 2 ГБ памяти, а Solaris malloc также, похоже, быстрее.
Если по какой-то причине (например, для обратной совместимости двоичных файлов) вам действительно нужно использовать perl malloc, вы можете перекомпилировать perl из исходных кодов и настроить сборку с помощью
$ sh Configure -Dusemymalloc Не следует использовать perl malloc, если вы собираете с помощью gcc. Есть сообщения о сбоях ядра, особенно в модуле PDL. Проблема, похоже, исчезает при -DDEBUGGING, поэтому отследить её было сложно. Компилятор Sun, похоже, нормально работает как с perl malloc, так и без него. [XXX здесь требуется дополнительное исследование.]
ПРОБЛЕМЫ С MAKE.
- Проблемы динамической загрузки с GNU as и GNU ld
-
Если у вас возникают проблемы с динамической загрузкой, используя gcc на SunOS или Solaris, и вы используете GNU as и GNU ld, обратитесь к разделу «GNU as и GNU ld» выше.
- ld.so.1: ./perl: ошибка перемещения:
-
Если вы получаете это сообщение на SunOS или Solaris, и используете gcc, это, вероятно, проблема с GNU as или GNU ld, упомянутая в предыдущем пункте «GNU as и GNU ld».
- dlopen: неудалось перехватить заглушку
-
Основной причиной сообщения 'dlopen: stub interception failed' является то, что переменная окружения LD_LIBRARY_PATH включает каталог, являющийся символьным ссылкой на /usr/lib (например, /lib). См. «LD_LIBRARY_PATH» выше.
- #ошибка "не указан DATAMODEL_NATIVE"
-
Это распространённая ошибка при попытке сборки perl на Solaris 2.6 с установкой gcc из Solaris 2.5 или 2.5.1. Заголовки Solaris изменились, поэтому необходимо обновить вашу установку gcc. Вы можете либо повторно запустить скрипт fixincludes из gcc, либо воспользоваться возможностью обновить вашу установку gcc.
- sh: ar: не найдено
-
Это сообщение от вашей оболочки, сообщающее, что команда 'ar' не найдена. Вам необходимо проверить переменную окружения PATH, чтобы убедиться, что она включает каталог с командой 'ar'. Эта проблема часто встречается на Solaris, где 'ar' находится в каталоге /usr/ccs/bin/.
ТЕСТ MAKE
Тест 4 op/stat.t в Solaris
Тест 4 op/stat.t может завершиться неудачно, если вы используете какой-либо tmpfs. Сборка в /tmp иногда демонстрирует такое поведение. Тестовый набор определяет, что вы собираете в /tmp, но он может не уловить все ситуации с tmpfs.
nss_delete ошибка core dump из op/pwent или op/grent
См. «nss_delete ошибка core dump из op/pwent или op/grent» в perlhpux.
КРОСС-КОМПИЛЯЦИЯ
Здесь ничего необычного. Вы можете легко сделать это, если у вас есть кросс-компилятор; обычный вызов Configure при нацеливании на Solaris x86 выглядит примерно так:
sh ./Configure -des -Dusecrosscompile \
-Dcc=i386-pc-solaris2.11-gcc \
-Dsysroot=$SYSROOT \
-Alddlflags=" -Wl,-z,notext" \
-Dtargethost=... # The usual cross-compilation options Добавление lddlflags — единственная нестандартная часть.
ПРЕДОБРАБОТАННЫЕ БИНАРИИ PERL ДЛЯ SOLARIS.
Вы можете скачать предобработанные бинарники для Solaris с http://www.sunfreeware.com/, http://www.blastwave.org, ActiveState http://www.activestate.com/ и http://www.perl.com/ в списке «Бинарники» в верхней части страницы. Возможно, есть и другие источники. Обратите внимание, что эти сайты находятся под управлением их соответствующих владельцев, а не разработчиков perl.
ПРОБЛЕМЫ С РАБОТОЙ PERL В SOLARIS.
Ограничения на количество открытых файлов в Solaris.
Документация stdio(3C) отмечает, что для LP32-приложений можно открыть только 255 файлов с помощью fopen(), и в потоке можно использовать только дескрипторы файлов с 0 по 255. Поскольку perl вызывает open(), а затем fdopen(3C) с полученным дескриптором файла, perl ограничен 255 одновременными открытыми файлами, даже если используется sysopen(). Если эта проблема окажется непреодолимой, вы можете скомпилировать perl как LP64-приложение, см. «Сборка LP64 perl» для получения подробностей. Также обратите внимание, что значение по умолчанию для лимита ресурсов открытых дескрипторов файлов на Solaris составляет 255, поэтому вам необходимо соответствующим образом изменить ulimit или rctl (Solaris 9 и выше).
МОДУЛИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
См. модули в пространствах имен Solaris:: и Sun::Solaris на CPAN, см. http://www.cpan.org/modules/by-module/Solaris/ и http://www.cpan.org/modules/by-module/Sun/.
ПРОБЛЕМЫ С МОДУЛЯМИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
Proc::ProcessTable в Solaris
Proc::ProcessTable не компилируется в Solaris с perl5.6.0 и выше, если определена LARGEFILES. Поскольку поддержка largefile — это значение по умолчанию в 5.6.0 и более поздних версиях, необходимо выполнить особые действия для использования этого модуля.
Проблема в том, что различные структуры, доступные через procfs, используют off_t, и если вы компилируете с поддержкой largefile, они изменяются с 32 бит на 64 бита. Таким образом, то, что вы получаете от procfs, не соответствует структурам в perl, что приводит к мусору. Подробнее см. proc(4).
Исправление для Proc::ProcessTable заключается в редактировании Makefile для явного удаления флагов largefile из тех, которые MakeMaker получает от Config.pm. Это приведет к тому, что Proc::ProcessTable будет построен в правильной среде. Все должно быть в порядке, если Proc::ProcessTable не пытается совместно использовать off_t с остальной частью perl, или если это делает, они должны быть явно указаны как off64_t.
BSD::Resource в Solaris
Версии BSD::Resource, предшествующие 1.09, не компилируются в Solaris с perl 5.6.0 и выше по тем же причинам, что и Proc::ProcessTable. Версии BSD::Resource, начиная с 1.09, имеют обходной путь для этой проблемы.
Net::SSLeay в Solaris
Net::SSLeay требует наличия /dev/urandom. Этот девайс доступен в Solaris 9 и выше. Для более ранних версий Solaris вы можете либо получить пакет SUNWski (он входит в несколько продуктов Sun, например, Sun WebServer, который является частью Solaris Server Intranet Extension, или Sun Directory Services, которые входят в Solaris для ISP), либо загрузить пакет ANDIrand с http://www.cosy.sbg.ac.at/~andi/. Если вы используете SUNWski, создайте символическую ссылку /dev/urandom, указывающую на /dev/random. Дополнительную информацию см. в документе ID27606 под названием «Различия в поддержке /dev/random в операционных средах Solaris[TM]», доступном по адресу http://sunsolve.sun.com.
Возможно, можно использовать демона сбора энтропии (написанного на Perl!), доступного по адресу http://www.lothar.com/tech/crypto/.
SunOS 4.x
В SunOS 4.x, скорее всего, вам нужно использовать SunOS ld, /usr/bin/ld, так как более новые версии GNU ld (например, 2.13) больше не работают для сборки Perl. При линковке расширений GNU ld сильно возмущается и выводит много ошибок, похожих на это:
... relocation truncated to fit: BASE13 ... и завершается. Поэтому файл подсказок SunOS 4.1 явно устанавливает ld в /usr/bin/ld.
Начиная с Perl 5.8.1, динамическая загрузка библиотек (DynaLoader, XSLoader) также, похоже, стала нерабочей в SunOS 4.x. Поэтому Perl собирается статически.
Запуск набора тестов в SunOS 4.1 немного сложен, так как тест dist/Tie-File/t/09_gen_rs.t зависает (подтест #51, FYI) по неизвестной причине. Просто остановите тест и завершите этот процесс Perl.
Существует множество других ошибок, которые, начиная с SunOS 4.1.4 и gcc 3.2.2, выглядят как ошибки gcc. Многие ошибки происходят в тестах Encode, где, например, когда ожидается «0», вы получаете «0», что должно выглядеть необычно.
Еще один пример — в начале t/run/fresh_perl, где ожидается chr(0xff), но тест завершается неудачно, потому что результат — chr(0xff). Точно так.
Результат «make test» для указанной комбинации:
Failed 27 test scripts out of 745, 96.38% okay. Запуск harness из-за множества неудачных тестов, связанных с Unicode, выведет мегабайты сообщений об ошибках, но если терпеливо подождать, вы получите эти результаты:
Failed Test Stat Wstat Total Fail Failed List of Failed
-----------------------------------------------------------------------------
...
../ext/Encode/t/at-cn.t 4 1024 29 4 13.79% 14-17
../ext/Encode/t/at-tw.t 10 2560 17 10 58.82% 2 4 6 8 10 12
14-17
../ext/Encode/t/enc_data.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_eucjp.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_module.t 29 7424 ?? ?? % ??
../ext/Encode/t/encoding.t 29 7424 ?? ?? % ??
../ext/Encode/t/grow.t 12 3072 24 12 50.00% 2 4 6 8 10 12 14
16 18 20 22 24
Failed Test Stat Wstat Total Fail Failed List of Failed
------------------------------------------------------------------------------
../ext/Encode/t/guess.t 255 65280 29 40 137.93% 10-29
../ext/Encode/t/jperl.t 29 7424 15 30 200.00% 1-15
../ext/Encode/t/mime-header.t 2 512 10 2 20.00% 2-3
../ext/Encode/t/perlio.t 22 5632 38 22 57.89% 1-4 9-16 19-20
23-24 27-32
../ext/List/Util/t/shuffle.t 0 139 ?? ?? % ??
../ext/PerlIO/t/encoding.t 14 1 7.14% 11
../ext/PerlIO/t/fallback.t 9 2 22.22% 3 5
../ext/Socket/t/socketpair.t 0 2 45 70 155.56% 11-45
../lib/CPAN/t/vcmp.t 30 1 3.33% 25
../lib/Tie/File/t/09_gen_rs.t 0 15 ?? ?? % ??
../lib/Unicode/Collate/t/test.t 199 30 15.08% 7 26-27 71-75
81-88 95 101
103-104 106 108-
109 122 124 161
169-172
../lib/sort.t 0 139 119 26 21.85% 107-119
op/alarm.t 4 1 25.00% 4
op/utfhash.t 97 1 1.03% 31
run/fresh_perl.t 91 1 1.10% 32
uni/tr_7jis.t ?? ?? % ??
uni/tr_eucjp.t 29 7424 6 12 200.00% 1-6
uni/tr_sjis.t 29 7424 6 12 200.00% 1-6
56 tests and 467 subtests skipped.
Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed,
98.17% okay. Ошибка теста alarm() вызвана тем, что system() явно блокирует alarm(). Это, вероятно, ошибка libc, и, учитывая, что SunOS 4.x прекратила поддержку много лет назад, не стоит надеяться на исправление. Кроме того, не пытайтесь использовать что-либо слишком сложное, связанное с Unicode, особенно с Encode, и у вас всё должно быть хорошо в SunOS 4.x.
АВТОР
Исходный текст был написан Энди Дафферти doughera@lafayette.edu, используя много советов от Алана Берлисона, Ника Инга-Симмонса, Тима Банса и многих других пользователей Solaris на протяжении многих лет.
Пожалуйста, сообщайте об ошибках, обновлениях или предложениях по адресу perlbug@perl.org.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/perlsolaris