web-dev-qa-db-ja.com

_sbrkへの未定義の参照

_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モードであるため、home/ziga/projects/cs_liteフォルダーにある適切なmultilib(libc.aおよびlibgcc.a)を選択したと思います。/arm-none-eabi/lib /。

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

よろしくお願いします、ジガ。


私はこの問題を解決し、ここに解決策を投稿するので、コミュニティに何かを返します。関数_sbrkは、ARM用のNXPCDLパッケージ内にあります。パッケージはここからダウンロードできます(リンクはこれをまだ知らないすべての人向けです): http://www.lpclinux.com/Downloads/WebHome サブフォルダーCDL_v005/csps/lpc313x/bsps/ea3131/sourceプロジェクトに追加してオブジェクトファイルにコンパイルし、その後、他のオブジェクトやライブラリと一緒に実行可能ファイルにリンクする必要があるlibnosys_gnu.cという名前のソースファイルがあります。

最高の願いと多くの成功。

13
71GA

これは役立ちます:

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

重要なスイッチは次のように「見える」:

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

13
nvd

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

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

私は同じ問題を抱えていました、そしてそれらをリンカーフラグに追加することは助けになりました:

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

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

3
Kaká Barreto

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

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

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

2
Aj700

visualgdb(gccを使用)とnanolibを使用して、リンカーフラグを追加する必要がありました

-specs=nosys.specs
0
jluu