In article <3991194news.pl@rananim.ie.u-ryukyu.ac.jp>
        kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 普通は、thread local な領域にerrnoに相当するものを作る
> と思う。

はい。普通、errno は、TSD (Thread Specific Data) です。Linux 
でも Solaris でも。TSD というと、pthread_getspecific() と
するのがそうなんだけど、errno だけは特別扱いの TSD です。

たとえば、こんなプログラムの場合、
------------------------------------------------------------
% cat errno.c
#include <errno.h>
main()
{
    printf("%d\n",errno);
}
------------------------------------------------------------

Linux だと、こんな感じ。
------------------------------------------------------------
% gcc -E errno.c | sed -e '/#/d' -e '/^[        ]*$/d'
extern int *__errno_location (void) __attribute__ ((__const__));
main()
{
    printf("%d\n",(*__errno_location ()));
}
% 
------------------------------------------------------------
関数 __errno_location() が TSD の番地を返します。
きっとユーザレベルのスレッド構造体のどこかでしょう。

Solaris だと、こんな感じ。
------------------------------------------------------------
% gcc -E errno.c | sed -e '/#/d' -e '/^[        ]*$/d' 
extern int errno;
main()
{
    printf("%d\n",errno);
}
% gcc -D_REENTRANT -E errno.c | sed -e '/#/d' -e '/^[   ]*$/d'
extern int *___errno();
main()
{
    printf("%d\n",(*(___errno())) );
}
% 
------------------------------------------------------------
Solaris だと、-D_REENTRANT を付ければ、マルチスレッド対応に
なりますが、付けないと昔風です。

ついでに、MacOSX。
------------------------------------------------------------
% gcc -E errno.c | sed -e '/#/d' -e '/^[        ]*$/d'
extern int * __error (void);
main()
{
    printf("%d\n",(*__error()));
}
% 
------------------------------------------------------------

> Subject: Re: Incorrectly built binary which accesses errno or h_errno directly. Needs to be fixed.       を消すに は?

このメッセージ、__errno() が吐いているんですかね。動的リンク
のリンカかなあ。

Linux の Pthread の実装も、いろいろもめてて、結局、今どうなっ
ているのか良く分からないけど、Pthread の異なる実装を混ぜたと
いうことなんですかね。stdout にエラー吐くのはたしかにおかしい。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\