初心者のIKUZOでございます、アドバイスお願いできないでしょうか?
①現在のやりかた
●セクションの設定0C000000 DVECTTBL DINTTBL0C000800 PResetPRG PIntPRG0C001200 プログラムの開始 P C C$BSEC C$DSEC D B R2C001000 PCACHE2CFBF800 BUSB_BUFF usbのバッファ2DFC0000 BETH_BUFF BETH_DESC etherのバッファFFF80000 B_LAN_BUF tcp/ipのバッファFFF87C00 S
これで.MOTファイルを出力させて、そのMOTファイルをバイナリ変換する際に
0x0C080000以上のアドレスは上位アドレスを切り捨ててデータを上書きしてバイナリを生成しております
これで問題なく動作しております
②改善したやりかたをしたい
最初からバイナリで出力できないものか?
まず.BINファイルを出力させるとサイズがとても大きくなる、その原因はSHがキャッシュ無効の領域にアドレス上位を使用しているためにその領域までの全てのデータを出力する、これは当たり前の(正常な動作)なのですが、実際に実行されるのは0x0C000000~0x0C080000なので、なにか方法はないものかと思いまして、SH2A hew 最適化リンカ 出力ファイルの分割を指定してやってみると(ファイル名、0x0C000000~0x0C080000等指定)確かに①の方法で求めたファイルサイズと同じになるのでデータも同じとおもいきや、内部データは抜けております、これは大体想像が付くのですが、つまりキャッシュ領域が抜けている、①の方法は特別な方法で変換しているためです、
そこでお伺いしたいのが、.BINファイルを出力させる時にキャッシュ領域も含めた状態でなおかつ実行部分のみ取り出すような方法ってあるのでしょうか?
GNU Binutils に含まれる objcopy を使えばなんでもやり放題だと思いますが役に立ちませんか?
自分の使ってる Cygwin64 版 Binutils の objdump で SHC の出力した .obj のヘッダ情報を出力すると
$ objdump -a hogera.obj hogera.obj: file format elf32-big hogera.obj $
と出力され、objcopy のヘルプを見ると
$ objcopy --help | tail Set PE subsystem to [& ] --compress-debug-sections Compress DWARF debug sections using zlib --decompress-debug-sections Decompress DWARF debug sections using zlib -v --verbose List all object files modified @ Read options from -V --version Display this program's version number -h --help Display this output --info List object formats & architectures supported objcopy: supported targets: pe-x86-64 pei-x86-64 pe-bigobj-x86-64 elf64-x86-64 elf64-l1om elf64-k1om pe-i386 pei-i386 elf32-i386 elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex Report bugs to <www.sourceware.org/.../> $
サポートフォーマットの中に elf32-big があるので使えそうではあります。同様の結果とはならないでしょうか?