Spec-Zone.ru › Perl 5.28

perlsolaris

СОДЕРЖАНИЕ

  • ИМЯ
  • ОПИСАНИЕ
    • Номера версий Solaris.
  • РЕСУРСЫ
  • НАСТРОЙКА
    • Проблемы с извлечением файлов на Solaris.
    • Компилятор и связанные инструменты на Solaris.
      • Включить /usr/ccs/bin/ в ваш PATH.
      • Избегать /usr/ucb/cc.
      • Компилятор C Sun
      • GCC
      • GNU as и GNU ld
      • Sun и GNU make
      • Избегать libucb.
    • Окружение для компиляции perl на Solaris
      • PATH
      • LD_LIBRARY_PATH
  • ЗАПУСК CONFIGURE.
    • 64-битный perl на Solaris.
      • Общие проблемы 32-битного и 64-битного режимов.
      • Поддержка больших файлов
      • Компиляция perl в режиме LP64
      • Длинные числа с плавающей точкой.
    • Потоки в perl на Solaris.
    • Проблемы с malloc в perl на Solaris.
  • ПРОБЛЕМЫ С MAKE.
  • ТЕСТ MAKE
    • Тест op/stat.t 4 в Solaris
    • nss_delete дамп ядра из op/pwent или op/grent
  • КРОСС-КОМПИЛЯЦИЯ
  • ПРЕКОМПИЛИРОВАННЫЕ БИНАРИ ДЛЯ PERL НА SOLARIS.
  • ПРОБЛЕМЫ ПРИ РАБОТЕ PERL НА SOLARIS.
    • Ограничения на количество открытых файлов на Solaris.
  • СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS МОДУЛИ.
  • ПРОБЛЕМЫ С МОДУЛЯМИ СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
    • Proc::ProcessTable на Solaris
    • BSD::Resource на Solaris
    • Net::SSLeay на 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API