コンパイル時の挙動の違いについて
Posted: 2016年11月03日(木) 14:02
お世話になっております.
現在ライブラリ等が一切ない環境でコンパイルをしています.
使用言語はC言語です.
以下のコードをコンパイルして,実行ファイルを作成しようとしたところ,以下のエラーが出ました.
sample.c
リンク時にdivの関数(割り算)が無いためにエラーが出ているのだと思います.
今回の環境では標準ライブラリ等もありませんので,基本的な演算(+-*)しかできないのだと思いました.
ですが,外部で定義した関数testではエラーが出ているのに対して,
main関数内で割り算をしている場合にエラーが出ていないのはなぜなのか疑問に思いました.
以前に,コンパイラが割り算はシフト演算子に置き換えるといった話を聞いたことがあります.
しかし,main内はエラーがなく,test関数ではエラーが出ているので,シフト演算子に置き換えるという考えは違うのかなと思いました.
また,コンパイラが数字を置き換えるという話も聞いたことがあります.
例えば,以下のコードを考えます.
このコードはコンパイルが終わる時点で,c=8が代入された状態に最適化されるということです.
今回の問題に当てはめたときに,testでは,n/mとしており,計算して置き換えることができないため,外部ライブラリをリンクしようとしてエラーが出ているのかと思いました.
確かにmainでは,すべてのjの値は計算できますので,for文内全てが最終的な結果であるj=9/3として置き換えられているということでしょうか?
ですが,いくつかのパターンを試してもmain内ではエラーが出ませんでした.(配列に代入してみたりなど)
この疑問に対して,もしお詳しい方がいらっしゃいましたら,ご教授いただければ幸いです.
よろしくお願いいたします.
現在ライブラリ等が一切ない環境でコンパイルをしています.
使用言語はC言語です.
以下のコードをコンパイルして,実行ファイルを作成しようとしたところ,以下のエラーが出ました.
sample.c
arm-none-eabi-gcc -S sample.c
arm-none-eabi-as -o sample.o sample.s
arm-none-eabi-ld -Ttext 0x02000000 -o sample.out sample.o
sample.o: In function `test':
sample.c:(.text+0x78): undefined reference to `__aeabi_idiv'
make: *** [sample.out] Error 1
今回の環境では標準ライブラリ等もありませんので,基本的な演算(+-*)しかできないのだと思いました.
ですが,外部で定義した関数testではエラーが出ているのに対して,
main関数内で割り算をしている場合にエラーが出ていないのはなぜなのか疑問に思いました.
以前に,コンパイラが割り算はシフト演算子に置き換えるといった話を聞いたことがあります.
しかし,main内はエラーがなく,test関数ではエラーが出ているので,シフト演算子に置き換えるという考えは違うのかなと思いました.
また,コンパイラが数字を置き換えるという話も聞いたことがあります.
例えば,以下のコードを考えます.
このコードはコンパイルが終わる時点で,c=8が代入された状態に最適化されるということです.
今回の問題に当てはめたときに,testでは,n/mとしており,計算して置き換えることができないため,外部ライブラリをリンクしようとしてエラーが出ているのかと思いました.
確かにmainでは,すべてのjの値は計算できますので,for文内全てが最終的な結果であるj=9/3として置き換えられているということでしょうか?
ですが,いくつかのパターンを試してもmain内ではエラーが出ませんでした.(配列に代入してみたりなど)
この疑問に対して,もしお詳しい方がいらっしゃいましたら,ご教授いただければ幸いです.
よろしくお願いいたします.