Cygwin GCC で SH7262のためのクロスコンパイルをしています。
このたび、数学関数 math.h を組み込むことになりました。
test.c の中に sin() , cos() を記述しています。
sh-elf-ld でのリンク時に、次のようなエラーが発生します。
/home/user/test/test.c:81 undefined reference to 'sin'
/home/user/test/test.c:81 undefined reference to 'cos'
make: *** [all] Error 1
Makefileは次のように記述しています。
CSRCS = test.c
TARGET = test
ASMSRCS = startup.s
OBJS = $(ASMSRCS:%.s=%.o) $(CSRCS:%.c=%.o)
LDSCRIPT = memory.def
GCC = /usr/local/sh-tools/bin/sh-elf-gcc
LD = /usr/local/sh-tools/bin/sh-elf-ld
AS = /usr/local/sh-tools/bin/sh-elf-as
OBJCOPY = /usr/local/sh-tools/bin/sh-elf-objcopy
GCCLIB = /usr/local/sh-tools/lib/gcc/sh-elf/4.4.0/m2a
NEWLIB_INC = /usr/local/sh-tools/newlib/sh-elf/include
NEWLIB_LIB = /usr/local/sh-tools/newlib/sh-elf/lib/m2a
all: $(OBJS) $(LDSCRIPT)
$(LD) -Map $(TARGET).map -T $(LDSCRIPT) $(OBJS) -L$(NEWLIB_LIB) -L$(GCCLIB) -lgcc -o $(TARGET).elf
$(OBJCOPY) -O srec $(TARGET).elf $(TARGET).mot
$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
.c.o:
$(GCC) -c -g -m2a -I$(NEWLIB_INC) $< -lm
.s.o:
$(AS) $< -g -o $@
clean:
rm *.o $(TARGET).elf $(TARGET).map $(TARGET).mot $(TARGET).bin
math.h を使うために現状で分かるかぎりのことはしましたが、
小生の知識不足のため、このエラーが解消できません。
もし分かる方いらっしゃいましたら、ご指摘下さい。
sh-elf で math.h を使いたい
Re: sh-elf で math.h を使いたい
詳しい事はわかりませんが私のgccでは math.h の有無は関係なしで
gcc test.c だと: undefined reference to `sin' がでますが
gcc test.c -lm でOK牧場です。算術用ライブラリがちゃんとリンクされていますか?
gcc test.c だと: undefined reference to `sin' がでますが
gcc test.c -lm でOK牧場です。算術用ライブラリがちゃんとリンクされていますか?
Re: sh-elf で math.h を使いたい
正しくリンクされているか確認する方法があれば良いのですが・・・
sh-elf-ld になんらかのオプションをつけるとリンク対象のファイルが分かるとか。
/usr/local/sh-tools/newlib/sh-elf/lib/m2a/libm.a
あたりのリンクに問題があると思っているのですが、
疑っているところがてんで見当違いかも知れません。
sh-elf-ld になんらかのオプションをつけるとリンク対象のファイルが分かるとか。
/usr/local/sh-tools/newlib/sh-elf/lib/m2a/libm.a
あたりのリンクに問題があると思っているのですが、
疑っているところがてんで見当違いかも知れません。
Re: sh-elf で math.h を使いたい
引用が前後しますが。
無意味です。
-lgccの後あたりに-lmオプションを追加すると良いと思います。
C言語ソースファイル(.c)からオブジェクトファイル(.o)を作成するコマンドラインで数学関数ライブラリをリンクするオプション(-lm)が指定されています。
無意味です。
実行ファイルを作成しているのはリンクコマンド($(LD))の行です。
-lgccの後あたりに-lmオプションを追加すると良いと思います。
Re: sh-elf で math.h を使いたい
ご指摘の点、-lm の位置を修正したところ
/usr/local/sh-tools/newlib/sh-elf/lib/m2a/libm.a(lib_a-k_rem_pio2.o): In function `_kernel_rem_pio2':
/cygdrive/d/cygwin_tmp/sh-tools/newlib/lib/m2a/newlib/libm/math/../../../../../../../newlib/libm/math/k_rem_pio2.c:222 undefined reference to `__ashrsi3'
以下沢山のundefined reference to が発生しました。
多分、算術関数は問題なくなったと思われます。
因みに、コンパイル対象のtest.cは以下の通りです。
コンパイルを確認するためだけのもので、printf関数を使っていません。 本件、解決フラグを立ててよいのかどうかまだ自信がありません。
/usr/local/sh-tools/newlib/sh-elf/lib/m2a/libm.a(lib_a-k_rem_pio2.o): In function `_kernel_rem_pio2':
/cygdrive/d/cygwin_tmp/sh-tools/newlib/lib/m2a/newlib/libm/math/../../../../../../../newlib/libm/math/k_rem_pio2.c:222 undefined reference to `__ashrsi3'
以下沢山のundefined reference to が発生しました。
多分、算術関数は問題なくなったと思われます。
因みに、コンパイル対象のtest.cは以下の通りです。
コンパイルを確認するためだけのもので、printf関数を使っていません。 本件、解決フラグを立ててよいのかどうかまだ自信がありません。
Re: sh-elf で math.h を使いたい
皆様のおかげで本件、無事解決しました。
newlibはgcclibより先にリンクすべし、という情報がネット上にありました。
そこで、-lm を -lgcc の前に記述するとリンカが通りました。
cos(0)を解かせて1が得られることでこれを確認しました。
結局、上記のMakefileを次のように修正しました。
newlibはgcclibより先にリンクすべし、という情報がネット上にありました。
そこで、-lm を -lgcc の前に記述するとリンカが通りました。
cos(0)を解かせて1が得られることでこれを確認しました。
結局、上記のMakefileを次のように修正しました。
all: $(OBJS) $(LDSCRIPT)
$(LD) -Map $(TARGET).map -T $(LDSCRIPT) $(OBJS) -L$(NEWLIB_LIB) -L$(GCCLIB) -lm -lgcc -o $(TARGET).elf