討論區: 公開討論 (Thread #3469)

fdlibm.hでlibmがコンパイルエラー (2003-10-03 14:51 by ykoya #6037)

小柳と申します。はじめまして。
秋月3069ネットワークボードでeCos上のプログラムを動かしてみようと試みていますが、libmのコンパイルで止まってしまい、どこを直せば良いのかわからず困っております。

redhatのecosのサイトから必要なものをdownloadし、ecos-h8のリリースファイルにあるパッチをあてて、いくつか細かい不具合はあったもののtoolchainの構築とredbootの実行までなんとかできました。

次に、eCos User Guide のChapter 11に従ってtarget libraryの構築を行ったところ、math library のところで以下のようなエラーで止まってしまいました。

/share/src/eCos/ecos-2.0/packages/language/c/libm/v2_0/src/mathincl/fdlibm.h:78:5: 警告: "target_flags" は定義されていません
/share/src/eCos/ecos-2.0/packages/language/c/libm/v2_0/src/mathincl/fdlibm.h:79:3: #error IEEE-style 64-bit doubles are required to use the math library
make[1]: *** [src/misc/matherr.o.d] エラー 1

cvs から ecos のtreeを checkout して試してみましたが同じ現象なので、gccの構築に問題があったのかもしれません(gcc 3.2.1)。ホストはVine Linux 2.6を用いています。

math library を外してtarget libraryを構築すると、printfがlinkに失敗するのでhello.cすら動かせません…。
どなたか解決方法を御存じでしたら是非教えて下さい。
よろしくお願いいたします。

回覆 #6037×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-04 23:34 by ysato #6055)

なんとなくパッチがうまくあたっていないような気がしますが…

あたっているかどうか判らなければ、

int longlong_size = sizeof(long long);
int double_size = sizeof(double);

を h8300-elf-gcc -mh -mint32 -S foo.c でコンパイルして、出来た.sを見せてください。

ところで、ecosconfig remove CYGPKG_LIBMでlibm消してもそのprintfが作れない問題は起こるんでしょうか?
最近target lib作っていないので記憶があいまいですが、昔は問題なかったような気がします。
回覆: #6037

回覆 #6055×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-05 13:39 by ykoya #6060)

佐藤さま、reply ありがとうございます。

上記の手順でできた foo.s は以下の通りです。
=== foo.s =======
.file "foo.c"
; GCC For the Hitachi H8/300
; By Hitachi America Ltd and Cygnus Support

.h8300h
.file "foo.c"
.global _longlong_size
.section .data
.align 2
.type _longlong_size,@object
.size _longlong_size,4
_longlong_size:
.long 8
.global _double_size
.align 2
.type _double_size,@object
.size _double_size,4
_double_size:
.long 8
.end
.ident "GCC: (GNU) 3.2.1"
========

gcc は、以下の手順でbuildしました。(binutilsはecosのsiteに従って事前にbuildしました)
1. http://sources.redhat.com/ecos/build-toolchain.html から以下のファイルをdownload
gcc-core-3.2.1.tar.gz
gcc-g++-3.2.1.tar.gz
gcc-3.2.1-arm-multilib.patch
newlib-1.11.0.tar.gz
2. h8300-elf toolsの gcc patch (for 3.2.1)をdownload
3. 以下の手順でmake
gunzip < gcc-core-3.2.1.tar.gz | tar xvf -
gunzip < gcc-g++-3.2.1.tar.gz | tar xvf -
gunzip < newlib-1.11.0.tar.gz | tar xvf -
patch -p0 < gcc-3.2.1-arm-multilib.patch |& tee patch.log
patch -p0 < gcc.diff |& tee -a patch.log
mv newlib-1.11.0/newlib gcc-3.2.1
mv newlib-1.11.0/libgloss gcc-3.2.1
後は ecos の site にある手順で build。途中、以下のようなエラーが出たので、full path に書き換えた。
---
/share/src/eCos/build/gcc/gcc/include/float.h:4:32: config/h8300/h8300.h: そのようなファイルやディレクトリはありません
make[7]: *** [dtoa.o] エラー 1
---
/share/src/eCos/gcc-3.2.1/gcc/config/h8300/h8300.h:1153:21: dbxcoff.h: そのようなファイルやディレクトリはありません
---
4. patch.log の内容は以下の通り。
========
patching file gcc-3.2.1/gcc/config/arm/t-arm-elf
patching file gcc-3.2.1/gcc/config/float-h8300.h
patching file gcc-3.2.1/gcc/config/h8300/extfloatlib.c
patching file gcc-3.2.1/gcc/config/h8300/h8300.c
patching file gcc-3.2.1/gcc/config/h8300/h8300.h
patching file gcc-3.2.1/gcc/config/h8300/t-h8300
patching file gcc-3.2.1/gcc/config.gcc
patching file gcc-3.2.1/gcc/floatlib.c
========

また、libmを消して作った場合の状況は、libtarget.a はできるのですが、下記のような状況になります。libmのせいでprintfが失敗というのは私のはやとちりだったかもしれませんが、ともかくうまくいきませんでした。
============
% ecosconfig new aki3068net
% ecosconfig remove CYGPKG_LIBM
% ecosconfig check
Target: aki3068net
Template: default
Removed:
CYGPKG_LIBM
No conflicts
% ecosconfig tree
% make |& make.out

% h8300-elf-gcc -g -I/home/ykoya/src/eCos-work.nolibm/install/include hello.c -L/home/ykoya/src/eCos-work.nolibm/install/lib -Ttarget.ld -nostdlib
/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.2.1/../../../../h8300-elf/bin/ld: skipping incompatible /usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.2.1/libgcc.a when searching for libgcc.a
/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.2.1/../../../../h8300-elf/bin/ld: cannot find libgcc.a
collect2: ld はステータス 1 で終了しました
make: *** [hello] エラー 1
2で終了しました

コンパイル時に -L/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.2.1/h8300h
を追加して、target.ld から libsupc++.a を削除すると、
...
/home/ykoya/src/eCos-work.nolibm/install/lib/libtarget.a(infra_diag.o): In function `.LM38':
infra_diag.o(.text+0x233): undefined reference to `___umoddi3'
/home/ykoya/src/eCos-work.nolibm/install/lib/libtarget.a(infra_diag.o): In function `.LM40':
infra_diag.o(.text+0x27d): undefined reference to `___udivdi3'
....
他多数のエラーが出る。

以上、長くなってすみません。
御忙しいところ恐れ入りますが、是非助けて下さい。
よろしくお願いいたします。
回覆: #6055

回覆 #6060×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-09 22:58 by ysato #6100)

返事が遅れてしまいました。すみません。

gcc-3.2.1用のパッチに問題があって、正しいlibgcc.aが出来ていないようです。
直しておきます。
回覆: #6060

回覆 #6100×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-10 02:53 by ysato #6102)

直しました。
すみませんが、パッチを再適用してgccを作り直して下さい。

あと、さっき書くのを忘れていましたが、コンパイルするときは"-mh -mint32"を必ず指定して下さい。
eCosはこれを付けてコンパイルしているので、あわせておかないと色々変なことになります。
回覆: #6100

回覆 #6102×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-11 14:46 by ykoya #6126)

こんにちは。パッチありがとうございました。
でも、残念ながら状況は最初とまったく同じでした。
1. コンパイルしてできたテストの foo.s の結果は同一
2. eCosのtarget libのコンパイルで、matherr.c の中の fdlibm.h で、#error IEEE-style 64-bit doubles are required to use the math library で止まる。
3. CYGPKG_LIBM を外すと lib はできるが、hello.c のコンパイルが ld: skipping incompatible ..../libgcc.a when searching for libgcc.a .... となり止まる。
gcc/config/h8300/t-h8300 をみると確かに新しいパッチはあたっているのですが…。

fdlibm.h の中の DBL_MAX_EXP != 1024 でひっかかっていると思うのですが、追いかけて行くと (target_flags & 8)にたどりつきました。gccの仕組みがわかっていないのですが、これは実行時にしか値が決まらないと思うのですが、こういうものなのでしょうか。

私の手順、環境のどこかに間違いがあると思うので、解決のためにどのような情報をお伝えすればよいか教えていただけると嬉しいです。
回覆: #6102

回覆 #6126×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-14 14:47 by ykoya #6183)

小柳です。こんにちは。
試しに、binutils-2.14, gcc-3.3 + gcc-3.3.diff(リリースファイルにあるもの)をインストールして、target libを作ってみたところ、libmのコンパイルエラーはなく、最後までいきました。
ところが、やはりhello.cをコンパイルすると、前のメッセージの 3. と同じく、link できませんでした。

% make
h8300-elf-gcc -g -I/home/ykoya/src/eCos-work.util-2.14.gcc-3.3/install/include hello.c -L/home/ykoya/src/eCos-work.util-2.14.gcc-3.3/install/lib -Ttarget.ld -nostdlib
/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.3/../../../../h8300-elf/bin/ld: skipping incompatible /usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.3/libgcc.a when searching for libgcc.a
/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.3/../../../../h8300-elf/bin/ld: cannot find libgcc.a
collect2: ld はステータス 1 で終了しました
make: *** [hello] エラー 1

そもそも gcc を構築する環境からして問題があるのかもしれません…。
回覆: #6126

回覆 #6183×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-16 01:13 by ysato #6211)

skipping incompatible /usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.3/libgcc.a when searching for libgcc.a
ということなので、MakefileのCLFAGSに-mhと-mint32を追加して下さい。
libgcc.aは/usr/local/h8300-elf/lib/gcc-lib/h8300-elf/3.3/h8300h/int32/にあるものを使うのが正解です。

3.2.1で通らないのは謎ですが…
きれいな環境を作って確認してみます。
回覆: #6183

回覆 #6211×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-20 15:30 by ykoya #6288)

-mh -mint32 をつけるということは以前にも指摘していただいていたのにもかかわらず見落としていてすみませんでした。
これをつけたところ、gcc-3.2.1でlibmをremoveしてbuildしたtarget libで、hello.c をコンパイルすることができました。
しかしながら、printf でのメッセージが、redbootで0x400000にloadしても、gdb(TCP port 9000)からloadしても、出てきませんでした。redbootでgoしたときは、goしたとたんにMAC addressの表示がでて、リセットに戻っているようです。gdbのときは、serialもgdbもなにも出ずにそのまま固まります。コンパイルエラーにはなりませんが、やはりtarget libがうまく作れていないのでしょうか。ecos-install.tcl でソースをdownload後、リリースファイルのecos.diff(currentをv2_0に書き換え)を適用(いくつかは既に存在しているためrejectされた)して、aki3068net newで、libmをremove, CYG_HAL_STARTUPをRAMに書き換えて、treeを生成させています。コンパイル後、target.ldのlibsupc++.aを削除しています。
ecos-h8 cvs からcheckoutしてみたのですが、ecos-install.tcl に相当するスクリプトがないため、どのような手順で環境を構築するのかわかりませんでした。configure +何かのオプション、とやるのでしょうか。
御忙しいところいつも質問ばかりですみません。
回覆: #6211

回覆 #6288×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-22 22:35 by ysato #6340)

リセットしてしまう原因はよくわかりませんが…

ひょっとしたらSCI0からメッセージが出ているかもしれません。
diag_printfという関数があるので、これでメッセージを出力して見てください。
これはSCI1に出力されるはずです。

cyg/infra/diag.hをインクルードすると、printfと同じ様に使えます。

host側のconfig toolはecos-2.0の物が無修正で使えるはずです。
最近作っていないのでよくわかりません。すみません。
回覆: #6288

回覆 #6340×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入

RE: fdlibm.hでlibmがコンパイルエラー (2003-10-27 14:48 by ykoya #6376)

diag_printf を試してみましたが、何も表示されず、やはりリセットしてしまいました。理由はよくわかりませんが、Cos上のプログラムが私の環境ではうまく作れていないようです。
でも、RedBootはうまく作れているので、この件は暫く置いておいて、今度はuClinuxの方を試してみようと思います。
佐藤さま、お忙しい中いつもお返事いただき、大変ありがとうございました。
回覆: #6340

回覆 #6376×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登入