不明なバージョンの GCC 用に生成された AVR アセンブリがあります。このソースをオブジェクト コードにアセンブルできますが、リンクしようとすると、未定義のシンボルが含まれていると言われます。
具体的には、次の記号がありません。
__lshrsi3, __ashlsi3,
__divsi3, __divhi3, __divqi3, __modsi3, __modhi3, __modqi3,
__udivsi3, __udivhi3, __udivqi3, __umodsi3, __umodhi3, __umodqi3
これらは libgcc シンボルのようですがlibgcc.a
、私のバージョンの AVR-GCC (4.8.3) には存在しません。これらのファイルでこれが実行nm
されていることを確認しましたが、これらの名前が定義されたシンボルはありませんでした。
AVR-GCC のどのバージョンにこれらのシンボルが存在していたのか、存在していたのか、または別のライブラリによって提供されていたのかを判断できませんでした。他の検索は実を結ばなかったので、SO の知恵が私の謎を解決できることを願っています。
わかりやすくするために、問題なくアセンブルされるがリンクに失敗するアセンブリ ファイルの簡単な例を次に示します。
.text
.globl main
.align 2
.type main,@function
main: ; @main
; BB#0:
ldi r24, 31
ldi r22, 31
call __udivqi3
ret
.Ltmp1:
.size main, .Ltmp1-main
これをリンクしようとすると、次のエラーで失敗します。
/tmp/ccxYMfat.o:udiv.s:9: undefined reference to `__udivqi3'
collect2: error: ld returned 1 exit status
私が使用しているlibgccは次のとおりです。
$ avr-gcc -print-libgcc-file-name
/usr/lib/gcc/avr/4.8.3/libgcc.a
記号を含まないもの__udivqi3
$ avr-nm /usr/lib/gcc/avr/4.8.3/avr6/libgcc.a |grep udivq
$
あるいは、これらのシンボルを含む GCC のバージョンが存在しない場合、同じ呼び出し規約に従い、同じタスクを実行するドロップイン置換はありますか?