yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

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

ld-linux.so でしょう。「Undefined reference to 'errno'」として終了する
かわりにこのメッセージを出してるんでしょう。(終了しちゃう方がましかな??)

> いうことなんですかね。stdout にエラー吐くのはたしかにおかしい。

なんか、この辺の話題は2003年頃に話題になってたみたいですけどねえ。
stdoutにエラーが出ちゃうっていう問題も。

> グローバル変数を参照する機械語でthread specific dataを参照するようにす
> るのは、ライブラリレベルじゃ無理じゃないですかねー。

と書いたけど、以前はなんとかバイナリ互換にしてたんですよね。

以前のglibcでは、
    #define errno (*__errno_location()) 
にしておいて、関数__errno_location()の返すアドレスを実行時にグローバル
/スレッドローカルのどちらかに切替えるということにしていたんだと思いま
す。ライブラリがこうして書いてあれば、
    extern int errno;
と書いちゃう行儀の悪いアプリもライブラリも、同じグローバル変数を見に行
くということができた。

最近はgccで、
    extern int __thread errno;
という表記法がサポートされて、これを使うと直接thread specific storage
(thread local storage; TLS)を参照する機械語が出るそうです(関数呼び出し
はしない)。ライブラリはこれを使って書いてある(アプリで__threadを使える
ようにするには、ライブラリもそう書かないといけない)。従ってライブラリ
がグローバルなerrnoを見に行くようにはできなくなった、という事のようで
す。

ただ、
    #define errno (*__errno_location()) 
を使ってコンパイルされたアプリとのバイナリ互換性は保たれています。

# まあ、「errnoを変数と思っちゃダメ」になってから15年も経つのだから、
# いいかげん直ってるだろ、と。

                                        前田敦司