2004-03-01
_ 仕事
久しぶりに土日を休んだりすると休日から仕事への頭の切換えがうまくできん。
_ 仕事
1705 退勤。定時だ。
_ errno
いま読んでる Linkers & Loadersにプログラムとライブラリでの大域データの衝突ということで pp187 188 あたりに以下のような記述がある。
以下のようなプログラムをコンパイルして共有ライブラリとリンクすると 正しいエラーコードではなく、0 が表示される。 これは int errno; によって共有ライブラリ内の errno にバインドされない errno の新しいインスタンスが定義されてしまうからだ。 extern のコメントを外せば errno は未定義の大域シンボル参照になり、 リンカはこの errno を共有ライブラリ内の errno にバインドするので、プログラムは期待した通りに動作する。
こんなシステム上。
rin@sakura[~/work/c]% uname -r Linux sakura 2.4.25 #2 SMP 2004年 2月28日 (土) 15:43:17 JST i686 unknown
衝突するらしいプログラム。
#include <stdio.h> #include <unistd.h> /*extern*/ int errno; int main( int ac, char** av ) { unlink( "./non-exist-filefilefilefile" ); perror( "unlink() " ); printf( "errno: %d\n", errno ); return 0; }
コメントを外さないとき。
rin@sakura[~/work/c]% ./a.out unlink() : No such file or directory errno: 2
コメントを外す。
rin@sakura[~/work/c]% ./a.out unlink() : No such file or directory errno: 2
結果が同じ。
Linkers & Loaders では extern をコメントしてるときに errno が 0 になるということを言ってると解釈したんだけど、違うんだろか。
じゃあ errno ってそもそもどこで定義してるんだよということで調べようとした。
rin@sakura[~/work/c]% gcc -E t.c| grep errno int errno; printf( "errno: %d\n", errno );
って、あれ。extern してるけど定義がなかったら、extern したところが定義になるのか? C の規格?
_ Linux Program Library HOWTO
調べものしてて見付けた。
errno.hにないすか?errno
errno.h にあるっぽいんだけど、いま明示的に #include <errno.h> *してない*状態で、プログラムでは extern してる。でもそれなりに定義されてるっぽいというのが謎。やはり規格読むしか....。