Spec-Zone.ru › Perl 5.36

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-битных систем.
      • Поддержка больших файлов
      • Создание LP64 perl
      • Длинные типы double.
    • Потоки в 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. По умолчанию всегда будет использоваться наиболее новая версия, а старая версия, как правило, сохраняется только на один релиз Solaris. Обратите также внимание, что по умолчанию perl не будет искать модули в старой версии, опять же из-за проблем совместимости/стабильности. Вследствие этого, если вы обновите Solaris, вам придётся пересобрать/переустановить любые дополнительные модули CPAN, которые вы установили для предыдущей версии Solaris. См. страницу справки CPAN по 'autobundle' для быстрого способа сделать это.

В качестве временной меры вы можете либо изменить строку #! в своих скриптах, чтобы она конкретно указывала на старую версию perl, например, в Solaris 9 используйте #!/usr/perl5/5.00503/bin/perl для использования версии perl, которая была по умолчанию для Solaris 8, или, если у вас большое количество скриптов, может быть удобнее сделать старую версию perl по умолчанию в вашей системе. Вы можете сделать это, изменив соответствующие ссылки под /usr/perl5 следующим образом (пример для Solaris 9):

# cd /usr/perl5
# rm bin man pod
# ln -s ./5.00503/bin
# ln -s ./5.00503/man
# ln -s ./5.00503/lib/pod
# rm /usr/bin/perl
# ln -s ../perl5/5.00503/bin/perl /usr/bin/perl

В обоих случаях это следует рассматривать только как временную меру - вы должны обновить до более поздней версии perl как можно скорее.

Также обратите внимание, что утилиты perl для командной строки (например, perldoc) и любые, которые добавляются установленными модулями, будут находиться в /usr/perl5/bin, поэтому этот каталог следует добавить в ваш PATH.

Версии Solaris.

Для согласованности с общим использованием скрипт Configure perl выполняет некоторые незначительные изменения в имени и номере версии операционной системы, как сообщается командой uname. Вот частичная таблица преобразований:

         Sun:                      perl's Configure:
uname    uname -r   Name           osname     osvers
SunOS    4.1.3     Solaris 1.1     sunos      4.1.3
SunOS    5.6       Solaris 2.6     solaris    2.6
SunOS    5.8       Solaris 8       solaris    2.8
SunOS    5.9       Solaris 9       solaris    2.9
SunOS    5.10      Solaris 10      solaris    2.10

Полная таблица находится в 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. Если вы нашли это сообщение слишком поздно и использовали tar, скомпилированный под SunOS4, вам необходимо найти неправильно переименованный файл и переместить его обратно в 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

Если вы сомневаетесь, какой пакет содержит необходимый вам файл, попробуйте найти установку, которая содержит этот файл. Затем выполните:

$ grep /my/missing/file /var/sadm/install/contents

Это отобразит строку, подобную этой:

/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 необходимо использовать параметр

$ sh Configure -Dcc=gcc

В противном случае могут возникнуть странные ошибки сборки.

Если вы обновили свою версию 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 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 hints предотвращает 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" и подставляет вместо них внутренние реализации этих функций. [Спасибо Тиму Бэнсу за это объяснение.]

RUN 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, то есть Longs и Pointers — 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-битного приложения автоматически включена поддержка больших файлов по умолчанию.)

Во-первых, это «переходная среда компиляции», описанная в 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.

Всё это должно обрабатываться автоматически файлом hints, если это запрошено.

Long Doubles.

Начиная с версии 5.8.1, long doubles работают, если вы используете компиляторы 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. Есть сообщения о core dumps, особенно в модуле 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: fatal: ошибка перемещения:

Если вы получаете это сообщение на SunOS или Solaris, и используете gcc, это, вероятно, проблема с GNU as или GNU ld, упомянутая в предыдущем пункте "GNU as и GNU ld".

dlopen: неудалось перехватить заглушку

Основной причиной сообщения 'dlopen: неудалось перехватить заглушку' является то, что переменная окружения 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 сброс ядра из op/pwent или op/grent

См. "nss_delete сброс ядра из 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 for ISPs), либо загрузить пакет ANDIrand с http://www.cosy.sbg.ac.at/~andi/. Если вы используете SUNWski, создайте символическую ссылку /dev/urandom, указывающую на /dev/random. Более подробную информацию см. в документе с ID 27606 под названием «Различные требования к поддержке /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, к слову) по неизвестной причине. Просто остановите тест и завершите процесс 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 из-за множества сбоев тестов, связанных с Юникодом, выведет мегабайты сообщений об ошибках, но если терпеливо подождать, то можно получить такие результаты:

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 был выведен из эксплуатации несколько лет назад, не ждите исправления. Кроме того, не пытайтесь делать ничего слишком связанного с Юникодом, особенно с Encode, и всё должно быть в порядке в SunOS 4.x.

АВТОР

Оригинальная статья была написана Энди Дауэрти doughera@lafayette.edu, опираясь на советы Алана Берлисона, Ника Инга-Симмонса, Тима Бэнса и многих других пользователей Solaris на протяжении многих лет.

Пожалуйста, сообщайте об ошибках, обновлениях или предложениях по адресу https://github.com/Perl/perl5/issues.

© 1993–2021 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.36.0/perlsolaris

Spec-Zone.ru

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