SH2A hew 最適化リンカ 出力ファイルの分割

初心者のIKUZOでございます、アドバイスお願いできないでしょうか?

①現在のやりかた

●セクションの設定
0C000000 DVECTTBL DINTTBL
0C000800 PResetPRG PIntPRG
0C001200 プログラムの開始 P C C$BSEC C$DSEC D B R
2C001000 PCACHE
2CFBF800 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 を使えばなんでもやり放題だと思いますが役に立ちませんか?

  • fujita nozomuさん
    ヒントを与えていただきありがとうございます、
    inutils-2.28.tar.gzをダウンロードしてみました、これはソースだけみたいです、コンパイルは難しいので、
    コンパイル済のbinutils-2.28-w32-bin.zipをダウンロードしてみました、さあこれから使用方法を勉強しないといけません。
  • Unable to recognise the format of the input file `7670.obj'
    エラーになりますね、hewの.objを認識できるのでしょうか?
  • 自分の使ってる 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 があるので使えそうではあります。同様の結果とはならないでしょうか?

  • そもそもの話として、.mot から .bin を出力するのに .obj を弄る目的がわかりません。
  • fujita nozomuさん
    あそーですか、objcopyなので入力は.objだと思っておりました、勉強不足でした、どうもどうも、なるほど>objcopy .mot .bin でも可能なのですね。
  • fujita nozomuさん
    いつもありがとうございます、私も年寄りなもんで、上記のような動作させるには、どんなコマンドラインで?、少々ですが無理ですかね、自分で勉強しないと。
  • ちょっとどうされたいかわからないので具体的な方法は説明できません。
    objcopy のちょっと古い版の日本語マニュアルもあるのでこれを参考にして色々やられてみてはいかがでしょうか。
    linuxjm.osdn.jp/.../objcopy.1.html

    入力ファイルが .elf であれば特定のセクションの抜き出しも可能な筈なので目的の操作には使用できるのではないかと思います。
  • わわいです
    うちでは、
    PCACHE=RPCACHE
    として、RPCACHEを0C001000に割り当てる、ということをしてますねー
    これでそのままバイナリ出せばいいです
  • fujita nozomuさん
    いつもありがとうございます
    ①現在のやりかたですが
    0C000000 DVECTTBL DINTTBL
    0C000800 PResetPRG PIntPRG
    0C001200 プログラムの開始 P C C$BSEC C$DSEC D B R
    2C001000 PCACHE
    これをMOT出力して自分でバイナリに変換する時
    0C000000 →00000000のアドレスから
    0C000800 →00000800のアドレスから
    0C001200 →00001200のアドレスから
    2C001000 →00001000のアドレスから(20000000はアドレスではなくキャッシュ無効のフラグと解釈して無視する)
    これで実行させると正しく動作します
    以上のようなことがhewの出力でできないかということです。