1

不明なバージョンの 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 のバージョンが存在しない場合、同じ呼び出し規約に従い、同じタスクを実行するドロップイン置換はありますか?

4

1 に答える 1

2

ライブラリ関数__udivqi3は、2001 年 1 月 20 日に libgcc から削除されました。GCC 2.95.2のように、その日付より前にリリースされた GCC のバージョンを見つける必要があります。使用している関数のほとんどは、除算とモジュラスを同じ操作に結合した関数に置き換えられたため、代わりに関数を書き直してそれらのルーチンを呼び出すことになります。たとえば、__udivqi3callを呼び出す代わりに__udivmodqi4. これらの新しい関数は置き換えではないことに注意してください。

libgcc の一部だったのがいつかはわかりませ__lshrsi3ん。__ashlsi3必要に応じて、これらの機能を独自に置き換えることはそれほど難しくありません。

于 2015-03-24T05:18:46.053 に答える