Re: Incorrectly built binary which accesses errno or h_errno directly. Needs to be fixed. を消すに は?
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年も経つのだから、
# いいかげん直ってるだろ、と。
前田敦司
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