リンクしてみた

昨日の内容にひとつ間違いがありました。ダウンロードするtoolchainパッケージはbfin-elf-版ばかりを挙げていましたが、実際にはbfin-uclinux-からなる汎用ツールチェーンが必要です。昨日の分は修正しておきました。
bfin-elf-とbfin-uclinux-の違いは、吐き出す最終オブジェクトの形式です。bfin-elf-が汎用のリローダブルフォーマットであるのに対して、bfin-uclinux-はuClinux OS環境に特化した形式の実行ファイルを吐き出します。そのため、uClinuxのアプリケーションはbfin-uclinux-gccで、その他のソフトはbfin-elf-でビルドしろと文書には書いてあります。
libbfdspはtoolchainには含まれていないため、uClinuxディストリビューションを持ってきてビルドする必要があります。ソースは圧縮状態で200MBくらいありますので十分なディスクが必要です。ubuntuでビルドする最中に「Ncurseがない」、「zlibがない」とエラーメッセージが出ました。そのため、昨日説明したbuild-essentialsに加えてそれっぽいncurses, zlib関連のパッケージを全部インストールしています。
ビルドが終了したlibbfdspとインクルードファイルをWindowsに持ち込んで、PizzaFactoryで様子を見ているところです。リンク時にはlibbfdsp.aをライブラリとして宣言しなければなりません。これは-lオプションの引数なので、libbfdsp.aではなく、bfdsp.aと指定します。面倒なところ。また、インクルードファイルへのパスも必要です。
freestandingでのビルドはエラーなしで終了しました。実はひやひやしたところです。uclinuxのビルドにつかったgccは4.1.1ですが、PizzaFactory Expressのそれはたぶん3.x系列です*1。おそらく両者の間の呼び出し規約は変わっていないでしょう*2し、アーカイバのような地味なところをいじる必要もないはずなのでエイヤ!とリンクしています。
さて、libbfdspのテストケースとして提供されている小さなプログラムを試しにビルドしてみました。うまくビルドできますが、gdbのシミュレータでは、fir_fr16()を読んだ瞬間にターゲットプログラムが終了します。原因はわかりません。命令レベルのステップ実行をかけたところ、やはりcall命令を実行したとたんに動作がおかしくなります。
すこし考えを変えて、.outファイルをVDSP++に食わせてみました。ところがIllegal Instructionsだらけです。こんなはずはありません。以前はTOPPERS/JSP for BlackfinプログラムをgccでビルドしてVDSP++のシミュレータでデバッグしたのですから。改めて今使っているPizzaFactoryTOPPERS/JSP for BFのsample1をビルドし、sample1.outをVDSP++に食わせたところ何の問題もなくロードされました*3。とすると、いぜんmonamourさんに指摘された、Freestandingのgdbスタブ部がらみで何らかのロードエラーが起きているのかもしれません。
この先の調べ方にはいくつかアイデアがあります。

  • 自分でcrtを作って小さなelfフォーマットのプログラムをコマンドラインgccでつくり、シミュレータで動作を見る
  • sample1を縮小して、fir_fr16を埋め込み、実機で動きを追跡する。

どちらでもOKです。時間はありますのでゆっくり考えます。

*1:フリー版なので安定版しか提供しないと宣言されている

*2:規約はVDSP++のコンパイラに依拠しているため

*3:一応エラーダイアログはでる