2016/09/24

[c/c++]私のC言語 (失敗談) - リンカオプションが残っていた

たまには、失敗談でも書こう。
失敗をたまにしかしないのではなく、失敗談をたまにしか書かないだけだ。
今まで、けっこうミスをしてきたので、ミスが起きたときに「ああ、あれね」でわかることもあり、あなどれないのだ(よい面を見よう!)。


gccでライブラリを作っている。
最初は共有ライブラリにするつもりで、-fPIC、なんかつけていたのだが、やっぱり静的ライブラリにしようということで、オプションを外した。
arしてlibxx.aを作って、ちゃんと動いて、単体テストも結合テストもほぼ終わっていた。

が、さっきMakefileを見ると、-sharedが残っている!
うわー、こりゃいかんだろー。

ということで、外してビルドし直し、テストもやり直している。
が、ライブラリにバイナリ差分はあったのだけど、実行ファイルは-sharedがあろうとなかろうと差分がないのだ。

偶然そういうコードだったのか?と思ってgccのオプションを調べ直したら、-sharedってリンクオプションじゃないか!
静的ライブラリはarするだけでリンクしないから、リンクオプションに何が残っていても意味が無いのだ。
あぁぁぁぁ。。。

 

ライブラリを作り直した以上、実行ファイルが同じものであってもなくても、タイムスタンプ的に時間のずれがあると気持ちが悪いし、説明を求められるとなかなか苦しい。
あきらめて、最初からログを取り直している最中である。。。

ゴミ箱にファイルは残っているから戻せばよいのだけど、もう気持ちの問題だ。
幸い、放置系のテストが多いので、動かしておけばよいだけだし。
テストアプリに時間を掛けてよかった。。。

 

反省

使っているオプションかどうかくらいは確認しよう。


気になるのは、arした結果が違ったということだ。

差分はファイルの先頭だけだったので、きっとファイルヘッダ程度だろうとは思ったものの、案外こういうので手を抜いてしまうと失敗するというのを経験上知っている(そして、手を抜かなかった場合は、今回のようになんともない、ということが多い。。。)。

オブジェクトを残してarだけし直しても差分がある。
やはり、コンパイルしたオブジェクトには変化がなく、arしたときの差分だけということだ。
オブジェクトが同じだからチェックサムのようなものではなく、タイムスタンプ的なものだろう。

 

ar (UNIX) - Wikipedia

あー、ファイルヘッダの2項目目にタイムスタンプがあるな。
差分があるのも、確かにタイムスタンプフィールドの後半だけだ。
touchなどでファイルのタイムスタンプを変更しても、ar自体のタイムスタンプを書き換えないと「偽ってるだろう!」と思われかねないのか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。