2009年7月31日金曜日

(Solaris) SUN_LENがundefined

先日、Solaris8で見たこと。



pkgsrcで、xrandrをxrandr-1.3.0へアップデートしようとしたら、pkgsrc/math/nickleというのもついでにビルドされるようになったんですが、途中で、こんなエラー



In file included from lex.l:16:
/work/pkgsrc.work/math/nickle/work/.buildlink/include/readline/readline.h:379: warning: function declaration isn't a prototype
lex.c:2680: warning: 'yyunput' defined but not used
gcc -Wall -Wpointer-arith -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations  -Wnested-externs -fno-strict-aliasing -fwrapv -O -I/usr/pkg/include -I/usr/include -I/usr/pkg/gcc34/include  -L/usr/pkg/gcc34/bin/../lib/gcc/sparc-sun-solaris2.8/3.4.6 -Wl,-R/usr/pkg/gcc34/bin/../lib/gcc/sparc-sun-solaris2.8/3.4.6 -L/usr/pkg/gcc34/bin/../lib -Wl,-R/usr/pkg/gcc34/bin/../lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/gcc34/lib -o nickle  alarm.o array.o atom.o  box.o compile.o debug.o  divide.o edit.o error.o  execute.o expr.o file.o  float.o foreign.o frame.o  func.o gcd.o hash.o int.o  integer.o io.o main.o mem.o  natural.o pretty.o profile.o  rational.o ref.o refer.o  sched.o scope.o stack.o  string.o struct.o symbol.o  sync.o type.o union.o util.o  value.o builtin-command.o  builtin-debug.o builtin-environ.o  builtin-file.o builtin-math.o  builtin-semaphore.o builtin-sockets.o  builtin-string.o builtin-thread.o  builtin-toplevel.o builtin-pid.o  builtin.o builtin-foreign.o gram.o  lex.o  -ldl -lresolv -lsocket -lnsl -lm  -lreadline -lncurses
Undefined                       first referenced
symbol                             in file
SUN_LEN                             builtin-sockets.o
ld: fatal: Symbol referencing errors. No output written to nickle
collect2: ld returned 1 exit status
*** Error code 1



nm builtin-sockets.oしてみると、ああなるほど、未定義だね、と。



[42]    |         0|       0|NOTY |GLOB |0    |UNDEF  |Reduce
[27]    |         0|       0|NOTY |GLOB |0    |UNDEF  |SUN_LEN
[47]    |         4|       4|OBJT |GLOB |0    |COMMON |SocketNamespace
[35]    |         0|       0|NOTY |GLOB |0    |UNDEF  |StackPush
[54]    |         0|       0|NOTY |GLOB |0    |UNDEF  |StackReset



とりあえずソースコードを、grep SUN_LEN * してみると、



builtin-sockets.c:    *len = SUN_LEN (addr);



・・・と、これしかない。マクロっぽい名前なので



ggrep -R SUN_LEN /usr/include/ とかやってみますと、なにもない。そりゃぁ未定義になるわけです。



FreeBSDで同じくgrepしてみますと、すぐ見つかりました。



% grep -R SUN_LEN /usr/include/
/usr/include/sys/un.h:#define SUN_LEN(su) \



↓ こんなのです。



#define SUN_LEN(su) \
        (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))



というわけで、上記の2行を、builtin-sockets.cの中にコピー&ペーストして、解決させました。





ネット検索してみると、SUN_LENがSolarisには無い、というのはどうもFAQっぽいですね。



大体15年くらい昔は、インターネット上で配布されているソフトウェアは(あのころは、オープンソースなんて用語はなかった)、SunOSでビルドできるのが当然、というくらいにSunOSの地位は高かったんですが、Linux等の台頭につれて、それもなくなりました。



ちなみに、SUNってのは会社名のことじゃなくて(誰もそんなことは思わないか)、UNIX domain Socketのことですね。



それにしても、このマクロSUN_LENの中身、低レベルなことやってて、いかにもC言語っぽいなぁ。



でも、こういうのができるからこそ、C言語だ、という気がします。



どっちかというと、sockaddr_un構造体の定義自体が、なんだかなぁ、という気がします。



FreeBSDの場合、こんなの。



/*
* Definitions for UNIX IPC domain.
*/
struct sockaddr_un {
        unsigned char   sun_len;        /* sockaddr len including null */
        sa_family_t     sun_family;     /* AF_UNIX */
        char    sun_path[104];          /* path name (gag) */
};



まあ、今どきの考え方に照らし合わせてみると、気持ち悪い、ってことですが。
なんだよ、104って何?みたいな。



0 件のコメント:

コメントを投稿