フォーラム: 公開討議 (スレッド #773)

h8300-elf-なツールでlibm.a の関数がリンクできない (2002-07-08 22:51 by mugi #1280)

はじめまして、
私はハードの設計と組み込みソフトの開発を仕事にしています。
諸般の事情で1年少し前からSH,H8シリーズのCPUをハード開発のベースにしています。
ソフト開発のベースとしてGNUProのツールとeCosに目をつけていたのですが、
最初の敷居が高くて、KMCやYellowSoftのツールでお茶をにごしていました。

ところが、2ヶ月ほど前にysatoさんの「eCos/RedBoot for H8/300H 移植日記」を見つけて、なんとかH8とSH環境でeCosを使えそうな希望が見えてきました。
このプロジェクトの発展に大いに期待しています。

今までWindows/DOSオンリーのベースでやってきたものですから四苦八苦してやっとSH-elfなツールの構築に成功したばかりで、初歩的な質問ばかりになると思いますがよろしくお願いします。

現在H8S2215を(USBをサポートしているという理由で選定)を使ったボードが完成してブート書込みが出来るようになったばかりです。
ボード上でeCosが動かせるのはかなり先になりそうです。

今、壁にぶつかっているのがlibm.aの数学関数がリンクできないという問題です。
モニタ機能には必要ないのですが、h8300-elf-gcc + newlib を開発の
ベースにすることにしましたのでこれをクリアしないとどうも寝つきが悪くて(^^ゞ
Redhatのメーリングリストにも一応目を通しましたがこんな単純なトラブルの例はどこにもなさそうでした。
つまらない勘違いかツールのバージョンに関する問題かという気がしてますが、お手上げの状態です。

なにかお気づきの点がありましたらアドバイスをいただけると幸いです。

(環境は「eCos/RedBoot for H8/300H 移植日記」を参考にして構築しました)
-------(ツールのバージョン)-----
cygwin 1.3.10
newlib-1.10.0
binutils-2.12.1
gcc-3.1 + gcc3.1-h8-fix.diff
----------------------------------

------(テスト用ソースファイル)------------------
//#include <stdio.h>
//#include <math.h>

int main(void)
{
double a,b,c;

a = 3.1416;
b = 1.83;
c = a * b / 34.34;
b = sin(a);
printf("b=%f, c=%f\r\n", b, c);
}
--------------------------------------------------

ソースをコンパイルすると下記のようにリンカエラーが出ます。
このエラーがどうしても解決できません。
--------------------------------------------------
$ h8300-elf-gcc -ms -lm test.c
/var/tmp/ccEvigWi.o: In function `_main':
/var/tmp/ccEvigWi.o(.text+0x5b): undefined reference to `_sin'
collect2: ld returned 1 exit status
--------------------------------------------------

-print-file-nameオプションでリンカがlibm.aを読み込んでいることの確認
---------------------------------------------------------------------------
$ h8300-elf-gcc -ms -lm -print-file-name=libm.a test.c
/usr/local/lib/gcc-lib/h8300-elf/3.1/../../../../h8300-elf/lib/h8300s/libm.a
---------------------------------------------------------------------------

読み込んでいるライブラリを確認するために、
$h8300-elf-nm --defined-only -g /usr/local/h8300-elf/lib/h8300s/libm.a
でlibm.aの内容を見ると
--------(一部抜粋)----------------------
sf_sin.o:
000000bc T _sin
00000000 T _sinf
------------------------------------------
とsin()に対するシンボルは定義されているように見えます。

なんか、とってもおばかなミスをしているような気もするんですが、
ライブラリを読んでいるしシンボルもあるのにリンクできてない-あまりに単純すぎて調べるべきところも思いつかない状態です。

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

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

RE: h8300-elf-なツールでlibm.a の関数がリンク (2002-07-09 19:56 by tkohama #1291)

h8300-elf-gcc -lm t.c
ではなく、単に -lm は行の最後に
h8300-elf-gcc t.c -lm
でどうでしゅ

#1280 への返信

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

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

RE: h8300-elf-なツールでlibm.a の関数がリンクできない (2002-07-09 23:09 by ysato #1295)

同じことで悩んだ記憶が…。
確か、-lは後ろにないと、うまくリンクされなかったような気
がします。
と思ったら、小浜さんが書いてますね。

以下余談。
H8Sですか。ベクタテーブルが大きくなっているので、その部分
を修正する必要がありますが、それ以外は今のままでも動かすこ
とはできると思います。
割り込み関連の拡張がeCos向きなので、最終的には、きちんと
CPUバリアントを作りたいところですが。

#問題はターゲットか。
#1280 への返信

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

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

RE: h8300-elf-なツールでlibm.a の関数がリンクできない (2002-07-10 00:17 by mugi #1296)

素晴らしい!一発で解決しました。
まさに「先達はあらまほしきもの」ですね。
ありがとうございましたm(__)m

関数毎にセクションを指定してflashROM書き込みのモジュールだけRAMで動かすことが出来るなど、
使うほど、GNUのツールがよく出来ているのに感心しているところです。

H8Sを動かすために必要な修正はそれほどないということですね。
その言葉に励まされて頑張ってみようと思います。
#1295 への返信

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

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