新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

あ〜なんだろう。

.S で妙な(というかちょっと複雑な)コードを書くと .rela.text ができます。リンク時に、たぶん、シンボルの解決など問題が解決できないとそのまま .rela.dyn となり残ります(たぶん)。これはリロケータブルなシンボルを dynamic に解決するためのセクションのようです。(-static や -r では生成されないため)
実際には私が描いたいい加減 crt0.o で発生しました。ただし、他のちゃんとした crt0.o でも rela.text はあるので何がいけないかわかりません。多分シンボルの解決とかでしょう。
いずれにせよ余計と思われる .rela.dyn ができた時だけ、問題が発生します。.rela.dyn はいろんなファイルをリンクするときに各ファイルの .rela.txt を集める際に発生し、最後までファイルをなめても消えない時に残るようです。.rela.txt を含む .o をリンクしても大丈夫なケースがあるのが判断基準です。
とにかく、crt0.o が悪さをしていることは分かりました。いい加減に書いたのでさもありなんというところ。
crt0.o をちゃんと書き直すのは勿論ですが、 いくつかの解決方法があります。-r をつける。-static にする。そうすれば .rela.dyn はできません。

今確認すると _ の数が違います。どうやらやはりシンボル名が解決してしまった時が問題のようです。あ〜やはりそうでした。シンボル名に _ を一つ多くしたら問題が起きなくなりました。_ の追加は明示的にシンボル名が解決できなくしたことになります。

なんとなく結論。 .rela.text ができて、そこでさらにリンクまでできると、、.rela.dyn ができてしまい、それがあるとうまくいかない。いま uclinux で走るオブジェクトを作りたいのでそれでいいのだが、ちょっと気持ち悪い。これは gcc 作成時に -disalbe-shared とかしたせいかもしれない。(確かに矛盾する)

mb の 普通の linux (uc じゃない) は .rela.dyn もできるし、問題ない。