19

に問題があり_sbrkます。コンパイルのリンク段階で、以下のコマンドを使用してオブジェクトをリンクすると、 への未定義の参照が取得され_sbrkます。

arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a

私はarm926ej-s用にARMモードでコンパイルしているので 、フォルダーにある正しいマルチライブラリlibc.aおよびlibgcc.aを選択したと思いますhome/ziga/projects/cs_lite/arm-none-eabi/lib/

私はインターネットで関数を検索してきまし_sbrkたが、これはマイクロプロセッサに依存しているため、標準の C ライブラリには含まれていないある種のメモリ管理呼び出しです。_sbrkだから私は自分で関数を書く必要がありますか? どうすればいいのですか?arm926ej-s の例はありますか? この関数を作成した後、オブジェクト ファイルにコンパイルし、それを他のオブジェクトやライブラリとリンクするつもりです。

4

6 に答える 6

19

これは次のことに役立ちます。

-mcpu=cortex-m4 -mthumb -specs=nano.specs -specs=nosys.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard

重要なスイッチは次のように「思われる」:

-specs=nano.specs -specs=nosys.specs

于 2017-01-09T19:46:21.957 に答える
8

私は同じ問題を抱えていましたが、それらをリンカーフラグに追加すると役立ちました:

-specs=nano.specs -specs=nosys.specs

また、nosys.specs だけで問題は修正されましたが、コード サイズがはるかに大きくなりました。

于 2018-11-14T13:34:25.403 に答える
3

問題は_sbrkそれ自体とはほとんど関係がありませんが、コンパイラ ドライバをバイパスしてリンカーを直接呼び出そうとしています。代わりに、gcc コマンドを使用してリンカを呼び出し、-Wl,-linkeroptionhereシンタックスを使用して追加のオプションをリンカに渡します。

リンカーを自分で呼び出す必要がある場合の解決策の 1 つとして、コマンド ラインの最後で と を 2 回libc.a繰り返してみてください。libgcc.aこれを実現するために使用できる「グループとして」のリンカーオプションもありますが、すぐにはわかりません。

于 2011-04-23T15:53:07.723 に答える
2

最近、私もこれに遭遇しました(再び)。私にとって最も簡単な解決策は、「malloc」および「free」API を、アプリケーションを構築している SDK から利用可能な API に提供/リダイレクトすることでした。

基本的に、リンク中にメモリ管理 API が欠落しているために発生します。上記の回答のように、ここで _sbrk が特に欠落しているわけではありません。brk/sbrk syscall は、内部的にヒープ管理に使用されます。したがって、メモリ管理 API に関しては _sbrk のリンクがありません。

-lnosys (つまり、libnosys.a) を追加すると、一部の統合でこれがある程度改善されることに気付きました。

于 2016-03-11T07:56:52.197 に答える