Re: Incorrectly built binary which accesses errno or h_errno directly. Needs to be fixed. を消すに は?
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 にエラー吐くのはたしかにおかしい。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735