(toppers-users 4433) Re: TOPPERS/ASPのSkyeye簡易パッケージの質問

yasuo kominami(nifty) ykominami @ nifty.com
2015年 10月 12日 (月) 17:33:10 JST


小南と申します。
TOPPERSプロジェクトの個人会員です。



2015-10-09 17:05 GMT+09:00 <ozaki.minoru @ jp.panasonic.com>:

> はじめまして、
> パナソニックAVCネットワークスの尾崎です。
>
>
> 現在、TOPPERS/ASPの評価のために開発環境を構築しています。
> 評価基板を使用せずに、PC上で開発・デバックまでを行うため、ARMシミュレータSkyeyeを使った、簡易パッケージを使用しています。
>
> このパッケージのARMコンパイラSourcery G++ Lite
> 2010q1-188は、開発元のcodesourcery社がメンタグラフィック社に買収されたために、現在、有料版でしか入手することができません。
> このために他のgcc系のフリーのARMコンパイラ2つのうちどちらかを使用しようとしていますが、未だmakeできていません。
> そこで以下の2つの質問があります。
>
> 1.「GNUWing」コンパイラ
> http://www.embedded.jp/gnuwing/
>
> makefileを修正して、コンパイルはできますが、リンクスクリプトがSourcery G++ Lite
> のために\asp\target\at91skyeye_gcc\at91skyeye.ldでパースエラーが発生します。
> 「GNUWing」でもmakeできるためのリンクスクリプトのサンプル等ははありませんか?
>
> skyeye依存部の簡易パッケージは、gcovによるカバレッジ取得を行うために、Sourcery G++の
cs3.libに依存したつくりをしています。

正確には、MakefileでマクロENABLE_GCOVを定義すると、ファイル操作関係などlibcで定義さ
れたCの標準関数を呼び出します。
cs3.libはこの辺りをうまく扱ってくれ(libcの関数からの低レベルルーチン呼び出しを、ホスト環境
のサービスコール呼び出しにすり替える等)たり、スタートアップルーチンの機能ももっていたりし
ます。

大変便利なものですが、これはSourcery G++独自のものです。
gcovによるカバレッジをしないという前提であれば、libcとcs3.libをリンクせず、リンカスクリプトを
部分的に修正するだけで(私が確認した範囲でですが、)skyeyeで実行可能なものがつくれます。
私の環境では、sample1.cのコンパイル、実行が確認できました。

  CYGWIN_NT-6.3-WOW moonlight 2.1.0(0.287/5/3) 2015-07-14 21:26 i686 Cygwin
  (Launchpad GCC)
https://launchpad.net/gcc-arm-embedded

  arm-none-eabi-gcc.exe (GNU Tools for ARM Embedded Processors) 4.9.3
20150529 (release) [ARM/embedded-4_9-branch     revision 224288]
  GNU ar (GNU Tools for ARM Embedded Processors) 2.24.0.20150604
  GNU ld (GNU Tools for ARM Embedded Processors) 2.24.0.20150604



1.target/at91skyeye/Makefile.targetでマクロCOPTに-nostdlibを追加
Makefileでもコンパイル、リンク可能ですが、私はここで定義しました。

2.target/at91skyeye_gcc/start.Sを削除またはstart.S以外の名前にリネーム
こうするとarch/arm_gcc/common/start.Sがアセンブル、リンクされます。

3,target/at91skyeye_gcc/at91skyeye.ldを以下のように修正。

-GROUP(-lgcc -lc -lcs3 -lcs3hosted -lcs3arm)
+GROUP(-lgcc)
01234567890123456789012345678901234567890123456789012345678901234567890123456789
-lcの指定はMakefileでのコンパイラ、リンカへのオプション指定だけでなく、リンカスクリプトでも行
われているので、ここを削除(cs3.libのリンク指定も削除)

-INCLUDE arm-names.inc
+/* INCLUDE arm-names.inc */
arm-names.incはSourcery G++独自のファイルであるので削除。

-EXTERN(exit atexit)
+/* EXTERN(exit atexit) */
cs3.libがホスト環境のexit、atexitよぶようにする指定であるので削除。

-__libc_fini = _fini;
+/*__libc_fini = _fini;*/
libc中の_fini呼び出しを_finiと見なす指定のため、削除

   .bss :
   {
+    __bss_start = . ;
     *(.shbss)
     *(.bss .bss.* .gnu.linkonce.b.*)
     *(COMMON)
    *(.ram.b)
     _end = .;
     __end = .;
+    __bss_end = .;
   } >ram

arch/arm_gcc/common/start.Sが要求する__bss_start、__bss_endを
定義

リンカスクリプト中でcs3関連の設定が残っていますが、cs3.libをリンク
しなければ、定義しても参照されないだけです。

4.target/at91skyeye/target_config.cのtarget_exit()に
マクロENABLE_GCOVが定義した時のみ、有効になるように#ifdef
を追加する。

+#ifdef ENABLE_GCOV
 #ifdef TOPPERS_ENABLE_GCOV_PART
        /*

 #else /* TOPPERS_ENABLE_GCOV_FULL */
        exit(0);
 #endif /* TOPPERS_ENABLE_GCOV_PART */
+#endif /* ENABLE_GCOV */

この#ifdefがないと、ENABLE_GCOVが未定義でも、exitが未定義、
あるいはexitが呼び出す_finiが未定義というリンクエラーが発生する。


ただし、これらの修正でも、GNUWingのFTP版ではリンクできません。
FTP版は2003年公開で、ツールのバージョンが古く、at91skyeye.ldの
リンカスクリプトの文法を解釈できないところが多く存在します。
 現在開発に用いるならLaunchpad GCCとか、GNUWingのパッケージ版
などをお勧めします。

2.Sourcery G++系のgcc-arm-none-eabi
> gcc-arm-none-eabi-4_8-2014q3-20140805-win32.exe
>
> arm-none-eabiなのでリンクスクリプトもパースエラーにはなりませんが、start.oとcrt0.oでstartがバッティングするため
> makefileをライブラリを参照しないように変更しました。
> LDFLAGS := -nostdlib $(LDFLAGS)
> CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
> LIBS := $(LIBS) -lgcc
>
> その結果、fini()が見つからないエラーとなります。
>  undefined symbol `_fini' referenced in expression
>
> このコンパイラでもmakeできる設定方法はありませんか?
>
> GCC4.8であれば、上記の修正を加えれば、コンパイルできると思います。


補足

添付のpatchファイルには、上記の修正以外に、下記の修正を含みます。

cgywinのマウントで、/cygdrive以外のプレフィックスのディレクトリ名をつ
ける、あるいはそもそもプレフィクスのディレクトリ名をつけない(つまり
C:->/cygdrive/cではなく、c->/cとなる)環境でもmakedepが正しい依存
ファイルのパスを生成するようにするutil/makedepとMakefile.targetの
修正

Cドライブが/cygdrive/cになる場合

make depend
make

Cドライブが/cの場合
MAKEDEP_OPTS="-R /" make depend
make

Cドライブが/cygの場合
MAKEDEP_OPTS="-R /cyg" make depend
make
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://www.toppers.jp/pipermail/users/attachments/20151012/1ac977c2/attachment.html>
-------------- next part --------------
$B%F%-%9%H7A<00J30$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
$B%U%!%$%kL>(B: asp_at91skyeye-20140122-toppers-users_4428.patch
$B7?(B:         application/octet-stream
$B%5%$%:(B:     10844 $B%P%$%H(B
$B @ bL@(B:       $BL5$7(B
URL:        <http://www.toppers.jp/pipermail/users/attachments/20151012/1ac977c2/attachment.obj>