最近パッケージ更新が大変になってきたFreeBSD 7.3 のサーバーで、今回は bash を portupgrade コマンドで更新しようとしたところエラーとなってしまいました。
cc -L./builtins -L./lib/readline -L./lib/readline -L./lib/glob -L./lib/tilde -L./lib/sh -L/usr/local/lib -O2 -fno-strict-aliasing -pipe -o bash shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o expr.o flags.o jobs.o subst.o hashcmd.o hashlib.o mailcheck.o trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o alias.o array.o arrayfunc.o assoc.o braces.o bracecomp.o bashhist.o bashline.o list.o stringlib.o locale.o findcmd.o redir.o pcomplete.o pcomplib.o syntax.o xmalloc.o -lbuiltins -lglob -lsh -lreadline -lhistory -ltermcap -ltilde /usr/local/lib/libintl.so /usr/local/lib/libiconv.so /usr/local/lib/libiconv.so print_cmd.o(.text+0x18d6): In function `indirection_level_string': : undefined reference to `strnlen' subst.o(.text+0x1da3): In function `setifs': : undefined reference to `strnlen' *** Error code 1 Stop in /usr/ports/shells/bash/work/bash-4.2. *** Error code 1 Stop in /usr/ports/shells/bash. *** Error code 1 Stop in /usr/ports/shells/bash. ** Command failed [exit code 1]: /usr/local/libexec/pkgtools/script -qa /tmp/portupgrade20130606-26008-1yka2js-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=bash-4.2.42 UPGRADE_PORT_VER=4.2.42 make ** Fix the problem and try again. ** Listing the failed packages (-:ignored / *:skipped / !:failed) ! shells/bash (bash-4.2.42) (compiler error)
そして、PHP5.5 も portupgrade で更新しようとすると、同様に undefined reference to ‘strnlen’ となります。
functions_cli.lo sapi/cli/php_cli.lo sapi/cli/php_http_parser.lo sapi/cli/php_cli_server.lo -lcrypt -lcrypt -lpcre -lm -lxml2 -lz -liconv -lm -lcrypt -lcrypt -o sapi/cli/php main/.libs/spprintf.o(.text+0x1007): In function `vspprintf': : undefined reference to `strnlen' *** Error code 1 1 error *** Error code 1 Stop in /usr/ports/lang/php5. *** Error code 1 Stop in /usr/ports/lang/php5. ** Command failed [exit code 1]: /usr/local/libexec/pkgtools/script -qa /tmp/portupgrade20130610-37904-pqacbm-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=php5-5.4.15 UPGRADE_PORT_VER=5.4.15 make ** Fix the problem and try again. ** Listing the failed packages (-:ignored / *:skipped / !:failed) ! lang/php5 (php5-5.4.15) (new compiler error)
make の最後にリロケータブルの形までコンパイルしたオブジェクトをリンクする時点で、 strnlen というシンボルが定義されていない、見つからないということのようです。恐らく strnlen というのは、OS側が準備しているものだと思われます。FreeBSD 8.3 のマシンではアップデート作業は完了しますからね。
エラーメッセージを検索してみると、類似エラー情報が見つかりました。この情報では対策としてソースにパッチを当てていますので、やろうと思えば私にも出来るはずですが、パッケージがアップデートされる度に、手動でソースをいじるなんて運用面から考えればやるべき作業では無いように思えます。
先日の spawn.h のエラーもあり、真面目に考えるとFreeBSD 7.x での運用はそろそろ限界なのかもしれません。
今月、FreeBSD 8.4 もリリースされたことですから、8系へのアップデート作業を開始することにしました。 さすがに 8.4 へのアップデートは不安があるので、まずは FreeBSD 8.3 へメジャーアップグレードすることにします。