トップ «前の日記(2004-02-29) 最新 次の日記(2004-03-02)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

2004-03-01

_ 仕事

久しぶりに土日を休んだりすると休日から仕事への頭の切換えがうまくできん。

_ 仕事

1705 退勤。定時だ。

_ バイトでウィザード

4/1 発売。なる。

_ hiki 0.6

あげ。

_ 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

調べものしてて見付けた。

本日のツッコミ(全2件) [ツッコミを入れる]
_ ぶんじ (2004-03-02 22:08)

errno.hにないすか?errno

_ みわ (2004-03-03 08:20)

errno.h にあるっぽいんだけど、いま明示的に #include <errno.h> *してない*状態で、プログラムでは extern してる。でもそれなりに定義されてるっぽいというのが謎。やはり規格読むしか....。