フォーラム: 公開討議 (スレッド #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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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

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

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

メッセージ #6100 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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

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

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

メッセージ #6102 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

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

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

メッセージ #6376 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする